diff -Nru linux-liquorix-5.2/debian/changelog linux-liquorix-5.2/debian/changelog --- linux-liquorix-5.2/debian/changelog 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/changelog 2019-08-16 22:19:02.000000000 +0000 @@ -1,4 +1,16 @@ -linux-liquorix (5.2-11ubuntu1~bionic) bionic; urgency=medium +linux-liquorix (5.2-12ubuntu1~bionic) bionic; urgency=medium + + * merge 5.2.9 + * merge 5.2.10 release candidate patches + * add muqss fix + - Fix using smp_processor_id() in preemptible warning. + * include amdgpu suspend fix + - drm/amdgpu: pin the csb buffer on hw init for gfx v8 + * update version to 5.2.0-9.1 + + -- Steven Barrett Fri, 16 Aug 2019 17:19:02 -0500 + +linux-liquorix (5.2-11) unstable; urgency=medium * merge 5.2.9 release candidate patches * backport bfq patches: diff -Nru linux-liquorix-5.2/debian/config/defines linux-liquorix-5.2/debian/config/defines --- linux-liquorix-5.2/debian/config/defines 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/config/defines 2019-08-16 22:19:02.000000000 +0000 @@ -1,5 +1,5 @@ [abi] -abiname: 8.2 +abiname: 9.1 [base] arches: diff -Nru linux-liquorix-5.2/debian/config.defines.dump linux-liquorix-5.2/debian/config.defines.dump --- linux-liquorix-5.2/debian/config.defines.dump 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/config.defines.dump 2019-08-16 22:19:02.000000000 +0000 @@ -14,7 +14,7 @@ (dp6 Vabiname p7 -V8.2 +V9.1 p8 ss(Vbase p9 @@ -174,7 +174,7 @@ (dp97 Vsource p98 -V5.2-11ubuntu1~bionic +V5.2-12ubuntu1~bionic p99 sVupstream p100 @@ -186,7 +186,7 @@ p103 sVabiname p104 -V5.2.0-8.2 +V5.2.0-9.1 p105 sstp106 Rp107 diff -Nru linux-liquorix-5.2/debian/control linux-liquorix-5.2/debian/control --- linux-liquorix-5.2/debian/control 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/control 2019-08-16 22:19:02.000000000 +0000 @@ -4,13 +4,13 @@ Maintainer: Steven Barrett Standards-Version: 3.9.5 Build-Depends: debhelper, cpio, python3, python3-six, bc, liblz4-tool, libelf-dev, libssl-dev, flex, bison, gcc [amd64] -Vcs-Git: https://github.com/damentz/liquorix-package.git Vcs-Browser: https://github.com/damentz/liquorix-package Homepage: http://www.liquorix.net/ +Vcs-Git: https://github.com/damentz/liquorix-package.git -Package: linux-image-5.2.0-8.2-liquorix-amd64 +Package: linux-image-5.2.0-9.1-liquorix-amd64 Architecture: amd64 -Provides: linux-modules-5.2.0-8.2-liquorix-amd64 +Provides: linux-modules-5.2.0-9.1-liquorix-amd64 Pre-Depends: debconf | debconf-2.0 Depends: kmod, ${misc:Depends}, initramfs-tools [amd64] | linux-initramfs-tool [amd64] Recommends: firmware-linux-free @@ -24,7 +24,7 @@ Architecture: amd64 Section: metapackages Priority: extra -Depends: linux-image-5.2.0-8.2-liquorix-amd64 (= ${binary:Version}), ${misc:Depends} +Depends: linux-image-5.2.0-9.1-liquorix-amd64 (= ${binary:Version}), ${misc:Depends} Recommends: linux-headers-liquorix-amd64 (= ${binary:Version}) Description: Linux image for liquorix on 64-bit PCs This metapackage depends on the latest binary image for Linux kernel on @@ -34,20 +34,20 @@ Architecture: amd64 Section: metapackages Priority: extra -Depends: linux-headers-5.2.0-8.2-liquorix-amd64 (= ${binary:Version}), ${misc:Depends} +Depends: linux-headers-5.2.0-9.1-liquorix-amd64 (= ${binary:Version}), ${misc:Depends} Description: Linux headers for liquorix on 64-bit PCs This metapackage depends on the latest binary image for Linux kernel on PCs with AMD64 or Intel 64 processors machines for liquorix. -Package: linux-headers-5.2.0-8.2-liquorix-amd64 +Package: linux-headers-5.2.0-9.1-liquorix-amd64 Architecture: amd64 Depends: ${shlibs:Depends}, ${misc:Depends}, libelf-dev, gcc Conflicts: r8168-dkms -Description: Header files for Linux 5.2.0-8.2-liquorix-amd64 +Description: Header files for Linux 5.2.0-9.1-liquorix-amd64 This package provides the architecture-specific kernel header files for - Linux kernel 5.2.0-8.2-liquorix-amd64, generally used for building + Linux kernel 5.2.0-9.1-liquorix-amd64, generally used for building out-of-tree kernel modules. These files are going to be installed into - /usr/src/linux-headers-5.2.0-8.2-liquorix-amd64, and can be used for + /usr/src/linux-headers-5.2.0-9.1-liquorix-amd64, and can be used for building modules that load into the kernel provided by the - linux-image-5.2.0-8.2-liquorix-amd64 package. + linux-image-5.2.0-9.1-liquorix-amd64 package. diff -Nru linux-liquorix-5.2/debian/control.md5sum linux-liquorix-5.2/debian/control.md5sum --- linux-liquorix-5.2/debian/control.md5sum 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/control.md5sum 2019-08-16 22:19:02.000000000 +0000 @@ -1,5 +1,5 @@ b403033e751067051c51500be9284e2a debian/bin/gencontrol.py -44befd56cacef29f57d50fd13999e590 debian/changelog +dacf335d1809b77b34dbddc4a1274252 debian/changelog 3e2fde720ec84a08dab1cca4224521e2 debian/templates/image.plain.preinst.in d41d8cd98f00b204e9800998ecf8427e debian/templates/control.main.in 4c5446e06f8220c5064d4810073445a4 debian/templates/image.plain.prerm.in @@ -10,6 +10,6 @@ 358c351523bff142bc9063d32c854a51 debian/templates/image.plain.postinst.in 884609eb262f79fc4dbf537a75564371 debian/templates/control.headers.in ffddce57bad72a7b59baa8adc1267ce4 debian/templates/image.plain.templates.in -0aa2a7832c3e2ab8423c2d44078c951d debian/config/defines +109992765ae1c0ecd882be2878ea1408 debian/config/defines c6a934aa2ffd8aabd89e4e4ecc15a6c6 debian/config/amd64/defines c6b226847d2c1790a5a8840dfdbb7dee debian/config/amd64/none/defines diff -Nru linux-liquorix-5.2/debian/linux-headers-5.2.0-8.2-liquorix-amd64.postinst linux-liquorix-5.2/debian/linux-headers-5.2.0-8.2-liquorix-amd64.postinst --- linux-liquorix-5.2/debian/linux-headers-5.2.0-8.2-liquorix-amd64.postinst 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-headers-5.2.0-8.2-liquorix-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -#!/usr/bin/perl -# Author: Michael Gilbert -# Origin: Stripped down version of the linux-headers postinst from Ubuntu's -# 2.6.32-14-generic kernel, which was itself derived from a -# Debian linux-image postinst script. - -$|=1; -my $version = "5.2.0-8.2-liquorix-amd64"; - -if (-d "/etc/kernel/header_postinst.d") { - print STDERR "Examining /etc/kernel/header_postinst.d.\n"; - system ("run-parts --verbose --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d") && - die "Failed to process /etc/kernel/header_postinst.d"; -} - -if (-d "/etc/kernel/header_postinst.d/$version") { - print STDERR "Examining /etc/kernel/header_postinst.d/$version.\n"; - system ("run-parts --verbose --exit-on-error --arg=$version " . - "/etc/kernel/header_postinst.d/$version") && - die "Failed to process /etc/kernel/header_postinst.d/$version"; -} - -exit 0; - -__END__ diff -Nru linux-liquorix-5.2/debian/linux-headers-5.2.0-9.1-liquorix-amd64.postinst linux-liquorix-5.2/debian/linux-headers-5.2.0-9.1-liquorix-amd64.postinst --- linux-liquorix-5.2/debian/linux-headers-5.2.0-9.1-liquorix-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-headers-5.2.0-9.1-liquorix-amd64.postinst 2019-08-16 22:19:02.000000000 +0000 @@ -0,0 +1,26 @@ +#!/usr/bin/perl +# Author: Michael Gilbert +# Origin: Stripped down version of the linux-headers postinst from Ubuntu's +# 2.6.32-14-generic kernel, which was itself derived from a +# Debian linux-image postinst script. + +$|=1; +my $version = "5.2.0-9.1-liquorix-amd64"; + +if (-d "/etc/kernel/header_postinst.d") { + print STDERR "Examining /etc/kernel/header_postinst.d.\n"; + system ("run-parts --verbose --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d") && + die "Failed to process /etc/kernel/header_postinst.d"; +} + +if (-d "/etc/kernel/header_postinst.d/$version") { + print STDERR "Examining /etc/kernel/header_postinst.d/$version.\n"; + system ("run-parts --verbose --exit-on-error --arg=$version " . + "/etc/kernel/header_postinst.d/$version") && + die "Failed to process /etc/kernel/header_postinst.d/$version"; +} + +exit 0; + +__END__ diff -Nru linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.postinst linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.postinst --- linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.postinst 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,649 +0,0 @@ -#! /usr/bin/perl -# -use strict; -use warnings; -use Cwd 'abs_path'; -use Debconf::Client::ConfModule qw(:all); -use POSIX (); -version('2.0'); -my $capb = capb('backup', 'escape'); - -$|=1; - -# Predefined values: -my $version = "5.2.0-8.2-liquorix-amd64"; -my $arch = "amd64"; -my $link_in_boot = ""; -my $no_symlink = ""; -my $do_symlink = "Yes"; # target machine defined -my $kimage = "vmlinuz"; -my $mkimage = ""; # command to generate the initrd image -my $use_hard_links = ''; # hardlinks do not work across fs boundaries -my $postinst_hook = ''; #Normally we do not -my $minimal_swap = ''; # Do not swap symlinks -my $ignore_depmod_err = ''; # normally we do not -my $package_name = "linux-image-$version"; - -#known variables -my $image_dest = "/"; -my $realimageloc = "/boot/"; -my $have_conffile = ""; - -my $modules_base = '/lib/modules'; -my $CONF_LOC = '/etc/kernel-img.conf'; - -# Ignore all invocations except when called on to configure. -exit 0 unless $ARGV[0] =~ /configure/; - -my $DEBUG = 0; - -# Do some preliminary sanity checks here to ensure we actually have an -# valid image dir -chdir('/') or die "could not chdir to /:$!\n"; -die "Internal Error: ($realimageloc) is not a directory!\n" - unless -d $realimageloc; - -if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { - if (open(CONF, "$CONF_LOC")) { - while () { - chomp; - s/\#.*$//g; - next if /^\s*$/; - - $do_symlink = "" if /do_symlinks\s*=\s*(no|false|0)\s*$/i; - $no_symlink = "" if /no_symlinks\s*=\s*(no|false|0)\s*$/i; - $link_in_boot = "" if /link_in_boot\s*=\s*(no|false|0)\s*$/i; - $use_hard_links = '' if /use_hard_links\s*=\s*(no|false|0)\s*$/i; - $minimal_swap = '' if /minimal_swap\s*=\s*(no|false|0)\s*$/i; - $ignore_depmod_err = '' if /ignore_depmod_err\s*=\s*(no|false|0)\s*$/i; - - $do_symlink = "Yes" if /do_symlinks\s*=\s*(yes|true|1)\s*$/i; - $no_symlink = "Yes" if /no_symlinks\s*=\s*(yes|true|1)\s*$/i; - $link_in_boot = "Yes" if /link_in_boot\s*=\s*(yes|true|1)\s*$/i; - $use_hard_links = "Yes" if /use_hard_links\s*=\s*(yes|true|1)\s*$/i; - $minimal_swap = 'Yes' if /minimal_swap\s*=\s*(yes|true|1)\s*$/i; - $ignore_depmod_err = 'Yes' if /ignore_depmod_err\s*=\s*(yes|true|1)\s*$/i; - - $image_dest = "$1" if /image_dest\s*=\s*(\S+)/i; - $postinst_hook = "$1" if /postinst_hook\s*=\s*(\S+)/i; - $mkimage = "$1" if /mkimage\s*=\s*(.+)$/i; - } - close CONF; - $have_conffile = "Yes"; - } -} - - -if ($link_in_boot) { - $image_dest = $realimageloc; -} - -# Tack on at least one trainling / -$image_dest = "$image_dest/"; -$image_dest =~ s|^/*|/|o; -$image_dest =~ s|/+$|/|o; - -if (! -d "$image_dest") { - die "Expected Image Destination dir ($image_dest) to be a valid directory!\n"; -} - -# sanity -if ($do_symlink && $no_symlink) { - warn "Both do_symlinks and no_symlinks options enabled; disabling no_symlinks\n"; - $no_symlink = 0; -} - -# most of our work is done in $image_dest (nominally /) -chdir("$image_dest") or die "could not chdir to $image_dest:$!\n"; - - -die "Internal Error: Could not find image (" . $realimageloc - . "$kimage-$version)\n" unless -e $realimageloc - . "$kimage-$version"; - - -###################################################################### -###################################################################### -########### Test whether a relative symlinkwould be OK ####### -###################################################################### -###################################################################### -sub test_relative { - my %params = @_; - my $cwd; - - die "Internal Error: Missing Required paramater 'Old Dir' " - unless $params{'Old Dir'}; - die "Internal Error: Missing Required paramater New Dir' " - unless $params{'New Dir'}; - - - die "Internal Error: No such dir $params{'Old Dir'} " - unless -d $params{'Old Dir'}; - die "Internal Error: No such dir $params{'New Dir'} " - unless -d $params{'New Dir'}; - - warn "Test relative: testing $params{'Old Dir'} -> $params{'New Dir'}" - if $DEBUG; - chomp($cwd = `pwd`); - chdir ($params{'New Dir'}) or die "Could not chdir to $params{'New Dir'}:$!"; - my $ok = 0; - $params{'Old Dir'} =~ s|^/*||o; - if (-d $params{'Old Dir'} ) { - if (defined $params{'Test File'}) { - if (-e $params{'Old Dir'} . $params{'Test File'}) { - $ok = 1; - } - } else { - $ok = 1; # well, backward compatibility - } - } - chdir ($cwd) or die "Could not chdir to $params{'New Dir'}:$!"; - return $ok; -} - - -sub spath { - my %params = @_; - - die "Missing Required paramater 'Old'" unless $params{'Old'}; - die "Missing Required paramater 'New'" unless $params{'New'}; - - my @olddir = split '/', `readlink -q -m $params{'Old'}`; - my @newdir = split '/', `readlink -q -m $params{'New'}`; - my @outdir = @olddir; - - my $out = ''; - my $i; - for ($i = 0; $i <= $#olddir && $i <= $#newdir; $i++) { - $out++ if ($olddir[$i] ne $newdir[$i]); - shift @outdir unless $out; - unshift @outdir, ".." if $out; - } - if ($#newdir > $#olddir) { - for ($i=0; $i < $#newdir; $i++) { - unshift @outdir, ".."; - } - } - return join ('/', @outdir); -} - -# This routine is invoked if there is a symbolic link in place -# in $image_dest/$kimage -- so a symlink exists in the destination. -# What we are trying to determine is if we need to move the symbolic link over -# to the the .old location -sub move_p { - my $kimage = $_[0]; # Name of the symbolic link - my $image_dest = $_[1]; # The directory the links goes into - my $image_name = $_[2]; - my $src_dir = $_[3]; - my $force_move = 0; - warn "Move?: kimage=$kimage, image_dest=$image_dest, \n" . - "\timage_name=$image_name, src_dir=$src_dir" if $DEBUG; - - if ($no_symlink) { - # we do not want links, yet we have a symbolic link here! - warn "found a symbolic link in " . $image_dest . "$kimage \n" . - "even though no_symlink is defined\n" if $no_symlink; - # make sure we change this state of affairs - $force_move = 1; - return $force_move; - } - - warn "DEBUG: OK. We found symlink, and we should have a symlink here.\n" - if $DEBUG; - my $vmlinuz_target = readlink "$kimage"; - my $real_target = ''; - my $target = `readlink -q -m "${realimageloc}${kimage}-$version"`; - $real_target = abs_path($vmlinuz_target) if defined($vmlinuz_target); - - if (!defined($vmlinuz_target) || ! -f "$real_target") { - # what, a dangling symlink? - warn "The link " . $image_dest . "$kimage is a dangling link" . - "to $real_target\n"; - $force_move = 1; - return $force_move; - } - - - warn "DEBUG: The link $kimage points to ($vmlinuz_target)\n" if $DEBUG; - warn "DEBUG: ($vmlinuz_target) is really ($real_target)\n" if $DEBUG; - my $cwd; - chomp ($cwd=`pwd`); - if ($vmlinuz_target !~ m|^/|o) { - $vmlinuz_target = $cwd . "/" . $vmlinuz_target; - $vmlinuz_target =~ s|/+|/|o; - } - $vmlinuz_target = `readlink -q -m $vmlinuz_target`; - - if ("$vmlinuz_target" ne "$target") { - warn "DEBUG: We need to handle this.\n" if $DEBUG; - if ($minimal_swap) { - warn "DEBUG: Minimal swap.\n" if $DEBUG; - if (-l "$kimage.old") { - warn "DEBUG: There is an old link at $kimage.old\n" if $DEBUG; - my $old_target = readlink "$kimage.old"; - my $real_old_target = ''; - $real_old_target=abs_path($old_target) if defined ($old_target); - - if ($real_old_target && -f "$real_old_target") { - if ($old_target !~ m|^/|o) { - $old_target = $cwd . "/" . $old_target; - $old_target =~ s|/+|/|o; - } - $old_target = `readlink -q -m $old_target`; - if ("$old_target" ne "$target") { - $force_move = 1; - warn "DEBUG: Old link ($old_target) does not point to us ($target)\n" - if $DEBUG; - } - else { # The .old points to the current - warn "$kimage.old --> $target -- doing nothing"; - $force_move = 0; - } - } - else { - warn "DEBUG: Well, the old link does not exist -- so we move\n" - if $DEBUG; - $force_move = 1; - } - } - else { - warn "DEBUG: No .old link -- OK to move\n" - if $DEBUG; - $force_move = 1; - } - } - else { - warn "DEBUG: ok, minimal swap is no-- so we move.\n" - if $DEBUG; - $force_move = 1; - } - } - else { # already have proper link - warn "$kimage($vmlinuz_target) points to $target ($real_target) -- doing nothing"; - $force_move = 0; - } - return $force_move; -} - - -# This routine moves the symbolic link around (/vmlinuz -> /vmlinuz.old) -# It pays attention to whether we should the fact whether we should be using -# hard links or not. -sub really_move_link { - my $kimage = $_[0]; # Name of the symbolic link - my $image_dest = $_[1]; # The directory the links goes into - my $image_name = $_[2]; - my $src_dir = $_[3]; - warn "really_move_link: kimage=$kimage, image_dest=$image_dest\n" . - "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; - - # don't clobber $kimage.old quite yet - rename("$kimage", "$kimage.$$") || - die "failed to move " . $image_dest . "$kimage:$!"; - my $Old = $src_dir; - my $cwd; - - chomp($cwd=`pwd`); - if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd, - 'Test File' => "$image_name")) { - $Old =~ s|^/*||o; - } - # Special case is they are in the same dir - my $rel_path = spath('Old' => "$Old", 'New' => "$cwd" ); - $Old ="" if $rel_path =~ m/^\s*$/o; - - if ($use_hard_links =~ m/YES/i) { - if (! link("${Old}${image_name}", "$kimage")) { - rename("$kimage.$$", "$kimage"); - die("Failed to link ${Old}${image_name} to " . - "${image_dest}${kimage}.\n"); - } - } - else { - if (! symlink("${Old}${image_name}", "$kimage")) { - rename("$kimage.$$", "$kimage"); - die("Failed to symbolic-link ${Old}${image_name} to " . - "${image_dest}${kimage}.\n"); - } - } - - # Ok, now we may clobber the previous .old file - if (-l "$kimage.old" || ! -e "$kimage.old" ) { - rename("$kimage.$$", "$kimage.old"); - } - else { - warn "$kimage.old is not a symlink, not clobbering\n"; - warn "rm $kimage.$$"; - } -} - -# This routine handles a request to do symlinks, but there is no -# symlink file already there. Either we are supposed to use copy, or we are -# installing on a pristine system, or the user does not want symbolic links at -# all. We use a configuration file to tell the last two cases apart, creating -# a config file if needed. -sub handle_missing_link { - my $kimage = $_[0]; # Name of the symbolic link - my $image_dest = $_[1]; # The directory the links goes into - my $image_name = $_[2]; - my $src_dir = $_[3]; - warn "handle_missing_link: kimage=$kimage, image_dest=$image_dest\n" . - "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; - - if ($no_symlink) { - my $ret = system("cp -a --backup=t " . $realimageloc . - "$image_name " . " $kimage"); - if ($ret) { - die("Failed to copy " . $realimageloc . "$image_name to " - . $image_dest . "$kimage .\n"); - } - } - - if (! $no_symlink && $do_symlink =~ /Yes/i) { - my $Old = $realimageloc; - my $New = $image_dest; - my $Name = "$image_name"; - my $Link_Dest = "$kimage"; - - if (test_relative ('Old Dir' => $Old, - 'New Dir' => $New, - 'Test File' => $Name)) { - $Old =~ s|^/*||o; - } - # Special case is they are in the same dir - my $rel_path = spath('Old' => "$Old", 'New' => "$New" ); - $Old ="" if $rel_path =~ m/^\s*$/o; - - symlink($Old . "$Name", "$Link_Dest") || - die("Failed to symbolic-link ${Old}$Name to $Link_Dest.\n"); - - } -} - -# This routine handles the rest of the cases, where the user has requested -# non-traditional handling, like using cp or hard links. -sub handle_non_symlinks { - my $kimage = $_[0]; # Name of the symbolic link - my $image_dest = $_[1]; # The directory the links goes into - my $image_name = $_[2]; - my $src_dir = $_[3]; - warn "handle_non_link: kimage=$kimage, image_dest=$image_dest\n" . - "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; - - # Save the current image. We do this in all four cases - rename("$kimage", "$kimage.$$") || - die "failed to move " . $image_dest . "$kimage:$!"; - - ##,#### - # case One - #`#### - if ($no_symlink) { - # Maybe /$image_dest is on a dos system? - my $ret = system("cp -a --backup=t " . $realimageloc - . "$image_name " . "$kimage"); - if ($ret) { - if (-e "$kimage.$$") { - rename("$kimage.$$", "$kimage"); - } - die("Failed to copy " . $realimageloc . "$image_name to " - . $image_dest . "$kimage .\n"); - } - } - ##,#### - # case Two - #`#### - elsif ($use_hard_links =~ m/YES/i ) { - # Ok then. this ought to be a hard link, and hence fair game - # don't clobber $kimage.old quite yet - my $Old = $realimageloc; - my $cwd; - chomp($cwd=`pwd`); - if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd, - 'Test File' => "$image_name")) { - $Old =~ s|^/*||o; - } - # Special case is they are in the same dir - my $rel_path = spath('Old' => "$Old", 'New' => "$cwd" ); - $Old ="" if $rel_path =~ m/^\s*$/o; - - if (! link($Old . "$image_name", "$kimage")) { - rename("$kimage.$$", "$kimage"); - die("Failed to hard link " . $realimageloc . "$image_name to " - . $image_dest . "$kimage .\n"); - } - } - ##,#### - # case Three - #`#### - else { - # We just use cp - my $ret = system("cp -a --backup=t " . $realimageloc - . "$image_name " . "$kimage"); - if ($ret) { - if (-e "$kimage.$$") { - rename("$kimage.$$", "$kimage"); - } - die("Failed to copy " . $realimageloc . "$image_name to " - . $image_dest . "$kimage .\n"); - } - } - # Ok, now we may clobber the previous .old file - rename("$kimage.$$", "$kimage.old") if -e "$kimage.$$"; -} - -# This routine is responsible for setting up the symbolic links -# So, the actual kernel image lives in -# $realimageloc/$image_name (/boot/vmlinuz-2.6.12). -# This routine creates symbolic links in $image_dest/$kimage (/vmlinuz) -sub image_magic { - my $kimage = $_[0]; # Name of the symbolic link - my $image_dest = $_[1]; # The directory the links goes into - my $image_name = "$kimage-$version"; - my $src_dir = $realimageloc; - warn "image_magic: kimage=$kimage, image_dest=$image_dest\n" . - "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; - - if (-l "$kimage") { # There is a symbolic link - warn "DEBUG: There is a symlink for $kimage\n" if $DEBUG; - my $force_move = move_p($kimage, $image_dest, $image_name, $src_dir); - - if ($force_move) { - really_move_link($kimage, $image_dest, $image_name, $src_dir); - } - } - elsif (! -e "$kimage") { - # Hmm. Pristine system? How can that be? Installing from scratch? - # Or maybe the user does not want a symbolic link here. - # Possibly they do not want a link here. (we should be in / - # here[$image_dest, really] - handle_missing_link($kimage, $image_dest, $image_name, $src_dir); - } - elsif (-e "$kimage" ) { - # OK, $kimage exists -- but is not a link - handle_non_symlinks($kimage, $image_dest, $image_name, $src_dir); - } -} - -###################################################################### -###################################################################### -###################################################################### -###################################################################### - -sub do_modules { - my $ret = system("depmod -a -F $realimageloc/System.map-$version $version"); - my $exit_value = $? >> 8; - my $signal_num = $? & 127; - my $dumped_core = $? & 128; - if ($ret) { - my $seen; - my $answer; - my $question; - $question = "${package_name}/postinst/depmod-error-initrd-$version"; - - ($ret,$seen) = fset ("$question", 'seen', 'false'); - die "Error setting debconf flags in $question: $seen" if $ret; - - $ret = subst("$question", 'modules_base', "$modules_base"); - die "Error setting debconf substitutions in $question: $seen" if $ret; - - $ret = subst("$question", 'SIGNAL', ", and got a signal $signal_num"); - die "Error setting debconf substitutions in $question: $seen" if $ret; - - if ($dumped_core) { - $ret = subst("$question", 'CORE', ", and dumped core"); - die "Error setting debconf substitutions in $question: $seen" if $ret; - } - else { - $ret = subst("$question", 'CORE', " "); - die "Error setting debconf substitutions in $question: $seen" if $ret; - } - - ($ret,$seen) = input('medium', "$question"); - if ($ret && $ret != 30 ) { - die "Error setting debconf question $question: $seen"; - } - - ($ret,$seen) = go (); - if ($ret && $ret != 30 ) { - die "Error asking debconf question $question: $seen"; - } - - ($ret,$answer) = get("$question"); - die "Error retreiving answer for $question: $answer" if $ret; - - if (! $ignore_depmod_err) { - if ($answer =~ /^(y|t)/i) { - exit(1); - } - else { - print STDERR "Ok, continuing as directed\n"; - } - } - } -} - -# We may not have any modules installed -if (-d "$modules_base/$version") { - &do_modules(); -} - - -# Only change the symlinks if we are not being upgraded -if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m//o) { - image_magic($kimage, $image_dest); - image_magic("initrd.img", $image_dest); -} -else { - lstat($kimage); - if (! -e _) { - handle_missing_link($kimage, $image_dest, "$kimage-$version", - $realimageloc); - } - lstat("initrd.img"); - if (! -e _) { - handle_missing_link("initrd.img", $image_dest, "initrd.img-$version", - $realimageloc); - } -} - -# This routine detects chroots by checking if the devicenumber/inode pair -# of / are the same as that of /sbin/init. This may fail if not running as -# root or if /proc is not mounted, in which case 2 is returned. -sub detect_chroot { - my ($dev1, $ino1) = stat("/") or return 2; - my ($dev2, $ino2) = stat("/proc/1/root") or return 2; - return ($dev1 != $dev2) || ($ino1 != $ino2); -} - -sub is_package_installed { - my ($package) = @_; - for (`dpkg-query 2>/dev/null --showformat '\${status}\\n' -W '$package'`) { - return 1 if / installed\n$/; - } - return 0; -} - -# On mips and mipsel warn users if they need to configure their boot loader -# to load initramfs. mips64 and mips64el are ignored as they always had an -# initramfs. For that look if the current kernel is booted using initramfs. -# We ignore the chroot case, and we also ignore the GRUB case, as -# update-grub will automatically add the initramfs to grub.cfg. -if (($arch eq "mips" || $arch eq "mipsel") - && !is_package_installed("grub-yeeloong") - && detect_chroot() == 0) { - if (-r "/proc/cmdline" && -f "/proc/cmdline") { - if (open(CMDLINE, "/proc/cmdline")) { - if ( !~ m/rd_start=/) { - my $ret; - my $seen; - my $question = "${package_name}/postinst/mips-initrd-$version"; - - ($ret,$seen) = input('critical', "$question"); - if ($ret && $ret != 30 ) { - die "Error setting debconf question $question: $seen"; - } - - ($ret,$seen) = go(); - if ($ret && $ret != 30 ) { - die "Error asking debconf question $question: $seen"; - } - } - close CMDLINE; - } - } -} - -# set the env var stem -$ENV{'STEM'} = "linux"; -sub run_hook { - my $type = shift; - my $script = shift; - - print STDERR "Running $script.\n"; - system ("$script $version $realimageloc$kimage-$version") && - print STDERR "User $type hook script [$script] "; - if ($?) { - if ($? == -1) { - print STDERR "failed to execute: $!\n"; - } - elsif ($? & 127) { - printf STDERR "died with signal %d, %s coredump\n", - ($? & 127), ($? & 128) ? 'with' : 'without'; - } - else { - printf STDERR "exited with value %d\n", $? >> 8; - } - exit $? >> 8; - } -} - -my $options; -for (@ARGV) { - s,','\\'',g; - $options .= " '$_'"; -} -$ENV{'DEB_MAINT_PARAMS'}="$options"; - -## Run user hook script here, if any -if ($postinst_hook) { - &run_hook("postinst", $postinst_hook); -} - -if (-d "/etc/kernel/postinst.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "--arg=$realimageloc$kimage-$version " . - "/etc/kernel/postinst.d") && - die "Failed to process /etc/kernel/postinst.d"; -} - -if (-d "/etc/kernel/postinst.d/$version") { - system ("run-parts --report --exit-on-error --arg=$version " . - "--arg=$realimageloc$kimage-$version " . - "/etc/kernel/postinst.d/$version") && - die "Failed to process /etc/kernel/postinst.d/$version"; -} - -exit 0; - -__END__ diff -Nru linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.postrm linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.postrm --- linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.postrm 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.postrm 1970-01-01 00:00:00.000000000 +0000 @@ -1,276 +0,0 @@ -#! /usr/bin/perl -# -use strict; -use warnings; -use Cwd 'abs_path'; - -# Debconf may not be around here. -my $have_debconf = 0; -my $capb; - -eval { require Debconf::Client::ConfModule; }; -if ( !$@ ) { - $have_debconf++; - import Debconf::Client::ConfModule ':all'; - version('2.0'); - $capb = capb("backup"); -} - -$| = 1; - -# Predefined values: -my $version = "5.2.0-8.2-liquorix-amd64"; -my $link_in_boot = ""; -my $kimage = "vmlinuz"; -my $postrm_hook = ''; #Normally we do not -my $package_name = "linux-image-$version"; - -#known variables -my $image_dest = "/"; -my $realimageloc = "/boot/"; -my $CONF_LOC = '/etc/kernel-img.conf'; - -chdir('/') or die "could not chdir to /:$!\n"; - -if ( -r "$CONF_LOC" && -f "$CONF_LOC" ) { - if ( open( my $conf, '+<', "$CONF_LOC" ) ) { - while (<$conf>) { - chomp; - s/\#.*$//g; - next if /^\s*$/; - - $link_in_boot = "" if /link_in_boot\s*=\s*(no|false|0)\s*$/i; - - $link_in_boot = "Yes" if /link_in_boot\s*=\s*(yes|true|1)\s*$/i; - - $image_dest = "$1" if /image_dest\s*=\s*(\S+)/i; - $postrm_hook = "$1" if /postrm_hook\s*=\s*(\S+)/i; - } - close $conf; - } -} - -if ($link_in_boot) { - $image_dest = $realimageloc; -} - -$image_dest = "$image_dest/"; -$image_dest =~ s|/+$|/|o; - -# The destdir may be gone by now. -if ( -d "$image_dest" ) { - chdir("$image_dest") or die "could not chdir to $image_dest:$!\n"; -} - -###################################################################### -###################################################################### -############ -###################################################################### -###################################################################### -sub remove_sym_link { - my $bad_image = $_[0]; - - warn "Removing symbolic link $bad_image \n"; - warn "You may need to re-run your boot loader\n"; - - # Remove the dangling link - unlink "$bad_image"; -} - -###################################################################### -###################################################################### -############ -###################################################################### -###################################################################### -sub CanonicalizePath { - my $path = join '/', @_; - my @work = split '/', $path; - my @out; - my $is_absolute; - - if ( @work && $work[0] eq "" ) { $is_absolute = 1; shift @work; } - - while (@work) { - my $seg = shift @work; - if ( $seg eq "." || $seg eq "" ) { - } - elsif ( $seg eq ".." ) { - if ( @out && $out[-1] ne ".." ) { - pop @out; - } - else { - # Leading "..", or "../..", etc. - push @out, $seg; - } - } - else { - push @out, $seg; - } - } - - unshift @out, "" if $is_absolute; - return join( '/', @out ); -} - -###################################################################### -###################################################################### -############ -###################################################################### -###################################################################### -# This removes dangling symlinks. What do we do about hard links? Surely a -# something with the nane $image_dest . "$kimage" ought not to be left behind? -sub image_magic { - my $kimage = $_[0]; - my $image_dest = $_[1]; - - if ( -l "$kimage" ) { - - # There is a symbolic link - my $force_move = 0; - my $vmlinuz_target = readlink "$kimage"; - my $real_target = ''; - $real_target = abs_path($vmlinuz_target) if defined($vmlinuz_target); - if ( !defined($vmlinuz_target) || !-f "$real_target" ) { - - # what, a dangling symlink? - warn "The link " . $image_dest . "$kimage is a damaged link\n"; - - # Remove the dangling link - &remove_sym_link("$kimage"); - } - else { - my $canonical_target = CanonicalizePath("$vmlinuz_target"); - if ( !-e $canonical_target ) { - warn "The link " . $image_dest . "$kimage is a dangling link\n"; - &remove_sym_link("$kimage"); - } - } - } -} - -# set the env var stem -$ENV{'STEM'} = "linux"; - -sub exec_script { - my $type = shift; - my $script = shift; - print STDERR "Running $type hook script $script.\n"; - system("$script $version $realimageloc$kimage-$version") - && print STDERR "User $type hook script [$script] "; - if ($?) { - if ( $? == -1 ) { - print STDERR "failed to execute: $!\n"; - } - elsif ( $? & 127 ) { - printf STDERR "died with signal %d, %s coredump\n", - ( $? & 127 ), ( $? & 128 ) ? 'with' : 'without'; - } - else { - printf STDERR "exited with value %d\n", $? >> 8; - } - } -} - -sub run_hook { - my $type = shift; - my $script = shift; - if ( $script =~ m,^/, ) { - - # Full path provided for the hook script - if ( -x "$script" ) { - &exec_script( $type, $script ); - } - else { - warn "The provided $type hook script [$script] could not be run.\n"; - } - } - else { - # Look for it in a safe path - for my $path ( '/bin', '/sbin', '/usr/bin', '/usr/sbin' ) { - if ( -x "$path/$script" ) { - &exec_script( $type, "$path/$script" ); - return 0; - } - } - - # No luck - print STDERR "Could not find $type hook script [$script].\n"; - warn "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n"; - } -} - -my $options; -for (@ARGV) { - s,','\\'',g; - $options .= " '$_'"; -} -$ENV{'DEB_MAINT_PARAMS'} = "$options"; - -## Run user hook script here, if any -if ($postrm_hook) { - &run_hook( "postrm", $postrm_hook ); -} -if ( -d "/etc/kernel/postrm.d" ) { - system( "run-parts --report --exit-on-error --arg=$version " - . "--arg=$realimageloc$kimage-$version " - . "/etc/kernel/postrm.d" ) - && die "Failed to process /etc/kernel/postrm.d"; -} -if ( -d "/etc/kernel/postrm.d/$version" ) { - system( "run-parts --report --exit-on-error --arg=$version " - . "--arg=$realimageloc$kimage-$version " - . "/etc/kernel/postrm.d/$version" ) - && die "Failed to process /etc/kernel/postrm.d/$version"; -} - -# purge initramfs and related -if ( $ARGV[0] !~ /upgrade/ ) { - if ( -f $realimageloc . "initrd.img-$version" ) { - unlink $realimageloc . "initrd.img-$version"; - } - if ( -f $realimageloc . "initrd.img-$version.old-dkms" ) { - unlink $realimageloc . "initrd.img-$version.old-dkms"; - } - if ( -f $realimageloc . "initrd.img-$version.bak" ) { - unlink $realimageloc . "initrd.img-$version.bak"; - } - if ( -f "/var/lib/initramfs-tools/$version" ) { - unlink "/var/lib/initramfs-tools/$version"; - } - - # check and remove damaged and dangling symlinks - image_magic( $kimage, $image_dest ); - image_magic( $kimage . ".old", $image_dest ); - image_magic( "initrd.img", $image_dest ); - image_magic( "initrd.img.old", $image_dest ); -} - -# Ignore all invocations except when called on to purge. -exit 0 unless $ARGV[0] =~ /purge/; - -my $ret = purge(); - -my @files_to_remove = qw{ - modules.dep modules.isapnpmap modules.pcimap - modules.usbmap modules.parportmap - modules.generic_string modules.ieee1394map - modules.ieee1394map modules.pnpbiosmap - modules.alias modules.ccwmap modules.inputmap - modules.symbols modules.ofmap - modules.seriomap modules.*.bin - modules.softdep modules.devname -}; - -foreach my $extra_file (@files_to_remove) { - for ( glob("/lib/modules/$version/$extra_file") ) { - unlink; - } -} - -if ( -d "/lib/modules/$version" ) { - system( "rm", "-r", "-f", "/lib/modules/$version" ); -} - -exit 0; - -__END__ diff -Nru linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.preinst linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.preinst --- linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.preinst 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.preinst 1970-01-01 00:00:00.000000000 +0000 @@ -1,119 +0,0 @@ -#! /usr/bin/perl -# -use strict; -use warnings; - -use Debconf::Client::ConfModule qw(:all); -version('2.0'); -my $capb=capb("backup"); - -$|=1; - -# Predefined values: -my $version = "5.2.0-8.2-liquorix-amd64"; -my $kimage = "vmlinuz"; -my $preinst_hook = ''; #Normally we do not -my $package_name = "linux-image-$version"; - -#known variables -my $realimageloc = "/boot/"; -my $CONF_LOC = '/etc/kernel-img.conf'; - -my $modules_base = '/lib/modules'; - -die "Pre inst Internal error. Aborting." unless $version; - -exit 0 if $ARGV[0] =~ /abort-upgrade/; -exit 1 unless $ARGV[0] =~ /(install|upgrade)/; - -if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { - if (open(CONF, "$CONF_LOC")) { - while () { - chomp; - s/\#.*$//g; - next if /^\s*$/; - - $preinst_hook = "$1" if /preinst_hook\s*=\s*(\S+)/i; - } - close CONF; - } -} - - -# set the env var stem -$ENV{'STEM'} = "linux"; - -sub exec_script { - my $type = shift; - my $script = shift; - print STDERR "Running $type hook script $script.\n"; - system ("$script $version $realimageloc$kimage-$version") && - print STDERR "User $type hook script [$script] "; - if ($?) { - if ($? == -1) { - print STDERR "failed to execute: $!\n"; - } - elsif ($? & 127) { - printf STDERR "died with signal %d, %s coredump\n", - ($? & 127), ($? & 128) ? 'with' : 'without'; - } - else { - printf STDERR "exited with value %d\n", $? >> 8; - } - exit $? >> 8; - } -} -sub run_hook { - my $type = shift; - my $script = shift; - if ($script =~ m,^/,) { - # Full path provided for the hook script - if (-x "$script") { - &exec_script($type,$script); - } - else { - die "The provided $type hook script [$script] could not be run.\n"; - } - } - else { - # Look for it in a safe path - for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') { - if (-x "$path/$script") { - &exec_script($type, "$path/$script"); - return 0; - } - } - # No luck - print STDERR "Could not find $type hook script [$script].\n"; - die "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n"; - } -} - - -my $options; -for (@ARGV) { - s,','\\'',g; - $options .= " '$_'"; -} -$ENV{'DEB_MAINT_PARAMS'}="$options"; - -## Run user hook script here, if any -if (-x "$preinst_hook") { - &run_hook("preinst", $preinst_hook); -} -if (-d "/etc/kernel/preinst.d") { - system ("run-parts --report --exit-on-error --arg=$version" . - " --arg=$realimageloc$kimage-$version" . - " /etc/kernel/preinst.d") && - die "Failed to process /etc/kernel/preinst.d"; -} -if (-d "/etc/kernel/preinst.d/$version") { - system ("run-parts --report --exit-on-error --arg=$version" . - " --arg=$realimageloc$kimage-$version" . - " /etc/kernel/preinst.d/$version") && - die "Failed to process /etc/kernel/preinst.d/$version"; -} - -exit 0; - -__END__ diff -Nru linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.prerm linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.prerm --- linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.prerm 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.prerm 1970-01-01 00:00:00.000000000 +0000 @@ -1,158 +0,0 @@ -#! /usr/bin/perl -# -use strict; -use warnings; -use Debconf::Client::ConfModule qw(:all); -version('2.0'); -my $capb=capb("backup"); - -$|=1; -# Predefined values: -my $version = "5.2.0-8.2-liquorix-amd64"; -my $kimage = "vmlinuz"; -my $prerm_hook = ''; #Normally we do not -my $package_name = "linux-image-$version"; - -#known variables -my $realimageloc = "/boot/"; -my $CONF_LOC = '/etc/kernel-img.conf'; - -# Variables used -my $image=''; -my $ret=0; -my $seen=''; -my $answer=''; -my $running = ''; -my $WouldInvalidate = 0; - -# Ignore all invocations uxcept when called on to remove -exit 0 unless ($ARGV[0] && $ARGV[0] =~ /remove/) ; - -if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { - if (open(CONF, "$CONF_LOC")) { - while () { - chomp; - s/\#.*$//g; - next if /^\s*$/; - - $prerm_hook = "$1" if /prerm_hook\s*=\s*(\S+)/i; - } - close CONF; - } -} - - -#check to see if we are trying to remove a running kernel -# if so we abort right now. -chop($running=`uname -r`); -if ($running eq $version) { - my $question = "${package_name}/prerm/removing-running-kernel-$version"; - - ($ret,$seen) = fset ("$question", 'seen', 'false'); - die "Error setting debconf flags in $question: $seen" if $ret; - - $ret = subst("$question", 'running', "$running"); - die "Error setting debconf substitutions in $question: $seen" if $ret; - - ($ret,$seen) = input('critical', "$question"); - if ($ret && $ret != 30 ) { - die "Error setting debconf question $question: $seen"; - } - - ($ret,$seen) = go (); - if ($ret && $ret != 30 ) { - die "Error asking debconf question $question: $seen"; - } - - ($ret,$answer) = get("$question"); - die "Error retreiving answer for $question: $answer" if $ret; - - if ($answer =~ /^(y|t)/i) { - print STDERR "Aborting removal of running kernel image.\n"; - exit 1; #Operation not permitted - } - else { - print STDERR "Ok, proceeding with removing running kernel image.\n"; - } -} - -#Now, they have an alternate kernel which they are currently running - -chdir("/") or die "could not chdir to /:$!\n"; - - -# set the env var stem -$ENV{'STEM'} = "linux"; - -sub exec_script { - my $type = shift; - my $script = shift; - print STDERR "Running $type hook script $script.\n"; - system ("$script $version $realimageloc$kimage-$version") && - print STDERR "User $type hook script [$script] "; - if ($?) { - if ($? == -1) { - print STDERR "failed to execute: $!\n"; - } - elsif ($? & 127) { - printf STDERR "died with signal %d, %s coredump\n", - ($? & 127), ($? & 128) ? 'with' : 'without'; - } - else { - printf STDERR "exited with value %d\n", $? >> 8; - } - exit $? >> 8; - } -} -sub run_hook { - my $type = shift; - my $script = shift; - if ($script =~ m,^/,) { - # Full path provided for the hook script - if (-x "$script") { - &exec_script($type,$script); - } - else { - die "The provided $type hook script [$script] could not be run.\n"; - } - } - else { - # Look for it in a safe path - for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') { - if (-x "$path/$script") { - &exec_script($type, "$path/$script"); - return 0; - } - } - # No luck - print STDERR "Could not find $type hook script [$script].\n"; - die "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n"; - } -} - - -my $options; -for (@ARGV) { - s,','\\'',g; - $options .= " '$_'"; -} -$ENV{'DEB_MAINT_PARAMS'}="$options"; - -## Run user hook script here, if any -if (-x "$prerm_hook") { - &run_hook("prerm", $prerm_hook); -} -if (-d "/etc/kernel/prerm.d") { - system ("run-parts --report --exit-on-error --arg=$version " . - "--arg=$realimageloc$kimage-$version /etc/kernel/prerm.d") && - die "Failed to process /etc/kernel/prerm.d"; -} -if (-d "/etc/kernel/prerm.d/$version") { - system ("run-parts --report --exit-on-error --arg=$version" . - " --arg=$realimageloc$kimage-$version " . - "/etc/kernel/prerm.d/$version") && - die "Failed to process /etc/kernel/prerm.d/$version"; -} - -exit 0; -__END__ diff -Nru linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.templates linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.templates --- linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.templates 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-image-5.2.0-8.2-liquorix-amd64.templates 1970-01-01 00:00:00.000000000 +0000 @@ -1,53 +0,0 @@ -# These templates have mostly been reviewed by the debian-l10n-english -# team -# -# If modifications/additions/rewording are needed, please ask -# debian-l10n-english@lists.debian.org for advice. -# -# Even minor modifications require translation updates and such -# changes should be coordinated with translators and reviewers. - -Template: linux-image-5.2.0-8.2-liquorix-amd64/postinst/depmod-error-initrd-5.2.0-8.2-liquorix-amd64 -Type: boolean -Default: false -_Description: Abort installation after depmod error? - The 'depmod' command exited with the exit code ${exit_value} - (${SIGNAL}${CORE}). - . - Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/modules.dep file - will not be deleted, even though it may be invalid. - . - You should abort the installation and fix the - errors in depmod, or regenerate the initrd image with a known good - modules.dep file. If you don't abort the installation, there is - a danger that the system will fail to boot. - -Template: linux-image-5.2.0-8.2-liquorix-amd64/prerm/removing-running-kernel-5.2.0-8.2-liquorix-amd64 -Type: boolean -Default: true -_Description: Abort kernel removal? - You are running a kernel (version ${running}) and attempting to remove - the same version. - . - This can make the system unbootable as it will remove - /boot/vmlinuz-${running} and all modules under the directory - /lib/modules/${running}. This can only be fixed with a copy of the - kernel image and the corresponding modules. - . - It is highly recommended to abort the kernel removal unless you are - prepared to fix the system after removal. - -Template: linux-image-5.2.0-8.2-liquorix-amd64/postinst/mips-initrd-5.2.0-8.2-liquorix-amd64 -Type: note -_Description: Boot loader configuration must be updated to load initramfs - This kernel package will build an "initramfs" file - (/boot/initrd.img-5.2.0-8.2-liquorix-amd64) for the system's boot loader - to use in addition to the kernel itself. This method, formerly - unsupported on MIPS, enables a more flexible boot process, and future - kernel versions may require a corresponding initrd.img to boot. - . - The currently running kernel was booted without an initramfs. You - should reconfigure the boot loader to load the initramfs for Linux - version 5.2.0-8.2, and for each later version. This is probably - most easily accomplished by using the initrd.img symbolic link - maintained by the kernel package. diff -Nru linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.postinst linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.postinst --- linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.postinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.postinst 2019-08-16 22:19:02.000000000 +0000 @@ -0,0 +1,649 @@ +#! /usr/bin/perl +# +use strict; +use warnings; +use Cwd 'abs_path'; +use Debconf::Client::ConfModule qw(:all); +use POSIX (); +version('2.0'); +my $capb = capb('backup', 'escape'); + +$|=1; + +# Predefined values: +my $version = "5.2.0-9.1-liquorix-amd64"; +my $arch = "amd64"; +my $link_in_boot = ""; +my $no_symlink = ""; +my $do_symlink = "Yes"; # target machine defined +my $kimage = "vmlinuz"; +my $mkimage = ""; # command to generate the initrd image +my $use_hard_links = ''; # hardlinks do not work across fs boundaries +my $postinst_hook = ''; #Normally we do not +my $minimal_swap = ''; # Do not swap symlinks +my $ignore_depmod_err = ''; # normally we do not +my $package_name = "linux-image-$version"; + +#known variables +my $image_dest = "/"; +my $realimageloc = "/boot/"; +my $have_conffile = ""; + +my $modules_base = '/lib/modules'; +my $CONF_LOC = '/etc/kernel-img.conf'; + +# Ignore all invocations except when called on to configure. +exit 0 unless $ARGV[0] =~ /configure/; + +my $DEBUG = 0; + +# Do some preliminary sanity checks here to ensure we actually have an +# valid image dir +chdir('/') or die "could not chdir to /:$!\n"; +die "Internal Error: ($realimageloc) is not a directory!\n" + unless -d $realimageloc; + +if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { + if (open(CONF, "$CONF_LOC")) { + while () { + chomp; + s/\#.*$//g; + next if /^\s*$/; + + $do_symlink = "" if /do_symlinks\s*=\s*(no|false|0)\s*$/i; + $no_symlink = "" if /no_symlinks\s*=\s*(no|false|0)\s*$/i; + $link_in_boot = "" if /link_in_boot\s*=\s*(no|false|0)\s*$/i; + $use_hard_links = '' if /use_hard_links\s*=\s*(no|false|0)\s*$/i; + $minimal_swap = '' if /minimal_swap\s*=\s*(no|false|0)\s*$/i; + $ignore_depmod_err = '' if /ignore_depmod_err\s*=\s*(no|false|0)\s*$/i; + + $do_symlink = "Yes" if /do_symlinks\s*=\s*(yes|true|1)\s*$/i; + $no_symlink = "Yes" if /no_symlinks\s*=\s*(yes|true|1)\s*$/i; + $link_in_boot = "Yes" if /link_in_boot\s*=\s*(yes|true|1)\s*$/i; + $use_hard_links = "Yes" if /use_hard_links\s*=\s*(yes|true|1)\s*$/i; + $minimal_swap = 'Yes' if /minimal_swap\s*=\s*(yes|true|1)\s*$/i; + $ignore_depmod_err = 'Yes' if /ignore_depmod_err\s*=\s*(yes|true|1)\s*$/i; + + $image_dest = "$1" if /image_dest\s*=\s*(\S+)/i; + $postinst_hook = "$1" if /postinst_hook\s*=\s*(\S+)/i; + $mkimage = "$1" if /mkimage\s*=\s*(.+)$/i; + } + close CONF; + $have_conffile = "Yes"; + } +} + + +if ($link_in_boot) { + $image_dest = $realimageloc; +} + +# Tack on at least one trainling / +$image_dest = "$image_dest/"; +$image_dest =~ s|^/*|/|o; +$image_dest =~ s|/+$|/|o; + +if (! -d "$image_dest") { + die "Expected Image Destination dir ($image_dest) to be a valid directory!\n"; +} + +# sanity +if ($do_symlink && $no_symlink) { + warn "Both do_symlinks and no_symlinks options enabled; disabling no_symlinks\n"; + $no_symlink = 0; +} + +# most of our work is done in $image_dest (nominally /) +chdir("$image_dest") or die "could not chdir to $image_dest:$!\n"; + + +die "Internal Error: Could not find image (" . $realimageloc + . "$kimage-$version)\n" unless -e $realimageloc + . "$kimage-$version"; + + +###################################################################### +###################################################################### +########### Test whether a relative symlinkwould be OK ####### +###################################################################### +###################################################################### +sub test_relative { + my %params = @_; + my $cwd; + + die "Internal Error: Missing Required paramater 'Old Dir' " + unless $params{'Old Dir'}; + die "Internal Error: Missing Required paramater New Dir' " + unless $params{'New Dir'}; + + + die "Internal Error: No such dir $params{'Old Dir'} " + unless -d $params{'Old Dir'}; + die "Internal Error: No such dir $params{'New Dir'} " + unless -d $params{'New Dir'}; + + warn "Test relative: testing $params{'Old Dir'} -> $params{'New Dir'}" + if $DEBUG; + chomp($cwd = `pwd`); + chdir ($params{'New Dir'}) or die "Could not chdir to $params{'New Dir'}:$!"; + my $ok = 0; + $params{'Old Dir'} =~ s|^/*||o; + if (-d $params{'Old Dir'} ) { + if (defined $params{'Test File'}) { + if (-e $params{'Old Dir'} . $params{'Test File'}) { + $ok = 1; + } + } else { + $ok = 1; # well, backward compatibility + } + } + chdir ($cwd) or die "Could not chdir to $params{'New Dir'}:$!"; + return $ok; +} + + +sub spath { + my %params = @_; + + die "Missing Required paramater 'Old'" unless $params{'Old'}; + die "Missing Required paramater 'New'" unless $params{'New'}; + + my @olddir = split '/', `readlink -q -m $params{'Old'}`; + my @newdir = split '/', `readlink -q -m $params{'New'}`; + my @outdir = @olddir; + + my $out = ''; + my $i; + for ($i = 0; $i <= $#olddir && $i <= $#newdir; $i++) { + $out++ if ($olddir[$i] ne $newdir[$i]); + shift @outdir unless $out; + unshift @outdir, ".." if $out; + } + if ($#newdir > $#olddir) { + for ($i=0; $i < $#newdir; $i++) { + unshift @outdir, ".."; + } + } + return join ('/', @outdir); +} + +# This routine is invoked if there is a symbolic link in place +# in $image_dest/$kimage -- so a symlink exists in the destination. +# What we are trying to determine is if we need to move the symbolic link over +# to the the .old location +sub move_p { + my $kimage = $_[0]; # Name of the symbolic link + my $image_dest = $_[1]; # The directory the links goes into + my $image_name = $_[2]; + my $src_dir = $_[3]; + my $force_move = 0; + warn "Move?: kimage=$kimage, image_dest=$image_dest, \n" . + "\timage_name=$image_name, src_dir=$src_dir" if $DEBUG; + + if ($no_symlink) { + # we do not want links, yet we have a symbolic link here! + warn "found a symbolic link in " . $image_dest . "$kimage \n" . + "even though no_symlink is defined\n" if $no_symlink; + # make sure we change this state of affairs + $force_move = 1; + return $force_move; + } + + warn "DEBUG: OK. We found symlink, and we should have a symlink here.\n" + if $DEBUG; + my $vmlinuz_target = readlink "$kimage"; + my $real_target = ''; + my $target = `readlink -q -m "${realimageloc}${kimage}-$version"`; + $real_target = abs_path($vmlinuz_target) if defined($vmlinuz_target); + + if (!defined($vmlinuz_target) || ! -f "$real_target") { + # what, a dangling symlink? + warn "The link " . $image_dest . "$kimage is a dangling link" . + "to $real_target\n"; + $force_move = 1; + return $force_move; + } + + + warn "DEBUG: The link $kimage points to ($vmlinuz_target)\n" if $DEBUG; + warn "DEBUG: ($vmlinuz_target) is really ($real_target)\n" if $DEBUG; + my $cwd; + chomp ($cwd=`pwd`); + if ($vmlinuz_target !~ m|^/|o) { + $vmlinuz_target = $cwd . "/" . $vmlinuz_target; + $vmlinuz_target =~ s|/+|/|o; + } + $vmlinuz_target = `readlink -q -m $vmlinuz_target`; + + if ("$vmlinuz_target" ne "$target") { + warn "DEBUG: We need to handle this.\n" if $DEBUG; + if ($minimal_swap) { + warn "DEBUG: Minimal swap.\n" if $DEBUG; + if (-l "$kimage.old") { + warn "DEBUG: There is an old link at $kimage.old\n" if $DEBUG; + my $old_target = readlink "$kimage.old"; + my $real_old_target = ''; + $real_old_target=abs_path($old_target) if defined ($old_target); + + if ($real_old_target && -f "$real_old_target") { + if ($old_target !~ m|^/|o) { + $old_target = $cwd . "/" . $old_target; + $old_target =~ s|/+|/|o; + } + $old_target = `readlink -q -m $old_target`; + if ("$old_target" ne "$target") { + $force_move = 1; + warn "DEBUG: Old link ($old_target) does not point to us ($target)\n" + if $DEBUG; + } + else { # The .old points to the current + warn "$kimage.old --> $target -- doing nothing"; + $force_move = 0; + } + } + else { + warn "DEBUG: Well, the old link does not exist -- so we move\n" + if $DEBUG; + $force_move = 1; + } + } + else { + warn "DEBUG: No .old link -- OK to move\n" + if $DEBUG; + $force_move = 1; + } + } + else { + warn "DEBUG: ok, minimal swap is no-- so we move.\n" + if $DEBUG; + $force_move = 1; + } + } + else { # already have proper link + warn "$kimage($vmlinuz_target) points to $target ($real_target) -- doing nothing"; + $force_move = 0; + } + return $force_move; +} + + +# This routine moves the symbolic link around (/vmlinuz -> /vmlinuz.old) +# It pays attention to whether we should the fact whether we should be using +# hard links or not. +sub really_move_link { + my $kimage = $_[0]; # Name of the symbolic link + my $image_dest = $_[1]; # The directory the links goes into + my $image_name = $_[2]; + my $src_dir = $_[3]; + warn "really_move_link: kimage=$kimage, image_dest=$image_dest\n" . + "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; + + # don't clobber $kimage.old quite yet + rename("$kimage", "$kimage.$$") || + die "failed to move " . $image_dest . "$kimage:$!"; + my $Old = $src_dir; + my $cwd; + + chomp($cwd=`pwd`); + if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd, + 'Test File' => "$image_name")) { + $Old =~ s|^/*||o; + } + # Special case is they are in the same dir + my $rel_path = spath('Old' => "$Old", 'New' => "$cwd" ); + $Old ="" if $rel_path =~ m/^\s*$/o; + + if ($use_hard_links =~ m/YES/i) { + if (! link("${Old}${image_name}", "$kimage")) { + rename("$kimage.$$", "$kimage"); + die("Failed to link ${Old}${image_name} to " . + "${image_dest}${kimage}.\n"); + } + } + else { + if (! symlink("${Old}${image_name}", "$kimage")) { + rename("$kimage.$$", "$kimage"); + die("Failed to symbolic-link ${Old}${image_name} to " . + "${image_dest}${kimage}.\n"); + } + } + + # Ok, now we may clobber the previous .old file + if (-l "$kimage.old" || ! -e "$kimage.old" ) { + rename("$kimage.$$", "$kimage.old"); + } + else { + warn "$kimage.old is not a symlink, not clobbering\n"; + warn "rm $kimage.$$"; + } +} + +# This routine handles a request to do symlinks, but there is no +# symlink file already there. Either we are supposed to use copy, or we are +# installing on a pristine system, or the user does not want symbolic links at +# all. We use a configuration file to tell the last two cases apart, creating +# a config file if needed. +sub handle_missing_link { + my $kimage = $_[0]; # Name of the symbolic link + my $image_dest = $_[1]; # The directory the links goes into + my $image_name = $_[2]; + my $src_dir = $_[3]; + warn "handle_missing_link: kimage=$kimage, image_dest=$image_dest\n" . + "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; + + if ($no_symlink) { + my $ret = system("cp -a --backup=t " . $realimageloc . + "$image_name " . " $kimage"); + if ($ret) { + die("Failed to copy " . $realimageloc . "$image_name to " + . $image_dest . "$kimage .\n"); + } + } + + if (! $no_symlink && $do_symlink =~ /Yes/i) { + my $Old = $realimageloc; + my $New = $image_dest; + my $Name = "$image_name"; + my $Link_Dest = "$kimage"; + + if (test_relative ('Old Dir' => $Old, + 'New Dir' => $New, + 'Test File' => $Name)) { + $Old =~ s|^/*||o; + } + # Special case is they are in the same dir + my $rel_path = spath('Old' => "$Old", 'New' => "$New" ); + $Old ="" if $rel_path =~ m/^\s*$/o; + + symlink($Old . "$Name", "$Link_Dest") || + die("Failed to symbolic-link ${Old}$Name to $Link_Dest.\n"); + + } +} + +# This routine handles the rest of the cases, where the user has requested +# non-traditional handling, like using cp or hard links. +sub handle_non_symlinks { + my $kimage = $_[0]; # Name of the symbolic link + my $image_dest = $_[1]; # The directory the links goes into + my $image_name = $_[2]; + my $src_dir = $_[3]; + warn "handle_non_link: kimage=$kimage, image_dest=$image_dest\n" . + "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; + + # Save the current image. We do this in all four cases + rename("$kimage", "$kimage.$$") || + die "failed to move " . $image_dest . "$kimage:$!"; + + ##,#### + # case One + #`#### + if ($no_symlink) { + # Maybe /$image_dest is on a dos system? + my $ret = system("cp -a --backup=t " . $realimageloc + . "$image_name " . "$kimage"); + if ($ret) { + if (-e "$kimage.$$") { + rename("$kimage.$$", "$kimage"); + } + die("Failed to copy " . $realimageloc . "$image_name to " + . $image_dest . "$kimage .\n"); + } + } + ##,#### + # case Two + #`#### + elsif ($use_hard_links =~ m/YES/i ) { + # Ok then. this ought to be a hard link, and hence fair game + # don't clobber $kimage.old quite yet + my $Old = $realimageloc; + my $cwd; + chomp($cwd=`pwd`); + if (test_relative ('Old Dir' => $Old, 'New Dir' => $cwd, + 'Test File' => "$image_name")) { + $Old =~ s|^/*||o; + } + # Special case is they are in the same dir + my $rel_path = spath('Old' => "$Old", 'New' => "$cwd" ); + $Old ="" if $rel_path =~ m/^\s*$/o; + + if (! link($Old . "$image_name", "$kimage")) { + rename("$kimage.$$", "$kimage"); + die("Failed to hard link " . $realimageloc . "$image_name to " + . $image_dest . "$kimage .\n"); + } + } + ##,#### + # case Three + #`#### + else { + # We just use cp + my $ret = system("cp -a --backup=t " . $realimageloc + . "$image_name " . "$kimage"); + if ($ret) { + if (-e "$kimage.$$") { + rename("$kimage.$$", "$kimage"); + } + die("Failed to copy " . $realimageloc . "$image_name to " + . $image_dest . "$kimage .\n"); + } + } + # Ok, now we may clobber the previous .old file + rename("$kimage.$$", "$kimage.old") if -e "$kimage.$$"; +} + +# This routine is responsible for setting up the symbolic links +# So, the actual kernel image lives in +# $realimageloc/$image_name (/boot/vmlinuz-2.6.12). +# This routine creates symbolic links in $image_dest/$kimage (/vmlinuz) +sub image_magic { + my $kimage = $_[0]; # Name of the symbolic link + my $image_dest = $_[1]; # The directory the links goes into + my $image_name = "$kimage-$version"; + my $src_dir = $realimageloc; + warn "image_magic: kimage=$kimage, image_dest=$image_dest\n" . + "\t image_name=$image_name, src_dir=$src_dir" if $DEBUG; + + if (-l "$kimage") { # There is a symbolic link + warn "DEBUG: There is a symlink for $kimage\n" if $DEBUG; + my $force_move = move_p($kimage, $image_dest, $image_name, $src_dir); + + if ($force_move) { + really_move_link($kimage, $image_dest, $image_name, $src_dir); + } + } + elsif (! -e "$kimage") { + # Hmm. Pristine system? How can that be? Installing from scratch? + # Or maybe the user does not want a symbolic link here. + # Possibly they do not want a link here. (we should be in / + # here[$image_dest, really] + handle_missing_link($kimage, $image_dest, $image_name, $src_dir); + } + elsif (-e "$kimage" ) { + # OK, $kimage exists -- but is not a link + handle_non_symlinks($kimage, $image_dest, $image_name, $src_dir); + } +} + +###################################################################### +###################################################################### +###################################################################### +###################################################################### + +sub do_modules { + my $ret = system("depmod -a -F $realimageloc/System.map-$version $version"); + my $exit_value = $? >> 8; + my $signal_num = $? & 127; + my $dumped_core = $? & 128; + if ($ret) { + my $seen; + my $answer; + my $question; + $question = "${package_name}/postinst/depmod-error-initrd-$version"; + + ($ret,$seen) = fset ("$question", 'seen', 'false'); + die "Error setting debconf flags in $question: $seen" if $ret; + + $ret = subst("$question", 'modules_base', "$modules_base"); + die "Error setting debconf substitutions in $question: $seen" if $ret; + + $ret = subst("$question", 'SIGNAL', ", and got a signal $signal_num"); + die "Error setting debconf substitutions in $question: $seen" if $ret; + + if ($dumped_core) { + $ret = subst("$question", 'CORE', ", and dumped core"); + die "Error setting debconf substitutions in $question: $seen" if $ret; + } + else { + $ret = subst("$question", 'CORE', " "); + die "Error setting debconf substitutions in $question: $seen" if $ret; + } + + ($ret,$seen) = input('medium', "$question"); + if ($ret && $ret != 30 ) { + die "Error setting debconf question $question: $seen"; + } + + ($ret,$seen) = go (); + if ($ret && $ret != 30 ) { + die "Error asking debconf question $question: $seen"; + } + + ($ret,$answer) = get("$question"); + die "Error retreiving answer for $question: $answer" if $ret; + + if (! $ignore_depmod_err) { + if ($answer =~ /^(y|t)/i) { + exit(1); + } + else { + print STDERR "Ok, continuing as directed\n"; + } + } + } +} + +# We may not have any modules installed +if (-d "$modules_base/$version") { + &do_modules(); +} + + +# Only change the symlinks if we are not being upgraded +if (! defined $ARGV[1] || ! $ARGV[1] || $ARGV[1] =~ m//o) { + image_magic($kimage, $image_dest); + image_magic("initrd.img", $image_dest); +} +else { + lstat($kimage); + if (! -e _) { + handle_missing_link($kimage, $image_dest, "$kimage-$version", + $realimageloc); + } + lstat("initrd.img"); + if (! -e _) { + handle_missing_link("initrd.img", $image_dest, "initrd.img-$version", + $realimageloc); + } +} + +# This routine detects chroots by checking if the devicenumber/inode pair +# of / are the same as that of /sbin/init. This may fail if not running as +# root or if /proc is not mounted, in which case 2 is returned. +sub detect_chroot { + my ($dev1, $ino1) = stat("/") or return 2; + my ($dev2, $ino2) = stat("/proc/1/root") or return 2; + return ($dev1 != $dev2) || ($ino1 != $ino2); +} + +sub is_package_installed { + my ($package) = @_; + for (`dpkg-query 2>/dev/null --showformat '\${status}\\n' -W '$package'`) { + return 1 if / installed\n$/; + } + return 0; +} + +# On mips and mipsel warn users if they need to configure their boot loader +# to load initramfs. mips64 and mips64el are ignored as they always had an +# initramfs. For that look if the current kernel is booted using initramfs. +# We ignore the chroot case, and we also ignore the GRUB case, as +# update-grub will automatically add the initramfs to grub.cfg. +if (($arch eq "mips" || $arch eq "mipsel") + && !is_package_installed("grub-yeeloong") + && detect_chroot() == 0) { + if (-r "/proc/cmdline" && -f "/proc/cmdline") { + if (open(CMDLINE, "/proc/cmdline")) { + if ( !~ m/rd_start=/) { + my $ret; + my $seen; + my $question = "${package_name}/postinst/mips-initrd-$version"; + + ($ret,$seen) = input('critical', "$question"); + if ($ret && $ret != 30 ) { + die "Error setting debconf question $question: $seen"; + } + + ($ret,$seen) = go(); + if ($ret && $ret != 30 ) { + die "Error asking debconf question $question: $seen"; + } + } + close CMDLINE; + } + } +} + +# set the env var stem +$ENV{'STEM'} = "linux"; +sub run_hook { + my $type = shift; + my $script = shift; + + print STDERR "Running $script.\n"; + system ("$script $version $realimageloc$kimage-$version") && + print STDERR "User $type hook script [$script] "; + if ($?) { + if ($? == -1) { + print STDERR "failed to execute: $!\n"; + } + elsif ($? & 127) { + printf STDERR "died with signal %d, %s coredump\n", + ($? & 127), ($? & 128) ? 'with' : 'without'; + } + else { + printf STDERR "exited with value %d\n", $? >> 8; + } + exit $? >> 8; + } +} + +my $options; +for (@ARGV) { + s,','\\'',g; + $options .= " '$_'"; +} +$ENV{'DEB_MAINT_PARAMS'}="$options"; + +## Run user hook script here, if any +if ($postinst_hook) { + &run_hook("postinst", $postinst_hook); +} + +if (-d "/etc/kernel/postinst.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "--arg=$realimageloc$kimage-$version " . + "/etc/kernel/postinst.d") && + die "Failed to process /etc/kernel/postinst.d"; +} + +if (-d "/etc/kernel/postinst.d/$version") { + system ("run-parts --report --exit-on-error --arg=$version " . + "--arg=$realimageloc$kimage-$version " . + "/etc/kernel/postinst.d/$version") && + die "Failed to process /etc/kernel/postinst.d/$version"; +} + +exit 0; + +__END__ diff -Nru linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.postrm linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.postrm --- linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.postrm 1970-01-01 00:00:00.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.postrm 2019-08-16 22:19:02.000000000 +0000 @@ -0,0 +1,276 @@ +#! /usr/bin/perl +# +use strict; +use warnings; +use Cwd 'abs_path'; + +# Debconf may not be around here. +my $have_debconf = 0; +my $capb; + +eval { require Debconf::Client::ConfModule; }; +if ( !$@ ) { + $have_debconf++; + import Debconf::Client::ConfModule ':all'; + version('2.0'); + $capb = capb("backup"); +} + +$| = 1; + +# Predefined values: +my $version = "5.2.0-9.1-liquorix-amd64"; +my $link_in_boot = ""; +my $kimage = "vmlinuz"; +my $postrm_hook = ''; #Normally we do not +my $package_name = "linux-image-$version"; + +#known variables +my $image_dest = "/"; +my $realimageloc = "/boot/"; +my $CONF_LOC = '/etc/kernel-img.conf'; + +chdir('/') or die "could not chdir to /:$!\n"; + +if ( -r "$CONF_LOC" && -f "$CONF_LOC" ) { + if ( open( my $conf, '+<', "$CONF_LOC" ) ) { + while (<$conf>) { + chomp; + s/\#.*$//g; + next if /^\s*$/; + + $link_in_boot = "" if /link_in_boot\s*=\s*(no|false|0)\s*$/i; + + $link_in_boot = "Yes" if /link_in_boot\s*=\s*(yes|true|1)\s*$/i; + + $image_dest = "$1" if /image_dest\s*=\s*(\S+)/i; + $postrm_hook = "$1" if /postrm_hook\s*=\s*(\S+)/i; + } + close $conf; + } +} + +if ($link_in_boot) { + $image_dest = $realimageloc; +} + +$image_dest = "$image_dest/"; +$image_dest =~ s|/+$|/|o; + +# The destdir may be gone by now. +if ( -d "$image_dest" ) { + chdir("$image_dest") or die "could not chdir to $image_dest:$!\n"; +} + +###################################################################### +###################################################################### +############ +###################################################################### +###################################################################### +sub remove_sym_link { + my $bad_image = $_[0]; + + warn "Removing symbolic link $bad_image \n"; + warn "You may need to re-run your boot loader\n"; + + # Remove the dangling link + unlink "$bad_image"; +} + +###################################################################### +###################################################################### +############ +###################################################################### +###################################################################### +sub CanonicalizePath { + my $path = join '/', @_; + my @work = split '/', $path; + my @out; + my $is_absolute; + + if ( @work && $work[0] eq "" ) { $is_absolute = 1; shift @work; } + + while (@work) { + my $seg = shift @work; + if ( $seg eq "." || $seg eq "" ) { + } + elsif ( $seg eq ".." ) { + if ( @out && $out[-1] ne ".." ) { + pop @out; + } + else { + # Leading "..", or "../..", etc. + push @out, $seg; + } + } + else { + push @out, $seg; + } + } + + unshift @out, "" if $is_absolute; + return join( '/', @out ); +} + +###################################################################### +###################################################################### +############ +###################################################################### +###################################################################### +# This removes dangling symlinks. What do we do about hard links? Surely a +# something with the nane $image_dest . "$kimage" ought not to be left behind? +sub image_magic { + my $kimage = $_[0]; + my $image_dest = $_[1]; + + if ( -l "$kimage" ) { + + # There is a symbolic link + my $force_move = 0; + my $vmlinuz_target = readlink "$kimage"; + my $real_target = ''; + $real_target = abs_path($vmlinuz_target) if defined($vmlinuz_target); + if ( !defined($vmlinuz_target) || !-f "$real_target" ) { + + # what, a dangling symlink? + warn "The link " . $image_dest . "$kimage is a damaged link\n"; + + # Remove the dangling link + &remove_sym_link("$kimage"); + } + else { + my $canonical_target = CanonicalizePath("$vmlinuz_target"); + if ( !-e $canonical_target ) { + warn "The link " . $image_dest . "$kimage is a dangling link\n"; + &remove_sym_link("$kimage"); + } + } + } +} + +# set the env var stem +$ENV{'STEM'} = "linux"; + +sub exec_script { + my $type = shift; + my $script = shift; + print STDERR "Running $type hook script $script.\n"; + system("$script $version $realimageloc$kimage-$version") + && print STDERR "User $type hook script [$script] "; + if ($?) { + if ( $? == -1 ) { + print STDERR "failed to execute: $!\n"; + } + elsif ( $? & 127 ) { + printf STDERR "died with signal %d, %s coredump\n", + ( $? & 127 ), ( $? & 128 ) ? 'with' : 'without'; + } + else { + printf STDERR "exited with value %d\n", $? >> 8; + } + } +} + +sub run_hook { + my $type = shift; + my $script = shift; + if ( $script =~ m,^/, ) { + + # Full path provided for the hook script + if ( -x "$script" ) { + &exec_script( $type, $script ); + } + else { + warn "The provided $type hook script [$script] could not be run.\n"; + } + } + else { + # Look for it in a safe path + for my $path ( '/bin', '/sbin', '/usr/bin', '/usr/sbin' ) { + if ( -x "$path/$script" ) { + &exec_script( $type, "$path/$script" ); + return 0; + } + } + + # No luck + print STDERR "Could not find $type hook script [$script].\n"; + warn "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n"; + } +} + +my $options; +for (@ARGV) { + s,','\\'',g; + $options .= " '$_'"; +} +$ENV{'DEB_MAINT_PARAMS'} = "$options"; + +## Run user hook script here, if any +if ($postrm_hook) { + &run_hook( "postrm", $postrm_hook ); +} +if ( -d "/etc/kernel/postrm.d" ) { + system( "run-parts --report --exit-on-error --arg=$version " + . "--arg=$realimageloc$kimage-$version " + . "/etc/kernel/postrm.d" ) + && die "Failed to process /etc/kernel/postrm.d"; +} +if ( -d "/etc/kernel/postrm.d/$version" ) { + system( "run-parts --report --exit-on-error --arg=$version " + . "--arg=$realimageloc$kimage-$version " + . "/etc/kernel/postrm.d/$version" ) + && die "Failed to process /etc/kernel/postrm.d/$version"; +} + +# purge initramfs and related +if ( $ARGV[0] !~ /upgrade/ ) { + if ( -f $realimageloc . "initrd.img-$version" ) { + unlink $realimageloc . "initrd.img-$version"; + } + if ( -f $realimageloc . "initrd.img-$version.old-dkms" ) { + unlink $realimageloc . "initrd.img-$version.old-dkms"; + } + if ( -f $realimageloc . "initrd.img-$version.bak" ) { + unlink $realimageloc . "initrd.img-$version.bak"; + } + if ( -f "/var/lib/initramfs-tools/$version" ) { + unlink "/var/lib/initramfs-tools/$version"; + } + + # check and remove damaged and dangling symlinks + image_magic( $kimage, $image_dest ); + image_magic( $kimage . ".old", $image_dest ); + image_magic( "initrd.img", $image_dest ); + image_magic( "initrd.img.old", $image_dest ); +} + +# Ignore all invocations except when called on to purge. +exit 0 unless $ARGV[0] =~ /purge/; + +my $ret = purge(); + +my @files_to_remove = qw{ + modules.dep modules.isapnpmap modules.pcimap + modules.usbmap modules.parportmap + modules.generic_string modules.ieee1394map + modules.ieee1394map modules.pnpbiosmap + modules.alias modules.ccwmap modules.inputmap + modules.symbols modules.ofmap + modules.seriomap modules.*.bin + modules.softdep modules.devname +}; + +foreach my $extra_file (@files_to_remove) { + for ( glob("/lib/modules/$version/$extra_file") ) { + unlink; + } +} + +if ( -d "/lib/modules/$version" ) { + system( "rm", "-r", "-f", "/lib/modules/$version" ); +} + +exit 0; + +__END__ diff -Nru linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.preinst linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.preinst --- linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.preinst 1970-01-01 00:00:00.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.preinst 2019-08-16 22:19:02.000000000 +0000 @@ -0,0 +1,119 @@ +#! /usr/bin/perl +# +use strict; +use warnings; + +use Debconf::Client::ConfModule qw(:all); +version('2.0'); +my $capb=capb("backup"); + +$|=1; + +# Predefined values: +my $version = "5.2.0-9.1-liquorix-amd64"; +my $kimage = "vmlinuz"; +my $preinst_hook = ''; #Normally we do not +my $package_name = "linux-image-$version"; + +#known variables +my $realimageloc = "/boot/"; +my $CONF_LOC = '/etc/kernel-img.conf'; + +my $modules_base = '/lib/modules'; + +die "Pre inst Internal error. Aborting." unless $version; + +exit 0 if $ARGV[0] =~ /abort-upgrade/; +exit 1 unless $ARGV[0] =~ /(install|upgrade)/; + +if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { + if (open(CONF, "$CONF_LOC")) { + while () { + chomp; + s/\#.*$//g; + next if /^\s*$/; + + $preinst_hook = "$1" if /preinst_hook\s*=\s*(\S+)/i; + } + close CONF; + } +} + + +# set the env var stem +$ENV{'STEM'} = "linux"; + +sub exec_script { + my $type = shift; + my $script = shift; + print STDERR "Running $type hook script $script.\n"; + system ("$script $version $realimageloc$kimage-$version") && + print STDERR "User $type hook script [$script] "; + if ($?) { + if ($? == -1) { + print STDERR "failed to execute: $!\n"; + } + elsif ($? & 127) { + printf STDERR "died with signal %d, %s coredump\n", + ($? & 127), ($? & 128) ? 'with' : 'without'; + } + else { + printf STDERR "exited with value %d\n", $? >> 8; + } + exit $? >> 8; + } +} +sub run_hook { + my $type = shift; + my $script = shift; + if ($script =~ m,^/,) { + # Full path provided for the hook script + if (-x "$script") { + &exec_script($type,$script); + } + else { + die "The provided $type hook script [$script] could not be run.\n"; + } + } + else { + # Look for it in a safe path + for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') { + if (-x "$path/$script") { + &exec_script($type, "$path/$script"); + return 0; + } + } + # No luck + print STDERR "Could not find $type hook script [$script].\n"; + die "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n"; + } +} + + +my $options; +for (@ARGV) { + s,','\\'',g; + $options .= " '$_'"; +} +$ENV{'DEB_MAINT_PARAMS'}="$options"; + +## Run user hook script here, if any +if (-x "$preinst_hook") { + &run_hook("preinst", $preinst_hook); +} +if (-d "/etc/kernel/preinst.d") { + system ("run-parts --report --exit-on-error --arg=$version" . + " --arg=$realimageloc$kimage-$version" . + " /etc/kernel/preinst.d") && + die "Failed to process /etc/kernel/preinst.d"; +} +if (-d "/etc/kernel/preinst.d/$version") { + system ("run-parts --report --exit-on-error --arg=$version" . + " --arg=$realimageloc$kimage-$version" . + " /etc/kernel/preinst.d/$version") && + die "Failed to process /etc/kernel/preinst.d/$version"; +} + +exit 0; + +__END__ diff -Nru linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.prerm linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.prerm --- linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.prerm 1970-01-01 00:00:00.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.prerm 2019-08-16 22:19:02.000000000 +0000 @@ -0,0 +1,158 @@ +#! /usr/bin/perl +# +use strict; +use warnings; +use Debconf::Client::ConfModule qw(:all); +version('2.0'); +my $capb=capb("backup"); + +$|=1; +# Predefined values: +my $version = "5.2.0-9.1-liquorix-amd64"; +my $kimage = "vmlinuz"; +my $prerm_hook = ''; #Normally we do not +my $package_name = "linux-image-$version"; + +#known variables +my $realimageloc = "/boot/"; +my $CONF_LOC = '/etc/kernel-img.conf'; + +# Variables used +my $image=''; +my $ret=0; +my $seen=''; +my $answer=''; +my $running = ''; +my $WouldInvalidate = 0; + +# Ignore all invocations uxcept when called on to remove +exit 0 unless ($ARGV[0] && $ARGV[0] =~ /remove/) ; + +if (-r "$CONF_LOC" && -f "$CONF_LOC" ) { + if (open(CONF, "$CONF_LOC")) { + while () { + chomp; + s/\#.*$//g; + next if /^\s*$/; + + $prerm_hook = "$1" if /prerm_hook\s*=\s*(\S+)/i; + } + close CONF; + } +} + + +#check to see if we are trying to remove a running kernel +# if so we abort right now. +chop($running=`uname -r`); +if ($running eq $version) { + my $question = "${package_name}/prerm/removing-running-kernel-$version"; + + ($ret,$seen) = fset ("$question", 'seen', 'false'); + die "Error setting debconf flags in $question: $seen" if $ret; + + $ret = subst("$question", 'running', "$running"); + die "Error setting debconf substitutions in $question: $seen" if $ret; + + ($ret,$seen) = input('critical', "$question"); + if ($ret && $ret != 30 ) { + die "Error setting debconf question $question: $seen"; + } + + ($ret,$seen) = go (); + if ($ret && $ret != 30 ) { + die "Error asking debconf question $question: $seen"; + } + + ($ret,$answer) = get("$question"); + die "Error retreiving answer for $question: $answer" if $ret; + + if ($answer =~ /^(y|t)/i) { + print STDERR "Aborting removal of running kernel image.\n"; + exit 1; #Operation not permitted + } + else { + print STDERR "Ok, proceeding with removing running kernel image.\n"; + } +} + +#Now, they have an alternate kernel which they are currently running + +chdir("/") or die "could not chdir to /:$!\n"; + + +# set the env var stem +$ENV{'STEM'} = "linux"; + +sub exec_script { + my $type = shift; + my $script = shift; + print STDERR "Running $type hook script $script.\n"; + system ("$script $version $realimageloc$kimage-$version") && + print STDERR "User $type hook script [$script] "; + if ($?) { + if ($? == -1) { + print STDERR "failed to execute: $!\n"; + } + elsif ($? & 127) { + printf STDERR "died with signal %d, %s coredump\n", + ($? & 127), ($? & 128) ? 'with' : 'without'; + } + else { + printf STDERR "exited with value %d\n", $? >> 8; + } + exit $? >> 8; + } +} +sub run_hook { + my $type = shift; + my $script = shift; + if ($script =~ m,^/,) { + # Full path provided for the hook script + if (-x "$script") { + &exec_script($type,$script); + } + else { + die "The provided $type hook script [$script] could not be run.\n"; + } + } + else { + # Look for it in a safe path + for my $path ('/bin', '/sbin', '/usr/bin', '/usr/sbin') { + if (-x "$path/$script") { + &exec_script($type, "$path/$script"); + return 0; + } + } + # No luck + print STDERR "Could not find $type hook script [$script].\n"; + die "Looked in: '/bin', '/sbin', '/usr/bin', '/usr/sbin'\n"; + } +} + + +my $options; +for (@ARGV) { + s,','\\'',g; + $options .= " '$_'"; +} +$ENV{'DEB_MAINT_PARAMS'}="$options"; + +## Run user hook script here, if any +if (-x "$prerm_hook") { + &run_hook("prerm", $prerm_hook); +} +if (-d "/etc/kernel/prerm.d") { + system ("run-parts --report --exit-on-error --arg=$version " . + "--arg=$realimageloc$kimage-$version /etc/kernel/prerm.d") && + die "Failed to process /etc/kernel/prerm.d"; +} +if (-d "/etc/kernel/prerm.d/$version") { + system ("run-parts --report --exit-on-error --arg=$version" . + " --arg=$realimageloc$kimage-$version " . + "/etc/kernel/prerm.d/$version") && + die "Failed to process /etc/kernel/prerm.d/$version"; +} + +exit 0; +__END__ diff -Nru linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.templates linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.templates --- linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.templates 1970-01-01 00:00:00.000000000 +0000 +++ linux-liquorix-5.2/debian/linux-image-5.2.0-9.1-liquorix-amd64.templates 2019-08-16 22:19:02.000000000 +0000 @@ -0,0 +1,53 @@ +# These templates have mostly been reviewed by the debian-l10n-english +# team +# +# If modifications/additions/rewording are needed, please ask +# debian-l10n-english@lists.debian.org for advice. +# +# Even minor modifications require translation updates and such +# changes should be coordinated with translators and reviewers. + +Template: linux-image-5.2.0-9.1-liquorix-amd64/postinst/depmod-error-initrd-5.2.0-9.1-liquorix-amd64 +Type: boolean +Default: false +_Description: Abort installation after depmod error? + The 'depmod' command exited with the exit code ${exit_value} + (${SIGNAL}${CORE}). + . + Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/modules.dep file + will not be deleted, even though it may be invalid. + . + You should abort the installation and fix the + errors in depmod, or regenerate the initrd image with a known good + modules.dep file. If you don't abort the installation, there is + a danger that the system will fail to boot. + +Template: linux-image-5.2.0-9.1-liquorix-amd64/prerm/removing-running-kernel-5.2.0-9.1-liquorix-amd64 +Type: boolean +Default: true +_Description: Abort kernel removal? + You are running a kernel (version ${running}) and attempting to remove + the same version. + . + This can make the system unbootable as it will remove + /boot/vmlinuz-${running} and all modules under the directory + /lib/modules/${running}. This can only be fixed with a copy of the + kernel image and the corresponding modules. + . + It is highly recommended to abort the kernel removal unless you are + prepared to fix the system after removal. + +Template: linux-image-5.2.0-9.1-liquorix-amd64/postinst/mips-initrd-5.2.0-9.1-liquorix-amd64 +Type: note +_Description: Boot loader configuration must be updated to load initramfs + This kernel package will build an "initramfs" file + (/boot/initrd.img-5.2.0-9.1-liquorix-amd64) for the system's boot loader + to use in addition to the kernel itself. This method, formerly + unsupported on MIPS, enables a more flexible boot process, and future + kernel versions may require a corresponding initrd.img to boot. + . + The currently running kernel was booted without an initramfs. You + should reconfigure the boot loader to load the initramfs for Linux + version 5.2.0-9.1, and for each later version. This is probably + most easily accomplished by using the initrd.img symbolic link + maintained by the kernel package. diff -Nru linux-liquorix-5.2/debian/patches/series linux-liquorix-5.2/debian/patches/series --- linux-liquorix-5.2/debian/patches/series 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/patches/series 2019-08-16 22:19:02.000000000 +0000 @@ -1,5 +1,5 @@ # zen patches -zen/v5.2.8-lqx2.patch +zen/v5.2.9-lqx1.patch # debian specific patches. debian/version.patch diff -Nru linux-liquorix-5.2/debian/patches/zen/v5.2.8-lqx2.patch linux-liquorix-5.2/debian/patches/zen/v5.2.8-lqx2.patch --- linux-liquorix-5.2/debian/patches/zen/v5.2.8-lqx2.patch 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/patches/zen/v5.2.8-lqx2.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,118835 +0,0 @@ -diff --git a/Documentation/admin-guide/hw-vuln/index.rst b/Documentation/admin-guide/hw-vuln/index.rst -index ffc064c1ec68..49311f3da6f2 100644 ---- a/Documentation/admin-guide/hw-vuln/index.rst -+++ b/Documentation/admin-guide/hw-vuln/index.rst -@@ -9,5 +9,6 @@ are configurable at compile, boot or run time. - .. toctree:: - :maxdepth: 1 - -+ spectre - l1tf - mds -diff --git a/Documentation/admin-guide/hw-vuln/spectre.rst b/Documentation/admin-guide/hw-vuln/spectre.rst -new file mode 100644 -index 000000000000..e05e581af5cf ---- /dev/null -+++ b/Documentation/admin-guide/hw-vuln/spectre.rst -@@ -0,0 +1,769 @@ -+.. SPDX-License-Identifier: GPL-2.0 -+ -+Spectre Side Channels -+===================== -+ -+Spectre is a class of side channel attacks that exploit branch prediction -+and speculative execution on modern CPUs to read memory, possibly -+bypassing access controls. Speculative execution side channel exploits -+do not modify memory but attempt to infer privileged data in the memory. -+ -+This document covers Spectre variant 1 and Spectre variant 2. -+ -+Affected processors -+------------------- -+ -+Speculative execution side channel methods affect a wide range of modern -+high performance processors, since most modern high speed processors -+use branch prediction and speculative execution. -+ -+The following CPUs are vulnerable: -+ -+ - Intel Core, Atom, Pentium, and Xeon processors -+ -+ - AMD Phenom, EPYC, and Zen processors -+ -+ - IBM POWER and zSeries processors -+ -+ - Higher end ARM processors -+ -+ - Apple CPUs -+ -+ - Higher end MIPS CPUs -+ -+ - Likely most other high performance CPUs. Contact your CPU vendor for details. -+ -+Whether a processor is affected or not can be read out from the Spectre -+vulnerability files in sysfs. See :ref:`spectre_sys_info`. -+ -+Related CVEs -+------------ -+ -+The following CVE entries describe Spectre variants: -+ -+ ============= ======================= ========================== -+ CVE-2017-5753 Bounds check bypass Spectre variant 1 -+ CVE-2017-5715 Branch target injection Spectre variant 2 -+ CVE-2019-1125 Spectre v1 swapgs Spectre variant 1 (swapgs) -+ ============= ======================= ========================== -+ -+Problem -+------- -+ -+CPUs use speculative operations to improve performance. That may leave -+traces of memory accesses or computations in the processor's caches, -+buffers, and branch predictors. Malicious software may be able to -+influence the speculative execution paths, and then use the side effects -+of the speculative execution in the CPUs' caches and buffers to infer -+privileged data touched during the speculative execution. -+ -+Spectre variant 1 attacks take advantage of speculative execution of -+conditional branches, while Spectre variant 2 attacks use speculative -+execution of indirect branches to leak privileged memory. -+See :ref:`[1] ` :ref:`[5] ` :ref:`[7] ` -+:ref:`[10] ` :ref:`[11] `. -+ -+Spectre variant 1 (Bounds Check Bypass) -+--------------------------------------- -+ -+The bounds check bypass attack :ref:`[2] ` takes advantage -+of speculative execution that bypasses conditional branch instructions -+used for memory access bounds check (e.g. checking if the index of an -+array results in memory access within a valid range). This results in -+memory accesses to invalid memory (with out-of-bound index) that are -+done speculatively before validation checks resolve. Such speculative -+memory accesses can leave side effects, creating side channels which -+leak information to the attacker. -+ -+There are some extensions of Spectre variant 1 attacks for reading data -+over the network, see :ref:`[12] `. However such attacks -+are difficult, low bandwidth, fragile, and are considered low risk. -+ -+Note that, despite "Bounds Check Bypass" name, Spectre variant 1 is not -+only about user-controlled array bounds checks. It can affect any -+conditional checks. The kernel entry code interrupt, exception, and NMI -+handlers all have conditional swapgs checks. Those may be problematic -+in the context of Spectre v1, as kernel code can speculatively run with -+a user GS. -+ -+Spectre variant 2 (Branch Target Injection) -+------------------------------------------- -+ -+The branch target injection attack takes advantage of speculative -+execution of indirect branches :ref:`[3] `. The indirect -+branch predictors inside the processor used to guess the target of -+indirect branches can be influenced by an attacker, causing gadget code -+to be speculatively executed, thus exposing sensitive data touched by -+the victim. The side effects left in the CPU's caches during speculative -+execution can be measured to infer data values. -+ -+.. _poison_btb: -+ -+In Spectre variant 2 attacks, the attacker can steer speculative indirect -+branches in the victim to gadget code by poisoning the branch target -+buffer of a CPU used for predicting indirect branch addresses. Such -+poisoning could be done by indirect branching into existing code, -+with the address offset of the indirect branch under the attacker's -+control. Since the branch prediction on impacted hardware does not -+fully disambiguate branch address and uses the offset for prediction, -+this could cause privileged code's indirect branch to jump to a gadget -+code with the same offset. -+ -+The most useful gadgets take an attacker-controlled input parameter (such -+as a register value) so that the memory read can be controlled. Gadgets -+without input parameters might be possible, but the attacker would have -+very little control over what memory can be read, reducing the risk of -+the attack revealing useful data. -+ -+One other variant 2 attack vector is for the attacker to poison the -+return stack buffer (RSB) :ref:`[13] ` to cause speculative -+subroutine return instruction execution to go to a gadget. An attacker's -+imbalanced subroutine call instructions might "poison" entries in the -+return stack buffer which are later consumed by a victim's subroutine -+return instructions. This attack can be mitigated by flushing the return -+stack buffer on context switch, or virtual machine (VM) exit. -+ -+On systems with simultaneous multi-threading (SMT), attacks are possible -+from the sibling thread, as level 1 cache and branch target buffer -+(BTB) may be shared between hardware threads in a CPU core. A malicious -+program running on the sibling thread may influence its peer's BTB to -+steer its indirect branch speculations to gadget code, and measure the -+speculative execution's side effects left in level 1 cache to infer the -+victim's data. -+ -+Attack scenarios -+---------------- -+ -+The following list of attack scenarios have been anticipated, but may -+not cover all possible attack vectors. -+ -+1. A user process attacking the kernel -+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ -+Spectre variant 1 -+~~~~~~~~~~~~~~~~~ -+ -+ The attacker passes a parameter to the kernel via a register or -+ via a known address in memory during a syscall. Such parameter may -+ be used later by the kernel as an index to an array or to derive -+ a pointer for a Spectre variant 1 attack. The index or pointer -+ is invalid, but bound checks are bypassed in the code branch taken -+ for speculative execution. This could cause privileged memory to be -+ accessed and leaked. -+ -+ For kernel code that has been identified where data pointers could -+ potentially be influenced for Spectre attacks, new "nospec" accessor -+ macros are used to prevent speculative loading of data. -+ -+Spectre variant 1 (swapgs) -+~~~~~~~~~~~~~~~~~~~~~~~~~~ -+ -+ An attacker can train the branch predictor to speculatively skip the -+ swapgs path for an interrupt or exception. If they initialize -+ the GS register to a user-space value, if the swapgs is speculatively -+ skipped, subsequent GS-related percpu accesses in the speculation -+ window will be done with the attacker-controlled GS value. This -+ could cause privileged memory to be accessed and leaked. -+ -+ For example: -+ -+ :: -+ -+ if (coming from user space) -+ swapgs -+ mov %gs:, %reg -+ mov (%reg), %reg1 -+ -+ When coming from user space, the CPU can speculatively skip the -+ swapgs, and then do a speculative percpu load using the user GS -+ value. So the user can speculatively force a read of any kernel -+ value. If a gadget exists which uses the percpu value as an address -+ in another load/store, then the contents of the kernel value may -+ become visible via an L1 side channel attack. -+ -+ A similar attack exists when coming from kernel space. The CPU can -+ speculatively do the swapgs, causing the user GS to get used for the -+ rest of the speculative window. -+ -+Spectre variant 2 -+~~~~~~~~~~~~~~~~~ -+ -+ A spectre variant 2 attacker can :ref:`poison ` the branch -+ target buffer (BTB) before issuing syscall to launch an attack. -+ After entering the kernel, the kernel could use the poisoned branch -+ target buffer on indirect jump and jump to gadget code in speculative -+ execution. -+ -+ If an attacker tries to control the memory addresses leaked during -+ speculative execution, he would also need to pass a parameter to the -+ gadget, either through a register or a known address in memory. After -+ the gadget has executed, he can measure the side effect. -+ -+ The kernel can protect itself against consuming poisoned branch -+ target buffer entries by using return trampolines (also known as -+ "retpoline") :ref:`[3] ` :ref:`[9] ` for all -+ indirect branches. Return trampolines trap speculative execution paths -+ to prevent jumping to gadget code during speculative execution. -+ x86 CPUs with Enhanced Indirect Branch Restricted Speculation -+ (Enhanced IBRS) available in hardware should use the feature to -+ mitigate Spectre variant 2 instead of retpoline. Enhanced IBRS is -+ more efficient than retpoline. -+ -+ There may be gadget code in firmware which could be exploited with -+ Spectre variant 2 attack by a rogue user process. To mitigate such -+ attacks on x86, Indirect Branch Restricted Speculation (IBRS) feature -+ is turned on before the kernel invokes any firmware code. -+ -+2. A user process attacking another user process -+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ -+ A malicious user process can try to attack another user process, -+ either via a context switch on the same hardware thread, or from the -+ sibling hyperthread sharing a physical processor core on simultaneous -+ multi-threading (SMT) system. -+ -+ Spectre variant 1 attacks generally require passing parameters -+ between the processes, which needs a data passing relationship, such -+ as remote procedure calls (RPC). Those parameters are used in gadget -+ code to derive invalid data pointers accessing privileged memory in -+ the attacked process. -+ -+ Spectre variant 2 attacks can be launched from a rogue process by -+ :ref:`poisoning ` the branch target buffer. This can -+ influence the indirect branch targets for a victim process that either -+ runs later on the same hardware thread, or running concurrently on -+ a sibling hardware thread sharing the same physical core. -+ -+ A user process can protect itself against Spectre variant 2 attacks -+ by using the prctl() syscall to disable indirect branch speculation -+ for itself. An administrator can also cordon off an unsafe process -+ from polluting the branch target buffer by disabling the process's -+ indirect branch speculation. This comes with a performance cost -+ from not using indirect branch speculation and clearing the branch -+ target buffer. When SMT is enabled on x86, for a process that has -+ indirect branch speculation disabled, Single Threaded Indirect Branch -+ Predictors (STIBP) :ref:`[4] ` are turned on to prevent the -+ sibling thread from controlling branch target buffer. In addition, -+ the Indirect Branch Prediction Barrier (IBPB) is issued to clear the -+ branch target buffer when context switching to and from such process. -+ -+ On x86, the return stack buffer is stuffed on context switch. -+ This prevents the branch target buffer from being used for branch -+ prediction when the return stack buffer underflows while switching to -+ a deeper call stack. Any poisoned entries in the return stack buffer -+ left by the previous process will also be cleared. -+ -+ User programs should use address space randomization to make attacks -+ more difficult (Set /proc/sys/kernel/randomize_va_space = 1 or 2). -+ -+3. A virtualized guest attacking the host -+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ -+ The attack mechanism is similar to how user processes attack the -+ kernel. The kernel is entered via hyper-calls or other virtualization -+ exit paths. -+ -+ For Spectre variant 1 attacks, rogue guests can pass parameters -+ (e.g. in registers) via hyper-calls to derive invalid pointers to -+ speculate into privileged memory after entering the kernel. For places -+ where such kernel code has been identified, nospec accessor macros -+ are used to stop speculative memory access. -+ -+ For Spectre variant 2 attacks, rogue guests can :ref:`poison -+ ` the branch target buffer or return stack buffer, causing -+ the kernel to jump to gadget code in the speculative execution paths. -+ -+ To mitigate variant 2, the host kernel can use return trampolines -+ for indirect branches to bypass the poisoned branch target buffer, -+ and flushing the return stack buffer on VM exit. This prevents rogue -+ guests from affecting indirect branching in the host kernel. -+ -+ To protect host processes from rogue guests, host processes can have -+ indirect branch speculation disabled via prctl(). The branch target -+ buffer is cleared before context switching to such processes. -+ -+4. A virtualized guest attacking other guest -+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ -+ A rogue guest may attack another guest to get data accessible by the -+ other guest. -+ -+ Spectre variant 1 attacks are possible if parameters can be passed -+ between guests. This may be done via mechanisms such as shared memory -+ or message passing. Such parameters could be used to derive data -+ pointers to privileged data in guest. The privileged data could be -+ accessed by gadget code in the victim's speculation paths. -+ -+ Spectre variant 2 attacks can be launched from a rogue guest by -+ :ref:`poisoning ` the branch target buffer or the return -+ stack buffer. Such poisoned entries could be used to influence -+ speculation execution paths in the victim guest. -+ -+ Linux kernel mitigates attacks to other guests running in the same -+ CPU hardware thread by flushing the return stack buffer on VM exit, -+ and clearing the branch target buffer before switching to a new guest. -+ -+ If SMT is used, Spectre variant 2 attacks from an untrusted guest -+ in the sibling hyperthread can be mitigated by the administrator, -+ by turning off the unsafe guest's indirect branch speculation via -+ prctl(). A guest can also protect itself by turning on microcode -+ based mitigations (such as IBPB or STIBP on x86) within the guest. -+ -+.. _spectre_sys_info: -+ -+Spectre system information -+-------------------------- -+ -+The Linux kernel provides a sysfs interface to enumerate the current -+mitigation status of the system for Spectre: whether the system is -+vulnerable, and which mitigations are active. -+ -+The sysfs file showing Spectre variant 1 mitigation status is: -+ -+ /sys/devices/system/cpu/vulnerabilities/spectre_v1 -+ -+The possible values in this file are: -+ -+ .. list-table:: -+ -+ * - 'Not affected' -+ - The processor is not vulnerable. -+ * - 'Vulnerable: __user pointer sanitization and usercopy barriers only; no swapgs barriers' -+ - The swapgs protections are disabled; otherwise it has -+ protection in the kernel on a case by case base with explicit -+ pointer sanitation and usercopy LFENCE barriers. -+ * - 'Mitigation: usercopy/swapgs barriers and __user pointer sanitization' -+ - Protection in the kernel on a case by case base with explicit -+ pointer sanitation, usercopy LFENCE barriers, and swapgs LFENCE -+ barriers. -+ -+However, the protections are put in place on a case by case basis, -+and there is no guarantee that all possible attack vectors for Spectre -+variant 1 are covered. -+ -+The spectre_v2 kernel file reports if the kernel has been compiled with -+retpoline mitigation or if the CPU has hardware mitigation, and if the -+CPU has support for additional process-specific mitigation. -+ -+This file also reports CPU features enabled by microcode to mitigate -+attack between user processes: -+ -+1. Indirect Branch Prediction Barrier (IBPB) to add additional -+ isolation between processes of different users. -+2. Single Thread Indirect Branch Predictors (STIBP) to add additional -+ isolation between CPU threads running on the same core. -+ -+These CPU features may impact performance when used and can be enabled -+per process on a case-by-case base. -+ -+The sysfs file showing Spectre variant 2 mitigation status is: -+ -+ /sys/devices/system/cpu/vulnerabilities/spectre_v2 -+ -+The possible values in this file are: -+ -+ - Kernel status: -+ -+ ==================================== ================================= -+ 'Not affected' The processor is not vulnerable -+ 'Vulnerable' Vulnerable, no mitigation -+ 'Mitigation: Full generic retpoline' Software-focused mitigation -+ 'Mitigation: Full AMD retpoline' AMD-specific software mitigation -+ 'Mitigation: Enhanced IBRS' Hardware-focused mitigation -+ ==================================== ================================= -+ -+ - Firmware status: Show if Indirect Branch Restricted Speculation (IBRS) is -+ used to protect against Spectre variant 2 attacks when calling firmware (x86 only). -+ -+ ========== ============================================================= -+ 'IBRS_FW' Protection against user program attacks when calling firmware -+ ========== ============================================================= -+ -+ - Indirect branch prediction barrier (IBPB) status for protection between -+ processes of different users. This feature can be controlled through -+ prctl() per process, or through kernel command line options. This is -+ an x86 only feature. For more details see below. -+ -+ =================== ======================================================== -+ 'IBPB: disabled' IBPB unused -+ 'IBPB: always-on' Use IBPB on all tasks -+ 'IBPB: conditional' Use IBPB on SECCOMP or indirect branch restricted tasks -+ =================== ======================================================== -+ -+ - Single threaded indirect branch prediction (STIBP) status for protection -+ between different hyper threads. This feature can be controlled through -+ prctl per process, or through kernel command line options. This is x86 -+ only feature. For more details see below. -+ -+ ==================== ======================================================== -+ 'STIBP: disabled' STIBP unused -+ 'STIBP: forced' Use STIBP on all tasks -+ 'STIBP: conditional' Use STIBP on SECCOMP or indirect branch restricted tasks -+ ==================== ======================================================== -+ -+ - Return stack buffer (RSB) protection status: -+ -+ ============= =========================================== -+ 'RSB filling' Protection of RSB on context switch enabled -+ ============= =========================================== -+ -+Full mitigation might require a microcode update from the CPU -+vendor. When the necessary microcode is not available, the kernel will -+report vulnerability. -+ -+Turning on mitigation for Spectre variant 1 and Spectre variant 2 -+----------------------------------------------------------------- -+ -+1. Kernel mitigation -+^^^^^^^^^^^^^^^^^^^^ -+ -+Spectre variant 1 -+~~~~~~~~~~~~~~~~~ -+ -+ For the Spectre variant 1, vulnerable kernel code (as determined -+ by code audit or scanning tools) is annotated on a case by case -+ basis to use nospec accessor macros for bounds clipping :ref:`[2] -+ ` to avoid any usable disclosure gadgets. However, it may -+ not cover all attack vectors for Spectre variant 1. -+ -+ Copy-from-user code has an LFENCE barrier to prevent the access_ok() -+ check from being mis-speculated. The barrier is done by the -+ barrier_nospec() macro. -+ -+ For the swapgs variant of Spectre variant 1, LFENCE barriers are -+ added to interrupt, exception and NMI entry where needed. These -+ barriers are done by the FENCE_SWAPGS_KERNEL_ENTRY and -+ FENCE_SWAPGS_USER_ENTRY macros. -+ -+Spectre variant 2 -+~~~~~~~~~~~~~~~~~ -+ -+ For Spectre variant 2 mitigation, the compiler turns indirect calls or -+ jumps in the kernel into equivalent return trampolines (retpolines) -+ :ref:`[3] ` :ref:`[9] ` to go to the target -+ addresses. Speculative execution paths under retpolines are trapped -+ in an infinite loop to prevent any speculative execution jumping to -+ a gadget. -+ -+ To turn on retpoline mitigation on a vulnerable CPU, the kernel -+ needs to be compiled with a gcc compiler that supports the -+ -mindirect-branch=thunk-extern -mindirect-branch-register options. -+ If the kernel is compiled with a Clang compiler, the compiler needs -+ to support -mretpoline-external-thunk option. The kernel config -+ CONFIG_RETPOLINE needs to be turned on, and the CPU needs to run with -+ the latest updated microcode. -+ -+ On Intel Skylake-era systems the mitigation covers most, but not all, -+ cases. See :ref:`[3] ` for more details. -+ -+ On CPUs with hardware mitigation for Spectre variant 2 (e.g. Enhanced -+ IBRS on x86), retpoline is automatically disabled at run time. -+ -+ The retpoline mitigation is turned on by default on vulnerable -+ CPUs. It can be forced on or off by the administrator -+ via the kernel command line and sysfs control files. See -+ :ref:`spectre_mitigation_control_command_line`. -+ -+ On x86, indirect branch restricted speculation is turned on by default -+ before invoking any firmware code to prevent Spectre variant 2 exploits -+ using the firmware. -+ -+ Using kernel address space randomization (CONFIG_RANDOMIZE_SLAB=y -+ and CONFIG_SLAB_FREELIST_RANDOM=y in the kernel configuration) makes -+ attacks on the kernel generally more difficult. -+ -+2. User program mitigation -+^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ -+ User programs can mitigate Spectre variant 1 using LFENCE or "bounds -+ clipping". For more details see :ref:`[2] `. -+ -+ For Spectre variant 2 mitigation, individual user programs -+ can be compiled with return trampolines for indirect branches. -+ This protects them from consuming poisoned entries in the branch -+ target buffer left by malicious software. Alternatively, the -+ programs can disable their indirect branch speculation via prctl() -+ (See :ref:`Documentation/userspace-api/spec_ctrl.rst `). -+ On x86, this will turn on STIBP to guard against attacks from the -+ sibling thread when the user program is running, and use IBPB to -+ flush the branch target buffer when switching to/from the program. -+ -+ Restricting indirect branch speculation on a user program will -+ also prevent the program from launching a variant 2 attack -+ on x86. All sand-boxed SECCOMP programs have indirect branch -+ speculation restricted by default. Administrators can change -+ that behavior via the kernel command line and sysfs control files. -+ See :ref:`spectre_mitigation_control_command_line`. -+ -+ Programs that disable their indirect branch speculation will have -+ more overhead and run slower. -+ -+ User programs should use address space randomization -+ (/proc/sys/kernel/randomize_va_space = 1 or 2) to make attacks more -+ difficult. -+ -+3. VM mitigation -+^^^^^^^^^^^^^^^^ -+ -+ Within the kernel, Spectre variant 1 attacks from rogue guests are -+ mitigated on a case by case basis in VM exit paths. Vulnerable code -+ uses nospec accessor macros for "bounds clipping", to avoid any -+ usable disclosure gadgets. However, this may not cover all variant -+ 1 attack vectors. -+ -+ For Spectre variant 2 attacks from rogue guests to the kernel, the -+ Linux kernel uses retpoline or Enhanced IBRS to prevent consumption of -+ poisoned entries in branch target buffer left by rogue guests. It also -+ flushes the return stack buffer on every VM exit to prevent a return -+ stack buffer underflow so poisoned branch target buffer could be used, -+ or attacker guests leaving poisoned entries in the return stack buffer. -+ -+ To mitigate guest-to-guest attacks in the same CPU hardware thread, -+ the branch target buffer is sanitized by flushing before switching -+ to a new guest on a CPU. -+ -+ The above mitigations are turned on by default on vulnerable CPUs. -+ -+ To mitigate guest-to-guest attacks from sibling thread when SMT is -+ in use, an untrusted guest running in the sibling thread can have -+ its indirect branch speculation disabled by administrator via prctl(). -+ -+ The kernel also allows guests to use any microcode based mitigation -+ they choose to use (such as IBPB or STIBP on x86) to protect themselves. -+ -+.. _spectre_mitigation_control_command_line: -+ -+Mitigation control on the kernel command line -+--------------------------------------------- -+ -+Spectre variant 2 mitigation can be disabled or force enabled at the -+kernel command line. -+ -+ nospectre_v1 -+ -+ [X86,PPC] Disable mitigations for Spectre Variant 1 -+ (bounds check bypass). With this option data leaks are -+ possible in the system. -+ -+ nospectre_v2 -+ -+ [X86] Disable all mitigations for the Spectre variant 2 -+ (indirect branch prediction) vulnerability. System may -+ allow data leaks with this option, which is equivalent -+ to spectre_v2=off. -+ -+ -+ spectre_v2= -+ -+ [X86] Control mitigation of Spectre variant 2 -+ (indirect branch speculation) vulnerability. -+ The default operation protects the kernel from -+ user space attacks. -+ -+ on -+ unconditionally enable, implies -+ spectre_v2_user=on -+ off -+ unconditionally disable, implies -+ spectre_v2_user=off -+ auto -+ kernel detects whether your CPU model is -+ vulnerable -+ -+ Selecting 'on' will, and 'auto' may, choose a -+ mitigation method at run time according to the -+ CPU, the available microcode, the setting of the -+ CONFIG_RETPOLINE configuration option, and the -+ compiler with which the kernel was built. -+ -+ Selecting 'on' will also enable the mitigation -+ against user space to user space task attacks. -+ -+ Selecting 'off' will disable both the kernel and -+ the user space protections. -+ -+ Specific mitigations can also be selected manually: -+ -+ retpoline -+ replace indirect branches -+ retpoline,generic -+ google's original retpoline -+ retpoline,amd -+ AMD-specific minimal thunk -+ -+ Not specifying this option is equivalent to -+ spectre_v2=auto. -+ -+For user space mitigation: -+ -+ spectre_v2_user= -+ -+ [X86] Control mitigation of Spectre variant 2 -+ (indirect branch speculation) vulnerability between -+ user space tasks -+ -+ on -+ Unconditionally enable mitigations. Is -+ enforced by spectre_v2=on -+ -+ off -+ Unconditionally disable mitigations. Is -+ enforced by spectre_v2=off -+ -+ prctl -+ Indirect branch speculation is enabled, -+ but mitigation can be enabled via prctl -+ per thread. The mitigation control state -+ is inherited on fork. -+ -+ prctl,ibpb -+ Like "prctl" above, but only STIBP is -+ controlled per thread. IBPB is issued -+ always when switching between different user -+ space processes. -+ -+ seccomp -+ Same as "prctl" above, but all seccomp -+ threads will enable the mitigation unless -+ they explicitly opt out. -+ -+ seccomp,ibpb -+ Like "seccomp" above, but only STIBP is -+ controlled per thread. IBPB is issued -+ always when switching between different -+ user space processes. -+ -+ auto -+ Kernel selects the mitigation depending on -+ the available CPU features and vulnerability. -+ -+ Default mitigation: -+ If CONFIG_SECCOMP=y then "seccomp", otherwise "prctl" -+ -+ Not specifying this option is equivalent to -+ spectre_v2_user=auto. -+ -+ In general the kernel by default selects -+ reasonable mitigations for the current CPU. To -+ disable Spectre variant 2 mitigations, boot with -+ spectre_v2=off. Spectre variant 1 mitigations -+ cannot be disabled. -+ -+Mitigation selection guide -+-------------------------- -+ -+1. Trusted userspace -+^^^^^^^^^^^^^^^^^^^^ -+ -+ If all userspace applications are from trusted sources and do not -+ execute externally supplied untrusted code, then the mitigations can -+ be disabled. -+ -+2. Protect sensitive programs -+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ -+ For security-sensitive programs that have secrets (e.g. crypto -+ keys), protection against Spectre variant 2 can be put in place by -+ disabling indirect branch speculation when the program is running -+ (See :ref:`Documentation/userspace-api/spec_ctrl.rst `). -+ -+3. Sandbox untrusted programs -+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ -+ Untrusted programs that could be a source of attacks can be cordoned -+ off by disabling their indirect branch speculation when they are run -+ (See :ref:`Documentation/userspace-api/spec_ctrl.rst `). -+ This prevents untrusted programs from polluting the branch target -+ buffer. All programs running in SECCOMP sandboxes have indirect -+ branch speculation restricted by default. This behavior can be -+ changed via the kernel command line and sysfs control files. See -+ :ref:`spectre_mitigation_control_command_line`. -+ -+3. High security mode -+^^^^^^^^^^^^^^^^^^^^^ -+ -+ All Spectre variant 2 mitigations can be forced on -+ at boot time for all programs (See the "on" option in -+ :ref:`spectre_mitigation_control_command_line`). This will add -+ overhead as indirect branch speculations for all programs will be -+ restricted. -+ -+ On x86, branch target buffer will be flushed with IBPB when switching -+ to a new program. STIBP is left on all the time to protect programs -+ against variant 2 attacks originating from programs running on -+ sibling threads. -+ -+ Alternatively, STIBP can be used only when running programs -+ whose indirect branch speculation is explicitly disabled, -+ while IBPB is still used all the time when switching to a new -+ program to clear the branch target buffer (See "ibpb" option in -+ :ref:`spectre_mitigation_control_command_line`). This "ibpb" option -+ has less performance cost than the "on" option, which leaves STIBP -+ on all the time. -+ -+References on Spectre -+--------------------- -+ -+Intel white papers: -+ -+.. _spec_ref1: -+ -+[1] `Intel analysis of speculative execution side channels `_. -+ -+.. _spec_ref2: -+ -+[2] `Bounds check bypass `_. -+ -+.. _spec_ref3: -+ -+[3] `Deep dive: Retpoline: A branch target injection mitigation `_. -+ -+.. _spec_ref4: -+ -+[4] `Deep Dive: Single Thread Indirect Branch Predictors `_. -+ -+AMD white papers: -+ -+.. _spec_ref5: -+ -+[5] `AMD64 technology indirect branch control extension `_. -+ -+.. _spec_ref6: -+ -+[6] `Software techniques for managing speculation on AMD processors `_. -+ -+ARM white papers: -+ -+.. _spec_ref7: -+ -+[7] `Cache speculation side-channels `_. -+ -+.. _spec_ref8: -+ -+[8] `Cache speculation issues update `_. -+ -+Google white paper: -+ -+.. _spec_ref9: -+ -+[9] `Retpoline: a software construct for preventing branch-target-injection `_. -+ -+MIPS white paper: -+ -+.. _spec_ref10: -+ -+[10] `MIPS: response on speculative execution and side channel vulnerabilities `_. -+ -+Academic papers: -+ -+.. _spec_ref11: -+ -+[11] `Spectre Attacks: Exploiting Speculative Execution `_. -+ -+.. _spec_ref12: -+ -+[12] `NetSpectre: Read Arbitrary Memory over Network `_. -+ -+.. _spec_ref13: -+ -+[13] `Spectre Returns! Speculation Attacks using the Return Stack Buffer `_. -diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt -index 138f6664b2e2..cc7bfbade6f5 100644 ---- a/Documentation/admin-guide/kernel-parameters.txt -+++ b/Documentation/admin-guide/kernel-parameters.txt -@@ -2587,7 +2587,7 @@ - expose users to several CPU vulnerabilities. - Equivalent to: nopti [X86,PPC] - kpti=0 [ARM64] -- nospectre_v1 [PPC] -+ nospectre_v1 [X86,PPC] - nobp=0 [S390] - nospectre_v2 [X86,PPC,S390,ARM64] - spectre_v2_user=off [X86] -@@ -2936,9 +2936,9 @@ - nosmt=force: Force disable SMT, cannot be undone - via the sysfs control file. - -- nospectre_v1 [PPC] Disable mitigations for Spectre Variant 1 (bounds -- check bypass). With this option data leaks are possible -- in the system. -+ nospectre_v1 [X86,PPC] Disable mitigations for Spectre Variant 1 -+ (bounds check bypass). With this option data leaks are -+ possible in the system. - - nospectre_v2 [X86,PPC_FSL_BOOK3E,ARM64] Disable all mitigations for - the Spectre variant 2 (indirect branch prediction) -@@ -4178,6 +4178,14 @@ - Memory area to be used by remote processor image, - managed by CMA. - -+ rqshare= [X86] Select the MuQSS scheduler runqueue sharing type. -+ Format: -+ smt -- Share SMT (hyperthread) sibling runqueues -+ mc -- Share MC (multicore) sibling runqueues -+ smp -- Share SMP runqueues -+ none -- So not share any runqueues -+ Default value is mc -+ - rw [KNL] Mount root device read-write on boot - - S [KNL] Run init in single mode -@@ -5102,12 +5110,6 @@ - emulate [default] Vsyscalls turn into traps and are - emulated reasonably safely. - -- native Vsyscalls are native syscall instructions. -- This is a little bit faster than trapping -- and makes a few dynamic recompilers work -- better than they would in emulation mode. -- It also makes exploits much easier to write. -- - none Vsyscalls don't work at all. This makes - them quite hard to use for exploits but - might break your system. -diff --git a/Documentation/atomic_t.txt b/Documentation/atomic_t.txt -index dca3fb0554db..65bb09a29324 100644 ---- a/Documentation/atomic_t.txt -+++ b/Documentation/atomic_t.txt -@@ -194,6 +194,9 @@ These helper barriers exist because architectures have varying implicit - ordering on their SMP atomic primitives. For example our TSO architectures - provide full ordered atomics and these barriers are no-ops. - -+NOTE: when the atomic RmW ops are fully ordered, they should also imply a -+compiler barrier. -+ - Thus: - - atomic_fetch_add(); -diff --git a/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt b/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt -new file mode 100644 -index 000000000000..a30d63db3c8f ---- /dev/null -+++ b/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt -@@ -0,0 +1,9 @@ -+Armadeus ST0700 Adapt. A Santek ST0700I5Y-RBSLW 7.0" WVGA (800x480) TFT with -+an adapter board. -+ -+Required properties: -+- compatible: "armadeus,st0700-adapt" -+- power-supply: see panel-common.txt -+ -+Optional properties: -+- backlight: see panel-common.txt -diff --git a/Documentation/devicetree/bindings/leds/backlight/lm3630a-backlight.yaml b/Documentation/devicetree/bindings/leds/backlight/lm3630a-backlight.yaml -index 4d61fe0a98a4..dc129d9a329e 100644 ---- a/Documentation/devicetree/bindings/leds/backlight/lm3630a-backlight.yaml -+++ b/Documentation/devicetree/bindings/leds/backlight/lm3630a-backlight.yaml -@@ -23,16 +23,17 @@ properties: - reg: - maxItems: 1 - -- ti,linear-mapping-mode: -- description: | -- Enable linear mapping mode. If disabled, then it will use exponential -- mapping mode in which the ramp up/down appears to have a more uniform -- transition to the human eye. -- type: boolean -+ '#address-cells': -+ const: 1 -+ -+ '#size-cells': -+ const: 0 - - required: - - compatible - - reg -+ - '#address-cells' -+ - '#size-cells' - - patternProperties: - "^led@[01]$": -@@ -48,7 +49,6 @@ patternProperties: - in this property. The two current sinks can be controlled - independently with both banks, or bank A can be configured to control - both sinks with the led-sources property. -- maxItems: 1 - minimum: 0 - maximum: 1 - -@@ -73,6 +73,13 @@ patternProperties: - minimum: 0 - maximum: 255 - -+ ti,linear-mapping-mode: -+ description: | -+ Enable linear mapping mode. If disabled, then it will use exponential -+ mapping mode in which the ramp up/down appears to have a more uniform -+ transition to the human eye. -+ type: boolean -+ - required: - - reg - -diff --git a/Documentation/devicetree/bindings/net/marvell-orion-mdio.txt b/Documentation/devicetree/bindings/net/marvell-orion-mdio.txt -index 42cd81090a2c..3f3cfc1d8d4d 100644 ---- a/Documentation/devicetree/bindings/net/marvell-orion-mdio.txt -+++ b/Documentation/devicetree/bindings/net/marvell-orion-mdio.txt -@@ -16,7 +16,7 @@ Required properties: - - Optional properties: - - interrupts: interrupt line number for the SMI error/done interrupt --- clocks: phandle for up to three required clocks for the MDIO instance -+- clocks: phandle for up to four required clocks for the MDIO instance - - The child nodes of the MDIO driver are the individual PHY devices - connected to this MDIO bus. They must have a "reg" property given the -diff --git a/Documentation/devicetree/bindings/usb/usb251xb.txt b/Documentation/devicetree/bindings/usb/usb251xb.txt -index bc7945e9dbfe..17915f64b8ee 100644 ---- a/Documentation/devicetree/bindings/usb/usb251xb.txt -+++ b/Documentation/devicetree/bindings/usb/usb251xb.txt -@@ -64,10 +64,8 @@ Optional properties : - - power-on-time-ms : Specifies the time it takes from the time the host - initiates the power-on sequence to a port until the port has adequate - power. The value is given in ms in a 0 - 510 range (default is 100ms). -- - swap-dx-lanes : Specifies the downstream ports which will swap the -- differential-pair (D+/D-), default is not-swapped. -- - swap-us-lanes : Selects the upstream port differential-pair (D+/D-) -- swapping (boolean, default is not-swapped) -+ - swap-dx-lanes : Specifies the ports which will swap the differential-pair -+ (D+/D-), default is not-swapped. - - Examples: - usb2512b@2c { -diff --git a/Documentation/scheduler/sched-BFS.txt b/Documentation/scheduler/sched-BFS.txt -new file mode 100644 -index 000000000000..c0282002a079 ---- /dev/null -+++ b/Documentation/scheduler/sched-BFS.txt -@@ -0,0 +1,351 @@ -+BFS - The Brain Fuck Scheduler by Con Kolivas. -+ -+Goals. -+ -+The goal of the Brain Fuck Scheduler, referred to as BFS from here on, is to -+completely do away with the complex designs of the past for the cpu process -+scheduler and instead implement one that is very simple in basic design. -+The main focus of BFS is to achieve excellent desktop interactivity and -+responsiveness without heuristics and tuning knobs that are difficult to -+understand, impossible to model and predict the effect of, and when tuned to -+one workload cause massive detriment to another. -+ -+ -+Design summary. -+ -+BFS is best described as a single runqueue, O(n) lookup, earliest effective -+virtual deadline first design, loosely based on EEVDF (earliest eligible virtual -+deadline first) and my previous Staircase Deadline scheduler. Each component -+shall be described in order to understand the significance of, and reasoning for -+it. The codebase when the first stable version was released was approximately -+9000 lines less code than the existing mainline linux kernel scheduler (in -+2.6.31). This does not even take into account the removal of documentation and -+the cgroups code that is not used. -+ -+Design reasoning. -+ -+The single runqueue refers to the queued but not running processes for the -+entire system, regardless of the number of CPUs. The reason for going back to -+a single runqueue design is that once multiple runqueues are introduced, -+per-CPU or otherwise, there will be complex interactions as each runqueue will -+be responsible for the scheduling latency and fairness of the tasks only on its -+own runqueue, and to achieve fairness and low latency across multiple CPUs, any -+advantage in throughput of having CPU local tasks causes other disadvantages. -+This is due to requiring a very complex balancing system to at best achieve some -+semblance of fairness across CPUs and can only maintain relatively low latency -+for tasks bound to the same CPUs, not across them. To increase said fairness -+and latency across CPUs, the advantage of local runqueue locking, which makes -+for better scalability, is lost due to having to grab multiple locks. -+ -+A significant feature of BFS is that all accounting is done purely based on CPU -+used and nowhere is sleep time used in any way to determine entitlement or -+interactivity. Interactivity "estimators" that use some kind of sleep/run -+algorithm are doomed to fail to detect all interactive tasks, and to falsely tag -+tasks that aren't interactive as being so. The reason for this is that it is -+close to impossible to determine that when a task is sleeping, whether it is -+doing it voluntarily, as in a userspace application waiting for input in the -+form of a mouse click or otherwise, or involuntarily, because it is waiting for -+another thread, process, I/O, kernel activity or whatever. Thus, such an -+estimator will introduce corner cases, and more heuristics will be required to -+cope with those corner cases, introducing more corner cases and failed -+interactivity detection and so on. Interactivity in BFS is built into the design -+by virtue of the fact that tasks that are waking up have not used up their quota -+of CPU time, and have earlier effective deadlines, thereby making it very likely -+they will preempt any CPU bound task of equivalent nice level. See below for -+more information on the virtual deadline mechanism. Even if they do not preempt -+a running task, because the rr interval is guaranteed to have a bound upper -+limit on how long a task will wait for, it will be scheduled within a timeframe -+that will not cause visible interface jitter. -+ -+ -+Design details. -+ -+Task insertion. -+ -+BFS inserts tasks into each relevant queue as an O(1) insertion into a double -+linked list. On insertion, *every* running queue is checked to see if the newly -+queued task can run on any idle queue, or preempt the lowest running task on the -+system. This is how the cross-CPU scheduling of BFS achieves significantly lower -+latency per extra CPU the system has. In this case the lookup is, in the worst -+case scenario, O(n) where n is the number of CPUs on the system. -+ -+Data protection. -+ -+BFS has one single lock protecting the process local data of every task in the -+global queue. Thus every insertion, removal and modification of task data in the -+global runqueue needs to grab the global lock. However, once a task is taken by -+a CPU, the CPU has its own local data copy of the running process' accounting -+information which only that CPU accesses and modifies (such as during a -+timer tick) thus allowing the accounting data to be updated lockless. Once a -+CPU has taken a task to run, it removes it from the global queue. Thus the -+global queue only ever has, at most, -+ -+ (number of tasks requesting cpu time) - (number of logical CPUs) + 1 -+ -+tasks in the global queue. This value is relevant for the time taken to look up -+tasks during scheduling. This will increase if many tasks with CPU affinity set -+in their policy to limit which CPUs they're allowed to run on if they outnumber -+the number of CPUs. The +1 is because when rescheduling a task, the CPU's -+currently running task is put back on the queue. Lookup will be described after -+the virtual deadline mechanism is explained. -+ -+Virtual deadline. -+ -+The key to achieving low latency, scheduling fairness, and "nice level" -+distribution in BFS is entirely in the virtual deadline mechanism. The one -+tunable in BFS is the rr_interval, or "round robin interval". This is the -+maximum time two SCHED_OTHER (or SCHED_NORMAL, the common scheduling policy) -+tasks of the same nice level will be running for, or looking at it the other -+way around, the longest duration two tasks of the same nice level will be -+delayed for. When a task requests cpu time, it is given a quota (time_slice) -+equal to the rr_interval and a virtual deadline. The virtual deadline is -+offset from the current time in jiffies by this equation: -+ -+ jiffies + (prio_ratio * rr_interval) -+ -+The prio_ratio is determined as a ratio compared to the baseline of nice -20 -+and increases by 10% per nice level. The deadline is a virtual one only in that -+no guarantee is placed that a task will actually be scheduled by this time, but -+it is used to compare which task should go next. There are three components to -+how a task is next chosen. First is time_slice expiration. If a task runs out -+of its time_slice, it is descheduled, the time_slice is refilled, and the -+deadline reset to that formula above. Second is sleep, where a task no longer -+is requesting CPU for whatever reason. The time_slice and deadline are _not_ -+adjusted in this case and are just carried over for when the task is next -+scheduled. Third is preemption, and that is when a newly waking task is deemed -+higher priority than a currently running task on any cpu by virtue of the fact -+that it has an earlier virtual deadline than the currently running task. The -+earlier deadline is the key to which task is next chosen for the first and -+second cases. Once a task is descheduled, it is put back on the queue, and an -+O(n) lookup of all queued-but-not-running tasks is done to determine which has -+the earliest deadline and that task is chosen to receive CPU next. -+ -+The CPU proportion of different nice tasks works out to be approximately the -+ -+ (prio_ratio difference)^2 -+ -+The reason it is squared is that a task's deadline does not change while it is -+running unless it runs out of time_slice. Thus, even if the time actually -+passes the deadline of another task that is queued, it will not get CPU time -+unless the current running task deschedules, and the time "base" (jiffies) is -+constantly moving. -+ -+Task lookup. -+ -+BFS has 103 priority queues. 100 of these are dedicated to the static priority -+of realtime tasks, and the remaining 3 are, in order of best to worst priority, -+SCHED_ISO (isochronous), SCHED_NORMAL, and SCHED_IDLEPRIO (idle priority -+scheduling). When a task of these priorities is queued, a bitmap of running -+priorities is set showing which of these priorities has tasks waiting for CPU -+time. When a CPU is made to reschedule, the lookup for the next task to get -+CPU time is performed in the following way: -+ -+First the bitmap is checked to see what static priority tasks are queued. If -+any realtime priorities are found, the corresponding queue is checked and the -+first task listed there is taken (provided CPU affinity is suitable) and lookup -+is complete. If the priority corresponds to a SCHED_ISO task, they are also -+taken in FIFO order (as they behave like SCHED_RR). If the priority corresponds -+to either SCHED_NORMAL or SCHED_IDLEPRIO, then the lookup becomes O(n). At this -+stage, every task in the runlist that corresponds to that priority is checked -+to see which has the earliest set deadline, and (provided it has suitable CPU -+affinity) it is taken off the runqueue and given the CPU. If a task has an -+expired deadline, it is taken and the rest of the lookup aborted (as they are -+chosen in FIFO order). -+ -+Thus, the lookup is O(n) in the worst case only, where n is as described -+earlier, as tasks may be chosen before the whole task list is looked over. -+ -+ -+Scalability. -+ -+The major limitations of BFS will be that of scalability, as the separate -+runqueue designs will have less lock contention as the number of CPUs rises. -+However they do not scale linearly even with separate runqueues as multiple -+runqueues will need to be locked concurrently on such designs to be able to -+achieve fair CPU balancing, to try and achieve some sort of nice-level fairness -+across CPUs, and to achieve low enough latency for tasks on a busy CPU when -+other CPUs would be more suited. BFS has the advantage that it requires no -+balancing algorithm whatsoever, as balancing occurs by proxy simply because -+all CPUs draw off the global runqueue, in priority and deadline order. Despite -+the fact that scalability is _not_ the prime concern of BFS, it both shows very -+good scalability to smaller numbers of CPUs and is likely a more scalable design -+at these numbers of CPUs. -+ -+It also has some very low overhead scalability features built into the design -+when it has been deemed their overhead is so marginal that they're worth adding. -+The first is the local copy of the running process' data to the CPU it's running -+on to allow that data to be updated lockless where possible. Then there is -+deference paid to the last CPU a task was running on, by trying that CPU first -+when looking for an idle CPU to use the next time it's scheduled. Finally there -+is the notion of cache locality beyond the last running CPU. The sched_domains -+information is used to determine the relative virtual "cache distance" that -+other CPUs have from the last CPU a task was running on. CPUs with shared -+caches, such as SMT siblings, or multicore CPUs with shared caches, are treated -+as cache local. CPUs without shared caches are treated as not cache local, and -+CPUs on different NUMA nodes are treated as very distant. This "relative cache -+distance" is used by modifying the virtual deadline value when doing lookups. -+Effectively, the deadline is unaltered between "cache local" CPUs, doubled for -+"cache distant" CPUs, and quadrupled for "very distant" CPUs. The reasoning -+behind the doubling of deadlines is as follows. The real cost of migrating a -+task from one CPU to another is entirely dependant on the cache footprint of -+the task, how cache intensive the task is, how long it's been running on that -+CPU to take up the bulk of its cache, how big the CPU cache is, how fast and -+how layered the CPU cache is, how fast a context switch is... and so on. In -+other words, it's close to random in the real world where we do more than just -+one sole workload. The only thing we can be sure of is that it's not free. So -+BFS uses the principle that an idle CPU is a wasted CPU and utilising idle CPUs -+is more important than cache locality, and cache locality only plays a part -+after that. Doubling the effective deadline is based on the premise that the -+"cache local" CPUs will tend to work on the same tasks up to double the number -+of cache local CPUs, and once the workload is beyond that amount, it is likely -+that none of the tasks are cache warm anywhere anyway. The quadrupling for NUMA -+is a value I pulled out of my arse. -+ -+When choosing an idle CPU for a waking task, the cache locality is determined -+according to where the task last ran and then idle CPUs are ranked from best -+to worst to choose the most suitable idle CPU based on cache locality, NUMA -+node locality and hyperthread sibling business. They are chosen in the -+following preference (if idle): -+ -+* Same core, idle or busy cache, idle threads -+* Other core, same cache, idle or busy cache, idle threads. -+* Same node, other CPU, idle cache, idle threads. -+* Same node, other CPU, busy cache, idle threads. -+* Same core, busy threads. -+* Other core, same cache, busy threads. -+* Same node, other CPU, busy threads. -+* Other node, other CPU, idle cache, idle threads. -+* Other node, other CPU, busy cache, idle threads. -+* Other node, other CPU, busy threads. -+ -+This shows the SMT or "hyperthread" awareness in the design as well which will -+choose a real idle core first before a logical SMT sibling which already has -+tasks on the physical CPU. -+ -+Early benchmarking of BFS suggested scalability dropped off at the 16 CPU mark. -+However this benchmarking was performed on an earlier design that was far less -+scalable than the current one so it's hard to know how scalable it is in terms -+of both CPUs (due to the global runqueue) and heavily loaded machines (due to -+O(n) lookup) at this stage. Note that in terms of scalability, the number of -+_logical_ CPUs matters, not the number of _physical_ CPUs. Thus, a dual (2x) -+quad core (4X) hyperthreaded (2X) machine is effectively a 16X. Newer benchmark -+results are very promising indeed, without needing to tweak any knobs, features -+or options. Benchmark contributions are most welcome. -+ -+ -+Features -+ -+As the initial prime target audience for BFS was the average desktop user, it -+was designed to not need tweaking, tuning or have features set to obtain benefit -+from it. Thus the number of knobs and features has been kept to an absolute -+minimum and should not require extra user input for the vast majority of cases. -+There are precisely 2 tunables, and 2 extra scheduling policies. The rr_interval -+and iso_cpu tunables, and the SCHED_ISO and SCHED_IDLEPRIO policies. In addition -+to this, BFS also uses sub-tick accounting. What BFS does _not_ now feature is -+support for CGROUPS. The average user should neither need to know what these -+are, nor should they need to be using them to have good desktop behaviour. -+ -+rr_interval -+ -+There is only one "scheduler" tunable, the round robin interval. This can be -+accessed in -+ -+ /proc/sys/kernel/rr_interval -+ -+The value is in milliseconds, and the default value is set to 6 on a -+uniprocessor machine, and automatically set to a progressively higher value on -+multiprocessor machines. The reasoning behind increasing the value on more CPUs -+is that the effective latency is decreased by virtue of there being more CPUs on -+BFS (for reasons explained above), and increasing the value allows for less -+cache contention and more throughput. Valid values are from 1 to 1000 -+Decreasing the value will decrease latencies at the cost of decreasing -+throughput, while increasing it will improve throughput, but at the cost of -+worsening latencies. The accuracy of the rr interval is limited by HZ resolution -+of the kernel configuration. Thus, the worst case latencies are usually slightly -+higher than this actual value. The default value of 6 is not an arbitrary one. -+It is based on the fact that humans can detect jitter at approximately 7ms, so -+aiming for much lower latencies is pointless under most circumstances. It is -+worth noting this fact when comparing the latency performance of BFS to other -+schedulers. Worst case latencies being higher than 7ms are far worse than -+average latencies not being in the microsecond range. -+ -+Isochronous scheduling. -+ -+Isochronous scheduling is a unique scheduling policy designed to provide -+near-real-time performance to unprivileged (ie non-root) users without the -+ability to starve the machine indefinitely. Isochronous tasks (which means -+"same time") are set using, for example, the schedtool application like so: -+ -+ schedtool -I -e amarok -+ -+This will start the audio application "amarok" as SCHED_ISO. How SCHED_ISO works -+is that it has a priority level between true realtime tasks and SCHED_NORMAL -+which would allow them to preempt all normal tasks, in a SCHED_RR fashion (ie, -+if multiple SCHED_ISO tasks are running, they purely round robin at rr_interval -+rate). However if ISO tasks run for more than a tunable finite amount of time, -+they are then demoted back to SCHED_NORMAL scheduling. This finite amount of -+time is the percentage of _total CPU_ available across the machine, configurable -+as a percentage in the following "resource handling" tunable (as opposed to a -+scheduler tunable): -+ -+ /proc/sys/kernel/iso_cpu -+ -+and is set to 70% by default. It is calculated over a rolling 5 second average -+Because it is the total CPU available, it means that on a multi CPU machine, it -+is possible to have an ISO task running as realtime scheduling indefinitely on -+just one CPU, as the other CPUs will be available. Setting this to 100 is the -+equivalent of giving all users SCHED_RR access and setting it to 0 removes the -+ability to run any pseudo-realtime tasks. -+ -+A feature of BFS is that it detects when an application tries to obtain a -+realtime policy (SCHED_RR or SCHED_FIFO) and the caller does not have the -+appropriate privileges to use those policies. When it detects this, it will -+give the task SCHED_ISO policy instead. Thus it is transparent to the user. -+Because some applications constantly set their policy as well as their nice -+level, there is potential for them to undo the override specified by the user -+on the command line of setting the policy to SCHED_ISO. To counter this, once -+a task has been set to SCHED_ISO policy, it needs superuser privileges to set -+it back to SCHED_NORMAL. This will ensure the task remains ISO and all child -+processes and threads will also inherit the ISO policy. -+ -+Idleprio scheduling. -+ -+Idleprio scheduling is a scheduling policy designed to give out CPU to a task -+_only_ when the CPU would be otherwise idle. The idea behind this is to allow -+ultra low priority tasks to be run in the background that have virtually no -+effect on the foreground tasks. This is ideally suited to distributed computing -+clients (like setiathome, folding, mprime etc) but can also be used to start -+a video encode or so on without any slowdown of other tasks. To avoid this -+policy from grabbing shared resources and holding them indefinitely, if it -+detects a state where the task is waiting on I/O, the machine is about to -+suspend to ram and so on, it will transiently schedule them as SCHED_NORMAL. As -+per the Isochronous task management, once a task has been scheduled as IDLEPRIO, -+it cannot be put back to SCHED_NORMAL without superuser privileges. Tasks can -+be set to start as SCHED_IDLEPRIO with the schedtool command like so: -+ -+ schedtool -D -e ./mprime -+ -+Subtick accounting. -+ -+It is surprisingly difficult to get accurate CPU accounting, and in many cases, -+the accounting is done by simply determining what is happening at the precise -+moment a timer tick fires off. This becomes increasingly inaccurate as the -+timer tick frequency (HZ) is lowered. It is possible to create an application -+which uses almost 100% CPU, yet by being descheduled at the right time, records -+zero CPU usage. While the main problem with this is that there are possible -+security implications, it is also difficult to determine how much CPU a task -+really does use. BFS tries to use the sub-tick accounting from the TSC clock, -+where possible, to determine real CPU usage. This is not entirely reliable, but -+is far more likely to produce accurate CPU usage data than the existing designs -+and will not show tasks as consuming no CPU usage when they actually are. Thus, -+the amount of CPU reported as being used by BFS will more accurately represent -+how much CPU the task itself is using (as is shown for example by the 'time' -+application), so the reported values may be quite different to other schedulers. -+Values reported as the 'load' are more prone to problems with this design, but -+per process values are closer to real usage. When comparing throughput of BFS -+to other designs, it is important to compare the actual completed work in terms -+of total wall clock time taken and total work done, rather than the reported -+"cpu usage". -+ -+ -+Con Kolivas Fri Aug 27 2010 -diff --git a/Documentation/scheduler/sched-MuQSS.txt b/Documentation/scheduler/sched-MuQSS.txt -new file mode 100644 -index 000000000000..ae28b85c9995 ---- /dev/null -+++ b/Documentation/scheduler/sched-MuQSS.txt -@@ -0,0 +1,373 @@ -+MuQSS - The Multiple Queue Skiplist Scheduler by Con Kolivas. -+ -+MuQSS is a per-cpu runqueue variant of the original BFS scheduler with -+one 8 level skiplist per runqueue, and fine grained locking for much more -+scalability. -+ -+ -+Goals. -+ -+The goal of the Multiple Queue Skiplist Scheduler, referred to as MuQSS from -+here on (pronounced mux) is to completely do away with the complex designs of -+the past for the cpu process scheduler and instead implement one that is very -+simple in basic design. The main focus of MuQSS is to achieve excellent desktop -+interactivity and responsiveness without heuristics and tuning knobs that are -+difficult to understand, impossible to model and predict the effect of, and when -+tuned to one workload cause massive detriment to another, while still being -+scalable to many CPUs and processes. -+ -+ -+Design summary. -+ -+MuQSS is best described as per-cpu multiple runqueue, O(log n) insertion, O(1) -+lookup, earliest effective virtual deadline first tickless design, loosely based -+on EEVDF (earliest eligible virtual deadline first) and my previous Staircase -+Deadline scheduler, and evolved from the single runqueue O(n) BFS scheduler. -+Each component shall be described in order to understand the significance of, -+and reasoning for it. -+ -+ -+Design reasoning. -+ -+In BFS, the use of a single runqueue across all CPUs meant that each CPU would -+need to scan the entire runqueue looking for the process with the earliest -+deadline and schedule that next, regardless of which CPU it originally came -+from. This made BFS deterministic with respect to latency and provided -+guaranteed latencies dependent on number of processes and CPUs. The single -+runqueue, however, meant that all CPUs would compete for the single lock -+protecting it, which would lead to increasing lock contention as the number of -+CPUs rose and appeared to limit scalability of common workloads beyond 16 -+logical CPUs. Additionally, the O(n) lookup of the runqueue list obviously -+increased overhead proportionate to the number of queued proecesses and led to -+cache thrashing while iterating over the linked list. -+ -+MuQSS is an evolution of BFS, designed to maintain the same scheduling -+decision mechanism and be virtually deterministic without relying on the -+constrained design of the single runqueue by splitting out the single runqueue -+to be per-CPU and use skiplists instead of linked lists. -+ -+The original reason for going back to a single runqueue design for BFS was that -+once multiple runqueues are introduced, per-CPU or otherwise, there will be -+complex interactions as each runqueue will be responsible for the scheduling -+latency and fairness of the tasks only on its own runqueue, and to achieve -+fairness and low latency across multiple CPUs, any advantage in throughput of -+having CPU local tasks causes other disadvantages. This is due to requiring a -+very complex balancing system to at best achieve some semblance of fairness -+across CPUs and can only maintain relatively low latency for tasks bound to the -+same CPUs, not across them. To increase said fairness and latency across CPUs, -+the advantage of local runqueue locking, which makes for better scalability, is -+lost due to having to grab multiple locks. -+ -+MuQSS works around the problems inherent in multiple runqueue designs by -+making its skip lists priority ordered and through novel use of lockless -+examination of each other runqueue it can decide if it should take the earliest -+deadline task from another runqueue for latency reasons, or for CPU balancing -+reasons. It still does not have a balancing system, choosing to allow the -+next task scheduling decision and task wakeup CPU choice to allow balancing to -+happen by virtue of its choices. -+ -+As a further evolution of the design, MuQSS normally configures sharing of -+runqueues in a logical fashion for when CPU resources are shared for improved -+latency and throughput. By default it shares runqueues and locks between -+multicore siblings. Optionally it can be configured to run with sharing of -+SMT siblings only, all SMP packages or no sharing at all. Additionally it can -+be selected at boot time. -+ -+ -+Design details. -+ -+Custom skip list implementation: -+ -+To avoid the overhead of building up and tearing down skip list structures, -+the variant used by MuQSS has a number of optimisations making it specific for -+its use case in the scheduler. It uses static arrays of 8 'levels' instead of -+building up and tearing down structures dynamically. This makes each runqueue -+only scale O(log N) up to 64k tasks. However as there is one runqueue per CPU -+it means that it scales O(log N) up to 64k x number of logical CPUs which is -+far beyond the realistic task limits each CPU could handle. By being 8 levels -+it also makes the array exactly one cacheline in size. Additionally, each -+skip list node is bidirectional making insertion and removal amortised O(1), -+being O(k) where k is 1-8. Uniquely, we are only ever interested in the very -+first entry in each list at all times with MuQSS, so there is never a need to -+do a search and thus look up is always O(1). In interactive mode, the queues -+will be searched beyond their first entry if the first task is not suitable -+for affinity or SMT nice reasons. -+ -+Task insertion: -+ -+MuQSS inserts tasks into a per CPU runqueue as an O(log N) insertion into -+a custom skip list as described above (based on the original design by William -+Pugh). Insertion is ordered in such a way that there is never a need to do a -+search by ordering tasks according to static priority primarily, and then -+virtual deadline at the time of insertion. -+ -+Niffies: -+ -+Niffies are a monotonic forward moving timer not unlike the "jiffies" but are -+of nanosecond resolution. Niffies are calculated per-runqueue from the high -+resolution TSC timers, and in order to maintain fairness are synchronised -+between CPUs whenever both runqueues are locked concurrently. -+ -+Virtual deadline: -+ -+The key to achieving low latency, scheduling fairness, and "nice level" -+distribution in MuQSS is entirely in the virtual deadline mechanism. The one -+tunable in MuQSS is the rr_interval, or "round robin interval". This is the -+maximum time two SCHED_OTHER (or SCHED_NORMAL, the common scheduling policy) -+tasks of the same nice level will be running for, or looking at it the other -+way around, the longest duration two tasks of the same nice level will be -+delayed for. When a task requests cpu time, it is given a quota (time_slice) -+equal to the rr_interval and a virtual deadline. The virtual deadline is -+offset from the current time in niffies by this equation: -+ -+ niffies + (prio_ratio * rr_interval) -+ -+The prio_ratio is determined as a ratio compared to the baseline of nice -20 -+and increases by 10% per nice level. The deadline is a virtual one only in that -+no guarantee is placed that a task will actually be scheduled by this time, but -+it is used to compare which task should go next. There are three components to -+how a task is next chosen. First is time_slice expiration. If a task runs out -+of its time_slice, it is descheduled, the time_slice is refilled, and the -+deadline reset to that formula above. Second is sleep, where a task no longer -+is requesting CPU for whatever reason. The time_slice and deadline are _not_ -+adjusted in this case and are just carried over for when the task is next -+scheduled. Third is preemption, and that is when a newly waking task is deemed -+higher priority than a currently running task on any cpu by virtue of the fact -+that it has an earlier virtual deadline than the currently running task. The -+earlier deadline is the key to which task is next chosen for the first and -+second cases. -+ -+The CPU proportion of different nice tasks works out to be approximately the -+ -+ (prio_ratio difference)^2 -+ -+The reason it is squared is that a task's deadline does not change while it is -+running unless it runs out of time_slice. Thus, even if the time actually -+passes the deadline of another task that is queued, it will not get CPU time -+unless the current running task deschedules, and the time "base" (niffies) is -+constantly moving. -+ -+Task lookup: -+ -+As tasks are already pre-ordered according to anticipated scheduling order in -+the skip lists, lookup for the next suitable task per-runqueue is always a -+matter of simply selecting the first task in the 0th level skip list entry. -+In order to maintain optimal latency and fairness across CPUs, MuQSS does a -+novel examination of every other runqueue in cache locality order, choosing the -+best task across all runqueues. This provides near-determinism of how long any -+task across the entire system may wait before receiving CPU time. The other -+runqueues are first examine lockless and then trylocked to minimise the -+potential lock contention if they are likely to have a suitable better task. -+Each other runqueue lock is only held for as long as it takes to examine the -+entry for suitability. In "interactive" mode, the default setting, MuQSS will -+look for the best deadline task across all CPUs, while in !interactive mode, -+it will only select a better deadline task from another CPU if it is more -+heavily laden than the current one. -+ -+Lookup is therefore O(k) where k is number of CPUs. -+ -+ -+Latency. -+ -+Through the use of virtual deadlines to govern the scheduling order of normal -+tasks, queue-to-activation latency per runqueue is guaranteed to be bound by -+the rr_interval tunable which is set to 6ms by default. This means that the -+longest a CPU bound task will wait for more CPU is proportional to the number -+of running tasks and in the common case of 0-2 running tasks per CPU, will be -+under the 7ms threshold for human perception of jitter. Additionally, as newly -+woken tasks will have an early deadline from their previous runtime, the very -+tasks that are usually latency sensitive will have the shortest interval for -+activation, usually preempting any existing CPU bound tasks. -+ -+Tickless expiry: -+ -+A feature of MuQSS is that it is not tied to the resolution of the chosen tick -+rate in Hz, instead depending entirely on the high resolution timers where -+possible for sub-millisecond accuracy on timeouts regarless of the underlying -+tick rate. This allows MuQSS to be run with the low overhead of low Hz rates -+such as 100 by default, benefiting from the improved throughput and lower -+power usage it provides. Another advantage of this approach is that in -+combination with the Full No HZ option, which disables ticks on running task -+CPUs instead of just idle CPUs, the tick can be disabled at all times -+regardless of how many tasks are running instead of being limited to just one -+running task. Note that this option is NOT recommended for regular desktop -+users. -+ -+ -+Scalability and balancing. -+ -+Unlike traditional approaches where balancing is a combination of CPU selection -+at task wakeup and intermittent balancing based on a vast array of rules set -+according to architecture, busyness calculations and special case management, -+MuQSS indirectly balances on the fly at task wakeup and next task selection. -+During initialisation, MuQSS creates a cache coherency ordered list of CPUs for -+each logical CPU and uses this to aid task/CPU selection when CPUs are busy. -+Additionally it selects any idle CPUs, if they are available, at any time over -+busy CPUs according to the following preference: -+ -+ * Same thread, idle or busy cache, idle or busy threads -+ * Other core, same cache, idle or busy cache, idle threads. -+ * Same node, other CPU, idle cache, idle threads. -+ * Same node, other CPU, busy cache, idle threads. -+ * Other core, same cache, busy threads. -+ * Same node, other CPU, busy threads. -+ * Other node, other CPU, idle cache, idle threads. -+ * Other node, other CPU, busy cache, idle threads. -+ * Other node, other CPU, busy threads. -+ -+Mux is therefore SMT, MC and Numa aware without the need for extra -+intermittent balancing to maintain CPUs busy and make the most of cache -+coherency. -+ -+ -+Features -+ -+As the initial prime target audience for MuQSS was the average desktop user, it -+was designed to not need tweaking, tuning or have features set to obtain benefit -+from it. Thus the number of knobs and features has been kept to an absolute -+minimum and should not require extra user input for the vast majority of cases. -+There are 3 optional tunables, and 2 extra scheduling policies. The rr_interval, -+interactive, and iso_cpu tunables, and the SCHED_ISO and SCHED_IDLEPRIO -+policies. In addition to this, MuQSS also uses sub-tick accounting. What MuQSS -+does _not_ now feature is support for CGROUPS. The average user should neither -+need to know what these are, nor should they need to be using them to have good -+desktop behaviour. However since some applications refuse to work without -+cgroups, one can enable them with MuQSS as a stub and the filesystem will be -+created which will allow the applications to work. -+ -+rr_interval: -+ -+ /proc/sys/kernel/rr_interval -+ -+The value is in milliseconds, and the default value is set to 6. Valid values -+are from 1 to 1000 Decreasing the value will decrease latencies at the cost of -+decreasing throughput, while increasing it will improve throughput, but at the -+cost of worsening latencies. It is based on the fact that humans can detect -+jitter at approximately 7ms, so aiming for much lower latencies is pointless -+under most circumstances. It is worth noting this fact when comparing the -+latency performance of MuQSS to other schedulers. Worst case latencies being -+higher than 7ms are far worse than average latencies not being in the -+microsecond range. -+ -+interactive: -+ -+ /proc/sys/kernel/interactive -+ -+The value is a simple boolean of 1 for on and 0 for off and is set to on by -+default. Disabling this will disable the near-determinism of MuQSS when -+selecting the next task by not examining all CPUs for the earliest deadline -+task, or which CPU to wake to, instead prioritising CPU balancing for improved -+throughput. Latency will still be bound by rr_interval, but on a per-CPU basis -+instead of across the whole system. -+ -+Runqueue sharing. -+ -+By default MuQSS chooses to share runqueue resources (specifically the skip -+list and locking) between multicore siblings. It is configurable at build time -+to select between None, SMT, MC and SMP, corresponding to no sharing, sharing -+only between simultaneous mulithreading siblings, multicore siblings, or -+symmetric multiprocessing physical packages. Additionally it can be se at -+bootime with the use of the rqshare parameter. The reason for configurability -+is that some architectures have CPUs with many multicore siblings (>= 16) -+where it may be detrimental to throughput to share runqueues and another -+sharing option may be desirable. Additionally, more sharing than usual can -+improve latency on a system-wide level at the expense of throughput if desired. -+ -+The options are: -+none, smt, mc, smp -+ -+eg: -+ rqshare=mc -+ -+Isochronous scheduling: -+ -+Isochronous scheduling is a unique scheduling policy designed to provide -+near-real-time performance to unprivileged (ie non-root) users without the -+ability to starve the machine indefinitely. Isochronous tasks (which means -+"same time") are set using, for example, the schedtool application like so: -+ -+ schedtool -I -e amarok -+ -+This will start the audio application "amarok" as SCHED_ISO. How SCHED_ISO works -+is that it has a priority level between true realtime tasks and SCHED_NORMAL -+which would allow them to preempt all normal tasks, in a SCHED_RR fashion (ie, -+if multiple SCHED_ISO tasks are running, they purely round robin at rr_interval -+rate). However if ISO tasks run for more than a tunable finite amount of time, -+they are then demoted back to SCHED_NORMAL scheduling. This finite amount of -+time is the percentage of CPU available per CPU, configurable as a percentage in -+the following "resource handling" tunable (as opposed to a scheduler tunable): -+ -+iso_cpu: -+ -+ /proc/sys/kernel/iso_cpu -+ -+and is set to 70% by default. It is calculated over a rolling 5 second average -+Because it is the total CPU available, it means that on a multi CPU machine, it -+is possible to have an ISO task running as realtime scheduling indefinitely on -+just one CPU, as the other CPUs will be available. Setting this to 100 is the -+equivalent of giving all users SCHED_RR access and setting it to 0 removes the -+ability to run any pseudo-realtime tasks. -+ -+A feature of MuQSS is that it detects when an application tries to obtain a -+realtime policy (SCHED_RR or SCHED_FIFO) and the caller does not have the -+appropriate privileges to use those policies. When it detects this, it will -+give the task SCHED_ISO policy instead. Thus it is transparent to the user. -+ -+ -+Idleprio scheduling: -+ -+Idleprio scheduling is a scheduling policy designed to give out CPU to a task -+_only_ when the CPU would be otherwise idle. The idea behind this is to allow -+ultra low priority tasks to be run in the background that have virtually no -+effect on the foreground tasks. This is ideally suited to distributed computing -+clients (like setiathome, folding, mprime etc) but can also be used to start a -+video encode or so on without any slowdown of other tasks. To avoid this policy -+from grabbing shared resources and holding them indefinitely, if it detects a -+state where the task is waiting on I/O, the machine is about to suspend to ram -+and so on, it will transiently schedule them as SCHED_NORMAL. Once a task has -+been scheduled as IDLEPRIO, it cannot be put back to SCHED_NORMAL without -+superuser privileges since it is effectively a lower scheduling policy. Tasks -+can be set to start as SCHED_IDLEPRIO with the schedtool command like so: -+ -+schedtool -D -e ./mprime -+ -+Subtick accounting: -+ -+It is surprisingly difficult to get accurate CPU accounting, and in many cases, -+the accounting is done by simply determining what is happening at the precise -+moment a timer tick fires off. This becomes increasingly inaccurate as the timer -+tick frequency (HZ) is lowered. It is possible to create an application which -+uses almost 100% CPU, yet by being descheduled at the right time, records zero -+CPU usage. While the main problem with this is that there are possible security -+implications, it is also difficult to determine how much CPU a task really does -+use. Mux uses sub-tick accounting from the TSC clock to determine real CPU -+usage. Thus, the amount of CPU reported as being used by MuQSS will more -+accurately represent how much CPU the task itself is using (as is shown for -+example by the 'time' application), so the reported values may be quite -+different to other schedulers. When comparing throughput of MuQSS to other -+designs, it is important to compare the actual completed work in terms of total -+wall clock time taken and total work done, rather than the reported "cpu usage". -+ -+Symmetric MultiThreading (SMT) aware nice: -+ -+SMT, a.k.a. hyperthreading, is a very common feature on modern CPUs. While the -+logical CPU count rises by adding thread units to each CPU core, allowing more -+than one task to be run simultaneously on the same core, the disadvantage of it -+is that the CPU power is shared between the tasks, not summating to the power -+of two CPUs. The practical upshot of this is that two tasks running on -+separate threads of the same core run significantly slower than if they had one -+core each to run on. While smart CPU selection allows each task to have a core -+to itself whenever available (as is done on MuQSS), it cannot offset the -+slowdown that occurs when the cores are all loaded and only a thread is left. -+Most of the time this is harmless as the CPU is effectively overloaded at this -+point and the extra thread is of benefit. However when running a niced task in -+the presence of an un-niced task (say nice 19 v nice 0), the nice task gets -+precisely the same amount of CPU power as the unniced one. MuQSS has an -+optional configuration feature known as SMT-NICE which selectively idles the -+secondary niced thread for a period proportional to the nice difference, -+allowing CPU distribution according to nice level to be maintained, at the -+expense of a small amount of extra overhead. If this is configured in on a -+machine without SMT threads, the overhead is minimal. -+ -+ -+Con Kolivas Sat, 29th October 2016 -diff --git a/Documentation/scheduler/sched-pelt.c b/Documentation/scheduler/sched-pelt.c -index e4219139386a..7238b355919c 100644 ---- a/Documentation/scheduler/sched-pelt.c -+++ b/Documentation/scheduler/sched-pelt.c -@@ -20,7 +20,8 @@ void calc_runnable_avg_yN_inv(void) - int i; - unsigned int x; - -- printf("static const u32 runnable_avg_yN_inv[] = {"); -+ /* To silence -Wunused-but-set-variable warnings. */ -+ printf("static const u32 runnable_avg_yN_inv[] __maybe_unused = {"); - for (i = 0; i < HALFLIFE; i++) { - x = ((1UL<<32)-1)*pow(y, i); - -diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt -index f0c86fbb3b48..88cc0a02a9ef 100644 ---- a/Documentation/sysctl/kernel.txt -+++ b/Documentation/sysctl/kernel.txt -@@ -41,6 +41,7 @@ show up in /proc/sys/kernel: - - hung_task_check_interval_secs - - hung_task_warnings - - hyperv_record_panic_msg -+- iso_cpu - - kexec_load_disabled - - kptr_restrict - - l2cr [ PPC only ] -@@ -77,6 +78,7 @@ show up in /proc/sys/kernel: - - randomize_va_space - - real-root-dev ==> Documentation/admin-guide/initrd.rst - - reboot-cmd [ SPARC only ] -+- rr_interval - - rtsig-max - - rtsig-nr - - sched_energy_aware -@@ -100,6 +102,7 @@ show up in /proc/sys/kernel: - - unknown_nmi_panic - - watchdog - - watchdog_thresh -+- yield_type - - version - - ============================================================== -@@ -438,6 +441,16 @@ When kptr_restrict is set to (2), kernel pointers printed using - - ============================================================== - -+iso_cpu: (MuQSS CPU scheduler only). -+ -+This sets the percentage cpu that the unprivileged SCHED_ISO tasks can -+run effectively at realtime priority, averaged over a rolling five -+seconds over the -whole- system, meaning all cpus. -+ -+Set to 70 (percent) by default. -+ -+============================================================== -+ - l2cr: (PPC only) - - This flag controls the L2 cache of G3 processor boards. If -@@ -881,6 +894,20 @@ rebooting. ??? - - ============================================================== - -+rr_interval: (MuQSS CPU scheduler only) -+ -+This is the smallest duration that any cpu process scheduling unit -+will run for. Increasing this value can increase throughput of cpu -+bound tasks substantially but at the expense of increased latencies -+overall. Conversely decreasing it will decrease average and maximum -+latencies but at the expense of throughput. This value is in -+milliseconds and the default value chosen depends on the number of -+cpus available at scheduler initialisation with a minimum of 6. -+ -+Valid values are from 1-1000. -+ -+============================================================== -+ - rtsig-max & rtsig-nr: - - The file rtsig-max can be used to tune the maximum number -@@ -1143,3 +1170,13 @@ The softlockup threshold is (2 * watchdog_thresh). Setting this - tunable to zero will disable lockup detection altogether. - - ============================================================== -+ -+yield_type: (MuQSS CPU scheduler only) -+ -+This determines what type of yield calls to sched_yield will perform. -+ -+ 0: No yield. -+ 1: Yield only to better priority/deadline tasks. (default) -+ 2: Expire timeslice and recalculate deadline. -+ -+============================================================== -diff --git a/Documentation/tp_smapi.txt b/Documentation/tp_smapi.txt -new file mode 100644 -index 000000000000..a249678a8866 ---- /dev/null -+++ b/Documentation/tp_smapi.txt -@@ -0,0 +1,275 @@ -+tp_smapi version 0.42 -+IBM ThinkPad hardware functions driver -+ -+Author: Shem Multinymous -+Project: http://sourceforge.net/projects/tpctl -+Wiki: http://thinkwiki.org/wiki/tp_smapi -+List: linux-thinkpad@linux-thinkpad.org -+ (http://mailman.linux-thinkpad.org/mailman/listinfo/linux-thinkpad) -+ -+Description -+----------- -+ -+ThinkPad laptops include a proprietary interface called SMAPI BIOS -+(System Management Application Program Interface) which provides some -+hardware control functionality that is not accessible by other means. -+ -+This driver exposes some features of the SMAPI BIOS through a sysfs -+interface. It is suitable for newer models, on which SMAPI is invoked -+through IO port writes. Older models use a different SMAPI interface; -+for those, try the "thinkpad" module from the "tpctl" package. -+ -+WARNING: -+This driver uses undocumented features and direct hardware access. -+It thus cannot be guaranteed to work, and may cause arbitrary damage -+(especially on models it wasn't tested on). -+ -+ -+Module parameters -+----------------- -+ -+thinkpad_ec module: -+ force_io=1 lets thinkpad_ec load on some recent ThinkPad models -+ (e.g., T400 and T500) whose BIOS's ACPI DSDT reserves the ports we need. -+tp_smapi module: -+ debug=1 enables verbose dmesg output. -+ -+ -+Usage -+----- -+ -+Control of battery charging thresholds (in percents of current full charge -+capacity): -+ -+# echo 40 > /sys/devices/platform/smapi/BAT0/start_charge_thresh -+# echo 70 > /sys/devices/platform/smapi/BAT0/stop_charge_thresh -+# cat /sys/devices/platform/smapi/BAT0/*_charge_thresh -+ -+ (This is useful since Li-Ion batteries wear out much faster at very -+ high or low charge levels. The driver will also keeps the thresholds -+ across suspend-to-disk with AC disconnected; this isn't done -+ automatically by the hardware.) -+ -+Inhibiting battery charging for 17 minutes (overrides thresholds): -+ -+# echo 17 > /sys/devices/platform/smapi/BAT0/inhibit_charge_minutes -+# echo 0 > /sys/devices/platform/smapi/BAT0/inhibit_charge_minutes # stop -+# cat /sys/devices/platform/smapi/BAT0/inhibit_charge_minutes -+ -+ (This can be used to control which battery is charged when using an -+ Ultrabay battery.) -+ -+Forcing battery discharging even if AC power available: -+ -+# echo 1 > /sys/devices/platform/smapi/BAT0/force_discharge # start discharge -+# echo 0 > /sys/devices/platform/smapi/BAT0/force_discharge # stop discharge -+# cat /sys/devices/platform/smapi/BAT0/force_discharge -+ -+ (When AC is connected, forced discharging will automatically stop -+ when battery is fully depleted -- this is useful for calibration. -+ Also, this attribute can be used to control which battery is discharged -+ when both a system battery and an Ultrabay battery are connected.) -+ -+Misc read-only battery status attributes (see note about HDAPS below): -+ -+/sys/devices/platform/smapi/BAT0/installed # 0 or 1 -+/sys/devices/platform/smapi/BAT0/state # idle/charging/discharging -+/sys/devices/platform/smapi/BAT0/cycle_count # integer counter -+/sys/devices/platform/smapi/BAT0/current_now # instantaneous current -+/sys/devices/platform/smapi/BAT0/current_avg # last minute average -+/sys/devices/platform/smapi/BAT0/power_now # instantaneous power -+/sys/devices/platform/smapi/BAT0/power_avg # last minute average -+/sys/devices/platform/smapi/BAT0/last_full_capacity # in mWh -+/sys/devices/platform/smapi/BAT0/remaining_percent # remaining percent of energy (set by calibration) -+/sys/devices/platform/smapi/BAT0/remaining_percent_error # error range of remaing_percent (not reset by calibration) -+/sys/devices/platform/smapi/BAT0/remaining_running_time # in minutes, by last minute average power -+/sys/devices/platform/smapi/BAT0/remaining_running_time_now # in minutes, by instantenous power -+/sys/devices/platform/smapi/BAT0/remaining_charging_time # in minutes -+/sys/devices/platform/smapi/BAT0/remaining_capacity # in mWh -+/sys/devices/platform/smapi/BAT0/design_capacity # in mWh -+/sys/devices/platform/smapi/BAT0/voltage # in mV -+/sys/devices/platform/smapi/BAT0/design_voltage # in mV -+/sys/devices/platform/smapi/BAT0/charging_max_current # max charging current -+/sys/devices/platform/smapi/BAT0/charging_max_voltage # max charging voltage -+/sys/devices/platform/smapi/BAT0/group{0,1,2,3}_voltage # see below -+/sys/devices/platform/smapi/BAT0/manufacturer # string -+/sys/devices/platform/smapi/BAT0/model # string -+/sys/devices/platform/smapi/BAT0/barcoding # string -+/sys/devices/platform/smapi/BAT0/chemistry # string -+/sys/devices/platform/smapi/BAT0/serial # integer -+/sys/devices/platform/smapi/BAT0/manufacture_date # YYYY-MM-DD -+/sys/devices/platform/smapi/BAT0/first_use_date # YYYY-MM-DD -+/sys/devices/platform/smapi/BAT0/temperature # in milli-Celsius -+/sys/devices/platform/smapi/BAT0/dump # see below -+/sys/devices/platform/smapi/ac_connected # 0 or 1 -+ -+The BAT0/group{0,1,2,3}_voltage attribute refers to the separate cell groups -+in each battery. For example, on the ThinkPad 600, X3x, T4x and R5x models, -+the battery contains 3 cell groups in series, where each group consisting of 2 -+or 3 cells connected in parallel. The voltage of each group is given by these -+attributes, and their sum (roughly) equals the "voltage" attribute. -+(The effective performance of the battery is determined by the weakest group, -+i.e., the one those voltage changes most rapidly during dis/charging.) -+ -+The "BAT0/dump" attribute gives a a hex dump of the raw status data, which -+contains additional data now in the above (if you can figure it out). Some -+unused values are autodetected and replaced by "--": -+ -+In all of the above, replace BAT0 with BAT1 to address the 2nd battery (e.g. -+in the UltraBay). -+ -+ -+Raw SMAPI calls: -+ -+/sys/devices/platform/smapi/smapi_request -+This performs raw SMAPI calls. It uses a bad interface that cannot handle -+multiple simultaneous access. Don't touch it, it's for development only. -+If you did touch it, you would so something like -+# echo '211a 100 0 0' > /sys/devices/platform/smapi/smapi_request -+# cat /sys/devices/platform/smapi/smapi_request -+and notice that in the output "211a 34b b2 0 0 0 'OK'", the "4b" in the 2nd -+value, converted to decimal is 75: the current charge stop threshold. -+ -+ -+Model-specific status -+--------------------- -+ -+Works (at least partially) on the following ThinkPad model: -+* A30 -+* G41 -+* R40, R50p, R51, R52 -+* T23, T40, T40p, T41, T41p, T42, T42p, T43, T43p, T60, T61, T400, T410, T420 (partially) -+* X24, X31, X32, X40, X41, X60, X61, X200, X201, X220 (partially) -+* Z60t, Z61m -+ -+Does not work on: -+* X230 and newer -+* T430 and newer -+* Any ThinkPad Edge -+* Any ThinkPad Yoga -+* Any ThinkPad L series -+* Any ThinkPad P series -+ -+Not all functions are available on all models; for detailed status, see: -+ http://thinkwiki.org/wiki/tp_smapi -+ -+Please report success/failure by e-mail or on the Wiki. -+If you get a "not implemented" or "not supported" message, your laptop -+probably just can't do that (at least not via the SMAPI BIOS). -+For negative reports, follow the bug reporting guidelines below. -+If you send me the necessary technical data (i.e., SMAPI function -+interfaces), I will support additional models. -+ -+ -+Additional HDAPS features -+------------------------- -+ -+The modified hdaps driver has several improvements on the one in mainline -+(beyond resolving the conflict with thinkpad_ec and tp_smapi): -+ -+- Fixes reliability and improves support for recent ThinkPad models -+ (especially *60 and newer). Unlike the mainline driver, the modified hdaps -+ correctly follows the Embedded Controller communication protocol. -+ -+- Extends the "invert" parameter to cover all possible axis orientations. -+ The possible values are as follows. -+ Let X,Y denote the hardware readouts. -+ Let R denote the laptop's roll (tilt left/right). -+ Let P denote the laptop's pitch (tilt forward/backward). -+ invert=0: R= X P= Y (same as mainline) -+ invert=1: R=-X P=-Y (same as mainline) -+ invert=2: R=-X P= Y (new) -+ invert=3: R= X P=-Y (new) -+ invert=4: R= Y P= X (new) -+ invert=5: R=-Y P=-X (new) -+ invert=6: R=-Y P= X (new) -+ invert=7: R= Y P=-X (new) -+ It's probably easiest to just try all 8 possibilities and see which yields -+ correct results (e.g., in the hdaps-gl visualisation). -+ -+- Adds a whitelist which automatically sets the correct axis orientation for -+ some models. If the value for your model is wrong or missing, you can override -+ it using the "invert" parameter. Please also update the tables at -+ http://www.thinkwiki.org/wiki/tp_smapi and -+ http://www.thinkwiki.org/wiki/List_of_DMI_IDs -+ and submit a patch for the whitelist in hdaps.c. -+ -+- Provides new attributes: -+ /sys/devices/platform/hdaps/sampling_rate: -+ This determines the frequency at which the host queries the embedded -+ controller for accelerometer data (and informs the hdaps input devices). -+ Default=50. -+ /sys/devices/platform/hdaps/oversampling_ratio: -+ When set to X, the embedded controller is told to do physical accelerometer -+ measurements at a rate that is X times higher than the rate at which -+ the driver reads those measurements (i.e., X*sampling_rate). This -+ makes the readouts from the embedded controller more fresh, and is also -+ useful for the running average filter (see next). Default=5 -+ /sys/devices/platform/hdaps/running_avg_filter_order: -+ When set to X, reported readouts will be the average of the last X physical -+ accelerometer measurements. Current firmware allows 1<=X<=8. Setting to a -+ high value decreases readout fluctuations. The averaging is handled by the -+ embedded controller, so no CPU resources are used. Higher values make the -+ readouts smoother, since it averages out both sensor noise (good) and abrupt -+ changes (bad). Default=2. -+ -+- Provides a second input device, which publishes the raw accelerometer -+ measurements (without the fuzzing needed for joystick emulation). This input -+ device can be matched by a udev rule such as the following (all on one line): -+ KERNEL=="event[0-9]*", ATTRS{phys}=="hdaps/input1", -+ ATTRS{modalias}=="input:b0019v1014p5054e4801-*", -+ SYMLINK+="input/hdaps/accelerometer-event -+ -+A new version of the hdapsd userspace daemon, which uses the input device -+interface instead of polling sysfs, is available seprately. Using this reduces -+the total interrupts per second generated by hdaps+hdapsd (on tickless kernels) -+to 50, down from a value that fluctuates between 50 and 100. Set the -+sampling_rate sysfs attribute to a lower value to further reduce interrupts, -+at the expense of response latency. -+ -+Licensing note: all my changes to the HDAPS driver are licensed under the -+GPL version 2 or, at your option and to the extent allowed by derivation from -+prior works, any later version. My version of hdaps is derived work from the -+mainline version, which at the time of writing is available only under -+GPL version 2. -+ -+Bug reporting -+------------- -+ -+Mail . Please include: -+* Details about your model, -+* Relevant "dmesg" output. Make sure thinkpad_ec and tp_smapi are loaded with -+ the "debug=1" parameter (e.g., use "make load HDAPS=1 DEBUG=1"). -+* Output of "dmidecode | grep -C5 Product" -+* Does the failed functionality works under Windows? -+ -+ -+More about SMAPI -+---------------- -+ -+For hints about what may be possible via the SMAPI BIOS and how, see: -+ -+* IBM Technical Reference Manual for the ThinkPad 770 -+ (http://www-307.ibm.com/pc/support/site.wss/document.do?lndocid=PFAN-3TUQQD) -+* Exported symbols in PWRMGRIF.DLL or TPPWRW32.DLL (e.g., use "objdump -x"). -+* drivers/char/mwave/smapi.c in the Linux kernel tree.* -+* The "thinkpad" SMAPI module (http://tpctl.sourceforge.net). -+* The SMAPI_* constants in tp_smapi.c. -+ -+Note that in the above Technical Reference and in the "thinkpad" module, -+SMAPI is invoked through a function call to some physical address. However, -+the interface used by tp_smapi and the above mwave drive, and apparently -+required by newer ThinkPad, is different: you set the parameters up in the -+CPU's registers and write to ports 0xB2 (the APM control port) and 0x4F; this -+triggers an SMI (System Management Interrupt), causing the CPU to enter -+SMM (System Management Mode) and run the BIOS firmware; the results are -+returned in the CPU's registers. It is not clear what is the relation between -+the two variants of SMAPI, though the assignment of error codes seems to be -+similar. -+ -+In addition, the embedded controller on ThinkPad laptops has a non-standard -+interface at IO ports 0x1600-0x161F (mapped to LCP channel 3 of the H8S chip). -+The interface provides various system management services (currently known: -+battery information and accelerometer readouts). For more information see the -+thinkpad_ec module and the H8S hardware documentation: -+http://documentation.renesas.com/eng/products/mpumcu/rej09b0300_2140bhm.pdf -diff --git a/Documentation/userspace-api/spec_ctrl.rst b/Documentation/userspace-api/spec_ctrl.rst -index 1129c7550a48..7ddd8f667459 100644 ---- a/Documentation/userspace-api/spec_ctrl.rst -+++ b/Documentation/userspace-api/spec_ctrl.rst -@@ -49,6 +49,8 @@ If PR_SPEC_PRCTL is set, then the per-task control of the mitigation is - available. If not set, prctl(PR_SET_SPECULATION_CTRL) for the speculation - misfeature will fail. - -+.. _set_spec_ctrl: -+ - PR_SET_SPECULATION_CTRL - ----------------------- - -diff --git a/Makefile b/Makefile -index 3e4868a6498b..2dd2db3fa178 100644 ---- a/Makefile -+++ b/Makefile -@@ -1,9 +1,9 @@ - # SPDX-License-Identifier: GPL-2.0 - VERSION = 5 - PATCHLEVEL = 2 --SUBLEVEL = 0 --EXTRAVERSION = --NAME = Bobtail Squid -+SUBLEVEL = 8 -+EXTRAVERSION = -lqx2 -+NAME = The Beauty and the Bug - - # *DOCUMENTATION* - # To see a list of typical targets execute "make help" -@@ -467,6 +467,7 @@ KBUILD_CFLAGS_MODULE := -DMODULE - KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds - KBUILD_LDFLAGS := - GCC_PLUGINS_CFLAGS := -+CLANG_FLAGS := - - export ARCH SRCARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC - export CPP AR NM STRIP OBJCOPY OBJDUMP PAHOLE KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS -@@ -519,7 +520,7 @@ endif - - ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),) - ifneq ($(CROSS_COMPILE),) --CLANG_FLAGS := --target=$(notdir $(CROSS_COMPILE:%-=%)) -+CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%)) - GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit)) - CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR) - GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..) -@@ -528,6 +529,7 @@ ifneq ($(GCC_TOOLCHAIN),) - CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN) - endif - CLANG_FLAGS += -no-integrated-as -+CLANG_FLAGS += -Werror=unknown-warning-option - KBUILD_CFLAGS += $(CLANG_FLAGS) - KBUILD_AFLAGS += $(CLANG_FLAGS) - export CLANG_FLAGS -@@ -636,6 +638,10 @@ RETPOLINE_CFLAGS_CLANG := -mretpoline-external-thunk - RETPOLINE_VDSO_CFLAGS_CLANG := -mretpoline - RETPOLINE_CFLAGS := $(call cc-option,$(RETPOLINE_CFLAGS_GCC),$(call cc-option,$(RETPOLINE_CFLAGS_CLANG))) - RETPOLINE_VDSO_CFLAGS := $(call cc-option,$(RETPOLINE_VDSO_CFLAGS_GCC),$(call cc-option,$(RETPOLINE_VDSO_CFLAGS_CLANG))) -+# -mindirect-branch is incompatible with -fcf-protection, so ensure the -+# latter is disabled -+RETPOLINE_CFLAGS += $(call cc-option,-fcf-protection=none,) -+RETPOLINE_VDSO_CFLAGS += $(call cc-option,-fcf-protection=none,) - export RETPOLINE_CFLAGS - export RETPOLINE_VDSO_CFLAGS - -@@ -697,8 +703,12 @@ KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member) - ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE - KBUILD_CFLAGS += -Os - else -+ifdef CONFIG_CC_OPTIMIZE_HARDER -+KBUILD_CFLAGS += -O3 -+else - KBUILD_CFLAGS += -O2 - endif -+endif - - ifdef CONFIG_CC_DISABLE_WARN_MAYBE_UNINITIALIZED - KBUILD_CFLAGS += -Wno-maybe-uninitialized -diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig -index f7b19b813a70..df503f68a2a2 100644 ---- a/arch/alpha/Kconfig -+++ b/arch/alpha/Kconfig -@@ -664,6 +664,8 @@ config HZ - default 1200 if HZ_1200 - default 1024 - -+source "kernel/Kconfig.MuQSS" -+ - config SRM_ENV - tristate "SRM environment through procfs" - depends on PROC_FS -diff --git a/arch/arc/kernel/unwind.c b/arch/arc/kernel/unwind.c -index 182ce67dfe10..c2663fce7f6c 100644 ---- a/arch/arc/kernel/unwind.c -+++ b/arch/arc/kernel/unwind.c -@@ -181,11 +181,6 @@ static void *__init unw_hdr_alloc_early(unsigned long sz) - return memblock_alloc_from(sz, sizeof(unsigned int), MAX_DMA_ADDRESS); - } - --static void *unw_hdr_alloc(unsigned long sz) --{ -- return kmalloc(sz, GFP_KERNEL); --} -- - static void init_unwind_table(struct unwind_table *table, const char *name, - const void *core_start, unsigned long core_size, - const void *init_start, unsigned long init_size, -@@ -366,6 +361,10 @@ static void init_unwind_hdr(struct unwind_table *table, - } - - #ifdef CONFIG_MODULES -+static void *unw_hdr_alloc(unsigned long sz) -+{ -+ return kmalloc(sz, GFP_KERNEL); -+} - - static struct unwind_table *last_table; - -diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig -index 8869742a85df..edd126f7f26a 100644 ---- a/arch/arm/Kconfig -+++ b/arch/arm/Kconfig -@@ -1306,6 +1306,8 @@ config SCHED_SMT - MultiThreading at a cost of slightly increased overhead in some - places. If unsure say N here. - -+source "kernel/Kconfig.MuQSS" -+ - config HAVE_ARM_SCU - bool - help -diff --git a/arch/arm/boot/dts/gemini-dlink-dir-685.dts b/arch/arm/boot/dts/gemini-dlink-dir-685.dts -index 3613f05f8a80..bfaa2de63a10 100644 ---- a/arch/arm/boot/dts/gemini-dlink-dir-685.dts -+++ b/arch/arm/boot/dts/gemini-dlink-dir-685.dts -@@ -64,7 +64,7 @@ - gpio-sck = <&gpio1 5 GPIO_ACTIVE_HIGH>; - gpio-miso = <&gpio1 8 GPIO_ACTIVE_HIGH>; - gpio-mosi = <&gpio1 7 GPIO_ACTIVE_HIGH>; -- cs-gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>; -+ cs-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>; - num-chipselects = <1>; - - panel: display@0 { -diff --git a/arch/arm/boot/dts/rk3288-veyron-mickey.dts b/arch/arm/boot/dts/rk3288-veyron-mickey.dts -index e852594417b5..b13f87792e9f 100644 ---- a/arch/arm/boot/dts/rk3288-veyron-mickey.dts -+++ b/arch/arm/boot/dts/rk3288-veyron-mickey.dts -@@ -128,10 +128,6 @@ - }; - }; - --&emmc { -- /delete-property/mmc-hs200-1_8v; --}; -- - &i2c2 { - status = "disabled"; - }; -diff --git a/arch/arm/boot/dts/rk3288-veyron-minnie.dts b/arch/arm/boot/dts/rk3288-veyron-minnie.dts -index 468a1818545d..ce57881625ec 100644 ---- a/arch/arm/boot/dts/rk3288-veyron-minnie.dts -+++ b/arch/arm/boot/dts/rk3288-veyron-minnie.dts -@@ -90,10 +90,6 @@ - pwm-off-delay-ms = <200>; - }; - --&emmc { -- /delete-property/mmc-hs200-1_8v; --}; -- - &gpio_keys { - pinctrl-0 = <&pwr_key_l &ap_lid_int_l &volum_down_l &volum_up_l>; - -diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi -index aa017abf4f42..f7bc886a4b51 100644 ---- a/arch/arm/boot/dts/rk3288.dtsi -+++ b/arch/arm/boot/dts/rk3288.dtsi -@@ -231,6 +231,7 @@ - , - ; - clock-frequency = <24000000>; -+ arm,no-tick-in-suspend; - }; - - timer: timer@ff810000 { -diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig -index 1c518b8ee520..21a59efd1a2c 100644 ---- a/arch/arm/mach-exynos/Kconfig -+++ b/arch/arm/mach-exynos/Kconfig -@@ -106,7 +106,7 @@ config SOC_EXYNOS5420 - bool "SAMSUNG EXYNOS5420" - default y - depends on ARCH_EXYNOS5 -- select MCPM if SMP -+ select EXYNOS_MCPM if SMP - select ARM_CCI400_PORT_CTRL - select ARM_CPU_SUSPEND - -@@ -115,6 +115,10 @@ config SOC_EXYNOS5800 - default y - depends on SOC_EXYNOS5420 - -+config EXYNOS_MCPM -+ bool -+ select MCPM -+ - config EXYNOS_CPU_SUSPEND - bool - select ARM_CPU_SUSPEND -diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile -index 264dbaa89c3d..5abf3db23912 100644 ---- a/arch/arm/mach-exynos/Makefile -+++ b/arch/arm/mach-exynos/Makefile -@@ -18,5 +18,5 @@ plus_sec := $(call as-instr,.arch_extension sec,+sec) - AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec) - AFLAGS_sleep.o :=-Wa,-march=armv7-a$(plus_sec) - --obj-$(CONFIG_MCPM) += mcpm-exynos.o -+obj-$(CONFIG_EXYNOS_MCPM) += mcpm-exynos.o - CFLAGS_mcpm-exynos.o += -march=armv7-a -diff --git a/arch/arm/mach-exynos/suspend.c b/arch/arm/mach-exynos/suspend.c -index be122af0de8f..8b1e6ab8504f 100644 ---- a/arch/arm/mach-exynos/suspend.c -+++ b/arch/arm/mach-exynos/suspend.c -@@ -268,7 +268,7 @@ static int exynos5420_cpu_suspend(unsigned long arg) - unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); - unsigned int cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); - -- if (IS_ENABLED(CONFIG_MCPM)) { -+ if (IS_ENABLED(CONFIG_EXYNOS_MCPM)) { - mcpm_set_entry_vector(cpu, cluster, exynos_cpu_resume); - mcpm_cpu_suspend(); - } -@@ -351,7 +351,7 @@ static void exynos5420_pm_prepare(void) - exynos_pm_enter_sleep_mode(); - - /* ensure at least INFORM0 has the resume address */ -- if (IS_ENABLED(CONFIG_MCPM)) -+ if (IS_ENABLED(CONFIG_EXYNOS_MCPM)) - pmu_raw_writel(__pa_symbol(mcpm_entry_point), S5P_INFORM0); - - tmp = pmu_raw_readl(EXYNOS_L2_OPTION(0)); -@@ -455,7 +455,7 @@ static void exynos5420_prepare_pm_resume(void) - mpidr = read_cpuid_mpidr(); - cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); - -- if (IS_ENABLED(CONFIG_MCPM)) -+ if (IS_ENABLED(CONFIG_EXYNOS_MCPM)) - WARN_ON(mcpm_cpu_powered_up()); - - if (IS_ENABLED(CONFIG_HW_PERF_EVENTS) && cluster != 0) { -diff --git a/arch/arm/mach-rpc/dma.c b/arch/arm/mach-rpc/dma.c -index 488d5c3b37f4..799e0b016b62 100644 ---- a/arch/arm/mach-rpc/dma.c -+++ b/arch/arm/mach-rpc/dma.c -@@ -128,7 +128,7 @@ static irqreturn_t iomd_dma_handle(int irq, void *dev_id) - } while (1); - - idma->state = ~DMA_ST_AB; -- disable_irq(irq); -+ disable_irq_nosync(irq); - - return IRQ_HANDLED; - } -@@ -177,6 +177,9 @@ static void iomd_enable_dma(unsigned int chan, dma_t *dma) - DMA_FROM_DEVICE : DMA_TO_DEVICE); - } - -+ idma->dma_addr = idma->dma.sg->dma_address; -+ idma->dma_len = idma->dma.sg->length; -+ - iomd_writeb(DMA_CR_C, dma_base + CR); - idma->state = DMA_ST_AB; - } -diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig -index 697ea0510729..51983654dc4b 100644 ---- a/arch/arm64/Kconfig -+++ b/arch/arm64/Kconfig -@@ -260,7 +260,8 @@ config GENERIC_CALIBRATE_DELAY - def_bool y - - config ZONE_DMA32 -- def_bool y -+ bool "Support DMA32 zone" if EXPERT -+ default y - - config HAVE_GENERIC_GUP - def_bool y -@@ -825,6 +826,8 @@ config SCHED_SMT - MultiThreading at a cost of slightly increased overhead in some - places. If unsure say N here. - -+source "kernel/Kconfig.MuQSS" -+ - config NR_CPUS - int "Maximum number of CPUs (2-4096)" - range 2 4096 -diff --git a/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dtsi b/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dtsi -index 329f8ceeebea..205071b45a32 100644 ---- a/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dtsi -+++ b/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dtsi -@@ -184,6 +184,8 @@ - num-lanes = <4>; - num-viewport = <8>; - reset-gpios = <&cp0_gpio2 20 GPIO_ACTIVE_LOW>; -+ ranges = <0x81000000 0x0 0xf9010000 0x0 0xf9010000 0x0 0x10000 -+ 0x82000000 0x0 0xc0000000 0x0 0xc0000000 0x0 0x20000000>; - status = "okay"; - }; - -diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi b/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi -index 4dcd0d36189a..f70cd83f2bed 100644 ---- a/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi -+++ b/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi -@@ -328,7 +328,8 @@ - regulator-max-microvolt = <1320000>; - enable-gpios = <&pmic 6 GPIO_ACTIVE_HIGH>; - regulator-ramp-delay = <80>; -- regulator-enable-ramp-delay = <1000>; -+ regulator-enable-ramp-delay = <2000>; -+ regulator-settling-time-us = <160>; - }; - }; - }; -diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts b/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts -index 5d0181908f45..f187d4f3ade3 100644 ---- a/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts -+++ b/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts -@@ -633,17 +633,16 @@ - }; - - vdd_gpu: regulator@6 { -- compatible = "regulator-fixed"; -+ compatible = "pwm-regulator"; - reg = <6>; -- -+ pwms = <&pwm 1 4880>; - regulator-name = "VDD_GPU"; -- regulator-min-microvolt = <5000000>; -- regulator-max-microvolt = <5000000>; -- regulator-enable-ramp-delay = <250>; -- -- gpio = <&pmic 6 GPIO_ACTIVE_HIGH>; -- enable-active-high; -- -+ regulator-min-microvolt = <710000>; -+ regulator-max-microvolt = <1320000>; -+ regulator-ramp-delay = <80>; -+ regulator-enable-ramp-delay = <2000>; -+ regulator-settling-time-us = <160>; -+ enable-gpios = <&pmic 6 GPIO_ACTIVE_HIGH>; - vin-supply = <&vdd_5v0_sys>; - }; - }; -diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi b/arch/arm64/boot/dts/nvidia/tegra210.dtsi -index a550c0a4d572..cd23bdbeda85 100644 ---- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi -+++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi -@@ -1258,7 +1258,7 @@ - compatible = "nvidia,tegra210-agic"; - #interrupt-cells = <3>; - interrupt-controller; -- reg = <0x702f9000 0x2000>, -+ reg = <0x702f9000 0x1000>, - <0x702fa000 0x2000>; - interrupts = ; - clocks = <&tegra_car TEGRA210_CLK_APE>; -diff --git a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi -index 2c3127167e3c..d987d6741e40 100644 ---- a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi -+++ b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi -@@ -118,7 +118,7 @@ - }; - - vreg_l3_1p05: l3 { -- regulator-min-microvolt = <1050000>; -+ regulator-min-microvolt = <1048000>; - regulator-max-microvolt = <1160000>; - }; - -diff --git a/arch/arm64/boot/dts/qcom/qcs404.dtsi b/arch/arm64/boot/dts/qcom/qcs404.dtsi -index ffedf9640af7..65a2cbeb28be 100644 ---- a/arch/arm64/boot/dts/qcom/qcs404.dtsi -+++ b/arch/arm64/boot/dts/qcom/qcs404.dtsi -@@ -383,6 +383,7 @@ - compatible = "qcom,gcc-qcs404"; - reg = <0x01800000 0x80000>; - #clock-cells = <1>; -+ #reset-cells = <1>; - - assigned-clocks = <&gcc GCC_APSS_AHB_CLK_SRC>; - assigned-clock-rates = <19200000>; -diff --git a/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi -index 04623e52ac5d..1bc1579674e5 100644 ---- a/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi -+++ b/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi -@@ -565,12 +565,11 @@ - status = "okay"; - - u2phy0_otg: otg-port { -- phy-supply = <&vcc5v0_typec0>; - status = "okay"; - }; - - u2phy0_host: host-port { -- phy-supply = <&vcc5v0_host>; -+ phy-supply = <&vcc5v0_typec0>; - status = "okay"; - }; - }; -@@ -620,7 +619,7 @@ - - &usbdrd_dwc3_0 { - status = "okay"; -- dr_mode = "otg"; -+ dr_mode = "host"; - }; - - &usbdrd3_1 { -diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi -index 196ac9b78076..89594a7276f4 100644 ---- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi -+++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi -@@ -1706,11 +1706,11 @@ - reg = <0x0 0xff914000 0x0 0x100>, <0x0 0xff915000 0x0 0x100>; - interrupts = ; - interrupt-names = "isp0_mmu"; -- clocks = <&cru ACLK_ISP0_NOC>, <&cru HCLK_ISP0_NOC>; -+ clocks = <&cru ACLK_ISP0_WRAPPER>, <&cru HCLK_ISP0_WRAPPER>; - clock-names = "aclk", "iface"; - #iommu-cells = <0>; -+ power-domains = <&power RK3399_PD_ISP0>; - rockchip,disable-mmu-reset; -- status = "disabled"; - }; - - isp1_mmu: iommu@ff924000 { -@@ -1718,11 +1718,11 @@ - reg = <0x0 0xff924000 0x0 0x100>, <0x0 0xff925000 0x0 0x100>; - interrupts = ; - interrupt-names = "isp1_mmu"; -- clocks = <&cru ACLK_ISP1_NOC>, <&cru HCLK_ISP1_NOC>; -+ clocks = <&cru ACLK_ISP1_WRAPPER>, <&cru HCLK_ISP1_WRAPPER>; - clock-names = "aclk", "iface"; - #iommu-cells = <0>; -+ power-domains = <&power RK3399_PD_ISP1>; - rockchip,disable-mmu-reset; -- status = "disabled"; - }; - - hdmi_sound: hdmi-sound { -diff --git a/arch/arm64/crypto/sha1-ce-glue.c b/arch/arm64/crypto/sha1-ce-glue.c -index ecb0f67e5998..bdc1b6d7aff7 100644 ---- a/arch/arm64/crypto/sha1-ce-glue.c -+++ b/arch/arm64/crypto/sha1-ce-glue.c -@@ -52,7 +52,7 @@ static int sha1_ce_finup(struct shash_desc *desc, const u8 *data, - unsigned int len, u8 *out) - { - struct sha1_ce_state *sctx = shash_desc_ctx(desc); -- bool finalize = !sctx->sst.count && !(len % SHA1_BLOCK_SIZE); -+ bool finalize = !sctx->sst.count && !(len % SHA1_BLOCK_SIZE) && len; - - if (!crypto_simd_usable()) - return crypto_sha1_finup(desc, data, len, out); -diff --git a/arch/arm64/crypto/sha2-ce-glue.c b/arch/arm64/crypto/sha2-ce-glue.c -index 955c3c2d3f5a..604a01a4ede6 100644 ---- a/arch/arm64/crypto/sha2-ce-glue.c -+++ b/arch/arm64/crypto/sha2-ce-glue.c -@@ -57,7 +57,7 @@ static int sha256_ce_finup(struct shash_desc *desc, const u8 *data, - unsigned int len, u8 *out) - { - struct sha256_ce_state *sctx = shash_desc_ctx(desc); -- bool finalize = !sctx->sst.count && !(len % SHA256_BLOCK_SIZE); -+ bool finalize = !sctx->sst.count && !(len % SHA256_BLOCK_SIZE) && len; - - if (!crypto_simd_usable()) { - if (len) -diff --git a/arch/arm64/include/asm/arch_gicv3.h b/arch/arm64/include/asm/arch_gicv3.h -index 2247908e55d6..79155a8cfe7c 100644 ---- a/arch/arm64/include/asm/arch_gicv3.h -+++ b/arch/arm64/include/asm/arch_gicv3.h -@@ -152,7 +152,9 @@ static inline bool gic_prio_masking_enabled(void) - - static inline void gic_pmr_mask_irqs(void) - { -- BUILD_BUG_ON(GICD_INT_DEF_PRI <= GIC_PRIO_IRQOFF); -+ BUILD_BUG_ON(GICD_INT_DEF_PRI < (GIC_PRIO_IRQOFF | -+ GIC_PRIO_PSR_I_SET)); -+ BUILD_BUG_ON(GICD_INT_DEF_PRI >= GIC_PRIO_IRQON); - gic_write_pmr(GIC_PRIO_IRQOFF); - } - -diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h -index 570d195a184d..e3a15c751b13 100644 ---- a/arch/arm64/include/asm/assembler.h -+++ b/arch/arm64/include/asm/assembler.h -@@ -96,7 +96,11 @@ - * RAS Error Synchronization barrier - */ - .macro esb -+#ifdef CONFIG_ARM64_RAS_EXTN - hint #16 -+#else -+ nop -+#endif - .endm - - /* -diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h -index 373799b7982f..0a61344ab243 100644 ---- a/arch/arm64/include/asm/cpufeature.h -+++ b/arch/arm64/include/asm/cpufeature.h -@@ -35,9 +35,10 @@ - */ - - enum ftr_type { -- FTR_EXACT, /* Use a predefined safe value */ -- FTR_LOWER_SAFE, /* Smaller value is safe */ -- FTR_HIGHER_SAFE,/* Bigger value is safe */ -+ FTR_EXACT, /* Use a predefined safe value */ -+ FTR_LOWER_SAFE, /* Smaller value is safe */ -+ FTR_HIGHER_SAFE, /* Bigger value is safe */ -+ FTR_HIGHER_OR_ZERO_SAFE, /* Bigger value is safe, but 0 is biggest */ - }; - - #define FTR_STRICT true /* SANITY check strict matching required */ -diff --git a/arch/arm64/include/asm/daifflags.h b/arch/arm64/include/asm/daifflags.h -index 6dd8a8723525..ae7e605085d7 100644 ---- a/arch/arm64/include/asm/daifflags.h -+++ b/arch/arm64/include/asm/daifflags.h -@@ -7,6 +7,7 @@ - - #include - -+#include - #include - - #define DAIF_PROCCTX 0 -@@ -21,6 +22,11 @@ static inline void local_daif_mask(void) - : - : - : "memory"); -+ -+ /* Don't really care for a dsb here, we don't intend to enable IRQs */ -+ if (system_uses_irq_prio_masking()) -+ gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET); -+ - trace_hardirqs_off(); - } - -@@ -32,7 +38,7 @@ static inline unsigned long local_daif_save(void) - - if (system_uses_irq_prio_masking()) { - /* If IRQs are masked with PMR, reflect it in the flags */ -- if (read_sysreg_s(SYS_ICC_PMR_EL1) <= GIC_PRIO_IRQOFF) -+ if (read_sysreg_s(SYS_ICC_PMR_EL1) != GIC_PRIO_IRQON) - flags |= PSR_I_BIT; - } - -@@ -48,36 +54,44 @@ static inline void local_daif_restore(unsigned long flags) - if (!irq_disabled) { - trace_hardirqs_on(); - -- if (system_uses_irq_prio_masking()) -- arch_local_irq_enable(); -- } else if (!(flags & PSR_A_BIT)) { -- /* -- * If interrupts are disabled but we can take -- * asynchronous errors, we can take NMIs -- */ - if (system_uses_irq_prio_masking()) { -- flags &= ~PSR_I_BIT; -+ gic_write_pmr(GIC_PRIO_IRQON); -+ dsb(sy); -+ } -+ } else if (system_uses_irq_prio_masking()) { -+ u64 pmr; -+ -+ if (!(flags & PSR_A_BIT)) { - /* -- * There has been concern that the write to daif -- * might be reordered before this write to PMR. -- * From the ARM ARM DDI 0487D.a, section D1.7.1 -- * "Accessing PSTATE fields": -- * Writes to the PSTATE fields have side-effects on -- * various aspects of the PE operation. All of these -- * side-effects are guaranteed: -- * - Not to be visible to earlier instructions in -- * the execution stream. -- * - To be visible to later instructions in the -- * execution stream -- * -- * Also, writes to PMR are self-synchronizing, so no -- * interrupts with a lower priority than PMR is signaled -- * to the PE after the write. -- * -- * So we don't need additional synchronization here. -+ * If interrupts are disabled but we can take -+ * asynchronous errors, we can take NMIs - */ -- arch_local_irq_disable(); -+ flags &= ~PSR_I_BIT; -+ pmr = GIC_PRIO_IRQOFF; -+ } else { -+ pmr = GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET; - } -+ -+ /* -+ * There has been concern that the write to daif -+ * might be reordered before this write to PMR. -+ * From the ARM ARM DDI 0487D.a, section D1.7.1 -+ * "Accessing PSTATE fields": -+ * Writes to the PSTATE fields have side-effects on -+ * various aspects of the PE operation. All of these -+ * side-effects are guaranteed: -+ * - Not to be visible to earlier instructions in -+ * the execution stream. -+ * - To be visible to later instructions in the -+ * execution stream -+ * -+ * Also, writes to PMR are self-synchronizing, so no -+ * interrupts with a lower priority than PMR is signaled -+ * to the PE after the write. -+ * -+ * So we don't need additional synchronization here. -+ */ -+ gic_write_pmr(pmr); - } - - write_sysreg(flags, daif); -diff --git a/arch/arm64/include/asm/irqflags.h b/arch/arm64/include/asm/irqflags.h -index 66853fde60f9..5b7cef8c9241 100644 ---- a/arch/arm64/include/asm/irqflags.h -+++ b/arch/arm64/include/asm/irqflags.h -@@ -56,43 +56,46 @@ static inline void arch_local_irq_disable(void) - */ - static inline unsigned long arch_local_save_flags(void) - { -- unsigned long daif_bits; - unsigned long flags; - -- daif_bits = read_sysreg(daif); -- -- /* -- * The asm is logically equivalent to: -- * -- * if (system_uses_irq_prio_masking()) -- * flags = (daif_bits & PSR_I_BIT) ? -- * GIC_PRIO_IRQOFF : -- * read_sysreg_s(SYS_ICC_PMR_EL1); -- * else -- * flags = daif_bits; -- */ - asm volatile(ALTERNATIVE( -- "mov %0, %1\n" -- "nop\n" -- "nop", -- __mrs_s("%0", SYS_ICC_PMR_EL1) -- "ands %1, %1, " __stringify(PSR_I_BIT) "\n" -- "csel %0, %0, %2, eq", -- ARM64_HAS_IRQ_PRIO_MASKING) -- : "=&r" (flags), "+r" (daif_bits) -- : "r" ((unsigned long) GIC_PRIO_IRQOFF) -+ "mrs %0, daif", -+ __mrs_s("%0", SYS_ICC_PMR_EL1), -+ ARM64_HAS_IRQ_PRIO_MASKING) -+ : "=&r" (flags) -+ : - : "memory"); - - return flags; - } - -+static inline int arch_irqs_disabled_flags(unsigned long flags) -+{ -+ int res; -+ -+ asm volatile(ALTERNATIVE( -+ "and %w0, %w1, #" __stringify(PSR_I_BIT), -+ "eor %w0, %w1, #" __stringify(GIC_PRIO_IRQON), -+ ARM64_HAS_IRQ_PRIO_MASKING) -+ : "=&r" (res) -+ : "r" ((int) flags) -+ : "memory"); -+ -+ return res; -+} -+ - static inline unsigned long arch_local_irq_save(void) - { - unsigned long flags; - - flags = arch_local_save_flags(); - -- arch_local_irq_disable(); -+ /* -+ * There are too many states with IRQs disabled, just keep the current -+ * state if interrupts are already disabled/masked. -+ */ -+ if (!arch_irqs_disabled_flags(flags)) -+ arch_local_irq_disable(); - - return flags; - } -@@ -113,21 +116,5 @@ static inline void arch_local_irq_restore(unsigned long flags) - : "memory"); - } - --static inline int arch_irqs_disabled_flags(unsigned long flags) --{ -- int res; -- -- asm volatile(ALTERNATIVE( -- "and %w0, %w1, #" __stringify(PSR_I_BIT) "\n" -- "nop", -- "cmp %w1, #" __stringify(GIC_PRIO_IRQOFF) "\n" -- "cset %w0, ls", -- ARM64_HAS_IRQ_PRIO_MASKING) -- : "=&r" (res) -- : "r" ((int) flags) -- : "memory"); -- -- return res; --} - #endif - #endif -diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h -index c328191aa202..9f19c354b165 100644 ---- a/arch/arm64/include/asm/kvm_host.h -+++ b/arch/arm64/include/asm/kvm_host.h -@@ -597,11 +597,12 @@ static inline void kvm_arm_vhe_guest_enter(void) - * will not signal the CPU of interrupts of lower priority, and the - * only way to get out will be via guest exceptions. - * Naturally, we want to avoid this. -+ * -+ * local_daif_mask() already sets GIC_PRIO_PSR_I_SET, we just need a -+ * dsb to ensure the redistributor is forwards EL2 IRQs to the CPU. - */ -- if (system_uses_irq_prio_masking()) { -- gic_write_pmr(GIC_PRIO_IRQON); -+ if (system_uses_irq_prio_masking()) - dsb(sy); -- } - } - - static inline void kvm_arm_vhe_guest_exit(void) -diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h -index dad858b6adc6..81693244f58d 100644 ---- a/arch/arm64/include/asm/ptrace.h -+++ b/arch/arm64/include/asm/ptrace.h -@@ -24,9 +24,15 @@ - * means masking more IRQs (or at least that the same IRQs remain masked). - * - * To mask interrupts, we clear the most significant bit of PMR. -+ * -+ * Some code sections either automatically switch back to PSR.I or explicitly -+ * require to not use priority masking. If bit GIC_PRIO_PSR_I_SET is included -+ * in the the priority mask, it indicates that PSR.I should be set and -+ * interrupt disabling temporarily does not rely on IRQ priorities. - */ --#define GIC_PRIO_IRQON 0xf0 --#define GIC_PRIO_IRQOFF (GIC_PRIO_IRQON & ~0x80) -+#define GIC_PRIO_IRQON 0xc0 -+#define GIC_PRIO_IRQOFF (GIC_PRIO_IRQON & ~0x80) -+#define GIC_PRIO_PSR_I_SET (1 << 4) - - /* Additional SPSR bits not exposed in the UABI */ - #define PSR_IL_BIT (1 << 20) -diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c -index 2804330c95dc..3a58e9db5cfe 100644 ---- a/arch/arm64/kernel/acpi.c -+++ b/arch/arm64/kernel/acpi.c -@@ -152,10 +152,14 @@ static int __init acpi_fadt_sanity_check(void) - */ - if (table->revision < 5 || - (table->revision == 5 && fadt->minor_revision < 1)) { -- pr_err("Unsupported FADT revision %d.%d, should be 5.1+\n", -+ pr_err(FW_BUG "Unsupported FADT revision %d.%d, should be 5.1+\n", - table->revision, fadt->minor_revision); -- ret = -EINVAL; -- goto out; -+ -+ if (!fadt->arm_boot_flags) { -+ ret = -EINVAL; -+ goto out; -+ } -+ pr_err("FADT has ARM boot flags set, assuming 5.1\n"); - } - - if (!(fadt->flags & ACPI_FADT_HW_REDUCED)) { -diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c -index aabdabf52fdb..ae63eedea1c1 100644 ---- a/arch/arm64/kernel/cpufeature.c -+++ b/arch/arm64/kernel/cpufeature.c -@@ -225,8 +225,8 @@ static const struct arm64_ftr_bits ftr_ctr[] = { - ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, 31, 1, 1), /* RES1 */ - ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, CTR_DIC_SHIFT, 1, 1), - ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, CTR_IDC_SHIFT, 1, 1), -- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, CTR_CWG_SHIFT, 4, 0), -- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, CTR_ERG_SHIFT, 4, 0), -+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_OR_ZERO_SAFE, CTR_CWG_SHIFT, 4, 0), -+ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_OR_ZERO_SAFE, CTR_ERG_SHIFT, 4, 0), - ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, CTR_DMINLINE_SHIFT, 4, 1), - /* - * Linux can handle differing I-cache policies. Userspace JITs will -@@ -468,6 +468,10 @@ static s64 arm64_ftr_safe_value(const struct arm64_ftr_bits *ftrp, s64 new, - case FTR_LOWER_SAFE: - ret = new < cur ? new : cur; - break; -+ case FTR_HIGHER_OR_ZERO_SAFE: -+ if (!cur || !new) -+ break; -+ /* Fallthrough */ - case FTR_HIGHER_SAFE: - ret = new > cur ? new : cur; - break; -diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S -index 2df8d0a1d980..9cdc4592da3e 100644 ---- a/arch/arm64/kernel/entry.S -+++ b/arch/arm64/kernel/entry.S -@@ -247,6 +247,7 @@ alternative_else_nop_endif - /* - * Registers that may be useful after this macro is invoked: - * -+ * x20 - ICC_PMR_EL1 - * x21 - aborted SP - * x22 - aborted PC - * x23 - aborted PSTATE -@@ -424,6 +425,38 @@ tsk .req x28 // current thread_info - irq_stack_exit - .endm - -+#ifdef CONFIG_ARM64_PSEUDO_NMI -+ /* -+ * Set res to 0 if irqs were unmasked in interrupted context. -+ * Otherwise set res to non-0 value. -+ */ -+ .macro test_irqs_unmasked res:req, pmr:req -+alternative_if ARM64_HAS_IRQ_PRIO_MASKING -+ sub \res, \pmr, #GIC_PRIO_IRQON -+alternative_else -+ mov \res, xzr -+alternative_endif -+ .endm -+#endif -+ -+ .macro gic_prio_kentry_setup, tmp:req -+#ifdef CONFIG_ARM64_PSEUDO_NMI -+ alternative_if ARM64_HAS_IRQ_PRIO_MASKING -+ mov \tmp, #(GIC_PRIO_PSR_I_SET | GIC_PRIO_IRQON) -+ msr_s SYS_ICC_PMR_EL1, \tmp -+ alternative_else_nop_endif -+#endif -+ .endm -+ -+ .macro gic_prio_irq_setup, pmr:req, tmp:req -+#ifdef CONFIG_ARM64_PSEUDO_NMI -+ alternative_if ARM64_HAS_IRQ_PRIO_MASKING -+ orr \tmp, \pmr, #GIC_PRIO_PSR_I_SET -+ msr_s SYS_ICC_PMR_EL1, \tmp -+ alternative_else_nop_endif -+#endif -+ .endm -+ - .text - - /* -@@ -602,6 +635,7 @@ el1_dbg: - cmp x24, #ESR_ELx_EC_BRK64 // if BRK64 - cinc x24, x24, eq // set bit '0' - tbz x24, #0, el1_inv // EL1 only -+ gic_prio_kentry_setup tmp=x3 - mrs x0, far_el1 - mov x2, sp // struct pt_regs - bl do_debug_exception -@@ -619,20 +653,18 @@ ENDPROC(el1_sync) - .align 6 - el1_irq: - kernel_entry 1 -+ gic_prio_irq_setup pmr=x20, tmp=x1 - enable_da_f --#ifdef CONFIG_TRACE_IRQFLAGS -+ - #ifdef CONFIG_ARM64_PSEUDO_NMI --alternative_if ARM64_HAS_IRQ_PRIO_MASKING -- ldr x20, [sp, #S_PMR_SAVE] --alternative_else -- mov x20, #GIC_PRIO_IRQON --alternative_endif -- cmp x20, #GIC_PRIO_IRQOFF -- /* Irqs were disabled, don't trace */ -- b.ls 1f -+ test_irqs_unmasked res=x0, pmr=x20 -+ cbz x0, 1f -+ bl asm_nmi_enter -+1: - #endif -+ -+#ifdef CONFIG_TRACE_IRQFLAGS - bl trace_hardirqs_off --1: - #endif - - irq_handler -@@ -651,14 +683,23 @@ alternative_else_nop_endif - bl preempt_schedule_irq // irq en/disable is done inside - 1: - #endif --#ifdef CONFIG_TRACE_IRQFLAGS -+ - #ifdef CONFIG_ARM64_PSEUDO_NMI - /* -- * if IRQs were disabled when we received the interrupt, we have an NMI -- * and we are not re-enabling interrupt upon eret. Skip tracing. -+ * When using IRQ priority masking, we can get spurious interrupts while -+ * PMR is set to GIC_PRIO_IRQOFF. An NMI might also have occurred in a -+ * section with interrupts disabled. Skip tracing in those cases. - */ -- cmp x20, #GIC_PRIO_IRQOFF -- b.ls 1f -+ test_irqs_unmasked res=x0, pmr=x20 -+ cbz x0, 1f -+ bl asm_nmi_exit -+1: -+#endif -+ -+#ifdef CONFIG_TRACE_IRQFLAGS -+#ifdef CONFIG_ARM64_PSEUDO_NMI -+ test_irqs_unmasked res=x0, pmr=x20 -+ cbnz x0, 1f - #endif - bl trace_hardirqs_on - 1: -@@ -776,6 +817,7 @@ el0_ia: - * Instruction abort handling - */ - mrs x26, far_el1 -+ gic_prio_kentry_setup tmp=x0 - enable_da_f - #ifdef CONFIG_TRACE_IRQFLAGS - bl trace_hardirqs_off -@@ -821,6 +863,7 @@ el0_sp_pc: - * Stack or PC alignment exception handling - */ - mrs x26, far_el1 -+ gic_prio_kentry_setup tmp=x0 - enable_da_f - #ifdef CONFIG_TRACE_IRQFLAGS - bl trace_hardirqs_off -@@ -855,11 +898,12 @@ el0_dbg: - * Debug exception handling - */ - tbnz x24, #0, el0_inv // EL0 only -+ gic_prio_kentry_setup tmp=x3 - mrs x0, far_el1 - mov x1, x25 - mov x2, sp - bl do_debug_exception -- enable_daif -+ enable_da_f - ct_user_exit - b ret_to_user - el0_inv: -@@ -876,7 +920,9 @@ ENDPROC(el0_sync) - el0_irq: - kernel_entry 0 - el0_irq_naked: -+ gic_prio_irq_setup pmr=x20, tmp=x0 - enable_da_f -+ - #ifdef CONFIG_TRACE_IRQFLAGS - bl trace_hardirqs_off - #endif -@@ -898,6 +944,7 @@ ENDPROC(el0_irq) - el1_error: - kernel_entry 1 - mrs x1, esr_el1 -+ gic_prio_kentry_setup tmp=x2 - enable_dbg - mov x0, sp - bl do_serror -@@ -908,10 +955,11 @@ el0_error: - kernel_entry 0 - el0_error_naked: - mrs x1, esr_el1 -+ gic_prio_kentry_setup tmp=x2 - enable_dbg - mov x0, sp - bl do_serror -- enable_daif -+ enable_da_f - ct_user_exit - b ret_to_user - ENDPROC(el0_error) -@@ -932,6 +980,7 @@ work_pending: - */ - ret_to_user: - disable_daif -+ gic_prio_kentry_setup tmp=x3 - ldr x1, [tsk, #TSK_TI_FLAGS] - and x2, x1, #_TIF_WORK_MASK - cbnz x2, work_pending -@@ -948,6 +997,7 @@ ENDPROC(ret_to_user) - */ - .align 6 - el0_svc: -+ gic_prio_kentry_setup tmp=x1 - mov x0, sp - bl el0_svc_handler - b ret_to_user -diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c -index dceb84520948..67b3bae50b92 100644 ---- a/arch/arm64/kernel/hw_breakpoint.c -+++ b/arch/arm64/kernel/hw_breakpoint.c -@@ -536,13 +536,14 @@ int hw_breakpoint_arch_parse(struct perf_event *bp, - /* Aligned */ - break; - case 1: -- /* Allow single byte watchpoint. */ -- if (hw->ctrl.len == ARM_BREAKPOINT_LEN_1) -- break; - case 2: - /* Allow halfword watchpoints and breakpoints. */ - if (hw->ctrl.len == ARM_BREAKPOINT_LEN_2) - break; -+ case 3: -+ /* Allow single byte watchpoint. */ -+ if (hw->ctrl.len == ARM_BREAKPOINT_LEN_1) -+ break; - default: - return -EINVAL; - } -diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c -index c70034fbd4ce..4a8506c3869b 100644 ---- a/arch/arm64/kernel/irq.c -+++ b/arch/arm64/kernel/irq.c -@@ -16,8 +16,10 @@ - #include - #include - #include -+#include - #include - #include -+#include - #include - - unsigned long irq_err_count; -@@ -65,3 +67,18 @@ void __init init_IRQ(void) - if (!handle_arch_irq) - panic("No interrupt controller found."); - } -+ -+/* -+ * Stubs to make nmi_enter/exit() code callable from ASM -+ */ -+asmlinkage void notrace asm_nmi_enter(void) -+{ -+ nmi_enter(); -+} -+NOKPROBE_SYMBOL(asm_nmi_enter); -+ -+asmlinkage void notrace asm_nmi_exit(void) -+{ -+ nmi_exit(); -+} -+NOKPROBE_SYMBOL(asm_nmi_exit); -diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c -index 9856395ccdb7..6a869d9f304f 100644 ---- a/arch/arm64/kernel/process.c -+++ b/arch/arm64/kernel/process.c -@@ -83,7 +83,7 @@ static void __cpu_do_idle_irqprio(void) - * be raised. - */ - pmr = gic_read_pmr(); -- gic_write_pmr(GIC_PRIO_IRQON); -+ gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET); - - __cpu_do_idle(); - -diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c -index 6dcf9607d770..a1aed6a1b8da 100644 ---- a/arch/arm64/kernel/smp.c -+++ b/arch/arm64/kernel/smp.c -@@ -181,11 +181,13 @@ static void init_gic_priority_masking(void) - - WARN_ON(!(cpuflags & PSR_I_BIT)); - -- gic_write_pmr(GIC_PRIO_IRQOFF); -- - /* We can only unmask PSR.I if we can take aborts */ -- if (!(cpuflags & PSR_A_BIT)) -+ if (!(cpuflags & PSR_A_BIT)) { -+ gic_write_pmr(GIC_PRIO_IRQOFF); - write_sysreg(cpuflags & ~PSR_I_BIT, daif); -+ } else { -+ gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET); -+ } - } - - /* -diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c -index b0041812bca9..58f281b6ca4a 100644 ---- a/arch/arm64/kvm/hyp/switch.c -+++ b/arch/arm64/kvm/hyp/switch.c -@@ -604,7 +604,7 @@ int __hyp_text __kvm_vcpu_run_nvhe(struct kvm_vcpu *vcpu) - * Naturally, we want to avoid this. - */ - if (system_uses_irq_prio_masking()) { -- gic_write_pmr(GIC_PRIO_IRQON); -+ gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET); - dsb(sy); - } - -diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c -index 749c9b269f08..f3c795278def 100644 ---- a/arch/arm64/mm/init.c -+++ b/arch/arm64/mm/init.c -@@ -180,8 +180,9 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max) - { - unsigned long max_zone_pfns[MAX_NR_ZONES] = {0}; - -- if (IS_ENABLED(CONFIG_ZONE_DMA32)) -- max_zone_pfns[ZONE_DMA32] = PFN_DOWN(max_zone_dma_phys()); -+#ifdef CONFIG_ZONE_DMA32 -+ max_zone_pfns[ZONE_DMA32] = PFN_DOWN(max_zone_dma_phys()); -+#endif - max_zone_pfns[ZONE_NORMAL] = max; - - free_area_init_nodes(max_zone_pfns); -diff --git a/arch/mips/jz4740/board-qi_lb60.c b/arch/mips/jz4740/board-qi_lb60.c -index 071e9d94eea7..daed44ee116d 100644 ---- a/arch/mips/jz4740/board-qi_lb60.c -+++ b/arch/mips/jz4740/board-qi_lb60.c -@@ -466,27 +466,27 @@ static unsigned long pin_cfg_bias_disable[] = { - static struct pinctrl_map pin_map[] __initdata = { - /* NAND pin configuration */ - PIN_MAP_MUX_GROUP_DEFAULT("jz4740-nand", -- "10010000.jz4740-pinctrl", "nand", "nand-cs1"), -+ "10010000.pin-controller", "nand-cs1", "nand"), - - /* fbdev pin configuration */ - PIN_MAP_MUX_GROUP("jz4740-fb", PINCTRL_STATE_DEFAULT, -- "10010000.jz4740-pinctrl", "lcd", "lcd-8bit"), -+ "10010000.pin-controller", "lcd-8bit", "lcd"), - PIN_MAP_MUX_GROUP("jz4740-fb", PINCTRL_STATE_SLEEP, -- "10010000.jz4740-pinctrl", "lcd", "lcd-no-pins"), -+ "10010000.pin-controller", "lcd-no-pins", "lcd"), - - /* MMC pin configuration */ - PIN_MAP_MUX_GROUP_DEFAULT("jz4740-mmc.0", -- "10010000.jz4740-pinctrl", "mmc", "mmc-1bit"), -+ "10010000.pin-controller", "mmc-1bit", "mmc"), - PIN_MAP_MUX_GROUP_DEFAULT("jz4740-mmc.0", -- "10010000.jz4740-pinctrl", "mmc", "mmc-4bit"), -+ "10010000.pin-controller", "mmc-4bit", "mmc"), - PIN_MAP_CONFIGS_PIN_DEFAULT("jz4740-mmc.0", -- "10010000.jz4740-pinctrl", "PD0", pin_cfg_bias_disable), -+ "10010000.pin-controller", "PD0", pin_cfg_bias_disable), - PIN_MAP_CONFIGS_PIN_DEFAULT("jz4740-mmc.0", -- "10010000.jz4740-pinctrl", "PD2", pin_cfg_bias_disable), -+ "10010000.pin-controller", "PD2", pin_cfg_bias_disable), - - /* PWM pin configuration */ - PIN_MAP_MUX_GROUP_DEFAULT("jz4740-pwm", -- "10010000.jz4740-pinctrl", "pwm4", "pwm4"), -+ "10010000.pin-controller", "pwm4", "pwm4"), - }; - - -diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c -index cfd87e662fcf..9c95097557c7 100644 ---- a/arch/mips/lantiq/irq.c -+++ b/arch/mips/lantiq/irq.c -@@ -154,8 +154,9 @@ static int ltq_eiu_settype(struct irq_data *d, unsigned int type) - if (edge) - irq_set_handler(d->hwirq, handle_edge_irq); - -- ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_C) | -- (val << (i * 4)), LTQ_EIU_EXIN_C); -+ ltq_eiu_w32((ltq_eiu_r32(LTQ_EIU_EXIN_C) & -+ (~(7 << (i * 4)))) | (val << (i * 4)), -+ LTQ_EIU_EXIN_C); - } - } - -diff --git a/arch/nds32/include/asm/syscall.h b/arch/nds32/include/asm/syscall.h -index 899b2fb4b52f..7b5180d78e20 100644 ---- a/arch/nds32/include/asm/syscall.h -+++ b/arch/nds32/include/asm/syscall.h -@@ -26,7 +26,8 @@ struct pt_regs; - * - * It's only valid to call this when @task is known to be blocked. - */ --int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) -+static inline int -+syscall_get_nr(struct task_struct *task, struct pt_regs *regs) - { - return regs->syscallno; - } -@@ -47,7 +48,8 @@ int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) - * system call instruction. This may not be the same as what the - * register state looked like at system call entry tracing. - */ --void syscall_rollback(struct task_struct *task, struct pt_regs *regs) -+static inline void -+syscall_rollback(struct task_struct *task, struct pt_regs *regs) - { - regs->uregs[0] = regs->orig_r0; - } -@@ -62,7 +64,8 @@ void syscall_rollback(struct task_struct *task, struct pt_regs *regs) - * It's only valid to call this when @task is stopped for tracing on exit - * from a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. - */ --long syscall_get_error(struct task_struct *task, struct pt_regs *regs) -+static inline long -+syscall_get_error(struct task_struct *task, struct pt_regs *regs) - { - unsigned long error = regs->uregs[0]; - return IS_ERR_VALUE(error) ? error : 0; -@@ -79,7 +82,8 @@ long syscall_get_error(struct task_struct *task, struct pt_regs *regs) - * It's only valid to call this when @task is stopped for tracing on exit - * from a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. - */ --long syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) -+static inline long -+syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) - { - return regs->uregs[0]; - } -@@ -99,8 +103,9 @@ long syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) - * It's only valid to call this when @task is stopped for tracing on exit - * from a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. - */ --void syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, -- int error, long val) -+static inline void -+syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, -+ int error, long val) - { - regs->uregs[0] = (long)error ? error : val; - } -@@ -118,8 +123,9 @@ void syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, - * entry to a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. - */ - #define SYSCALL_MAX_ARGS 6 --void syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, -- unsigned long *args) -+static inline void -+syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, -+ unsigned long *args) - { - args[0] = regs->orig_r0; - args++; -@@ -138,8 +144,9 @@ void syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, - * It's only valid to call this when @task is stopped for tracing on - * entry to a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. - */ --void syscall_set_arguments(struct task_struct *task, struct pt_regs *regs, -- const unsigned long *args) -+static inline void -+syscall_set_arguments(struct task_struct *task, struct pt_regs *regs, -+ const unsigned long *args) - { - regs->orig_r0 = args[0]; - args++; -diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile -index c19af26febe6..303ac6c4be64 100644 ---- a/arch/parisc/Makefile -+++ b/arch/parisc/Makefile -@@ -164,5 +164,8 @@ define archhelp - @echo ' zinstall - Install compressed vmlinuz kernel' - endef - -+archclean: -+ $(Q)$(MAKE) $(clean)=$(boot) -+ - archheaders: - $(Q)$(MAKE) $(build)=arch/parisc/kernel/syscalls all -diff --git a/arch/parisc/boot/compressed/Makefile b/arch/parisc/boot/compressed/Makefile -index 2da8624e5cf6..1e5879c6a752 100644 ---- a/arch/parisc/boot/compressed/Makefile -+++ b/arch/parisc/boot/compressed/Makefile -@@ -12,6 +12,7 @@ UBSAN_SANITIZE := n - targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 - targets += vmlinux.bin.xz vmlinux.bin.lzma vmlinux.bin.lzo vmlinux.bin.lz4 - targets += misc.o piggy.o sizes.h head.o real2.o firmware.o -+targets += real2.S firmware.c - - KBUILD_CFLAGS := -D__KERNEL__ -O2 -DBOOTLOADER - KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING -@@ -55,7 +56,8 @@ $(obj)/misc.o: $(obj)/sizes.h - CPPFLAGS_vmlinux.lds += -I$(objtree)/$(obj) -DBOOTLOADER - $(obj)/vmlinux.lds: $(obj)/sizes.h - --$(obj)/vmlinux.bin: vmlinux -+OBJCOPYFLAGS_vmlinux.bin := -R .comment -R .note -S -+$(obj)/vmlinux.bin: vmlinux FORCE - $(call if_changed,objcopy) - - vmlinux.bin.all-y := $(obj)/vmlinux.bin -diff --git a/arch/parisc/boot/compressed/vmlinux.lds.S b/arch/parisc/boot/compressed/vmlinux.lds.S -index bfd7872739a3..2ac3a643f2eb 100644 ---- a/arch/parisc/boot/compressed/vmlinux.lds.S -+++ b/arch/parisc/boot/compressed/vmlinux.lds.S -@@ -48,8 +48,8 @@ SECTIONS - *(.rodata.compressed) - } - -- /* bootloader code and data starts behind area of extracted kernel */ -- . = (SZ_end - SZparisc_kernel_start + KERNEL_BINARY_TEXT_START); -+ /* bootloader code and data starts at least behind area of extracted kernel */ -+ . = MAX(ABSOLUTE(.), (SZ_end - SZparisc_kernel_start + KERNEL_BINARY_TEXT_START)); - - /* align on next page boundary */ - . = ALIGN(4096); -diff --git a/arch/parisc/kernel/kprobes.c b/arch/parisc/kernel/kprobes.c -index d58960b33bda..5d7f2692ac5a 100644 ---- a/arch/parisc/kernel/kprobes.c -+++ b/arch/parisc/kernel/kprobes.c -@@ -133,6 +133,9 @@ int __kprobes parisc_kprobe_ss_handler(struct pt_regs *regs) - struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); - struct kprobe *p = kprobe_running(); - -+ if (!p) -+ return 0; -+ - if (regs->iaoq[0] != (unsigned long)p->ainsn.insn+4) - return 0; - -diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c -index a3d2fb4e6dd2..94106ec64fec 100644 ---- a/arch/parisc/kernel/ptrace.c -+++ b/arch/parisc/kernel/ptrace.c -@@ -167,6 +167,9 @@ long arch_ptrace(struct task_struct *child, long request, - if ((addr & (sizeof(unsigned long)-1)) || - addr >= sizeof(struct pt_regs)) - break; -+ if (addr == PT_IAOQ0 || addr == PT_IAOQ1) { -+ data |= 3; /* ensure userspace privilege */ -+ } - if ((addr >= PT_GR1 && addr <= PT_GR31) || - addr == PT_IAOQ0 || addr == PT_IAOQ1 || - (addr >= PT_FR0 && addr <= PT_FR31 + 4) || -@@ -228,16 +231,18 @@ long arch_ptrace(struct task_struct *child, long request, - - static compat_ulong_t translate_usr_offset(compat_ulong_t offset) - { -- if (offset < 0) -- return sizeof(struct pt_regs); -- else if (offset <= 32*4) /* gr[0..31] */ -- return offset * 2 + 4; -- else if (offset <= 32*4+32*8) /* gr[0..31] + fr[0..31] */ -- return offset + 32*4; -- else if (offset < sizeof(struct pt_regs)/2 + 32*4) -- return offset * 2 + 4 - 32*8; -+ compat_ulong_t pos; -+ -+ if (offset < 32*4) /* gr[0..31] */ -+ pos = offset * 2 + 4; -+ else if (offset < 32*4+32*8) /* fr[0] ... fr[31] */ -+ pos = (offset - 32*4) + PT_FR0; -+ else if (offset < sizeof(struct pt_regs)/2 + 32*4) /* sr[0] ... ipsw */ -+ pos = (offset - 32*4 - 32*8) * 2 + PT_SR0 + 4; - else -- return sizeof(struct pt_regs); -+ pos = sizeof(struct pt_regs); -+ -+ return pos; - } - - long compat_arch_ptrace(struct task_struct *child, compat_long_t request, -@@ -281,9 +286,12 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, - addr = translate_usr_offset(addr); - if (addr >= sizeof(struct pt_regs)) - break; -+ if (addr == PT_IAOQ0+4 || addr == PT_IAOQ1+4) { -+ data |= 3; /* ensure userspace privilege */ -+ } - if (addr >= PT_FR0 && addr <= PT_FR31 + 4) { - /* Special case, fp regs are 64 bits anyway */ -- *(__u64 *) ((char *) task_regs(child) + addr) = data; -+ *(__u32 *) ((char *) task_regs(child) + addr) = data; - ret = 0; - } - else if ((addr >= PT_GR1+4 && addr <= PT_GR31+4) || -@@ -496,7 +504,8 @@ static void set_reg(struct pt_regs *regs, int num, unsigned long val) - return; - case RI(iaoq[0]): - case RI(iaoq[1]): -- regs->iaoq[num - RI(iaoq[0])] = val; -+ /* set 2 lowest bits to ensure userspace privilege: */ -+ regs->iaoq[num - RI(iaoq[0])] = val | 3; - return; - case RI(sar): regs->sar = val; - return; -diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig -index 8c1c636308c8..8c676d898532 100644 ---- a/arch/powerpc/Kconfig -+++ b/arch/powerpc/Kconfig -@@ -121,6 +121,7 @@ config PPC - select ARCH_32BIT_OFF_T if PPC32 - select ARCH_HAS_DEBUG_VIRTUAL - select ARCH_HAS_DEVMEM_IS_ALLOWED -+ select ARCH_HAS_DMA_MMAP_PGPROT - select ARCH_HAS_ELF_RANDOMIZE - select ARCH_HAS_FORTIFY_SOURCE - select ARCH_HAS_GCOV_PROFILE_ALL -@@ -821,6 +822,8 @@ config SCHED_SMT - when dealing with POWER5 cpus at a cost of slightly increased - overhead in some places. If unsure say N here. - -+source "kernel/Kconfig.MuQSS" -+ - config PPC_DENORMALISATION - bool "PowerPC denormalisation exception handling" - depends on PPC_BOOK3S_64 -diff --git a/arch/powerpc/boot/xz_config.h b/arch/powerpc/boot/xz_config.h -index e22e5b3770dd..ebfadd39e192 100644 ---- a/arch/powerpc/boot/xz_config.h -+++ b/arch/powerpc/boot/xz_config.h -@@ -20,10 +20,30 @@ static inline uint32_t swab32p(void *p) - - #ifdef __LITTLE_ENDIAN__ - #define get_le32(p) (*((uint32_t *) (p))) -+#define cpu_to_be32(x) swab32(x) -+static inline u32 be32_to_cpup(const u32 *p) -+{ -+ return swab32p((u32 *)p); -+} - #else - #define get_le32(p) swab32p(p) -+#define cpu_to_be32(x) (x) -+static inline u32 be32_to_cpup(const u32 *p) -+{ -+ return *p; -+} - #endif - -+static inline uint32_t get_unaligned_be32(const void *p) -+{ -+ return be32_to_cpup(p); -+} -+ -+static inline void put_unaligned_be32(u32 val, void *p) -+{ -+ *((u32 *)p) = cpu_to_be32(val); -+} -+ - #define memeq(a, b, size) (memcmp(a, b, size) == 0) - #define memzero(buf, size) memset(buf, 0, size) - -diff --git a/arch/powerpc/include/asm/cacheflush.h b/arch/powerpc/include/asm/cacheflush.h -index 74d60cfe8ce5..fd318f7c3eed 100644 ---- a/arch/powerpc/include/asm/cacheflush.h -+++ b/arch/powerpc/include/asm/cacheflush.h -@@ -29,9 +29,12 @@ - * not expect this type of fault. flush_cache_vmap is not exactly the right - * place to put this, but it seems to work well enough. - */ --#define flush_cache_vmap(start, end) do { asm volatile("ptesync" ::: "memory"); } while (0) -+static inline void flush_cache_vmap(unsigned long start, unsigned long end) -+{ -+ asm volatile("ptesync" ::: "memory"); -+} - #else --#define flush_cache_vmap(start, end) do { } while (0) -+static inline void flush_cache_vmap(unsigned long start, unsigned long end) { } - #endif - - #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1 -diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h -index 3f53be60fb01..64145751b2fd 100644 ---- a/arch/powerpc/include/asm/pgtable.h -+++ b/arch/powerpc/include/asm/pgtable.h -@@ -140,6 +140,20 @@ static inline void pte_frag_set(mm_context_t *ctx, void *p) - } - #endif - -+#ifdef CONFIG_PPC64 -+#define is_ioremap_addr is_ioremap_addr -+static inline bool is_ioremap_addr(const void *x) -+{ -+#ifdef CONFIG_MMU -+ unsigned long addr = (unsigned long)x; -+ -+ return addr >= IOREMAP_BASE && addr < IOREMAP_END; -+#else -+ return false; -+#endif -+} -+#endif /* CONFIG_PPC64 */ -+ - #endif /* __ASSEMBLY__ */ - - #endif /* _ASM_POWERPC_PGTABLE_H */ -diff --git a/arch/powerpc/include/asm/pmc.h b/arch/powerpc/include/asm/pmc.h -index dc9a1ca70edf..c6bbe9778d3c 100644 ---- a/arch/powerpc/include/asm/pmc.h -+++ b/arch/powerpc/include/asm/pmc.h -@@ -27,11 +27,10 @@ static inline void ppc_set_pmu_inuse(int inuse) - #ifdef CONFIG_PPC_PSERIES - get_lppaca()->pmcregs_in_use = inuse; - #endif -- } else { -+ } - #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE -- get_paca()->pmcregs_in_use = inuse; -+ get_paca()->pmcregs_in_use = inuse; - #endif -- } - #endif - } - -diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile -index 0ea6c4aa3a20..21dfff2b25a1 100644 ---- a/arch/powerpc/kernel/Makefile -+++ b/arch/powerpc/kernel/Makefile -@@ -49,7 +49,8 @@ obj-y := cputable.o ptrace.o syscalls.o \ - signal.o sysfs.o cacheinfo.o time.o \ - prom.o traps.o setup-common.o \ - udbg.o misc.o io.o misc_$(BITS).o \ -- of_platform.o prom_parse.o -+ of_platform.o prom_parse.o \ -+ dma-common.o - obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \ - signal_64.o ptrace32.o \ - paca.o nvram_64.o firmware.o -diff --git a/arch/powerpc/kernel/dma-common.c b/arch/powerpc/kernel/dma-common.c -new file mode 100644 -index 000000000000..dc7ef6b17b69 ---- /dev/null -+++ b/arch/powerpc/kernel/dma-common.c -@@ -0,0 +1,17 @@ -+// SPDX-License-Identifier: GPL-2.0-or-later -+/* -+ * Contains common dma routines for all powerpc platforms. -+ * -+ * Copyright (C) 2019 Shawn Anastasio. -+ */ -+ -+#include -+#include -+ -+pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, -+ unsigned long attrs) -+{ -+ if (!dev_is_dma_coherent(dev)) -+ return pgprot_noncached(prot); -+ return prot; -+} -diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c -index f192d57db47d..c0e4b73191f3 100644 ---- a/arch/powerpc/kernel/eeh.c -+++ b/arch/powerpc/kernel/eeh.c -@@ -354,10 +354,19 @@ static inline unsigned long eeh_token_to_phys(unsigned long token) - ptep = find_init_mm_pte(token, &hugepage_shift); - if (!ptep) - return token; -- WARN_ON(hugepage_shift); -- pa = pte_pfn(*ptep) << PAGE_SHIFT; - -- return pa | (token & (PAGE_SIZE-1)); -+ pa = pte_pfn(*ptep); -+ -+ /* On radix we can do hugepage mappings for io, so handle that */ -+ if (hugepage_shift) { -+ pa <<= hugepage_shift; -+ pa |= token & ((1ul << hugepage_shift) - 1); -+ } else { -+ pa <<= PAGE_SHIFT; -+ pa |= token & (PAGE_SIZE - 1); -+ } -+ -+ return pa; - } - - /* -diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S -index 73ba246ca11d..6c51aa845bce 100644 ---- a/arch/powerpc/kernel/exceptions-64s.S -+++ b/arch/powerpc/kernel/exceptions-64s.S -@@ -1746,7 +1746,7 @@ handle_page_fault: - addi r3,r1,STACK_FRAME_OVERHEAD - bl do_page_fault - cmpdi r3,0 -- beq+ 12f -+ beq+ ret_from_except_lite - bl save_nvgprs - mr r5,r3 - addi r3,r1,STACK_FRAME_OVERHEAD -@@ -1761,7 +1761,12 @@ handle_dabr_fault: - ld r5,_DSISR(r1) - addi r3,r1,STACK_FRAME_OVERHEAD - bl do_break --12: b ret_from_except_lite -+ /* -+ * do_break() may have changed the NV GPRS while handling a breakpoint. -+ * If so, we need to restore them with their updated values. Don't use -+ * ret_from_except_lite here. -+ */ -+ b ret_from_except - - - #ifdef CONFIG_PPC_BOOK3S_64 -diff --git a/arch/powerpc/kernel/hw_breakpoint.c b/arch/powerpc/kernel/hw_breakpoint.c -index a293a53b4365..50262597c222 100644 ---- a/arch/powerpc/kernel/hw_breakpoint.c -+++ b/arch/powerpc/kernel/hw_breakpoint.c -@@ -370,6 +370,11 @@ void hw_breakpoint_pmu_read(struct perf_event *bp) - bool dawr_force_enable; - EXPORT_SYMBOL_GPL(dawr_force_enable); - -+static void set_dawr_cb(void *info) -+{ -+ set_dawr(info); -+} -+ - static ssize_t dawr_write_file_bool(struct file *file, - const char __user *user_buf, - size_t count, loff_t *ppos) -@@ -389,7 +394,7 @@ static ssize_t dawr_write_file_bool(struct file *file, - - /* If we are clearing, make sure all CPUs have the DAWR cleared */ - if (!dawr_force_enable) -- smp_call_function((smp_call_func_t)set_dawr, &null_brk, 0); -+ smp_call_function(set_dawr_cb, &null_brk, 0); - - return rc; - } -diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c -index bc68c53af67c..5645bc9cbc09 100644 ---- a/arch/powerpc/kernel/irq.c -+++ b/arch/powerpc/kernel/irq.c -@@ -255,7 +255,7 @@ notrace void arch_local_irq_restore(unsigned long mask) - irq_happened = get_irq_happened(); - if (!irq_happened) { - #ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG -- WARN_ON(!(mfmsr() & MSR_EE)); -+ WARN_ON_ONCE(!(mfmsr() & MSR_EE)); - #endif - return; - } -@@ -268,7 +268,7 @@ notrace void arch_local_irq_restore(unsigned long mask) - */ - if (!(irq_happened & PACA_IRQ_HARD_DIS)) { - #ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG -- WARN_ON(!(mfmsr() & MSR_EE)); -+ WARN_ON_ONCE(!(mfmsr() & MSR_EE)); - #endif - __hard_irq_disable(); - #ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG -@@ -279,7 +279,7 @@ notrace void arch_local_irq_restore(unsigned long mask) - * warn if we are wrong. Only do that when IRQ tracing - * is enabled as mfmsr() can be costly. - */ -- if (WARN_ON(mfmsr() & MSR_EE)) -+ if (WARN_ON_ONCE(mfmsr() & MSR_EE)) - __hard_irq_disable(); - #endif - } -diff --git a/arch/powerpc/kernel/pci_of_scan.c b/arch/powerpc/kernel/pci_of_scan.c -index 24522aa37665..c63c53b37e8e 100644 ---- a/arch/powerpc/kernel/pci_of_scan.c -+++ b/arch/powerpc/kernel/pci_of_scan.c -@@ -42,6 +42,8 @@ unsigned int pci_parse_of_flags(u32 addr0, int bridge) - if (addr0 & 0x02000000) { - flags = IORESOURCE_MEM | PCI_BASE_ADDRESS_SPACE_MEMORY; - flags |= (addr0 >> 22) & PCI_BASE_ADDRESS_MEM_TYPE_64; -+ if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) -+ flags |= IORESOURCE_MEM_64; - flags |= (addr0 >> 28) & PCI_BASE_ADDRESS_MEM_TYPE_1M; - if (addr0 & 0x40000000) - flags |= IORESOURCE_PREFETCH -diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c -index ed446b7ea164..6d600c977c09 100644 ---- a/arch/powerpc/kernel/prom_init.c -+++ b/arch/powerpc/kernel/prom_init.c -@@ -168,6 +168,7 @@ static unsigned long __prombss prom_tce_alloc_end; - - #ifdef CONFIG_PPC_PSERIES - static bool __prombss prom_radix_disable; -+static bool __prombss prom_xive_disable; - #endif - - struct platform_support { -@@ -804,6 +805,12 @@ static void __init early_cmdline_parse(void) - } - if (prom_radix_disable) - prom_debug("Radix disabled from cmdline\n"); -+ -+ opt = prom_strstr(prom_cmd_line, "xive=off"); -+ if (opt) { -+ prom_xive_disable = true; -+ prom_debug("XIVE disabled from cmdline\n"); -+ } - #endif /* CONFIG_PPC_PSERIES */ - } - -@@ -1212,10 +1219,17 @@ static void __init prom_parse_xive_model(u8 val, - switch (val) { - case OV5_FEAT(OV5_XIVE_EITHER): /* Either Available */ - prom_debug("XIVE - either mode supported\n"); -- support->xive = true; -+ support->xive = !prom_xive_disable; - break; - case OV5_FEAT(OV5_XIVE_EXPLOIT): /* Only Exploitation mode */ - prom_debug("XIVE - exploitation mode supported\n"); -+ if (prom_xive_disable) { -+ /* -+ * If we __have__ to do XIVE, we're better off ignoring -+ * the command line rather than not booting. -+ */ -+ prom_printf("WARNING: Ignoring cmdline option xive=off\n"); -+ } - support->xive = true; - break; - case OV5_FEAT(OV5_XIVE_LEGACY): /* Only Legacy mode */ -diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c -index b824f4c69622..fff2eb22427d 100644 ---- a/arch/powerpc/kernel/rtas.c -+++ b/arch/powerpc/kernel/rtas.c -@@ -980,10 +980,9 @@ int rtas_ibm_suspend_me(u64 handle) - cpu_hotplug_disable(); - - /* Check if we raced with a CPU-Offline Operation */ -- if (unlikely(!cpumask_equal(cpu_present_mask, cpu_online_mask))) { -- pr_err("%s: Raced against a concurrent CPU-Offline\n", -- __func__); -- atomic_set(&data.error, -EBUSY); -+ if (!cpumask_equal(cpu_present_mask, cpu_online_mask)) { -+ pr_info("%s: Raced against a concurrent CPU-Offline\n", __func__); -+ atomic_set(&data.error, -EAGAIN); - goto out_hotplug_enable; - } - -diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c -index a2b74e057904..ebb78effd280 100644 ---- a/arch/powerpc/kernel/signal_32.c -+++ b/arch/powerpc/kernel/signal_32.c -@@ -1198,6 +1198,9 @@ SYSCALL_DEFINE0(rt_sigreturn) - goto bad; - - if (MSR_TM_ACTIVE(msr_hi<<32)) { -+ /* Trying to start TM on non TM system */ -+ if (!cpu_has_feature(CPU_FTR_TM)) -+ goto bad; - /* We only recheckpoint on return if we're - * transaction. - */ -diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c -index 4292ea39baa4..bee704f32f96 100644 ---- a/arch/powerpc/kernel/signal_64.c -+++ b/arch/powerpc/kernel/signal_64.c -@@ -771,6 +771,11 @@ SYSCALL_DEFINE0(rt_sigreturn) - if (MSR_TM_ACTIVE(msr)) { - /* We recheckpoint on return. */ - struct ucontext __user *uc_transact; -+ -+ /* Trying to start TM on non TM system */ -+ if (!cpu_has_feature(CPU_FTR_TM)) -+ goto badframe; -+ - if (__get_user(uc_transact, &uc->uc_link)) - goto badframe; - if (restore_tm_sigcontexts(current, &uc->uc_mcontext, -diff --git a/arch/powerpc/kernel/swsusp_32.S b/arch/powerpc/kernel/swsusp_32.S -index 7a919e9a3400..cbdf86228eaa 100644 ---- a/arch/powerpc/kernel/swsusp_32.S -+++ b/arch/powerpc/kernel/swsusp_32.S -@@ -25,11 +25,19 @@ - #define SL_IBAT2 0x48 - #define SL_DBAT3 0x50 - #define SL_IBAT3 0x58 --#define SL_TB 0x60 --#define SL_R2 0x68 --#define SL_CR 0x6c --#define SL_LR 0x70 --#define SL_R12 0x74 /* r12 to r31 */ -+#define SL_DBAT4 0x60 -+#define SL_IBAT4 0x68 -+#define SL_DBAT5 0x70 -+#define SL_IBAT5 0x78 -+#define SL_DBAT6 0x80 -+#define SL_IBAT6 0x88 -+#define SL_DBAT7 0x90 -+#define SL_IBAT7 0x98 -+#define SL_TB 0xa0 -+#define SL_R2 0xa8 -+#define SL_CR 0xac -+#define SL_LR 0xb0 -+#define SL_R12 0xb4 /* r12 to r31 */ - #define SL_SIZE (SL_R12 + 80) - - .section .data -@@ -114,6 +122,41 @@ _GLOBAL(swsusp_arch_suspend) - mfibatl r4,3 - stw r4,SL_IBAT3+4(r11) - -+BEGIN_MMU_FTR_SECTION -+ mfspr r4,SPRN_DBAT4U -+ stw r4,SL_DBAT4(r11) -+ mfspr r4,SPRN_DBAT4L -+ stw r4,SL_DBAT4+4(r11) -+ mfspr r4,SPRN_DBAT5U -+ stw r4,SL_DBAT5(r11) -+ mfspr r4,SPRN_DBAT5L -+ stw r4,SL_DBAT5+4(r11) -+ mfspr r4,SPRN_DBAT6U -+ stw r4,SL_DBAT6(r11) -+ mfspr r4,SPRN_DBAT6L -+ stw r4,SL_DBAT6+4(r11) -+ mfspr r4,SPRN_DBAT7U -+ stw r4,SL_DBAT7(r11) -+ mfspr r4,SPRN_DBAT7L -+ stw r4,SL_DBAT7+4(r11) -+ mfspr r4,SPRN_IBAT4U -+ stw r4,SL_IBAT4(r11) -+ mfspr r4,SPRN_IBAT4L -+ stw r4,SL_IBAT4+4(r11) -+ mfspr r4,SPRN_IBAT5U -+ stw r4,SL_IBAT5(r11) -+ mfspr r4,SPRN_IBAT5L -+ stw r4,SL_IBAT5+4(r11) -+ mfspr r4,SPRN_IBAT6U -+ stw r4,SL_IBAT6(r11) -+ mfspr r4,SPRN_IBAT6L -+ stw r4,SL_IBAT6+4(r11) -+ mfspr r4,SPRN_IBAT7U -+ stw r4,SL_IBAT7(r11) -+ mfspr r4,SPRN_IBAT7L -+ stw r4,SL_IBAT7+4(r11) -+END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS) -+ - #if 0 - /* Backup various CPU config stuffs */ - bl __save_cpu_setup -@@ -279,27 +322,41 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) - mtibatu 3,r4 - lwz r4,SL_IBAT3+4(r11) - mtibatl 3,r4 --#endif -- - BEGIN_MMU_FTR_SECTION -- li r4,0 -+ lwz r4,SL_DBAT4(r11) - mtspr SPRN_DBAT4U,r4 -+ lwz r4,SL_DBAT4+4(r11) - mtspr SPRN_DBAT4L,r4 -+ lwz r4,SL_DBAT5(r11) - mtspr SPRN_DBAT5U,r4 -+ lwz r4,SL_DBAT5+4(r11) - mtspr SPRN_DBAT5L,r4 -+ lwz r4,SL_DBAT6(r11) - mtspr SPRN_DBAT6U,r4 -+ lwz r4,SL_DBAT6+4(r11) - mtspr SPRN_DBAT6L,r4 -+ lwz r4,SL_DBAT7(r11) - mtspr SPRN_DBAT7U,r4 -+ lwz r4,SL_DBAT7+4(r11) - mtspr SPRN_DBAT7L,r4 -+ lwz r4,SL_IBAT4(r11) - mtspr SPRN_IBAT4U,r4 -+ lwz r4,SL_IBAT4+4(r11) - mtspr SPRN_IBAT4L,r4 -+ lwz r4,SL_IBAT5(r11) - mtspr SPRN_IBAT5U,r4 -+ lwz r4,SL_IBAT5+4(r11) - mtspr SPRN_IBAT5L,r4 -+ lwz r4,SL_IBAT6(r11) - mtspr SPRN_IBAT6U,r4 -+ lwz r4,SL_IBAT6+4(r11) - mtspr SPRN_IBAT6L,r4 -+ lwz r4,SL_IBAT7(r11) - mtspr SPRN_IBAT7U,r4 -+ lwz r4,SL_IBAT7+4(r11) - mtspr SPRN_IBAT7L,r4 - END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS) -+#endif - - /* Flush all TLBs */ - lis r4,0x1000 -diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c -index 76b1801aa44a..cde3f5a4b3e4 100644 ---- a/arch/powerpc/kvm/book3s_hv.c -+++ b/arch/powerpc/kvm/book3s_hv.c -@@ -3569,9 +3569,18 @@ int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, - mtspr(SPRN_DEC, vcpu->arch.dec_expires - mftb()); - - if (kvmhv_on_pseries()) { -+ /* -+ * We need to save and restore the guest visible part of the -+ * psscr (i.e. using SPRN_PSSCR_PR) since the hypervisor -+ * doesn't do this for us. Note only required if pseries since -+ * this is done in kvmhv_load_hv_regs_and_go() below otherwise. -+ */ -+ unsigned long host_psscr; - /* call our hypervisor to load up HV regs and go */ - struct hv_guest_state hvregs; - -+ host_psscr = mfspr(SPRN_PSSCR_PR); -+ mtspr(SPRN_PSSCR_PR, vcpu->arch.psscr); - kvmhv_save_hv_regs(vcpu, &hvregs); - hvregs.lpcr = lpcr; - vcpu->arch.regs.msr = vcpu->arch.shregs.msr; -@@ -3590,6 +3599,8 @@ int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, - vcpu->arch.shregs.msr = vcpu->arch.regs.msr; - vcpu->arch.shregs.dar = mfspr(SPRN_DAR); - vcpu->arch.shregs.dsisr = mfspr(SPRN_DSISR); -+ vcpu->arch.psscr = mfspr(SPRN_PSSCR_PR); -+ mtspr(SPRN_PSSCR_PR, host_psscr); - - /* H_CEDE has to be handled now, not later */ - if (trap == BOOK3S_INTERRUPT_SYSCALL && !vcpu->arch.nested && -@@ -3603,6 +3614,8 @@ int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, - - vcpu->arch.slb_max = 0; - dec = mfspr(SPRN_DEC); -+ if (!(lpcr & LPCR_LD)) /* Sign extend if not using large decrementer */ -+ dec = (s32) dec; - tb = mftb(); - vcpu->arch.dec_expires = dec + tb; - vcpu->cpu = -1; -@@ -3652,6 +3665,8 @@ int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, - vcpu->arch.vpa.dirty = 1; - save_pmu = lp->pmcregs_in_use; - } -+ /* Must save pmu if this guest is capable of running nested guests */ -+ save_pmu |= nesting_enabled(vcpu->kvm); - - kvmhv_save_guest_pmu(vcpu, save_pmu); - -@@ -4122,8 +4137,15 @@ int kvmhv_run_single_vcpu(struct kvm_run *kvm_run, - - preempt_enable(); - -- /* cancel pending decrementer exception if DEC is now positive */ -- if (get_tb() < vcpu->arch.dec_expires && kvmppc_core_pending_dec(vcpu)) -+ /* -+ * cancel pending decrementer exception if DEC is now positive, or if -+ * entering a nested guest in which case the decrementer is now owned -+ * by L2 and the L1 decrementer is provided in hdec_expires -+ */ -+ if (kvmppc_core_pending_dec(vcpu) && -+ ((get_tb() < vcpu->arch.dec_expires) || -+ (trap == BOOK3S_INTERRUPT_SYSCALL && -+ kvmppc_get_gpr(vcpu, 3) == H_ENTER_NESTED))) - kvmppc_core_dequeue_dec(vcpu); - - trace_kvm_guest_exit(vcpu); -diff --git a/arch/powerpc/kvm/book3s_hv_tm.c b/arch/powerpc/kvm/book3s_hv_tm.c -index 229496e2652e..0db937497169 100644 ---- a/arch/powerpc/kvm/book3s_hv_tm.c -+++ b/arch/powerpc/kvm/book3s_hv_tm.c -@@ -128,7 +128,7 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) - } - /* Set CR0 to indicate previous transactional state */ - vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | -- (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); -+ (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 29); - /* L=1 => tresume, L=0 => tsuspend */ - if (instr & (1 << 21)) { - if (MSR_TM_SUSPENDED(msr)) -@@ -172,7 +172,7 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) - - /* Set CR0 to indicate previous transactional state */ - vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | -- (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); -+ (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 29); - vcpu->arch.shregs.msr &= ~MSR_TS_MASK; - return RESUME_GUEST; - -@@ -202,7 +202,7 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) - - /* Set CR0 to indicate previous transactional state */ - vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | -- (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); -+ (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 29); - vcpu->arch.shregs.msr = msr | MSR_TS_S; - return RESUME_GUEST; - } -diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c -index 6ca0d7376a9f..e3ba67095895 100644 ---- a/arch/powerpc/kvm/book3s_xive.c -+++ b/arch/powerpc/kvm/book3s_xive.c -@@ -1986,10 +1986,8 @@ static int kvmppc_xive_create(struct kvm_device *dev, u32 type) - - xive->single_escalation = xive_native_has_single_escalation(); - -- if (ret) { -- kfree(xive); -+ if (ret) - return ret; -- } - - return 0; - } -diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c -index 5596c8ec221a..a998823f68a3 100644 ---- a/arch/powerpc/kvm/book3s_xive_native.c -+++ b/arch/powerpc/kvm/book3s_xive_native.c -@@ -1090,9 +1090,9 @@ static int kvmppc_xive_native_create(struct kvm_device *dev, u32 type) - xive->ops = &kvmppc_xive_native_ops; - - if (ret) -- kfree(xive); -+ return ret; - -- return ret; -+ return 0; - } - - /* -diff --git a/arch/powerpc/mm/book3s64/hash_native.c b/arch/powerpc/mm/book3s64/hash_native.c -index 30d62ffe3310..1322c59cb5dd 100644 ---- a/arch/powerpc/mm/book3s64/hash_native.c -+++ b/arch/powerpc/mm/book3s64/hash_native.c -@@ -56,7 +56,7 @@ static inline void tlbiel_hash_set_isa206(unsigned int set, unsigned int is) - * tlbiel instruction for hash, set invalidation - * i.e., r=1 and is=01 or is=10 or is=11 - */ --static inline void tlbiel_hash_set_isa300(unsigned int set, unsigned int is, -+static __always_inline void tlbiel_hash_set_isa300(unsigned int set, unsigned int is, - unsigned int pid, - unsigned int ric, unsigned int prs) - { -diff --git a/arch/powerpc/mm/book3s64/hash_utils.c b/arch/powerpc/mm/book3s64/hash_utils.c -index 28ced26f2a00..ab659044c7f6 100644 ---- a/arch/powerpc/mm/book3s64/hash_utils.c -+++ b/arch/powerpc/mm/book3s64/hash_utils.c -@@ -1901,11 +1901,20 @@ void hash__setup_initial_memory_limit(phys_addr_t first_memblock_base, - * - * For guests on platforms before POWER9, we clamp the it limit to 1G - * to avoid some funky things such as RTAS bugs etc... -+ * -+ * On POWER9 we limit to 1TB in case the host erroneously told us that -+ * the RMA was >1TB. Effective address bits 0:23 are treated as zero -+ * (meaning the access is aliased to zero i.e. addr = addr % 1TB) -+ * for virtual real mode addressing and so it doesn't make sense to -+ * have an area larger than 1TB as it can't be addressed. - */ - if (!early_cpu_has_feature(CPU_FTR_HVMODE)) { - ppc64_rma_size = first_memblock_size; - if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) - ppc64_rma_size = min_t(u64, ppc64_rma_size, 0x40000000); -+ else -+ ppc64_rma_size = min_t(u64, ppc64_rma_size, -+ 1UL << SID_SHIFT_1T); - - /* Finally limit subsequent allocations */ - memblock_set_current_limit(ppc64_rma_size); -diff --git a/arch/powerpc/mm/book3s64/radix_tlb.c b/arch/powerpc/mm/book3s64/radix_tlb.c -index bb9835681315..d0cd5271a57c 100644 ---- a/arch/powerpc/mm/book3s64/radix_tlb.c -+++ b/arch/powerpc/mm/book3s64/radix_tlb.c -@@ -25,7 +25,7 @@ - * tlbiel instruction for radix, set invalidation - * i.e., r=1 and is=01 or is=10 or is=11 - */ --static inline void tlbiel_radix_set_isa300(unsigned int set, unsigned int is, -+static __always_inline void tlbiel_radix_set_isa300(unsigned int set, unsigned int is, - unsigned int pid, - unsigned int ric, unsigned int prs) - { -@@ -146,8 +146,8 @@ static __always_inline void __tlbie_lpid(unsigned long lpid, unsigned long ric) - trace_tlbie(lpid, 0, rb, rs, ric, prs, r); - } - --static inline void __tlbiel_lpid_guest(unsigned long lpid, int set, -- unsigned long ric) -+static __always_inline void __tlbiel_lpid_guest(unsigned long lpid, int set, -+ unsigned long ric) - { - unsigned long rb,rs,prs,r; - -@@ -163,8 +163,8 @@ static inline void __tlbiel_lpid_guest(unsigned long lpid, int set, - } - - --static inline void __tlbiel_va(unsigned long va, unsigned long pid, -- unsigned long ap, unsigned long ric) -+static __always_inline void __tlbiel_va(unsigned long va, unsigned long pid, -+ unsigned long ap, unsigned long ric) - { - unsigned long rb,rs,prs,r; - -@@ -179,8 +179,8 @@ static inline void __tlbiel_va(unsigned long va, unsigned long pid, - trace_tlbie(0, 1, rb, rs, ric, prs, r); - } - --static inline void __tlbie_va(unsigned long va, unsigned long pid, -- unsigned long ap, unsigned long ric) -+static __always_inline void __tlbie_va(unsigned long va, unsigned long pid, -+ unsigned long ap, unsigned long ric) - { - unsigned long rb,rs,prs,r; - -@@ -195,8 +195,8 @@ static inline void __tlbie_va(unsigned long va, unsigned long pid, - trace_tlbie(0, 0, rb, rs, ric, prs, r); - } - --static inline void __tlbie_lpid_va(unsigned long va, unsigned long lpid, -- unsigned long ap, unsigned long ric) -+static __always_inline void __tlbie_lpid_va(unsigned long va, unsigned long lpid, -+ unsigned long ap, unsigned long ric) - { - unsigned long rb,rs,prs,r; - -@@ -235,7 +235,7 @@ static inline void fixup_tlbie_lpid(unsigned long lpid) - /* - * We use 128 set in radix mode and 256 set in hpt mode. - */ --static inline void _tlbiel_pid(unsigned long pid, unsigned long ric) -+static __always_inline void _tlbiel_pid(unsigned long pid, unsigned long ric) - { - int set; - -@@ -337,7 +337,7 @@ static inline void _tlbie_lpid(unsigned long lpid, unsigned long ric) - asm volatile("eieio; tlbsync; ptesync": : :"memory"); - } - --static inline void _tlbiel_lpid_guest(unsigned long lpid, unsigned long ric) -+static __always_inline void _tlbiel_lpid_guest(unsigned long lpid, unsigned long ric) - { - int set; - -@@ -377,8 +377,8 @@ static inline void __tlbiel_va_range(unsigned long start, unsigned long end, - __tlbiel_va(addr, pid, ap, RIC_FLUSH_TLB); - } - --static inline void _tlbiel_va(unsigned long va, unsigned long pid, -- unsigned long psize, unsigned long ric) -+static __always_inline void _tlbiel_va(unsigned long va, unsigned long pid, -+ unsigned long psize, unsigned long ric) - { - unsigned long ap = mmu_get_ap(psize); - -@@ -409,8 +409,8 @@ static inline void __tlbie_va_range(unsigned long start, unsigned long end, - __tlbie_va(addr, pid, ap, RIC_FLUSH_TLB); - } - --static inline void _tlbie_va(unsigned long va, unsigned long pid, -- unsigned long psize, unsigned long ric) -+static __always_inline void _tlbie_va(unsigned long va, unsigned long pid, -+ unsigned long psize, unsigned long ric) - { - unsigned long ap = mmu_get_ap(psize); - -@@ -420,7 +420,7 @@ static inline void _tlbie_va(unsigned long va, unsigned long pid, - asm volatile("eieio; tlbsync; ptesync": : :"memory"); - } - --static inline void _tlbie_lpid_va(unsigned long va, unsigned long lpid, -+static __always_inline void _tlbie_lpid_va(unsigned long va, unsigned long lpid, - unsigned long psize, unsigned long ric) - { - unsigned long ap = mmu_get_ap(psize); -diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c -index b5d92dc32844..1de0f43a68e5 100644 ---- a/arch/powerpc/mm/hugetlbpage.c -+++ b/arch/powerpc/mm/hugetlbpage.c -@@ -130,6 +130,8 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz - } else { - pdshift = PUD_SHIFT; - pu = pud_alloc(mm, pg, addr); -+ if (!pu) -+ return NULL; - if (pshift == PUD_SHIFT) - return (pte_t *)pu; - else if (pshift > PMD_SHIFT) { -@@ -138,6 +140,8 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz - } else { - pdshift = PMD_SHIFT; - pm = pmd_alloc(mm, pu, addr); -+ if (!pm) -+ return NULL; - if (pshift == PMD_SHIFT) - /* 16MB hugepage */ - return (pte_t *)pm; -@@ -154,12 +158,16 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz - } else { - pdshift = PUD_SHIFT; - pu = pud_alloc(mm, pg, addr); -+ if (!pu) -+ return NULL; - if (pshift >= PUD_SHIFT) { - ptl = pud_lockptr(mm, pu); - hpdp = (hugepd_t *)pu; - } else { - pdshift = PMD_SHIFT; - pm = pmd_alloc(mm, pu, addr); -+ if (!pm) -+ return NULL; - ptl = pmd_lockptr(mm, pm); - hpdp = (hugepd_t *)pm; - } -diff --git a/arch/powerpc/mm/kasan/kasan_init_32.c b/arch/powerpc/mm/kasan/kasan_init_32.c -index 0d62be3cba47..74f4555a62ba 100644 ---- a/arch/powerpc/mm/kasan/kasan_init_32.c -+++ b/arch/powerpc/mm/kasan/kasan_init_32.c -@@ -21,7 +21,7 @@ static void kasan_populate_pte(pte_t *ptep, pgprot_t prot) - __set_pte_at(&init_mm, va, ptep, pfn_pte(PHYS_PFN(pa), prot), 0); - } - --static int kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_end) -+static int __ref kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_end) - { - pmd_t *pmd; - unsigned long k_cur, k_next; -@@ -35,7 +35,10 @@ static int kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_ - if ((void *)pmd_page_vaddr(*pmd) != kasan_early_shadow_pte) - continue; - -- new = pte_alloc_one_kernel(&init_mm); -+ if (slab_is_available()) -+ new = pte_alloc_one_kernel(&init_mm); -+ else -+ new = memblock_alloc(PTE_FRAG_SIZE, PTE_FRAG_SIZE); - - if (!new) - return -ENOMEM; -diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c -index d53188dee18f..35cb96cfc258 100644 ---- a/arch/powerpc/mm/pgtable_32.c -+++ b/arch/powerpc/mm/pgtable_32.c -@@ -360,7 +360,7 @@ void mark_initmem_nx(void) - unsigned long numpages = PFN_UP((unsigned long)_einittext) - - PFN_DOWN((unsigned long)_sinittext); - -- if (v_block_mapped((unsigned long)_stext) + 1) -+ if (v_block_mapped((unsigned long)_stext + 1)) - mmu_mark_initmem_nx(); - else - change_page_attr(page, numpages, PAGE_KERNEL); -diff --git a/arch/powerpc/platforms/4xx/uic.c b/arch/powerpc/platforms/4xx/uic.c -index 31f12ad37a98..36fb66ce54cf 100644 ---- a/arch/powerpc/platforms/4xx/uic.c -+++ b/arch/powerpc/platforms/4xx/uic.c -@@ -154,6 +154,7 @@ static int uic_set_irq_type(struct irq_data *d, unsigned int flow_type) - - mtdcr(uic->dcrbase + UIC_PR, pr); - mtdcr(uic->dcrbase + UIC_TR, tr); -+ mtdcr(uic->dcrbase + UIC_SR, ~mask); - - raw_spin_unlock_irqrestore(&uic->lock, flags); - -diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c -index e56b553de27b..ef94224efa5b 100644 ---- a/arch/powerpc/platforms/cell/spufs/sched.c -+++ b/arch/powerpc/platforms/cell/spufs/sched.c -@@ -51,11 +51,6 @@ static struct task_struct *spusched_task; - static struct timer_list spusched_timer; - static struct timer_list spuloadavg_timer; - --/* -- * Priority of a normal, non-rt, non-niced'd process (aka nice level 0). -- */ --#define NORMAL_PRIO 120 -- - /* - * Frequency of the spu scheduler tick. By default we do one SPU scheduler - * tick for every 10 CPU scheduler ticks. -diff --git a/arch/powerpc/platforms/powermac/sleep.S b/arch/powerpc/platforms/powermac/sleep.S -index 6bbcbec97712..bd6085b470b7 100644 ---- a/arch/powerpc/platforms/powermac/sleep.S -+++ b/arch/powerpc/platforms/powermac/sleep.S -@@ -33,10 +33,18 @@ - #define SL_IBAT2 0x48 - #define SL_DBAT3 0x50 - #define SL_IBAT3 0x58 --#define SL_TB 0x60 --#define SL_R2 0x68 --#define SL_CR 0x6c --#define SL_R12 0x70 /* r12 to r31 */ -+#define SL_DBAT4 0x60 -+#define SL_IBAT4 0x68 -+#define SL_DBAT5 0x70 -+#define SL_IBAT5 0x78 -+#define SL_DBAT6 0x80 -+#define SL_IBAT6 0x88 -+#define SL_DBAT7 0x90 -+#define SL_IBAT7 0x98 -+#define SL_TB 0xa0 -+#define SL_R2 0xa8 -+#define SL_CR 0xac -+#define SL_R12 0xb0 /* r12 to r31 */ - #define SL_SIZE (SL_R12 + 80) - - .section .text -@@ -121,6 +129,41 @@ _GLOBAL(low_sleep_handler) - mfibatl r4,3 - stw r4,SL_IBAT3+4(r1) - -+BEGIN_MMU_FTR_SECTION -+ mfspr r4,SPRN_DBAT4U -+ stw r4,SL_DBAT4(r1) -+ mfspr r4,SPRN_DBAT4L -+ stw r4,SL_DBAT4+4(r1) -+ mfspr r4,SPRN_DBAT5U -+ stw r4,SL_DBAT5(r1) -+ mfspr r4,SPRN_DBAT5L -+ stw r4,SL_DBAT5+4(r1) -+ mfspr r4,SPRN_DBAT6U -+ stw r4,SL_DBAT6(r1) -+ mfspr r4,SPRN_DBAT6L -+ stw r4,SL_DBAT6+4(r1) -+ mfspr r4,SPRN_DBAT7U -+ stw r4,SL_DBAT7(r1) -+ mfspr r4,SPRN_DBAT7L -+ stw r4,SL_DBAT7+4(r1) -+ mfspr r4,SPRN_IBAT4U -+ stw r4,SL_IBAT4(r1) -+ mfspr r4,SPRN_IBAT4L -+ stw r4,SL_IBAT4+4(r1) -+ mfspr r4,SPRN_IBAT5U -+ stw r4,SL_IBAT5(r1) -+ mfspr r4,SPRN_IBAT5L -+ stw r4,SL_IBAT5+4(r1) -+ mfspr r4,SPRN_IBAT6U -+ stw r4,SL_IBAT6(r1) -+ mfspr r4,SPRN_IBAT6L -+ stw r4,SL_IBAT6+4(r1) -+ mfspr r4,SPRN_IBAT7U -+ stw r4,SL_IBAT7(r1) -+ mfspr r4,SPRN_IBAT7L -+ stw r4,SL_IBAT7+4(r1) -+END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS) -+ - /* Backup various CPU config stuffs */ - bl __save_cpu_setup - -@@ -321,22 +364,37 @@ grackle_wake_up: - mtibatl 3,r4 - - BEGIN_MMU_FTR_SECTION -- li r4,0 -+ lwz r4,SL_DBAT4(r1) - mtspr SPRN_DBAT4U,r4 -+ lwz r4,SL_DBAT4+4(r1) - mtspr SPRN_DBAT4L,r4 -+ lwz r4,SL_DBAT5(r1) - mtspr SPRN_DBAT5U,r4 -+ lwz r4,SL_DBAT5+4(r1) - mtspr SPRN_DBAT5L,r4 -+ lwz r4,SL_DBAT6(r1) - mtspr SPRN_DBAT6U,r4 -+ lwz r4,SL_DBAT6+4(r1) - mtspr SPRN_DBAT6L,r4 -+ lwz r4,SL_DBAT7(r1) - mtspr SPRN_DBAT7U,r4 -+ lwz r4,SL_DBAT7+4(r1) - mtspr SPRN_DBAT7L,r4 -+ lwz r4,SL_IBAT4(r1) - mtspr SPRN_IBAT4U,r4 -+ lwz r4,SL_IBAT4+4(r1) - mtspr SPRN_IBAT4L,r4 -+ lwz r4,SL_IBAT5(r1) - mtspr SPRN_IBAT5U,r4 -+ lwz r4,SL_IBAT5+4(r1) - mtspr SPRN_IBAT5L,r4 -+ lwz r4,SL_IBAT6(r1) - mtspr SPRN_IBAT6U,r4 -+ lwz r4,SL_IBAT6+4(r1) - mtspr SPRN_IBAT6L,r4 -+ lwz r4,SL_IBAT7(r1) - mtspr SPRN_IBAT7U,r4 -+ lwz r4,SL_IBAT7+4(r1) - mtspr SPRN_IBAT7L,r4 - END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS) - -diff --git a/arch/powerpc/platforms/powernv/idle.c b/arch/powerpc/platforms/powernv/idle.c -index 2f4479b94ac3..fd14a6237954 100644 ---- a/arch/powerpc/platforms/powernv/idle.c -+++ b/arch/powerpc/platforms/powernv/idle.c -@@ -758,7 +758,6 @@ static unsigned long power9_idle_stop(unsigned long psscr, bool mmu_on) - mtspr(SPRN_PTCR, sprs.ptcr); - mtspr(SPRN_RPR, sprs.rpr); - mtspr(SPRN_TSCR, sprs.tscr); -- mtspr(SPRN_LDBAR, sprs.ldbar); - - if (pls >= pnv_first_tb_loss_level) { - /* TB loss */ -@@ -790,6 +789,7 @@ static unsigned long power9_idle_stop(unsigned long psscr, bool mmu_on) - mtspr(SPRN_MMCR0, sprs.mmcr0); - mtspr(SPRN_MMCR1, sprs.mmcr1); - mtspr(SPRN_MMCR2, sprs.mmcr2); -+ mtspr(SPRN_LDBAR, sprs.ldbar); - - mtspr(SPRN_SPRG3, local_paca->sprg_vdso); - -diff --git a/arch/powerpc/platforms/powernv/npu-dma.c b/arch/powerpc/platforms/powernv/npu-dma.c -index c321fdbc2200..e607141e0b39 100644 ---- a/arch/powerpc/platforms/powernv/npu-dma.c -+++ b/arch/powerpc/platforms/powernv/npu-dma.c -@@ -28,9 +28,22 @@ static DEFINE_SPINLOCK(npu_context_lock); - static struct pci_dev *get_pci_dev(struct device_node *dn) - { - struct pci_dn *pdn = PCI_DN(dn); -+ struct pci_dev *pdev; - -- return pci_get_domain_bus_and_slot(pci_domain_nr(pdn->phb->bus), -+ pdev = pci_get_domain_bus_and_slot(pci_domain_nr(pdn->phb->bus), - pdn->busno, pdn->devfn); -+ -+ /* -+ * pci_get_domain_bus_and_slot() increased the reference count of -+ * the PCI device, but callers don't need that actually as the PE -+ * already holds a reference to the device. Since callers aren't -+ * aware of the reference count change, call pci_dev_put() now to -+ * avoid leaks. -+ */ -+ if (pdev) -+ pci_dev_put(pdev); -+ -+ return pdev; - } - - /* Given a NPU device get the associated PCI device. */ -diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c -index 10cc42b9e541..0f72c7484824 100644 ---- a/arch/powerpc/platforms/powernv/pci-ioda.c -+++ b/arch/powerpc/platforms/powernv/pci-ioda.c -@@ -2456,6 +2456,14 @@ static long pnv_pci_ioda2_setup_default_config(struct pnv_ioda_pe *pe) - if (!pnv_iommu_bypass_disabled) - pnv_pci_ioda2_set_bypass(pe, true); - -+ /* -+ * Set table base for the case of IOMMU DMA use. Usually this is done -+ * from dma_dev_setup() which is not called when a device is returned -+ * from VFIO so do it here. -+ */ -+ if (pe->pdev) -+ set_iommu_table_base(&pe->pdev->dev, tbl); -+ - return 0; - } - -@@ -2543,6 +2551,8 @@ static void pnv_ioda2_take_ownership(struct iommu_table_group *table_group) - pnv_pci_ioda2_unset_window(&pe->table_group, 0); - if (pe->pbus) - pnv_ioda_setup_bus_dma(pe, pe->pbus); -+ else if (pe->pdev) -+ set_iommu_table_base(&pe->pdev->dev, NULL); - iommu_tce_table_put(tbl); - } - -diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c -index 2ec43b4639a0..46d0d35b9ca4 100644 ---- a/arch/powerpc/platforms/pseries/hotplug-memory.c -+++ b/arch/powerpc/platforms/pseries/hotplug-memory.c -@@ -976,6 +976,9 @@ static int pseries_update_drconf_memory(struct of_reconfig_data *pr) - if (!memblock_size) - return -EINVAL; - -+ if (!pr->old_prop) -+ return 0; -+ - p = (__be32 *) pr->old_prop->value; - if (!p) - return -EINVAL; -diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c -index 0c48c8964783..50e7aee3c7f3 100644 ---- a/arch/powerpc/platforms/pseries/mobility.c -+++ b/arch/powerpc/platforms/pseries/mobility.c -@@ -6,6 +6,7 @@ - * Copyright (C) 2010 IBM Corporation - */ - -+#include - #include - #include - #include -@@ -335,11 +336,19 @@ void post_mobility_fixup(void) - if (rc) - printk(KERN_ERR "Post-mobility activate-fw failed: %d\n", rc); - -+ /* -+ * We don't want CPUs to go online/offline while the device -+ * tree is being updated. -+ */ -+ cpus_read_lock(); -+ - rc = pseries_devicetree_update(MIGRATION_SCOPE); - if (rc) - printk(KERN_ERR "Post-mobility device tree update " - "failed: %d\n", rc); - -+ cpus_read_unlock(); -+ - /* Possibly switch to a new RFI flush type */ - pseries_setup_rfi_flush(); - -diff --git a/arch/powerpc/sysdev/xive/common.c b/arch/powerpc/sysdev/xive/common.c -index 082c7e1c20f0..1cdb39575eae 100644 ---- a/arch/powerpc/sysdev/xive/common.c -+++ b/arch/powerpc/sysdev/xive/common.c -@@ -479,7 +479,7 @@ static int xive_find_target_in_mask(const struct cpumask *mask, - * Now go through the entire mask until we find a valid - * target. - */ -- for (;;) { -+ do { - /* - * We re-check online as the fallback case passes us - * an untested affinity mask -@@ -487,12 +487,11 @@ static int xive_find_target_in_mask(const struct cpumask *mask, - if (cpu_online(cpu) && xive_try_pick_target(cpu)) - return cpu; - cpu = cpumask_next(cpu, mask); -- if (cpu == first) -- break; - /* Wrap around */ - if (cpu >= nr_cpu_ids) - cpu = cpumask_first(mask); -- } -+ } while (cpu != first); -+ - return -1; - } - -diff --git a/arch/powerpc/sysdev/xive/spapr.c b/arch/powerpc/sysdev/xive/spapr.c -index cafb5c4df26b..8ef9cf4ebb1c 100644 ---- a/arch/powerpc/sysdev/xive/spapr.c -+++ b/arch/powerpc/sysdev/xive/spapr.c -@@ -16,6 +16,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -659,6 +660,55 @@ static bool xive_get_max_prio(u8 *max_prio) - return true; - } - -+static const u8 *get_vec5_feature(unsigned int index) -+{ -+ unsigned long root, chosen; -+ int size; -+ const u8 *vec5; -+ -+ root = of_get_flat_dt_root(); -+ chosen = of_get_flat_dt_subnode_by_name(root, "chosen"); -+ if (chosen == -FDT_ERR_NOTFOUND) -+ return NULL; -+ -+ vec5 = of_get_flat_dt_prop(chosen, "ibm,architecture-vec-5", &size); -+ if (!vec5) -+ return NULL; -+ -+ if (size <= index) -+ return NULL; -+ -+ return vec5 + index; -+} -+ -+static bool xive_spapr_disabled(void) -+{ -+ const u8 *vec5_xive; -+ -+ vec5_xive = get_vec5_feature(OV5_INDX(OV5_XIVE_SUPPORT)); -+ if (vec5_xive) { -+ u8 val; -+ -+ val = *vec5_xive & OV5_FEAT(OV5_XIVE_SUPPORT); -+ switch (val) { -+ case OV5_FEAT(OV5_XIVE_EITHER): -+ case OV5_FEAT(OV5_XIVE_LEGACY): -+ break; -+ case OV5_FEAT(OV5_XIVE_EXPLOIT): -+ /* Hypervisor only supports XIVE */ -+ if (xive_cmdline_disabled) -+ pr_warn("WARNING: Ignoring cmdline option xive=off\n"); -+ return false; -+ default: -+ pr_warn("%s: Unknown xive support option: 0x%x\n", -+ __func__, val); -+ break; -+ } -+ } -+ -+ return xive_cmdline_disabled; -+} -+ - bool __init xive_spapr_init(void) - { - struct device_node *np; -@@ -671,7 +721,7 @@ bool __init xive_spapr_init(void) - const __be32 *reg; - int i; - -- if (xive_cmdline_disabled) -+ if (xive_spapr_disabled()) - return false; - - pr_devel("%s()\n", __func__); -diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c -index d0620d762a5a..4a721fd62406 100644 ---- a/arch/powerpc/xmon/xmon.c -+++ b/arch/powerpc/xmon/xmon.c -@@ -465,8 +465,10 @@ static int xmon_core(struct pt_regs *regs, int fromipi) - local_irq_save(flags); - hard_irq_disable(); - -- tracing_enabled = tracing_is_on(); -- tracing_off(); -+ if (!fromipi) { -+ tracing_enabled = tracing_is_on(); -+ tracing_off(); -+ } - - bp = in_breakpoint_table(regs->nip, &offset); - if (bp != NULL) { -diff --git a/arch/s390/include/asm/facility.h b/arch/s390/include/asm/facility.h -index e78cda94456b..68c476b20b57 100644 ---- a/arch/s390/include/asm/facility.h -+++ b/arch/s390/include/asm/facility.h -@@ -59,6 +59,18 @@ static inline int test_facility(unsigned long nr) - return __test_facility(nr, &S390_lowcore.stfle_fac_list); - } - -+static inline unsigned long __stfle_asm(u64 *stfle_fac_list, int size) -+{ -+ register unsigned long reg0 asm("0") = size - 1; -+ -+ asm volatile( -+ ".insn s,0xb2b00000,0(%1)" /* stfle */ -+ : "+d" (reg0) -+ : "a" (stfle_fac_list) -+ : "memory", "cc"); -+ return reg0; -+} -+ - /** - * stfle - Store facility list extended - * @stfle_fac_list: array where facility list can be stored -@@ -75,13 +87,8 @@ static inline void __stfle(u64 *stfle_fac_list, int size) - memcpy(stfle_fac_list, &S390_lowcore.stfl_fac_list, 4); - if (S390_lowcore.stfl_fac_list & 0x01000000) { - /* More facility bits available with stfle */ -- register unsigned long reg0 asm("0") = size - 1; -- -- asm volatile(".insn s,0xb2b00000,0(%1)" /* stfle */ -- : "+d" (reg0) -- : "a" (stfle_fac_list) -- : "memory", "cc"); -- nr = (reg0 + 1) * 8; /* # bytes stored by stfle */ -+ nr = __stfle_asm(stfle_fac_list, size); -+ nr = min_t(unsigned long, (nr + 1) * 8, size * 8); - } - memset((char *) stfle_fac_list + nr, 0, size * 8 - nr); - } -diff --git a/arch/s390/include/asm/sclp.h b/arch/s390/include/asm/sclp.h -index f577c5f6031a..c563f8368b19 100644 ---- a/arch/s390/include/asm/sclp.h -+++ b/arch/s390/include/asm/sclp.h -@@ -80,7 +80,6 @@ struct sclp_info { - unsigned char has_gisaf : 1; - unsigned char has_diag318 : 1; - unsigned char has_sipl : 1; -- unsigned char has_sipl_g2 : 1; - unsigned char has_dirq : 1; - unsigned int ibc; - unsigned int mtid; -diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c -index d836af3ccc38..2c0a515428d6 100644 ---- a/arch/s390/kernel/ipl.c -+++ b/arch/s390/kernel/ipl.c -@@ -286,12 +286,7 @@ static struct kobj_attribute sys_ipl_secure_attr = - static ssize_t ipl_has_secure_show(struct kobject *kobj, - struct kobj_attribute *attr, char *page) - { -- if (MACHINE_IS_LPAR) -- return sprintf(page, "%i\n", !!sclp.has_sipl); -- else if (MACHINE_IS_VM) -- return sprintf(page, "%i\n", !!sclp.has_sipl_g2); -- else -- return sprintf(page, "%i\n", 0); -+ return sprintf(page, "%i\n", !!sclp.has_sipl); - } - - static struct kobj_attribute sys_ipl_has_secure_attr = -diff --git a/arch/sh/boards/Kconfig b/arch/sh/boards/Kconfig -index b9a37057b77a..cee24c308337 100644 ---- a/arch/sh/boards/Kconfig -+++ b/arch/sh/boards/Kconfig -@@ -8,27 +8,19 @@ config SH_ALPHA_BOARD - bool - - config SH_DEVICE_TREE -- bool "Board Described by Device Tree" -+ bool - select OF - select OF_EARLY_FLATTREE - select TIMER_OF - select COMMON_CLK - select GENERIC_CALIBRATE_DELAY -- help -- Select Board Described by Device Tree to build a kernel that -- does not hard-code any board-specific knowledge but instead uses -- a device tree blob provided by the boot-loader. You must enable -- drivers for any hardware you want to use separately. At this -- time, only boards based on the open-hardware J-Core processors -- have sufficient driver coverage to use this option; do not -- select it if you are using original SuperH hardware. - - config SH_JCORE_SOC - bool "J-Core SoC" -- depends on SH_DEVICE_TREE && (CPU_SH2 || CPU_J2) -+ select SH_DEVICE_TREE - select CLKSRC_JCORE_PIT - select JCORE_AIC -- default y if CPU_J2 -+ depends on CPU_J2 - help - Select this option to include drivers core components of the - J-Core SoC, including interrupt controllers and timers. -diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h -index c28e37a344ad..ac0561960c52 100644 ---- a/arch/sh/include/asm/io.h -+++ b/arch/sh/include/asm/io.h -@@ -369,7 +369,11 @@ static inline int iounmap_fixed(void __iomem *addr) { return -EINVAL; } - - #define ioremap_nocache ioremap - #define ioremap_uc ioremap --#define iounmap __iounmap -+ -+static inline void iounmap(void __iomem *addr) -+{ -+ __iounmap(addr); -+} - - /* - * Convert a physical pointer to a virtual kernel pointer for /dev/mem -diff --git a/arch/um/include/asm/mmu_context.h b/arch/um/include/asm/mmu_context.h -index 9f4b4bb78120..00cefd33afdd 100644 ---- a/arch/um/include/asm/mmu_context.h -+++ b/arch/um/include/asm/mmu_context.h -@@ -52,7 +52,7 @@ static inline void activate_mm(struct mm_struct *old, struct mm_struct *new) - * when the new ->mm is used for the first time. - */ - __switch_mm(&new->context.id); -- down_write(&new->mmap_sem); -+ down_write_nested(&new->mmap_sem, 1); - uml_setup_stubs(new); - up_write(&new->mmap_sem); - } -diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig -index 2bbbd4d1ba31..ce84e791706e 100644 ---- a/arch/x86/Kconfig -+++ b/arch/x86/Kconfig -@@ -1007,6 +1007,22 @@ config NR_CPUS - config SCHED_SMT - def_bool y if SMP - -+config SMT_NICE -+ bool "SMT (Hyperthreading) aware nice priority and policy support" -+ depends on SCHED_MUQSS && SCHED_SMT -+ default y -+ ---help--- -+ Enabling Hyperthreading on Intel CPUs decreases the effectiveness -+ of the use of 'nice' levels and different scheduling policies -+ (e.g. realtime) due to sharing of CPU power between hyperthreads. -+ SMT nice support makes each logical CPU aware of what is running on -+ its hyperthread siblings, maintaining appropriate distribution of -+ CPU according to nice levels and scheduling policies at the expense -+ of slightly increased overhead. -+ -+ If unsure say Y here. -+ -+ - config SCHED_MC - def_bool y - prompt "Multi-core scheduler support" -@@ -1037,6 +1053,8 @@ config SCHED_MC_PRIO - - If unsure say Y here. - -+source "kernel/Kconfig.MuQSS" -+ - config UP_LATE_INIT - def_bool y - depends on !SMP && X86_LOCAL_APIC -diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu -index 6adce15268bd..f8612b07d32f 100644 ---- a/arch/x86/Kconfig.cpu -+++ b/arch/x86/Kconfig.cpu -@@ -116,6 +116,7 @@ config MPENTIUMM - config MPENTIUM4 - bool "Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon" - depends on X86_32 -+ select X86_P6_NOP - ---help--- - Select this for Intel Pentium 4 chips. This includes the - Pentium 4, Pentium D, P4-based Celeron and Xeon, and -@@ -148,9 +149,8 @@ config MPENTIUM4 - -Paxville - -Dempsey - -- - config MK6 -- bool "K6/K6-II/K6-III" -+ bool "AMD K6/K6-II/K6-III" - depends on X86_32 - ---help--- - Select this for an AMD K6-family processor. Enables use of -@@ -158,7 +158,7 @@ config MK6 - flags to GCC. - - config MK7 -- bool "Athlon/Duron/K7" -+ bool "AMD Athlon/Duron/K7" - depends on X86_32 - ---help--- - Select this for an AMD Athlon K7-family processor. Enables use of -@@ -166,12 +166,83 @@ config MK7 - flags to GCC. - - config MK8 -- bool "Opteron/Athlon64/Hammer/K8" -+ bool "AMD Opteron/Athlon64/Hammer/K8" - ---help--- - Select this for an AMD Opteron or Athlon64 Hammer-family processor. - Enables use of some extended instructions, and passes appropriate - optimization flags to GCC. - -+config MK8SSE3 -+ bool "AMD Opteron/Athlon64/Hammer/K8 with SSE3" -+ ---help--- -+ Select this for improved AMD Opteron or Athlon64 Hammer-family processors. -+ Enables use of some extended instructions, and passes appropriate -+ optimization flags to GCC. -+ -+config MK10 -+ bool "AMD 61xx/7x50/PhenomX3/X4/II/K10" -+ ---help--- -+ Select this for an AMD 61xx Eight-Core Magny-Cours, Athlon X2 7x50, -+ Phenom X3/X4/II, Athlon II X2/X3/X4, or Turion II-family processor. -+ Enables use of some extended instructions, and passes appropriate -+ optimization flags to GCC. -+ -+config MBARCELONA -+ bool "AMD Barcelona" -+ ---help--- -+ Select this for AMD Family 10h Barcelona processors. -+ -+ Enables -march=barcelona -+ -+config MBOBCAT -+ bool "AMD Bobcat" -+ ---help--- -+ Select this for AMD Family 14h Bobcat processors. -+ -+ Enables -march=btver1 -+ -+config MJAGUAR -+ bool "AMD Jaguar" -+ ---help--- -+ Select this for AMD Family 16h Jaguar processors. -+ -+ Enables -march=btver2 -+ -+config MBULLDOZER -+ bool "AMD Bulldozer" -+ ---help--- -+ Select this for AMD Family 15h Bulldozer processors. -+ -+ Enables -march=bdver1 -+ -+config MPILEDRIVER -+ bool "AMD Piledriver" -+ ---help--- -+ Select this for AMD Family 15h Piledriver processors. -+ -+ Enables -march=bdver2 -+ -+config MSTEAMROLLER -+ bool "AMD Steamroller" -+ ---help--- -+ Select this for AMD Family 15h Steamroller processors. -+ -+ Enables -march=bdver3 -+ -+config MEXCAVATOR -+ bool "AMD Excavator" -+ ---help--- -+ Select this for AMD Family 15h Excavator processors. -+ -+ Enables -march=bdver4 -+ -+config MZEN -+ bool "AMD Zen" -+ ---help--- -+ Select this for AMD Family 17h Zen processors. -+ -+ Enables -march=znver1 -+ - config MCRUSOE - bool "Crusoe" - depends on X86_32 -@@ -253,6 +324,7 @@ config MVIAC7 - - config MPSC - bool "Intel P4 / older Netburst based Xeon" -+ select X86_P6_NOP - depends on X86_64 - ---help--- - Optimize for Intel Pentium 4, Pentium D and older Nocona/Dempsey -@@ -262,8 +334,19 @@ config MPSC - using the cpu family field - in /proc/cpuinfo. Family 15 is an older Xeon, Family 6 a newer one. - -+config MATOM -+ bool "Intel Atom" -+ select X86_P6_NOP -+ ---help--- -+ -+ Select this for the Intel Atom platform. Intel Atom CPUs have an -+ in-order pipelining architecture and thus can benefit from -+ accordingly optimized code. Use a recent GCC with specific Atom -+ support in order to fully benefit from selecting this option. -+ - config MCORE2 -- bool "Core 2/newer Xeon" -+ bool "Intel Core 2" -+ select X86_P6_NOP - ---help--- - - Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and -@@ -271,14 +354,106 @@ config MCORE2 - family in /proc/cpuinfo. Newer ones have 6 and older ones 15 - (not a typo) - --config MATOM -- bool "Intel Atom" -+ Enables -march=core2 -+ -+config MNEHALEM -+ bool "Intel Nehalem" -+ select X86_P6_NOP - ---help--- - -- Select this for the Intel Atom platform. Intel Atom CPUs have an -- in-order pipelining architecture and thus can benefit from -- accordingly optimized code. Use a recent GCC with specific Atom -- support in order to fully benefit from selecting this option. -+ Select this for 1st Gen Core processors in the Nehalem family. -+ -+ Enables -march=nehalem -+ -+config MWESTMERE -+ bool "Intel Westmere" -+ select X86_P6_NOP -+ ---help--- -+ -+ Select this for the Intel Westmere formerly Nehalem-C family. -+ -+ Enables -march=westmere -+ -+config MSILVERMONT -+ bool "Intel Silvermont" -+ select X86_P6_NOP -+ ---help--- -+ -+ Select this for the Intel Silvermont platform. -+ -+ Enables -march=silvermont -+ -+config MSANDYBRIDGE -+ bool "Intel Sandy Bridge" -+ select X86_P6_NOP -+ ---help--- -+ -+ Select this for 2nd Gen Core processors in the Sandy Bridge family. -+ -+ Enables -march=sandybridge -+ -+config MIVYBRIDGE -+ bool "Intel Ivy Bridge" -+ select X86_P6_NOP -+ ---help--- -+ -+ Select this for 3rd Gen Core processors in the Ivy Bridge family. -+ -+ Enables -march=ivybridge -+ -+config MHASWELL -+ bool "Intel Haswell" -+ select X86_P6_NOP -+ ---help--- -+ -+ Select this for 4th Gen Core processors in the Haswell family. -+ -+ Enables -march=haswell -+ -+config MBROADWELL -+ bool "Intel Broadwell" -+ select X86_P6_NOP -+ ---help--- -+ -+ Select this for 5th Gen Core processors in the Broadwell family. -+ -+ Enables -march=broadwell -+ -+config MSKYLAKE -+ bool "Intel Skylake" -+ select X86_P6_NOP -+ ---help--- -+ -+ Select this for 6th Gen Core processors in the Skylake family. -+ -+ Enables -march=skylake -+ -+config MSKYLAKEX -+ bool "Intel Skylake X" -+ select X86_P6_NOP -+ ---help--- -+ -+ Select this for 6th Gen Core processors in the Skylake X family. -+ -+ Enables -march=skylake-avx512 -+ -+config MCANNONLAKE -+ bool "Intel Cannon Lake" -+ select X86_P6_NOP -+ ---help--- -+ -+ Select this for 8th Gen Core processors -+ -+ Enables -march=cannonlake -+ -+config MICELAKE -+ bool "Intel Ice Lake" -+ select X86_P6_NOP -+ ---help--- -+ -+ Select this for 8th Gen Core processors in the Ice Lake family. -+ -+ Enables -march=icelake - - config GENERIC_CPU - bool "Generic-x86-64" -@@ -287,6 +462,19 @@ config GENERIC_CPU - Generic x86-64 CPU. - Run equally well on all x86-64 CPUs. - -+config MNATIVE -+ bool "Native optimizations autodetected by GCC" -+ ---help--- -+ -+ GCC 4.2 and above support -march=native, which automatically detects -+ the optimum settings to use based on your processor. -march=native -+ also detects and applies additional settings beyond -march specific -+ to your CPU, (eg. -msse4). Unless you have a specific reason not to -+ (e.g. distcc cross-compiling), you should probably be using -+ -march=native rather than anything listed below. -+ -+ Enables -march=native -+ - endchoice - - config X86_GENERIC -@@ -311,7 +499,7 @@ config X86_INTERNODE_CACHE_SHIFT - config X86_L1_CACHE_SHIFT - int - default "7" if MPENTIUM4 || MPSC -- default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU -+ default "6" if MK7 || MK8 || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MJAGUAR || MPENTIUMM || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MNATIVE || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU - default "4" if MELAN || M486 || MGEODEGX1 - default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX - -@@ -329,35 +517,36 @@ config X86_ALIGNMENT_16 - - config X86_INTEL_USERCOPY - def_bool y -- depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON || MCORE2 -+ depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK8SSE3 || MK7 || MEFFICEON || MCORE2 || MK10 || MBARCELONA || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MNATIVE - - config X86_USE_PPRO_CHECKSUM - def_bool y -- depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MATOM -+ depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MK10 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MK8SSE3 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MATOM || MNATIVE - - config X86_USE_3DNOW - def_bool y - depends on (MCYRIXIII || MK7 || MGEODE_LX) && !UML - --# --# P6_NOPs are a relatively minor optimization that require a family >= --# 6 processor, except that it is broken on certain VIA chips. --# Furthermore, AMD chips prefer a totally different sequence of NOPs --# (which work on all CPUs). In addition, it looks like Virtual PC --# does not understand them. --# --# As a result, disallow these if we're not compiling for X86_64 (these --# NOPs do work on all x86-64 capable chips); the list of processors in --# the right-hand clause are the cores that benefit from this optimization. --# - config X86_P6_NOP -- def_bool y -- depends on X86_64 -- depends on (MCORE2 || MPENTIUM4 || MPSC) -+ default n -+ bool "Support for P6_NOPs on Intel chips" -+ depends on (MCORE2 || MPENTIUM4 || MPSC || MATOM || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MNATIVE) -+ ---help--- -+ P6_NOPs are a relatively minor optimization that require a family >= -+ 6 processor, except that it is broken on certain VIA chips. -+ Furthermore, AMD chips prefer a totally different sequence of NOPs -+ (which work on all CPUs). In addition, it looks like Virtual PC -+ does not understand them. -+ -+ As a result, disallow these if we're not compiling for X86_64 (these -+ NOPs do work on all x86-64 capable chips); the list of processors in -+ the right-hand clause are the cores that benefit from this optimization. -+ -+ Say Y if you have Intel CPU newer than Pentium Pro, N otherwise. - - config X86_TSC - def_bool y -- depends on (MWINCHIP3D || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2 || MATOM) || X86_64 -+ depends on (MWINCHIP3D || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MK8SSE3 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MNATIVE || MATOM) || X86_64 - - config X86_CMPXCHG64 - def_bool y -@@ -367,7 +556,7 @@ config X86_CMPXCHG64 - # generates cmov. - config X86_CMOV - def_bool y -- depends on (MK8 || MK7 || MCORE2 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MATOM || MGEODE_LX) -+ depends on (MK8 || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MJAGUAR || MK7 || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MNATIVE || MATOM || MGEODE_LX) - - config X86_MINIMUM_CPU_FAMILY - int -diff --git a/arch/x86/Makefile b/arch/x86/Makefile -index 56e748a7679f..29eb64851528 100644 ---- a/arch/x86/Makefile -+++ b/arch/x86/Makefile -@@ -118,13 +118,46 @@ else - KBUILD_CFLAGS += $(call cc-option,-mskip-rax-setup) - - # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu) -+ cflags-$(CONFIG_MNATIVE) += $(call cc-option,-march=native) - cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8) -+ cflags-$(CONFIG_MK8SSE3) += $(call cc-option,-march=k8-sse3,-mtune=k8) -+ cflags-$(CONFIG_MK10) += $(call cc-option,-march=amdfam10) -+ cflags-$(CONFIG_MBARCELONA) += $(call cc-option,-march=barcelona) -+ cflags-$(CONFIG_MBOBCAT) += $(call cc-option,-march=btver1) -+ cflags-$(CONFIG_MJAGUAR) += $(call cc-option,-march=btver2) -+ cflags-$(CONFIG_MBULLDOZER) += $(call cc-option,-march=bdver1) -+ cflags-$(CONFIG_MPILEDRIVER) += $(call cc-option,-march=bdver2) -+ cflags-$(CONFIG_MSTEAMROLLER) += $(call cc-option,-march=bdver3) -+ cflags-$(CONFIG_MEXCAVATOR) += $(call cc-option,-march=bdver4) -+ cflags-$(CONFIG_MZEN) += $(call cc-option,-march=znver1) - cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona) - - cflags-$(CONFIG_MCORE2) += \ -- $(call cc-option,-march=core2,$(call cc-option,-mtune=generic)) -- cflags-$(CONFIG_MATOM) += $(call cc-option,-march=atom) \ -- $(call cc-option,-mtune=atom,$(call cc-option,-mtune=generic)) -+ $(call cc-option,-march=core2,$(call cc-option,-mtune=core2)) -+ cflags-$(CONFIG_MNEHALEM) += \ -+ $(call cc-option,-march=nehalem,$(call cc-option,-mtune=nehalem)) -+ cflags-$(CONFIG_MWESTMERE) += \ -+ $(call cc-option,-march=westmere,$(call cc-option,-mtune=westmere)) -+ cflags-$(CONFIG_MSILVERMONT) += \ -+ $(call cc-option,-march=silvermont,$(call cc-option,-mtune=silvermont)) -+ cflags-$(CONFIG_MSANDYBRIDGE) += \ -+ $(call cc-option,-march=sandybridge,$(call cc-option,-mtune=sandybridge)) -+ cflags-$(CONFIG_MIVYBRIDGE) += \ -+ $(call cc-option,-march=ivybridge,$(call cc-option,-mtune=ivybridge)) -+ cflags-$(CONFIG_MHASWELL) += \ -+ $(call cc-option,-march=haswell,$(call cc-option,-mtune=haswell)) -+ cflags-$(CONFIG_MBROADWELL) += \ -+ $(call cc-option,-march=broadwell,$(call cc-option,-mtune=broadwell)) -+ cflags-$(CONFIG_MSKYLAKE) += \ -+ $(call cc-option,-march=skylake,$(call cc-option,-mtune=skylake)) -+ cflags-$(CONFIG_MSKYLAKEX) += \ -+ $(call cc-option,-march=skylake-avx512,$(call cc-option,-mtune=skylake-avx512)) -+ cflags-$(CONFIG_MCANNONLAKE) += \ -+ $(call cc-option,-march=cannonlake,$(call cc-option,-mtune=cannonlake)) -+ cflags-$(CONFIG_MICELAKE) += \ -+ $(call cc-option,-march=icelake,$(call cc-option,-mtune=icelake)) -+ cflags-$(CONFIG_MATOM) += $(call cc-option,-march=bonnell) \ -+ $(call cc-option,-mtune=bonnell,$(call cc-option,-mtune=generic)) - cflags-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=generic) - KBUILD_CFLAGS += $(cflags-y) - -diff --git a/arch/x86/Makefile_32.cpu b/arch/x86/Makefile_32.cpu -index 1f5faf8606b4..14a6d19995cc 100644 ---- a/arch/x86/Makefile_32.cpu -+++ b/arch/x86/Makefile_32.cpu -@@ -23,7 +23,18 @@ cflags-$(CONFIG_MK6) += -march=k6 - # Please note, that patches that add -march=athlon-xp and friends are pointless. - # They make zero difference whatsosever to performance at this time. - cflags-$(CONFIG_MK7) += -march=athlon -+cflags-$(CONFIG_MNATIVE) += $(call cc-option,-march=native) - cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8,-march=athlon) -+cflags-$(CONFIG_MK8SSE3) += $(call cc-option,-march=k8-sse3,-march=athlon) -+cflags-$(CONFIG_MK10) += $(call cc-option,-march=amdfam10,-march=athlon) -+cflags-$(CONFIG_MBARCELONA) += $(call cc-option,-march=barcelona,-march=athlon) -+cflags-$(CONFIG_MBOBCAT) += $(call cc-option,-march=btver1,-march=athlon) -+cflags-$(CONFIG_MJAGUAR) += $(call cc-option,-march=btver2,-march=athlon) -+cflags-$(CONFIG_MBULLDOZER) += $(call cc-option,-march=bdver1,-march=athlon) -+cflags-$(CONFIG_MPILEDRIVER) += $(call cc-option,-march=bdver2,-march=athlon) -+cflags-$(CONFIG_MSTEAMROLLER) += $(call cc-option,-march=bdver3,-march=athlon) -+cflags-$(CONFIG_MEXCAVATOR) += $(call cc-option,-march=bdver4,-march=athlon) -+cflags-$(CONFIG_MZEN) += $(call cc-option,-march=znver1,-march=athlon) - cflags-$(CONFIG_MCRUSOE) += -march=i686 -falign-functions=0 -falign-jumps=0 -falign-loops=0 - cflags-$(CONFIG_MEFFICEON) += -march=i686 $(call tune,pentium3) -falign-functions=0 -falign-jumps=0 -falign-loops=0 - cflags-$(CONFIG_MWINCHIPC6) += $(call cc-option,-march=winchip-c6,-march=i586) -@@ -32,8 +43,19 @@ cflags-$(CONFIG_MCYRIXIII) += $(call cc-option,-march=c3,-march=i486) -falign-fu - cflags-$(CONFIG_MVIAC3_2) += $(call cc-option,-march=c3-2,-march=i686) - cflags-$(CONFIG_MVIAC7) += -march=i686 - cflags-$(CONFIG_MCORE2) += -march=i686 $(call tune,core2) --cflags-$(CONFIG_MATOM) += $(call cc-option,-march=atom,$(call cc-option,-march=core2,-march=i686)) \ -- $(call cc-option,-mtune=atom,$(call cc-option,-mtune=generic)) -+cflags-$(CONFIG_MNEHALEM) += -march=i686 $(call tune,nehalem) -+cflags-$(CONFIG_MWESTMERE) += -march=i686 $(call tune,westmere) -+cflags-$(CONFIG_MSILVERMONT) += -march=i686 $(call tune,silvermont) -+cflags-$(CONFIG_MSANDYBRIDGE) += -march=i686 $(call tune,sandybridge) -+cflags-$(CONFIG_MIVYBRIDGE) += -march=i686 $(call tune,ivybridge) -+cflags-$(CONFIG_MHASWELL) += -march=i686 $(call tune,haswell) -+cflags-$(CONFIG_MBROADWELL) += -march=i686 $(call tune,broadwell) -+cflags-$(CONFIG_MSKYLAKE) += -march=i686 $(call tune,skylake) -+cflags-$(CONFIG_MSKYLAKEX) += -march=i686 $(call tune,skylake-avx512) -+cflags-$(CONFIG_MCANNONLAKE) += -march=i686 $(call tune,cannonlake) -+cflags-$(CONFIG_MICELAKE) += -march=i686 $(call tune,icelake) -+cflags-$(CONFIG_MATOM) += $(call cc-option,-march=bonnell,$(call cc-option,-march=core2,-march=i686)) \ -+ $(call cc-option,-mtune=bonnell,$(call cc-option,-mtune=generic)) - - # AMD Elan support - cflags-$(CONFIG_MELAN) += -march=i486 -diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c -index 5a237e8dbf8d..0de54a1d25c0 100644 ---- a/arch/x86/boot/compressed/misc.c -+++ b/arch/x86/boot/compressed/misc.c -@@ -17,6 +17,7 @@ - #include "pgtable.h" - #include "../string.h" - #include "../voffset.h" -+#include - - /* - * WARNING!! -diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h -index d2f184165934..c8181392f70d 100644 ---- a/arch/x86/boot/compressed/misc.h -+++ b/arch/x86/boot/compressed/misc.h -@@ -23,7 +23,6 @@ - #include - #include - #include --#include - - #define BOOT_CTYPE_H - #include -diff --git a/arch/x86/boot/string.c b/arch/x86/boot/string.c -index 401e30ca0a75..8272a4492844 100644 ---- a/arch/x86/boot/string.c -+++ b/arch/x86/boot/string.c -@@ -37,6 +37,14 @@ int memcmp(const void *s1, const void *s2, size_t len) - return diff; - } - -+/* -+ * Clang may lower `memcmp == 0` to `bcmp == 0`. -+ */ -+int bcmp(const void *s1, const void *s2, size_t len) -+{ -+ return memcmp(s1, s2, len); -+} -+ - int strcmp(const char *str1, const char *str2) - { - const unsigned char *s1 = (const unsigned char *)str1; -diff --git a/arch/x86/entry/calling.h b/arch/x86/entry/calling.h -index efb0d1b1f15f..d6f2e29be3e2 100644 ---- a/arch/x86/entry/calling.h -+++ b/arch/x86/entry/calling.h -@@ -329,6 +329,23 @@ For 32-bit we have the following conventions - kernel is built with - - #endif - -+/* -+ * Mitigate Spectre v1 for conditional swapgs code paths. -+ * -+ * FENCE_SWAPGS_USER_ENTRY is used in the user entry swapgs code path, to -+ * prevent a speculative swapgs when coming from kernel space. -+ * -+ * FENCE_SWAPGS_KERNEL_ENTRY is used in the kernel entry non-swapgs code path, -+ * to prevent the swapgs from getting speculatively skipped when coming from -+ * user space. -+ */ -+.macro FENCE_SWAPGS_USER_ENTRY -+ ALTERNATIVE "", "lfence", X86_FEATURE_FENCE_SWAPGS_USER -+.endm -+.macro FENCE_SWAPGS_KERNEL_ENTRY -+ ALTERNATIVE "", "lfence", X86_FEATURE_FENCE_SWAPGS_KERNEL -+.endm -+ - .macro STACKLEAK_ERASE_NOCLOBBER - #ifdef CONFIG_GCC_PLUGIN_STACKLEAK - PUSH_AND_CLEAR_REGS -diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S -index 7b23431be5cb..f49e11669271 100644 ---- a/arch/x86/entry/entry_32.S -+++ b/arch/x86/entry/entry_32.S -@@ -1104,6 +1104,30 @@ ENTRY(irq_entries_start) - .endr - END(irq_entries_start) - -+#ifdef CONFIG_X86_LOCAL_APIC -+ .align 8 -+ENTRY(spurious_entries_start) -+ vector=FIRST_SYSTEM_VECTOR -+ .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR) -+ pushl $(~vector+0x80) /* Note: always in signed byte range */ -+ vector=vector+1 -+ jmp common_spurious -+ .align 8 -+ .endr -+END(spurious_entries_start) -+ -+common_spurious: -+ ASM_CLAC -+ addl $-0x80, (%esp) /* Adjust vector into the [-256, -1] range */ -+ SAVE_ALL switch_stacks=1 -+ ENCODE_FRAME_POINTER -+ TRACE_IRQS_OFF -+ movl %esp, %eax -+ call smp_spurious_interrupt -+ jmp ret_from_intr -+ENDPROC(common_spurious) -+#endif -+ - /* - * the CPU automatically disables interrupts when executing an IRQ vector, - * so IRQ-flags tracing has to follow that: -diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S -index 11aa3b2afa4d..69808aaa6851 100644 ---- a/arch/x86/entry/entry_64.S -+++ b/arch/x86/entry/entry_64.S -@@ -375,6 +375,18 @@ ENTRY(irq_entries_start) - .endr - END(irq_entries_start) - -+ .align 8 -+ENTRY(spurious_entries_start) -+ vector=FIRST_SYSTEM_VECTOR -+ .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR) -+ UNWIND_HINT_IRET_REGS -+ pushq $(~vector+0x80) /* Note: always in signed byte range */ -+ jmp common_spurious -+ .align 8 -+ vector=vector+1 -+ .endr -+END(spurious_entries_start) -+ - .macro DEBUG_ENTRY_ASSERT_IRQS_OFF - #ifdef CONFIG_DEBUG_ENTRY - pushq %rax -@@ -507,7 +519,7 @@ ENTRY(interrupt_entry) - testb $3, CS-ORIG_RAX+8(%rsp) - jz 1f - SWAPGS -- -+ FENCE_SWAPGS_USER_ENTRY - /* - * Switch to the thread stack. The IRET frame and orig_ax are - * on the stack, as well as the return address. RDI..R12 are -@@ -537,8 +549,10 @@ ENTRY(interrupt_entry) - UNWIND_HINT_FUNC - - movq (%rdi), %rdi -+ jmp 2f - 1: -- -+ FENCE_SWAPGS_KERNEL_ENTRY -+2: - PUSH_AND_CLEAR_REGS save_ret=1 - ENCODE_FRAME_POINTER 8 - -@@ -571,10 +585,20 @@ _ASM_NOKPROBE(interrupt_entry) - - /* Interrupt entry/exit. */ - -- /* -- * The interrupt stubs push (~vector+0x80) onto the stack and -- * then jump to common_interrupt. -- */ -+/* -+ * The interrupt stubs push (~vector+0x80) onto the stack and -+ * then jump to common_spurious/interrupt. -+ */ -+common_spurious: -+ addq $-0x80, (%rsp) /* Adjust vector to [-256, -1] range */ -+ call interrupt_entry -+ UNWIND_HINT_REGS indirect=1 -+ call smp_spurious_interrupt /* rdi points to pt_regs */ -+ jmp ret_from_intr -+END(common_spurious) -+_ASM_NOKPROBE(common_spurious) -+ -+/* common_interrupt is a hotpath. Align it */ - .p2align CONFIG_X86_L1_CACHE_SHIFT - common_interrupt: - addq $-0x80, (%rsp) /* Adjust vector to [-256, -1] range */ -@@ -1149,7 +1173,6 @@ idtentry stack_segment do_stack_segment has_error_code=1 - #ifdef CONFIG_XEN_PV - idtentry xennmi do_nmi has_error_code=0 - idtentry xendebug do_debug has_error_code=0 --idtentry xenint3 do_int3 has_error_code=0 - #endif - - idtentry general_protection do_general_protection has_error_code=1 -@@ -1194,6 +1217,13 @@ ENTRY(paranoid_entry) - */ - SAVE_AND_SWITCH_TO_KERNEL_CR3 scratch_reg=%rax save_reg=%r14 - -+ /* -+ * The above SAVE_AND_SWITCH_TO_KERNEL_CR3 macro doesn't do an -+ * unconditional CR3 write, even in the PTI case. So do an lfence -+ * to prevent GS speculation, regardless of whether PTI is enabled. -+ */ -+ FENCE_SWAPGS_KERNEL_ENTRY -+ - ret - END(paranoid_entry) - -@@ -1244,6 +1274,7 @@ ENTRY(error_entry) - * from user mode due to an IRET fault. - */ - SWAPGS -+ FENCE_SWAPGS_USER_ENTRY - /* We have user CR3. Change to kernel CR3. */ - SWITCH_TO_KERNEL_CR3 scratch_reg=%rax - -@@ -1265,6 +1296,8 @@ ENTRY(error_entry) - CALL_enter_from_user_mode - ret - -+.Lerror_entry_done_lfence: -+ FENCE_SWAPGS_KERNEL_ENTRY - .Lerror_entry_done: - TRACE_IRQS_OFF - ret -@@ -1283,7 +1316,7 @@ ENTRY(error_entry) - cmpq %rax, RIP+8(%rsp) - je .Lbstep_iret - cmpq $.Lgs_change, RIP+8(%rsp) -- jne .Lerror_entry_done -+ jne .Lerror_entry_done_lfence - - /* - * hack: .Lgs_change can fail with user gsbase. If this happens, fix up -@@ -1291,6 +1324,7 @@ ENTRY(error_entry) - * .Lgs_change's error handler with kernel gsbase. - */ - SWAPGS -+ FENCE_SWAPGS_USER_ENTRY - SWITCH_TO_KERNEL_CR3 scratch_reg=%rax - jmp .Lerror_entry_done - -@@ -1305,6 +1339,7 @@ ENTRY(error_entry) - * gsbase and CR3. Switch to kernel gsbase and CR3: - */ - SWAPGS -+ FENCE_SWAPGS_USER_ENTRY - SWITCH_TO_KERNEL_CR3 scratch_reg=%rax - - /* -@@ -1396,6 +1431,7 @@ ENTRY(nmi) - - swapgs - cld -+ FENCE_SWAPGS_USER_ENTRY - SWITCH_TO_KERNEL_CR3 scratch_reg=%rdx - movq %rsp, %rdx - movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp -diff --git a/arch/x86/events/amd/uncore.c b/arch/x86/events/amd/uncore.c -index 85e6984c560b..a6ea07f2aa84 100644 ---- a/arch/x86/events/amd/uncore.c -+++ b/arch/x86/events/amd/uncore.c -@@ -202,15 +202,22 @@ static int amd_uncore_event_init(struct perf_event *event) - hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB; - hwc->idx = -1; - -+ if (event->cpu < 0) -+ return -EINVAL; -+ - /* - * SliceMask and ThreadMask need to be set for certain L3 events in - * Family 17h. For other events, the two fields do not affect the count. - */ -- if (l3_mask) -- hwc->config |= (AMD64_L3_SLICE_MASK | AMD64_L3_THREAD_MASK); -+ if (l3_mask && is_llc_event(event)) { -+ int thread = 2 * (cpu_data(event->cpu).cpu_core_id % 4); - -- if (event->cpu < 0) -- return -EINVAL; -+ if (smp_num_siblings > 1) -+ thread += cpu_data(event->cpu).apicid & 1; -+ -+ hwc->config |= (1ULL << (AMD64_L3_THREAD_SHIFT + thread) & -+ AMD64_L3_THREAD_MASK) | AMD64_L3_SLICE_MASK; -+ } - - uncore = event_to_amd_uncore(event); - if (!uncore) -diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c -index a5436cee20b1..2889dd023566 100644 ---- a/arch/x86/events/intel/core.c -+++ b/arch/x86/events/intel/core.c -@@ -20,6 +20,7 @@ - #include - #include - #include -+#include - - #include "../perf_event.h" - -@@ -2160,12 +2161,10 @@ static void intel_pmu_disable_event(struct perf_event *event) - cpuc->intel_ctrl_host_mask &= ~(1ull << hwc->idx); - cpuc->intel_cp_status &= ~(1ull << hwc->idx); - -- if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) { -+ if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) - intel_pmu_disable_fixed(hwc); -- return; -- } -- -- x86_pmu_disable_event(event); -+ else -+ x86_pmu_disable_event(event); - - /* - * Needs to be called after x86_pmu_disable_event, -@@ -4054,6 +4053,13 @@ static bool check_msr(unsigned long msr, u64 mask) - { - u64 val_old, val_new, val_tmp; - -+ /* -+ * Disable the check for real HW, so we don't -+ * mess with potentionaly enabled registers: -+ */ -+ if (hypervisor_is_type(X86_HYPER_NATIVE)) -+ return true; -+ - /* - * Read the current value, change it and read it back to see if it - * matches, this is needed to detect certain hardware emulators -@@ -4439,6 +4445,7 @@ __init int intel_pmu_init(void) - struct event_constraint *c; - unsigned int unused; - struct extra_reg *er; -+ bool pmem = false; - int version, i; - char *name; - -@@ -4890,9 +4897,10 @@ __init int intel_pmu_init(void) - name = "knights-landing"; - break; - -+ case INTEL_FAM6_SKYLAKE_X: -+ pmem = true; - case INTEL_FAM6_SKYLAKE_MOBILE: - case INTEL_FAM6_SKYLAKE_DESKTOP: -- case INTEL_FAM6_SKYLAKE_X: - case INTEL_FAM6_KABYLAKE_MOBILE: - case INTEL_FAM6_KABYLAKE_DESKTOP: - x86_add_quirk(intel_pebs_isolation_quirk); -@@ -4925,8 +4933,7 @@ __init int intel_pmu_init(void) - x86_pmu.cpu_events = hsw_events_attrs; - mem_attr = hsw_mem_events_attrs; - tsx_attr = hsw_tsx_events_attrs; -- intel_pmu_pebs_data_source_skl( -- boot_cpu_data.x86_model == INTEL_FAM6_SKYLAKE_X); -+ intel_pmu_pebs_data_source_skl(pmem); - - if (boot_cpu_has(X86_FEATURE_TSX_FORCE_ABORT)) { - x86_pmu.flags |= PMU_FL_TFA; -@@ -4940,7 +4947,11 @@ __init int intel_pmu_init(void) - name = "skylake"; - break; - -+ case INTEL_FAM6_ICELAKE_X: -+ case INTEL_FAM6_ICELAKE_XEON_D: -+ pmem = true; - case INTEL_FAM6_ICELAKE_MOBILE: -+ case INTEL_FAM6_ICELAKE_DESKTOP: - x86_pmu.late_ack = true; - memcpy(hw_cache_event_ids, skl_hw_cache_event_ids, sizeof(hw_cache_event_ids)); - memcpy(hw_cache_extra_regs, skl_hw_cache_extra_regs, sizeof(hw_cache_extra_regs)); -@@ -4963,7 +4974,7 @@ __init int intel_pmu_init(void) - x86_pmu.cpu_events = get_icl_events_attrs(); - x86_pmu.rtm_abort_event = X86_CONFIG(.event=0xca, .umask=0x02); - x86_pmu.lbr_pt_coexist = true; -- intel_pmu_pebs_data_source_skl(false); -+ intel_pmu_pebs_data_source_skl(pmem); - pr_cont("Icelake events, "); - name = "icelake"; - break; -diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c -index 9e3fbd47cb56..089bfcdf2f7f 100644 ---- a/arch/x86/events/intel/uncore.c -+++ b/arch/x86/events/intel/uncore.c -@@ -1400,6 +1400,7 @@ static const struct x86_cpu_id intel_uncore_match[] __initconst = { - X86_UNCORE_MODEL_MATCH(INTEL_FAM6_KABYLAKE_MOBILE, skl_uncore_init), - X86_UNCORE_MODEL_MATCH(INTEL_FAM6_KABYLAKE_DESKTOP, skl_uncore_init), - X86_UNCORE_MODEL_MATCH(INTEL_FAM6_ICELAKE_MOBILE, icl_uncore_init), -+ X86_UNCORE_MODEL_MATCH(INTEL_FAM6_ICELAKE_NNPI, icl_uncore_init), - {}, - }; - -diff --git a/arch/x86/events/intel/uncore.h b/arch/x86/events/intel/uncore.h -index 79eb2e21e4f0..28499e39679f 100644 ---- a/arch/x86/events/intel/uncore.h -+++ b/arch/x86/events/intel/uncore.h -@@ -419,6 +419,16 @@ static inline bool is_freerunning_event(struct perf_event *event) - (((cfg >> 8) & 0xff) >= UNCORE_FREERUNNING_UMASK_START); - } - -+/* Check and reject invalid config */ -+static inline int uncore_freerunning_hw_config(struct intel_uncore_box *box, -+ struct perf_event *event) -+{ -+ if (is_freerunning_event(event)) -+ return 0; -+ -+ return -EINVAL; -+} -+ - static inline void uncore_disable_box(struct intel_uncore_box *box) - { - if (box->pmu->type->ops->disable_box) -diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c -index b10e04387f38..8e4e8e423839 100644 ---- a/arch/x86/events/intel/uncore_snbep.c -+++ b/arch/x86/events/intel/uncore_snbep.c -@@ -3585,6 +3585,7 @@ static struct uncore_event_desc skx_uncore_iio_freerunning_events[] = { - - static struct intel_uncore_ops skx_uncore_iio_freerunning_ops = { - .read_counter = uncore_msr_read_counter, -+ .hw_config = uncore_freerunning_hw_config, - }; - - static struct attribute *skx_uncore_iio_freerunning_formats_attr[] = { -diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c -index 1608050e9df9..dd92d8b438d4 100644 ---- a/arch/x86/hyperv/hv_init.c -+++ b/arch/x86/hyperv/hv_init.c -@@ -111,8 +111,17 @@ static int hv_cpu_init(unsigned int cpu) - if (!hv_vp_assist_page) - return 0; - -- if (!*hvp) -- *hvp = __vmalloc(PAGE_SIZE, GFP_KERNEL, PAGE_KERNEL); -+ /* -+ * The VP ASSIST PAGE is an "overlay" page (see Hyper-V TLFS's Section -+ * 5.2.1 "GPA Overlay Pages"). Here it must be zeroed out to make sure -+ * we always write the EOI MSR in hv_apic_eoi_write() *after* the -+ * EOI optimization is disabled in hv_cpu_die(), otherwise a CPU may -+ * not be stopped in the case of CPU offlining and the VM will hang. -+ */ -+ if (!*hvp) { -+ *hvp = __vmalloc(PAGE_SIZE, GFP_KERNEL | __GFP_ZERO, -+ PAGE_KERNEL); -+ } - - if (*hvp) { - u64 val; -diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h -index 1340fa53b575..2e599384abd8 100644 ---- a/arch/x86/include/asm/apic.h -+++ b/arch/x86/include/asm/apic.h -@@ -49,7 +49,7 @@ static inline void generic_apic_probe(void) - - #ifdef CONFIG_X86_LOCAL_APIC - --extern unsigned int apic_verbosity; -+extern int apic_verbosity; - extern int local_apic_timer_c2_ok; - - extern int disable_apic; -diff --git a/arch/x86/include/asm/atomic.h b/arch/x86/include/asm/atomic.h -index ea3d95275b43..115127c7ad28 100644 ---- a/arch/x86/include/asm/atomic.h -+++ b/arch/x86/include/asm/atomic.h -@@ -54,7 +54,7 @@ static __always_inline void arch_atomic_add(int i, atomic_t *v) - { - asm volatile(LOCK_PREFIX "addl %1,%0" - : "+m" (v->counter) -- : "ir" (i)); -+ : "ir" (i) : "memory"); - } - - /** -@@ -68,7 +68,7 @@ static __always_inline void arch_atomic_sub(int i, atomic_t *v) - { - asm volatile(LOCK_PREFIX "subl %1,%0" - : "+m" (v->counter) -- : "ir" (i)); -+ : "ir" (i) : "memory"); - } - - /** -@@ -95,7 +95,7 @@ static __always_inline bool arch_atomic_sub_and_test(int i, atomic_t *v) - static __always_inline void arch_atomic_inc(atomic_t *v) - { - asm volatile(LOCK_PREFIX "incl %0" -- : "+m" (v->counter)); -+ : "+m" (v->counter) :: "memory"); - } - #define arch_atomic_inc arch_atomic_inc - -@@ -108,7 +108,7 @@ static __always_inline void arch_atomic_inc(atomic_t *v) - static __always_inline void arch_atomic_dec(atomic_t *v) - { - asm volatile(LOCK_PREFIX "decl %0" -- : "+m" (v->counter)); -+ : "+m" (v->counter) :: "memory"); - } - #define arch_atomic_dec arch_atomic_dec - -diff --git a/arch/x86/include/asm/atomic64_64.h b/arch/x86/include/asm/atomic64_64.h -index dadc20adba21..5e86c0d68ac1 100644 ---- a/arch/x86/include/asm/atomic64_64.h -+++ b/arch/x86/include/asm/atomic64_64.h -@@ -45,7 +45,7 @@ static __always_inline void arch_atomic64_add(long i, atomic64_t *v) - { - asm volatile(LOCK_PREFIX "addq %1,%0" - : "=m" (v->counter) -- : "er" (i), "m" (v->counter)); -+ : "er" (i), "m" (v->counter) : "memory"); - } - - /** -@@ -59,7 +59,7 @@ static inline void arch_atomic64_sub(long i, atomic64_t *v) - { - asm volatile(LOCK_PREFIX "subq %1,%0" - : "=m" (v->counter) -- : "er" (i), "m" (v->counter)); -+ : "er" (i), "m" (v->counter) : "memory"); - } - - /** -@@ -87,7 +87,7 @@ static __always_inline void arch_atomic64_inc(atomic64_t *v) - { - asm volatile(LOCK_PREFIX "incq %0" - : "=m" (v->counter) -- : "m" (v->counter)); -+ : "m" (v->counter) : "memory"); - } - #define arch_atomic64_inc arch_atomic64_inc - -@@ -101,7 +101,7 @@ static __always_inline void arch_atomic64_dec(atomic64_t *v) - { - asm volatile(LOCK_PREFIX "decq %0" - : "=m" (v->counter) -- : "m" (v->counter)); -+ : "m" (v->counter) : "memory"); - } - #define arch_atomic64_dec arch_atomic64_dec - -diff --git a/arch/x86/include/asm/barrier.h b/arch/x86/include/asm/barrier.h -index 14de0432d288..84f848c2541a 100644 ---- a/arch/x86/include/asm/barrier.h -+++ b/arch/x86/include/asm/barrier.h -@@ -80,8 +80,8 @@ do { \ - }) - - /* Atomic operations are already serializing on x86 */ --#define __smp_mb__before_atomic() barrier() --#define __smp_mb__after_atomic() barrier() -+#define __smp_mb__before_atomic() do { } while (0) -+#define __smp_mb__after_atomic() do { } while (0) - - #include - -diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h -index 1d337c51f7e6..403f70c2e431 100644 ---- a/arch/x86/include/asm/cpufeature.h -+++ b/arch/x86/include/asm/cpufeature.h -@@ -22,8 +22,8 @@ enum cpuid_leafs - CPUID_LNX_3, - CPUID_7_0_EBX, - CPUID_D_1_EAX, -- CPUID_F_0_EDX, -- CPUID_F_1_EDX, -+ CPUID_LNX_4, -+ CPUID_DUMMY, - CPUID_8000_0008_EBX, - CPUID_6_EAX, - CPUID_8000_000A_EDX, -diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h -index 75f27ee2c263..49a8c25eada4 100644 ---- a/arch/x86/include/asm/cpufeatures.h -+++ b/arch/x86/include/asm/cpufeatures.h -@@ -239,12 +239,14 @@ - #define X86_FEATURE_BMI1 ( 9*32+ 3) /* 1st group bit manipulation extensions */ - #define X86_FEATURE_HLE ( 9*32+ 4) /* Hardware Lock Elision */ - #define X86_FEATURE_AVX2 ( 9*32+ 5) /* AVX2 instructions */ -+#define X86_FEATURE_FDP_EXCPTN_ONLY ( 9*32+ 6) /* "" FPU data pointer updated only on x87 exceptions */ - #define X86_FEATURE_SMEP ( 9*32+ 7) /* Supervisor Mode Execution Protection */ - #define X86_FEATURE_BMI2 ( 9*32+ 8) /* 2nd group bit manipulation extensions */ - #define X86_FEATURE_ERMS ( 9*32+ 9) /* Enhanced REP MOVSB/STOSB instructions */ - #define X86_FEATURE_INVPCID ( 9*32+10) /* Invalidate Processor Context ID */ - #define X86_FEATURE_RTM ( 9*32+11) /* Restricted Transactional Memory */ - #define X86_FEATURE_CQM ( 9*32+12) /* Cache QoS Monitoring */ -+#define X86_FEATURE_ZERO_FCS_FDS ( 9*32+13) /* "" Zero out FPU CS and FPU DS */ - #define X86_FEATURE_MPX ( 9*32+14) /* Memory Protection Extension */ - #define X86_FEATURE_RDT_A ( 9*32+15) /* Resource Director Technology Allocation */ - #define X86_FEATURE_AVX512F ( 9*32+16) /* AVX-512 Foundation */ -@@ -269,13 +271,18 @@ - #define X86_FEATURE_XGETBV1 (10*32+ 2) /* XGETBV with ECX = 1 instruction */ - #define X86_FEATURE_XSAVES (10*32+ 3) /* XSAVES/XRSTORS instructions */ - --/* Intel-defined CPU QoS Sub-leaf, CPUID level 0x0000000F:0 (EDX), word 11 */ --#define X86_FEATURE_CQM_LLC (11*32+ 1) /* LLC QoS if 1 */ -- --/* Intel-defined CPU QoS Sub-leaf, CPUID level 0x0000000F:1 (EDX), word 12 */ --#define X86_FEATURE_CQM_OCCUP_LLC (12*32+ 0) /* LLC occupancy monitoring */ --#define X86_FEATURE_CQM_MBM_TOTAL (12*32+ 1) /* LLC Total MBM monitoring */ --#define X86_FEATURE_CQM_MBM_LOCAL (12*32+ 2) /* LLC Local MBM monitoring */ -+/* -+ * Extended auxiliary flags: Linux defined - for features scattered in various -+ * CPUID levels like 0xf, etc. -+ * -+ * Reuse free bits when adding new feature flags! -+ */ -+#define X86_FEATURE_CQM_LLC (11*32+ 0) /* LLC QoS if 1 */ -+#define X86_FEATURE_CQM_OCCUP_LLC (11*32+ 1) /* LLC occupancy monitoring */ -+#define X86_FEATURE_CQM_MBM_TOTAL (11*32+ 2) /* LLC Total MBM monitoring */ -+#define X86_FEATURE_CQM_MBM_LOCAL (11*32+ 3) /* LLC Local MBM monitoring */ -+#define X86_FEATURE_FENCE_SWAPGS_USER (11*32+ 4) /* "" LFENCE in user entry SWAPGS path */ -+#define X86_FEATURE_FENCE_SWAPGS_KERNEL (11*32+ 5) /* "" LFENCE in kernel entry SWAPGS path */ - - /* AMD-defined CPU features, CPUID level 0x80000008 (EBX), word 13 */ - #define X86_FEATURE_CLZERO (13*32+ 0) /* CLZERO instruction */ -@@ -385,5 +392,6 @@ - #define X86_BUG_L1TF X86_BUG(18) /* CPU is affected by L1 Terminal Fault */ - #define X86_BUG_MDS X86_BUG(19) /* CPU is affected by Microarchitectural data sampling */ - #define X86_BUG_MSBDS_ONLY X86_BUG(20) /* CPU is only affected by the MSDBS variant of BUG_MDS */ -+#define X86_BUG_SWAPGS X86_BUG(21) /* CPU is affected by speculation through SWAPGS */ - - #endif /* _ASM_X86_CPUFEATURES_H */ -diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h -index 32e666e1231e..cbd97e22d2f3 100644 ---- a/arch/x86/include/asm/hw_irq.h -+++ b/arch/x86/include/asm/hw_irq.h -@@ -150,8 +150,11 @@ extern char irq_entries_start[]; - #define trace_irq_entries_start irq_entries_start - #endif - -+extern char spurious_entries_start[]; -+ - #define VECTOR_UNUSED NULL --#define VECTOR_RETRIGGERED ((void *)~0UL) -+#define VECTOR_SHUTDOWN ((void *)~0UL) -+#define VECTOR_RETRIGGERED ((void *)~1UL) - - typedef struct irq_desc* vector_irq_t[NR_VECTORS]; - DECLARE_PER_CPU(vector_irq_t, vector_irq); -diff --git a/arch/x86/include/asm/intel-family.h b/arch/x86/include/asm/intel-family.h -index 310118805f57..f60ddd655c78 100644 ---- a/arch/x86/include/asm/intel-family.h -+++ b/arch/x86/include/asm/intel-family.h -@@ -56,6 +56,7 @@ - #define INTEL_FAM6_ICELAKE_XEON_D 0x6C - #define INTEL_FAM6_ICELAKE_DESKTOP 0x7D - #define INTEL_FAM6_ICELAKE_MOBILE 0x7E -+#define INTEL_FAM6_ICELAKE_NNPI 0x9D - - /* "Small Core" Processors (Atom) */ - -diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h -index 26d1eb83f72a..8253925c5e8c 100644 ---- a/arch/x86/include/asm/kvm_host.h -+++ b/arch/x86/include/asm/kvm_host.h -@@ -607,15 +607,16 @@ struct kvm_vcpu_arch { - - /* - * QEMU userspace and the guest each have their own FPU state. -- * In vcpu_run, we switch between the user, maintained in the -- * task_struct struct, and guest FPU contexts. While running a VCPU, -- * the VCPU thread will have the guest FPU context. -+ * In vcpu_run, we switch between the user and guest FPU contexts. -+ * While running a VCPU, the VCPU thread will have the guest FPU -+ * context. - * - * Note that while the PKRU state lives inside the fpu registers, - * it is switched out separately at VMENTER and VMEXIT time. The - * "guest_fpu" state here contains the guest FPU context, with the - * host PRKU bits. - */ -+ struct fpu user_fpu; - struct fpu *guest_fpu; - - u64 xcr0; -@@ -1490,25 +1491,29 @@ enum { - #define kvm_arch_vcpu_memslots_id(vcpu) ((vcpu)->arch.hflags & HF_SMM_MASK ? 1 : 0) - #define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, (role).smm) - -+asmlinkage void __noreturn kvm_spurious_fault(void); -+ - /* - * Hardware virtualization extension instructions may fault if a - * reboot turns off virtualization while processes are running. -- * Trap the fault and ignore the instruction if that happens. -+ * Usually after catching the fault we just panic; during reboot -+ * instead the instruction is ignored. - */ --asmlinkage void kvm_spurious_fault(void); -- --#define ____kvm_handle_fault_on_reboot(insn, cleanup_insn) \ -- "666: " insn "\n\t" \ -- "668: \n\t" \ -- ".pushsection .fixup, \"ax\" \n" \ -- "667: \n\t" \ -- cleanup_insn "\n\t" \ -- "cmpb $0, kvm_rebooting \n\t" \ -- "jne 668b \n\t" \ -- __ASM_SIZE(push) " $666b \n\t" \ -- "jmp kvm_spurious_fault \n\t" \ -- ".popsection \n\t" \ -- _ASM_EXTABLE(666b, 667b) -+#define ____kvm_handle_fault_on_reboot(insn, cleanup_insn) \ -+ "666: \n\t" \ -+ insn "\n\t" \ -+ "jmp 668f \n\t" \ -+ "667: \n\t" \ -+ "call kvm_spurious_fault \n\t" \ -+ "668: \n\t" \ -+ ".pushsection .fixup, \"ax\" \n\t" \ -+ "700: \n\t" \ -+ cleanup_insn "\n\t" \ -+ "cmpb $0, kvm_rebooting\n\t" \ -+ "je 667b \n\t" \ -+ "jmp 668b \n\t" \ -+ ".popsection \n\t" \ -+ _ASM_EXTABLE(666b, 700b) - - #define __kvm_handle_fault_on_reboot(insn) \ - ____kvm_handle_fault_on_reboot(insn, "") -diff --git a/arch/x86/include/asm/module.h b/arch/x86/include/asm/module.h -index 7948a17febb4..44b776297dc3 100644 ---- a/arch/x86/include/asm/module.h -+++ b/arch/x86/include/asm/module.h -@@ -25,6 +25,30 @@ struct mod_arch_specific { - #define MODULE_PROC_FAMILY "586MMX " - #elif defined CONFIG_MCORE2 - #define MODULE_PROC_FAMILY "CORE2 " -+#elif defined CONFIG_MNATIVE -+#define MODULE_PROC_FAMILY "NATIVE " -+#elif defined CONFIG_MNEHALEM -+#define MODULE_PROC_FAMILY "NEHALEM " -+#elif defined CONFIG_MWESTMERE -+#define MODULE_PROC_FAMILY "WESTMERE " -+#elif defined CONFIG_MSILVERMONT -+#define MODULE_PROC_FAMILY "SILVERMONT " -+#elif defined CONFIG_MSANDYBRIDGE -+#define MODULE_PROC_FAMILY "SANDYBRIDGE " -+#elif defined CONFIG_MIVYBRIDGE -+#define MODULE_PROC_FAMILY "IVYBRIDGE " -+#elif defined CONFIG_MHASWELL -+#define MODULE_PROC_FAMILY "HASWELL " -+#elif defined CONFIG_MBROADWELL -+#define MODULE_PROC_FAMILY "BROADWELL " -+#elif defined CONFIG_MSKYLAKE -+#define MODULE_PROC_FAMILY "SKYLAKE " -+#elif defined CONFIG_MSKYLAKEX -+#define MODULE_PROC_FAMILY "SKYLAKEX " -+#elif defined CONFIG_MCANNONLAKE -+#define MODULE_PROC_FAMILY "CANNONLAKE " -+#elif defined CONFIG_MICELAKE -+#define MODULE_PROC_FAMILY "ICELAKE " - #elif defined CONFIG_MATOM - #define MODULE_PROC_FAMILY "ATOM " - #elif defined CONFIG_M686 -@@ -43,6 +67,26 @@ struct mod_arch_specific { - #define MODULE_PROC_FAMILY "K7 " - #elif defined CONFIG_MK8 - #define MODULE_PROC_FAMILY "K8 " -+#elif defined CONFIG_MK8SSE3 -+#define MODULE_PROC_FAMILY "K8SSE3 " -+#elif defined CONFIG_MK10 -+#define MODULE_PROC_FAMILY "K10 " -+#elif defined CONFIG_MBARCELONA -+#define MODULE_PROC_FAMILY "BARCELONA " -+#elif defined CONFIG_MBOBCAT -+#define MODULE_PROC_FAMILY "BOBCAT " -+#elif defined CONFIG_MBULLDOZER -+#define MODULE_PROC_FAMILY "BULLDOZER " -+#elif defined CONFIG_MPILEDRIVER -+#define MODULE_PROC_FAMILY "PILEDRIVER " -+#elif defined CONFIG_MSTEAMROLLER -+#define MODULE_PROC_FAMILY "STEAMROLLER " -+#elif defined CONFIG_MJAGUAR -+#define MODULE_PROC_FAMILY "JAGUAR " -+#elif defined CONFIG_MEXCAVATOR -+#define MODULE_PROC_FAMILY "EXCAVATOR " -+#elif defined CONFIG_MZEN -+#define MODULE_PROC_FAMILY "ZEN " - #elif defined CONFIG_MELAN - #define MODULE_PROC_FAMILY "ELAN " - #elif defined CONFIG_MCRUSOE -diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h -index c25c38a05c1c..d6f5ae2c79ab 100644 ---- a/arch/x86/include/asm/paravirt.h -+++ b/arch/x86/include/asm/paravirt.h -@@ -746,6 +746,7 @@ bool __raw_callee_save___native_vcpu_is_preempted(long cpu); - PV_RESTORE_ALL_CALLER_REGS \ - FRAME_END \ - "ret;" \ -+ ".size " PV_THUNK_NAME(func) ", .-" PV_THUNK_NAME(func) ";" \ - ".popsection") - - /* Get a reference to a callee-save function */ -diff --git a/arch/x86/include/asm/traps.h b/arch/x86/include/asm/traps.h -index 7d6f3f3fad78..f2bd284abc16 100644 ---- a/arch/x86/include/asm/traps.h -+++ b/arch/x86/include/asm/traps.h -@@ -40,7 +40,7 @@ asmlinkage void simd_coprocessor_error(void); - asmlinkage void xen_divide_error(void); - asmlinkage void xen_xennmi(void); - asmlinkage void xen_xendebug(void); --asmlinkage void xen_xenint3(void); -+asmlinkage void xen_int3(void); - asmlinkage void xen_overflow(void); - asmlinkage void xen_bounds(void); - asmlinkage void xen_invalid_op(void); -diff --git a/arch/x86/include/uapi/asm/vmx.h b/arch/x86/include/uapi/asm/vmx.h -index d213ec5c3766..f0b0c90dd398 100644 ---- a/arch/x86/include/uapi/asm/vmx.h -+++ b/arch/x86/include/uapi/asm/vmx.h -@@ -146,7 +146,6 @@ - - #define VMX_ABORT_SAVE_GUEST_MSR_FAIL 1 - #define VMX_ABORT_LOAD_HOST_PDPTE_FAIL 2 --#define VMX_ABORT_VMCS_CORRUPTED 3 - #define VMX_ABORT_LOAD_HOST_MSR_FAIL 4 - - #endif /* _UAPIVMX_H */ -diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c -index 85be316665b4..530cf1fd68a2 100644 ---- a/arch/x86/kernel/apic/apic.c -+++ b/arch/x86/kernel/apic/apic.c -@@ -183,7 +183,7 @@ EXPORT_SYMBOL_GPL(local_apic_timer_c2_ok); - /* - * Debug level, exported for io_apic.c - */ --unsigned int apic_verbosity; -+int apic_verbosity; - - int pic_mode; - -@@ -2041,21 +2041,32 @@ __visible void __irq_entry smp_spurious_interrupt(struct pt_regs *regs) - entering_irq(); - trace_spurious_apic_entry(vector); - -+ inc_irq_stat(irq_spurious_count); -+ -+ /* -+ * If this is a spurious interrupt then do not acknowledge -+ */ -+ if (vector == SPURIOUS_APIC_VECTOR) { -+ /* See SDM vol 3 */ -+ pr_info("Spurious APIC interrupt (vector 0xFF) on CPU#%d, should never happen.\n", -+ smp_processor_id()); -+ goto out; -+ } -+ - /* -- * Check if this really is a spurious interrupt and ACK it -- * if it is a vectored one. Just in case... -- * Spurious interrupts should not be ACKed. -+ * If it is a vectored one, verify it's set in the ISR. If set, -+ * acknowledge it. - */ - v = apic_read(APIC_ISR + ((vector & ~0x1f) >> 1)); -- if (v & (1 << (vector & 0x1f))) -+ if (v & (1 << (vector & 0x1f))) { -+ pr_info("Spurious interrupt (vector 0x%02x) on CPU#%d. Acked\n", -+ vector, smp_processor_id()); - ack_APIC_irq(); -- -- inc_irq_stat(irq_spurious_count); -- -- /* see sw-dev-man vol 3, chapter 7.4.13.5 */ -- pr_info("spurious APIC interrupt through vector %02x on CPU#%d, " -- "should never happen.\n", vector, smp_processor_id()); -- -+ } else { -+ pr_info("Spurious interrupt (vector 0x%02x) on CPU#%d. Not pending!\n", -+ vector, smp_processor_id()); -+ } -+out: - trace_spurious_apic_exit(vector); - exiting_irq(); - } -diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c -index 53aa234a6803..c9fec0657eea 100644 ---- a/arch/x86/kernel/apic/io_apic.c -+++ b/arch/x86/kernel/apic/io_apic.c -@@ -1893,6 +1893,50 @@ static int ioapic_set_affinity(struct irq_data *irq_data, - return ret; - } - -+/* -+ * Interrupt shutdown masks the ioapic pin, but the interrupt might already -+ * be in flight, but not yet serviced by the target CPU. That means -+ * __synchronize_hardirq() would return and claim that everything is calmed -+ * down. So free_irq() would proceed and deactivate the interrupt and free -+ * resources. -+ * -+ * Once the target CPU comes around to service it it will find a cleared -+ * vector and complain. While the spurious interrupt is harmless, the full -+ * release of resources might prevent the interrupt from being acknowledged -+ * which keeps the hardware in a weird state. -+ * -+ * Verify that the corresponding Remote-IRR bits are clear. -+ */ -+static int ioapic_irq_get_chip_state(struct irq_data *irqd, -+ enum irqchip_irq_state which, -+ bool *state) -+{ -+ struct mp_chip_data *mcd = irqd->chip_data; -+ struct IO_APIC_route_entry rentry; -+ struct irq_pin_list *p; -+ -+ if (which != IRQCHIP_STATE_ACTIVE) -+ return -EINVAL; -+ -+ *state = false; -+ raw_spin_lock(&ioapic_lock); -+ for_each_irq_pin(p, mcd->irq_2_pin) { -+ rentry = __ioapic_read_entry(p->apic, p->pin); -+ /* -+ * The remote IRR is only valid in level trigger mode. It's -+ * meaning is undefined for edge triggered interrupts and -+ * irrelevant because the IO-APIC treats them as fire and -+ * forget. -+ */ -+ if (rentry.irr && rentry.trigger) { -+ *state = true; -+ break; -+ } -+ } -+ raw_spin_unlock(&ioapic_lock); -+ return 0; -+} -+ - static struct irq_chip ioapic_chip __read_mostly = { - .name = "IO-APIC", - .irq_startup = startup_ioapic_irq, -@@ -1902,6 +1946,7 @@ static struct irq_chip ioapic_chip __read_mostly = { - .irq_eoi = ioapic_ack_level, - .irq_set_affinity = ioapic_set_affinity, - .irq_retrigger = irq_chip_retrigger_hierarchy, -+ .irq_get_irqchip_state = ioapic_irq_get_chip_state, - .flags = IRQCHIP_SKIP_SET_WAKE, - }; - -@@ -1914,6 +1959,7 @@ static struct irq_chip ioapic_ir_chip __read_mostly = { - .irq_eoi = ioapic_ir_ack_level, - .irq_set_affinity = ioapic_set_affinity, - .irq_retrigger = irq_chip_retrigger_hierarchy, -+ .irq_get_irqchip_state = ioapic_irq_get_chip_state, - .flags = IRQCHIP_SKIP_SET_WAKE, - }; - -diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c -index e7cb78aed644..fdacb864c3dd 100644 ---- a/arch/x86/kernel/apic/vector.c -+++ b/arch/x86/kernel/apic/vector.c -@@ -340,7 +340,7 @@ static void clear_irq_vector(struct irq_data *irqd) - trace_vector_clear(irqd->irq, vector, apicd->cpu, apicd->prev_vector, - apicd->prev_cpu); - -- per_cpu(vector_irq, apicd->cpu)[vector] = VECTOR_UNUSED; -+ per_cpu(vector_irq, apicd->cpu)[vector] = VECTOR_SHUTDOWN; - irq_matrix_free(vector_matrix, apicd->cpu, vector, managed); - apicd->vector = 0; - -@@ -349,7 +349,7 @@ static void clear_irq_vector(struct irq_data *irqd) - if (!vector) - return; - -- per_cpu(vector_irq, apicd->prev_cpu)[vector] = VECTOR_UNUSED; -+ per_cpu(vector_irq, apicd->prev_cpu)[vector] = VECTOR_SHUTDOWN; - irq_matrix_free(vector_matrix, apicd->prev_cpu, vector, managed); - apicd->prev_vector = 0; - apicd->move_in_progress = 0; -diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c -index 66ca906aa790..c6fa3ef10b4e 100644 ---- a/arch/x86/kernel/cpu/bugs.c -+++ b/arch/x86/kernel/cpu/bugs.c -@@ -34,6 +34,7 @@ - - #include "cpu.h" - -+static void __init spectre_v1_select_mitigation(void); - static void __init spectre_v2_select_mitigation(void); - static void __init ssb_select_mitigation(void); - static void __init l1tf_select_mitigation(void); -@@ -98,17 +99,11 @@ void __init check_bugs(void) - if (boot_cpu_has(X86_FEATURE_STIBP)) - x86_spec_ctrl_mask |= SPEC_CTRL_STIBP; - -- /* Select the proper spectre mitigation before patching alternatives */ -+ /* Select the proper CPU mitigations before patching alternatives: */ -+ spectre_v1_select_mitigation(); - spectre_v2_select_mitigation(); -- -- /* -- * Select proper mitigation for any exposure to the Speculative Store -- * Bypass vulnerability. -- */ - ssb_select_mitigation(); -- - l1tf_select_mitigation(); -- - mds_select_mitigation(); - - arch_smt_update(); -@@ -273,6 +268,98 @@ static int __init mds_cmdline(char *str) - } - early_param("mds", mds_cmdline); - -+#undef pr_fmt -+#define pr_fmt(fmt) "Spectre V1 : " fmt -+ -+enum spectre_v1_mitigation { -+ SPECTRE_V1_MITIGATION_NONE, -+ SPECTRE_V1_MITIGATION_AUTO, -+}; -+ -+static enum spectre_v1_mitigation spectre_v1_mitigation __ro_after_init = -+ SPECTRE_V1_MITIGATION_AUTO; -+ -+static const char * const spectre_v1_strings[] = { -+ [SPECTRE_V1_MITIGATION_NONE] = "Vulnerable: __user pointer sanitization and usercopy barriers only; no swapgs barriers", -+ [SPECTRE_V1_MITIGATION_AUTO] = "Mitigation: usercopy/swapgs barriers and __user pointer sanitization", -+}; -+ -+/* -+ * Does SMAP provide full mitigation against speculative kernel access to -+ * userspace? -+ */ -+static bool smap_works_speculatively(void) -+{ -+ if (!boot_cpu_has(X86_FEATURE_SMAP)) -+ return false; -+ -+ /* -+ * On CPUs which are vulnerable to Meltdown, SMAP does not -+ * prevent speculative access to user data in the L1 cache. -+ * Consider SMAP to be non-functional as a mitigation on these -+ * CPUs. -+ */ -+ if (boot_cpu_has(X86_BUG_CPU_MELTDOWN)) -+ return false; -+ -+ return true; -+} -+ -+static void __init spectre_v1_select_mitigation(void) -+{ -+ if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V1) || cpu_mitigations_off()) { -+ spectre_v1_mitigation = SPECTRE_V1_MITIGATION_NONE; -+ return; -+ } -+ -+ if (spectre_v1_mitigation == SPECTRE_V1_MITIGATION_AUTO) { -+ /* -+ * With Spectre v1, a user can speculatively control either -+ * path of a conditional swapgs with a user-controlled GS -+ * value. The mitigation is to add lfences to both code paths. -+ * -+ * If FSGSBASE is enabled, the user can put a kernel address in -+ * GS, in which case SMAP provides no protection. -+ * -+ * [ NOTE: Don't check for X86_FEATURE_FSGSBASE until the -+ * FSGSBASE enablement patches have been merged. ] -+ * -+ * If FSGSBASE is disabled, the user can only put a user space -+ * address in GS. That makes an attack harder, but still -+ * possible if there's no SMAP protection. -+ */ -+ if (!smap_works_speculatively()) { -+ /* -+ * Mitigation can be provided from SWAPGS itself or -+ * PTI as the CR3 write in the Meltdown mitigation -+ * is serializing. -+ * -+ * If neither is there, mitigate with an LFENCE to -+ * stop speculation through swapgs. -+ */ -+ if (boot_cpu_has_bug(X86_BUG_SWAPGS) && -+ !boot_cpu_has(X86_FEATURE_PTI)) -+ setup_force_cpu_cap(X86_FEATURE_FENCE_SWAPGS_USER); -+ -+ /* -+ * Enable lfences in the kernel entry (non-swapgs) -+ * paths, to prevent user entry from speculatively -+ * skipping swapgs. -+ */ -+ setup_force_cpu_cap(X86_FEATURE_FENCE_SWAPGS_KERNEL); -+ } -+ } -+ -+ pr_info("%s\n", spectre_v1_strings[spectre_v1_mitigation]); -+} -+ -+static int __init nospectre_v1_cmdline(char *str) -+{ -+ spectre_v1_mitigation = SPECTRE_V1_MITIGATION_NONE; -+ return 0; -+} -+early_param("nospectre_v1", nospectre_v1_cmdline); -+ - #undef pr_fmt - #define pr_fmt(fmt) "Spectre V2 : " fmt - -@@ -1226,7 +1313,7 @@ static ssize_t l1tf_show_state(char *buf) - - static ssize_t mds_show_state(char *buf) - { -- if (!hypervisor_is_type(X86_HYPER_NATIVE)) { -+ if (boot_cpu_has(X86_FEATURE_HYPERVISOR)) { - return sprintf(buf, "%s; SMT Host state unknown\n", - mds_strings[mds_mitigation]); - } -@@ -1290,7 +1377,7 @@ static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr - break; - - case X86_BUG_SPECTRE_V1: -- return sprintf(buf, "Mitigation: __user pointer sanitization\n"); -+ return sprintf(buf, "%s\n", spectre_v1_strings[spectre_v1_mitigation]); - - case X86_BUG_SPECTRE_V2: - return sprintf(buf, "%s%s%s%s%s%s\n", spectre_v2_strings[spectre_v2_enabled], -diff --git a/arch/x86/kernel/cpu/cacheinfo.c b/arch/x86/kernel/cpu/cacheinfo.c -index 395d46f78582..c7503be92f35 100644 ---- a/arch/x86/kernel/cpu/cacheinfo.c -+++ b/arch/x86/kernel/cpu/cacheinfo.c -@@ -658,8 +658,7 @@ void cacheinfo_amd_init_llc_id(struct cpuinfo_x86 *c, int cpu, u8 node_id) - if (c->x86 < 0x17) { - /* LLC is at the node level. */ - per_cpu(cpu_llc_id, cpu) = node_id; -- } else if (c->x86 == 0x17 && -- c->x86_model >= 0 && c->x86_model <= 0x1F) { -+ } else if (c->x86 == 0x17 && c->x86_model <= 0x1F) { - /* - * LLC is at the core complex level. - * Core complex ID is ApicId[3] for these processors. -diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c -index 2c57fffebf9b..3ae218b51eed 100644 ---- a/arch/x86/kernel/cpu/common.c -+++ b/arch/x86/kernel/cpu/common.c -@@ -801,6 +801,30 @@ static void init_speculation_control(struct cpuinfo_x86 *c) - } - } - -+static void init_cqm(struct cpuinfo_x86 *c) -+{ -+ if (!cpu_has(c, X86_FEATURE_CQM_LLC)) { -+ c->x86_cache_max_rmid = -1; -+ c->x86_cache_occ_scale = -1; -+ return; -+ } -+ -+ /* will be overridden if occupancy monitoring exists */ -+ c->x86_cache_max_rmid = cpuid_ebx(0xf); -+ -+ if (cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC) || -+ cpu_has(c, X86_FEATURE_CQM_MBM_TOTAL) || -+ cpu_has(c, X86_FEATURE_CQM_MBM_LOCAL)) { -+ u32 eax, ebx, ecx, edx; -+ -+ /* QoS sub-leaf, EAX=0Fh, ECX=1 */ -+ cpuid_count(0xf, 1, &eax, &ebx, &ecx, &edx); -+ -+ c->x86_cache_max_rmid = ecx; -+ c->x86_cache_occ_scale = ebx; -+ } -+} -+ - void get_cpu_cap(struct cpuinfo_x86 *c) - { - u32 eax, ebx, ecx, edx; -@@ -832,33 +856,6 @@ void get_cpu_cap(struct cpuinfo_x86 *c) - c->x86_capability[CPUID_D_1_EAX] = eax; - } - -- /* Additional Intel-defined flags: level 0x0000000F */ -- if (c->cpuid_level >= 0x0000000F) { -- -- /* QoS sub-leaf, EAX=0Fh, ECX=0 */ -- cpuid_count(0x0000000F, 0, &eax, &ebx, &ecx, &edx); -- c->x86_capability[CPUID_F_0_EDX] = edx; -- -- if (cpu_has(c, X86_FEATURE_CQM_LLC)) { -- /* will be overridden if occupancy monitoring exists */ -- c->x86_cache_max_rmid = ebx; -- -- /* QoS sub-leaf, EAX=0Fh, ECX=1 */ -- cpuid_count(0x0000000F, 1, &eax, &ebx, &ecx, &edx); -- c->x86_capability[CPUID_F_1_EDX] = edx; -- -- if ((cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC)) || -- ((cpu_has(c, X86_FEATURE_CQM_MBM_TOTAL)) || -- (cpu_has(c, X86_FEATURE_CQM_MBM_LOCAL)))) { -- c->x86_cache_max_rmid = ecx; -- c->x86_cache_occ_scale = ebx; -- } -- } else { -- c->x86_cache_max_rmid = -1; -- c->x86_cache_occ_scale = -1; -- } -- } -- - /* AMD-defined flags: level 0x80000001 */ - eax = cpuid_eax(0x80000000); - c->extended_cpuid_level = eax; -@@ -889,6 +886,7 @@ void get_cpu_cap(struct cpuinfo_x86 *c) - - init_scattered_cpuid_features(c); - init_speculation_control(c); -+ init_cqm(c); - - /* - * Clear/Set all flags overridden by options, after probe. -@@ -947,6 +945,7 @@ static void identify_cpu_without_cpuid(struct cpuinfo_x86 *c) - #define NO_L1TF BIT(3) - #define NO_MDS BIT(4) - #define MSBDS_ONLY BIT(5) -+#define NO_SWAPGS BIT(6) - - #define VULNWL(_vendor, _family, _model, _whitelist) \ - { X86_VENDOR_##_vendor, _family, _model, X86_FEATURE_ANY, _whitelist } -@@ -973,30 +972,38 @@ static const __initconst struct x86_cpu_id cpu_vuln_whitelist[] = { - VULNWL_INTEL(ATOM_BONNELL, NO_SPECULATION), - VULNWL_INTEL(ATOM_BONNELL_MID, NO_SPECULATION), - -- VULNWL_INTEL(ATOM_SILVERMONT, NO_SSB | NO_L1TF | MSBDS_ONLY), -- VULNWL_INTEL(ATOM_SILVERMONT_X, NO_SSB | NO_L1TF | MSBDS_ONLY), -- VULNWL_INTEL(ATOM_SILVERMONT_MID, NO_SSB | NO_L1TF | MSBDS_ONLY), -- VULNWL_INTEL(ATOM_AIRMONT, NO_SSB | NO_L1TF | MSBDS_ONLY), -- VULNWL_INTEL(XEON_PHI_KNL, NO_SSB | NO_L1TF | MSBDS_ONLY), -- VULNWL_INTEL(XEON_PHI_KNM, NO_SSB | NO_L1TF | MSBDS_ONLY), -+ VULNWL_INTEL(ATOM_SILVERMONT, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), -+ VULNWL_INTEL(ATOM_SILVERMONT_X, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), -+ VULNWL_INTEL(ATOM_SILVERMONT_MID, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), -+ VULNWL_INTEL(ATOM_AIRMONT, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), -+ VULNWL_INTEL(XEON_PHI_KNL, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), -+ VULNWL_INTEL(XEON_PHI_KNM, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), - - VULNWL_INTEL(CORE_YONAH, NO_SSB), - -- VULNWL_INTEL(ATOM_AIRMONT_MID, NO_L1TF | MSBDS_ONLY), -+ VULNWL_INTEL(ATOM_AIRMONT_MID, NO_L1TF | MSBDS_ONLY | NO_SWAPGS), - -- VULNWL_INTEL(ATOM_GOLDMONT, NO_MDS | NO_L1TF), -- VULNWL_INTEL(ATOM_GOLDMONT_X, NO_MDS | NO_L1TF), -- VULNWL_INTEL(ATOM_GOLDMONT_PLUS, NO_MDS | NO_L1TF), -+ VULNWL_INTEL(ATOM_GOLDMONT, NO_MDS | NO_L1TF | NO_SWAPGS), -+ VULNWL_INTEL(ATOM_GOLDMONT_X, NO_MDS | NO_L1TF | NO_SWAPGS), -+ VULNWL_INTEL(ATOM_GOLDMONT_PLUS, NO_MDS | NO_L1TF | NO_SWAPGS), -+ -+ /* -+ * Technically, swapgs isn't serializing on AMD (despite it previously -+ * being documented as such in the APM). But according to AMD, %gs is -+ * updated non-speculatively, and the issuing of %gs-relative memory -+ * operands will be blocked until the %gs update completes, which is -+ * good enough for our purposes. -+ */ - - /* AMD Family 0xf - 0x12 */ -- VULNWL_AMD(0x0f, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS), -- VULNWL_AMD(0x10, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS), -- VULNWL_AMD(0x11, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS), -- VULNWL_AMD(0x12, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS), -+ VULNWL_AMD(0x0f, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS), -+ VULNWL_AMD(0x10, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS), -+ VULNWL_AMD(0x11, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS), -+ VULNWL_AMD(0x12, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS), - - /* FAMILY_ANY must be last, otherwise 0x0f - 0x12 matches won't work */ -- VULNWL_AMD(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS), -- VULNWL_HYGON(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS), -+ VULNWL_AMD(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS), -+ VULNWL_HYGON(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS), - {} - }; - -@@ -1033,6 +1040,9 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c) - setup_force_cpu_bug(X86_BUG_MSBDS_ONLY); - } - -+ if (!cpu_matches(NO_SWAPGS)) -+ setup_force_cpu_bug(X86_BUG_SWAPGS); -+ - if (cpu_matches(NO_MELTDOWN)) - return; - -diff --git a/arch/x86/kernel/cpu/cpuid-deps.c b/arch/x86/kernel/cpu/cpuid-deps.c -index 2c0bd38a44ab..fa07a224e7b9 100644 ---- a/arch/x86/kernel/cpu/cpuid-deps.c -+++ b/arch/x86/kernel/cpu/cpuid-deps.c -@@ -59,6 +59,9 @@ static const struct cpuid_dep cpuid_deps[] = { - { X86_FEATURE_AVX512_4VNNIW, X86_FEATURE_AVX512F }, - { X86_FEATURE_AVX512_4FMAPS, X86_FEATURE_AVX512F }, - { X86_FEATURE_AVX512_VPOPCNTDQ, X86_FEATURE_AVX512F }, -+ { X86_FEATURE_CQM_OCCUP_LLC, X86_FEATURE_CQM_LLC }, -+ { X86_FEATURE_CQM_MBM_TOTAL, X86_FEATURE_CQM_LLC }, -+ { X86_FEATURE_CQM_MBM_LOCAL, X86_FEATURE_CQM_LLC }, - {} - }; - -diff --git a/arch/x86/kernel/cpu/mkcapflags.sh b/arch/x86/kernel/cpu/mkcapflags.sh -index d0dfb892c72f..aed45b8895d5 100644 ---- a/arch/x86/kernel/cpu/mkcapflags.sh -+++ b/arch/x86/kernel/cpu/mkcapflags.sh -@@ -4,6 +4,8 @@ - # Generate the x86_cap/bug_flags[] arrays from include/asm/cpufeatures.h - # - -+set -e -+ - IN=$1 - OUT=$2 - -diff --git a/arch/x86/kernel/cpu/scattered.c b/arch/x86/kernel/cpu/scattered.c -index 94aa1c72ca98..adf9b71386ef 100644 ---- a/arch/x86/kernel/cpu/scattered.c -+++ b/arch/x86/kernel/cpu/scattered.c -@@ -26,6 +26,10 @@ struct cpuid_bit { - static const struct cpuid_bit cpuid_bits[] = { - { X86_FEATURE_APERFMPERF, CPUID_ECX, 0, 0x00000006, 0 }, - { X86_FEATURE_EPB, CPUID_ECX, 3, 0x00000006, 0 }, -+ { X86_FEATURE_CQM_LLC, CPUID_EDX, 1, 0x0000000f, 0 }, -+ { X86_FEATURE_CQM_OCCUP_LLC, CPUID_EDX, 0, 0x0000000f, 1 }, -+ { X86_FEATURE_CQM_MBM_TOTAL, CPUID_EDX, 1, 0x0000000f, 1 }, -+ { X86_FEATURE_CQM_MBM_LOCAL, CPUID_EDX, 2, 0x0000000f, 1 }, - { X86_FEATURE_CAT_L3, CPUID_EBX, 1, 0x00000010, 0 }, - { X86_FEATURE_CAT_L2, CPUID_EBX, 2, 0x00000010, 0 }, - { X86_FEATURE_CDP_L3, CPUID_ECX, 2, 0x00000010, 1 }, -diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c -index d2482bbbe3d0..87ef69a72c52 100644 ---- a/arch/x86/kernel/idt.c -+++ b/arch/x86/kernel/idt.c -@@ -319,7 +319,8 @@ void __init idt_setup_apic_and_irq_gates(void) - #ifdef CONFIG_X86_LOCAL_APIC - for_each_clear_bit_from(i, system_vectors, NR_VECTORS) { - set_bit(i, system_vectors); -- set_intr_gate(i, spurious_interrupt); -+ entry = spurious_entries_start + 8 * (i - FIRST_SYSTEM_VECTOR); -+ set_intr_gate(i, entry); - } - #endif - } -diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c -index 9b68b5b00ac9..cc496eb7a8d2 100644 ---- a/arch/x86/kernel/irq.c -+++ b/arch/x86/kernel/irq.c -@@ -247,7 +247,7 @@ __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) - if (!handle_irq(desc, regs)) { - ack_APIC_irq(); - -- if (desc != VECTOR_RETRIGGERED) { -+ if (desc != VECTOR_RETRIGGERED && desc != VECTOR_SHUTDOWN) { - pr_emerg_ratelimited("%s: %d.%d No irq handler for vector\n", - __func__, smp_processor_id(), - vector); -diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c -index 5169b8cc35bb..320b70acb211 100644 ---- a/arch/x86/kernel/kvm.c -+++ b/arch/x86/kernel/kvm.c -@@ -817,6 +817,7 @@ asm( - "cmpb $0, " __stringify(KVM_STEAL_TIME_preempted) "+steal_time(%rax);" - "setne %al;" - "ret;" -+".size __raw_callee_save___kvm_vcpu_is_preempted, .-__raw_callee_save___kvm_vcpu_is_preempted;" - ".popsection"); - - #endif -diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c -index 1bfe5c6e6cfe..afac7ccce72f 100644 ---- a/arch/x86/kernel/mpparse.c -+++ b/arch/x86/kernel/mpparse.c -@@ -546,17 +546,15 @@ void __init default_get_smp_config(unsigned int early) - * local APIC has default address - */ - mp_lapic_addr = APIC_DEFAULT_PHYS_BASE; -- return; -+ goto out; - } - - pr_info("Default MP configuration #%d\n", mpf->feature1); - construct_default_ISA_mptable(mpf->feature1); - - } else if (mpf->physptr) { -- if (check_physptr(mpf, early)) { -- early_memunmap(mpf, sizeof(*mpf)); -- return; -- } -+ if (check_physptr(mpf, early)) -+ goto out; - } else - BUG(); - -@@ -565,7 +563,7 @@ void __init default_get_smp_config(unsigned int early) - /* - * Only use the first configuration found. - */ -- -+out: - early_memunmap(mpf, sizeof(*mpf)); - } - -diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c -index a166c960bc9e..e9d0bc3a5e88 100644 ---- a/arch/x86/kernel/ptrace.c -+++ b/arch/x86/kernel/ptrace.c -@@ -25,6 +25,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -643,9 +644,11 @@ static unsigned long ptrace_get_debugreg(struct task_struct *tsk, int n) - { - struct thread_struct *thread = &tsk->thread; - unsigned long val = 0; -+ int index = n; - - if (n < HBP_NUM) { -- struct perf_event *bp = thread->ptrace_bps[n]; -+ struct perf_event *bp = thread->ptrace_bps[index]; -+ index = array_index_nospec(index, HBP_NUM); - - if (bp) - val = bp->hw.info.address; -diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c -index 2abf27d7df6b..2d6898c2cb64 100644 ---- a/arch/x86/kernel/stacktrace.c -+++ b/arch/x86/kernel/stacktrace.c -@@ -100,7 +100,7 @@ copy_stack_frame(const void __user *fp, struct stack_frame_user *frame) - { - int ret; - -- if (!access_ok(fp, sizeof(*frame))) -+ if (__range_not_ok(fp, sizeof(*frame), TASK_SIZE)) - return 0; - - ret = 1; -@@ -129,11 +129,9 @@ void arch_stack_walk_user(stack_trace_consume_fn consume_entry, void *cookie, - break; - if ((unsigned long)fp < regs->sp) - break; -- if (frame.ret_addr) { -- if (!consume_entry(cookie, frame.ret_addr, false)) -- return; -- } -- if (fp == frame.next_fp) -+ if (!frame.ret_addr) -+ break; -+ if (!consume_entry(cookie, frame.ret_addr, false)) - break; - fp = frame.next_fp; - } -diff --git a/arch/x86/kernel/sysfb_efi.c b/arch/x86/kernel/sysfb_efi.c -index 8eb67a670b10..653b7f617b61 100644 ---- a/arch/x86/kernel/sysfb_efi.c -+++ b/arch/x86/kernel/sysfb_efi.c -@@ -230,9 +230,55 @@ static const struct dmi_system_id efifb_dmi_system_table[] __initconst = { - {}, - }; - -+/* -+ * Some devices have a portrait LCD but advertise a landscape resolution (and -+ * pitch). We simply swap width and height for these devices so that we can -+ * correctly deal with some of them coming with multiple resolutions. -+ */ -+static const struct dmi_system_id efifb_dmi_swap_width_height[] __initconst = { -+ { -+ /* -+ * Lenovo MIIX310-10ICR, only some batches have the troublesome -+ * 800x1280 portrait screen. Luckily the portrait version has -+ * its own BIOS version, so we match on that. -+ */ -+ .matches = { -+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"), -+ DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "MIIX 310-10ICR"), -+ DMI_EXACT_MATCH(DMI_BIOS_VERSION, "1HCN44WW"), -+ }, -+ }, -+ { -+ /* Lenovo MIIX 320-10ICR with 800x1280 portrait screen */ -+ .matches = { -+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"), -+ DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, -+ "Lenovo MIIX 320-10ICR"), -+ }, -+ }, -+ { -+ /* Lenovo D330 with 800x1280 or 1200x1920 portrait screen */ -+ .matches = { -+ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"), -+ DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, -+ "Lenovo ideapad D330-10IGM"), -+ }, -+ }, -+ {}, -+}; -+ - __init void sysfb_apply_efi_quirks(void) - { - if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI || - !(screen_info.capabilities & VIDEO_CAPABILITY_SKIP_QUIRKS)) - dmi_check_system(efifb_dmi_system_table); -+ -+ if (screen_info.orig_video_isVGA == VIDEO_TYPE_EFI && -+ dmi_check_system(efifb_dmi_swap_width_height)) { -+ u16 temp = screen_info.lfb_width; -+ -+ screen_info.lfb_width = screen_info.lfb_height; -+ screen_info.lfb_height = temp; -+ screen_info.lfb_linelength = 4 * screen_info.lfb_width; -+ } - } -diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c -index a5b802a12212..71d3fef1edc9 100644 ---- a/arch/x86/kernel/tls.c -+++ b/arch/x86/kernel/tls.c -@@ -5,6 +5,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -220,6 +221,7 @@ int do_get_thread_area(struct task_struct *p, int idx, - struct user_desc __user *u_info) - { - struct user_desc info; -+ int index; - - if (idx == -1 && get_user(idx, &u_info->entry_number)) - return -EFAULT; -@@ -227,8 +229,11 @@ int do_get_thread_area(struct task_struct *p, int idx, - if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) - return -EINVAL; - -- fill_user_desc(&info, idx, -- &p->thread.tls_array[idx - GDT_ENTRY_TLS_MIN]); -+ index = idx - GDT_ENTRY_TLS_MIN; -+ index = array_index_nospec(index, -+ GDT_ENTRY_TLS_MAX - GDT_ENTRY_TLS_MIN + 1); -+ -+ fill_user_desc(&info, idx, &p->thread.tls_array[index]); - - if (copy_to_user(u_info, &info, sizeof(info))) - return -EFAULT; -diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S -index 0850b5149345..4d1517022a14 100644 ---- a/arch/x86/kernel/vmlinux.lds.S -+++ b/arch/x86/kernel/vmlinux.lds.S -@@ -141,10 +141,10 @@ SECTIONS - *(.text.__x86.indirect_thunk) - __indirect_thunk_end = .; - #endif -- } :text = 0x9090 - -- /* End of text section */ -- _etext = .; -+ /* End of text section */ -+ _etext = .; -+ } :text = 0x9090 - - NOTES :text :note - -diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h -index 9a327d5b6d1f..d78a61408243 100644 ---- a/arch/x86/kvm/cpuid.h -+++ b/arch/x86/kvm/cpuid.h -@@ -47,8 +47,6 @@ static const struct cpuid_reg reverse_cpuid[] = { - [CPUID_8000_0001_ECX] = {0x80000001, 0, CPUID_ECX}, - [CPUID_7_0_EBX] = { 7, 0, CPUID_EBX}, - [CPUID_D_1_EAX] = { 0xd, 1, CPUID_EAX}, -- [CPUID_F_0_EDX] = { 0xf, 0, CPUID_EDX}, -- [CPUID_F_1_EDX] = { 0xf, 1, CPUID_EDX}, - [CPUID_8000_0008_EBX] = {0x80000008, 0, CPUID_EBX}, - [CPUID_6_EAX] = { 6, 0, CPUID_EAX}, - [CPUID_8000_000A_EDX] = {0x8000000a, 0, CPUID_EDX}, -diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c -index 98f6e4f88b04..8d95c81b2c82 100644 ---- a/arch/x86/kvm/mmu.c -+++ b/arch/x86/kvm/mmu.c -@@ -4593,11 +4593,11 @@ static void update_permission_bitmask(struct kvm_vcpu *vcpu, - */ - - /* Faults from writes to non-writable pages */ -- u8 wf = (pfec & PFERR_WRITE_MASK) ? ~w : 0; -+ u8 wf = (pfec & PFERR_WRITE_MASK) ? (u8)~w : 0; - /* Faults from user mode accesses to supervisor pages */ -- u8 uf = (pfec & PFERR_USER_MASK) ? ~u : 0; -+ u8 uf = (pfec & PFERR_USER_MASK) ? (u8)~u : 0; - /* Faults from fetches of non-executable pages*/ -- u8 ff = (pfec & PFERR_FETCH_MASK) ? ~x : 0; -+ u8 ff = (pfec & PFERR_FETCH_MASK) ? (u8)~x : 0; - /* Faults from kernel mode fetches of user pages */ - u8 smepf = 0; - /* Faults from kernel mode accesses of user pages */ -diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c -index 132d149494d6..cab14ec1b3af 100644 ---- a/arch/x86/kvm/pmu.c -+++ b/arch/x86/kvm/pmu.c -@@ -128,8 +128,8 @@ static void pmc_reprogram_counter(struct kvm_pmc *pmc, u32 type, - intr ? kvm_perf_overflow_intr : - kvm_perf_overflow, pmc); - if (IS_ERR(event)) { -- printk_once("kvm_pmu: event creation failed %ld\n", -- PTR_ERR(event)); -+ pr_debug_ratelimited("kvm_pmu: event creation failed %ld for pmc->idx = %d\n", -+ PTR_ERR(event), pmc->idx); - return; - } - -diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c -index 46af3a5e9209..b96723294b2f 100644 ---- a/arch/x86/kvm/vmx/nested.c -+++ b/arch/x86/kvm/vmx/nested.c -@@ -91,6 +91,10 @@ static void init_vmcs_shadow_fields(void) - pr_err("Missing field from shadow_read_write_field %x\n", - field + 1); - -+ WARN_ONCE(field >= GUEST_ES_AR_BYTES && -+ field <= GUEST_TR_AR_BYTES, -+ "Update vmcs12_write_any() to expose AR_BYTES RW"); -+ - /* - * PML and the preemption timer can be emulated, but the - * processor cannot vmwrite to fields that don't exist -@@ -184,6 +188,7 @@ static void vmx_disable_shadow_vmcs(struct vcpu_vmx *vmx) - { - vmcs_clear_bits(SECONDARY_VM_EXEC_CONTROL, SECONDARY_EXEC_SHADOW_VMCS); - vmcs_write64(VMCS_LINK_POINTER, -1ull); -+ vmx->nested.need_vmcs12_sync = false; - } - - static inline void nested_release_evmcs(struct kvm_vcpu *vcpu) -@@ -209,6 +214,8 @@ static void free_nested(struct kvm_vcpu *vcpu) - if (!vmx->nested.vmxon && !vmx->nested.smm.vmxon) - return; - -+ kvm_clear_request(KVM_REQ_GET_VMCS12_PAGES, vcpu); -+ - vmx->nested.vmxon = false; - vmx->nested.smm.vmxon = false; - free_vpid(vmx->nested.vpid02); -@@ -1321,6 +1328,9 @@ static void copy_shadow_to_vmcs12(struct vcpu_vmx *vmx) - u64 field_value; - struct vmcs *shadow_vmcs = vmx->vmcs01.shadow_vmcs; - -+ if (WARN_ON(!shadow_vmcs)) -+ return; -+ - preempt_disable(); - - vmcs_load(shadow_vmcs); -@@ -1359,6 +1369,9 @@ static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx) - u64 field_value = 0; - struct vmcs *shadow_vmcs = vmx->vmcs01.shadow_vmcs; - -+ if (WARN_ON(!shadow_vmcs)) -+ return; -+ - vmcs_load(shadow_vmcs); - - for (q = 0; q < ARRAY_SIZE(fields); q++) { -@@ -2234,13 +2247,9 @@ static void prepare_vmcs02_full(struct vcpu_vmx *vmx, struct vmcs12 *vmcs12) - - set_cr4_guest_host_mask(vmx); - -- if (kvm_mpx_supported()) { -- if (vmx->nested.nested_run_pending && -- (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS)) -- vmcs_write64(GUEST_BNDCFGS, vmcs12->guest_bndcfgs); -- else -- vmcs_write64(GUEST_BNDCFGS, vmx->nested.vmcs01_guest_bndcfgs); -- } -+ if (kvm_mpx_supported() && vmx->nested.nested_run_pending && -+ (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS)) -+ vmcs_write64(GUEST_BNDCFGS, vmcs12->guest_bndcfgs); - } - - /* -@@ -2283,6 +2292,9 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, - kvm_set_dr(vcpu, 7, vcpu->arch.dr7); - vmcs_write64(GUEST_IA32_DEBUGCTL, vmx->nested.vmcs01_debugctl); - } -+ if (kvm_mpx_supported() && (!vmx->nested.nested_run_pending || -+ !(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS))) -+ vmcs_write64(GUEST_BNDCFGS, vmx->nested.vmcs01_guest_bndcfgs); - vmx_set_rflags(vcpu, vmcs12->guest_rflags); - - /* EXCEPTION_BITMAP and CR0_GUEST_HOST_MASK should basically be the -@@ -2878,9 +2890,6 @@ static void nested_get_vmcs12_pages(struct kvm_vcpu *vcpu) - */ - vmcs_clear_bits(CPU_BASED_VM_EXEC_CONTROL, - CPU_BASED_TPR_SHADOW); -- } else { -- printk("bad virtual-APIC page address\n"); -- dump_vmcs(); - } - } - -@@ -2964,6 +2973,25 @@ int nested_vmx_enter_non_root_mode(struct kvm_vcpu *vcpu, bool from_vmentry) - !(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS)) - vmx->nested.vmcs01_guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS); - -+ /* -+ * Overwrite vmcs01.GUEST_CR3 with L1's CR3 if EPT is disabled *and* -+ * nested early checks are disabled. In the event of a "late" VM-Fail, -+ * i.e. a VM-Fail detected by hardware but not KVM, KVM must unwind its -+ * software model to the pre-VMEntry host state. When EPT is disabled, -+ * GUEST_CR3 holds KVM's shadow CR3, not L1's "real" CR3, which causes -+ * nested_vmx_restore_host_state() to corrupt vcpu->arch.cr3. Stuffing -+ * vmcs01.GUEST_CR3 results in the unwind naturally setting arch.cr3 to -+ * the correct value. Smashing vmcs01.GUEST_CR3 is safe because nested -+ * VM-Exits, and the unwind, reset KVM's MMU, i.e. vmcs01.GUEST_CR3 is -+ * guaranteed to be overwritten with a shadow CR3 prior to re-entering -+ * L1. Don't stuff vmcs01.GUEST_CR3 when using nested early checks as -+ * KVM modifies vcpu->arch.cr3 if and only if the early hardware checks -+ * pass, and early VM-Fails do not reset KVM's MMU, i.e. the VM-Fail -+ * path would need to manually save/restore vmcs01.GUEST_CR3. -+ */ -+ if (!enable_ept && !nested_early_check) -+ vmcs_writel(GUEST_CR3, vcpu->arch.cr3); -+ - vmx_switch_vmcs(vcpu, &vmx->nested.vmcs02); - - prepare_vmcs02_early(vmx, vmcs12); -@@ -3775,18 +3803,8 @@ static void nested_vmx_restore_host_state(struct kvm_vcpu *vcpu) - vmx_set_cr4(vcpu, vmcs_readl(CR4_READ_SHADOW)); - - nested_ept_uninit_mmu_context(vcpu); -- -- /* -- * This is only valid if EPT is in use, otherwise the vmcs01 GUEST_CR3 -- * points to shadow pages! Fortunately we only get here after a WARN_ON -- * if EPT is disabled, so a VMabort is perfectly fine. -- */ -- if (enable_ept) { -- vcpu->arch.cr3 = vmcs_readl(GUEST_CR3); -- __set_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail); -- } else { -- nested_vmx_abort(vcpu, VMX_ABORT_VMCS_CORRUPTED); -- } -+ vcpu->arch.cr3 = vmcs_readl(GUEST_CR3); -+ __set_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail); - - /* - * Use ept_save_pdptrs(vcpu) to load the MMU's cached PDPTRs -@@ -3794,7 +3812,8 @@ static void nested_vmx_restore_host_state(struct kvm_vcpu *vcpu) - * VMFail, like everything else we just need to ensure our - * software model is up-to-date. - */ -- ept_save_pdptrs(vcpu); -+ if (enable_ept) -+ ept_save_pdptrs(vcpu); - - kvm_mmu_reset_context(vcpu); - -@@ -4008,7 +4027,7 @@ void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, - * #UD or #GP. - */ - int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, -- u32 vmx_instruction_info, bool wr, gva_t *ret) -+ u32 vmx_instruction_info, bool wr, int len, gva_t *ret) - { - gva_t off; - bool exn; -@@ -4068,7 +4087,10 @@ int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, - * mode, e.g. a 32-bit address size can yield a 64-bit virtual - * address when using FS/GS with a non-zero base. - */ -- *ret = s.base + off; -+ if (seg_reg == VCPU_SREG_FS || seg_reg == VCPU_SREG_GS) -+ *ret = s.base + off; -+ else -+ *ret = off; - - /* Long mode: #GP(0)/#SS(0) if the memory address is in a - * non-canonical form. This is the only check on the memory -@@ -4115,7 +4137,7 @@ int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, - */ - if (!(s.base == 0 && s.limit == 0xffffffff && - ((s.type & 8) || !(s.type & 4)))) -- exn = exn || (off + sizeof(u64) > s.limit); -+ exn = exn || ((u64)off + len - 1 > s.limit); - } - if (exn) { - kvm_queue_exception_e(vcpu, -@@ -4134,7 +4156,8 @@ static int nested_vmx_get_vmptr(struct kvm_vcpu *vcpu, gpa_t *vmpointer) - struct x86_exception e; - - if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION), -- vmcs_read32(VMX_INSTRUCTION_INFO), false, &gva)) -+ vmcs_read32(VMX_INSTRUCTION_INFO), false, -+ sizeof(*vmpointer), &gva)) - return 1; - - if (kvm_read_guest_virt(vcpu, gva, vmpointer, sizeof(*vmpointer), &e)) { -@@ -4304,7 +4327,6 @@ static inline void nested_release_vmcs12(struct kvm_vcpu *vcpu) - /* copy to memory all shadowed fields in case - they were modified */ - copy_shadow_to_vmcs12(vmx); -- vmx->nested.need_vmcs12_sync = false; - vmx_disable_shadow_vmcs(vmx); - } - vmx->nested.posted_intr_nv = -1; -@@ -4386,6 +4408,7 @@ static int handle_vmread(struct kvm_vcpu *vcpu) - u64 field_value; - unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); - u32 vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); -+ int len; - gva_t gva = 0; - struct vmcs12 *vmcs12; - -@@ -4423,12 +4446,12 @@ static int handle_vmread(struct kvm_vcpu *vcpu) - kvm_register_writel(vcpu, (((vmx_instruction_info) >> 3) & 0xf), - field_value); - } else { -+ len = is_64_bit_mode(vcpu) ? 8 : 4; - if (get_vmx_mem_address(vcpu, exit_qualification, -- vmx_instruction_info, true, &gva)) -+ vmx_instruction_info, true, len, &gva)) - return 1; - /* _system ok, nested_vmx_check_permission has verified cpl=0 */ -- kvm_write_guest_virt_system(vcpu, gva, &field_value, -- (is_long_mode(vcpu) ? 8 : 4), NULL); -+ kvm_write_guest_virt_system(vcpu, gva, &field_value, len, NULL); - } - - return nested_vmx_succeed(vcpu); -@@ -4438,6 +4461,7 @@ static int handle_vmread(struct kvm_vcpu *vcpu) - static int handle_vmwrite(struct kvm_vcpu *vcpu) - { - unsigned long field; -+ int len; - gva_t gva; - struct vcpu_vmx *vmx = to_vmx(vcpu); - unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); -@@ -4463,11 +4487,11 @@ static int handle_vmwrite(struct kvm_vcpu *vcpu) - field_value = kvm_register_readl(vcpu, - (((vmx_instruction_info) >> 3) & 0xf)); - else { -+ len = is_64_bit_mode(vcpu) ? 8 : 4; - if (get_vmx_mem_address(vcpu, exit_qualification, -- vmx_instruction_info, false, &gva)) -+ vmx_instruction_info, false, len, &gva)) - return 1; -- if (kvm_read_guest_virt(vcpu, gva, &field_value, -- (is_64_bit_mode(vcpu) ? 8 : 4), &e)) { -+ if (kvm_read_guest_virt(vcpu, gva, &field_value, len, &e)) { - kvm_inject_page_fault(vcpu, &e); - return 1; - } -@@ -4496,6 +4520,17 @@ static int handle_vmwrite(struct kvm_vcpu *vcpu) - vmcs12 = get_shadow_vmcs12(vcpu); - } - -+ /* -+ * Some Intel CPUs intentionally drop the reserved bits of the AR byte -+ * fields on VMWRITE. Emulate this behavior to ensure consistent KVM -+ * behavior regardless of the underlying hardware, e.g. if an AR_BYTE -+ * field is intercepted for VMWRITE but not VMREAD (in L1), then VMREAD -+ * from L1 will return a different value than VMREAD from L2 (L1 sees -+ * the stripped down value, L2 sees the full value as stored by KVM). -+ */ -+ if (field >= GUEST_ES_AR_BYTES && field <= GUEST_TR_AR_BYTES) -+ field_value &= 0x1f0ff; -+ - if (vmcs12_write_any(vmcs12, field, field_value) < 0) - return nested_vmx_failValid(vcpu, - VMXERR_UNSUPPORTED_VMCS_COMPONENT); -@@ -4615,7 +4650,8 @@ static int handle_vmptrst(struct kvm_vcpu *vcpu) - if (unlikely(to_vmx(vcpu)->nested.hv_evmcs)) - return 1; - -- if (get_vmx_mem_address(vcpu, exit_qual, instr_info, true, &gva)) -+ if (get_vmx_mem_address(vcpu, exit_qual, instr_info, -+ true, sizeof(gpa_t), &gva)) - return 1; - /* *_system ok, nested_vmx_check_permission has verified cpl=0 */ - if (kvm_write_guest_virt_system(vcpu, gva, (void *)¤t_vmptr, -@@ -4661,7 +4697,7 @@ static int handle_invept(struct kvm_vcpu *vcpu) - * operand is read even if it isn't needed (e.g., for type==global) - */ - if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION), -- vmx_instruction_info, false, &gva)) -+ vmx_instruction_info, false, sizeof(operand), &gva)) - return 1; - if (kvm_read_guest_virt(vcpu, gva, &operand, sizeof(operand), &e)) { - kvm_inject_page_fault(vcpu, &e); -@@ -4723,7 +4759,7 @@ static int handle_invvpid(struct kvm_vcpu *vcpu) - * operand is read even if it isn't needed (e.g., for type==global) - */ - if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION), -- vmx_instruction_info, false, &gva)) -+ vmx_instruction_info, false, sizeof(operand), &gva)) - return 1; - if (kvm_read_guest_virt(vcpu, gva, &operand, sizeof(operand), &e)) { - kvm_inject_page_fault(vcpu, &e); -@@ -5749,14 +5785,6 @@ __init int nested_vmx_hardware_setup(int (*exit_handlers[])(struct kvm_vcpu *)) - { - int i; - -- /* -- * Without EPT it is not possible to restore L1's CR3 and PDPTR on -- * VMfail, because they are not available in vmcs01. Just always -- * use hardware checks. -- */ -- if (!enable_ept) -- nested_early_check = 1; -- - if (!cpu_has_vmx_shadow_vmcs()) - enable_shadow_vmcs = 0; - if (enable_shadow_vmcs) { -diff --git a/arch/x86/kvm/vmx/nested.h b/arch/x86/kvm/vmx/nested.h -index e847ff1019a2..29d205bb4e4f 100644 ---- a/arch/x86/kvm/vmx/nested.h -+++ b/arch/x86/kvm/vmx/nested.h -@@ -21,7 +21,7 @@ void nested_sync_from_vmcs12(struct kvm_vcpu *vcpu); - int vmx_set_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data); - int vmx_get_vmx_msr(struct nested_vmx_msrs *msrs, u32 msr_index, u64 *pdata); - int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, -- u32 vmx_instruction_info, bool wr, gva_t *ret); -+ u32 vmx_instruction_info, bool wr, int len, gva_t *ret); - - static inline struct vmcs12 *get_vmcs12(struct kvm_vcpu *vcpu) - { -diff --git a/arch/x86/kvm/vmx/vmcs_shadow_fields.h b/arch/x86/kvm/vmx/vmcs_shadow_fields.h -index 132432f375c2..97dd5295be31 100644 ---- a/arch/x86/kvm/vmx/vmcs_shadow_fields.h -+++ b/arch/x86/kvm/vmx/vmcs_shadow_fields.h -@@ -40,14 +40,14 @@ SHADOW_FIELD_RO(VM_EXIT_INSTRUCTION_LEN) - SHADOW_FIELD_RO(IDT_VECTORING_INFO_FIELD) - SHADOW_FIELD_RO(IDT_VECTORING_ERROR_CODE) - SHADOW_FIELD_RO(VM_EXIT_INTR_ERROR_CODE) -+SHADOW_FIELD_RO(GUEST_CS_AR_BYTES) -+SHADOW_FIELD_RO(GUEST_SS_AR_BYTES) - SHADOW_FIELD_RW(CPU_BASED_VM_EXEC_CONTROL) - SHADOW_FIELD_RW(EXCEPTION_BITMAP) - SHADOW_FIELD_RW(VM_ENTRY_EXCEPTION_ERROR_CODE) - SHADOW_FIELD_RW(VM_ENTRY_INTR_INFO_FIELD) - SHADOW_FIELD_RW(VM_ENTRY_INSTRUCTION_LEN) - SHADOW_FIELD_RW(TPR_THRESHOLD) --SHADOW_FIELD_RW(GUEST_CS_AR_BYTES) --SHADOW_FIELD_RW(GUEST_SS_AR_BYTES) - SHADOW_FIELD_RW(GUEST_INTERRUPTIBILITY_INFO) - SHADOW_FIELD_RW(VMX_PREEMPTION_TIMER_VALUE) - -diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c -index d98eac371c0a..924c2a79e4a9 100644 ---- a/arch/x86/kvm/vmx/vmx.c -+++ b/arch/x86/kvm/vmx/vmx.c -@@ -1718,7 +1718,10 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) - return vmx_get_vmx_msr(&vmx->nested.msrs, msr_info->index, - &msr_info->data); - case MSR_IA32_XSS: -- if (!vmx_xsaves_supported()) -+ if (!vmx_xsaves_supported() || -+ (!msr_info->host_initiated && -+ !(guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) && -+ guest_cpuid_has(vcpu, X86_FEATURE_XSAVES)))) - return 1; - msr_info->data = vcpu->arch.ia32_xss; - break; -@@ -1896,9 +1899,10 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) - MSR_TYPE_W); - break; - case MSR_IA32_CR_PAT: -+ if (!kvm_pat_valid(data)) -+ return 1; -+ - if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) { -- if (!kvm_pat_valid(data)) -- return 1; - vmcs_write64(GUEST_IA32_PAT, data); - vcpu->arch.pat = data; - break; -@@ -1932,7 +1936,10 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) - return 1; - return vmx_set_vmx_msr(vcpu, msr_index, data); - case MSR_IA32_XSS: -- if (!vmx_xsaves_supported()) -+ if (!vmx_xsaves_supported() || -+ (!msr_info->host_initiated && -+ !(guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) && -+ guest_cpuid_has(vcpu, X86_FEATURE_XSAVES)))) - return 1; - /* - * The only supported bit as of Skylake is bit 8, but -@@ -5342,7 +5349,8 @@ static int handle_invpcid(struct kvm_vcpu *vcpu) - * is read even if it isn't needed (e.g., for type==all) - */ - if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION), -- vmx_instruction_info, false, &gva)) -+ vmx_instruction_info, false, -+ sizeof(operand), &gva)) - return 1; - - if (kvm_read_guest_virt(vcpu, gva, &operand, sizeof(operand), &e)) { -@@ -6109,28 +6117,21 @@ static void vmx_apicv_post_state_restore(struct kvm_vcpu *vcpu) - - static void vmx_complete_atomic_exit(struct vcpu_vmx *vmx) - { -- u32 exit_intr_info = 0; -- u16 basic_exit_reason = (u16)vmx->exit_reason; -- -- if (!(basic_exit_reason == EXIT_REASON_MCE_DURING_VMENTRY -- || basic_exit_reason == EXIT_REASON_EXCEPTION_NMI)) -+ if (vmx->exit_reason != EXIT_REASON_EXCEPTION_NMI) - return; - -- if (!(vmx->exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY)) -- exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); -- vmx->exit_intr_info = exit_intr_info; -+ vmx->exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); - - /* if exit due to PF check for async PF */ -- if (is_page_fault(exit_intr_info)) -+ if (is_page_fault(vmx->exit_intr_info)) - vmx->vcpu.arch.apf.host_apf_reason = kvm_read_and_reset_pf_reason(); - - /* Handle machine checks before interrupts are enabled */ -- if (basic_exit_reason == EXIT_REASON_MCE_DURING_VMENTRY || -- is_machine_check(exit_intr_info)) -+ if (is_machine_check(vmx->exit_intr_info)) - kvm_machine_check(); - - /* We need to handle NMIs before interrupts are enabled */ -- if (is_nmi(exit_intr_info)) { -+ if (is_nmi(vmx->exit_intr_info)) { - kvm_before_interrupt(&vmx->vcpu); - asm("int $2"); - kvm_after_interrupt(&vmx->vcpu); -@@ -6533,6 +6534,9 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu) - vmx->idt_vectoring_info = 0; - - vmx->exit_reason = vmx->fail ? 0xdead : vmcs_read32(VM_EXIT_REASON); -+ if ((u16)vmx->exit_reason == EXIT_REASON_MCE_DURING_VMENTRY) -+ kvm_machine_check(); -+ - if (vmx->fail || (vmx->exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY)) - return; - -diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c -index fafd81d2c9ea..a8ad3a4d86b1 100644 ---- a/arch/x86/kvm/x86.c -+++ b/arch/x86/kvm/x86.c -@@ -3264,6 +3264,10 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) - - kvm_x86_ops->vcpu_load(vcpu, cpu); - -+ fpregs_assert_state_consistent(); -+ if (test_thread_flag(TIF_NEED_FPU_LOAD)) -+ switch_fpu_return(); -+ - /* Apply any externally detected TSC adjustments (due to suspend) */ - if (unlikely(vcpu->arch.tsc_offset_adjustment)) { - adjust_tsc_offset_host(vcpu, vcpu->arch.tsc_offset_adjustment); -@@ -7955,9 +7959,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) - wait_lapic_expire(vcpu); - guest_enter_irqoff(); - -- fpregs_assert_state_consistent(); -- if (test_thread_flag(TIF_NEED_FPU_LOAD)) -- switch_fpu_return(); -+ /* The preempt notifier should have taken care of the FPU already. */ -+ WARN_ON_ONCE(test_thread_flag(TIF_NEED_FPU_LOAD)); - - if (unlikely(vcpu->arch.switch_db_regs)) { - set_debugreg(0, 7); -@@ -8219,7 +8222,7 @@ static void kvm_load_guest_fpu(struct kvm_vcpu *vcpu) - { - fpregs_lock(); - -- copy_fpregs_to_fpstate(¤t->thread.fpu); -+ copy_fpregs_to_fpstate(&vcpu->arch.user_fpu); - /* PKRU is separately restored in kvm_x86_ops->run. */ - __copy_kernel_to_fpregs(&vcpu->arch.guest_fpu->state, - ~XFEATURE_MASK_PKRU); -@@ -8236,7 +8239,7 @@ static void kvm_put_guest_fpu(struct kvm_vcpu *vcpu) - fpregs_lock(); - - copy_fpregs_to_fpstate(vcpu->arch.guest_fpu); -- copy_kernel_to_fpregs(¤t->thread.fpu.state); -+ copy_kernel_to_fpregs(&vcpu->arch.user_fpu.state); - - fpregs_mark_activate(); - fpregs_unlock(); -diff --git a/arch/x86/math-emu/fpu_emu.h b/arch/x86/math-emu/fpu_emu.h -index a5a41ec58072..0c122226ca56 100644 ---- a/arch/x86/math-emu/fpu_emu.h -+++ b/arch/x86/math-emu/fpu_emu.h -@@ -177,7 +177,7 @@ static inline void reg_copy(FPU_REG const *x, FPU_REG *y) - #define setexponentpos(x,y) { (*(short *)&((x)->exp)) = \ - ((y) + EXTENDED_Ebias) & 0x7fff; } - #define exponent16(x) (*(short *)&((x)->exp)) --#define setexponent16(x,y) { (*(short *)&((x)->exp)) = (y); } -+#define setexponent16(x,y) { (*(short *)&((x)->exp)) = (u16)(y); } - #define addexponent(x,y) { (*(short *)&((x)->exp)) += (y); } - #define stdexp(x) { (*(short *)&((x)->exp)) += EXTENDED_Ebias; } - -diff --git a/arch/x86/math-emu/reg_constant.c b/arch/x86/math-emu/reg_constant.c -index 8dc9095bab22..742619e94bdf 100644 ---- a/arch/x86/math-emu/reg_constant.c -+++ b/arch/x86/math-emu/reg_constant.c -@@ -18,7 +18,7 @@ - #include "control_w.h" - - #define MAKE_REG(s, e, l, h) { l, h, \ -- ((EXTENDED_Ebias+(e)) | ((SIGN_##s != 0)*0x8000)) } -+ (u16)((EXTENDED_Ebias+(e)) | ((SIGN_##s != 0)*0x8000)) } - - FPU_REG const CONST_1 = MAKE_REG(POS, 0, 0x00000000, 0x80000000); - #if 0 -diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c -index 46df4c6aae46..26a8b4b1b9ed 100644 ---- a/arch/x86/mm/fault.c -+++ b/arch/x86/mm/fault.c -@@ -194,13 +194,14 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address) - - pmd = pmd_offset(pud, address); - pmd_k = pmd_offset(pud_k, address); -- if (!pmd_present(*pmd_k)) -- return NULL; - -- if (!pmd_present(*pmd)) -+ if (pmd_present(*pmd) != pmd_present(*pmd_k)) - set_pmd(pmd, *pmd_k); -+ -+ if (!pmd_present(*pmd_k)) -+ return NULL; - else -- BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k)); -+ BUG_ON(pmd_pfn(*pmd) != pmd_pfn(*pmd_k)); - - return pmd_k; - } -@@ -220,17 +221,13 @@ void vmalloc_sync_all(void) - spin_lock(&pgd_lock); - list_for_each_entry(page, &pgd_list, lru) { - spinlock_t *pgt_lock; -- pmd_t *ret; - - /* the pgt_lock only for Xen */ - pgt_lock = &pgd_page_get_mm(page)->page_table_lock; - - spin_lock(pgt_lock); -- ret = vmalloc_sync_one(page_address(page), address); -+ vmalloc_sync_one(page_address(page), address); - spin_unlock(pgt_lock); -- -- if (!ret) -- break; - } - spin_unlock(&pgd_lock); - } -diff --git a/arch/x86/purgatory/Makefile b/arch/x86/purgatory/Makefile -index 3cf302b26332..8901a1f89cf5 100644 ---- a/arch/x86/purgatory/Makefile -+++ b/arch/x86/purgatory/Makefile -@@ -6,6 +6,9 @@ purgatory-y := purgatory.o stack.o setup-x86_$(BITS).o sha256.o entry64.o string - targets += $(purgatory-y) - PURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y)) - -+$(obj)/string.o: $(srctree)/arch/x86/boot/compressed/string.c FORCE -+ $(call if_changed_rule,cc_o_c) -+ - $(obj)/sha256.o: $(srctree)/lib/sha256.c FORCE - $(call if_changed_rule,cc_o_c) - -@@ -17,11 +20,34 @@ KCOV_INSTRUMENT := n - - # Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That - # in turn leaves some undefined symbols like __fentry__ in purgatory and not --# sure how to relocate those. Like kexec-tools, use custom flags. -- --KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes -fno-zero-initialized-in-bss -fno-builtin -ffreestanding -c -Os -mcmodel=large --KBUILD_CFLAGS += -m$(BITS) --KBUILD_CFLAGS += $(call cc-option,-fno-PIE) -+# sure how to relocate those. -+ifdef CONFIG_FUNCTION_TRACER -+CFLAGS_REMOVE_sha256.o += $(CC_FLAGS_FTRACE) -+CFLAGS_REMOVE_purgatory.o += $(CC_FLAGS_FTRACE) -+CFLAGS_REMOVE_string.o += $(CC_FLAGS_FTRACE) -+CFLAGS_REMOVE_kexec-purgatory.o += $(CC_FLAGS_FTRACE) -+endif -+ -+ifdef CONFIG_STACKPROTECTOR -+CFLAGS_REMOVE_sha256.o += -fstack-protector -+CFLAGS_REMOVE_purgatory.o += -fstack-protector -+CFLAGS_REMOVE_string.o += -fstack-protector -+CFLAGS_REMOVE_kexec-purgatory.o += -fstack-protector -+endif -+ -+ifdef CONFIG_STACKPROTECTOR_STRONG -+CFLAGS_REMOVE_sha256.o += -fstack-protector-strong -+CFLAGS_REMOVE_purgatory.o += -fstack-protector-strong -+CFLAGS_REMOVE_string.o += -fstack-protector-strong -+CFLAGS_REMOVE_kexec-purgatory.o += -fstack-protector-strong -+endif -+ -+ifdef CONFIG_RETPOLINE -+CFLAGS_REMOVE_sha256.o += $(RETPOLINE_CFLAGS) -+CFLAGS_REMOVE_purgatory.o += $(RETPOLINE_CFLAGS) -+CFLAGS_REMOVE_string.o += $(RETPOLINE_CFLAGS) -+CFLAGS_REMOVE_kexec-purgatory.o += $(RETPOLINE_CFLAGS) -+endif - - $(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE - $(call if_changed,ld) -diff --git a/arch/x86/purgatory/purgatory.c b/arch/x86/purgatory/purgatory.c -index 6d8d5a34c377..b607bda786f6 100644 ---- a/arch/x86/purgatory/purgatory.c -+++ b/arch/x86/purgatory/purgatory.c -@@ -68,3 +68,9 @@ void purgatory(void) - } - copy_backup_region(); - } -+ -+/* -+ * Defined in order to reuse memcpy() and memset() from -+ * arch/x86/boot/compressed/string.c -+ */ -+void warn(const char *msg) {} -diff --git a/arch/x86/purgatory/string.c b/arch/x86/purgatory/string.c -deleted file mode 100644 -index 01ad43873ad9..000000000000 ---- a/arch/x86/purgatory/string.c -+++ /dev/null -@@ -1,23 +0,0 @@ --// SPDX-License-Identifier: GPL-2.0-only --/* -- * Simple string functions. -- * -- * Copyright (C) 2014 Red Hat Inc. -- * -- * Author: -- * Vivek Goyal -- */ -- --#include -- --#include "../boot/string.c" -- --void *memcpy(void *dst, const void *src, size_t len) --{ -- return __builtin_memcpy(dst, src, len); --} -- --void *memset(void *dst, int c, size_t len) --{ -- return __builtin_memset(dst, c, len); --} -diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c -index 4722ba2966ac..30c14cb343fc 100644 ---- a/arch/x86/xen/enlighten_pv.c -+++ b/arch/x86/xen/enlighten_pv.c -@@ -596,12 +596,12 @@ struct trap_array_entry { - - static struct trap_array_entry trap_array[] = { - { debug, xen_xendebug, true }, -- { int3, xen_xenint3, true }, - { double_fault, xen_double_fault, true }, - #ifdef CONFIG_X86_MCE - { machine_check, xen_machine_check, true }, - #endif - { nmi, xen_xennmi, true }, -+ { int3, xen_int3, false }, - { overflow, xen_overflow, false }, - #ifdef CONFIG_IA32_EMULATION - { entry_INT80_compat, xen_entry_INT80_compat, false }, -diff --git a/arch/x86/xen/xen-asm_64.S b/arch/x86/xen/xen-asm_64.S -index 1e9ef0ba30a5..ebf610b49c06 100644 ---- a/arch/x86/xen/xen-asm_64.S -+++ b/arch/x86/xen/xen-asm_64.S -@@ -32,7 +32,6 @@ xen_pv_trap divide_error - xen_pv_trap debug - xen_pv_trap xendebug - xen_pv_trap int3 --xen_pv_trap xenint3 - xen_pv_trap xennmi - xen_pv_trap overflow - xen_pv_trap bounds -diff --git a/block/Kconfig b/block/Kconfig -index 2466dcc3ef1d..1b220101a9cb 100644 ---- a/block/Kconfig -+++ b/block/Kconfig -@@ -73,7 +73,6 @@ config BLK_DEV_INTEGRITY - - config BLK_DEV_ZONED - bool "Zoned block device support" -- select MQ_IOSCHED_DEADLINE - ---help--- - Block layer zoned block device support. This option enables - support for ZAC/ZBC host-managed and host-aware zoned block devices. -diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c -index f9269ae6da9c..56609e311697 100644 ---- a/block/bfq-iosched.c -+++ b/block/bfq-iosched.c -@@ -157,6 +157,7 @@ BFQ_BFQQ_FNS(in_large_burst); - BFQ_BFQQ_FNS(coop); - BFQ_BFQQ_FNS(split_coop); - BFQ_BFQQ_FNS(softrt_update); -+BFQ_BFQQ_FNS(has_waker); - #undef BFQ_BFQQ_FNS \ - - /* Expiration time of sync (0) and async (1) requests, in ns. */ -@@ -1427,17 +1428,19 @@ static int bfq_min_budget(struct bfq_data *bfqd) - * mechanism may be re-designed in such a way to make it possible to - * know whether preemption is needed without needing to update service - * trees). In addition, queue preemptions almost always cause random -- * I/O, and thus loss of throughput. Because of these facts, the next -- * function adopts the following simple scheme to avoid both costly -- * operations and too frequent preemptions: it requests the expiration -- * of the in-service queue (unconditionally) only for queues that need -- * to recover a hole, or that either are weight-raised or deserve to -- * be weight-raised. -+ * I/O, which may in turn cause loss of throughput. Finally, there may -+ * even be no in-service queue when the next function is invoked (so, -+ * no queue to compare timestamps with). Because of these facts, the -+ * next function adopts the following simple scheme to avoid costly -+ * operations, too frequent preemptions and too many dependencies on -+ * the state of the scheduler: it requests the expiration of the -+ * in-service queue (unconditionally) only for queues that need to -+ * recover a hole. Then it delegates to other parts of the code the -+ * responsibility of handling the above case 2. - */ - static bool bfq_bfqq_update_budg_for_activation(struct bfq_data *bfqd, - struct bfq_queue *bfqq, -- bool arrived_in_time, -- bool wr_or_deserves_wr) -+ bool arrived_in_time) - { - struct bfq_entity *entity = &bfqq->entity; - -@@ -1492,7 +1495,7 @@ static bool bfq_bfqq_update_budg_for_activation(struct bfq_data *bfqd, - entity->budget = max_t(unsigned long, bfqq->max_budget, - bfq_serv_to_charge(bfqq->next_rq, bfqq)); - bfq_clear_bfqq_non_blocking_wait_rq(bfqq); -- return wr_or_deserves_wr; -+ return false; - } - - /* -@@ -1610,6 +1613,36 @@ static bool bfq_bfqq_idle_for_long_time(struct bfq_data *bfqd, - bfqd->bfq_wr_min_idle_time); - } - -+ -+/* -+ * Return true if bfqq is in a higher priority class, or has a higher -+ * weight than the in-service queue. -+ */ -+static bool bfq_bfqq_higher_class_or_weight(struct bfq_queue *bfqq, -+ struct bfq_queue *in_serv_bfqq) -+{ -+ int bfqq_weight, in_serv_weight; -+ -+ if (bfqq->ioprio_class < in_serv_bfqq->ioprio_class) -+ return true; -+ -+ if (in_serv_bfqq->entity.parent == bfqq->entity.parent) { -+ bfqq_weight = bfqq->entity.weight; -+ in_serv_weight = in_serv_bfqq->entity.weight; -+ } else { -+ if (bfqq->entity.parent) -+ bfqq_weight = bfqq->entity.parent->weight; -+ else -+ bfqq_weight = bfqq->entity.weight; -+ if (in_serv_bfqq->entity.parent) -+ in_serv_weight = in_serv_bfqq->entity.parent->weight; -+ else -+ in_serv_weight = in_serv_bfqq->entity.weight; -+ } -+ -+ return bfqq_weight > in_serv_weight; -+} -+ - static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd, - struct bfq_queue *bfqq, - int old_wr_coeff, -@@ -1654,8 +1687,7 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd, - */ - bfqq_wants_to_preempt = - bfq_bfqq_update_budg_for_activation(bfqd, bfqq, -- arrived_in_time, -- wr_or_deserves_wr); -+ arrived_in_time); - - /* - * If bfqq happened to be activated in a burst, but has been -@@ -1720,21 +1752,111 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd, - - /* - * Expire in-service queue only if preemption may be needed -- * for guarantees. In this respect, the function -- * next_queue_may_preempt just checks a simple, necessary -- * condition, and not a sufficient condition based on -- * timestamps. In fact, for the latter condition to be -- * evaluated, timestamps would need first to be updated, and -- * this operation is quite costly (see the comments on the -- * function bfq_bfqq_update_budg_for_activation). -+ * for guarantees. In particular, we care only about two -+ * cases. The first is that bfqq has to recover a service -+ * hole, as explained in the comments on -+ * bfq_bfqq_update_budg_for_activation(), i.e., that -+ * bfqq_wants_to_preempt is true. However, if bfqq does not -+ * carry time-critical I/O, then bfqq's bandwidth is less -+ * important than that of queues that carry time-critical I/O. -+ * So, as a further constraint, we consider this case only if -+ * bfqq is at least as weight-raised, i.e., at least as time -+ * critical, as the in-service queue. -+ * -+ * The second case is that bfqq is in a higher priority class, -+ * or has a higher weight than the in-service queue. If this -+ * condition does not hold, we don't care because, even if -+ * bfqq does not start to be served immediately, the resulting -+ * delay for bfqq's I/O is however lower or much lower than -+ * the ideal completion time to be guaranteed to bfqq's I/O. -+ * -+ * In both cases, preemption is needed only if, according to -+ * the timestamps of both bfqq and of the in-service queue, -+ * bfqq actually is the next queue to serve. So, to reduce -+ * useless preemptions, the return value of -+ * next_queue_may_preempt() is considered in the next compound -+ * condition too. Yet next_queue_may_preempt() just checks a -+ * simple, necessary condition for bfqq to be the next queue -+ * to serve. In fact, to evaluate a sufficient condition, the -+ * timestamps of the in-service queue would need to be -+ * updated, and this operation is quite costly (see the -+ * comments on bfq_bfqq_update_budg_for_activation()). - */ -- if (bfqd->in_service_queue && bfqq_wants_to_preempt && -- bfqd->in_service_queue->wr_coeff < bfqq->wr_coeff && -+ if (bfqd->in_service_queue && -+ ((bfqq_wants_to_preempt && -+ bfqq->wr_coeff >= bfqd->in_service_queue->wr_coeff) || -+ bfq_bfqq_higher_class_or_weight(bfqq, bfqd->in_service_queue)) && - next_queue_may_preempt(bfqd)) - bfq_bfqq_expire(bfqd, bfqd->in_service_queue, - false, BFQQE_PREEMPTED); - } - -+static void bfq_reset_inject_limit(struct bfq_data *bfqd, -+ struct bfq_queue *bfqq) -+{ -+ /* invalidate baseline total service time */ -+ bfqq->last_serv_time_ns = 0; -+ -+ /* -+ * Reset pointer in case we are waiting for -+ * some request completion. -+ */ -+ bfqd->waited_rq = NULL; -+ -+ /* -+ * If bfqq has a short think time, then start by setting the -+ * inject limit to 0 prudentially, because the service time of -+ * an injected I/O request may be higher than the think time -+ * of bfqq, and therefore, if one request was injected when -+ * bfqq remains empty, this injected request might delay the -+ * service of the next I/O request for bfqq significantly. In -+ * case bfqq can actually tolerate some injection, then the -+ * adaptive update will however raise the limit soon. This -+ * lucky circumstance holds exactly because bfqq has a short -+ * think time, and thus, after remaining empty, is likely to -+ * get new I/O enqueued---and then completed---before being -+ * expired. This is the very pattern that gives the -+ * limit-update algorithm the chance to measure the effect of -+ * injection on request service times, and then to update the -+ * limit accordingly. -+ * -+ * However, in the following special case, the inject limit is -+ * left to 1 even if the think time is short: bfqq's I/O is -+ * synchronized with that of some other queue, i.e., bfqq may -+ * receive new I/O only after the I/O of the other queue is -+ * completed. Keeping the inject limit to 1 allows the -+ * blocking I/O to be served while bfqq is in service. And -+ * this is very convenient both for bfqq and for overall -+ * throughput, as explained in detail in the comments in -+ * bfq_update_has_short_ttime(). -+ * -+ * On the opposite end, if bfqq has a long think time, then -+ * start directly by 1, because: -+ * a) on the bright side, keeping at most one request in -+ * service in the drive is unlikely to cause any harm to the -+ * latency of bfqq's requests, as the service time of a single -+ * request is likely to be lower than the think time of bfqq; -+ * b) on the downside, after becoming empty, bfqq is likely to -+ * expire before getting its next request. With this request -+ * arrival pattern, it is very hard to sample total service -+ * times and update the inject limit accordingly (see comments -+ * on bfq_update_inject_limit()). So the limit is likely to be -+ * never, or at least seldom, updated. As a consequence, by -+ * setting the limit to 1, we avoid that no injection ever -+ * occurs with bfqq. On the downside, this proactive step -+ * further reduces chances to actually compute the baseline -+ * total service time. Thus it reduces chances to execute the -+ * limit-update algorithm and possibly raise the limit to more -+ * than 1. -+ */ -+ if (bfq_bfqq_has_short_ttime(bfqq)) -+ bfqq->inject_limit = 0; -+ else -+ bfqq->inject_limit = 1; -+ -+ bfqq->decrease_time_jif = jiffies; -+} -+ - static void bfq_add_request(struct request *rq) - { - struct bfq_queue *bfqq = RQ_BFQQ(rq); -@@ -1748,6 +1870,112 @@ static void bfq_add_request(struct request *rq) - bfqd->queued++; - - if (RB_EMPTY_ROOT(&bfqq->sort_list) && bfq_bfqq_sync(bfqq)) { -+ /* -+ * Detect whether bfqq's I/O seems synchronized with -+ * that of some other queue, i.e., whether bfqq, after -+ * remaining empty, happens to receive new I/O only -+ * right after some I/O request of the other queue has -+ * been completed. We call waker queue the other -+ * queue, and we assume, for simplicity, that bfqq may -+ * have at most one waker queue. -+ * -+ * A remarkable throughput boost can be reached by -+ * unconditionally injecting the I/O of the waker -+ * queue, every time a new bfq_dispatch_request -+ * happens to be invoked while I/O is being plugged -+ * for bfqq. In addition to boosting throughput, this -+ * unblocks bfqq's I/O, thereby improving bandwidth -+ * and latency for bfqq. Note that these same results -+ * may be achieved with the general injection -+ * mechanism, but less effectively. For details on -+ * this aspect, see the comments on the choice of the -+ * queue for injection in bfq_select_queue(). -+ * -+ * Turning back to the detection of a waker queue, a -+ * queue Q is deemed as a waker queue for bfqq if, for -+ * two consecutive times, bfqq happens to become non -+ * empty right after a request of Q has been -+ * completed. In particular, on the first time, Q is -+ * tentatively set as a candidate waker queue, while -+ * on the second time, the flag -+ * bfq_bfqq_has_waker(bfqq) is set to confirm that Q -+ * is a waker queue for bfqq. These detection steps -+ * are performed only if bfqq has a long think time, -+ * so as to make it more likely that bfqq's I/O is -+ * actually being blocked by a synchronization. This -+ * last filter, plus the above two-times requirement, -+ * make false positives less likely. -+ * -+ * NOTE -+ * -+ * The sooner a waker queue is detected, the sooner -+ * throughput can be boosted by injecting I/O from the -+ * waker queue. Fortunately, detection is likely to be -+ * actually fast, for the following reasons. While -+ * blocked by synchronization, bfqq has a long think -+ * time. This implies that bfqq's inject limit is at -+ * least equal to 1 (see the comments in -+ * bfq_update_inject_limit()). So, thanks to -+ * injection, the waker queue is likely to be served -+ * during the very first I/O-plugging time interval -+ * for bfqq. This triggers the first step of the -+ * detection mechanism. Thanks again to injection, the -+ * candidate waker queue is then likely to be -+ * confirmed no later than during the next -+ * I/O-plugging interval for bfqq. -+ */ -+ if (bfqd->last_completed_rq_bfqq && -+ !bfq_bfqq_has_short_ttime(bfqq) && -+ ktime_get_ns() - bfqd->last_completion < -+ 200 * NSEC_PER_USEC) { -+ if (bfqd->last_completed_rq_bfqq != bfqq && -+ bfqd->last_completed_rq_bfqq != -+ bfqq->waker_bfqq) { -+ /* -+ * First synchronization detected with -+ * a candidate waker queue, or with a -+ * different candidate waker queue -+ * from the current one. -+ */ -+ bfqq->waker_bfqq = bfqd->last_completed_rq_bfqq; -+ -+ /* -+ * If the waker queue disappears, then -+ * bfqq->waker_bfqq must be reset. To -+ * this goal, we maintain in each -+ * waker queue a list, woken_list, of -+ * all the queues that reference the -+ * waker queue through their -+ * waker_bfqq pointer. When the waker -+ * queue exits, the waker_bfqq pointer -+ * of all the queues in the woken_list -+ * is reset. -+ * -+ * In addition, if bfqq is already in -+ * the woken_list of a waker queue, -+ * then, before being inserted into -+ * the woken_list of a new waker -+ * queue, bfqq must be removed from -+ * the woken_list of the old waker -+ * queue. -+ */ -+ if (!hlist_unhashed(&bfqq->woken_list_node)) -+ hlist_del_init(&bfqq->woken_list_node); -+ hlist_add_head(&bfqq->woken_list_node, -+ &bfqd->last_completed_rq_bfqq->woken_list); -+ -+ bfq_clear_bfqq_has_waker(bfqq); -+ } else if (bfqd->last_completed_rq_bfqq == -+ bfqq->waker_bfqq && -+ !bfq_bfqq_has_waker(bfqq)) { -+ /* -+ * synchronization with waker_bfqq -+ * seen for the second time -+ */ -+ bfq_mark_bfqq_has_waker(bfqq); -+ } -+ } -+ - /* - * Periodically reset inject limit, to make sure that - * the latter eventually drops in case workload -@@ -1755,71 +1983,8 @@ static void bfq_add_request(struct request *rq) - * bfq_update_inject_limit(). - */ - if (time_is_before_eq_jiffies(bfqq->decrease_time_jif + -- msecs_to_jiffies(1000))) { -- /* invalidate baseline total service time */ -- bfqq->last_serv_time_ns = 0; -- -- /* -- * Reset pointer in case we are waiting for -- * some request completion. -- */ -- bfqd->waited_rq = NULL; -- -- /* -- * If bfqq has a short think time, then start -- * by setting the inject limit to 0 -- * prudentially, because the service time of -- * an injected I/O request may be higher than -- * the think time of bfqq, and therefore, if -- * one request was injected when bfqq remains -- * empty, this injected request might delay -- * the service of the next I/O request for -- * bfqq significantly. In case bfqq can -- * actually tolerate some injection, then the -- * adaptive update will however raise the -- * limit soon. This lucky circumstance holds -- * exactly because bfqq has a short think -- * time, and thus, after remaining empty, is -- * likely to get new I/O enqueued---and then -- * completed---before being expired. This is -- * the very pattern that gives the -- * limit-update algorithm the chance to -- * measure the effect of injection on request -- * service times, and then to update the limit -- * accordingly. -- * -- * On the opposite end, if bfqq has a long -- * think time, then start directly by 1, -- * because: -- * a) on the bright side, keeping at most one -- * request in service in the drive is unlikely -- * to cause any harm to the latency of bfqq's -- * requests, as the service time of a single -- * request is likely to be lower than the -- * think time of bfqq; -- * b) on the downside, after becoming empty, -- * bfqq is likely to expire before getting its -- * next request. With this request arrival -- * pattern, it is very hard to sample total -- * service times and update the inject limit -- * accordingly (see comments on -- * bfq_update_inject_limit()). So the limit is -- * likely to be never, or at least seldom, -- * updated. As a consequence, by setting the -- * limit to 1, we avoid that no injection ever -- * occurs with bfqq. On the downside, this -- * proactive step further reduces chances to -- * actually compute the baseline total service -- * time. Thus it reduces chances to execute the -- * limit-update algorithm and possibly raise the -- * limit to more than 1. -- */ -- if (bfq_bfqq_has_short_ttime(bfqq)) -- bfqq->inject_limit = 0; -- else -- bfqq->inject_limit = 1; -- bfqq->decrease_time_jif = jiffies; -- } -+ msecs_to_jiffies(1000))) -+ bfq_reset_inject_limit(bfqd, bfqq); - - /* - * The following conditions must hold to setup a new -@@ -2085,9 +2250,14 @@ static void bfq_request_merged(struct request_queue *q, struct request *req, - blk_rq_pos(container_of(rb_prev(&req->rb_node), - struct request, rb_node))) { - struct bfq_queue *bfqq = bfq_init_rq(req); -- struct bfq_data *bfqd = bfqq->bfqd; -+ struct bfq_data *bfqd; - struct request *prev, *next_rq; - -+ if (!bfqq) -+ return; -+ -+ bfqd = bfqq->bfqd; -+ - /* Reposition request in its sort_list */ - elv_rb_del(&bfqq->sort_list, req); - elv_rb_add(&bfqq->sort_list, req); -@@ -2134,6 +2304,9 @@ static void bfq_requests_merged(struct request_queue *q, struct request *rq, - struct bfq_queue *bfqq = bfq_init_rq(rq), - *next_bfqq = bfq_init_rq(next); - -+ if (!bfqq) -+ return; -+ - /* - * If next and rq belong to the same bfq_queue and next is older - * than rq, then reposition rq in the fifo (by substituting next -@@ -3045,7 +3218,205 @@ static void bfq_dispatch_remove(struct request_queue *q, struct request *rq) - bfq_remove_request(q, rq); - } - --static bool __bfq_bfqq_expire(struct bfq_data *bfqd, struct bfq_queue *bfqq) -+/* -+ * There is a case where idling does not have to be performed for -+ * throughput concerns, but to preserve the throughput share of -+ * the process associated with bfqq. -+ * -+ * To introduce this case, we can note that allowing the drive -+ * to enqueue more than one request at a time, and hence -+ * delegating de facto final scheduling decisions to the -+ * drive's internal scheduler, entails loss of control on the -+ * actual request service order. In particular, the critical -+ * situation is when requests from different processes happen -+ * to be present, at the same time, in the internal queue(s) -+ * of the drive. In such a situation, the drive, by deciding -+ * the service order of the internally-queued requests, does -+ * determine also the actual throughput distribution among -+ * these processes. But the drive typically has no notion or -+ * concern about per-process throughput distribution, and -+ * makes its decisions only on a per-request basis. Therefore, -+ * the service distribution enforced by the drive's internal -+ * scheduler is likely to coincide with the desired throughput -+ * distribution only in a completely symmetric, or favorably -+ * skewed scenario where: -+ * (i-a) each of these processes must get the same throughput as -+ * the others, -+ * (i-b) in case (i-a) does not hold, it holds that the process -+ * associated with bfqq must receive a lower or equal -+ * throughput than any of the other processes; -+ * (ii) the I/O of each process has the same properties, in -+ * terms of locality (sequential or random), direction -+ * (reads or writes), request sizes, greediness -+ * (from I/O-bound to sporadic), and so on; -+ -+ * In fact, in such a scenario, the drive tends to treat the requests -+ * of each process in about the same way as the requests of the -+ * others, and thus to provide each of these processes with about the -+ * same throughput. This is exactly the desired throughput -+ * distribution if (i-a) holds, or, if (i-b) holds instead, this is an -+ * even more convenient distribution for (the process associated with) -+ * bfqq. -+ * -+ * In contrast, in any asymmetric or unfavorable scenario, device -+ * idling (I/O-dispatch plugging) is certainly needed to guarantee -+ * that bfqq receives its assigned fraction of the device throughput -+ * (see [1] for details). -+ * -+ * The problem is that idling may significantly reduce throughput with -+ * certain combinations of types of I/O and devices. An important -+ * example is sync random I/O on flash storage with command -+ * queueing. So, unless bfqq falls in cases where idling also boosts -+ * throughput, it is important to check conditions (i-a), i(-b) and -+ * (ii) accurately, so as to avoid idling when not strictly needed for -+ * service guarantees. -+ * -+ * Unfortunately, it is extremely difficult to thoroughly check -+ * condition (ii). And, in case there are active groups, it becomes -+ * very difficult to check conditions (i-a) and (i-b) too. In fact, -+ * if there are active groups, then, for conditions (i-a) or (i-b) to -+ * become false 'indirectly', it is enough that an active group -+ * contains more active processes or sub-groups than some other active -+ * group. More precisely, for conditions (i-a) or (i-b) to become -+ * false because of such a group, it is not even necessary that the -+ * group is (still) active: it is sufficient that, even if the group -+ * has become inactive, some of its descendant processes still have -+ * some request already dispatched but still waiting for -+ * completion. In fact, requests have still to be guaranteed their -+ * share of the throughput even after being dispatched. In this -+ * respect, it is easy to show that, if a group frequently becomes -+ * inactive while still having in-flight requests, and if, when this -+ * happens, the group is not considered in the calculation of whether -+ * the scenario is asymmetric, then the group may fail to be -+ * guaranteed its fair share of the throughput (basically because -+ * idling may not be performed for the descendant processes of the -+ * group, but it had to be). We address this issue with the following -+ * bi-modal behavior, implemented in the function -+ * bfq_asymmetric_scenario(). -+ * -+ * If there are groups with requests waiting for completion -+ * (as commented above, some of these groups may even be -+ * already inactive), then the scenario is tagged as -+ * asymmetric, conservatively, without checking any of the -+ * conditions (i-a), (i-b) or (ii). So the device is idled for bfqq. -+ * This behavior matches also the fact that groups are created -+ * exactly if controlling I/O is a primary concern (to -+ * preserve bandwidth and latency guarantees). -+ * -+ * On the opposite end, if there are no groups with requests waiting -+ * for completion, then only conditions (i-a) and (i-b) are actually -+ * controlled, i.e., provided that conditions (i-a) or (i-b) holds, -+ * idling is not performed, regardless of whether condition (ii) -+ * holds. In other words, only if conditions (i-a) and (i-b) do not -+ * hold, then idling is allowed, and the device tends to be prevented -+ * from queueing many requests, possibly of several processes. Since -+ * there are no groups with requests waiting for completion, then, to -+ * control conditions (i-a) and (i-b) it is enough to check just -+ * whether all the queues with requests waiting for completion also -+ * have the same weight. -+ * -+ * Not checking condition (ii) evidently exposes bfqq to the -+ * risk of getting less throughput than its fair share. -+ * However, for queues with the same weight, a further -+ * mechanism, preemption, mitigates or even eliminates this -+ * problem. And it does so without consequences on overall -+ * throughput. This mechanism and its benefits are explained -+ * in the next three paragraphs. -+ * -+ * Even if a queue, say Q, is expired when it remains idle, Q -+ * can still preempt the new in-service queue if the next -+ * request of Q arrives soon (see the comments on -+ * bfq_bfqq_update_budg_for_activation). If all queues and -+ * groups have the same weight, this form of preemption, -+ * combined with the hole-recovery heuristic described in the -+ * comments on function bfq_bfqq_update_budg_for_activation, -+ * are enough to preserve a correct bandwidth distribution in -+ * the mid term, even without idling. In fact, even if not -+ * idling allows the internal queues of the device to contain -+ * many requests, and thus to reorder requests, we can rather -+ * safely assume that the internal scheduler still preserves a -+ * minimum of mid-term fairness. -+ * -+ * More precisely, this preemption-based, idleless approach -+ * provides fairness in terms of IOPS, and not sectors per -+ * second. This can be seen with a simple example. Suppose -+ * that there are two queues with the same weight, but that -+ * the first queue receives requests of 8 sectors, while the -+ * second queue receives requests of 1024 sectors. In -+ * addition, suppose that each of the two queues contains at -+ * most one request at a time, which implies that each queue -+ * always remains idle after it is served. Finally, after -+ * remaining idle, each queue receives very quickly a new -+ * request. It follows that the two queues are served -+ * alternatively, preempting each other if needed. This -+ * implies that, although both queues have the same weight, -+ * the queue with large requests receives a service that is -+ * 1024/8 times as high as the service received by the other -+ * queue. -+ * -+ * The motivation for using preemption instead of idling (for -+ * queues with the same weight) is that, by not idling, -+ * service guarantees are preserved (completely or at least in -+ * part) without minimally sacrificing throughput. And, if -+ * there is no active group, then the primary expectation for -+ * this device is probably a high throughput. -+ * -+ * We are now left only with explaining the two sub-conditions in the -+ * additional compound condition that is checked below for deciding -+ * whether the scenario is asymmetric. To explain the first -+ * sub-condition, we need to add that the function -+ * bfq_asymmetric_scenario checks the weights of only -+ * non-weight-raised queues, for efficiency reasons (see comments on -+ * bfq_weights_tree_add()). Then the fact that bfqq is weight-raised -+ * is checked explicitly here. More precisely, the compound condition -+ * below takes into account also the fact that, even if bfqq is being -+ * weight-raised, the scenario is still symmetric if all queues with -+ * requests waiting for completion happen to be -+ * weight-raised. Actually, we should be even more precise here, and -+ * differentiate between interactive weight raising and soft real-time -+ * weight raising. -+ * -+ * The second sub-condition checked in the compound condition is -+ * whether there is a fair amount of already in-flight I/O not -+ * belonging to bfqq. If so, I/O dispatching is to be plugged, for the -+ * following reason. The drive may decide to serve in-flight -+ * non-bfqq's I/O requests before bfqq's ones, thereby delaying the -+ * arrival of new I/O requests for bfqq (recall that bfqq is sync). If -+ * I/O-dispatching is not plugged, then, while bfqq remains empty, a -+ * basically uncontrolled amount of I/O from other queues may be -+ * dispatched too, possibly causing the service of bfqq's I/O to be -+ * delayed even longer in the drive. This problem gets more and more -+ * serious as the speed and the queue depth of the drive grow, -+ * because, as these two quantities grow, the probability to find no -+ * queue busy but many requests in flight grows too. By contrast, -+ * plugging I/O dispatching minimizes the delay induced by already -+ * in-flight I/O, and enables bfqq to recover the bandwidth it may -+ * lose because of this delay. -+ * -+ * As a side note, it is worth considering that the above -+ * device-idling countermeasures may however fail in the following -+ * unlucky scenario: if I/O-dispatch plugging is (correctly) disabled -+ * in a time period during which all symmetry sub-conditions hold, and -+ * therefore the device is allowed to enqueue many requests, but at -+ * some later point in time some sub-condition stops to hold, then it -+ * may become impossible to make requests be served in the desired -+ * order until all the requests already queued in the device have been -+ * served. The last sub-condition commented above somewhat mitigates -+ * this problem for weight-raised queues. -+ */ -+static bool idling_needed_for_service_guarantees(struct bfq_data *bfqd, -+ struct bfq_queue *bfqq) -+{ -+ return (bfqq->wr_coeff > 1 && -+ (bfqd->wr_busy_queues < -+ bfq_tot_busy_queues(bfqd) || -+ bfqd->rq_in_driver >= -+ bfqq->dispatched + 4)) || -+ bfq_asymmetric_scenario(bfqd, bfqq); -+} -+ -+static bool __bfq_bfqq_expire(struct bfq_data *bfqd, struct bfq_queue *bfqq, -+ enum bfqq_expiration reason) - { - /* - * If this bfqq is shared between multiple processes, check -@@ -3056,7 +3427,22 @@ static bool __bfq_bfqq_expire(struct bfq_data *bfqd, struct bfq_queue *bfqq) - if (bfq_bfqq_coop(bfqq) && BFQQ_SEEKY(bfqq)) - bfq_mark_bfqq_split_coop(bfqq); - -- if (RB_EMPTY_ROOT(&bfqq->sort_list)) { -+ /* -+ * Consider queues with a higher finish virtual time than -+ * bfqq. If idling_needed_for_service_guarantees(bfqq) returns -+ * true, then bfqq's bandwidth would be violated if an -+ * uncontrolled amount of I/O from these queues were -+ * dispatched while bfqq is waiting for its new I/O to -+ * arrive. This is exactly what may happen if this is a forced -+ * expiration caused by a preemption attempt, and if bfqq is -+ * not re-scheduled. To prevent this from happening, re-queue -+ * bfqq if it needs I/O-dispatch plugging, even if it is -+ * empty. By doing so, bfqq is granted to be served before the -+ * above queues (provided that bfqq is of course eligible). -+ */ -+ if (RB_EMPTY_ROOT(&bfqq->sort_list) && -+ !(reason == BFQQE_PREEMPTED && -+ idling_needed_for_service_guarantees(bfqd, bfqq))) { - if (bfqq->dispatched == 0) - /* - * Overloading budget_timeout field to store -@@ -3073,7 +3459,8 @@ static bool __bfq_bfqq_expire(struct bfq_data *bfqd, struct bfq_queue *bfqq) - * Resort priority tree of potential close cooperators. - * See comments on bfq_pos_tree_add_move() for the unlikely(). - */ -- if (unlikely(!bfqd->nonrot_with_queueing)) -+ if (unlikely(!bfqd->nonrot_with_queueing && -+ !RB_EMPTY_ROOT(&bfqq->sort_list))) - bfq_pos_tree_add_move(bfqd, bfqq); - } - -@@ -3574,7 +3961,7 @@ void bfq_bfqq_expire(struct bfq_data *bfqd, - * reason. - */ - __bfq_bfqq_recalc_budget(bfqd, bfqq, reason); -- if (__bfq_bfqq_expire(bfqd, bfqq)) -+ if (__bfq_bfqq_expire(bfqd, bfqq, reason)) - /* bfqq is gone, no more actions on it */ - return; - -@@ -3720,184 +4107,6 @@ static bool idling_boosts_thr_without_issues(struct bfq_data *bfqd, - bfqd->wr_busy_queues == 0; - } - --/* -- * There is a case where idling does not have to be performed for -- * throughput concerns, but to preserve the throughput share of -- * the process associated with bfqq. -- * -- * To introduce this case, we can note that allowing the drive -- * to enqueue more than one request at a time, and hence -- * delegating de facto final scheduling decisions to the -- * drive's internal scheduler, entails loss of control on the -- * actual request service order. In particular, the critical -- * situation is when requests from different processes happen -- * to be present, at the same time, in the internal queue(s) -- * of the drive. In such a situation, the drive, by deciding -- * the service order of the internally-queued requests, does -- * determine also the actual throughput distribution among -- * these processes. But the drive typically has no notion or -- * concern about per-process throughput distribution, and -- * makes its decisions only on a per-request basis. Therefore, -- * the service distribution enforced by the drive's internal -- * scheduler is likely to coincide with the desired throughput -- * distribution only in a completely symmetric, or favorably -- * skewed scenario where: -- * (i-a) each of these processes must get the same throughput as -- * the others, -- * (i-b) in case (i-a) does not hold, it holds that the process -- * associated with bfqq must receive a lower or equal -- * throughput than any of the other processes; -- * (ii) the I/O of each process has the same properties, in -- * terms of locality (sequential or random), direction -- * (reads or writes), request sizes, greediness -- * (from I/O-bound to sporadic), and so on; -- -- * In fact, in such a scenario, the drive tends to treat the requests -- * of each process in about the same way as the requests of the -- * others, and thus to provide each of these processes with about the -- * same throughput. This is exactly the desired throughput -- * distribution if (i-a) holds, or, if (i-b) holds instead, this is an -- * even more convenient distribution for (the process associated with) -- * bfqq. -- * -- * In contrast, in any asymmetric or unfavorable scenario, device -- * idling (I/O-dispatch plugging) is certainly needed to guarantee -- * that bfqq receives its assigned fraction of the device throughput -- * (see [1] for details). -- * -- * The problem is that idling may significantly reduce throughput with -- * certain combinations of types of I/O and devices. An important -- * example is sync random I/O on flash storage with command -- * queueing. So, unless bfqq falls in cases where idling also boosts -- * throughput, it is important to check conditions (i-a), i(-b) and -- * (ii) accurately, so as to avoid idling when not strictly needed for -- * service guarantees. -- * -- * Unfortunately, it is extremely difficult to thoroughly check -- * condition (ii). And, in case there are active groups, it becomes -- * very difficult to check conditions (i-a) and (i-b) too. In fact, -- * if there are active groups, then, for conditions (i-a) or (i-b) to -- * become false 'indirectly', it is enough that an active group -- * contains more active processes or sub-groups than some other active -- * group. More precisely, for conditions (i-a) or (i-b) to become -- * false because of such a group, it is not even necessary that the -- * group is (still) active: it is sufficient that, even if the group -- * has become inactive, some of its descendant processes still have -- * some request already dispatched but still waiting for -- * completion. In fact, requests have still to be guaranteed their -- * share of the throughput even after being dispatched. In this -- * respect, it is easy to show that, if a group frequently becomes -- * inactive while still having in-flight requests, and if, when this -- * happens, the group is not considered in the calculation of whether -- * the scenario is asymmetric, then the group may fail to be -- * guaranteed its fair share of the throughput (basically because -- * idling may not be performed for the descendant processes of the -- * group, but it had to be). We address this issue with the following -- * bi-modal behavior, implemented in the function -- * bfq_asymmetric_scenario(). -- * -- * If there are groups with requests waiting for completion -- * (as commented above, some of these groups may even be -- * already inactive), then the scenario is tagged as -- * asymmetric, conservatively, without checking any of the -- * conditions (i-a), (i-b) or (ii). So the device is idled for bfqq. -- * This behavior matches also the fact that groups are created -- * exactly if controlling I/O is a primary concern (to -- * preserve bandwidth and latency guarantees). -- * -- * On the opposite end, if there are no groups with requests waiting -- * for completion, then only conditions (i-a) and (i-b) are actually -- * controlled, i.e., provided that conditions (i-a) or (i-b) holds, -- * idling is not performed, regardless of whether condition (ii) -- * holds. In other words, only if conditions (i-a) and (i-b) do not -- * hold, then idling is allowed, and the device tends to be prevented -- * from queueing many requests, possibly of several processes. Since -- * there are no groups with requests waiting for completion, then, to -- * control conditions (i-a) and (i-b) it is enough to check just -- * whether all the queues with requests waiting for completion also -- * have the same weight. -- * -- * Not checking condition (ii) evidently exposes bfqq to the -- * risk of getting less throughput than its fair share. -- * However, for queues with the same weight, a further -- * mechanism, preemption, mitigates or even eliminates this -- * problem. And it does so without consequences on overall -- * throughput. This mechanism and its benefits are explained -- * in the next three paragraphs. -- * -- * Even if a queue, say Q, is expired when it remains idle, Q -- * can still preempt the new in-service queue if the next -- * request of Q arrives soon (see the comments on -- * bfq_bfqq_update_budg_for_activation). If all queues and -- * groups have the same weight, this form of preemption, -- * combined with the hole-recovery heuristic described in the -- * comments on function bfq_bfqq_update_budg_for_activation, -- * are enough to preserve a correct bandwidth distribution in -- * the mid term, even without idling. In fact, even if not -- * idling allows the internal queues of the device to contain -- * many requests, and thus to reorder requests, we can rather -- * safely assume that the internal scheduler still preserves a -- * minimum of mid-term fairness. -- * -- * More precisely, this preemption-based, idleless approach -- * provides fairness in terms of IOPS, and not sectors per -- * second. This can be seen with a simple example. Suppose -- * that there are two queues with the same weight, but that -- * the first queue receives requests of 8 sectors, while the -- * second queue receives requests of 1024 sectors. In -- * addition, suppose that each of the two queues contains at -- * most one request at a time, which implies that each queue -- * always remains idle after it is served. Finally, after -- * remaining idle, each queue receives very quickly a new -- * request. It follows that the two queues are served -- * alternatively, preempting each other if needed. This -- * implies that, although both queues have the same weight, -- * the queue with large requests receives a service that is -- * 1024/8 times as high as the service received by the other -- * queue. -- * -- * The motivation for using preemption instead of idling (for -- * queues with the same weight) is that, by not idling, -- * service guarantees are preserved (completely or at least in -- * part) without minimally sacrificing throughput. And, if -- * there is no active group, then the primary expectation for -- * this device is probably a high throughput. -- * -- * We are now left only with explaining the additional -- * compound condition that is checked below for deciding -- * whether the scenario is asymmetric. To explain this -- * compound condition, we need to add that the function -- * bfq_asymmetric_scenario checks the weights of only -- * non-weight-raised queues, for efficiency reasons (see -- * comments on bfq_weights_tree_add()). Then the fact that -- * bfqq is weight-raised is checked explicitly here. More -- * precisely, the compound condition below takes into account -- * also the fact that, even if bfqq is being weight-raised, -- * the scenario is still symmetric if all queues with requests -- * waiting for completion happen to be -- * weight-raised. Actually, we should be even more precise -- * here, and differentiate between interactive weight raising -- * and soft real-time weight raising. -- * -- * As a side note, it is worth considering that the above -- * device-idling countermeasures may however fail in the -- * following unlucky scenario: if idling is (correctly) -- * disabled in a time period during which all symmetry -- * sub-conditions hold, and hence the device is allowed to -- * enqueue many requests, but at some later point in time some -- * sub-condition stops to hold, then it may become impossible -- * to let requests be served in the desired order until all -- * the requests already queued in the device have been served. -- */ --static bool idling_needed_for_service_guarantees(struct bfq_data *bfqd, -- struct bfq_queue *bfqq) --{ -- return (bfqq->wr_coeff > 1 && -- bfqd->wr_busy_queues < -- bfq_tot_busy_queues(bfqd)) || -- bfq_asymmetric_scenario(bfqd, bfqq); --} -- - /* - * For a queue that becomes empty, device idling is allowed only if - * this function returns true for that queue. As a consequence, since -@@ -4156,22 +4365,95 @@ static struct bfq_queue *bfq_select_queue(struct bfq_data *bfqd) - (bfqq->dispatched != 0 && bfq_better_to_idle(bfqq))) { - struct bfq_queue *async_bfqq = - bfqq->bic && bfqq->bic->bfqq[0] && -- bfq_bfqq_busy(bfqq->bic->bfqq[0]) ? -+ bfq_bfqq_busy(bfqq->bic->bfqq[0]) && -+ bfqq->bic->bfqq[0]->next_rq ? - bfqq->bic->bfqq[0] : NULL; - - /* -- * If the process associated with bfqq has also async -- * I/O pending, then inject it -- * unconditionally. Injecting I/O from the same -- * process can cause no harm to the process. On the -- * contrary, it can only increase bandwidth and reduce -- * latency for the process. -+ * The next three mutually-exclusive ifs decide -+ * whether to try injection, and choose the queue to -+ * pick an I/O request from. -+ * -+ * The first if checks whether the process associated -+ * with bfqq has also async I/O pending. If so, it -+ * injects such I/O unconditionally. Injecting async -+ * I/O from the same process can cause no harm to the -+ * process. On the contrary, it can only increase -+ * bandwidth and reduce latency for the process. -+ * -+ * The second if checks whether there happens to be a -+ * non-empty waker queue for bfqq, i.e., a queue whose -+ * I/O needs to be completed for bfqq to receive new -+ * I/O. This happens, e.g., if bfqq is associated with -+ * a process that does some sync. A sync generates -+ * extra blocking I/O, which must be completed before -+ * the process associated with bfqq can go on with its -+ * I/O. If the I/O of the waker queue is not served, -+ * then bfqq remains empty, and no I/O is dispatched, -+ * until the idle timeout fires for bfqq. This is -+ * likely to result in lower bandwidth and higher -+ * latencies for bfqq, and in a severe loss of total -+ * throughput. The best action to take is therefore to -+ * serve the waker queue as soon as possible. So do it -+ * (without relying on the third alternative below for -+ * eventually serving waker_bfqq's I/O; see the last -+ * paragraph for further details). This systematic -+ * injection of I/O from the waker queue does not -+ * cause any delay to bfqq's I/O. On the contrary, -+ * next bfqq's I/O is brought forward dramatically, -+ * for it is not blocked for milliseconds. -+ * -+ * The third if checks whether bfqq is a queue for -+ * which it is better to avoid injection. It is so if -+ * bfqq delivers more throughput when served without -+ * any further I/O from other queues in the middle, or -+ * if the service times of bfqq's I/O requests both -+ * count more than overall throughput, and may be -+ * easily increased by injection (this happens if bfqq -+ * has a short think time). If none of these -+ * conditions holds, then a candidate queue for -+ * injection is looked for through -+ * bfq_choose_bfqq_for_injection(). Note that the -+ * latter may return NULL (for example if the inject -+ * limit for bfqq is currently 0). -+ * -+ * NOTE: motivation for the second alternative -+ * -+ * Thanks to the way the inject limit is updated in -+ * bfq_update_has_short_ttime(), it is rather likely -+ * that, if I/O is being plugged for bfqq and the -+ * waker queue has pending I/O requests that are -+ * blocking bfqq's I/O, then the third alternative -+ * above lets the waker queue get served before the -+ * I/O-plugging timeout fires. So one may deem the -+ * second alternative superfluous. It is not, because -+ * the third alternative may be way less effective in -+ * case of a synchronization. For two main -+ * reasons. First, throughput may be low because the -+ * inject limit may be too low to guarantee the same -+ * amount of injected I/O, from the waker queue or -+ * other queues, that the second alternative -+ * guarantees (the second alternative unconditionally -+ * injects a pending I/O request of the waker queue -+ * for each bfq_dispatch_request()). Second, with the -+ * third alternative, the duration of the plugging, -+ * i.e., the time before bfqq finally receives new I/O, -+ * may not be minimized, because the waker queue may -+ * happen to be served only after other queues. - */ - if (async_bfqq && - icq_to_bic(async_bfqq->next_rq->elv.icq) == bfqq->bic && - bfq_serv_to_charge(async_bfqq->next_rq, async_bfqq) <= - bfq_bfqq_budget_left(async_bfqq)) - bfqq = bfqq->bic->bfqq[0]; -+ else if (bfq_bfqq_has_waker(bfqq) && -+ bfq_bfqq_busy(bfqq->waker_bfqq) && -+ bfqq->next_rq && -+ bfq_serv_to_charge(bfqq->waker_bfqq->next_rq, -+ bfqq->waker_bfqq) <= -+ bfq_bfqq_budget_left(bfqq->waker_bfqq) -+ ) -+ bfqq = bfqq->waker_bfqq; - else if (!idling_boosts_thr_without_issues(bfqd, bfqq) && - (bfqq->wr_coeff == 1 || bfqd->wr_busy_queues > 1 || - !bfq_bfqq_has_short_ttime(bfqq))) -@@ -4489,6 +4771,8 @@ static struct request *bfq_dispatch_request(struct blk_mq_hw_ctx *hctx) - */ - void bfq_put_queue(struct bfq_queue *bfqq) - { -+ struct bfq_queue *item; -+ struct hlist_node *n; - #ifdef CONFIG_BFQ_GROUP_IOSCHED - struct bfq_group *bfqg = bfqq_group(bfqq); - #endif -@@ -4533,6 +4817,36 @@ void bfq_put_queue(struct bfq_queue *bfqq) - bfqq->bfqd->burst_size--; - } - -+ /* -+ * bfqq does not exist any longer, so it cannot be woken by -+ * any other queue, and cannot wake any other queue. Then bfqq -+ * must be removed from the woken list of its possible waker -+ * queue, and all queues in the woken list of bfqq must stop -+ * having a waker queue. Strictly speaking, these updates -+ * should be performed when bfqq remains with no I/O source -+ * attached to it, which happens before bfqq gets freed. In -+ * particular, this happens when the last process associated -+ * with bfqq exits or gets associated with a different -+ * queue. However, both events lead to bfqq being freed soon, -+ * and dangling references would come out only after bfqq gets -+ * freed. So these updates are done here, as a simple and safe -+ * way to handle all cases. -+ */ -+ /* remove bfqq from woken list */ -+ if (!hlist_unhashed(&bfqq->woken_list_node)) -+ hlist_del_init(&bfqq->woken_list_node); -+ -+ /* reset waker for all queues in woken list */ -+ hlist_for_each_entry_safe(item, n, &bfqq->woken_list, -+ woken_list_node) { -+ item->waker_bfqq = NULL; -+ bfq_clear_bfqq_has_waker(item); -+ hlist_del_init(&item->woken_list_node); -+ } -+ -+ if (bfqq->bfqd && bfqq->bfqd->last_completed_rq_bfqq == bfqq) -+ bfqq->bfqd->last_completed_rq_bfqq = NULL; -+ - kmem_cache_free(bfq_pool, bfqq); - #ifdef CONFIG_BFQ_GROUP_IOSCHED - bfqg_and_blkg_put(bfqg); -@@ -4561,7 +4875,7 @@ static void bfq_put_cooperator(struct bfq_queue *bfqq) - static void bfq_exit_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq) - { - if (bfqq == bfqd->in_service_queue) { -- __bfq_bfqq_expire(bfqd, bfqq); -+ __bfq_bfqq_expire(bfqd, bfqq, BFQQE_BUDGET_TIMEOUT); - bfq_schedule_dispatch(bfqd); - } - -@@ -4584,6 +4898,7 @@ static void bfq_exit_icq_bfqq(struct bfq_io_cq *bic, bool is_sync) - unsigned long flags; - - spin_lock_irqsave(&bfqd->lock, flags); -+ bfqq->bic = NULL; - bfq_exit_bfqq(bfqd, bfqq); - bic_set_bfqq(bic, NULL, is_sync); - spin_unlock_irqrestore(&bfqd->lock, flags); -@@ -4687,6 +5002,8 @@ static void bfq_init_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq, - RB_CLEAR_NODE(&bfqq->entity.rb_node); - INIT_LIST_HEAD(&bfqq->fifo); - INIT_HLIST_NODE(&bfqq->burst_list_node); -+ INIT_HLIST_NODE(&bfqq->woken_list_node); -+ INIT_HLIST_HEAD(&bfqq->woken_list); - - bfqq->ref = 0; - bfqq->bfqd = bfqd; -@@ -4854,7 +5171,7 @@ static void bfq_update_has_short_ttime(struct bfq_data *bfqd, - struct bfq_queue *bfqq, - struct bfq_io_cq *bic) - { -- bool has_short_ttime = true; -+ bool has_short_ttime = true, state_changed; - - /* - * No need to update has_short_ttime if bfqq is async or in -@@ -4879,13 +5196,102 @@ static void bfq_update_has_short_ttime(struct bfq_data *bfqd, - bfqq->ttime.ttime_mean > bfqd->bfq_slice_idle)) - has_short_ttime = false; - -- bfq_log_bfqq(bfqd, bfqq, "update_has_short_ttime: has_short_ttime %d", -- has_short_ttime); -+ state_changed = has_short_ttime != bfq_bfqq_has_short_ttime(bfqq); - - if (has_short_ttime) - bfq_mark_bfqq_has_short_ttime(bfqq); - else - bfq_clear_bfqq_has_short_ttime(bfqq); -+ -+ /* -+ * Until the base value for the total service time gets -+ * finally computed for bfqq, the inject limit does depend on -+ * the think-time state (short|long). In particular, the limit -+ * is 0 or 1 if the think time is deemed, respectively, as -+ * short or long (details in the comments in -+ * bfq_update_inject_limit()). Accordingly, the next -+ * instructions reset the inject limit if the think-time state -+ * has changed and the above base value is still to be -+ * computed. -+ * -+ * However, the reset is performed only if more than 100 ms -+ * have elapsed since the last update of the inject limit, or -+ * (inclusive) if the change is from short to long think -+ * time. The reason for this waiting is as follows. -+ * -+ * bfqq may have a long think time because of a -+ * synchronization with some other queue, i.e., because the -+ * I/O of some other queue may need to be completed for bfqq -+ * to receive new I/O. Details in the comments on the choice -+ * of the queue for injection in bfq_select_queue(). -+ * -+ * As stressed in those comments, if such a synchronization is -+ * actually in place, then, without injection on bfqq, the -+ * blocking I/O cannot happen to served while bfqq is in -+ * service. As a consequence, if bfqq is granted -+ * I/O-dispatch-plugging, then bfqq remains empty, and no I/O -+ * is dispatched, until the idle timeout fires. This is likely -+ * to result in lower bandwidth and higher latencies for bfqq, -+ * and in a severe loss of total throughput. -+ * -+ * On the opposite end, a non-zero inject limit may allow the -+ * I/O that blocks bfqq to be executed soon, and therefore -+ * bfqq to receive new I/O soon. -+ * -+ * But, if the blocking gets actually eliminated, then the -+ * next think-time sample for bfqq may be very low. This in -+ * turn may cause bfqq's think time to be deemed -+ * short. Without the 100 ms barrier, this new state change -+ * would cause the body of the next if to be executed -+ * immediately. But this would set to 0 the inject -+ * limit. Without injection, the blocking I/O would cause the -+ * think time of bfqq to become long again, and therefore the -+ * inject limit to be raised again, and so on. The only effect -+ * of such a steady oscillation between the two think-time -+ * states would be to prevent effective injection on bfqq. -+ * -+ * In contrast, if the inject limit is not reset during such a -+ * long time interval as 100 ms, then the number of short -+ * think time samples can grow significantly before the reset -+ * is performed. As a consequence, the think time state can -+ * become stable before the reset. Therefore there will be no -+ * state change when the 100 ms elapse, and no reset of the -+ * inject limit. The inject limit remains steadily equal to 1 -+ * both during and after the 100 ms. So injection can be -+ * performed at all times, and throughput gets boosted. -+ * -+ * An inject limit equal to 1 is however in conflict, in -+ * general, with the fact that the think time of bfqq is -+ * short, because injection may be likely to delay bfqq's I/O -+ * (as explained in the comments in -+ * bfq_update_inject_limit()). But this does not happen in -+ * this special case, because bfqq's low think time is due to -+ * an effective handling of a synchronization, through -+ * injection. In this special case, bfqq's I/O does not get -+ * delayed by injection; on the contrary, bfqq's I/O is -+ * brought forward, because it is not blocked for -+ * milliseconds. -+ * -+ * In addition, serving the blocking I/O much sooner, and much -+ * more frequently than once per I/O-plugging timeout, makes -+ * it much quicker to detect a waker queue (the concept of -+ * waker queue is defined in the comments in -+ * bfq_add_request()). This makes it possible to start sooner -+ * to boost throughput more effectively, by injecting the I/O -+ * of the waker queue unconditionally on every -+ * bfq_dispatch_request(). -+ * -+ * One last, important benefit of not resetting the inject -+ * limit before 100 ms is that, during this time interval, the -+ * base value for the total service time is likely to get -+ * finally computed for bfqq, freeing the inject limit from -+ * its relation with the think time. -+ */ -+ if (state_changed && bfqq->last_serv_time_ns == 0 && -+ (time_is_before_eq_jiffies(bfqq->decrease_time_jif + -+ msecs_to_jiffies(100)) || -+ !has_short_ttime)) -+ bfq_reset_inject_limit(bfqd, bfqq); - } - - /* -@@ -4895,19 +5301,9 @@ static void bfq_update_has_short_ttime(struct bfq_data *bfqd, - static void bfq_rq_enqueued(struct bfq_data *bfqd, struct bfq_queue *bfqq, - struct request *rq) - { -- struct bfq_io_cq *bic = RQ_BIC(rq); -- - if (rq->cmd_flags & REQ_META) - bfqq->meta_pending++; - -- bfq_update_io_thinktime(bfqd, bfqq); -- bfq_update_has_short_ttime(bfqd, bfqq, bic); -- bfq_update_io_seektime(bfqd, bfqq, rq); -- -- bfq_log_bfqq(bfqd, bfqq, -- "rq_enqueued: has_short_ttime=%d (seeky %d)", -- bfq_bfqq_has_short_ttime(bfqq), BFQQ_SEEKY(bfqq)); -- - bfqq->last_request_pos = blk_rq_pos(rq) + blk_rq_sectors(rq); - - if (bfqq == bfqd->in_service_queue && bfq_bfqq_wait_request(bfqq)) { -@@ -4995,6 +5391,10 @@ static bool __bfq_insert_request(struct bfq_data *bfqd, struct request *rq) - bfqq = new_bfqq; - } - -+ bfq_update_io_thinktime(bfqd, bfqq); -+ bfq_update_has_short_ttime(bfqd, bfqq, RQ_BIC(rq)); -+ bfq_update_io_seektime(bfqd, bfqq, rq); -+ - waiting = bfqq && bfq_bfqq_wait_request(bfqq); - bfq_add_request(rq); - idle_timer_disabled = waiting && !bfq_bfqq_wait_request(bfqq); -@@ -5060,12 +5460,12 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq, - - spin_lock_irq(&bfqd->lock); - bfqq = bfq_init_rq(rq); -- if (at_head || blk_rq_is_passthrough(rq)) { -+ if (!bfqq || at_head || blk_rq_is_passthrough(rq)) { - if (at_head) - list_add(&rq->queuelist, &bfqd->dispatch); - else - list_add_tail(&rq->queuelist, &bfqd->dispatch); -- } else { /* bfqq is assumed to be non null here */ -+ } else { - idle_timer_disabled = __bfq_insert_request(bfqd, rq); - /* - * Update bfqq, because, if a queue merge has occurred -@@ -5200,6 +5600,7 @@ static void bfq_completed_request(struct bfq_queue *bfqq, struct bfq_data *bfqd) - 1UL<<(BFQ_RATE_SHIFT - 10)) - bfq_update_rate_reset(bfqd, NULL); - bfqd->last_completion = now_ns; -+ bfqd->last_completed_rq_bfqq = bfqq; - - /* - * If we are waiting to discover whether the request pattern -@@ -5397,8 +5798,14 @@ static void bfq_update_inject_limit(struct bfq_data *bfqd, - * total service time, and there seem to be the right - * conditions to do it, or we can lower the last base value - * computed. -+ * -+ * NOTE: (bfqd->rq_in_driver == 1) means that there is no I/O -+ * request in flight, because this function is in the code -+ * path that handles the completion of a request of bfqq, and, -+ * in particular, this function is executed before -+ * bfqd->rq_in_driver is decremented in such a code path. - */ -- if ((bfqq->last_serv_time_ns == 0 && bfqd->rq_in_driver == 0) || -+ if ((bfqq->last_serv_time_ns == 0 && bfqd->rq_in_driver == 1) || - tot_time_ns < bfqq->last_serv_time_ns) { - bfqq->last_serv_time_ns = tot_time_ns; - /* -@@ -5406,7 +5813,18 @@ static void bfq_update_inject_limit(struct bfq_data *bfqd, - * start trying injection. - */ - bfqq->inject_limit = max_t(unsigned int, 1, old_limit); -- } -+ } else if (!bfqd->rqs_injected && bfqd->rq_in_driver == 1) -+ /* -+ * No I/O injected and no request still in service in -+ * the drive: these are the exact conditions for -+ * computing the base value of the total service time -+ * for bfqq. So let's update this value, because it is -+ * rather variable. For example, it varies if the size -+ * or the spatial locality of the I/O requests in bfqq -+ * change. -+ */ -+ bfqq->last_serv_time_ns = tot_time_ns; -+ - - /* update complete, not waiting for any request completion any longer */ - bfqd->waited_rq = NULL; -diff --git a/block/bfq-iosched.h b/block/bfq-iosched.h -index c2faa77824f8..56eb59d898b8 100644 ---- a/block/bfq-iosched.h -+++ b/block/bfq-iosched.h -@@ -357,6 +357,24 @@ struct bfq_queue { - - /* max service rate measured so far */ - u32 max_service_rate; -+ -+ /* -+ * Pointer to the waker queue for this queue, i.e., to the -+ * queue Q such that this queue happens to get new I/O right -+ * after some I/O request of Q is completed. For details, see -+ * the comments on the choice of the queue for injection in -+ * bfq_select_queue(). -+ */ -+ struct bfq_queue *waker_bfqq; -+ /* node for woken_list, see below */ -+ struct hlist_node woken_list_node; -+ /* -+ * Head of the list of the woken queues for this queue, i.e., -+ * of the list of the queues for which this queue is a waker -+ * queue. This list is used to reset the waker_bfqq pointer in -+ * the woken queues when this queue exits. -+ */ -+ struct hlist_head woken_list; - }; - - /** -@@ -533,6 +551,9 @@ struct bfq_data { - /* time of last request completion (ns) */ - u64 last_completion; - -+ /* bfqq owning the last completed rq */ -+ struct bfq_queue *last_completed_rq_bfqq; -+ - /* time of last transition from empty to non-empty (ns) */ - u64 last_empty_occupied_ns; - -@@ -743,7 +764,8 @@ enum bfqq_state_flags { - * update - */ - BFQQF_coop, /* bfqq is shared */ -- BFQQF_split_coop /* shared bfqq will be split */ -+ BFQQF_split_coop, /* shared bfqq will be split */ -+ BFQQF_has_waker /* bfqq has a waker queue */ - }; - - #define BFQ_BFQQ_FNS(name) \ -@@ -763,6 +785,7 @@ BFQ_BFQQ_FNS(in_large_burst); - BFQ_BFQQ_FNS(coop); - BFQ_BFQQ_FNS(split_coop); - BFQ_BFQQ_FNS(softrt_update); -+BFQ_BFQQ_FNS(has_waker); - #undef BFQ_BFQQ_FNS - - /* Expiration reasons. */ -diff --git a/block/bio-integrity.c b/block/bio-integrity.c -index 4db620849515..fb95dbb21dd8 100644 ---- a/block/bio-integrity.c -+++ b/block/bio-integrity.c -@@ -276,8 +276,12 @@ bool bio_integrity_prep(struct bio *bio) - ret = bio_integrity_add_page(bio, virt_to_page(buf), - bytes, offset); - -- if (ret == 0) -- return false; -+ if (ret == 0) { -+ printk(KERN_ERR "could not attach integrity payload\n"); -+ kfree(buf); -+ status = BLK_STS_RESOURCE; -+ goto err_end_io; -+ } - - if (ret < bytes) - break; -diff --git a/block/bio.c b/block/bio.c -index ce797d73bb43..121caeea3e00 100644 ---- a/block/bio.c -+++ b/block/bio.c -@@ -16,6 +16,7 @@ - #include - #include - #include -+#include - - #include - #include "blk.h" -@@ -731,7 +732,7 @@ static int __bio_add_pc_page(struct request_queue *q, struct bio *bio, - } - } - -- if (bio_full(bio)) -+ if (bio_full(bio, len)) - return 0; - - if (bio->bi_phys_segments >= queue_max_segments(q)) -@@ -807,7 +808,7 @@ void __bio_add_page(struct bio *bio, struct page *page, - struct bio_vec *bv = &bio->bi_io_vec[bio->bi_vcnt]; - - WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED)); -- WARN_ON_ONCE(bio_full(bio)); -+ WARN_ON_ONCE(bio_full(bio, len)); - - bv->bv_page = page; - bv->bv_offset = off; -@@ -834,7 +835,7 @@ int bio_add_page(struct bio *bio, struct page *page, - bool same_page = false; - - if (!__bio_try_merge_page(bio, page, len, offset, &same_page)) { -- if (bio_full(bio)) -+ if (bio_full(bio, len)) - return 0; - __bio_add_page(bio, page, len, offset); - } -@@ -922,7 +923,7 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) - if (same_page) - put_page(page); - } else { -- if (WARN_ON_ONCE(bio_full(bio))) -+ if (WARN_ON_ONCE(bio_full(bio, len))) - return -EINVAL; - __bio_add_page(bio, page, len, offset); - } -@@ -966,7 +967,7 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) - ret = __bio_iov_bvec_add_pages(bio, iter); - else - ret = __bio_iov_iter_get_pages(bio, iter); -- } while (!ret && iov_iter_count(iter) && !bio_full(bio)); -+ } while (!ret && iov_iter_count(iter) && !bio_full(bio, 0)); - - if (iov_iter_bvec_no_ref(iter)) - bio_set_flag(bio, BIO_NO_PAGE_REF); -@@ -1479,8 +1480,22 @@ void bio_unmap_user(struct bio *bio) - bio_put(bio); - } - -+static void bio_invalidate_vmalloc_pages(struct bio *bio) -+{ -+#ifdef ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE -+ if (bio->bi_private && !op_is_write(bio_op(bio))) { -+ unsigned long i, len = 0; -+ -+ for (i = 0; i < bio->bi_vcnt; i++) -+ len += bio->bi_io_vec[i].bv_len; -+ invalidate_kernel_vmap_range(bio->bi_private, len); -+ } -+#endif -+} -+ - static void bio_map_kern_endio(struct bio *bio) - { -+ bio_invalidate_vmalloc_pages(bio); - bio_put(bio); - } - -@@ -1501,6 +1516,8 @@ struct bio *bio_map_kern(struct request_queue *q, void *data, unsigned int len, - unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT; - unsigned long start = kaddr >> PAGE_SHIFT; - const int nr_pages = end - start; -+ bool is_vmalloc = is_vmalloc_addr(data); -+ struct page *page; - int offset, i; - struct bio *bio; - -@@ -1508,6 +1525,11 @@ struct bio *bio_map_kern(struct request_queue *q, void *data, unsigned int len, - if (!bio) - return ERR_PTR(-ENOMEM); - -+ if (is_vmalloc) { -+ flush_kernel_vmap_range(data, len); -+ bio->bi_private = data; -+ } -+ - offset = offset_in_page(kaddr); - for (i = 0; i < nr_pages; i++) { - unsigned int bytes = PAGE_SIZE - offset; -@@ -1518,7 +1540,11 @@ struct bio *bio_map_kern(struct request_queue *q, void *data, unsigned int len, - if (bytes > len) - bytes = len; - -- if (bio_add_pc_page(q, bio, virt_to_page(data), bytes, -+ if (!is_vmalloc) -+ page = virt_to_page(data); -+ else -+ page = vmalloc_to_page(data); -+ if (bio_add_pc_page(q, bio, page, bytes, - offset) < bytes) { - /* we don't support partial mappings */ - bio_put(bio); -diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c -index 1f7127b03490..e4715b35d42c 100644 ---- a/block/blk-cgroup.c -+++ b/block/blk-cgroup.c -@@ -1006,8 +1006,12 @@ static int blkcg_print_stat(struct seq_file *sf, void *v) - } - next: - if (has_stats) { -- off += scnprintf(buf+off, size-off, "\n"); -- seq_commit(sf, off); -+ if (off < size - 1) { -+ off += scnprintf(buf+off, size-off, "\n"); -+ seq_commit(sf, off); -+ } else { -+ seq_commit(sf, -1); -+ } - } - } - -diff --git a/block/blk-core.c b/block/blk-core.c -index 8340f69670d8..5183fca0818a 100644 ---- a/block/blk-core.c -+++ b/block/blk-core.c -@@ -117,6 +117,7 @@ void blk_rq_init(struct request_queue *q, struct request *rq) - rq->internal_tag = -1; - rq->start_time_ns = ktime_get_ns(); - rq->part = NULL; -+ refcount_set(&rq->ref, 1); - } - EXPORT_SYMBOL(blk_rq_init); - -diff --git a/block/blk-iolatency.c b/block/blk-iolatency.c -index d22e61bced86..d973c38ee4fd 100644 ---- a/block/blk-iolatency.c -+++ b/block/blk-iolatency.c -@@ -618,44 +618,26 @@ static void blkcg_iolatency_done_bio(struct rq_qos *rqos, struct bio *bio) - - inflight = atomic_dec_return(&rqw->inflight); - WARN_ON_ONCE(inflight < 0); -- if (iolat->min_lat_nsec == 0) -- goto next; -- iolatency_record_time(iolat, &bio->bi_issue, now, -- issue_as_root); -- window_start = atomic64_read(&iolat->window_start); -- if (now > window_start && -- (now - window_start) >= iolat->cur_win_nsec) { -- if (atomic64_cmpxchg(&iolat->window_start, -- window_start, now) == window_start) -- iolatency_check_latencies(iolat, now); -+ /* -+ * If bi_status is BLK_STS_AGAIN, the bio wasn't actually -+ * submitted, so do not account for it. -+ */ -+ if (iolat->min_lat_nsec && bio->bi_status != BLK_STS_AGAIN) { -+ iolatency_record_time(iolat, &bio->bi_issue, now, -+ issue_as_root); -+ window_start = atomic64_read(&iolat->window_start); -+ if (now > window_start && -+ (now - window_start) >= iolat->cur_win_nsec) { -+ if (atomic64_cmpxchg(&iolat->window_start, -+ window_start, now) == window_start) -+ iolatency_check_latencies(iolat, now); -+ } - } --next: - wake_up(&rqw->wait); - blkg = blkg->parent; - } - } - --static void blkcg_iolatency_cleanup(struct rq_qos *rqos, struct bio *bio) --{ -- struct blkcg_gq *blkg; -- -- blkg = bio->bi_blkg; -- while (blkg && blkg->parent) { -- struct rq_wait *rqw; -- struct iolatency_grp *iolat; -- -- iolat = blkg_to_lat(blkg); -- if (!iolat) -- goto next; -- -- rqw = &iolat->rq_wait; -- atomic_dec(&rqw->inflight); -- wake_up(&rqw->wait); --next: -- blkg = blkg->parent; -- } --} -- - static void blkcg_iolatency_exit(struct rq_qos *rqos) - { - struct blk_iolatency *blkiolat = BLKIOLATENCY(rqos); -@@ -667,7 +649,6 @@ static void blkcg_iolatency_exit(struct rq_qos *rqos) - - static struct rq_qos_ops blkcg_iolatency_ops = { - .throttle = blkcg_iolatency_throttle, -- .cleanup = blkcg_iolatency_cleanup, - .done_bio = blkcg_iolatency_done_bio, - .exit = blkcg_iolatency_exit, - }; -@@ -778,8 +759,10 @@ static int iolatency_set_min_lat_nsec(struct blkcg_gq *blkg, u64 val) - - if (!oldval && val) - return 1; -- if (oldval && !val) -+ if (oldval && !val) { -+ blkcg_clear_delay(blkg); - return -1; -+ } - return 0; - } - -diff --git a/block/blk-throttle.c b/block/blk-throttle.c -index 9ea7c0ecad10..8ab6c8153223 100644 ---- a/block/blk-throttle.c -+++ b/block/blk-throttle.c -@@ -881,13 +881,10 @@ static bool tg_with_in_iops_limit(struct throtl_grp *tg, struct bio *bio, - unsigned long jiffy_elapsed, jiffy_wait, jiffy_elapsed_rnd; - u64 tmp; - -- jiffy_elapsed = jiffy_elapsed_rnd = jiffies - tg->slice_start[rw]; -- -- /* Slice has just started. Consider one slice interval */ -- if (!jiffy_elapsed) -- jiffy_elapsed_rnd = tg->td->throtl_slice; -+ jiffy_elapsed = jiffies - tg->slice_start[rw]; - -- jiffy_elapsed_rnd = roundup(jiffy_elapsed_rnd, tg->td->throtl_slice); -+ /* Round up to the next throttle slice, wait time must be nonzero */ -+ jiffy_elapsed_rnd = roundup(jiffy_elapsed + 1, tg->td->throtl_slice); - - /* - * jiffy_elapsed_rnd should not be a big value as minimum iops can be -diff --git a/block/blk-zoned.c b/block/blk-zoned.c -index ae7e91bd0618..0434e2846028 100644 ---- a/block/blk-zoned.c -+++ b/block/blk-zoned.c -@@ -14,6 +14,9 @@ - #include - #include - #include -+#include -+#include -+#include - - #include "blk.h" - -@@ -70,7 +73,7 @@ EXPORT_SYMBOL_GPL(__blk_req_zone_write_unlock); - static inline unsigned int __blkdev_nr_zones(struct request_queue *q, - sector_t nr_sectors) - { -- unsigned long zone_sectors = blk_queue_zone_sectors(q); -+ sector_t zone_sectors = blk_queue_zone_sectors(q); - - return (nr_sectors + zone_sectors - 1) >> ilog2(zone_sectors); - } -@@ -373,22 +376,25 @@ static inline unsigned long *blk_alloc_zone_bitmap(int node, - * Allocate an array of struct blk_zone to get nr_zones zone information. - * The allocated array may be smaller than nr_zones. - */ --static struct blk_zone *blk_alloc_zones(int node, unsigned int *nr_zones) -+static struct blk_zone *blk_alloc_zones(unsigned int *nr_zones) - { -- size_t size = *nr_zones * sizeof(struct blk_zone); -- struct page *page; -- int order; -- -- for (order = get_order(size); order >= 0; order--) { -- page = alloc_pages_node(node, GFP_NOIO | __GFP_ZERO, order); -- if (page) { -- *nr_zones = min_t(unsigned int, *nr_zones, -- (PAGE_SIZE << order) / sizeof(struct blk_zone)); -- return page_address(page); -- } -+ struct blk_zone *zones; -+ size_t nrz = min(*nr_zones, BLK_ZONED_REPORT_MAX_ZONES); -+ -+ /* -+ * GFP_KERNEL here is meaningless as the caller task context has -+ * the PF_MEMALLOC_NOIO flag set in blk_revalidate_disk_zones() -+ * with memalloc_noio_save(). -+ */ -+ zones = kvcalloc(nrz, sizeof(struct blk_zone), GFP_KERNEL); -+ if (!zones) { -+ *nr_zones = 0; -+ return NULL; - } - -- return NULL; -+ *nr_zones = nrz; -+ -+ return zones; - } - - void blk_queue_free_zone_bitmaps(struct request_queue *q) -@@ -415,6 +421,7 @@ int blk_revalidate_disk_zones(struct gendisk *disk) - unsigned long *seq_zones_wlock = NULL, *seq_zones_bitmap = NULL; - unsigned int i, rep_nr_zones = 0, z = 0, nrz; - struct blk_zone *zones = NULL; -+ unsigned int noio_flag; - sector_t sector = 0; - int ret = 0; - -@@ -427,6 +434,12 @@ int blk_revalidate_disk_zones(struct gendisk *disk) - return 0; - } - -+ /* -+ * Ensure that all memory allocations in this context are done as -+ * if GFP_NOIO was specified. -+ */ -+ noio_flag = memalloc_noio_save(); -+ - if (!blk_queue_is_zoned(q) || !nr_zones) { - nr_zones = 0; - goto update; -@@ -443,7 +456,7 @@ int blk_revalidate_disk_zones(struct gendisk *disk) - - /* Get zone information and initialize seq_zones_bitmap */ - rep_nr_zones = nr_zones; -- zones = blk_alloc_zones(q->node, &rep_nr_zones); -+ zones = blk_alloc_zones(&rep_nr_zones); - if (!zones) - goto out; - -@@ -480,8 +493,9 @@ int blk_revalidate_disk_zones(struct gendisk *disk) - blk_mq_unfreeze_queue(q); - - out: -- free_pages((unsigned long)zones, -- get_order(rep_nr_zones * sizeof(struct blk_zone))); -+ memalloc_noio_restore(noio_flag); -+ -+ kvfree(zones); - kfree(seq_zones_wlock); - kfree(seq_zones_bitmap); - -diff --git a/block/elevator.c b/block/elevator.c -index 2f17d66d0e61..a3168cb0ea7d 100644 ---- a/block/elevator.c -+++ b/block/elevator.c -@@ -604,8 +604,10 @@ int elevator_init_mq(struct request_queue *q) - struct elevator_type *e; - int err = 0; - -+#ifndef CONFIG_ZEN_INTERACTIVE - if (q->nr_hw_queues != 1) - return 0; -+#endif - - /* - * q->sysfs_lock must be held to provide mutual exclusion between -@@ -615,7 +617,13 @@ int elevator_init_mq(struct request_queue *q) - if (unlikely(q->elevator)) - goto out_unlock; - -+#if defined(CONFIG_ZEN_INTERACTIVE) && defined(CONFIG_MQ_IOSCHED_BFQ) -+ e = elevator_get(q, "bfq-mq", false); -+#elif defined(CONFIG_ZEN_INTERACTIVE) && defined(CONFIG_IOSCHED_BFQ) -+ e = elevator_get(q, "bfq", false); -+#else - e = elevator_get(q, "mq-deadline", false); -+#endif - if (!e) - goto out_unlock; - -diff --git a/crypto/asymmetric_keys/Kconfig b/crypto/asymmetric_keys/Kconfig -index be70ca6c85d3..1f1f004dc757 100644 ---- a/crypto/asymmetric_keys/Kconfig -+++ b/crypto/asymmetric_keys/Kconfig -@@ -15,6 +15,7 @@ config ASYMMETRIC_PUBLIC_KEY_SUBTYPE - select MPILIB - select CRYPTO_HASH_INFO - select CRYPTO_AKCIPHER -+ select CRYPTO_HASH - help - This option provides support for asymmetric public key type handling. - If signature generation and/or verification are to be used, -@@ -65,6 +66,7 @@ config TPM_KEY_PARSER - config PKCS7_MESSAGE_PARSER - tristate "PKCS#7 message parser" - depends on X509_CERTIFICATE_PARSER -+ select CRYPTO_HASH - select ASN1 - select OID_REGISTRY - help -@@ -87,6 +89,7 @@ config SIGNED_PE_FILE_VERIFICATION - bool "Support for PE file signature verification" - depends on PKCS7_MESSAGE_PARSER=y - depends on SYSTEM_DATA_VERIFICATION -+ select CRYPTO_HASH - select ASN1 - select OID_REGISTRY - help -diff --git a/crypto/chacha20poly1305.c b/crypto/chacha20poly1305.c -index 2db7eac4bf3b..2e2c25c62be6 100644 ---- a/crypto/chacha20poly1305.c -+++ b/crypto/chacha20poly1305.c -@@ -61,6 +61,8 @@ struct chachapoly_req_ctx { - unsigned int cryptlen; - /* Actual AD, excluding IV */ - unsigned int assoclen; -+ /* request flags, with MAY_SLEEP cleared if needed */ -+ u32 flags; - union { - struct poly_req poly; - struct chacha_req chacha; -@@ -70,8 +72,12 @@ struct chachapoly_req_ctx { - static inline void async_done_continue(struct aead_request *req, int err, - int (*cont)(struct aead_request *)) - { -- if (!err) -+ if (!err) { -+ struct chachapoly_req_ctx *rctx = aead_request_ctx(req); -+ -+ rctx->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; - err = cont(req); -+ } - - if (err != -EINPROGRESS && err != -EBUSY) - aead_request_complete(req, err); -@@ -138,7 +144,7 @@ static int chacha_decrypt(struct aead_request *req) - dst = scatterwalk_ffwd(rctx->dst, req->dst, req->assoclen); - } - -- skcipher_request_set_callback(&creq->req, aead_request_flags(req), -+ skcipher_request_set_callback(&creq->req, rctx->flags, - chacha_decrypt_done, req); - skcipher_request_set_tfm(&creq->req, ctx->chacha); - skcipher_request_set_crypt(&creq->req, src, dst, -@@ -182,7 +188,7 @@ static int poly_tail(struct aead_request *req) - memcpy(&preq->tail.cryptlen, &len, sizeof(len)); - sg_set_buf(preq->src, &preq->tail, sizeof(preq->tail)); - -- ahash_request_set_callback(&preq->req, aead_request_flags(req), -+ ahash_request_set_callback(&preq->req, rctx->flags, - poly_tail_done, req); - ahash_request_set_tfm(&preq->req, ctx->poly); - ahash_request_set_crypt(&preq->req, preq->src, -@@ -213,7 +219,7 @@ static int poly_cipherpad(struct aead_request *req) - sg_init_table(preq->src, 1); - sg_set_buf(preq->src, &preq->pad, padlen); - -- ahash_request_set_callback(&preq->req, aead_request_flags(req), -+ ahash_request_set_callback(&preq->req, rctx->flags, - poly_cipherpad_done, req); - ahash_request_set_tfm(&preq->req, ctx->poly); - ahash_request_set_crypt(&preq->req, preq->src, NULL, padlen); -@@ -244,7 +250,7 @@ static int poly_cipher(struct aead_request *req) - sg_init_table(rctx->src, 2); - crypt = scatterwalk_ffwd(rctx->src, crypt, req->assoclen); - -- ahash_request_set_callback(&preq->req, aead_request_flags(req), -+ ahash_request_set_callback(&preq->req, rctx->flags, - poly_cipher_done, req); - ahash_request_set_tfm(&preq->req, ctx->poly); - ahash_request_set_crypt(&preq->req, crypt, NULL, rctx->cryptlen); -@@ -274,7 +280,7 @@ static int poly_adpad(struct aead_request *req) - sg_init_table(preq->src, 1); - sg_set_buf(preq->src, preq->pad, padlen); - -- ahash_request_set_callback(&preq->req, aead_request_flags(req), -+ ahash_request_set_callback(&preq->req, rctx->flags, - poly_adpad_done, req); - ahash_request_set_tfm(&preq->req, ctx->poly); - ahash_request_set_crypt(&preq->req, preq->src, NULL, padlen); -@@ -298,7 +304,7 @@ static int poly_ad(struct aead_request *req) - struct poly_req *preq = &rctx->u.poly; - int err; - -- ahash_request_set_callback(&preq->req, aead_request_flags(req), -+ ahash_request_set_callback(&preq->req, rctx->flags, - poly_ad_done, req); - ahash_request_set_tfm(&preq->req, ctx->poly); - ahash_request_set_crypt(&preq->req, req->src, NULL, rctx->assoclen); -@@ -325,7 +331,7 @@ static int poly_setkey(struct aead_request *req) - sg_init_table(preq->src, 1); - sg_set_buf(preq->src, rctx->key, sizeof(rctx->key)); - -- ahash_request_set_callback(&preq->req, aead_request_flags(req), -+ ahash_request_set_callback(&preq->req, rctx->flags, - poly_setkey_done, req); - ahash_request_set_tfm(&preq->req, ctx->poly); - ahash_request_set_crypt(&preq->req, preq->src, NULL, sizeof(rctx->key)); -@@ -349,7 +355,7 @@ static int poly_init(struct aead_request *req) - struct poly_req *preq = &rctx->u.poly; - int err; - -- ahash_request_set_callback(&preq->req, aead_request_flags(req), -+ ahash_request_set_callback(&preq->req, rctx->flags, - poly_init_done, req); - ahash_request_set_tfm(&preq->req, ctx->poly); - -@@ -387,7 +393,7 @@ static int poly_genkey(struct aead_request *req) - - chacha_iv(creq->iv, req, 0); - -- skcipher_request_set_callback(&creq->req, aead_request_flags(req), -+ skcipher_request_set_callback(&creq->req, rctx->flags, - poly_genkey_done, req); - skcipher_request_set_tfm(&creq->req, ctx->chacha); - skcipher_request_set_crypt(&creq->req, creq->src, creq->src, -@@ -427,7 +433,7 @@ static int chacha_encrypt(struct aead_request *req) - dst = scatterwalk_ffwd(rctx->dst, req->dst, req->assoclen); - } - -- skcipher_request_set_callback(&creq->req, aead_request_flags(req), -+ skcipher_request_set_callback(&creq->req, rctx->flags, - chacha_encrypt_done, req); - skcipher_request_set_tfm(&creq->req, ctx->chacha); - skcipher_request_set_crypt(&creq->req, src, dst, -@@ -445,6 +451,7 @@ static int chachapoly_encrypt(struct aead_request *req) - struct chachapoly_req_ctx *rctx = aead_request_ctx(req); - - rctx->cryptlen = req->cryptlen; -+ rctx->flags = aead_request_flags(req); - - /* encrypt call chain: - * - chacha_encrypt/done() -@@ -466,6 +473,7 @@ static int chachapoly_decrypt(struct aead_request *req) - struct chachapoly_req_ctx *rctx = aead_request_ctx(req); - - rctx->cryptlen = req->cryptlen - POLY1305_DIGEST_SIZE; -+ rctx->flags = aead_request_flags(req); - - /* decrypt call chain: - * - poly_genkey/done() -diff --git a/crypto/ghash-generic.c b/crypto/ghash-generic.c -index 6425b9cd718e..dad9e1f91a78 100644 ---- a/crypto/ghash-generic.c -+++ b/crypto/ghash-generic.c -@@ -31,6 +31,7 @@ static int ghash_setkey(struct crypto_shash *tfm, - const u8 *key, unsigned int keylen) - { - struct ghash_ctx *ctx = crypto_shash_ctx(tfm); -+ be128 k; - - if (keylen != GHASH_BLOCK_SIZE) { - crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); -@@ -39,7 +40,12 @@ static int ghash_setkey(struct crypto_shash *tfm, - - if (ctx->gf128) - gf128mul_free_4k(ctx->gf128); -- ctx->gf128 = gf128mul_init_4k_lle((be128 *)key); -+ -+ BUILD_BUG_ON(sizeof(k) != GHASH_BLOCK_SIZE); -+ memcpy(&k, key, GHASH_BLOCK_SIZE); /* avoid violating alignment rules */ -+ ctx->gf128 = gf128mul_init_4k_lle(&k); -+ memzero_explicit(&k, GHASH_BLOCK_SIZE); -+ - if (!ctx->gf128) - return -ENOMEM; - -diff --git a/crypto/lrw.c b/crypto/lrw.c -index 58009cf63a6e..be829f6afc8e 100644 ---- a/crypto/lrw.c -+++ b/crypto/lrw.c -@@ -384,7 +384,7 @@ static int create(struct crypto_template *tmpl, struct rtattr **tb) - inst->alg.base.cra_priority = alg->base.cra_priority; - inst->alg.base.cra_blocksize = LRW_BLOCK_SIZE; - inst->alg.base.cra_alignmask = alg->base.cra_alignmask | -- (__alignof__(__be32) - 1); -+ (__alignof__(be128) - 1); - - inst->alg.ivsize = LRW_BLOCK_SIZE; - inst->alg.min_keysize = crypto_skcipher_alg_min_keysize(alg) + -diff --git a/crypto/serpent_generic.c b/crypto/serpent_generic.c -index 16f612b6dbca..a9cc0b2aa0d6 100644 ---- a/crypto/serpent_generic.c -+++ b/crypto/serpent_generic.c -@@ -225,7 +225,13 @@ - x4 ^= x2; \ - }) - --static void __serpent_setkey_sbox(u32 r0, u32 r1, u32 r2, u32 r3, u32 r4, u32 *k) -+/* -+ * both gcc and clang have misoptimized this function in the past, -+ * producing horrible object code from spilling temporary variables -+ * on the stack. Forcing this part out of line avoids that. -+ */ -+static noinline void __serpent_setkey_sbox(u32 r0, u32 r1, u32 r2, -+ u32 r3, u32 r4, u32 *k) - { - k += 100; - S3(r3, r4, r0, r1, r2); store_and_load_keys(r1, r2, r4, r3, 28, 24); -diff --git a/crypto/testmgr.c b/crypto/testmgr.c -index 658a7eeebab2..292d28caf00f 100644 ---- a/crypto/testmgr.c -+++ b/crypto/testmgr.c -@@ -1279,6 +1279,7 @@ static int test_hash_vec(const char *driver, const struct hash_testvec *vec, - req, tsgl, hashstate); - if (err) - return err; -+ cond_resched(); - } - } - #endif -@@ -1493,6 +1494,7 @@ static int __alg_test_hash(const struct hash_testvec *vecs, - err = test_hash_vec(driver, &vecs[i], i, req, tsgl, hashstate); - if (err) - goto out; -+ cond_resched(); - } - err = test_hash_vs_generic_impl(driver, generic_driver, maxkeysize, req, - tsgl, hashstate); -@@ -1755,6 +1757,7 @@ static int test_aead_vec(const char *driver, int enc, - &cfg, req, tsgls); - if (err) - return err; -+ cond_resched(); - } - } - #endif -@@ -1994,6 +1997,7 @@ static int test_aead(const char *driver, int enc, - tsgls); - if (err) - return err; -+ cond_resched(); - } - return 0; - } -@@ -2336,6 +2340,7 @@ static int test_skcipher_vec(const char *driver, int enc, - &cfg, req, tsgls); - if (err) - return err; -+ cond_resched(); - } - } - #endif -@@ -2535,6 +2540,7 @@ static int test_skcipher(const char *driver, int enc, - tsgls); - if (err) - return err; -+ cond_resched(); - } - return 0; - } -diff --git a/drivers/acpi/acpica/acevents.h b/drivers/acpi/acpica/acevents.h -index 831660179662..c8652f91054e 100644 ---- a/drivers/acpi/acpica/acevents.h -+++ b/drivers/acpi/acpica/acevents.h -@@ -69,7 +69,8 @@ acpi_status - acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked); - - acpi_status --acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info); -+acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info, -+ u8 clear_on_enable); - - acpi_status - acpi_ev_remove_gpe_reference(struct acpi_gpe_event_info *gpe_event_info); -diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c -index 62d3aa74277b..344feba29063 100644 ---- a/drivers/acpi/acpica/evgpe.c -+++ b/drivers/acpi/acpica/evgpe.c -@@ -146,6 +146,7 @@ acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked) - * FUNCTION: acpi_ev_add_gpe_reference - * - * PARAMETERS: gpe_event_info - Add a reference to this GPE -+ * clear_on_enable - Clear GPE status before enabling it - * - * RETURN: Status - * -@@ -155,7 +156,8 @@ acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked) - ******************************************************************************/ - - acpi_status --acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info) -+acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info, -+ u8 clear_on_enable) - { - acpi_status status = AE_OK; - -@@ -170,6 +172,10 @@ acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info) - - /* Enable on first reference */ - -+ if (clear_on_enable) { -+ (void)acpi_hw_clear_gpe(gpe_event_info); -+ } -+ - status = acpi_ev_update_gpe_enable_mask(gpe_event_info); - if (ACPI_SUCCESS(status)) { - status = acpi_ev_enable_gpe(gpe_event_info); -diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c -index 328d1d6123ad..fb15e9e2373b 100644 ---- a/drivers/acpi/acpica/evgpeblk.c -+++ b/drivers/acpi/acpica/evgpeblk.c -@@ -453,7 +453,7 @@ acpi_ev_initialize_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, - continue; - } - -- status = acpi_ev_add_gpe_reference(gpe_event_info); -+ status = acpi_ev_add_gpe_reference(gpe_event_info, FALSE); - if (ACPI_FAILURE(status)) { - ACPI_EXCEPTION((AE_INFO, status, - "Could not enable GPE 0x%02X", -diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c -index 3df00eb6621b..279ef0557aa3 100644 ---- a/drivers/acpi/acpica/evxface.c -+++ b/drivers/acpi/acpica/evxface.c -@@ -971,7 +971,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device, - ACPI_GPE_DISPATCH_METHOD) || - (ACPI_GPE_DISPATCH_TYPE(handler->original_flags) == - ACPI_GPE_DISPATCH_NOTIFY)) && handler->originally_enabled) { -- (void)acpi_ev_add_gpe_reference(gpe_event_info); -+ (void)acpi_ev_add_gpe_reference(gpe_event_info, FALSE); - if (ACPI_GPE_IS_POLLING_NEEDED(gpe_event_info)) { - - /* Poll edge triggered GPEs to handle existing events */ -diff --git a/drivers/acpi/acpica/evxfgpe.c b/drivers/acpi/acpica/evxfgpe.c -index 30a083902f52..710488ec59e9 100644 ---- a/drivers/acpi/acpica/evxfgpe.c -+++ b/drivers/acpi/acpica/evxfgpe.c -@@ -108,7 +108,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number) - if (gpe_event_info) { - if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) != - ACPI_GPE_DISPATCH_NONE) { -- status = acpi_ev_add_gpe_reference(gpe_event_info); -+ status = acpi_ev_add_gpe_reference(gpe_event_info, TRUE); - if (ACPI_SUCCESS(status) && - ACPI_GPE_IS_POLLING_NEEDED(gpe_event_info)) { - -diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c -index ad2c565f5cbe..a86a770c9b79 100644 ---- a/drivers/acpi/blacklist.c -+++ b/drivers/acpi/blacklist.c -@@ -17,7 +17,9 @@ - - #include "internal.h" - -+#ifdef CONFIG_DMI - static const struct dmi_system_id acpi_rev_dmi_table[] __initconst; -+#endif - - /* - * POLICY: If *anything* doesn't work, put it on the blacklist. -@@ -61,7 +63,9 @@ int __init acpi_blacklisted(void) - } - - (void)early_acpi_osi_init(); -+#ifdef CONFIG_DMI - dmi_check_system(acpi_rev_dmi_table); -+#endif - - return blacklisted; - } -diff --git a/drivers/android/binder.c b/drivers/android/binder.c -index bc26b5511f0a..dc1c83eafc22 100644 ---- a/drivers/android/binder.c -+++ b/drivers/android/binder.c -@@ -2059,10 +2059,9 @@ static size_t binder_get_object(struct binder_proc *proc, - - read_size = min_t(size_t, sizeof(*object), buffer->data_size - offset); - if (offset > buffer->data_size || read_size < sizeof(*hdr) || -- !IS_ALIGNED(offset, sizeof(u32))) -+ binder_alloc_copy_from_buffer(&proc->alloc, object, buffer, -+ offset, read_size)) - return 0; -- binder_alloc_copy_from_buffer(&proc->alloc, object, buffer, -- offset, read_size); - - /* Ok, now see if we read a complete object. */ - hdr = &object->hdr; -@@ -2131,8 +2130,10 @@ static struct binder_buffer_object *binder_validate_ptr( - return NULL; - - buffer_offset = start_offset + sizeof(binder_size_t) * index; -- binder_alloc_copy_from_buffer(&proc->alloc, &object_offset, -- b, buffer_offset, sizeof(object_offset)); -+ if (binder_alloc_copy_from_buffer(&proc->alloc, &object_offset, -+ b, buffer_offset, -+ sizeof(object_offset))) -+ return NULL; - object_size = binder_get_object(proc, b, object_offset, object); - if (!object_size || object->hdr.type != BINDER_TYPE_PTR) - return NULL; -@@ -2212,10 +2213,12 @@ static bool binder_validate_fixup(struct binder_proc *proc, - return false; - last_min_offset = last_bbo->parent_offset + sizeof(uintptr_t); - buffer_offset = objects_start_offset + -- sizeof(binder_size_t) * last_bbo->parent, -- binder_alloc_copy_from_buffer(&proc->alloc, &last_obj_offset, -- b, buffer_offset, -- sizeof(last_obj_offset)); -+ sizeof(binder_size_t) * last_bbo->parent; -+ if (binder_alloc_copy_from_buffer(&proc->alloc, -+ &last_obj_offset, -+ b, buffer_offset, -+ sizeof(last_obj_offset))) -+ return false; - } - return (fixup_offset >= last_min_offset); - } -@@ -2301,15 +2304,15 @@ static void binder_transaction_buffer_release(struct binder_proc *proc, - for (buffer_offset = off_start_offset; buffer_offset < off_end_offset; - buffer_offset += sizeof(binder_size_t)) { - struct binder_object_header *hdr; -- size_t object_size; -+ size_t object_size = 0; - struct binder_object object; - binder_size_t object_offset; - -- binder_alloc_copy_from_buffer(&proc->alloc, &object_offset, -- buffer, buffer_offset, -- sizeof(object_offset)); -- object_size = binder_get_object(proc, buffer, -- object_offset, &object); -+ if (!binder_alloc_copy_from_buffer(&proc->alloc, &object_offset, -+ buffer, buffer_offset, -+ sizeof(object_offset))) -+ object_size = binder_get_object(proc, buffer, -+ object_offset, &object); - if (object_size == 0) { - pr_err("transaction release %d bad object at offset %lld, size %zd\n", - debug_id, (u64)object_offset, buffer->data_size); -@@ -2432,15 +2435,16 @@ static void binder_transaction_buffer_release(struct binder_proc *proc, - for (fd_index = 0; fd_index < fda->num_fds; - fd_index++) { - u32 fd; -+ int err; - binder_size_t offset = fda_offset + - fd_index * sizeof(fd); - -- binder_alloc_copy_from_buffer(&proc->alloc, -- &fd, -- buffer, -- offset, -- sizeof(fd)); -- binder_deferred_fd_close(fd); -+ err = binder_alloc_copy_from_buffer( -+ &proc->alloc, &fd, buffer, -+ offset, sizeof(fd)); -+ WARN_ON(err); -+ if (!err) -+ binder_deferred_fd_close(fd); - } - } break; - default: -@@ -2683,11 +2687,12 @@ static int binder_translate_fd_array(struct binder_fd_array_object *fda, - int ret; - binder_size_t offset = fda_offset + fdi * sizeof(fd); - -- binder_alloc_copy_from_buffer(&target_proc->alloc, -- &fd, t->buffer, -- offset, sizeof(fd)); -- ret = binder_translate_fd(fd, offset, t, thread, -- in_reply_to); -+ ret = binder_alloc_copy_from_buffer(&target_proc->alloc, -+ &fd, t->buffer, -+ offset, sizeof(fd)); -+ if (!ret) -+ ret = binder_translate_fd(fd, offset, t, thread, -+ in_reply_to); - if (ret < 0) - return ret; - } -@@ -2740,8 +2745,12 @@ static int binder_fixup_parent(struct binder_transaction *t, - } - buffer_offset = bp->parent_offset + - (uintptr_t)parent->buffer - (uintptr_t)b->user_data; -- binder_alloc_copy_to_buffer(&target_proc->alloc, b, buffer_offset, -- &bp->buffer, sizeof(bp->buffer)); -+ if (binder_alloc_copy_to_buffer(&target_proc->alloc, b, buffer_offset, -+ &bp->buffer, sizeof(bp->buffer))) { -+ binder_user_error("%d:%d got transaction with invalid parent offset\n", -+ proc->pid, thread->pid); -+ return -EINVAL; -+ } - - return 0; - } -@@ -2979,7 +2988,7 @@ static void binder_transaction(struct binder_proc *proc, - else - return_error = BR_DEAD_REPLY; - mutex_unlock(&context->context_mgr_node_lock); -- if (target_node && target_proc == proc) { -+ if (target_node && target_proc->pid == proc->pid) { - binder_user_error("%d:%d got transaction to context manager from process owning it\n", - proc->pid, thread->pid); - return_error = BR_FAILED_REPLY; -@@ -3160,15 +3169,20 @@ static void binder_transaction(struct binder_proc *proc, - goto err_binder_alloc_buf_failed; - } - if (secctx) { -+ int err; - size_t buf_offset = ALIGN(tr->data_size, sizeof(void *)) + - ALIGN(tr->offsets_size, sizeof(void *)) + - ALIGN(extra_buffers_size, sizeof(void *)) - - ALIGN(secctx_sz, sizeof(u64)); - - t->security_ctx = (uintptr_t)t->buffer->user_data + buf_offset; -- binder_alloc_copy_to_buffer(&target_proc->alloc, -- t->buffer, buf_offset, -- secctx, secctx_sz); -+ err = binder_alloc_copy_to_buffer(&target_proc->alloc, -+ t->buffer, buf_offset, -+ secctx, secctx_sz); -+ if (err) { -+ t->security_ctx = 0; -+ WARN_ON(1); -+ } - security_release_secctx(secctx, secctx_sz); - secctx = NULL; - } -@@ -3225,7 +3239,8 @@ static void binder_transaction(struct binder_proc *proc, - buffer_offset = off_start_offset; - off_end_offset = off_start_offset + tr->offsets_size; - sg_buf_offset = ALIGN(off_end_offset, sizeof(void *)); -- sg_buf_end_offset = sg_buf_offset + extra_buffers_size; -+ sg_buf_end_offset = sg_buf_offset + extra_buffers_size - -+ ALIGN(secctx_sz, sizeof(u64)); - off_min = 0; - for (buffer_offset = off_start_offset; buffer_offset < off_end_offset; - buffer_offset += sizeof(binder_size_t)) { -@@ -3234,11 +3249,16 @@ static void binder_transaction(struct binder_proc *proc, - struct binder_object object; - binder_size_t object_offset; - -- binder_alloc_copy_from_buffer(&target_proc->alloc, -- &object_offset, -- t->buffer, -- buffer_offset, -- sizeof(object_offset)); -+ if (binder_alloc_copy_from_buffer(&target_proc->alloc, -+ &object_offset, -+ t->buffer, -+ buffer_offset, -+ sizeof(object_offset))) { -+ return_error = BR_FAILED_REPLY; -+ return_error_param = -EINVAL; -+ return_error_line = __LINE__; -+ goto err_bad_offset; -+ } - object_size = binder_get_object(target_proc, t->buffer, - object_offset, &object); - if (object_size == 0 || object_offset < off_min) { -@@ -3262,15 +3282,17 @@ static void binder_transaction(struct binder_proc *proc, - - fp = to_flat_binder_object(hdr); - ret = binder_translate_binder(fp, t, thread); -- if (ret < 0) { -+ -+ if (ret < 0 || -+ binder_alloc_copy_to_buffer(&target_proc->alloc, -+ t->buffer, -+ object_offset, -+ fp, sizeof(*fp))) { - return_error = BR_FAILED_REPLY; - return_error_param = ret; - return_error_line = __LINE__; - goto err_translate_failed; - } -- binder_alloc_copy_to_buffer(&target_proc->alloc, -- t->buffer, object_offset, -- fp, sizeof(*fp)); - } break; - case BINDER_TYPE_HANDLE: - case BINDER_TYPE_WEAK_HANDLE: { -@@ -3278,15 +3300,16 @@ static void binder_transaction(struct binder_proc *proc, - - fp = to_flat_binder_object(hdr); - ret = binder_translate_handle(fp, t, thread); -- if (ret < 0) { -+ if (ret < 0 || -+ binder_alloc_copy_to_buffer(&target_proc->alloc, -+ t->buffer, -+ object_offset, -+ fp, sizeof(*fp))) { - return_error = BR_FAILED_REPLY; - return_error_param = ret; - return_error_line = __LINE__; - goto err_translate_failed; - } -- binder_alloc_copy_to_buffer(&target_proc->alloc, -- t->buffer, object_offset, -- fp, sizeof(*fp)); - } break; - - case BINDER_TYPE_FD: { -@@ -3296,16 +3319,17 @@ static void binder_transaction(struct binder_proc *proc, - int ret = binder_translate_fd(fp->fd, fd_offset, t, - thread, in_reply_to); - -- if (ret < 0) { -+ fp->pad_binder = 0; -+ if (ret < 0 || -+ binder_alloc_copy_to_buffer(&target_proc->alloc, -+ t->buffer, -+ object_offset, -+ fp, sizeof(*fp))) { - return_error = BR_FAILED_REPLY; - return_error_param = ret; - return_error_line = __LINE__; - goto err_translate_failed; - } -- fp->pad_binder = 0; -- binder_alloc_copy_to_buffer(&target_proc->alloc, -- t->buffer, object_offset, -- fp, sizeof(*fp)); - } break; - case BINDER_TYPE_FDA: { - struct binder_object ptr_object; -@@ -3393,15 +3417,16 @@ static void binder_transaction(struct binder_proc *proc, - num_valid, - last_fixup_obj_off, - last_fixup_min_off); -- if (ret < 0) { -+ if (ret < 0 || -+ binder_alloc_copy_to_buffer(&target_proc->alloc, -+ t->buffer, -+ object_offset, -+ bp, sizeof(*bp))) { - return_error = BR_FAILED_REPLY; - return_error_param = ret; - return_error_line = __LINE__; - goto err_translate_failed; - } -- binder_alloc_copy_to_buffer(&target_proc->alloc, -- t->buffer, object_offset, -- bp, sizeof(*bp)); - last_fixup_obj_off = object_offset; - last_fixup_min_off = 0; - } break; -@@ -4140,20 +4165,27 @@ static int binder_apply_fd_fixups(struct binder_proc *proc, - trace_binder_transaction_fd_recv(t, fd, fixup->offset); - fd_install(fd, fixup->file); - fixup->file = NULL; -- binder_alloc_copy_to_buffer(&proc->alloc, t->buffer, -- fixup->offset, &fd, -- sizeof(u32)); -+ if (binder_alloc_copy_to_buffer(&proc->alloc, t->buffer, -+ fixup->offset, &fd, -+ sizeof(u32))) { -+ ret = -EINVAL; -+ break; -+ } - } - list_for_each_entry_safe(fixup, tmp, &t->fd_fixups, fixup_entry) { - if (fixup->file) { - fput(fixup->file); - } else if (ret) { - u32 fd; -- -- binder_alloc_copy_from_buffer(&proc->alloc, &fd, -- t->buffer, fixup->offset, -- sizeof(fd)); -- binder_deferred_fd_close(fd); -+ int err; -+ -+ err = binder_alloc_copy_from_buffer(&proc->alloc, &fd, -+ t->buffer, -+ fixup->offset, -+ sizeof(fd)); -+ WARN_ON(err); -+ if (!err) -+ binder_deferred_fd_close(fd); - } - list_del(&fixup->fixup_entry); - kfree(fixup); -@@ -4268,6 +4300,8 @@ static int binder_thread_read(struct binder_proc *proc, - case BINDER_WORK_TRANSACTION_COMPLETE: { - binder_inner_proc_unlock(proc); - cmd = BR_TRANSACTION_COMPLETE; -+ kfree(w); -+ binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); - if (put_user(cmd, (uint32_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(uint32_t); -@@ -4276,8 +4310,6 @@ static int binder_thread_read(struct binder_proc *proc, - binder_debug(BINDER_DEBUG_TRANSACTION_COMPLETE, - "%d:%d BR_TRANSACTION_COMPLETE\n", - proc->pid, thread->pid); -- kfree(w); -- binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); - } break; - case BINDER_WORK_NODE: { - struct binder_node *node = container_of(w, struct binder_node, work); -diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c -index ce5603c2291c..6d79a1b0d446 100644 ---- a/drivers/android/binder_alloc.c -+++ b/drivers/android/binder_alloc.c -@@ -1119,15 +1119,16 @@ binder_alloc_copy_user_to_buffer(struct binder_alloc *alloc, - return 0; - } - --static void binder_alloc_do_buffer_copy(struct binder_alloc *alloc, -- bool to_buffer, -- struct binder_buffer *buffer, -- binder_size_t buffer_offset, -- void *ptr, -- size_t bytes) -+static int binder_alloc_do_buffer_copy(struct binder_alloc *alloc, -+ bool to_buffer, -+ struct binder_buffer *buffer, -+ binder_size_t buffer_offset, -+ void *ptr, -+ size_t bytes) - { - /* All copies must be 32-bit aligned and 32-bit size */ -- BUG_ON(!check_buffer(alloc, buffer, buffer_offset, bytes)); -+ if (!check_buffer(alloc, buffer, buffer_offset, bytes)) -+ return -EINVAL; - - while (bytes) { - unsigned long size; -@@ -1155,25 +1156,26 @@ static void binder_alloc_do_buffer_copy(struct binder_alloc *alloc, - ptr = ptr + size; - buffer_offset += size; - } -+ return 0; - } - --void binder_alloc_copy_to_buffer(struct binder_alloc *alloc, -- struct binder_buffer *buffer, -- binder_size_t buffer_offset, -- void *src, -- size_t bytes) -+int binder_alloc_copy_to_buffer(struct binder_alloc *alloc, -+ struct binder_buffer *buffer, -+ binder_size_t buffer_offset, -+ void *src, -+ size_t bytes) - { -- binder_alloc_do_buffer_copy(alloc, true, buffer, buffer_offset, -- src, bytes); -+ return binder_alloc_do_buffer_copy(alloc, true, buffer, buffer_offset, -+ src, bytes); - } - --void binder_alloc_copy_from_buffer(struct binder_alloc *alloc, -- void *dest, -- struct binder_buffer *buffer, -- binder_size_t buffer_offset, -- size_t bytes) -+int binder_alloc_copy_from_buffer(struct binder_alloc *alloc, -+ void *dest, -+ struct binder_buffer *buffer, -+ binder_size_t buffer_offset, -+ size_t bytes) - { -- binder_alloc_do_buffer_copy(alloc, false, buffer, buffer_offset, -- dest, bytes); -+ return binder_alloc_do_buffer_copy(alloc, false, buffer, buffer_offset, -+ dest, bytes); - } - -diff --git a/drivers/android/binder_alloc.h b/drivers/android/binder_alloc.h -index 71bfa95f8e09..db9c1b984695 100644 ---- a/drivers/android/binder_alloc.h -+++ b/drivers/android/binder_alloc.h -@@ -159,17 +159,17 @@ binder_alloc_copy_user_to_buffer(struct binder_alloc *alloc, - const void __user *from, - size_t bytes); - --void binder_alloc_copy_to_buffer(struct binder_alloc *alloc, -- struct binder_buffer *buffer, -- binder_size_t buffer_offset, -- void *src, -- size_t bytes); -- --void binder_alloc_copy_from_buffer(struct binder_alloc *alloc, -- void *dest, -- struct binder_buffer *buffer, -- binder_size_t buffer_offset, -- size_t bytes); -+int binder_alloc_copy_to_buffer(struct binder_alloc *alloc, -+ struct binder_buffer *buffer, -+ binder_size_t buffer_offset, -+ void *src, -+ size_t bytes); -+ -+int binder_alloc_copy_from_buffer(struct binder_alloc *alloc, -+ void *dest, -+ struct binder_buffer *buffer, -+ binder_size_t buffer_offset, -+ size_t bytes); - - #endif /* _LINUX_BINDER_ALLOC_H */ - -diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c -index 9d687e1d4325..3bfd9da58473 100644 ---- a/drivers/ata/libata-eh.c -+++ b/drivers/ata/libata-eh.c -@@ -1469,7 +1469,7 @@ static int ata_eh_read_log_10h(struct ata_device *dev, - tf->hob_lbah = buf[10]; - tf->nsect = buf[12]; - tf->hob_nsect = buf[13]; -- if (ata_id_has_ncq_autosense(dev->id)) -+ if (dev->class == ATA_DEV_ZAC && ata_id_has_ncq_autosense(dev->id)) - tf->auxiliary = buf[14] << 16 | buf[15] << 8 | buf[16]; - - return 0; -@@ -1716,7 +1716,8 @@ void ata_eh_analyze_ncq_error(struct ata_link *link) - memcpy(&qc->result_tf, &tf, sizeof(tf)); - qc->result_tf.flags = ATA_TFLAG_ISADDR | ATA_TFLAG_LBA | ATA_TFLAG_LBA48; - qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ; -- if ((qc->result_tf.command & ATA_SENSE) || qc->result_tf.auxiliary) { -+ if (dev->class == ATA_DEV_ZAC && -+ ((qc->result_tf.command & ATA_SENSE) || qc->result_tf.auxiliary)) { - char sense_key, asc, ascq; - - sense_key = (qc->result_tf.auxiliary >> 16) & 0xff; -@@ -1770,10 +1771,11 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, - } - - switch (qc->dev->class) { -- case ATA_DEV_ATA: - case ATA_DEV_ZAC: - if (stat & ATA_SENSE) - ata_eh_request_sense(qc, qc->scsicmd); -+ /* fall through */ -+ case ATA_DEV_ATA: - if (err & ATA_ICRC) - qc->err_mask |= AC_ERR_ATA_BUS; - if (err & (ATA_UNC | ATA_AMNF)) -diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c -index 302cf0ba1600..8c7a996d1f16 100644 ---- a/drivers/atm/iphase.c -+++ b/drivers/atm/iphase.c -@@ -63,6 +63,7 @@ - #include - #include - #include -+#include - #include "iphase.h" - #include "suni.h" - #define swap_byte_order(x) (((x & 0xff) << 8) | ((x & 0xff00) >> 8)) -@@ -2760,8 +2761,11 @@ static int ia_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg) - } - if (copy_from_user(&ia_cmds, arg, sizeof ia_cmds)) return -EFAULT; - board = ia_cmds.status; -- if ((board < 0) || (board > iadev_count)) -- board = 0; -+ -+ if ((board < 0) || (board > iadev_count)) -+ board = 0; -+ board = array_index_nospec(board, iadev_count + 1); -+ - iadev = ia_dev[board]; - switch (ia_cmds.cmd) { - case MEMDUMP: -diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c -index a7359535caf5..b444f89a2041 100644 ---- a/drivers/base/cacheinfo.c -+++ b/drivers/base/cacheinfo.c -@@ -655,7 +655,8 @@ static int cacheinfo_cpu_pre_down(unsigned int cpu) - - static int __init cacheinfo_sysfs_init(void) - { -- return cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "base/cacheinfo:online", -+ return cpuhp_setup_state(CPUHP_AP_BASE_CACHEINFO_ONLINE, -+ "base/cacheinfo:online", - cacheinfo_cpu_online, cacheinfo_cpu_pre_down); - } - device_initcall(cacheinfo_sysfs_init); -diff --git a/drivers/base/core.c b/drivers/base/core.c -index fd7511e04e62..eaf3aa0cb803 100644 ---- a/drivers/base/core.c -+++ b/drivers/base/core.c -@@ -2211,6 +2211,24 @@ void put_device(struct device *dev) - } - EXPORT_SYMBOL_GPL(put_device); - -+bool kill_device(struct device *dev) -+{ -+ /* -+ * Require the device lock and set the "dead" flag to guarantee that -+ * the update behavior is consistent with the other bitfields near -+ * it and that we cannot have an asynchronous probe routine trying -+ * to run while we are tearing out the bus/class/sysfs from -+ * underneath the device. -+ */ -+ lockdep_assert_held(&dev->mutex); -+ -+ if (dev->p->dead) -+ return false; -+ dev->p->dead = true; -+ return true; -+} -+EXPORT_SYMBOL_GPL(kill_device); -+ - /** - * device_del - delete device from system. - * @dev: device. -@@ -2230,15 +2248,8 @@ void device_del(struct device *dev) - struct kobject *glue_dir = NULL; - struct class_interface *class_intf; - -- /* -- * Hold the device lock and set the "dead" flag to guarantee that -- * the update behavior is consistent with the other bitfields near -- * it and that we cannot have an asynchronous probe routine trying -- * to run while we are tearing out the bus/class/sysfs from -- * underneath the device. -- */ - device_lock(dev); -- dev->p->dead = true; -+ kill_device(dev); - device_unlock(dev); - - /* Notify clients of device removal. This call must come -diff --git a/drivers/base/firmware_loader/fallback.c b/drivers/base/firmware_loader/fallback.c -index f962488546b6..103b5d37fa86 100644 ---- a/drivers/base/firmware_loader/fallback.c -+++ b/drivers/base/firmware_loader/fallback.c -@@ -659,7 +659,7 @@ static bool fw_run_sysfs_fallback(enum fw_opt opt_flags) - /* Also permit LSMs and IMA to fail firmware sysfs fallback */ - ret = security_kernel_load_data(LOADING_FIRMWARE); - if (ret < 0) -- return ret; -+ return false; - - return fw_force_sysfs_fallback(opt_flags); - } -diff --git a/drivers/base/platform.c b/drivers/base/platform.c -index 4d1729853d1a..8b25c7b12179 100644 ---- a/drivers/base/platform.c -+++ b/drivers/base/platform.c -@@ -157,8 +157,13 @@ int platform_get_irq(struct platform_device *dev, unsigned int num) - * the device will only expose one IRQ, and this fallback - * allows a common code path across either kind of resource. - */ -- if (num == 0 && has_acpi_companion(&dev->dev)) -- return acpi_dev_gpio_irq_get(ACPI_COMPANION(&dev->dev), num); -+ if (num == 0 && has_acpi_companion(&dev->dev)) { -+ int ret = acpi_dev_gpio_irq_get(ACPI_COMPANION(&dev->dev), num); -+ -+ /* Our callers expect -ENXIO for missing IRQs. */ -+ if (ret >= 0 || ret == -EPROBE_DEFER) -+ return ret; -+ } - - return -ENXIO; - #endif -diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c -index 263f82516ff4..e5e1b3a01b1a 100644 ---- a/drivers/base/regmap/regmap-debugfs.c -+++ b/drivers/base/regmap/regmap-debugfs.c -@@ -579,6 +579,8 @@ void regmap_debugfs_init(struct regmap *map, const char *name) - } - - if (!strcmp(name, "dummy")) { -+ kfree(map->debugfs_name); -+ - map->debugfs_name = kasprintf(GFP_KERNEL, "dummy%d", - dummy_index); - name = map->debugfs_name; -diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c -index f1025452bb39..19f57ccfbe1d 100644 ---- a/drivers/base/regmap/regmap.c -+++ b/drivers/base/regmap/regmap.c -@@ -1637,6 +1637,8 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg, - map->format.reg_bytes + - map->format.pad_bytes, - val, val_len); -+ else -+ ret = -ENOTSUPP; - - /* If that didn't work fall back on linearising by hand. */ - if (ret == -ENOTSUPP) { -diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c -index 9fb9b312ab6b..fee57f7f3821 100644 ---- a/drivers/block/floppy.c -+++ b/drivers/block/floppy.c -@@ -2120,6 +2120,9 @@ static void setup_format_params(int track) - raw_cmd->kernel_data = floppy_track_buffer; - raw_cmd->length = 4 * F_SECT_PER_TRACK; - -+ if (!F_SECT_PER_TRACK) -+ return; -+ - /* allow for about 30ms for data transport per track */ - head_shift = (F_SECT_PER_TRACK + 5) / 6; - -@@ -3230,8 +3233,12 @@ static int set_geometry(unsigned int cmd, struct floppy_struct *g, - int cnt; - - /* sanity checking for parameters. */ -- if (g->sect <= 0 || -- g->head <= 0 || -+ if ((int)g->sect <= 0 || -+ (int)g->head <= 0 || -+ /* check for overflow in max_sector */ -+ (int)(g->sect * g->head) <= 0 || -+ /* check for zero in F_SECT_PER_TRACK */ -+ (unsigned char)((g->sect << 2) >> FD_SIZECODE(g)) == 0 || - g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) || - /* check if reserved bits are set */ - (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_SECTBASEMASK)) != 0) -@@ -3375,6 +3382,24 @@ static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo) - return 0; - } - -+static bool valid_floppy_drive_params(const short autodetect[8], -+ int native_format) -+{ -+ size_t floppy_type_size = ARRAY_SIZE(floppy_type); -+ size_t i = 0; -+ -+ for (i = 0; i < 8; ++i) { -+ if (autodetect[i] < 0 || -+ autodetect[i] >= floppy_type_size) -+ return false; -+ } -+ -+ if (native_format < 0 || native_format >= floppy_type_size) -+ return false; -+ -+ return true; -+} -+ - static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, - unsigned long param) - { -@@ -3501,6 +3526,9 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int - SUPBOUND(size, strlen((const char *)outparam) + 1); - break; - case FDSETDRVPRM: -+ if (!valid_floppy_drive_params(inparam.dp.autodetect, -+ inparam.dp.native_format)) -+ return -EINVAL; - *UDP = inparam.dp; - break; - case FDGETDRVPRM: -@@ -3698,6 +3726,8 @@ static int compat_setdrvprm(int drive, - return -EPERM; - if (copy_from_user(&v, arg, sizeof(struct compat_floppy_drive_params))) - return -EFAULT; -+ if (!valid_floppy_drive_params(v.autodetect, v.native_format)) -+ return -EINVAL; - mutex_lock(&floppy_mutex); - UDP->cmos = v.cmos; - UDP->max_dtr = v.max_dtr; -diff --git a/drivers/block/loop.c b/drivers/block/loop.c -index f11b7dc16e9d..e1739efca37e 100644 ---- a/drivers/block/loop.c -+++ b/drivers/block/loop.c -@@ -893,7 +893,7 @@ static void loop_unprepare_queue(struct loop_device *lo) - - static int loop_kthread_worker_fn(void *worker_ptr) - { -- current->flags |= PF_LESS_THROTTLE; -+ current->flags |= PF_LESS_THROTTLE | PF_MEMALLOC_NOIO; - return kthread_worker_fn(worker_ptr); - } - -@@ -932,6 +932,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, - struct file *file; - struct inode *inode; - struct address_space *mapping; -+ struct block_device *claimed_bdev = NULL; - int lo_flags = 0; - int error; - loff_t size; -@@ -950,10 +951,11 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, - * here to avoid changing device under exclusive owner. - */ - if (!(mode & FMODE_EXCL)) { -- bdgrab(bdev); -- error = blkdev_get(bdev, mode | FMODE_EXCL, loop_set_fd); -- if (error) -+ claimed_bdev = bd_start_claiming(bdev, loop_set_fd); -+ if (IS_ERR(claimed_bdev)) { -+ error = PTR_ERR(claimed_bdev); - goto out_putf; -+ } - } - - error = mutex_lock_killable(&loop_ctl_mutex); -@@ -1023,15 +1025,15 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, - mutex_unlock(&loop_ctl_mutex); - if (partscan) - loop_reread_partitions(lo, bdev); -- if (!(mode & FMODE_EXCL)) -- blkdev_put(bdev, mode | FMODE_EXCL); -+ if (claimed_bdev) -+ bd_abort_claiming(bdev, claimed_bdev, loop_set_fd); - return 0; - - out_unlock: - mutex_unlock(&loop_ctl_mutex); - out_bdev: -- if (!(mode & FMODE_EXCL)) -- blkdev_put(bdev, mode | FMODE_EXCL); -+ if (claimed_bdev) -+ bd_abort_claiming(bdev, claimed_bdev, loop_set_fd); - out_putf: - fput(file); - out: -diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c -index 3a9bca3aa093..57aebc6e1c28 100644 ---- a/drivers/block/nbd.c -+++ b/drivers/block/nbd.c -@@ -1229,7 +1229,7 @@ static void nbd_clear_sock_ioctl(struct nbd_device *nbd, - struct block_device *bdev) - { - sock_shutdown(nbd); -- kill_bdev(bdev); -+ __invalidate_device(bdev, true); - nbd_bdev_reset(bdev); - if (test_and_clear_bit(NBD_HAS_CONFIG_REF, - &nbd->config->runtime_flags)) -diff --git a/drivers/block/null_blk_main.c b/drivers/block/null_blk_main.c -index 447d635c79a2..2a4f8bc4f930 100644 ---- a/drivers/block/null_blk_main.c -+++ b/drivers/block/null_blk_main.c -@@ -327,11 +327,12 @@ static ssize_t nullb_device_power_store(struct config_item *item, - set_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags); - dev->power = newp; - } else if (dev->power && !newp) { -- mutex_lock(&lock); -- dev->power = newp; -- null_del_dev(dev->nullb); -- mutex_unlock(&lock); -- clear_bit(NULLB_DEV_FL_UP, &dev->flags); -+ if (test_and_clear_bit(NULLB_DEV_FL_UP, &dev->flags)) { -+ mutex_lock(&lock); -+ dev->power = newp; -+ null_del_dev(dev->nullb); -+ mutex_unlock(&lock); -+ } - clear_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags); - } - -diff --git a/drivers/block/swim.c b/drivers/block/swim.c -index 4c297f69171d..5bc4f1be2617 100644 ---- a/drivers/block/swim.c -+++ b/drivers/block/swim.c -@@ -328,7 +328,7 @@ static inline void swim_motor(struct swim __iomem *base, - if (swim_readbit(base, MOTOR_ON)) - break; - current->state = TASK_INTERRUPTIBLE; -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - } - } else if (action == OFF) { - swim_action(base, MOTOR_OFF); -@@ -347,7 +347,7 @@ static inline void swim_eject(struct swim __iomem *base) - if (!swim_readbit(base, DISK_IN)) - break; - current->state = TASK_INTERRUPTIBLE; -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - } - swim_select(base, RELAX); - } -@@ -371,7 +371,7 @@ static inline int swim_step(struct swim __iomem *base) - for (wait = 0; wait < HZ; wait++) { - - current->state = TASK_INTERRUPTIBLE; -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - - swim_select(base, RELAX); - if (!swim_readbit(base, STEP)) -diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig -index 1ffc64770643..57ef113add92 100644 ---- a/drivers/block/zram/Kconfig -+++ b/drivers/block/zram/Kconfig -@@ -2,7 +2,8 @@ - config ZRAM - tristate "Compressed RAM block device support" - depends on BLOCK && SYSFS && ZSMALLOC && CRYPTO -- select CRYPTO_LZO -+ select CRYPTO_LZO if !ZEN_INTERACTIVE -+ select CRYPTO_LZ4 if ZEN_INTERACTIVE - help - Creates virtual block devices called /dev/zramX (X = 0, 1, ...). - Pages written to these disks are compressed and stored in memory -diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c -index d58a359a6622..3393c4d6ec20 100644 ---- a/drivers/block/zram/zram_drv.c -+++ b/drivers/block/zram/zram_drv.c -@@ -41,7 +41,11 @@ static DEFINE_IDR(zram_index_idr); - static DEFINE_MUTEX(zram_index_mutex); - - static int zram_major; -+#ifdef CONFIG_ZEN_INTERACTIVE -+static const char *default_compressor = "lz4"; -+#else - static const char *default_compressor = "lzo-rle"; -+#endif - - /* Module params (documentation at end) */ - static unsigned int num_devices = 1; -diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index 50aed5259c2b..6d61f5aafc78 100644 ---- a/drivers/bluetooth/btusb.c -+++ b/drivers/bluetooth/btusb.c -@@ -264,7 +264,9 @@ static const struct usb_device_id blacklist_table[] = { - { USB_DEVICE(0x04ca, 0x3015), .driver_info = BTUSB_QCA_ROME }, - { USB_DEVICE(0x04ca, 0x3016), .driver_info = BTUSB_QCA_ROME }, - { USB_DEVICE(0x04ca, 0x301a), .driver_info = BTUSB_QCA_ROME }, -+ { USB_DEVICE(0x13d3, 0x3491), .driver_info = BTUSB_QCA_ROME }, - { USB_DEVICE(0x13d3, 0x3496), .driver_info = BTUSB_QCA_ROME }, -+ { USB_DEVICE(0x13d3, 0x3501), .driver_info = BTUSB_QCA_ROME }, - - /* Broadcom BCM2035 */ - { USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 }, -diff --git a/drivers/bluetooth/hci_ath.c b/drivers/bluetooth/hci_ath.c -index a55be205b91a..dbfe34664633 100644 ---- a/drivers/bluetooth/hci_ath.c -+++ b/drivers/bluetooth/hci_ath.c -@@ -98,6 +98,9 @@ static int ath_open(struct hci_uart *hu) - - BT_DBG("hu %p", hu); - -+ if (!hci_uart_has_flow_control(hu)) -+ return -EOPNOTSUPP; -+ - ath = kzalloc(sizeof(*ath), GFP_KERNEL); - if (!ath) - return -ENOMEM; -diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c -index 8905ad2edde7..ae2624fce913 100644 ---- a/drivers/bluetooth/hci_bcm.c -+++ b/drivers/bluetooth/hci_bcm.c -@@ -406,6 +406,9 @@ static int bcm_open(struct hci_uart *hu) - - bt_dev_dbg(hu->hdev, "hu %p", hu); - -+ if (!hci_uart_has_flow_control(hu)) -+ return -EOPNOTSUPP; -+ - bcm = kzalloc(sizeof(*bcm), GFP_KERNEL); - if (!bcm) - return -ENOMEM; -diff --git a/drivers/bluetooth/hci_bcsp.c b/drivers/bluetooth/hci_bcsp.c -index 82b13faa9422..fe2e307009f4 100644 ---- a/drivers/bluetooth/hci_bcsp.c -+++ b/drivers/bluetooth/hci_bcsp.c -@@ -744,6 +744,11 @@ static int bcsp_close(struct hci_uart *hu) - skb_queue_purge(&bcsp->rel); - skb_queue_purge(&bcsp->unrel); - -+ if (bcsp->rx_skb) { -+ kfree_skb(bcsp->rx_skb); -+ bcsp->rx_skb = NULL; -+ } -+ - kfree(bcsp); - return 0; - } -diff --git a/drivers/bluetooth/hci_intel.c b/drivers/bluetooth/hci_intel.c -index 207bae5e0d46..31f25153087d 100644 ---- a/drivers/bluetooth/hci_intel.c -+++ b/drivers/bluetooth/hci_intel.c -@@ -391,6 +391,9 @@ static int intel_open(struct hci_uart *hu) - - BT_DBG("hu %p", hu); - -+ if (!hci_uart_has_flow_control(hu)) -+ return -EOPNOTSUPP; -+ - intel = kzalloc(sizeof(*intel), GFP_KERNEL); - if (!intel) - return -ENOMEM; -diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c -index c84f985f348d..c953f14656b5 100644 ---- a/drivers/bluetooth/hci_ldisc.c -+++ b/drivers/bluetooth/hci_ldisc.c -@@ -284,6 +284,19 @@ static int hci_uart_send_frame(struct hci_dev *hdev, struct sk_buff *skb) - return 0; - } - -+/* Check the underlying device or tty has flow control support */ -+bool hci_uart_has_flow_control(struct hci_uart *hu) -+{ -+ /* serdev nodes check if the needed operations are present */ -+ if (hu->serdev) -+ return true; -+ -+ if (hu->tty->driver->ops->tiocmget && hu->tty->driver->ops->tiocmset) -+ return true; -+ -+ return false; -+} -+ - /* Flow control or un-flow control the device */ - void hci_uart_set_flow_control(struct hci_uart *hu, bool enable) - { -diff --git a/drivers/bluetooth/hci_mrvl.c b/drivers/bluetooth/hci_mrvl.c -index 50212ac629e3..49dcf198ffd8 100644 ---- a/drivers/bluetooth/hci_mrvl.c -+++ b/drivers/bluetooth/hci_mrvl.c -@@ -52,6 +52,9 @@ static int mrvl_open(struct hci_uart *hu) - - BT_DBG("hu %p", hu); - -+ if (!hci_uart_has_flow_control(hu)) -+ return -EOPNOTSUPP; -+ - mrvl = kzalloc(sizeof(*mrvl), GFP_KERNEL); - if (!mrvl) - return -ENOMEM; -diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c -index 9d273cdde563..f41fb2c02e4f 100644 ---- a/drivers/bluetooth/hci_qca.c -+++ b/drivers/bluetooth/hci_qca.c -@@ -458,6 +458,9 @@ static int qca_open(struct hci_uart *hu) - - BT_DBG("hu %p qca_open", hu); - -+ if (!hci_uart_has_flow_control(hu)) -+ return -EOPNOTSUPP; -+ - qca = kzalloc(sizeof(struct qca_data), GFP_KERNEL); - if (!qca) - return -ENOMEM; -diff --git a/drivers/bluetooth/hci_uart.h b/drivers/bluetooth/hci_uart.h -index d8cf005e3c5d..22c278b13ab9 100644 ---- a/drivers/bluetooth/hci_uart.h -+++ b/drivers/bluetooth/hci_uart.h -@@ -103,6 +103,7 @@ int hci_uart_tx_wakeup(struct hci_uart *hu); - int hci_uart_init_ready(struct hci_uart *hu); - void hci_uart_init_work(struct work_struct *work); - void hci_uart_set_baudrate(struct hci_uart *hu, unsigned int speed); -+bool hci_uart_has_flow_control(struct hci_uart *hu); - void hci_uart_set_flow_control(struct hci_uart *hu, bool enable); - void hci_uart_set_speeds(struct hci_uart *hu, unsigned int init_speed, - unsigned int oper_speed); -diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c -index 5c39f20378b8..9ac6671bb514 100644 ---- a/drivers/char/hpet.c -+++ b/drivers/char/hpet.c -@@ -567,8 +567,7 @@ static inline unsigned long hpet_time_div(struct hpets *hpets, - unsigned long long m; - - m = hpets->hp_tick_freq + (dis >> 1); -- do_div(m, dis); -- return (unsigned long)m; -+ return div64_ul(m, dis); - } - - static int -diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c -index 1dc10740fc0f..083c6f01bd8c 100644 ---- a/drivers/char/ipmi/ipmi_msghandler.c -+++ b/drivers/char/ipmi/ipmi_msghandler.c -@@ -3541,7 +3541,7 @@ static void cleanup_smi_msgs(struct ipmi_smi *intf) - /* Current message first, to preserve order */ - while (intf->curr_msg && !list_empty(&intf->waiting_rcv_msgs)) { - /* Wait for the message to clear out. */ -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - } - - /* No need for locks, the interface is down. */ -diff --git a/drivers/char/ipmi/ipmi_si_platform.c b/drivers/char/ipmi/ipmi_si_platform.c -index f2a91c4d8cab..0cd849675d99 100644 ---- a/drivers/char/ipmi/ipmi_si_platform.c -+++ b/drivers/char/ipmi/ipmi_si_platform.c -@@ -19,6 +19,7 @@ - #include "ipmi_si.h" - #include "ipmi_dmi.h" - -+static bool platform_registered; - static bool si_tryplatform = true; - #ifdef CONFIG_ACPI - static bool si_tryacpi = true; -@@ -469,9 +470,12 @@ void ipmi_si_platform_init(void) - int rv = platform_driver_register(&ipmi_platform_driver); - if (rv) - pr_err("Unable to register driver: %d\n", rv); -+ else -+ platform_registered = true; - } - - void ipmi_si_platform_shutdown(void) - { -- platform_driver_unregister(&ipmi_platform_driver); -+ if (platform_registered) -+ platform_driver_unregister(&ipmi_platform_driver); - } -diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c -index cf8156d6bc07..bcd0ab91d8c8 100644 ---- a/drivers/char/ipmi/ipmi_ssif.c -+++ b/drivers/char/ipmi/ipmi_ssif.c -@@ -303,6 +303,7 @@ struct ssif_info { - ((unsigned int) atomic_read(&(ssif)->stats[SSIF_STAT_ ## stat])) - - static bool initialized; -+static bool platform_registered; - - static void return_hosed_msg(struct ssif_info *ssif_info, - struct ipmi_smi_msg *msg); -@@ -1289,7 +1290,7 @@ static void shutdown_ssif(void *send_info) - - /* make sure the driver is not looking for flags any more. */ - while (ssif_info->ssif_state != SSIF_NORMAL) -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - - ssif_info->stopping = true; - del_timer_sync(&ssif_info->watch_timer); -@@ -2088,6 +2089,8 @@ static int init_ipmi_ssif(void) - rv = platform_driver_register(&ipmi_driver); - if (rv) - pr_err("Unable to register driver: %d\n", rv); -+ else -+ platform_registered = true; - } - - ssif_i2c_driver.address_list = ssif_address_list(); -@@ -2111,7 +2114,7 @@ static void cleanup_ipmi_ssif(void) - - kfree(ssif_i2c_driver.address_list); - -- if (ssif_trydmi) -+ if (ssif_trydmi && platform_registered) - platform_driver_unregister(&ipmi_driver); - - free_ssif_clients(); -diff --git a/drivers/char/snsc.c b/drivers/char/snsc.c -index 5918ea7499bb..5228e78df804 100644 ---- a/drivers/char/snsc.c -+++ b/drivers/char/snsc.c -@@ -198,7 +198,7 @@ scdrv_read(struct file *file, char __user *buf, size_t count, loff_t *f_pos) - add_wait_queue(&sd->sd_rq, &wait); - spin_unlock_irqrestore(&sd->sd_rlock, flags); - -- schedule_timeout(msecs_to_jiffies(SCDRV_TIMEOUT)); -+ schedule_msec_hrtimeout((SCDRV_TIMEOUT)); - - remove_wait_queue(&sd->sd_rq, &wait); - if (signal_pending(current)) { -@@ -294,7 +294,7 @@ scdrv_write(struct file *file, const char __user *buf, - add_wait_queue(&sd->sd_wq, &wait); - spin_unlock_irqrestore(&sd->sd_wlock, flags); - -- schedule_timeout(msecs_to_jiffies(SCDRV_TIMEOUT)); -+ schedule_msec_hrtimeout((SCDRV_TIMEOUT)); - - remove_wait_queue(&sd->sd_wq, &wait); - if (signal_pending(current)) { -diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c -index 90325e1749fb..bf868260f435 100644 ---- a/drivers/char/tpm/tpm-chip.c -+++ b/drivers/char/tpm/tpm-chip.c -@@ -77,6 +77,18 @@ static int tpm_go_idle(struct tpm_chip *chip) - return chip->ops->go_idle(chip); - } - -+static void tpm_clk_enable(struct tpm_chip *chip) -+{ -+ if (chip->ops->clk_enable) -+ chip->ops->clk_enable(chip, true); -+} -+ -+static void tpm_clk_disable(struct tpm_chip *chip) -+{ -+ if (chip->ops->clk_enable) -+ chip->ops->clk_enable(chip, false); -+} -+ - /** - * tpm_chip_start() - power on the TPM - * @chip: a TPM chip to use -@@ -89,13 +101,12 @@ int tpm_chip_start(struct tpm_chip *chip) - { - int ret; - -- if (chip->ops->clk_enable) -- chip->ops->clk_enable(chip, true); -+ tpm_clk_enable(chip); - - if (chip->locality == -1) { - ret = tpm_request_locality(chip); - if (ret) { -- chip->ops->clk_enable(chip, false); -+ tpm_clk_disable(chip); - return ret; - } - } -@@ -103,8 +114,7 @@ int tpm_chip_start(struct tpm_chip *chip) - ret = tpm_cmd_ready(chip); - if (ret) { - tpm_relinquish_locality(chip); -- if (chip->ops->clk_enable) -- chip->ops->clk_enable(chip, false); -+ tpm_clk_disable(chip); - return ret; - } - -@@ -124,8 +134,7 @@ void tpm_chip_stop(struct tpm_chip *chip) - { - tpm_go_idle(chip); - tpm_relinquish_locality(chip); -- if (chip->ops->clk_enable) -- chip->ops->clk_enable(chip, false); -+ tpm_clk_disable(chip); - } - EXPORT_SYMBOL_GPL(tpm_chip_stop); - -@@ -289,15 +298,15 @@ static int tpm_class_shutdown(struct device *dev) - { - struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev); - -+ down_write(&chip->ops_sem); - if (chip->flags & TPM_CHIP_FLAG_TPM2) { -- down_write(&chip->ops_sem); - if (!tpm_chip_start(chip)) { - tpm2_shutdown(chip, TPM2_SU_CLEAR); - tpm_chip_stop(chip); - } -- chip->ops = NULL; -- up_write(&chip->ops_sem); - } -+ chip->ops = NULL; -+ up_write(&chip->ops_sem); - - return 0; - } -diff --git a/drivers/char/tpm/tpm1-cmd.c b/drivers/char/tpm/tpm1-cmd.c -index 85dcf2654d11..faacbe1ffa1a 100644 ---- a/drivers/char/tpm/tpm1-cmd.c -+++ b/drivers/char/tpm/tpm1-cmd.c -@@ -510,7 +510,7 @@ struct tpm1_get_random_out { - * - * Return: - * * number of bytes read -- * * -errno or a TPM return code otherwise -+ * * -errno (positive TPM return codes are masked to -EIO) - */ - int tpm1_get_random(struct tpm_chip *chip, u8 *dest, size_t max) - { -@@ -531,8 +531,11 @@ int tpm1_get_random(struct tpm_chip *chip, u8 *dest, size_t max) - - rc = tpm_transmit_cmd(chip, &buf, sizeof(out->rng_data_len), - "attempting get random"); -- if (rc) -+ if (rc) { -+ if (rc > 0) -+ rc = -EIO; - goto out; -+ } - - out = (struct tpm1_get_random_out *)&buf.data[TPM_HEADER_SIZE]; - -diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c -index 4de49924cfc4..d103545e4055 100644 ---- a/drivers/char/tpm/tpm2-cmd.c -+++ b/drivers/char/tpm/tpm2-cmd.c -@@ -297,7 +297,7 @@ struct tpm2_get_random_out { - * - * Return: - * size of the buffer on success, -- * -errno otherwise -+ * -errno otherwise (positive TPM return codes are masked to -EIO) - */ - int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max) - { -@@ -324,8 +324,11 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max) - offsetof(struct tpm2_get_random_out, - buffer), - "attempting get random"); -- if (err) -+ if (err) { -+ if (err > 0) -+ err = -EIO; - goto out; -+ } - - out = (struct tpm2_get_random_out *) - &buf.data[TPM_HEADER_SIZE]; -diff --git a/drivers/clk/imx/clk-imx8mm.c b/drivers/clk/imx/clk-imx8mm.c -index 122a81ab8e48..01ef2fab5764 100644 ---- a/drivers/clk/imx/clk-imx8mm.c -+++ b/drivers/clk/imx/clk-imx8mm.c -@@ -325,7 +325,7 @@ static const char *imx8mm_dsi_dbi_sels[] = {"osc_24m", "sys_pll1_266m", "sys_pll - "sys_pll2_1000m", "sys_pll3_out", "audio_pll2_out", "video_pll1_out", }; - - static const char *imx8mm_usdhc3_sels[] = {"osc_24m", "sys_pll1_400m", "sys_pll1_800m", "sys_pll2_500m", -- "sys_pll3_out", "sys_pll1_266m", "audio_pll2_clk", "sys_pll1_100m", }; -+ "sys_pll3_out", "sys_pll1_266m", "audio_pll2_out", "sys_pll1_100m", }; - - static const char *imx8mm_csi1_core_sels[] = {"osc_24m", "sys_pll1_266m", "sys_pll2_250m", "sys_pll1_800m", - "sys_pll2_1000m", "sys_pll3_out", "audio_pll2_out", "video_pll1_out", }; -@@ -361,11 +361,11 @@ static const char *imx8mm_pdm_sels[] = {"osc_24m", "sys_pll2_100m", "audio_pll1_ - "sys_pll2_1000m", "sys_pll3_out", "clk_ext3", "audio_pll2_out", }; - - static const char *imx8mm_vpu_h1_sels[] = {"osc_24m", "vpu_pll_out", "sys_pll1_800m", "sys_pll2_1000m", -- "audio_pll2_clk", "sys_pll2_125m", "sys_pll3_clk", "audio_pll1_out", }; -+ "audio_pll2_out", "sys_pll2_125m", "sys_pll3_clk", "audio_pll1_out", }; - - static const char *imx8mm_dram_core_sels[] = {"dram_pll_out", "dram_alt_root", }; - --static const char *imx8mm_clko1_sels[] = {"osc_24m", "sys_pll1_800m", "osc_27m", "sys_pll1_200m", "audio_pll2_clk", -+static const char *imx8mm_clko1_sels[] = {"osc_24m", "sys_pll1_800m", "osc_27m", "sys_pll1_200m", "audio_pll2_out", - "vpu_pll", "sys_pll1_80m", }; - - static struct clk *clks[IMX8MM_CLK_END]; -diff --git a/drivers/clk/mediatek/clk-mt8183.c b/drivers/clk/mediatek/clk-mt8183.c -index 9d8651033ae9..bc01611c7723 100644 ---- a/drivers/clk/mediatek/clk-mt8183.c -+++ b/drivers/clk/mediatek/clk-mt8183.c -@@ -25,9 +25,11 @@ static const struct mtk_fixed_clk top_fixed_clks[] = { - FIXED_CLK(CLK_TOP_UNIVP_192M, "univpll_192m", "univpll", 192000000), - }; - -+static const struct mtk_fixed_factor top_early_divs[] = { -+ FACTOR(CLK_TOP_CLK13M, "clk13m", "clk26m", 1, 2), -+}; -+ - static const struct mtk_fixed_factor top_divs[] = { -- FACTOR(CLK_TOP_CLK13M, "clk13m", "clk26m", 1, -- 2), - FACTOR(CLK_TOP_F26M_CK_D2, "csw_f26m_ck_d2", "clk26m", 1, - 2), - FACTOR(CLK_TOP_SYSPLL_CK, "syspll_ck", "mainpll", 1, -@@ -1167,37 +1169,57 @@ static int clk_mt8183_apmixed_probe(struct platform_device *pdev) - return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); - } - -+static struct clk_onecell_data *top_clk_data; -+ -+static void clk_mt8183_top_init_early(struct device_node *node) -+{ -+ int i; -+ -+ top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK); -+ -+ for (i = 0; i < CLK_TOP_NR_CLK; i++) -+ top_clk_data->clks[i] = ERR_PTR(-EPROBE_DEFER); -+ -+ mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs), -+ top_clk_data); -+ -+ of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data); -+} -+ -+CLK_OF_DECLARE_DRIVER(mt8183_topckgen, "mediatek,mt8183-topckgen", -+ clk_mt8183_top_init_early); -+ - static int clk_mt8183_top_probe(struct platform_device *pdev) - { - struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - void __iomem *base; -- struct clk_onecell_data *clk_data; - struct device_node *node = pdev->dev.of_node; - - base = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(base)) - return PTR_ERR(base); - -- clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK); -- - mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), -- clk_data); -+ top_clk_data); -+ -+ mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs), -+ top_clk_data); - -- mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data); -+ mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data); - - mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), -- node, &mt8183_clk_lock, clk_data); -+ node, &mt8183_clk_lock, top_clk_data); - - mtk_clk_register_composites(top_aud_muxes, ARRAY_SIZE(top_aud_muxes), -- base, &mt8183_clk_lock, clk_data); -+ base, &mt8183_clk_lock, top_clk_data); - - mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs), -- base, &mt8183_clk_lock, clk_data); -+ base, &mt8183_clk_lock, top_clk_data); - - mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), -- clk_data); -+ top_clk_data); - -- return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); -+ return of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data); - } - - static int clk_mt8183_infra_probe(struct platform_device *pdev) -diff --git a/drivers/clk/meson/clk-mpll.c b/drivers/clk/meson/clk-mpll.c -index f76850d99e59..d3f42e086431 100644 ---- a/drivers/clk/meson/clk-mpll.c -+++ b/drivers/clk/meson/clk-mpll.c -@@ -119,9 +119,12 @@ static int mpll_set_rate(struct clk_hw *hw, - meson_parm_write(clk->map, &mpll->sdm, sdm); - meson_parm_write(clk->map, &mpll->sdm_en, 1); - -- /* Set additional fractional part enable if required */ -- if (MESON_PARM_APPLICABLE(&mpll->ssen)) -- meson_parm_write(clk->map, &mpll->ssen, 1); -+ /* Set spread spectrum if possible */ -+ if (MESON_PARM_APPLICABLE(&mpll->ssen)) { -+ unsigned int ss = -+ mpll->flags & CLK_MESON_MPLL_SPREAD_SPECTRUM ? 1 : 0; -+ meson_parm_write(clk->map, &mpll->ssen, ss); -+ } - - /* Set the integer divider part */ - meson_parm_write(clk->map, &mpll->n2, n2); -diff --git a/drivers/clk/meson/clk-mpll.h b/drivers/clk/meson/clk-mpll.h -index cf79340006dd..0f948430fed4 100644 ---- a/drivers/clk/meson/clk-mpll.h -+++ b/drivers/clk/meson/clk-mpll.h -@@ -23,6 +23,7 @@ struct meson_clk_mpll_data { - }; - - #define CLK_MESON_MPLL_ROUND_CLOSEST BIT(0) -+#define CLK_MESON_MPLL_SPREAD_SPECTRUM BIT(1) - - extern const struct clk_ops meson_clk_mpll_ro_ops; - extern const struct clk_ops meson_clk_mpll_ops; -diff --git a/drivers/clk/sprd/sc9860-clk.c b/drivers/clk/sprd/sc9860-clk.c -index 9980ab55271b..f76305b4bc8d 100644 ---- a/drivers/clk/sprd/sc9860-clk.c -+++ b/drivers/clk/sprd/sc9860-clk.c -@@ -2023,6 +2023,7 @@ static int sc9860_clk_probe(struct platform_device *pdev) - { - const struct of_device_id *match; - const struct sprd_clk_desc *desc; -+ int ret; - - match = of_match_node(sprd_sc9860_clk_ids, pdev->dev.of_node); - if (!match) { -@@ -2031,7 +2032,9 @@ static int sc9860_clk_probe(struct platform_device *pdev) - } - - desc = match->data; -- sprd_clk_regmap_init(pdev, desc); -+ ret = sprd_clk_regmap_init(pdev, desc); -+ if (ret) -+ return ret; - - return sprd_clk_probe(&pdev->dev, desc->hw_clks); - } -diff --git a/drivers/clk/tegra/clk-tegra210.c b/drivers/clk/tegra/clk-tegra210.c -index ac1d27a8c650..e5470a6bbf55 100644 ---- a/drivers/clk/tegra/clk-tegra210.c -+++ b/drivers/clk/tegra/clk-tegra210.c -@@ -2204,9 +2204,9 @@ static struct div_nmp pllu_nmp = { - }; - - static struct tegra_clk_pll_freq_table pll_u_freq_table[] = { -- { 12000000, 480000000, 40, 1, 0, 0 }, -- { 13000000, 480000000, 36, 1, 0, 0 }, /* actual: 468.0 MHz */ -- { 38400000, 480000000, 25, 2, 0, 0 }, -+ { 12000000, 480000000, 40, 1, 1, 0 }, -+ { 13000000, 480000000, 36, 1, 1, 0 }, /* actual: 468.0 MHz */ -+ { 38400000, 480000000, 25, 2, 1, 0 }, - { 0, 0, 0, 0, 0, 0 }, - }; - -@@ -3333,6 +3333,7 @@ static struct tegra_clk_init_table init_table[] __initdata = { - { TEGRA210_CLK_DFLL_REF, TEGRA210_CLK_PLL_P, 51000000, 1 }, - { TEGRA210_CLK_SBC4, TEGRA210_CLK_PLL_P, 12000000, 1 }, - { TEGRA210_CLK_PLL_RE_VCO, TEGRA210_CLK_CLK_MAX, 672000000, 1 }, -+ { TEGRA210_CLK_PLL_U_OUT1, TEGRA210_CLK_CLK_MAX, 48000000, 1 }, - { TEGRA210_CLK_XUSB_GATE, TEGRA210_CLK_CLK_MAX, 0, 1 }, - { TEGRA210_CLK_XUSB_SS_SRC, TEGRA210_CLK_PLL_U_480M, 120000000, 0 }, - { TEGRA210_CLK_XUSB_FS_SRC, TEGRA210_CLK_PLL_U_48M, 48000000, 0 }, -@@ -3357,7 +3358,6 @@ static struct tegra_clk_init_table init_table[] __initdata = { - { TEGRA210_CLK_PLL_DP, TEGRA210_CLK_CLK_MAX, 270000000, 0 }, - { TEGRA210_CLK_SOC_THERM, TEGRA210_CLK_PLL_P, 51000000, 0 }, - { TEGRA210_CLK_CCLK_G, TEGRA210_CLK_CLK_MAX, 0, 1 }, -- { TEGRA210_CLK_PLL_U_OUT1, TEGRA210_CLK_CLK_MAX, 48000000, 1 }, - { TEGRA210_CLK_PLL_U_OUT2, TEGRA210_CLK_CLK_MAX, 60000000, 1 }, - { TEGRA210_CLK_SPDIF_IN_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, - { TEGRA210_CLK_I2S0_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, -diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c -index e8eab16b154b..74cb299f5089 100644 ---- a/drivers/clocksource/exynos_mct.c -+++ b/drivers/clocksource/exynos_mct.c -@@ -206,7 +206,7 @@ static void exynos4_frc_resume(struct clocksource *cs) - - static struct clocksource mct_frc = { - .name = "mct-frc", -- .rating = 400, -+ .rating = 450, /* use value higher than ARM arch timer */ - .read = exynos4_frc_read, - .mask = CLOCKSOURCE_MASK(32), - .flags = CLOCK_SOURCE_IS_CONTINUOUS, -@@ -461,7 +461,7 @@ static int exynos4_mct_starting_cpu(unsigned int cpu) - evt->set_state_oneshot_stopped = set_state_shutdown; - evt->tick_resume = set_state_shutdown; - evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; -- evt->rating = 450; -+ evt->rating = 500; /* use value higher than ARM arch timer */ - - exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET); - -diff --git a/drivers/clocksource/timer-tegra20.c b/drivers/clocksource/timer-tegra20.c -index 1e7ece279730..462be34b41c4 100644 ---- a/drivers/clocksource/timer-tegra20.c -+++ b/drivers/clocksource/timer-tegra20.c -@@ -288,7 +288,7 @@ static int __init tegra_init_timer(struct device_node *np) - pr_err("%s: can't map IRQ for CPU%d\n", - __func__, cpu); - ret = -EINVAL; -- goto out; -+ goto out_irq; - } - - irq_set_status_flags(cpu_to->clkevt.irq, IRQ_NOAUTOEN); -@@ -298,7 +298,8 @@ static int __init tegra_init_timer(struct device_node *np) - if (ret) { - pr_err("%s: cannot setup irq %d for CPU%d\n", - __func__, cpu_to->clkevt.irq, cpu); -- ret = -EINVAL; -+ irq_dispose_mapping(cpu_to->clkevt.irq); -+ cpu_to->clkevt.irq = 0; - goto out_irq; - } - } -@@ -318,6 +319,8 @@ static int __init tegra_init_timer(struct device_node *np) - irq_dispose_mapping(cpu_to->clkevt.irq); - } - } -+ -+ to->of_base.base = timer_reg_base; - out: - timer_of_cleanup(to); - return ret; -diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c -index dced033875bf..6215b7dec2e2 100644 ---- a/drivers/cpufreq/cpufreq_ondemand.c -+++ b/drivers/cpufreq/cpufreq_ondemand.c -@@ -19,7 +19,11 @@ - - /* On-demand governor macros */ - #define DEF_FREQUENCY_UP_THRESHOLD (80) -+#ifdef CONFIG_ZEN_INTERACTIVE -+#define DEF_SAMPLING_DOWN_FACTOR (5) -+#else - #define DEF_SAMPLING_DOWN_FACTOR (1) -+#endif - #define MAX_SAMPLING_DOWN_FACTOR (100000) - #define MICRO_FREQUENCY_UP_THRESHOLD (95) - #define MICRO_FREQUENCY_MIN_SAMPLE_RATE (10000) -diff --git a/drivers/crypto/amcc/crypto4xx_alg.c b/drivers/crypto/amcc/crypto4xx_alg.c -index 49f3e0ce242c..cbfc607282f4 100644 ---- a/drivers/crypto/amcc/crypto4xx_alg.c -+++ b/drivers/crypto/amcc/crypto4xx_alg.c -@@ -67,12 +67,16 @@ static void set_dynamic_sa_command_1(struct dynamic_sa_ctl *sa, u32 cm, - } - - static inline int crypto4xx_crypt(struct skcipher_request *req, -- const unsigned int ivlen, bool decrypt) -+ const unsigned int ivlen, bool decrypt, -+ bool check_blocksize) - { - struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req); - struct crypto4xx_ctx *ctx = crypto_skcipher_ctx(cipher); - __le32 iv[AES_IV_SIZE]; - -+ if (check_blocksize && !IS_ALIGNED(req->cryptlen, AES_BLOCK_SIZE)) -+ return -EINVAL; -+ - if (ivlen) - crypto4xx_memcpy_to_le32(iv, req->iv, ivlen); - -@@ -81,24 +85,34 @@ static inline int crypto4xx_crypt(struct skcipher_request *req, - ctx->sa_len, 0, NULL); - } - --int crypto4xx_encrypt_noiv(struct skcipher_request *req) -+int crypto4xx_encrypt_noiv_block(struct skcipher_request *req) -+{ -+ return crypto4xx_crypt(req, 0, false, true); -+} -+ -+int crypto4xx_encrypt_iv_stream(struct skcipher_request *req) -+{ -+ return crypto4xx_crypt(req, AES_IV_SIZE, false, false); -+} -+ -+int crypto4xx_decrypt_noiv_block(struct skcipher_request *req) - { -- return crypto4xx_crypt(req, 0, false); -+ return crypto4xx_crypt(req, 0, true, true); - } - --int crypto4xx_encrypt_iv(struct skcipher_request *req) -+int crypto4xx_decrypt_iv_stream(struct skcipher_request *req) - { -- return crypto4xx_crypt(req, AES_IV_SIZE, false); -+ return crypto4xx_crypt(req, AES_IV_SIZE, true, false); - } - --int crypto4xx_decrypt_noiv(struct skcipher_request *req) -+int crypto4xx_encrypt_iv_block(struct skcipher_request *req) - { -- return crypto4xx_crypt(req, 0, true); -+ return crypto4xx_crypt(req, AES_IV_SIZE, false, true); - } - --int crypto4xx_decrypt_iv(struct skcipher_request *req) -+int crypto4xx_decrypt_iv_block(struct skcipher_request *req) - { -- return crypto4xx_crypt(req, AES_IV_SIZE, true); -+ return crypto4xx_crypt(req, AES_IV_SIZE, true, true); - } - - /** -@@ -269,8 +283,8 @@ crypto4xx_ctr_crypt(struct skcipher_request *req, bool encrypt) - return ret; - } - -- return encrypt ? crypto4xx_encrypt_iv(req) -- : crypto4xx_decrypt_iv(req); -+ return encrypt ? crypto4xx_encrypt_iv_stream(req) -+ : crypto4xx_decrypt_iv_stream(req); - } - - static int crypto4xx_sk_setup_fallback(struct crypto4xx_ctx *ctx, -diff --git a/drivers/crypto/amcc/crypto4xx_core.c b/drivers/crypto/amcc/crypto4xx_core.c -index 16d911aaa508..53e2ba9b0c02 100644 ---- a/drivers/crypto/amcc/crypto4xx_core.c -+++ b/drivers/crypto/amcc/crypto4xx_core.c -@@ -1210,8 +1210,8 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { - .max_keysize = AES_MAX_KEY_SIZE, - .ivsize = AES_IV_SIZE, - .setkey = crypto4xx_setkey_aes_cbc, -- .encrypt = crypto4xx_encrypt_iv, -- .decrypt = crypto4xx_decrypt_iv, -+ .encrypt = crypto4xx_encrypt_iv_block, -+ .decrypt = crypto4xx_decrypt_iv_block, - .init = crypto4xx_sk_init, - .exit = crypto4xx_sk_exit, - } }, -@@ -1222,7 +1222,7 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { - .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY, - .cra_flags = CRYPTO_ALG_ASYNC | - CRYPTO_ALG_KERN_DRIVER_ONLY, -- .cra_blocksize = AES_BLOCK_SIZE, -+ .cra_blocksize = 1, - .cra_ctxsize = sizeof(struct crypto4xx_ctx), - .cra_module = THIS_MODULE, - }, -@@ -1230,8 +1230,8 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { - .max_keysize = AES_MAX_KEY_SIZE, - .ivsize = AES_IV_SIZE, - .setkey = crypto4xx_setkey_aes_cfb, -- .encrypt = crypto4xx_encrypt_iv, -- .decrypt = crypto4xx_decrypt_iv, -+ .encrypt = crypto4xx_encrypt_iv_stream, -+ .decrypt = crypto4xx_decrypt_iv_stream, - .init = crypto4xx_sk_init, - .exit = crypto4xx_sk_exit, - } }, -@@ -1243,7 +1243,7 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { - .cra_flags = CRYPTO_ALG_NEED_FALLBACK | - CRYPTO_ALG_ASYNC | - CRYPTO_ALG_KERN_DRIVER_ONLY, -- .cra_blocksize = AES_BLOCK_SIZE, -+ .cra_blocksize = 1, - .cra_ctxsize = sizeof(struct crypto4xx_ctx), - .cra_module = THIS_MODULE, - }, -@@ -1263,7 +1263,7 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { - .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY, - .cra_flags = CRYPTO_ALG_ASYNC | - CRYPTO_ALG_KERN_DRIVER_ONLY, -- .cra_blocksize = AES_BLOCK_SIZE, -+ .cra_blocksize = 1, - .cra_ctxsize = sizeof(struct crypto4xx_ctx), - .cra_module = THIS_MODULE, - }, -@@ -1290,8 +1290,8 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { - .min_keysize = AES_MIN_KEY_SIZE, - .max_keysize = AES_MAX_KEY_SIZE, - .setkey = crypto4xx_setkey_aes_ecb, -- .encrypt = crypto4xx_encrypt_noiv, -- .decrypt = crypto4xx_decrypt_noiv, -+ .encrypt = crypto4xx_encrypt_noiv_block, -+ .decrypt = crypto4xx_decrypt_noiv_block, - .init = crypto4xx_sk_init, - .exit = crypto4xx_sk_exit, - } }, -@@ -1302,7 +1302,7 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { - .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY, - .cra_flags = CRYPTO_ALG_ASYNC | - CRYPTO_ALG_KERN_DRIVER_ONLY, -- .cra_blocksize = AES_BLOCK_SIZE, -+ .cra_blocksize = 1, - .cra_ctxsize = sizeof(struct crypto4xx_ctx), - .cra_module = THIS_MODULE, - }, -@@ -1310,8 +1310,8 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { - .max_keysize = AES_MAX_KEY_SIZE, - .ivsize = AES_IV_SIZE, - .setkey = crypto4xx_setkey_aes_ofb, -- .encrypt = crypto4xx_encrypt_iv, -- .decrypt = crypto4xx_decrypt_iv, -+ .encrypt = crypto4xx_encrypt_iv_stream, -+ .decrypt = crypto4xx_decrypt_iv_stream, - .init = crypto4xx_sk_init, - .exit = crypto4xx_sk_exit, - } }, -diff --git a/drivers/crypto/amcc/crypto4xx_core.h b/drivers/crypto/amcc/crypto4xx_core.h -index ca1c25c40c23..6b6841359190 100644 ---- a/drivers/crypto/amcc/crypto4xx_core.h -+++ b/drivers/crypto/amcc/crypto4xx_core.h -@@ -173,10 +173,12 @@ int crypto4xx_setkey_rfc3686(struct crypto_skcipher *cipher, - const u8 *key, unsigned int keylen); - int crypto4xx_encrypt_ctr(struct skcipher_request *req); - int crypto4xx_decrypt_ctr(struct skcipher_request *req); --int crypto4xx_encrypt_iv(struct skcipher_request *req); --int crypto4xx_decrypt_iv(struct skcipher_request *req); --int crypto4xx_encrypt_noiv(struct skcipher_request *req); --int crypto4xx_decrypt_noiv(struct skcipher_request *req); -+int crypto4xx_encrypt_iv_stream(struct skcipher_request *req); -+int crypto4xx_decrypt_iv_stream(struct skcipher_request *req); -+int crypto4xx_encrypt_iv_block(struct skcipher_request *req); -+int crypto4xx_decrypt_iv_block(struct skcipher_request *req); -+int crypto4xx_encrypt_noiv_block(struct skcipher_request *req); -+int crypto4xx_decrypt_noiv_block(struct skcipher_request *req); - int crypto4xx_rfc3686_encrypt(struct skcipher_request *req); - int crypto4xx_rfc3686_decrypt(struct skcipher_request *req); - int crypto4xx_sha1_alg_init(struct crypto_tfm *tfm); -diff --git a/drivers/crypto/amcc/crypto4xx_trng.c b/drivers/crypto/amcc/crypto4xx_trng.c -index 02a6bed3b062..f10a87e541ed 100644 ---- a/drivers/crypto/amcc/crypto4xx_trng.c -+++ b/drivers/crypto/amcc/crypto4xx_trng.c -@@ -108,7 +108,6 @@ void ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev) - return; - - err_out: -- of_node_put(trng); - iounmap(dev->trng_base); - kfree(rng); - dev->trng_base = NULL; -diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c -index c0ece44f303b..af9e473abdfd 100644 ---- a/drivers/crypto/caam/caamalg.c -+++ b/drivers/crypto/caam/caamalg.c -@@ -999,6 +999,7 @@ static void skcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err, - struct skcipher_request *req = context; - struct skcipher_edesc *edesc; - struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); -+ struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); - int ivsize = crypto_skcipher_ivsize(skcipher); - - #ifdef DEBUG -@@ -1023,9 +1024,9 @@ static void skcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err, - - /* - * The crypto API expects us to set the IV (req->iv) to the last -- * ciphertext block. This is used e.g. by the CTS mode. -+ * ciphertext block when running in CBC mode. - */ -- if (ivsize) -+ if ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == OP_ALG_AAI_CBC) - scatterwalk_map_and_copy(req->iv, req->dst, req->cryptlen - - ivsize, ivsize, 0); - -@@ -1106,6 +1107,7 @@ static void init_aead_job(struct aead_request *req, - if (unlikely(req->src != req->dst)) { - if (!edesc->mapped_dst_nents) { - dst_dma = 0; -+ out_options = 0; - } else if (edesc->mapped_dst_nents == 1) { - dst_dma = sg_dma_address(req->dst); - out_options = 0; -@@ -1842,9 +1844,9 @@ static int skcipher_decrypt(struct skcipher_request *req) - - /* - * The crypto API expects us to set the IV (req->iv) to the last -- * ciphertext block. -+ * ciphertext block when running in CBC mode. - */ -- if (ivsize) -+ if ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == OP_ALG_AAI_CBC) - scatterwalk_map_and_copy(req->iv, req->src, req->cryptlen - - ivsize, ivsize, 0); - -diff --git a/drivers/crypto/caam/caamalg_qi.c b/drivers/crypto/caam/caamalg_qi.c -index d290d6b41825..116cbc81fa8d 100644 ---- a/drivers/crypto/caam/caamalg_qi.c -+++ b/drivers/crypto/caam/caamalg_qi.c -@@ -1109,7 +1109,7 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req, - dma_to_qm_sg_one_ext(&fd_sgt[0], qm_sg_dma + - (1 + !!ivsize) * sizeof(*sg_table), - out_len, 0); -- } else if (mapped_dst_nents == 1) { -+ } else if (mapped_dst_nents <= 1) { - dma_to_qm_sg_one(&fd_sgt[0], sg_dma_address(req->dst), out_len, - 0); - } else { -diff --git a/drivers/crypto/caam/caamalg_qi2.c b/drivers/crypto/caam/caamalg_qi2.c -index 2b2980a8a9b9..b949944c8e55 100644 ---- a/drivers/crypto/caam/caamalg_qi2.c -+++ b/drivers/crypto/caam/caamalg_qi2.c -@@ -559,6 +559,14 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req, - dpaa2_fl_set_addr(out_fle, qm_sg_dma + - (1 + !!ivsize) * sizeof(*sg_table)); - } -+ } else if (!mapped_dst_nents) { -+ /* -+ * crypto engine requires the output entry to be present when -+ * "frame list" FD is used. -+ * Since engine does not support FMT=2'b11 (unused entry type), -+ * leaving out_fle zeroized is the best option. -+ */ -+ goto skip_out_fle; - } else if (mapped_dst_nents == 1) { - dpaa2_fl_set_format(out_fle, dpaa2_fl_single); - dpaa2_fl_set_addr(out_fle, sg_dma_address(req->dst)); -@@ -570,6 +578,7 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req, - - dpaa2_fl_set_len(out_fle, out_len); - -+skip_out_fle: - return edesc; - } - -diff --git a/drivers/crypto/caam/qi.c b/drivers/crypto/caam/qi.c -index 9f08f84cca59..2d9b0485141f 100644 ---- a/drivers/crypto/caam/qi.c -+++ b/drivers/crypto/caam/qi.c -@@ -18,6 +18,7 @@ - #include "desc_constr.h" - - #define PREHDR_RSLS_SHIFT 31 -+#define PREHDR_ABS BIT(25) - - /* - * Use a reasonable backlog of frames (per CPU) as congestion threshold, -@@ -346,6 +347,7 @@ int caam_drv_ctx_update(struct caam_drv_ctx *drv_ctx, u32 *sh_desc) - */ - drv_ctx->prehdr[0] = cpu_to_caam32((1 << PREHDR_RSLS_SHIFT) | - num_words); -+ drv_ctx->prehdr[1] = cpu_to_caam32(PREHDR_ABS); - memcpy(drv_ctx->sh_desc, sh_desc, desc_bytes(sh_desc)); - dma_sync_single_for_device(qidev, drv_ctx->context_a, - sizeof(drv_ctx->sh_desc) + -@@ -401,6 +403,7 @@ struct caam_drv_ctx *caam_drv_ctx_init(struct device *qidev, - */ - drv_ctx->prehdr[0] = cpu_to_caam32((1 << PREHDR_RSLS_SHIFT) | - num_words); -+ drv_ctx->prehdr[1] = cpu_to_caam32(PREHDR_ABS); - memcpy(drv_ctx->sh_desc, sh_desc, desc_bytes(sh_desc)); - size = sizeof(drv_ctx->prehdr) + sizeof(drv_ctx->sh_desc); - hwdesc = dma_map_single(qidev, drv_ctx->prehdr, size, -diff --git a/drivers/crypto/ccp/ccp-crypto-aes-galois.c b/drivers/crypto/ccp/ccp-crypto-aes-galois.c -index f9fec2ddf56a..94c1ad7eeddf 100644 ---- a/drivers/crypto/ccp/ccp-crypto-aes-galois.c -+++ b/drivers/crypto/ccp/ccp-crypto-aes-galois.c -@@ -58,6 +58,19 @@ static int ccp_aes_gcm_setkey(struct crypto_aead *tfm, const u8 *key, - static int ccp_aes_gcm_setauthsize(struct crypto_aead *tfm, - unsigned int authsize) - { -+ switch (authsize) { -+ case 16: -+ case 15: -+ case 14: -+ case 13: -+ case 12: -+ case 8: -+ case 4: -+ break; -+ default: -+ return -EINVAL; -+ } -+ - return 0; - } - -@@ -104,6 +117,7 @@ static int ccp_aes_gcm_crypt(struct aead_request *req, bool encrypt) - memset(&rctx->cmd, 0, sizeof(rctx->cmd)); - INIT_LIST_HEAD(&rctx->cmd.entry); - rctx->cmd.engine = CCP_ENGINE_AES; -+ rctx->cmd.u.aes.authsize = crypto_aead_authsize(tfm); - rctx->cmd.u.aes.type = ctx->u.aes.type; - rctx->cmd.u.aes.mode = ctx->u.aes.mode; - rctx->cmd.u.aes.action = encrypt; -diff --git a/drivers/crypto/ccp/ccp-dev.c b/drivers/crypto/ccp/ccp-dev.c -index cc3e96c4f5fb..f79eede71c62 100644 ---- a/drivers/crypto/ccp/ccp-dev.c -+++ b/drivers/crypto/ccp/ccp-dev.c -@@ -32,56 +32,62 @@ struct ccp_tasklet_data { - }; - - /* Human-readable error strings */ -+#define CCP_MAX_ERROR_CODE 64 - static char *ccp_error_codes[] = { - "", -- "ERR 01: ILLEGAL_ENGINE", -- "ERR 02: ILLEGAL_KEY_ID", -- "ERR 03: ILLEGAL_FUNCTION_TYPE", -- "ERR 04: ILLEGAL_FUNCTION_MODE", -- "ERR 05: ILLEGAL_FUNCTION_ENCRYPT", -- "ERR 06: ILLEGAL_FUNCTION_SIZE", -- "ERR 07: Zlib_MISSING_INIT_EOM", -- "ERR 08: ILLEGAL_FUNCTION_RSVD", -- "ERR 09: ILLEGAL_BUFFER_LENGTH", -- "ERR 10: VLSB_FAULT", -- "ERR 11: ILLEGAL_MEM_ADDR", -- "ERR 12: ILLEGAL_MEM_SEL", -- "ERR 13: ILLEGAL_CONTEXT_ID", -- "ERR 14: ILLEGAL_KEY_ADDR", -- "ERR 15: 0xF Reserved", -- "ERR 16: Zlib_ILLEGAL_MULTI_QUEUE", -- "ERR 17: Zlib_ILLEGAL_JOBID_CHANGE", -- "ERR 18: CMD_TIMEOUT", -- "ERR 19: IDMA0_AXI_SLVERR", -- "ERR 20: IDMA0_AXI_DECERR", -- "ERR 21: 0x15 Reserved", -- "ERR 22: IDMA1_AXI_SLAVE_FAULT", -- "ERR 23: IDMA1_AIXI_DECERR", -- "ERR 24: 0x18 Reserved", -- "ERR 25: ZLIBVHB_AXI_SLVERR", -- "ERR 26: ZLIBVHB_AXI_DECERR", -- "ERR 27: 0x1B Reserved", -- "ERR 27: ZLIB_UNEXPECTED_EOM", -- "ERR 27: ZLIB_EXTRA_DATA", -- "ERR 30: ZLIB_BTYPE", -- "ERR 31: ZLIB_UNDEFINED_SYMBOL", -- "ERR 32: ZLIB_UNDEFINED_DISTANCE_S", -- "ERR 33: ZLIB_CODE_LENGTH_SYMBOL", -- "ERR 34: ZLIB _VHB_ILLEGAL_FETCH", -- "ERR 35: ZLIB_UNCOMPRESSED_LEN", -- "ERR 36: ZLIB_LIMIT_REACHED", -- "ERR 37: ZLIB_CHECKSUM_MISMATCH0", -- "ERR 38: ODMA0_AXI_SLVERR", -- "ERR 39: ODMA0_AXI_DECERR", -- "ERR 40: 0x28 Reserved", -- "ERR 41: ODMA1_AXI_SLVERR", -- "ERR 42: ODMA1_AXI_DECERR", -- "ERR 43: LSB_PARITY_ERR", -+ "ILLEGAL_ENGINE", -+ "ILLEGAL_KEY_ID", -+ "ILLEGAL_FUNCTION_TYPE", -+ "ILLEGAL_FUNCTION_MODE", -+ "ILLEGAL_FUNCTION_ENCRYPT", -+ "ILLEGAL_FUNCTION_SIZE", -+ "Zlib_MISSING_INIT_EOM", -+ "ILLEGAL_FUNCTION_RSVD", -+ "ILLEGAL_BUFFER_LENGTH", -+ "VLSB_FAULT", -+ "ILLEGAL_MEM_ADDR", -+ "ILLEGAL_MEM_SEL", -+ "ILLEGAL_CONTEXT_ID", -+ "ILLEGAL_KEY_ADDR", -+ "0xF Reserved", -+ "Zlib_ILLEGAL_MULTI_QUEUE", -+ "Zlib_ILLEGAL_JOBID_CHANGE", -+ "CMD_TIMEOUT", -+ "IDMA0_AXI_SLVERR", -+ "IDMA0_AXI_DECERR", -+ "0x15 Reserved", -+ "IDMA1_AXI_SLAVE_FAULT", -+ "IDMA1_AIXI_DECERR", -+ "0x18 Reserved", -+ "ZLIBVHB_AXI_SLVERR", -+ "ZLIBVHB_AXI_DECERR", -+ "0x1B Reserved", -+ "ZLIB_UNEXPECTED_EOM", -+ "ZLIB_EXTRA_DATA", -+ "ZLIB_BTYPE", -+ "ZLIB_UNDEFINED_SYMBOL", -+ "ZLIB_UNDEFINED_DISTANCE_S", -+ "ZLIB_CODE_LENGTH_SYMBOL", -+ "ZLIB _VHB_ILLEGAL_FETCH", -+ "ZLIB_UNCOMPRESSED_LEN", -+ "ZLIB_LIMIT_REACHED", -+ "ZLIB_CHECKSUM_MISMATCH0", -+ "ODMA0_AXI_SLVERR", -+ "ODMA0_AXI_DECERR", -+ "0x28 Reserved", -+ "ODMA1_AXI_SLVERR", -+ "ODMA1_AXI_DECERR", - }; - --void ccp_log_error(struct ccp_device *d, int e) -+void ccp_log_error(struct ccp_device *d, unsigned int e) - { -- dev_err(d->dev, "CCP error: %s (0x%x)\n", ccp_error_codes[e], e); -+ if (WARN_ON(e >= CCP_MAX_ERROR_CODE)) -+ return; -+ -+ if (e < ARRAY_SIZE(ccp_error_codes)) -+ dev_err(d->dev, "CCP error %d: %s\n", e, ccp_error_codes[e]); -+ else -+ dev_err(d->dev, "CCP error %d: Unknown Error\n", e); - } - - /* List of CCPs, CCP count, read-write access lock, and access functions -diff --git a/drivers/crypto/ccp/ccp-dev.h b/drivers/crypto/ccp/ccp-dev.h -index 90523a069bff..5e624920fd99 100644 ---- a/drivers/crypto/ccp/ccp-dev.h -+++ b/drivers/crypto/ccp/ccp-dev.h -@@ -629,7 +629,7 @@ struct ccp5_desc { - void ccp_add_device(struct ccp_device *ccp); - void ccp_del_device(struct ccp_device *ccp); - --extern void ccp_log_error(struct ccp_device *, int); -+extern void ccp_log_error(struct ccp_device *, unsigned int); - - struct ccp_device *ccp_alloc_struct(struct sp_device *sp); - bool ccp_queues_suspended(struct ccp_device *ccp); -diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c -index db8de89d990f..a13e8a362316 100644 ---- a/drivers/crypto/ccp/ccp-ops.c -+++ b/drivers/crypto/ccp/ccp-ops.c -@@ -622,6 +622,8 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, - - unsigned long long *final; - unsigned int dm_offset; -+ unsigned int authsize; -+ unsigned int jobid; - unsigned int ilen; - bool in_place = true; /* Default value */ - int ret; -@@ -642,6 +644,21 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, - if (!aes->key) /* Gotta have a key SGL */ - return -EINVAL; - -+ /* Zero defaults to 16 bytes, the maximum size */ -+ authsize = aes->authsize ? aes->authsize : AES_BLOCK_SIZE; -+ switch (authsize) { -+ case 16: -+ case 15: -+ case 14: -+ case 13: -+ case 12: -+ case 8: -+ case 4: -+ break; -+ default: -+ return -EINVAL; -+ } -+ - /* First, decompose the source buffer into AAD & PT, - * and the destination buffer into AAD, CT & tag, or - * the input into CT & tag. -@@ -656,13 +673,15 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, - p_tag = scatterwalk_ffwd(sg_tag, p_outp, ilen); - } else { - /* Input length for decryption includes tag */ -- ilen = aes->src_len - AES_BLOCK_SIZE; -+ ilen = aes->src_len - authsize; - p_tag = scatterwalk_ffwd(sg_tag, p_inp, ilen); - } - -+ jobid = CCP_NEW_JOBID(cmd_q->ccp); -+ - memset(&op, 0, sizeof(op)); - op.cmd_q = cmd_q; -- op.jobid = CCP_NEW_JOBID(cmd_q->ccp); -+ op.jobid = jobid; - op.sb_key = cmd_q->sb_key; /* Pre-allocated */ - op.sb_ctx = cmd_q->sb_ctx; /* Pre-allocated */ - op.init = 1; -@@ -763,8 +782,7 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, - while (src.sg_wa.bytes_left) { - ccp_prepare_data(&src, &dst, &op, AES_BLOCK_SIZE, true); - if (!src.sg_wa.bytes_left) { -- unsigned int nbytes = aes->src_len -- % AES_BLOCK_SIZE; -+ unsigned int nbytes = ilen % AES_BLOCK_SIZE; - - if (nbytes) { - op.eom = 1; -@@ -813,6 +831,13 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, - final[0] = cpu_to_be64(aes->aad_len * 8); - final[1] = cpu_to_be64(ilen * 8); - -+ memset(&op, 0, sizeof(op)); -+ op.cmd_q = cmd_q; -+ op.jobid = jobid; -+ op.sb_key = cmd_q->sb_key; /* Pre-allocated */ -+ op.sb_ctx = cmd_q->sb_ctx; /* Pre-allocated */ -+ op.init = 1; -+ op.u.aes.type = aes->type; - op.u.aes.mode = CCP_AES_MODE_GHASH; - op.u.aes.action = CCP_AES_GHASHFINAL; - op.src.type = CCP_MEMTYPE_SYSTEM; -@@ -829,18 +854,19 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, - - if (aes->action == CCP_AES_ACTION_ENCRYPT) { - /* Put the ciphered tag after the ciphertext. */ -- ccp_get_dm_area(&final_wa, 0, p_tag, 0, AES_BLOCK_SIZE); -+ ccp_get_dm_area(&final_wa, 0, p_tag, 0, authsize); - } else { - /* Does this ciphered tag match the input? */ -- ret = ccp_init_dm_workarea(&tag, cmd_q, AES_BLOCK_SIZE, -+ ret = ccp_init_dm_workarea(&tag, cmd_q, authsize, - DMA_BIDIRECTIONAL); - if (ret) - goto e_tag; -- ret = ccp_set_dm_area(&tag, 0, p_tag, 0, AES_BLOCK_SIZE); -+ ret = ccp_set_dm_area(&tag, 0, p_tag, 0, authsize); - if (ret) - goto e_tag; - -- ret = memcmp(tag.address, final_wa.address, AES_BLOCK_SIZE); -+ ret = crypto_memneq(tag.address, final_wa.address, -+ authsize) ? -EBADMSG : 0; - ccp_dm_free(&tag); - } - -@@ -848,11 +874,11 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, - ccp_dm_free(&final_wa); - - e_dst: -- if (aes->src_len && !in_place) -+ if (ilen > 0 && !in_place) - ccp_free_data(&dst, cmd_q); - - e_src: -- if (aes->src_len) -+ if (ilen > 0) - ccp_free_data(&src, cmd_q); - - e_aad: -diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c -index de5a8ca70d3d..6b17d179ef8a 100644 ---- a/drivers/crypto/ccp/psp-dev.c -+++ b/drivers/crypto/ccp/psp-dev.c -@@ -24,10 +24,6 @@ - #include "sp-dev.h" - #include "psp-dev.h" - --#define SEV_VERSION_GREATER_OR_EQUAL(_maj, _min) \ -- ((psp_master->api_major) >= _maj && \ -- (psp_master->api_minor) >= _min) -- - #define DEVICE_NAME "sev" - #define SEV_FW_FILE "amd/sev.fw" - #define SEV_FW_NAME_SIZE 64 -@@ -47,6 +43,15 @@ MODULE_PARM_DESC(psp_probe_timeout, " default timeout value, in seconds, during - static bool psp_dead; - static int psp_timeout; - -+static inline bool sev_version_greater_or_equal(u8 maj, u8 min) -+{ -+ if (psp_master->api_major > maj) -+ return true; -+ if (psp_master->api_major == maj && psp_master->api_minor >= min) -+ return true; -+ return false; -+} -+ - static struct psp_device *psp_alloc_struct(struct sp_device *sp) - { - struct device *dev = sp->dev; -@@ -588,7 +593,7 @@ static int sev_ioctl_do_get_id2(struct sev_issue_cmd *argp) - int ret; - - /* SEV GET_ID is available from SEV API v0.16 and up */ -- if (!SEV_VERSION_GREATER_OR_EQUAL(0, 16)) -+ if (!sev_version_greater_or_equal(0, 16)) - return -ENOTSUPP; - - if (copy_from_user(&input, (void __user *)argp->data, sizeof(input))) -@@ -651,7 +656,7 @@ static int sev_ioctl_do_get_id(struct sev_issue_cmd *argp) - int ret; - - /* SEV GET_ID available from SEV API v0.16 and up */ -- if (!SEV_VERSION_GREATER_OR_EQUAL(0, 16)) -+ if (!sev_version_greater_or_equal(0, 16)) - return -ENOTSUPP; - - /* SEV FW expects the buffer it fills with the ID to be -@@ -1053,7 +1058,7 @@ void psp_pci_init(void) - psp_master->sev_state = SEV_STATE_UNINIT; - } - -- if (SEV_VERSION_GREATER_OR_EQUAL(0, 15) && -+ if (sev_version_greater_or_equal(0, 15) && - sev_update_firmware(psp_master->dev) == 0) - sev_get_api_version(); - -diff --git a/drivers/crypto/inside-secure/safexcel_cipher.c b/drivers/crypto/inside-secure/safexcel_cipher.c -index de4be10b172f..ccacdcf07ffc 100644 ---- a/drivers/crypto/inside-secure/safexcel_cipher.c -+++ b/drivers/crypto/inside-secure/safexcel_cipher.c -@@ -51,6 +51,8 @@ struct safexcel_cipher_ctx { - - struct safexcel_cipher_req { - enum safexcel_cipher_direction direction; -+ /* Number of result descriptors associated to the request */ -+ unsigned int rdescs; - bool needs_inv; - }; - -@@ -333,7 +335,10 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int rin - - *ret = 0; - -- do { -+ if (unlikely(!sreq->rdescs)) -+ return 0; -+ -+ while (sreq->rdescs--) { - rdesc = safexcel_ring_next_rptr(priv, &priv->ring[ring].rdr); - if (IS_ERR(rdesc)) { - dev_err(priv->dev, -@@ -346,7 +351,7 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int rin - *ret = safexcel_rdesc_check_errors(priv, rdesc); - - ndesc++; -- } while (!rdesc->last_seg); -+ } - - safexcel_complete(priv, ring); - -@@ -501,6 +506,7 @@ static int safexcel_send_req(struct crypto_async_request *base, int ring, - static int safexcel_handle_inv_result(struct safexcel_crypto_priv *priv, - int ring, - struct crypto_async_request *base, -+ struct safexcel_cipher_req *sreq, - bool *should_complete, int *ret) - { - struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(base->tfm); -@@ -509,7 +515,10 @@ static int safexcel_handle_inv_result(struct safexcel_crypto_priv *priv, - - *ret = 0; - -- do { -+ if (unlikely(!sreq->rdescs)) -+ return 0; -+ -+ while (sreq->rdescs--) { - rdesc = safexcel_ring_next_rptr(priv, &priv->ring[ring].rdr); - if (IS_ERR(rdesc)) { - dev_err(priv->dev, -@@ -522,7 +531,7 @@ static int safexcel_handle_inv_result(struct safexcel_crypto_priv *priv, - *ret = safexcel_rdesc_check_errors(priv, rdesc); - - ndesc++; -- } while (!rdesc->last_seg); -+ } - - safexcel_complete(priv, ring); - -@@ -564,7 +573,7 @@ static int safexcel_skcipher_handle_result(struct safexcel_crypto_priv *priv, - - if (sreq->needs_inv) { - sreq->needs_inv = false; -- err = safexcel_handle_inv_result(priv, ring, async, -+ err = safexcel_handle_inv_result(priv, ring, async, sreq, - should_complete, ret); - } else { - err = safexcel_handle_req_result(priv, ring, async, req->src, -@@ -587,7 +596,7 @@ static int safexcel_aead_handle_result(struct safexcel_crypto_priv *priv, - - if (sreq->needs_inv) { - sreq->needs_inv = false; -- err = safexcel_handle_inv_result(priv, ring, async, -+ err = safexcel_handle_inv_result(priv, ring, async, sreq, - should_complete, ret); - } else { - err = safexcel_handle_req_result(priv, ring, async, req->src, -@@ -633,6 +642,8 @@ static int safexcel_skcipher_send(struct crypto_async_request *async, int ring, - ret = safexcel_send_req(async, ring, sreq, req->src, - req->dst, req->cryptlen, 0, 0, req->iv, - commands, results); -+ -+ sreq->rdescs = *results; - return ret; - } - -@@ -655,6 +666,7 @@ static int safexcel_aead_send(struct crypto_async_request *async, int ring, - req->cryptlen, req->assoclen, - crypto_aead_authsize(tfm), req->iv, - commands, results); -+ sreq->rdescs = *results; - return ret; - } - -diff --git a/drivers/crypto/nx/nx-842-powernv.c b/drivers/crypto/nx/nx-842-powernv.c -index 4acbc47973e9..e78ff5c65ed6 100644 ---- a/drivers/crypto/nx/nx-842-powernv.c -+++ b/drivers/crypto/nx/nx-842-powernv.c -@@ -27,8 +27,6 @@ MODULE_ALIAS_CRYPTO("842-nx"); - #define WORKMEM_ALIGN (CRB_ALIGN) - #define CSB_WAIT_MAX (5000) /* ms */ - #define VAS_RETRIES (10) --/* # of requests allowed per RxFIFO at a time. 0 for unlimited */ --#define MAX_CREDITS_PER_RXFIFO (1024) - - struct nx842_workmem { - /* Below fields must be properly aligned */ -@@ -812,7 +810,11 @@ static int __init vas_cfg_coproc_info(struct device_node *dn, int chip_id, - rxattr.lnotify_lpid = lpid; - rxattr.lnotify_pid = pid; - rxattr.lnotify_tid = tid; -- rxattr.wcreds_max = MAX_CREDITS_PER_RXFIFO; -+ /* -+ * Maximum RX window credits can not be more than #CRBs in -+ * RxFIFO. Otherwise, can get checkstop if RxFIFO overruns. -+ */ -+ rxattr.wcreds_max = fifo_size / CRB_SIZE; - - /* - * Open a VAS receice window which is used to configure RxFIFO -diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c -index fbc7bf9d7380..710e09e28227 100644 ---- a/drivers/crypto/talitos.c -+++ b/drivers/crypto/talitos.c -@@ -321,6 +321,21 @@ int talitos_submit(struct device *dev, int ch, struct talitos_desc *desc, - } - EXPORT_SYMBOL(talitos_submit); - -+static __be32 get_request_hdr(struct talitos_request *request, bool is_sec1) -+{ -+ struct talitos_edesc *edesc; -+ -+ if (!is_sec1) -+ return request->desc->hdr; -+ -+ if (!request->desc->next_desc) -+ return request->desc->hdr1; -+ -+ edesc = container_of(request->desc, struct talitos_edesc, desc); -+ -+ return ((struct talitos_desc *)(edesc->buf + edesc->dma_len))->hdr1; -+} -+ - /* - * process what was done, notify callback of error if not - */ -@@ -342,12 +357,7 @@ static void flush_channel(struct device *dev, int ch, int error, int reset_ch) - - /* descriptors with their done bits set don't get the error */ - rmb(); -- if (!is_sec1) -- hdr = request->desc->hdr; -- else if (request->desc->next_desc) -- hdr = (request->desc + 1)->hdr1; -- else -- hdr = request->desc->hdr1; -+ hdr = get_request_hdr(request, is_sec1); - - if ((hdr & DESC_HDR_DONE) == DESC_HDR_DONE) - status = 0; -@@ -477,8 +487,14 @@ static u32 current_desc_hdr(struct device *dev, int ch) - } - } - -- if (priv->chan[ch].fifo[iter].desc->next_desc == cur_desc) -- return (priv->chan[ch].fifo[iter].desc + 1)->hdr; -+ if (priv->chan[ch].fifo[iter].desc->next_desc == cur_desc) { -+ struct talitos_edesc *edesc; -+ -+ edesc = container_of(priv->chan[ch].fifo[iter].desc, -+ struct talitos_edesc, desc); -+ return ((struct talitos_desc *) -+ (edesc->buf + edesc->dma_len))->hdr; -+ } - - return priv->chan[ch].fifo[iter].desc->hdr; - } -@@ -948,36 +964,6 @@ static int aead_des3_setkey(struct crypto_aead *authenc, - goto out; - } - --/* -- * talitos_edesc - s/w-extended descriptor -- * @src_nents: number of segments in input scatterlist -- * @dst_nents: number of segments in output scatterlist -- * @icv_ool: whether ICV is out-of-line -- * @iv_dma: dma address of iv for checking continuity and link table -- * @dma_len: length of dma mapped link_tbl space -- * @dma_link_tbl: bus physical address of link_tbl/buf -- * @desc: h/w descriptor -- * @link_tbl: input and output h/w link tables (if {src,dst}_nents > 1) (SEC2) -- * @buf: input and output buffeur (if {src,dst}_nents > 1) (SEC1) -- * -- * if decrypting (with authcheck), or either one of src_nents or dst_nents -- * is greater than 1, an integrity check value is concatenated to the end -- * of link_tbl data -- */ --struct talitos_edesc { -- int src_nents; -- int dst_nents; -- bool icv_ool; -- dma_addr_t iv_dma; -- int dma_len; -- dma_addr_t dma_link_tbl; -- struct talitos_desc desc; -- union { -- struct talitos_ptr link_tbl[0]; -- u8 buf[0]; -- }; --}; -- - static void talitos_sg_unmap(struct device *dev, - struct talitos_edesc *edesc, - struct scatterlist *src, -@@ -1050,7 +1036,6 @@ static void ipsec_esp_encrypt_done(struct device *dev, - unsigned int authsize = crypto_aead_authsize(authenc); - unsigned int ivsize = crypto_aead_ivsize(authenc); - struct talitos_edesc *edesc; -- struct scatterlist *sg; - void *icvdata; - - edesc = container_of(desc, struct talitos_edesc, desc); -@@ -1064,9 +1049,8 @@ static void ipsec_esp_encrypt_done(struct device *dev, - else - icvdata = &edesc->link_tbl[edesc->src_nents + - edesc->dst_nents + 2]; -- sg = sg_last(areq->dst, edesc->dst_nents); -- memcpy((char *)sg_virt(sg) + sg->length - authsize, -- icvdata, authsize); -+ sg_pcopy_from_buffer(areq->dst, edesc->dst_nents ? : 1, icvdata, -+ authsize, areq->assoclen + areq->cryptlen); - } - - dma_unmap_single(dev, edesc->iv_dma, ivsize, DMA_TO_DEVICE); -@@ -1084,7 +1068,6 @@ static void ipsec_esp_decrypt_swauth_done(struct device *dev, - struct crypto_aead *authenc = crypto_aead_reqtfm(req); - unsigned int authsize = crypto_aead_authsize(authenc); - struct talitos_edesc *edesc; -- struct scatterlist *sg; - char *oicv, *icv; - struct talitos_private *priv = dev_get_drvdata(dev); - bool is_sec1 = has_ftr_sec1(priv); -@@ -1094,9 +1077,18 @@ static void ipsec_esp_decrypt_swauth_done(struct device *dev, - ipsec_esp_unmap(dev, edesc, req); - - if (!err) { -+ char icvdata[SHA512_DIGEST_SIZE]; -+ int nents = edesc->dst_nents ? : 1; -+ unsigned int len = req->assoclen + req->cryptlen; -+ - /* auth check */ -- sg = sg_last(req->dst, edesc->dst_nents ? : 1); -- icv = (char *)sg_virt(sg) + sg->length - authsize; -+ if (nents > 1) { -+ sg_pcopy_to_buffer(req->dst, nents, icvdata, authsize, -+ len - authsize); -+ icv = icvdata; -+ } else { -+ icv = (char *)sg_virt(req->dst) + len - authsize; -+ } - - if (edesc->dma_len) { - if (is_sec1) -@@ -1466,15 +1458,11 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev, - edesc->dst_nents = dst_nents; - edesc->iv_dma = iv_dma; - edesc->dma_len = dma_len; -- if (dma_len) { -- void *addr = &edesc->link_tbl[0]; -- -- if (is_sec1 && !dst) -- addr += sizeof(struct talitos_desc); -- edesc->dma_link_tbl = dma_map_single(dev, addr, -+ if (dma_len) -+ edesc->dma_link_tbl = dma_map_single(dev, &edesc->link_tbl[0], - edesc->dma_len, - DMA_BIDIRECTIONAL); -- } -+ - return edesc; - } - -@@ -1516,7 +1504,6 @@ static int aead_decrypt(struct aead_request *req) - struct talitos_ctx *ctx = crypto_aead_ctx(authenc); - struct talitos_private *priv = dev_get_drvdata(ctx->dev); - struct talitos_edesc *edesc; -- struct scatterlist *sg; - void *icvdata; - - req->cryptlen -= authsize; -@@ -1550,9 +1537,8 @@ static int aead_decrypt(struct aead_request *req) - else - icvdata = &edesc->link_tbl[0]; - -- sg = sg_last(req->src, edesc->src_nents ? : 1); -- -- memcpy(icvdata, (char *)sg_virt(sg) + sg->length - authsize, authsize); -+ sg_pcopy_to_buffer(req->src, edesc->src_nents ? : 1, icvdata, authsize, -+ req->assoclen + req->cryptlen - authsize); - - return ipsec_esp(edesc, req, ipsec_esp_decrypt_swauth_done); - } -@@ -1624,11 +1610,15 @@ static void ablkcipher_done(struct device *dev, - int err) - { - struct ablkcipher_request *areq = context; -+ struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq); -+ struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher); -+ unsigned int ivsize = crypto_ablkcipher_ivsize(cipher); - struct talitos_edesc *edesc; - - edesc = container_of(desc, struct talitos_edesc, desc); - - common_nonsnoop_unmap(dev, edesc, areq); -+ memcpy(areq->info, ctx->iv, ivsize); - - kfree(edesc); - -@@ -1759,14 +1749,16 @@ static void common_nonsnoop_hash_unmap(struct device *dev, - struct talitos_private *priv = dev_get_drvdata(dev); - bool is_sec1 = has_ftr_sec1(priv); - struct talitos_desc *desc = &edesc->desc; -- struct talitos_desc *desc2 = desc + 1; -+ struct talitos_desc *desc2 = (struct talitos_desc *) -+ (edesc->buf + edesc->dma_len); - - unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE); - if (desc->next_desc && - desc->ptr[5].ptr != desc2->ptr[5].ptr) - unmap_single_talitos_ptr(dev, &desc2->ptr[5], DMA_FROM_DEVICE); - -- talitos_sg_unmap(dev, edesc, req_ctx->psrc, NULL, 0, 0); -+ if (req_ctx->psrc) -+ talitos_sg_unmap(dev, edesc, req_ctx->psrc, NULL, 0, 0); - - /* When using hashctx-in, must unmap it. */ - if (from_talitos_ptr_len(&edesc->desc.ptr[1], is_sec1)) -@@ -1833,7 +1825,6 @@ static void talitos_handle_buggy_hash(struct talitos_ctx *ctx, - - static int common_nonsnoop_hash(struct talitos_edesc *edesc, - struct ahash_request *areq, unsigned int length, -- unsigned int offset, - void (*callback) (struct device *dev, - struct talitos_desc *desc, - void *context, int error)) -@@ -1872,9 +1863,7 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, - - sg_count = edesc->src_nents ?: 1; - if (is_sec1 && sg_count > 1) -- sg_pcopy_to_buffer(req_ctx->psrc, sg_count, -- edesc->buf + sizeof(struct talitos_desc), -- length, req_ctx->nbuf); -+ sg_copy_to_buffer(req_ctx->psrc, sg_count, edesc->buf, length); - else if (length) - sg_count = dma_map_sg(dev, req_ctx->psrc, sg_count, - DMA_TO_DEVICE); -@@ -1887,7 +1876,7 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, - DMA_TO_DEVICE); - } else { - sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc, -- &desc->ptr[3], sg_count, offset, 0); -+ &desc->ptr[3], sg_count, 0, 0); - if (sg_count > 1) - sync_needed = true; - } -@@ -1911,7 +1900,8 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, - talitos_handle_buggy_hash(ctx, edesc, &desc->ptr[3]); - - if (is_sec1 && req_ctx->nbuf && length) { -- struct talitos_desc *desc2 = desc + 1; -+ struct talitos_desc *desc2 = (struct talitos_desc *) -+ (edesc->buf + edesc->dma_len); - dma_addr_t next_desc; - - memset(desc2, 0, sizeof(*desc2)); -@@ -1932,7 +1922,7 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, - DMA_TO_DEVICE); - copy_talitos_ptr(&desc2->ptr[2], &desc->ptr[2], is_sec1); - sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc, -- &desc2->ptr[3], sg_count, offset, 0); -+ &desc2->ptr[3], sg_count, 0, 0); - if (sg_count > 1) - sync_needed = true; - copy_talitos_ptr(&desc2->ptr[5], &desc->ptr[5], is_sec1); -@@ -2043,7 +2033,6 @@ static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes) - struct device *dev = ctx->dev; - struct talitos_private *priv = dev_get_drvdata(dev); - bool is_sec1 = has_ftr_sec1(priv); -- int offset = 0; - u8 *ctx_buf = req_ctx->buf[req_ctx->buf_idx]; - - if (!req_ctx->last && (nbytes + req_ctx->nbuf <= blocksize)) { -@@ -2083,6 +2072,8 @@ static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes) - sg_chain(req_ctx->bufsl, 2, areq->src); - req_ctx->psrc = req_ctx->bufsl; - } else if (is_sec1 && req_ctx->nbuf && req_ctx->nbuf < blocksize) { -+ int offset; -+ - if (nbytes_to_hash > blocksize) - offset = blocksize - req_ctx->nbuf; - else -@@ -2095,7 +2086,8 @@ static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes) - sg_copy_to_buffer(areq->src, nents, - ctx_buf + req_ctx->nbuf, offset); - req_ctx->nbuf += offset; -- req_ctx->psrc = areq->src; -+ req_ctx->psrc = scatterwalk_ffwd(req_ctx->bufsl, areq->src, -+ offset); - } else - req_ctx->psrc = areq->src; - -@@ -2135,8 +2127,7 @@ static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes) - if (ctx->keylen && (req_ctx->first || req_ctx->last)) - edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_HMAC; - -- return common_nonsnoop_hash(edesc, areq, nbytes_to_hash, offset, -- ahash_done); -+ return common_nonsnoop_hash(edesc, areq, nbytes_to_hash, ahash_done); - } - - static int ahash_update(struct ahash_request *areq) -@@ -2339,7 +2330,7 @@ static struct talitos_alg_template driver_algs[] = { - .base = { - .cra_name = "authenc(hmac(sha1),cbc(aes))", - .cra_driver_name = "authenc-hmac-sha1-" -- "cbc-aes-talitos", -+ "cbc-aes-talitos-hsna", - .cra_blocksize = AES_BLOCK_SIZE, - .cra_flags = CRYPTO_ALG_ASYNC, - }, -@@ -2384,7 +2375,7 @@ static struct talitos_alg_template driver_algs[] = { - .cra_name = "authenc(hmac(sha1)," - "cbc(des3_ede))", - .cra_driver_name = "authenc-hmac-sha1-" -- "cbc-3des-talitos", -+ "cbc-3des-talitos-hsna", - .cra_blocksize = DES3_EDE_BLOCK_SIZE, - .cra_flags = CRYPTO_ALG_ASYNC, - }, -@@ -2427,7 +2418,7 @@ static struct talitos_alg_template driver_algs[] = { - .base = { - .cra_name = "authenc(hmac(sha224),cbc(aes))", - .cra_driver_name = "authenc-hmac-sha224-" -- "cbc-aes-talitos", -+ "cbc-aes-talitos-hsna", - .cra_blocksize = AES_BLOCK_SIZE, - .cra_flags = CRYPTO_ALG_ASYNC, - }, -@@ -2472,7 +2463,7 @@ static struct talitos_alg_template driver_algs[] = { - .cra_name = "authenc(hmac(sha224)," - "cbc(des3_ede))", - .cra_driver_name = "authenc-hmac-sha224-" -- "cbc-3des-talitos", -+ "cbc-3des-talitos-hsna", - .cra_blocksize = DES3_EDE_BLOCK_SIZE, - .cra_flags = CRYPTO_ALG_ASYNC, - }, -@@ -2515,7 +2506,7 @@ static struct talitos_alg_template driver_algs[] = { - .base = { - .cra_name = "authenc(hmac(sha256),cbc(aes))", - .cra_driver_name = "authenc-hmac-sha256-" -- "cbc-aes-talitos", -+ "cbc-aes-talitos-hsna", - .cra_blocksize = AES_BLOCK_SIZE, - .cra_flags = CRYPTO_ALG_ASYNC, - }, -@@ -2560,7 +2551,7 @@ static struct talitos_alg_template driver_algs[] = { - .cra_name = "authenc(hmac(sha256)," - "cbc(des3_ede))", - .cra_driver_name = "authenc-hmac-sha256-" -- "cbc-3des-talitos", -+ "cbc-3des-talitos-hsna", - .cra_blocksize = DES3_EDE_BLOCK_SIZE, - .cra_flags = CRYPTO_ALG_ASYNC, - }, -@@ -2689,7 +2680,7 @@ static struct talitos_alg_template driver_algs[] = { - .base = { - .cra_name = "authenc(hmac(md5),cbc(aes))", - .cra_driver_name = "authenc-hmac-md5-" -- "cbc-aes-talitos", -+ "cbc-aes-talitos-hsna", - .cra_blocksize = AES_BLOCK_SIZE, - .cra_flags = CRYPTO_ALG_ASYNC, - }, -@@ -2732,7 +2723,7 @@ static struct talitos_alg_template driver_algs[] = { - .base = { - .cra_name = "authenc(hmac(md5),cbc(des3_ede))", - .cra_driver_name = "authenc-hmac-md5-" -- "cbc-3des-talitos", -+ "cbc-3des-talitos-hsna", - .cra_blocksize = DES3_EDE_BLOCK_SIZE, - .cra_flags = CRYPTO_ALG_ASYNC, - }, -@@ -3270,7 +3261,10 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev, - alg->cra_priority = t_alg->algt.priority; - else - alg->cra_priority = TALITOS_CRA_PRIORITY; -- alg->cra_alignmask = 0; -+ if (has_ftr_sec1(priv)) -+ alg->cra_alignmask = 3; -+ else -+ alg->cra_alignmask = 0; - alg->cra_ctxsize = sizeof(struct talitos_ctx); - alg->cra_flags |= CRYPTO_ALG_KERN_DRIVER_ONLY; - -diff --git a/drivers/crypto/talitos.h b/drivers/crypto/talitos.h -index a65a63e0d6c1..979f6a61e545 100644 ---- a/drivers/crypto/talitos.h -+++ b/drivers/crypto/talitos.h -@@ -65,6 +65,36 @@ struct talitos_desc { - - #define TALITOS_DESC_SIZE (sizeof(struct talitos_desc) - sizeof(__be32)) - -+/* -+ * talitos_edesc - s/w-extended descriptor -+ * @src_nents: number of segments in input scatterlist -+ * @dst_nents: number of segments in output scatterlist -+ * @icv_ool: whether ICV is out-of-line -+ * @iv_dma: dma address of iv for checking continuity and link table -+ * @dma_len: length of dma mapped link_tbl space -+ * @dma_link_tbl: bus physical address of link_tbl/buf -+ * @desc: h/w descriptor -+ * @link_tbl: input and output h/w link tables (if {src,dst}_nents > 1) (SEC2) -+ * @buf: input and output buffeur (if {src,dst}_nents > 1) (SEC1) -+ * -+ * if decrypting (with authcheck), or either one of src_nents or dst_nents -+ * is greater than 1, an integrity check value is concatenated to the end -+ * of link_tbl data -+ */ -+struct talitos_edesc { -+ int src_nents; -+ int dst_nents; -+ bool icv_ool; -+ dma_addr_t iv_dma; -+ int dma_len; -+ dma_addr_t dma_link_tbl; -+ struct talitos_desc desc; -+ union { -+ struct talitos_ptr link_tbl[0]; -+ u8 buf[0]; -+ }; -+}; -+ - /** - * talitos_request - descriptor submission request - * @desc: descriptor pointer (kernel virtual) -diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c -index a02318c6d28a..4c0131857133 100644 ---- a/drivers/dax/kmem.c -+++ b/drivers/dax/kmem.c -@@ -66,8 +66,11 @@ int dev_dax_kmem_probe(struct device *dev) - new_res->name = dev_name(dev); - - rc = add_memory(numa_node, new_res->start, resource_size(new_res)); -- if (rc) -+ if (rc) { -+ release_resource(new_res); -+ kfree(new_res); - return rc; -+ } - - return 0; - } -diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c -index bf4d4c80fbc6..a6fee5a6e9fb 100644 ---- a/drivers/dma-buf/dma-buf.c -+++ b/drivers/dma-buf/dma-buf.c -@@ -1057,6 +1057,7 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused) - fence->ops->get_driver_name(fence), - fence->ops->get_timeline_name(fence), - dma_fence_is_signaled(fence) ? "" : "un"); -+ dma_fence_put(fence); - } - rcu_read_unlock(); - -diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c -index 4d32e2c67862..4447e13d1e89 100644 ---- a/drivers/dma-buf/reservation.c -+++ b/drivers/dma-buf/reservation.c -@@ -365,6 +365,10 @@ int reservation_object_get_fences_rcu(struct reservation_object *obj, - GFP_NOWAIT | __GFP_NOWARN); - if (!nshared) { - rcu_read_unlock(); -+ -+ dma_fence_put(fence_excl); -+ fence_excl = NULL; -+ - nshared = krealloc(shared, sz, GFP_KERNEL); - if (nshared) { - shared = nshared; -diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c -index 33ab1b607e2b..54de669c38b8 100644 ---- a/drivers/dma/sh/rcar-dmac.c -+++ b/drivers/dma/sh/rcar-dmac.c -@@ -1165,7 +1165,7 @@ rcar_dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, - struct rcar_dmac_chan *rchan = to_rcar_dmac_chan(chan); - - /* Someone calling slave DMA on a generic channel? */ -- if (rchan->mid_rid < 0 || !sg_len) { -+ if (rchan->mid_rid < 0 || !sg_len || !sg_dma_len(sgl)) { - dev_warn(chan->device->dev, - "%s: bad parameter: len=%d, id=%d\n", - __func__, sg_len, rchan->mid_rid); -diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c -index ef317c90fbe1..79e9593815f1 100644 ---- a/drivers/dma/tegra20-apb-dma.c -+++ b/drivers/dma/tegra20-apb-dma.c -@@ -977,8 +977,12 @@ static struct dma_async_tx_descriptor *tegra_dma_prep_slave_sg( - csr |= tdc->slave_id << TEGRA_APBDMA_CSR_REQ_SEL_SHIFT; - } - -- if (flags & DMA_PREP_INTERRUPT) -+ if (flags & DMA_PREP_INTERRUPT) { - csr |= TEGRA_APBDMA_CSR_IE_EOC; -+ } else { -+ WARN_ON_ONCE(1); -+ return NULL; -+ } - - apb_seq |= TEGRA_APBDMA_APBSEQ_WRAP_WORD_1; - -@@ -1120,8 +1124,12 @@ static struct dma_async_tx_descriptor *tegra_dma_prep_dma_cyclic( - csr |= tdc->slave_id << TEGRA_APBDMA_CSR_REQ_SEL_SHIFT; - } - -- if (flags & DMA_PREP_INTERRUPT) -+ if (flags & DMA_PREP_INTERRUPT) { - csr |= TEGRA_APBDMA_CSR_IE_EOC; -+ } else { -+ WARN_ON_ONCE(1); -+ return NULL; -+ } - - apb_seq |= TEGRA_APBDMA_APBSEQ_WRAP_WORD_1; - -diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c -index 464174685589..4386ea4b9b5a 100644 ---- a/drivers/edac/edac_mc_sysfs.c -+++ b/drivers/edac/edac_mc_sysfs.c -@@ -26,7 +26,7 @@ - static int edac_mc_log_ue = 1; - static int edac_mc_log_ce = 1; - static int edac_mc_panic_on_ue; --static int edac_mc_poll_msec = 1000; -+static unsigned int edac_mc_poll_msec = 1000; - - /* Getter functions for above */ - int edac_mc_get_log_ue(void) -@@ -45,30 +45,30 @@ int edac_mc_get_panic_on_ue(void) - } - - /* this is temporary */ --int edac_mc_get_poll_msec(void) -+unsigned int edac_mc_get_poll_msec(void) - { - return edac_mc_poll_msec; - } - - static int edac_set_poll_msec(const char *val, const struct kernel_param *kp) - { -- unsigned long l; -+ unsigned int i; - int ret; - - if (!val) - return -EINVAL; - -- ret = kstrtoul(val, 0, &l); -+ ret = kstrtouint(val, 0, &i); - if (ret) - return ret; - -- if (l < 1000) -+ if (i < 1000) - return -EINVAL; - -- *((unsigned long *)kp->arg) = l; -+ *((unsigned int *)kp->arg) = i; - - /* notify edac_mc engine to reset the poll period */ -- edac_mc_reset_delay_period(l); -+ edac_mc_reset_delay_period(i); - - return 0; - } -@@ -82,7 +82,7 @@ MODULE_PARM_DESC(edac_mc_log_ue, - module_param(edac_mc_log_ce, int, 0644); - MODULE_PARM_DESC(edac_mc_log_ce, - "Log correctable error to console: 0=off 1=on"); --module_param_call(edac_mc_poll_msec, edac_set_poll_msec, param_get_int, -+module_param_call(edac_mc_poll_msec, edac_set_poll_msec, param_get_uint, - &edac_mc_poll_msec, 0644); - MODULE_PARM_DESC(edac_mc_poll_msec, "Polling period in milliseconds"); - -@@ -404,6 +404,8 @@ static inline int nr_pages_per_csrow(struct csrow_info *csrow) - static int edac_create_csrow_object(struct mem_ctl_info *mci, - struct csrow_info *csrow, int index) - { -+ int err; -+ - csrow->dev.type = &csrow_attr_type; - csrow->dev.groups = csrow_dev_groups; - device_initialize(&csrow->dev); -@@ -415,7 +417,11 @@ static int edac_create_csrow_object(struct mem_ctl_info *mci, - edac_dbg(0, "creating (virtual) csrow node %s\n", - dev_name(&csrow->dev)); - -- return device_add(&csrow->dev); -+ err = device_add(&csrow->dev); -+ if (err) -+ put_device(&csrow->dev); -+ -+ return err; - } - - /* Create a CSROW object under specifed edac_mc_device */ -@@ -443,7 +449,8 @@ static int edac_create_csrow_objects(struct mem_ctl_info *mci) - csrow = mci->csrows[i]; - if (!nr_pages_per_csrow(csrow)) - continue; -- put_device(&mci->csrows[i]->dev); -+ -+ device_del(&mci->csrows[i]->dev); - } - - return err; -@@ -645,9 +652,11 @@ static int edac_create_dimm_object(struct mem_ctl_info *mci, - dev_set_drvdata(&dimm->dev, dimm); - pm_runtime_forbid(&mci->dev); - -- err = device_add(&dimm->dev); -+ err = device_add(&dimm->dev); -+ if (err) -+ put_device(&dimm->dev); - -- edac_dbg(0, "creating rank/dimm device %s\n", dev_name(&dimm->dev)); -+ edac_dbg(0, "created rank/dimm device %s\n", dev_name(&dimm->dev)); - - return err; - } -@@ -928,6 +937,7 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci, - err = device_add(&mci->dev); - if (err < 0) { - edac_dbg(1, "failure: create device %s\n", dev_name(&mci->dev)); -+ put_device(&mci->dev); - goto out; - } - -diff --git a/drivers/edac/edac_module.h b/drivers/edac/edac_module.h -index dd7d0b509aa3..75528f07abd5 100644 ---- a/drivers/edac/edac_module.h -+++ b/drivers/edac/edac_module.h -@@ -36,7 +36,7 @@ extern int edac_mc_get_log_ue(void); - extern int edac_mc_get_log_ce(void); - extern int edac_mc_get_panic_on_ue(void); - extern int edac_get_poll_msec(void); --extern int edac_mc_get_poll_msec(void); -+extern unsigned int edac_mc_get_poll_msec(void); - - unsigned edac_dimm_info_location(struct dimm_info *dimm, char *buf, - unsigned len); -diff --git a/drivers/firmware/psci/psci_checker.c b/drivers/firmware/psci/psci_checker.c -index 08c85099d4d0..f3659443f8c2 100644 ---- a/drivers/firmware/psci/psci_checker.c -+++ b/drivers/firmware/psci/psci_checker.c -@@ -359,16 +359,16 @@ static int suspend_test_thread(void *arg) - for (;;) { - /* Needs to be set first to avoid missing a wakeup. */ - set_current_state(TASK_INTERRUPTIBLE); -- if (kthread_should_stop()) { -- __set_current_state(TASK_RUNNING); -+ if (kthread_should_park()) - break; -- } - schedule(); - } - - pr_info("CPU %d suspend test results: success %d, shallow states %d, errors %d\n", - cpu, nb_suspend, nb_shallow_sleep, nb_err); - -+ kthread_parkme(); -+ - return nb_err; - } - -@@ -433,8 +433,10 @@ static int suspend_tests(void) - - - /* Stop and destroy all threads, get return status. */ -- for (i = 0; i < nb_threads; ++i) -+ for (i = 0; i < nb_threads; ++i) { -+ err += kthread_park(threads[i]); - err += kthread_stop(threads[i]); -+ } - out: - cpuidle_resume_and_unlock(); - kfree(threads); -diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig -index 8072c195d831..dd414250e77e 100644 ---- a/drivers/fpga/Kconfig -+++ b/drivers/fpga/Kconfig -@@ -40,6 +40,7 @@ config ALTERA_PR_IP_CORE_PLAT - config FPGA_MGR_ALTERA_PS_SPI - tristate "Altera FPGA Passive Serial over SPI" - depends on SPI -+ select BITREVERSE - help - FPGA manager driver support for Altera Arria/Cyclone/Stratix - using the passive serial interface over SPI. -diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c -index 3bbf5804bd11..de4da2ed7955 100644 ---- a/drivers/gpio/gpio-davinci.c -+++ b/drivers/gpio/gpio-davinci.c -@@ -238,8 +238,9 @@ static int davinci_gpio_probe(struct platform_device *pdev) - for (i = 0; i < nirq; i++) { - chips->irqs[i] = platform_get_irq(pdev, i); - if (chips->irqs[i] < 0) { -- dev_info(dev, "IRQ not populated, err = %d\n", -- chips->irqs[i]); -+ if (chips->irqs[i] != -EPROBE_DEFER) -+ dev_info(dev, "IRQ not populated, err = %d\n", -+ chips->irqs[i]); - return chips->irqs[i]; - } - } -diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c -index 9276ef616430..8591c410ecaa 100644 ---- a/drivers/gpio/gpio-omap.c -+++ b/drivers/gpio/gpio-omap.c -@@ -829,9 +829,9 @@ static void omap_gpio_irq_shutdown(struct irq_data *d) - - raw_spin_lock_irqsave(&bank->lock, flags); - bank->irq_usage &= ~(BIT(offset)); -- omap_set_gpio_irqenable(bank, offset, 0); -- omap_clear_gpio_irqstatus(bank, offset); - omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE); -+ omap_clear_gpio_irqstatus(bank, offset); -+ omap_set_gpio_irqenable(bank, offset, 0); - if (!LINE_USED(bank->mod_usage, offset)) - omap_clear_gpio_debounce(bank, offset); - omap_disable_gpio_module(bank, offset); -@@ -867,8 +867,8 @@ static void omap_gpio_mask_irq(struct irq_data *d) - unsigned long flags; - - raw_spin_lock_irqsave(&bank->lock, flags); -- omap_set_gpio_irqenable(bank, offset, 0); - omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE); -+ omap_set_gpio_irqenable(bank, offset, 0); - raw_spin_unlock_irqrestore(&bank->lock, flags); - } - -@@ -880,9 +880,6 @@ static void omap_gpio_unmask_irq(struct irq_data *d) - unsigned long flags; - - raw_spin_lock_irqsave(&bank->lock, flags); -- if (trigger) -- omap_set_gpio_triggering(bank, offset, trigger); -- - omap_set_gpio_irqenable(bank, offset, 1); - - /* -@@ -890,9 +887,13 @@ static void omap_gpio_unmask_irq(struct irq_data *d) - * is cleared, thus after the handler has run. OMAP4 needs this done - * after enabing the interrupt to clear the wakeup status. - */ -- if (bank->level_mask & BIT(offset)) -+ if (bank->regs->leveldetect0 && bank->regs->wkup_en && -+ trigger & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) - omap_clear_gpio_irqstatus(bank, offset); - -+ if (trigger) -+ omap_set_gpio_triggering(bank, offset, trigger); -+ - raw_spin_unlock_irqrestore(&bank->lock, flags); - } - -@@ -1274,13 +1275,23 @@ static void omap_gpio_idle(struct gpio_bank *bank, bool may_lose_context) - { - struct device *dev = bank->chip.parent; - void __iomem *base = bank->base; -- u32 nowake; -+ u32 mask, nowake; - - bank->saved_datain = readl_relaxed(base + bank->regs->datain); - - if (!bank->enabled_non_wakeup_gpios) - goto update_gpio_context_count; - -+ /* Check for pending EDGE_FALLING, ignore EDGE_BOTH */ -+ mask = bank->enabled_non_wakeup_gpios & bank->context.fallingdetect; -+ mask &= ~bank->context.risingdetect; -+ bank->saved_datain |= mask; -+ -+ /* Check for pending EDGE_RISING, ignore EDGE_BOTH */ -+ mask = bank->enabled_non_wakeup_gpios & bank->context.risingdetect; -+ mask &= ~bank->context.fallingdetect; -+ bank->saved_datain &= ~mask; -+ - if (!may_lose_context) - goto update_gpio_context_count; - -@@ -1453,6 +1464,8 @@ static struct omap_gpio_reg_offs omap4_gpio_regs = { - .clr_dataout = OMAP4_GPIO_CLEARDATAOUT, - .irqstatus = OMAP4_GPIO_IRQSTATUS0, - .irqstatus2 = OMAP4_GPIO_IRQSTATUS1, -+ .irqstatus_raw0 = OMAP4_GPIO_IRQSTATUSRAW0, -+ .irqstatus_raw1 = OMAP4_GPIO_IRQSTATUSRAW1, - .irqenable = OMAP4_GPIO_IRQSTATUSSET0, - .irqenable2 = OMAP4_GPIO_IRQSTATUSSET1, - .set_irqenable = OMAP4_GPIO_IRQSTATUSSET0, -diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c -index 9c9b965d7d6d..c9325efc1783 100644 ---- a/drivers/gpio/gpiolib-of.c -+++ b/drivers/gpio/gpiolib-of.c -@@ -118,15 +118,8 @@ static void of_gpio_flags_quirks(struct device_node *np, - * Legacy handling of SPI active high chip select. If we have a - * property named "cs-gpios" we need to inspect the child node - * to determine if the flags should have inverted semantics. -- * -- * This does not apply to an SPI device named "spi-gpio", because -- * these have traditionally obtained their own GPIOs by parsing -- * the device tree directly and did not respect any "spi-cs-high" -- * property on the SPI bus children. - */ -- if (IS_ENABLED(CONFIG_SPI_MASTER) && -- !strcmp(propname, "cs-gpios") && -- !of_device_is_compatible(np, "spi-gpio") && -+ if (IS_ENABLED(CONFIG_SPI_MASTER) && !strcmp(propname, "cs-gpios") && - of_property_read_bool(np, "cs-gpios")) { - struct device_node *child; - u32 cs; -@@ -161,6 +154,7 @@ static void of_gpio_flags_quirks(struct device_node *np, - of_node_full_name(child)); - *flags |= OF_GPIO_ACTIVE_LOW; - } -+ of_node_put(child); - break; - } - } -diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c -index e013d417a936..4f333d6f2e23 100644 ---- a/drivers/gpio/gpiolib.c -+++ b/drivers/gpio/gpiolib.c -@@ -956,9 +956,11 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) - } - - if (eflags & GPIOEVENT_REQUEST_RISING_EDGE) -- irqflags |= IRQF_TRIGGER_RISING; -+ irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? -+ IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING; - if (eflags & GPIOEVENT_REQUEST_FALLING_EDGE) -- irqflags |= IRQF_TRIGGER_FALLING; -+ irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? -+ IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING; - irqflags |= IRQF_ONESHOT; - - INIT_KFIFO(le->events); -@@ -1392,12 +1394,17 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, - for (i = 0; i < chip->ngpio; i++) { - struct gpio_desc *desc = &gdev->descs[i]; - -- if (chip->get_direction && gpiochip_line_is_valid(chip, i)) -- desc->flags = !chip->get_direction(chip, i) ? -- (1 << FLAG_IS_OUT) : 0; -- else -- desc->flags = !chip->direction_input ? -- (1 << FLAG_IS_OUT) : 0; -+ if (chip->get_direction && gpiochip_line_is_valid(chip, i)) { -+ if (!chip->get_direction(chip, i)) -+ set_bit(FLAG_IS_OUT, &desc->flags); -+ else -+ clear_bit(FLAG_IS_OUT, &desc->flags); -+ } else { -+ if (!chip->direction_input) -+ set_bit(FLAG_IS_OUT, &desc->flags); -+ else -+ clear_bit(FLAG_IS_OUT, &desc->flags); -+ } - } - - acpi_gpiochip_add(chip); -@@ -3025,7 +3032,7 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep, - int gpiod_get_raw_value(const struct gpio_desc *desc) - { - VALIDATE_DESC(desc); -- /* Should be using gpio_get_value_cansleep() */ -+ /* Should be using gpiod_get_raw_value_cansleep() */ - WARN_ON(desc->gdev->chip->can_sleep); - return gpiod_get_raw_value_commit(desc); - } -@@ -3046,7 +3053,7 @@ int gpiod_get_value(const struct gpio_desc *desc) - int value; - - VALIDATE_DESC(desc); -- /* Should be using gpio_get_value_cansleep() */ -+ /* Should be using gpiod_get_value_cansleep() */ - WARN_ON(desc->gdev->chip->can_sleep); - - value = gpiod_get_raw_value_commit(desc); -@@ -3317,7 +3324,7 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep, - void gpiod_set_raw_value(struct gpio_desc *desc, int value) - { - VALIDATE_DESC_VOID(desc); -- /* Should be using gpiod_set_value_cansleep() */ -+ /* Should be using gpiod_set_raw_value_cansleep() */ - WARN_ON(desc->gdev->chip->can_sleep); - gpiod_set_raw_value_commit(desc, value); - } -@@ -3358,6 +3365,7 @@ static void gpiod_set_value_nocheck(struct gpio_desc *desc, int value) - void gpiod_set_value(struct gpio_desc *desc, int value) - { - VALIDATE_DESC_VOID(desc); -+ /* Should be using gpiod_set_value_cansleep() */ - WARN_ON(desc->gdev->chip->can_sleep); - gpiod_set_value_nocheck(desc, value); - } -@@ -4244,8 +4252,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_index); - * - * Returns: - * On successful request the GPIO pin is configured in accordance with -- * provided @dflags. If the node does not have the requested GPIO -- * property, NULL is returned. -+ * provided @dflags. - * - * In case of error an ERR_PTR() is returned. - */ -@@ -4267,9 +4274,6 @@ struct gpio_desc *gpiod_get_from_of_node(struct device_node *node, - index, &flags); - - if (!desc || IS_ERR(desc)) { -- /* If it is not there, just return NULL */ -- if (PTR_ERR(desc) == -ENOENT) -- return NULL; - return desc; - } - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c -index a6e5184d436c..4b192e0ce92f 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c -@@ -896,6 +896,9 @@ static int init_kfd_vm(struct amdgpu_vm *vm, void **process_info, - AMDGPU_FENCE_OWNER_KFD, false); - if (ret) - goto wait_pd_fail; -+ ret = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv, 1); -+ if (ret) -+ goto reserve_shared_fail; - amdgpu_bo_fence(vm->root.base.bo, - &vm->process_info->eviction_fence->base, true); - amdgpu_bo_unreserve(vm->root.base.bo); -@@ -909,6 +912,7 @@ static int init_kfd_vm(struct amdgpu_vm *vm, void **process_info, - - return 0; - -+reserve_shared_fail: - wait_pd_fail: - validate_pd_fail: - amdgpu_bo_unreserve(vm->root.base.bo); -diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c -index 72837b8c7031..c2086eb00555 100644 ---- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c -+++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c -@@ -1163,6 +1163,9 @@ static int gmc_v9_0_gart_enable(struct amdgpu_device *adev) - tmp = RREG32_SOC15(HDP, 0, mmHDP_HOST_PATH_CNTL); - WREG32_SOC15(HDP, 0, mmHDP_HOST_PATH_CNTL, tmp); - -+ WREG32_SOC15(HDP, 0, mmHDP_NONSURFACE_BASE, (adev->gmc.vram_start >> 8)); -+ WREG32_SOC15(HDP, 0, mmHDP_NONSURFACE_BASE_HI, (adev->gmc.vram_start >> 40)); -+ - /* After HDP is initialized, flush HDP.*/ - adev->nbio_funcs->hdp_flush(adev, NULL); - -diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c -index ae381450601c..afbaf6f5131e 100644 ---- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c -+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c -@@ -1268,12 +1268,17 @@ int amdkfd_fence_wait_timeout(unsigned int *fence_addr, - return 0; - } - --static int unmap_sdma_queues(struct device_queue_manager *dqm, -- unsigned int sdma_engine) -+static int unmap_sdma_queues(struct device_queue_manager *dqm) - { -- return pm_send_unmap_queue(&dqm->packets, KFD_QUEUE_TYPE_SDMA, -- KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, false, -- sdma_engine); -+ int i, retval = 0; -+ -+ for (i = 0; i < dqm->dev->device_info->num_sdma_engines; i++) { -+ retval = pm_send_unmap_queue(&dqm->packets, KFD_QUEUE_TYPE_SDMA, -+ KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, false, i); -+ if (retval) -+ return retval; -+ } -+ return retval; - } - - /* dqm->lock mutex has to be locked before calling this function */ -@@ -1312,10 +1317,8 @@ static int unmap_queues_cpsch(struct device_queue_manager *dqm, - pr_debug("Before destroying queues, sdma queue count is : %u\n", - dqm->sdma_queue_count); - -- if (dqm->sdma_queue_count > 0) { -- unmap_sdma_queues(dqm, 0); -- unmap_sdma_queues(dqm, 1); -- } -+ if (dqm->sdma_queue_count > 0) -+ unmap_sdma_queues(dqm); - - retval = pm_send_unmap_queue(&dqm->packets, KFD_QUEUE_TYPE_COMPUTE, - filter, filter_param, false, 0); -diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c -index 9dbba609450e..8fe74b821b32 100644 ---- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c -+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c -@@ -76,6 +76,7 @@ static int init_mqd(struct mqd_manager *mm, void **mqd, - struct v9_mqd *m; - struct kfd_dev *kfd = mm->dev; - -+ *mqd_mem_obj = NULL; - /* From V9, for CWSR, the control stack is located on the next page - * boundary after the mqd, we will use the gtt allocation function - * instead of sub-allocation function. -@@ -93,8 +94,10 @@ static int init_mqd(struct mqd_manager *mm, void **mqd, - } else - retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct v9_mqd), - mqd_mem_obj); -- if (retval != 0) -+ if (retval) { -+ kfree(*mqd_mem_obj); - return -ENOMEM; -+ } - - m = (struct v9_mqd *) (*mqd_mem_obj)->cpu_ptr; - addr = (*mqd_mem_obj)->gpu_addr; -diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -index ab7c5c3004ee..dc3ac66a4450 100644 ---- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c -@@ -2592,7 +2592,7 @@ fill_plane_buffer_attributes(struct amdgpu_device *adev, - address->type = PLN_ADDR_TYPE_GRAPHICS; - address->grph.addr.low_part = lower_32_bits(afb->address); - address->grph.addr.high_part = upper_32_bits(afb->address); -- } else { -+ } else if (format < SURFACE_PIXEL_FORMAT_INVALID) { - uint64_t chroma_addr = afb->address + fb->offsets[1]; - - plane_size->video.luma_size.x = 0; -@@ -4627,6 +4627,13 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, - { - struct amdgpu_device *adev = dm->ddev->dev_private; - -+ /* -+ * Some of the properties below require access to state, like bpc. -+ * Allocate some default initial connector state with our reset helper. -+ */ -+ if (aconnector->base.funcs->reset) -+ aconnector->base.funcs->reset(&aconnector->base); -+ - aconnector->connector_id = link_index; - aconnector->dc_link = link; - aconnector->base.interlace_allowed = false; -@@ -4809,9 +4816,6 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm, - &aconnector->base, - &amdgpu_dm_connector_helper_funcs); - -- if (aconnector->base.funcs->reset) -- aconnector->base.funcs->reset(&aconnector->base); -- - amdgpu_dm_connector_init_helper( - dm, - aconnector, -@@ -4952,12 +4956,12 @@ static int get_cursor_position(struct drm_plane *plane, struct drm_crtc *crtc, - int x, y; - int xorigin = 0, yorigin = 0; - -- if (!crtc || !plane->state->fb) { -- position->enable = false; -- position->x = 0; -- position->y = 0; -+ position->enable = false; -+ position->x = 0; -+ position->y = 0; -+ -+ if (!crtc || !plane->state->fb) - return 0; -- } - - if ((plane->state->crtc_w > amdgpu_crtc->max_cursor_width) || - (plane->state->crtc_h > amdgpu_crtc->max_cursor_height)) { -@@ -4971,6 +4975,10 @@ static int get_cursor_position(struct drm_plane *plane, struct drm_crtc *crtc, - x = plane->state->crtc_x; - y = plane->state->crtc_y; - -+ if (x <= -amdgpu_crtc->max_cursor_width || -+ y <= -amdgpu_crtc->max_cursor_height) -+ return 0; -+ - if (crtc->primary->state) { - /* avivo cursor are offset into the total surface */ - x += crtc->primary->state->src_x >> 16; -@@ -6327,6 +6335,10 @@ static bool should_reset_plane(struct drm_atomic_state *state, - if (!new_crtc_state) - return true; - -+ /* CRTC Degamma changes currently require us to recreate planes. */ -+ if (new_crtc_state->color_mgmt_changed) -+ return true; -+ - if (drm_atomic_crtc_needs_modeset(new_crtc_state)) - return true; - -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c -index 18c775a950cc..ee6b646180b6 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc.c -@@ -1138,9 +1138,6 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c - const struct dc_link *link = context->streams[i]->link; - struct dc_stream_status *status; - -- if (context->streams[i]->apply_seamless_boot_optimization) -- context->streams[i]->apply_seamless_boot_optimization = false; -- - if (!context->streams[i]->mode_changed) - continue; - -@@ -1792,10 +1789,15 @@ static void commit_planes_for_stream(struct dc *dc, - if (dc->optimize_seamless_boot && surface_count > 0) { - /* Optimize seamless boot flag keeps clocks and watermarks high until - * first flip. After first flip, optimization is required to lower -- * bandwidth. -+ * bandwidth. Important to note that it is expected UEFI will -+ * only light up a single display on POST, therefore we only expect -+ * one stream with seamless boot flag set. - */ -- dc->optimize_seamless_boot = false; -- dc->optimized_required = true; -+ if (stream->apply_seamless_boot_optimization) { -+ stream->apply_seamless_boot_optimization = false; -+ dc->optimize_seamless_boot = false; -+ dc->optimized_required = true; -+ } - } - - if (update_type == UPDATE_TYPE_FULL && !dc->optimize_seamless_boot) { -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c -index b37ecc3ede61..a3ff33ff6da1 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c -@@ -960,6 +960,12 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) - - link->type = dc_connection_none; - sink_caps.signal = SIGNAL_TYPE_NONE; -+ /* When we unplug a passive DP-HDMI dongle connection, dongle_max_pix_clk -+ * is not cleared. If we emulate a DP signal on this connection, it thinks -+ * the dongle is still there and limits the number of modes we can emulate. -+ * Clear dongle_max_pix_clk on disconnect to fix this -+ */ -+ link->dongle_max_pix_clk = 0; - } - - LINK_INFO("link=%d, dc_sink_in=%p is now %s prev_sink=%p dpcd same=%d edid same=%d\n", -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c -index 1ee544a32ebb..253311864cdd 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c -@@ -1624,8 +1624,7 @@ static bool decide_edp_link_settings(struct dc_link *link, struct dc_link_settin - uint32_t link_bw; - - if (link->dpcd_caps.dpcd_rev.raw < DPCD_REV_14 || -- link->dpcd_caps.edp_supported_link_rates_count == 0 || -- link->dc->config.optimize_edp_link_rate == false) { -+ link->dpcd_caps.edp_supported_link_rates_count == 0) { - *link_setting = link->verified_link_cap; - return true; - } -@@ -2597,7 +2596,8 @@ void detect_edp_sink_caps(struct dc_link *link) - memset(supported_link_rates, 0, sizeof(supported_link_rates)); - - if (link->dpcd_caps.dpcd_rev.raw >= DPCD_REV_14 && -- link->dc->config.optimize_edp_link_rate) { -+ (link->dc->config.optimize_edp_link_rate || -+ link->reported_link_cap.link_rate == LINK_RATE_UNKNOWN)) { - // Read DPCD 00010h - 0001Fh 16 bytes at one shot - core_link_read_dpcd(link, DP_SUPPORTED_LINK_RATES, - supported_link_rates, sizeof(supported_link_rates)); -@@ -2612,6 +2612,9 @@ void detect_edp_sink_caps(struct dc_link *link) - link_rate = linkRateInKHzToLinkRateMultiplier(link_rate_in_khz); - link->dpcd_caps.edp_supported_link_rates[link->dpcd_caps.edp_supported_link_rates_count] = link_rate; - link->dpcd_caps.edp_supported_link_rates_count++; -+ -+ if (link->reported_link_cap.link_rate < link_rate) -+ link->reported_link_cap.link_rate = link_rate; - } - } - } -diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c -index eac7186e4f08..12142d13f22f 100644 ---- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c -+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c -@@ -2034,6 +2034,9 @@ enum dc_status resource_map_pool_resources( - if (context->streams[i] == stream) { - context->stream_status[i].primary_otg_inst = pipe_ctx->stream_res.tg->inst; - context->stream_status[i].stream_enc_inst = pipe_ctx->stream_res.stream_enc->id; -+ context->stream_status[i].audio_inst = -+ pipe_ctx->stream_res.audio ? pipe_ctx->stream_res.audio->inst : -1; -+ - return DC_OK; - } - -diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h -index 189bdab929a5..c20803b71fa5 100644 ---- a/drivers/gpu/drm/amd/display/dc/dc_stream.h -+++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h -@@ -42,6 +42,7 @@ struct dc_stream_status { - int primary_otg_inst; - int stream_enc_inst; - int plane_count; -+ int audio_inst; - struct timing_sync_info timing_sync_info; - struct dc_plane_state *plane_states[MAX_SURFACE_NUM]; - }; -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c -index da96229db53a..2959c3c9390b 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c -@@ -473,6 +473,8 @@ void dce_abm_destroy(struct abm **abm) - { - struct dce_abm *abm_dce = TO_DCE_ABM(*abm); - -+ abm_dce->base.funcs->set_abm_immediate_disable(*abm); -+ - kfree(abm_dce); - *abm = NULL; - } -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c -index 818536eea00a..c6a607cd0e4b 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c -@@ -388,6 +388,9 @@ static bool dcn10_dmcu_init(struct dmcu *dmcu) - /* Set initialized ramping boundary value */ - REG_WRITE(MASTER_COMM_DATA_REG1, 0xFFFF); - -+ /* Set backlight ramping stepsize */ -+ REG_WRITE(MASTER_COMM_DATA_REG2, abm_gain_stepsize); -+ - /* Set command to initialize microcontroller */ - REG_UPDATE(MASTER_COMM_CMD_REG, MASTER_COMM_CMD_REG_BYTE0, - MCP_INIT_DMCU); -diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h -index 60ce56f60ae3..5bd0df55aa5d 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h -+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h -@@ -263,4 +263,6 @@ struct dmcu *dcn10_dmcu_create( - - void dce_dmcu_destroy(struct dmcu **dmcu); - -+static const uint32_t abm_gain_stepsize = 0x0060; -+ - #endif /* _DCE_ABM_H_ */ -diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c -index 7ac50ab1b762..7d7e93c87c28 100644 ---- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c -+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c -@@ -242,6 +242,9 @@ static void build_prescale_params(struct ipp_prescale_params *prescale_params, - prescale_params->mode = IPP_PRESCALE_MODE_FIXED_UNSIGNED; - - switch (plane_state->format) { -+ case SURFACE_PIXEL_FORMAT_GRPH_RGB565: -+ prescale_params->scale = 0x2082; -+ break; - case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: - case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: - prescale_params->scale = 0x2020; -diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c -index 33d311cea28c..9e4d70a0055e 100644 ---- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c -+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c -@@ -23,6 +23,7 @@ - * - */ - -+#include - #include "dm_services.h" - #include "core_types.h" - #include "resource.h" -diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c -index a1055413bade..31f867bb5afe 100644 ---- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c -+++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c -@@ -1564,7 +1564,8 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf, - - output_tf->type = TF_TYPE_DISTRIBUTED_POINTS; - -- if (ramp && (mapUserRamp || ramp->type != GAMMA_RGB_256)) { -+ if (ramp && ramp->type != GAMMA_CS_TFM_1D && -+ (mapUserRamp || ramp->type != GAMMA_RGB_256)) { - rgb_user = kvcalloc(ramp->num_entries + _EXTRA_POINTS, - sizeof(*rgb_user), - GFP_KERNEL); -diff --git a/drivers/gpu/drm/bochs/bochs_drv.c b/drivers/gpu/drm/bochs/bochs_drv.c -index b86cc705138c..d8b945596b09 100644 ---- a/drivers/gpu/drm/bochs/bochs_drv.c -+++ b/drivers/gpu/drm/bochs/bochs_drv.c -@@ -7,6 +7,7 @@ - #include - #include - #include -+#include - - #include "bochs.h" - -@@ -171,6 +172,7 @@ static void bochs_pci_remove(struct pci_dev *pdev) - { - struct drm_device *dev = pci_get_drvdata(pdev); - -+ drm_atomic_helper_shutdown(dev); - drm_dev_unregister(dev); - bochs_unload(dev); - drm_dev_put(dev); -diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c -index 1211b5379df1..8e3c5e599eba 100644 ---- a/drivers/gpu/drm/bridge/sii902x.c -+++ b/drivers/gpu/drm/bridge/sii902x.c -@@ -229,10 +229,11 @@ static void sii902x_bridge_mode_set(struct drm_bridge *bridge, - struct regmap *regmap = sii902x->regmap; - u8 buf[HDMI_INFOFRAME_SIZE(AVI)]; - struct hdmi_avi_infoframe frame; -+ u16 pixel_clock_10kHz = adj->clock / 10; - int ret; - -- buf[0] = adj->clock; -- buf[1] = adj->clock >> 8; -+ buf[0] = pixel_clock_10kHz & 0xff; -+ buf[1] = pixel_clock_10kHz >> 8; - buf[2] = adj->vrefresh; - buf[3] = 0x00; - buf[4] = adj->hdisplay; -diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c -index 4655bb1eb88f..f59a51e19dab 100644 ---- a/drivers/gpu/drm/bridge/tc358767.c -+++ b/drivers/gpu/drm/bridge/tc358767.c -@@ -1141,6 +1141,13 @@ static int tc_connector_get_modes(struct drm_connector *connector) - struct tc_data *tc = connector_to_tc(connector); - struct edid *edid; - unsigned int count; -+ int ret; -+ -+ ret = tc_get_display_props(tc); -+ if (ret < 0) { -+ dev_err(tc->dev, "failed to read display props: %d\n", ret); -+ return 0; -+ } - - if (tc->panel && tc->panel->funcs && tc->panel->funcs->get_modes) { - count = tc->panel->funcs->get_modes(tc->panel); -diff --git a/drivers/gpu/drm/bridge/ti-tfp410.c b/drivers/gpu/drm/bridge/ti-tfp410.c -index a879aac21246..3a8af9978ebd 100644 ---- a/drivers/gpu/drm/bridge/ti-tfp410.c -+++ b/drivers/gpu/drm/bridge/ti-tfp410.c -@@ -372,7 +372,8 @@ static int tfp410_fini(struct device *dev) - { - struct tfp410 *dvi = dev_get_drvdata(dev); - -- cancel_delayed_work_sync(&dvi->hpd_work); -+ if (dvi->hpd_irq >= 0) -+ cancel_delayed_work_sync(&dvi->hpd_work); - - drm_bridge_remove(&dvi->bridge); - -diff --git a/drivers/gpu/drm/drm_debugfs_crc.c b/drivers/gpu/drm/drm_debugfs_crc.c -index 00e743153e94..fde298d9f510 100644 ---- a/drivers/gpu/drm/drm_debugfs_crc.c -+++ b/drivers/gpu/drm/drm_debugfs_crc.c -@@ -389,12 +389,13 @@ int drm_crtc_add_crc_entry(struct drm_crtc *crtc, bool has_frame, - struct drm_crtc_crc *crc = &crtc->crc; - struct drm_crtc_crc_entry *entry; - int head, tail; -+ unsigned long flags; - -- spin_lock(&crc->lock); -+ spin_lock_irqsave(&crc->lock, flags); - - /* Caller may not have noticed yet that userspace has stopped reading */ - if (!crc->entries) { -- spin_unlock(&crc->lock); -+ spin_unlock_irqrestore(&crc->lock, flags); - return -EINVAL; - } - -@@ -405,7 +406,7 @@ int drm_crtc_add_crc_entry(struct drm_crtc *crtc, bool has_frame, - bool was_overflow = crc->overflow; - - crc->overflow = true; -- spin_unlock(&crc->lock); -+ spin_unlock_irqrestore(&crc->lock, flags); - - if (!was_overflow) - DRM_ERROR("Overflow of CRC buffer, userspace reads too slow.\n"); -@@ -421,7 +422,7 @@ int drm_crtc_add_crc_entry(struct drm_crtc *crtc, bool has_frame, - head = (head + 1) & (DRM_CRC_ENTRIES_NR - 1); - crc->head = head; - -- spin_unlock(&crc->lock); -+ spin_unlock_irqrestore(&crc->lock, flags); - - wake_up_interruptible(&crc->wq); - -diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c -index e804ac5dec02..e9d75549cde8 100644 ---- a/drivers/gpu/drm/drm_edid.c -+++ b/drivers/gpu/drm/drm_edid.c -@@ -1339,6 +1339,7 @@ MODULE_PARM_DESC(edid_fixup, - - static void drm_get_displayid(struct drm_connector *connector, - struct edid *edid); -+static int validate_displayid(u8 *displayid, int length, int idx); - - static int drm_edid_block_checksum(const u8 *raw_edid) - { -@@ -2922,16 +2923,46 @@ static u8 *drm_find_edid_extension(const struct edid *edid, int ext_id) - return edid_ext; - } - --static u8 *drm_find_cea_extension(const struct edid *edid) --{ -- return drm_find_edid_extension(edid, CEA_EXT); --} - - static u8 *drm_find_displayid_extension(const struct edid *edid) - { - return drm_find_edid_extension(edid, DISPLAYID_EXT); - } - -+static u8 *drm_find_cea_extension(const struct edid *edid) -+{ -+ int ret; -+ int idx = 1; -+ int length = EDID_LENGTH; -+ struct displayid_block *block; -+ u8 *cea; -+ u8 *displayid; -+ -+ /* Look for a top level CEA extension block */ -+ cea = drm_find_edid_extension(edid, CEA_EXT); -+ if (cea) -+ return cea; -+ -+ /* CEA blocks can also be found embedded in a DisplayID block */ -+ displayid = drm_find_displayid_extension(edid); -+ if (!displayid) -+ return NULL; -+ -+ ret = validate_displayid(displayid, length, idx); -+ if (ret) -+ return NULL; -+ -+ idx += sizeof(struct displayid_hdr); -+ for_each_displayid_db(displayid, block, idx, length) { -+ if (block->tag == DATA_BLOCK_CTA) { -+ cea = (u8 *)block; -+ break; -+ } -+ } -+ -+ return cea; -+} -+ - /* - * Calculate the alternate clock for the CEA mode - * (60Hz vs. 59.94Hz etc.) -@@ -3655,13 +3686,38 @@ cea_revision(const u8 *cea) - static int - cea_db_offsets(const u8 *cea, int *start, int *end) - { -- /* Data block offset in CEA extension block */ -- *start = 4; -- *end = cea[2]; -- if (*end == 0) -- *end = 127; -- if (*end < 4 || *end > 127) -- return -ERANGE; -+ /* DisplayID CTA extension blocks and top-level CEA EDID -+ * block header definitions differ in the following bytes: -+ * 1) Byte 2 of the header specifies length differently, -+ * 2) Byte 3 is only present in the CEA top level block. -+ * -+ * The different definitions for byte 2 follow. -+ * -+ * DisplayID CTA extension block defines byte 2 as: -+ * Number of payload bytes -+ * -+ * CEA EDID block defines byte 2 as: -+ * Byte number (decimal) within this block where the 18-byte -+ * DTDs begin. If no non-DTD data is present in this extension -+ * block, the value should be set to 04h (the byte after next). -+ * If set to 00h, there are no DTDs present in this block and -+ * no non-DTD data. -+ */ -+ if (cea[0] == DATA_BLOCK_CTA) { -+ *start = 3; -+ *end = *start + cea[2]; -+ } else if (cea[0] == CEA_EXT) { -+ /* Data block offset in CEA extension block */ -+ *start = 4; -+ *end = cea[2]; -+ if (*end == 0) -+ *end = 127; -+ if (*end < 4 || *end > 127) -+ return -ERANGE; -+ } else { -+ return -ENOTSUPP; -+ } -+ - return 0; - } - -@@ -5279,6 +5335,9 @@ static int drm_parse_display_id(struct drm_connector *connector, - case DATA_BLOCK_TYPE_1_DETAILED_TIMING: - /* handled in mode gathering code. */ - break; -+ case DATA_BLOCK_CTA: -+ /* handled in the cea parser code. */ -+ break; - default: - DRM_DEBUG_KMS("found DisplayID tag 0x%x, unhandled\n", block->tag); - break; -diff --git a/drivers/gpu/drm/drm_edid_load.c b/drivers/gpu/drm/drm_edid_load.c -index 1e5593575d23..6192b7b20d84 100644 ---- a/drivers/gpu/drm/drm_edid_load.c -+++ b/drivers/gpu/drm/drm_edid_load.c -@@ -278,6 +278,8 @@ struct edid *drm_load_edid_firmware(struct drm_connector *connector) - * the last one found one as a fallback. - */ - fwstr = kstrdup(edid_firmware, GFP_KERNEL); -+ if (!fwstr) -+ return ERR_PTR(-ENOMEM); - edidstr = fwstr; - - while ((edidname = strsep(&edidstr, ","))) { -diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c -index a68addf95c23..4a7cf8646b0d 100644 ---- a/drivers/gpu/drm/i915/gvt/kvmgt.c -+++ b/drivers/gpu/drm/i915/gvt/kvmgt.c -@@ -1904,6 +1904,18 @@ static int kvmgt_dma_map_guest_page(unsigned long handle, unsigned long gfn, - - entry = __gvt_cache_find_gfn(info->vgpu, gfn); - if (!entry) { -+ ret = gvt_dma_map_page(vgpu, gfn, dma_addr, size); -+ if (ret) -+ goto err_unlock; -+ -+ ret = __gvt_cache_add(info->vgpu, gfn, *dma_addr, size); -+ if (ret) -+ goto err_unmap; -+ } else if (entry->size != size) { -+ /* the same gfn with different size: unmap and re-map */ -+ gvt_dma_unmap_page(vgpu, gfn, entry->dma_addr, entry->size); -+ __gvt_cache_remove_entry(vgpu, entry); -+ - ret = gvt_dma_map_page(vgpu, gfn, dma_addr, size); - if (ret) - goto err_unlock; -diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c -index dc4ce694c06a..235aedc62b4c 100644 ---- a/drivers/gpu/drm/i915/i915_perf.c -+++ b/drivers/gpu/drm/i915/i915_perf.c -@@ -3457,9 +3457,13 @@ void i915_perf_init(struct drm_i915_private *dev_priv) - dev_priv->perf.oa.ops.enable_metric_set = gen8_enable_metric_set; - dev_priv->perf.oa.ops.disable_metric_set = gen10_disable_metric_set; - -- dev_priv->perf.oa.ctx_oactxctrl_offset = 0x128; -- dev_priv->perf.oa.ctx_flexeu0_offset = 0x3de; -- -+ if (IS_GEN(dev_priv, 10)) { -+ dev_priv->perf.oa.ctx_oactxctrl_offset = 0x128; -+ dev_priv->perf.oa.ctx_flexeu0_offset = 0x3de; -+ } else { -+ dev_priv->perf.oa.ctx_oactxctrl_offset = 0x124; -+ dev_priv->perf.oa.ctx_flexeu0_offset = 0x78e; -+ } - dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<16); - } - } -diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c -index c88e538b2ef4..81b48e273cbd 100644 ---- a/drivers/gpu/drm/i915/i915_request.c -+++ b/drivers/gpu/drm/i915/i915_request.c -@@ -443,7 +443,7 @@ void __i915_request_submit(struct i915_request *request) - */ - if (request->sched.semaphores && - i915_sw_fence_signaled(&request->semaphore)) -- request->hw_context->saturated |= request->sched.semaphores; -+ engine->saturated |= request->sched.semaphores; - - /* We may be recursing from the signal callback of another i915 fence */ - spin_lock_nested(&request->lock, SINGLE_DEPTH_NESTING); -@@ -829,7 +829,7 @@ already_busywaiting(struct i915_request *rq) - * - * See the are-we-too-late? check in __i915_request_submit(). - */ -- return rq->sched.semaphores | rq->hw_context->saturated; -+ return rq->sched.semaphores | rq->engine->saturated; - } - - static int -diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c -index 1dc8d03ff127..ee6fa75d65a2 100644 ---- a/drivers/gpu/drm/i915/intel_bios.c -+++ b/drivers/gpu/drm/i915/intel_bios.c -@@ -762,7 +762,7 @@ parse_psr(struct drm_i915_private *dev_priv, const struct bdb_header *bdb) - } - - if (bdb->version >= 226) { -- u32 wakeup_time = psr_table->psr2_tp2_tp3_wakeup_time; -+ u32 wakeup_time = psr->psr2_tp2_tp3_wakeup_time; - - wakeup_time = (wakeup_time >> (2 * panel_type)) & 0x3; - switch (wakeup_time) { -diff --git a/drivers/gpu/drm/i915/intel_context.c b/drivers/gpu/drm/i915/intel_context.c -index 924cc556223a..8931e0fee873 100644 ---- a/drivers/gpu/drm/i915/intel_context.c -+++ b/drivers/gpu/drm/i915/intel_context.c -@@ -230,7 +230,6 @@ intel_context_init(struct intel_context *ce, - ce->gem_context = ctx; - ce->engine = engine; - ce->ops = engine->cops; -- ce->saturated = 0; - - INIT_LIST_HEAD(&ce->signal_link); - INIT_LIST_HEAD(&ce->signals); -diff --git a/drivers/gpu/drm/i915/intel_context_types.h b/drivers/gpu/drm/i915/intel_context_types.h -index 339c7437fe82..fd47b9d49e09 100644 ---- a/drivers/gpu/drm/i915/intel_context_types.h -+++ b/drivers/gpu/drm/i915/intel_context_types.h -@@ -59,8 +59,6 @@ struct intel_context { - atomic_t pin_count; - struct mutex pin_mutex; /* guards pinning and associated on-gpuing */ - -- intel_engine_mask_t saturated; /* submitting semaphores too late? */ -- - /** - * active_tracker: Active tracker for the external rq activity - * on this intel_context object. -diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c -index eea9bec04f1b..9d4f12e982c3 100644 ---- a/drivers/gpu/drm/i915/intel_engine_cs.c -+++ b/drivers/gpu/drm/i915/intel_engine_cs.c -@@ -1200,6 +1200,7 @@ void intel_engines_park(struct drm_i915_private *i915) - - i915_gem_batch_pool_fini(&engine->batch_pool); - engine->execlists.no_priolist = false; -+ engine->saturated = 0; - } - - i915->gt.active_engines = 0; -diff --git a/drivers/gpu/drm/i915/intel_engine_types.h b/drivers/gpu/drm/i915/intel_engine_types.h -index 1f970c76b6a6..4270ddb45f41 100644 ---- a/drivers/gpu/drm/i915/intel_engine_types.h -+++ b/drivers/gpu/drm/i915/intel_engine_types.h -@@ -285,6 +285,8 @@ struct intel_engine_cs { - struct intel_context *kernel_context; /* pinned */ - struct intel_context *preempt_context; /* pinned; optional */ - -+ intel_engine_mask_t saturated; /* submitting semaphores too late? */ -+ - struct drm_i915_gem_object *default_state; - void *pinned_default_state; - -diff --git a/drivers/gpu/drm/i915/intel_vbt_defs.h b/drivers/gpu/drm/i915/intel_vbt_defs.h -index fdbbb9a53804..796c070bbe6f 100644 ---- a/drivers/gpu/drm/i915/intel_vbt_defs.h -+++ b/drivers/gpu/drm/i915/intel_vbt_defs.h -@@ -772,13 +772,13 @@ struct psr_table { - /* TP wake up time in multiple of 100 */ - u16 tp1_wakeup_time; - u16 tp2_tp3_wakeup_time; -- -- /* PSR2 TP2/TP3 wakeup time for 16 panels */ -- u32 psr2_tp2_tp3_wakeup_time; - } __packed; - - struct bdb_psr { - struct psr_table psr_table[16]; -+ -+ /* PSR2 TP2/TP3 wakeup time for 16 panels */ -+ u32 psr2_tp2_tp3_wakeup_time; - } __packed; - - /* -diff --git a/drivers/gpu/drm/lima/lima_pp.c b/drivers/gpu/drm/lima/lima_pp.c -index d29721e177bf..8fef224b93c8 100644 ---- a/drivers/gpu/drm/lima/lima_pp.c -+++ b/drivers/gpu/drm/lima/lima_pp.c -@@ -64,7 +64,13 @@ static irqreturn_t lima_pp_bcast_irq_handler(int irq, void *data) - struct lima_ip *pp_bcast = data; - struct lima_device *dev = pp_bcast->dev; - struct lima_sched_pipe *pipe = dev->pipe + lima_pipe_pp; -- struct drm_lima_m450_pp_frame *frame = pipe->current_task->frame; -+ struct drm_lima_m450_pp_frame *frame; -+ -+ /* for shared irq case */ -+ if (!pipe->current_task) -+ return IRQ_NONE; -+ -+ frame = pipe->current_task->frame; - - for (i = 0; i < frame->num_pp; i++) { - struct lima_ip *ip = pipe->processor[i]; -diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c -index 38e2cfa9cec7..6910d0468e3c 100644 ---- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c -+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c -@@ -74,7 +74,7 @@ bool a6xx_gmu_sptprac_is_on(struct a6xx_gmu *gmu) - u32 val; - - /* This can be called from gpu state code so make sure GMU is valid */ -- if (IS_ERR_OR_NULL(gmu->mmio)) -+ if (!gmu->initialized) - return false; - - val = gmu_read(gmu, REG_A6XX_GMU_SPTPRAC_PWR_CLK_STATUS); -@@ -90,7 +90,7 @@ bool a6xx_gmu_gx_is_on(struct a6xx_gmu *gmu) - u32 val; - - /* This can be called from gpu state code so make sure GMU is valid */ -- if (IS_ERR_OR_NULL(gmu->mmio)) -+ if (!gmu->initialized) - return false; - - val = gmu_read(gmu, REG_A6XX_GMU_SPTPRAC_PWR_CLK_STATUS); -@@ -504,8 +504,10 @@ static void a6xx_gmu_rpmh_init(struct a6xx_gmu *gmu) - wmb(); - - err: -- devm_iounmap(gmu->dev, pdcptr); -- devm_iounmap(gmu->dev, seqptr); -+ if (!IS_ERR_OR_NULL(pdcptr)) -+ devm_iounmap(gmu->dev, pdcptr); -+ if (!IS_ERR_OR_NULL(seqptr)) -+ devm_iounmap(gmu->dev, seqptr); - } - - /* -@@ -695,7 +697,7 @@ int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu) - struct a6xx_gmu *gmu = &a6xx_gpu->gmu; - int status, ret; - -- if (WARN(!gmu->mmio, "The GMU is not set up yet\n")) -+ if (WARN(!gmu->initialized, "The GMU is not set up yet\n")) - return 0; - - gmu->hung = false; -@@ -765,7 +767,7 @@ bool a6xx_gmu_isidle(struct a6xx_gmu *gmu) - { - u32 reg; - -- if (!gmu->mmio) -+ if (!gmu->initialized) - return true; - - reg = gmu_read(gmu, REG_A6XX_GPU_GMU_AO_GPU_CX_BUSY_STATUS); -@@ -1227,7 +1229,7 @@ void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu) - { - struct a6xx_gmu *gmu = &a6xx_gpu->gmu; - -- if (IS_ERR_OR_NULL(gmu->mmio)) -+ if (!gmu->initialized) - return; - - a6xx_gmu_stop(a6xx_gpu); -@@ -1245,6 +1247,8 @@ void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu) - iommu_detach_device(gmu->domain, gmu->dev); - - iommu_domain_free(gmu->domain); -+ -+ gmu->initialized = false; - } - - int a6xx_gmu_probe(struct a6xx_gpu *a6xx_gpu, struct device_node *node) -@@ -1309,6 +1313,8 @@ int a6xx_gmu_probe(struct a6xx_gpu *a6xx_gpu, struct device_node *node) - /* Set up the HFI queues */ - a6xx_hfi_init(gmu); - -+ gmu->initialized = true; -+ - return 0; - err: - a6xx_gmu_memory_free(gmu, gmu->hfi); -diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h -index bedd8e6a63aa..39a26dd63674 100644 ---- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h -+++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h -@@ -75,6 +75,7 @@ struct a6xx_gmu { - - struct a6xx_hfi_queue queues[2]; - -+ bool initialized; - bool hung; - }; - -diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c -index a9c0ac937b00..9acbbc0f3232 100644 ---- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c -+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c -@@ -56,7 +56,6 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname, - return ret; - - mem_phys = r.start; -- mem_size = resource_size(&r); - - /* Request the MDT file for the firmware */ - fw = adreno_request_fw(to_adreno_gpu(gpu), fwname); -@@ -72,6 +71,13 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname, - goto out; - } - -+ if (mem_size > resource_size(&r)) { -+ DRM_DEV_ERROR(dev, -+ "memory region is too small to load the MDT\n"); -+ ret = -E2BIG; -+ goto out; -+ } -+ - /* Allocate memory for the firmware image */ - mem_region = memremap(mem_phys, mem_size, MEMREMAP_WC); - if (!mem_region) { -diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c -index f38d7367bd3b..4a0fe8a25ad7 100644 ---- a/drivers/gpu/drm/msm/msm_drv.c -+++ b/drivers/gpu/drm/msm/msm_drv.c -@@ -1306,16 +1306,24 @@ static int msm_pdev_probe(struct platform_device *pdev) - - ret = add_gpu_components(&pdev->dev, &match); - if (ret) -- return ret; -+ goto fail; - - /* on all devices that I am aware of, iommu's which can map - * any address the cpu can see are used: - */ - ret = dma_set_mask_and_coherent(&pdev->dev, ~0); - if (ret) -- return ret; -+ goto fail; -+ -+ ret = component_master_add_with_match(&pdev->dev, &msm_drm_ops, match); -+ if (ret) -+ goto fail; - -- return component_master_add_with_match(&pdev->dev, &msm_drm_ops, match); -+ return 0; -+ -+fail: -+ of_platform_depopulate(&pdev->dev); -+ return ret; - } - - static int msm_pdev_remove(struct platform_device *pdev) -diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c -index 4b1650f51955..847b7866137d 100644 ---- a/drivers/gpu/drm/nouveau/dispnv50/disp.c -+++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c -@@ -775,7 +775,7 @@ nv50_msto_atomic_check(struct drm_encoder *encoder, - drm_dp_calc_pbn_mode(crtc_state->adjusted_mode.clock, - connector->display_info.bpc * 3); - -- if (drm_atomic_crtc_needs_modeset(crtc_state)) { -+ if (crtc_state->mode_changed) { - slots = drm_dp_atomic_find_vcpi_slots(state, &mstm->mgr, - mstc->port, - asyh->dp.pbn); -diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c -index 4116ee62adaf..f69ff22beee0 100644 ---- a/drivers/gpu/drm/nouveau/nouveau_connector.c -+++ b/drivers/gpu/drm/nouveau/nouveau_connector.c -@@ -252,7 +252,7 @@ nouveau_conn_reset(struct drm_connector *connector) - return; - - if (connector->state) -- __drm_atomic_helper_connector_destroy_state(connector->state); -+ nouveau_conn_atomic_destroy_state(connector, connector->state); - __drm_atomic_helper_connector_reset(connector, &asyc->state); - asyc->dither.mode = DITHERING_MODE_AUTO; - asyc->dither.depth = DITHERING_DEPTH_AUTO; -diff --git a/drivers/gpu/drm/nouveau/nouveau_dmem.c b/drivers/gpu/drm/nouveau/nouveau_dmem.c -index 40c47d6a7d78..745e197a4775 100644 ---- a/drivers/gpu/drm/nouveau/nouveau_dmem.c -+++ b/drivers/gpu/drm/nouveau/nouveau_dmem.c -@@ -385,9 +385,10 @@ nouveau_dmem_pages_alloc(struct nouveau_drm *drm, - ret = nouveau_dmem_chunk_alloc(drm); - if (ret) { - if (c) -- break; -+ return 0; - return ret; - } -+ mutex_lock(&drm->dmem->mutex); - continue; - } - -diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c -index ecacb22834d7..719345074711 100644 ---- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c -+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c -@@ -184,6 +184,25 @@ nvkm_i2c_fini(struct nvkm_subdev *subdev, bool suspend) - return 0; - } - -+static int -+nvkm_i2c_preinit(struct nvkm_subdev *subdev) -+{ -+ struct nvkm_i2c *i2c = nvkm_i2c(subdev); -+ struct nvkm_i2c_bus *bus; -+ struct nvkm_i2c_pad *pad; -+ -+ /* -+ * We init our i2c busses as early as possible, since they may be -+ * needed by the vbios init scripts on some cards -+ */ -+ list_for_each_entry(pad, &i2c->pad, head) -+ nvkm_i2c_pad_init(pad); -+ list_for_each_entry(bus, &i2c->bus, head) -+ nvkm_i2c_bus_init(bus); -+ -+ return 0; -+} -+ - static int - nvkm_i2c_init(struct nvkm_subdev *subdev) - { -@@ -238,6 +257,7 @@ nvkm_i2c_dtor(struct nvkm_subdev *subdev) - static const struct nvkm_subdev_func - nvkm_i2c = { - .dtor = nvkm_i2c_dtor, -+ .preinit = nvkm_i2c_preinit, - .init = nvkm_i2c_init, - .fini = nvkm_i2c_fini, - .intr = nvkm_i2c_intr, -diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c -index 8712af79a49c..4c43dd282acc 100644 ---- a/drivers/gpu/drm/omapdrm/omap_crtc.c -+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c -@@ -384,10 +384,20 @@ static enum drm_mode_status omap_crtc_mode_valid(struct drm_crtc *crtc, - int r; - - drm_display_mode_to_videomode(mode, &vm); -- r = priv->dispc_ops->mgr_check_timings(priv->dispc, omap_crtc->channel, -- &vm); -- if (r) -- return r; -+ -+ /* -+ * DSI might not call this, since the supplied mode is not a -+ * valid DISPC mode. DSI will calculate and configure the -+ * proper DISPC mode later. -+ */ -+ if (omap_crtc->pipe->output->next == NULL || -+ omap_crtc->pipe->output->next->type != OMAP_DISPLAY_TYPE_DSI) { -+ r = priv->dispc_ops->mgr_check_timings(priv->dispc, -+ omap_crtc->channel, -+ &vm); -+ if (r) -+ return r; -+ } - - /* Check for bandwidth limit */ - if (priv->max_bandwidth) { -diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c -index 569be4efd8d1..397a3086eac8 100644 ---- a/drivers/gpu/drm/panel/panel-simple.c -+++ b/drivers/gpu/drm/panel/panel-simple.c -@@ -446,6 +446,32 @@ static const struct panel_desc ampire_am800480r3tmqwa1h = { - .bus_format = MEDIA_BUS_FMT_RGB666_1X18, - }; - -+static const struct display_timing santek_st0700i5y_rbslw_f_timing = { -+ .pixelclock = { 26400000, 33300000, 46800000 }, -+ .hactive = { 800, 800, 800 }, -+ .hfront_porch = { 16, 210, 354 }, -+ .hback_porch = { 45, 36, 6 }, -+ .hsync_len = { 1, 10, 40 }, -+ .vactive = { 480, 480, 480 }, -+ .vfront_porch = { 7, 22, 147 }, -+ .vback_porch = { 22, 13, 3 }, -+ .vsync_len = { 1, 10, 20 }, -+ .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW | -+ DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE -+}; -+ -+static const struct panel_desc armadeus_st0700_adapt = { -+ .timings = &santek_st0700i5y_rbslw_f_timing, -+ .num_timings = 1, -+ .bpc = 6, -+ .size = { -+ .width = 154, -+ .height = 86, -+ }, -+ .bus_format = MEDIA_BUS_FMT_RGB666_1X18, -+ .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_POSEDGE, -+}; -+ - static const struct drm_display_mode auo_b101aw03_mode = { - .clock = 51450, - .hdisplay = 1024, -@@ -2570,6 +2596,9 @@ static const struct of_device_id platform_of_match[] = { - }, { - .compatible = "arm,rtsm-display", - .data = &arm_rtsm, -+ }, { -+ .compatible = "armadeus,st0700-adapt", -+ .data = &armadeus_st0700_adapt, - }, { - .compatible = "auo,b101aw03", - .data = &auo_b101aw03, -@@ -3098,7 +3127,14 @@ static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi) - dsi->format = desc->format; - dsi->lanes = desc->lanes; - -- return mipi_dsi_attach(dsi); -+ err = mipi_dsi_attach(dsi); -+ if (err) { -+ struct panel_simple *panel = dev_get_drvdata(&dsi->dev); -+ -+ drm_panel_remove(&panel->base); -+ } -+ -+ return err; - } - - static int panel_simple_dsi_remove(struct mipi_dsi_device *dsi) -diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c -index 12ed5265a90b..09046135e720 100644 ---- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c -+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c -@@ -1011,7 +1011,8 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc, - struct vop *vop = to_vop(crtc); - - adjusted_mode->clock = -- clk_round_rate(vop->dclk, mode->clock * 1000) / 1000; -+ DIV_ROUND_UP(clk_round_rate(vop->dclk, mode->clock * 1000), -+ 1000); - - return true; - } -diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h -index b69ae10ca238..d724fb3de44e 100644 ---- a/drivers/gpu/drm/virtio/virtgpu_drv.h -+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h -@@ -102,7 +102,6 @@ struct virtio_gpu_fence { - struct dma_fence f; - struct virtio_gpu_fence_driver *drv; - struct list_head node; -- uint64_t seq; - }; - #define to_virtio_fence(x) \ - container_of(x, struct virtio_gpu_fence, f) -diff --git a/drivers/gpu/drm/virtio/virtgpu_fence.c b/drivers/gpu/drm/virtio/virtgpu_fence.c -index 87d1966192f4..72b4f7561432 100644 ---- a/drivers/gpu/drm/virtio/virtgpu_fence.c -+++ b/drivers/gpu/drm/virtio/virtgpu_fence.c -@@ -40,16 +40,14 @@ bool virtio_fence_signaled(struct dma_fence *f) - { - struct virtio_gpu_fence *fence = to_virtio_fence(f); - -- if (atomic64_read(&fence->drv->last_seq) >= fence->seq) -+ if (atomic64_read(&fence->drv->last_seq) >= fence->f.seqno) - return true; - return false; - } - - static void virtio_fence_value_str(struct dma_fence *f, char *str, int size) - { -- struct virtio_gpu_fence *fence = to_virtio_fence(f); -- -- snprintf(str, size, "%llu", fence->seq); -+ snprintf(str, size, "%llu", f->seqno); - } - - static void virtio_timeline_value_str(struct dma_fence *f, char *str, int size) -@@ -76,6 +74,11 @@ struct virtio_gpu_fence *virtio_gpu_fence_alloc(struct virtio_gpu_device *vgdev) - return fence; - - fence->drv = drv; -+ -+ /* This only partially initializes the fence because the seqno is -+ * unknown yet. The fence must not be used outside of the driver -+ * until virtio_gpu_fence_emit is called. -+ */ - dma_fence_init(&fence->f, &virtio_fence_ops, &drv->lock, drv->context, 0); - - return fence; -@@ -89,13 +92,13 @@ int virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev, - unsigned long irq_flags; - - spin_lock_irqsave(&drv->lock, irq_flags); -- fence->seq = ++drv->sync_seq; -+ fence->f.seqno = ++drv->sync_seq; - dma_fence_get(&fence->f); - list_add_tail(&fence->node, &drv->fences); - spin_unlock_irqrestore(&drv->lock, irq_flags); - - cmd_hdr->flags |= cpu_to_le32(VIRTIO_GPU_FLAG_FENCE); -- cmd_hdr->fence_id = cpu_to_le64(fence->seq); -+ cmd_hdr->fence_id = cpu_to_le64(fence->f.seqno); - return 0; - } - -@@ -109,7 +112,7 @@ void virtio_gpu_fence_event_process(struct virtio_gpu_device *vgdev, - spin_lock_irqsave(&drv->lock, irq_flags); - atomic64_set(&vgdev->fence_drv.last_seq, last_seq); - list_for_each_entry_safe(fence, tmp, &drv->fences, node) { -- if (last_seq < fence->seq) -+ if (last_seq < fence->f.seqno) - continue; - dma_fence_signal_locked(&fence->f); - list_del(&fence->node); -diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c -index 949a264985fc..19fbffd0f7a3 100644 ---- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c -+++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c -@@ -542,6 +542,9 @@ static int virtio_gpu_get_caps_ioctl(struct drm_device *dev, - if (!ret) - return -EBUSY; - -+ /* is_valid check must proceed before copy of the cache entry. */ -+ smp_rmb(); -+ - ptr = cache_ent->caps_cache; - - copy_exit: -diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c -index 5bb0f0a084e9..a7684f9c80db 100644 ---- a/drivers/gpu/drm/virtio/virtgpu_vq.c -+++ b/drivers/gpu/drm/virtio/virtgpu_vq.c -@@ -583,6 +583,8 @@ static void virtio_gpu_cmd_capset_cb(struct virtio_gpu_device *vgdev, - cache_ent->id == le32_to_cpu(cmd->capset_id)) { - memcpy(cache_ent->caps_cache, resp->capset_data, - cache_ent->size); -+ /* Copy must occur before is_valid is signalled. */ -+ smp_wmb(); - atomic_set(&cache_ent->is_valid, 1); - break; - } -diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c -index bb66dbcd5e3f..e447b7588d06 100644 ---- a/drivers/gpu/drm/vkms/vkms_crtc.c -+++ b/drivers/gpu/drm/vkms/vkms_crtc.c -@@ -15,6 +15,10 @@ static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) - - spin_lock(&output->lock); - -+ ret_overrun = hrtimer_forward_now(&output->vblank_hrtimer, -+ output->period_ns); -+ WARN_ON(ret_overrun != 1); -+ - ret = drm_crtc_handle_vblank(crtc); - if (!ret) - DRM_ERROR("vkms failure on handling vblank"); -@@ -35,10 +39,6 @@ static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) - DRM_WARN("failed to queue vkms_crc_work_handle"); - } - -- ret_overrun = hrtimer_forward_now(&output->vblank_hrtimer, -- output->period_ns); -- WARN_ON(ret_overrun != 1); -- - spin_unlock(&output->lock); - - return HRTIMER_RESTART; -@@ -74,11 +74,21 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe, - { - struct vkms_device *vkmsdev = drm_device_to_vkms_device(dev); - struct vkms_output *output = &vkmsdev->output; -+ struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; - - *vblank_time = output->vblank_hrtimer.node.expires; - -- if (!in_vblank_irq) -- *vblank_time -= output->period_ns; -+ if (WARN_ON(*vblank_time == vblank->time)) -+ return true; -+ -+ /* -+ * To prevent races we roll the hrtimer forward before we do any -+ * interrupt processing - this is how real hw works (the interrupt is -+ * only generated after all the vblank registers are updated) and what -+ * the vblank core expects. Therefore we need to always correct the -+ * timestampe by one frame. -+ */ -+ *vblank_time -= output->period_ns; - - return true; - } -diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c -index ff3586cb6851..e1539c9294a4 100644 ---- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c -+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c -@@ -235,7 +235,7 @@ static int vmw_fifo_wait_noirq(struct vmw_private *dev_priv, - DRM_ERROR("SVGA device lockup.\n"); - break; - } -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - if (interruptible && signal_pending(current)) { - ret = -ERESTARTSYS; - break; -diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c -index c3ad4478266b..7e2a29d56459 100644 ---- a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c -+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c -@@ -202,7 +202,7 @@ int vmw_fallback_wait(struct vmw_private *dev_priv, - break; - } - if (lazy) -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - else if ((++count & 0x0F) == 0) { - /** - * FIXME: Use schedule_hr_timeout here for -diff --git a/drivers/gpu/host1x/bus.c b/drivers/gpu/host1x/bus.c -index 9797ccb0a073..6387302c1245 100644 ---- a/drivers/gpu/host1x/bus.c -+++ b/drivers/gpu/host1x/bus.c -@@ -414,6 +414,9 @@ static int host1x_device_add(struct host1x *host1x, - - of_dma_configure(&device->dev, host1x->dev->of_node, true); - -+ device->dev.dma_parms = &device->dma_parms; -+ dma_set_max_seg_size(&device->dev, SZ_4M); -+ - err = host1x_device_parse_dt(device, driver); - if (err < 0) { - kfree(device); -diff --git a/drivers/gpu/ipu-v3/ipu-ic.c b/drivers/gpu/ipu-v3/ipu-ic.c -index 89c3961f0fce..3428b0e72bc5 100644 ---- a/drivers/gpu/ipu-v3/ipu-ic.c -+++ b/drivers/gpu/ipu-v3/ipu-ic.c -@@ -251,7 +251,7 @@ static int init_csc(struct ipu_ic *ic, - writel(param, base++); - - param = ((a[0] & 0x1fe0) >> 5) | (params->scale << 8) | -- (params->sat << 9); -+ (params->sat << 10); - writel(param, base++); - - param = ((a[1] & 0x1f) << 27) | ((c[0][1] & 0x1ff) << 18) | -diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h -index b032d3899fa3..34a812025b94 100644 ---- a/drivers/hid/hid-ids.h -+++ b/drivers/hid/hid-ids.h -@@ -568,6 +568,7 @@ - #define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A 0x0b4a - #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE 0x134a - #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_094A 0x094a -+#define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0641 0x0641 - - #define USB_VENDOR_ID_HUION 0x256c - #define USB_DEVICE_ID_HUION_TABLET 0x006e -@@ -1241,6 +1242,7 @@ - #define USB_DEVICE_ID_PRIMAX_KEYBOARD 0x4e05 - #define USB_DEVICE_ID_PRIMAX_REZEL 0x4e72 - #define USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4D0F 0x4d0f -+#define USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4D65 0x4d65 - #define USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4E22 0x4e22 - - -diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c -index 671a285724f9..5b669f7d653f 100644 ---- a/drivers/hid/hid-quirks.c -+++ b/drivers/hid/hid-quirks.c -@@ -91,6 +91,7 @@ static const struct hid_device_id hid_quirks[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A), HID_QUIRK_ALWAYS_POLL }, - { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL }, - { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_094A), HID_QUIRK_ALWAYS_POLL }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0641), HID_QUIRK_ALWAYS_POLL }, - { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680), HID_QUIRK_MULTI_INPUT }, - { HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT }, - { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X), HID_QUIRK_MULTI_INPUT }, -@@ -130,6 +131,7 @@ static const struct hid_device_id hid_quirks[] = { - { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL }, - { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_MOUSE_4D22), HID_QUIRK_ALWAYS_POLL }, - { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4D0F), HID_QUIRK_ALWAYS_POLL }, -+ { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4D65), HID_QUIRK_ALWAYS_POLL }, - { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4E22), HID_QUIRK_ALWAYS_POLL }, - { HID_USB_DEVICE(USB_VENDOR_ID_PRODIGE, USB_DEVICE_ID_PRODIGE_CORDLESS), HID_QUIRK_NOGET }, - { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001), HID_QUIRK_NOGET }, -diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c -index 83dd3a2a7316..3299b1474d1b 100644 ---- a/drivers/hid/wacom_sys.c -+++ b/drivers/hid/wacom_sys.c -@@ -304,6 +304,9 @@ static void wacom_feature_mapping(struct hid_device *hdev, - wacom_hid_usage_quirk(hdev, field, usage); - - switch (equivalent_usage) { -+ case WACOM_HID_WD_TOUCH_RING_SETTING: -+ wacom->generic_has_leds = true; -+ break; - case HID_DG_CONTACTMAX: - /* leave touch_max as is if predefined */ - if (!features->touch_max) { -diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c -index 43f6da357165..926c597f5f46 100644 ---- a/drivers/hid/wacom_wac.c -+++ b/drivers/hid/wacom_wac.c -@@ -533,14 +533,14 @@ static int wacom_intuos_pad(struct wacom_wac *wacom) - */ - buttons = (data[4] << 1) | (data[3] & 0x01); - } else if (features->type == CINTIQ_COMPANION_2) { -- /* d-pad right -> data[4] & 0x10 -- * d-pad up -> data[4] & 0x20 -- * d-pad left -> data[4] & 0x40 -- * d-pad down -> data[4] & 0x80 -- * d-pad center -> data[3] & 0x01 -+ /* d-pad right -> data[2] & 0x10 -+ * d-pad up -> data[2] & 0x20 -+ * d-pad left -> data[2] & 0x40 -+ * d-pad down -> data[2] & 0x80 -+ * d-pad center -> data[1] & 0x01 - */ - buttons = ((data[2] >> 4) << 7) | -- ((data[1] & 0x04) << 6) | -+ ((data[1] & 0x04) << 4) | - ((data[2] & 0x0F) << 2) | - (data[1] & 0x03); - } else if (features->type >= INTUOS5S && features->type <= INTUOSPL) { -@@ -1926,8 +1926,6 @@ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev, - features->device_type |= WACOM_DEVICETYPE_PAD; - break; - case WACOM_HID_WD_BUTTONCENTER: -- wacom->generic_has_leds = true; -- /* fall through */ - case WACOM_HID_WD_BUTTONHOME: - case WACOM_HID_WD_BUTTONUP: - case WACOM_HID_WD_BUTTONDOWN: -@@ -2119,14 +2117,12 @@ static void wacom_wac_pad_report(struct hid_device *hdev, - bool active = wacom_wac->hid_data.inrange_state != 0; - - /* report prox for expresskey events */ -- if ((wacom_equivalent_usage(field->physical) == HID_DG_TABLETFUNCTIONKEY) && -- wacom_wac->hid_data.pad_input_event_flag) { -+ if (wacom_wac->hid_data.pad_input_event_flag) { - input_event(input, EV_ABS, ABS_MISC, active ? PAD_DEVICE_ID : 0); - input_sync(input); - if (!active) - wacom_wac->hid_data.pad_input_event_flag = false; - } -- - } - - static void wacom_wac_pen_usage_mapping(struct hid_device *hdev, -@@ -2702,9 +2698,7 @@ static int wacom_wac_collection(struct hid_device *hdev, struct hid_report *repo - if (report->type != HID_INPUT_REPORT) - return -1; - -- if (WACOM_PAD_FIELD(field) && wacom->wacom_wac.pad_input) -- wacom_wac_pad_report(hdev, report, field); -- else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) -+ if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) - wacom_wac_pen_report(hdev, report); - else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input) - wacom_wac_finger_report(hdev, report); -@@ -2718,7 +2712,7 @@ void wacom_wac_report(struct hid_device *hdev, struct hid_report *report) - struct wacom_wac *wacom_wac = &wacom->wacom_wac; - struct hid_field *field; - bool pad_in_hid_field = false, pen_in_hid_field = false, -- finger_in_hid_field = false; -+ finger_in_hid_field = false, true_pad = false; - int r; - int prev_collection = -1; - -@@ -2734,6 +2728,8 @@ void wacom_wac_report(struct hid_device *hdev, struct hid_report *report) - pen_in_hid_field = true; - if (WACOM_FINGER_FIELD(field)) - finger_in_hid_field = true; -+ if (wacom_equivalent_usage(field->physical) == HID_DG_TABLETFUNCTIONKEY) -+ true_pad = true; - } - - wacom_wac_battery_pre_report(hdev, report); -@@ -2757,6 +2753,9 @@ void wacom_wac_report(struct hid_device *hdev, struct hid_report *report) - } - - wacom_wac_battery_report(hdev, report); -+ -+ if (true_pad && wacom->wacom_wac.pad_input) -+ wacom_wac_pad_report(hdev, report, field); - } - - static int wacom_bpt_touch(struct wacom_wac *wacom) -@@ -3713,7 +3712,7 @@ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev, - 0, 5920, 4, 0); - } - input_abs_set_res(input_dev, ABS_MT_POSITION_X, 40); -- input_abs_set_res(input_dev, ABS_MT_POSITION_X, 40); -+ input_abs_set_res(input_dev, ABS_MT_POSITION_Y, 40); - - /* fall through */ - -diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h -index cac68d1c20c5..420a19bfaae3 100644 ---- a/drivers/hid/wacom_wac.h -+++ b/drivers/hid/wacom_wac.h -@@ -141,6 +141,7 @@ - #define WACOM_HID_WD_OFFSETBOTTOM (WACOM_HID_UP_WACOMDIGITIZER | 0x0d33) - #define WACOM_HID_WD_DATAMODE (WACOM_HID_UP_WACOMDIGITIZER | 0x1002) - #define WACOM_HID_WD_DIGITIZERINFO (WACOM_HID_UP_WACOMDIGITIZER | 0x1013) -+#define WACOM_HID_WD_TOUCH_RING_SETTING (WACOM_HID_UP_WACOMDIGITIZER | 0x1032) - #define WACOM_HID_UP_G9 0xff090000 - #define WACOM_HID_G9_PEN (WACOM_HID_UP_G9 | 0x02) - #define WACOM_HID_G9_TOUCHSCREEN (WACOM_HID_UP_G9 | 0x11) -diff --git a/drivers/hwmon/fam15h_power.c b/drivers/hwmon/fam15h_power.c -index 267eac00a3fb..352af68c6cd7 100644 ---- a/drivers/hwmon/fam15h_power.c -+++ b/drivers/hwmon/fam15h_power.c -@@ -225,7 +225,7 @@ static ssize_t power1_average_show(struct device *dev, - prev_ptsc[cu] = data->cpu_sw_pwr_ptsc[cu]; - } - -- leftover = schedule_timeout_interruptible(msecs_to_jiffies(data->power_period)); -+ leftover = schedule_msec_hrtimeout_interruptible((data->power_period)); - if (leftover) - return 0; - -diff --git a/drivers/hwtracing/coresight/coresight-etb10.c b/drivers/hwtracing/coresight/coresight-etb10.c -index 4ee4c80a4354..543cc3d36e1d 100644 ---- a/drivers/hwtracing/coresight/coresight-etb10.c -+++ b/drivers/hwtracing/coresight/coresight-etb10.c -@@ -373,12 +373,10 @@ static void *etb_alloc_buffer(struct coresight_device *csdev, - struct perf_event *event, void **pages, - int nr_pages, bool overwrite) - { -- int node, cpu = event->cpu; -+ int node; - struct cs_buffers *buf; - -- if (cpu == -1) -- cpu = smp_processor_id(); -- node = cpu_to_node(cpu); -+ node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu); - - buf = kzalloc_node(sizeof(struct cs_buffers), GFP_KERNEL, node); - if (!buf) -diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c -index 3c6294432748..1ef098ff27c3 100644 ---- a/drivers/hwtracing/coresight/coresight-etm-perf.c -+++ b/drivers/hwtracing/coresight/coresight-etm-perf.c -@@ -544,6 +544,7 @@ int etm_perf_add_symlink_sink(struct coresight_device *csdev) - /* See function coresight_get_sink_by_id() to know where this is used */ - hash = hashlen_hash(hashlen_string(NULL, name)); - -+ sysfs_attr_init(&ea->attr.attr); - ea->attr.attr.name = devm_kstrdup(pdev, name, GFP_KERNEL); - if (!ea->attr.attr.name) - return -ENOMEM; -diff --git a/drivers/hwtracing/coresight/coresight-funnel.c b/drivers/hwtracing/coresight/coresight-funnel.c -index 16b0c0e1e43a..ad6e16c96263 100644 ---- a/drivers/hwtracing/coresight/coresight-funnel.c -+++ b/drivers/hwtracing/coresight/coresight-funnel.c -@@ -241,6 +241,7 @@ static int funnel_probe(struct device *dev, struct resource *res) - } - - pm_runtime_put(dev); -+ ret = 0; - - out_disable_clk: - if (ret && !IS_ERR_OR_NULL(drvdata->atclk)) -diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c -index 2527b5d3b65e..8de109de171f 100644 ---- a/drivers/hwtracing/coresight/coresight-tmc-etf.c -+++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c -@@ -378,12 +378,10 @@ static void *tmc_alloc_etf_buffer(struct coresight_device *csdev, - struct perf_event *event, void **pages, - int nr_pages, bool overwrite) - { -- int node, cpu = event->cpu; -+ int node; - struct cs_buffers *buf; - -- if (cpu == -1) -- cpu = smp_processor_id(); -- node = cpu_to_node(cpu); -+ node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu); - - /* Allocate memory structure for interaction with Perf */ - buf = kzalloc_node(sizeof(struct cs_buffers), GFP_KERNEL, node); -diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c -index df6e4b0b84e9..9f293b9dce8c 100644 ---- a/drivers/hwtracing/coresight/coresight-tmc-etr.c -+++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c -@@ -1178,14 +1178,11 @@ static struct etr_buf * - alloc_etr_buf(struct tmc_drvdata *drvdata, struct perf_event *event, - int nr_pages, void **pages, bool snapshot) - { -- int node, cpu = event->cpu; -+ int node; - struct etr_buf *etr_buf; - unsigned long size; - -- if (cpu == -1) -- cpu = smp_processor_id(); -- node = cpu_to_node(cpu); -- -+ node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu); - /* - * Try to match the perf ring buffer size if it is larger - * than the size requested via sysfs. -@@ -1317,13 +1314,11 @@ static struct etr_perf_buffer * - tmc_etr_setup_perf_buf(struct tmc_drvdata *drvdata, struct perf_event *event, - int nr_pages, void **pages, bool snapshot) - { -- int node, cpu = event->cpu; -+ int node; - struct etr_buf *etr_buf; - struct etr_perf_buffer *etr_perf; - -- if (cpu == -1) -- cpu = smp_processor_id(); -- node = cpu_to_node(cpu); -+ node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu); - - etr_perf = kzalloc_node(sizeof(*etr_perf), GFP_KERNEL, node); - if (!etr_perf) -diff --git a/drivers/hwtracing/intel_th/msu.c b/drivers/hwtracing/intel_th/msu.c -index 81bb54fa3ce8..cfd48c81b9d9 100644 ---- a/drivers/hwtracing/intel_th/msu.c -+++ b/drivers/hwtracing/intel_th/msu.c -@@ -667,7 +667,7 @@ static int msc_buffer_contig_alloc(struct msc *msc, unsigned long size) - goto err_out; - - ret = -ENOMEM; -- page = alloc_pages(GFP_KERNEL | __GFP_ZERO, order); -+ page = alloc_pages(GFP_KERNEL | __GFP_ZERO | GFP_DMA32, order); - if (!page) - goto err_free_sgt; - -@@ -767,6 +767,30 @@ static int __msc_buffer_win_alloc(struct msc_window *win, - return -ENOMEM; - } - -+#ifdef CONFIG_X86 -+static void msc_buffer_set_uc(struct msc_window *win, unsigned int nr_blocks) -+{ -+ int i; -+ -+ for (i = 0; i < nr_blocks; i++) -+ /* Set the page as uncached */ -+ set_memory_uc((unsigned long)msc_win_block(win, i), 1); -+} -+ -+static void msc_buffer_set_wb(struct msc_window *win) -+{ -+ int i; -+ -+ for (i = 0; i < win->nr_blocks; i++) -+ /* Reset the page to write-back */ -+ set_memory_wb((unsigned long)msc_win_block(win, i), 1); -+} -+#else /* !X86 */ -+static inline void -+msc_buffer_set_uc(struct msc_window *win, unsigned int nr_blocks) {} -+static inline void msc_buffer_set_wb(struct msc_window *win) {} -+#endif /* CONFIG_X86 */ -+ - /** - * msc_buffer_win_alloc() - alloc a window for a multiblock mode - * @msc: MSC device -@@ -780,7 +804,7 @@ static int __msc_buffer_win_alloc(struct msc_window *win, - static int msc_buffer_win_alloc(struct msc *msc, unsigned int nr_blocks) - { - struct msc_window *win; -- int ret = -ENOMEM, i; -+ int ret = -ENOMEM; - - if (!nr_blocks) - return 0; -@@ -811,11 +835,7 @@ static int msc_buffer_win_alloc(struct msc *msc, unsigned int nr_blocks) - if (ret < 0) - goto err_nomem; - --#ifdef CONFIG_X86 -- for (i = 0; i < ret; i++) -- /* Set the page as uncached */ -- set_memory_uc((unsigned long)msc_win_block(win, i), 1); --#endif -+ msc_buffer_set_uc(win, ret); - - win->nr_blocks = ret; - -@@ -860,8 +880,6 @@ static void __msc_buffer_win_free(struct msc *msc, struct msc_window *win) - */ - static void msc_buffer_win_free(struct msc *msc, struct msc_window *win) - { -- int i; -- - msc->nr_pages -= win->nr_blocks; - - list_del(&win->entry); -@@ -870,11 +888,7 @@ static void msc_buffer_win_free(struct msc *msc, struct msc_window *win) - msc->base_addr = 0; - } - --#ifdef CONFIG_X86 -- for (i = 0; i < win->nr_blocks; i++) -- /* Reset the page to write-back */ -- set_memory_wb((unsigned long)msc_win_block(win, i), 1); --#endif -+ msc_buffer_set_wb(win); - - __msc_buffer_win_free(msc, win); - -@@ -1386,10 +1400,9 @@ static int intel_th_msc_init(struct msc *msc) - - static void msc_win_switch(struct msc *msc) - { -- struct msc_window *last, *first; -+ struct msc_window *first; - - first = list_first_entry(&msc->win_list, struct msc_window, entry); -- last = list_last_entry(&msc->win_list, struct msc_window, entry); - - if (msc_is_last_win(msc->cur_win)) - msc->cur_win = first; -diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c -index f1228708f2a2..c0378c3de9a4 100644 ---- a/drivers/hwtracing/intel_th/pci.c -+++ b/drivers/hwtracing/intel_th/pci.c -@@ -194,6 +194,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { - PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x02a6), - .driver_data = (kernel_ulong_t)&intel_th_2x, - }, -+ { -+ /* Ice Lake NNPI */ -+ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x45c5), -+ .driver_data = (kernel_ulong_t)&intel_th_2x, -+ }, - { 0 }, - }; - -diff --git a/drivers/i2c/busses/i2c-at91-core.c b/drivers/i2c/busses/i2c-at91-core.c -index 8d55cdd69ff4..435c7d7377a3 100644 ---- a/drivers/i2c/busses/i2c-at91-core.c -+++ b/drivers/i2c/busses/i2c-at91-core.c -@@ -142,7 +142,7 @@ static struct at91_twi_pdata sama5d4_config = { - - static struct at91_twi_pdata sama5d2_config = { - .clk_max_div = 7, -- .clk_offset = 4, -+ .clk_offset = 3, - .has_unre_flag = true, - .has_alt_cmd = true, - .has_hold_field = true, -diff --git a/drivers/i2c/busses/i2c-at91-master.c b/drivers/i2c/busses/i2c-at91-master.c -index e87232f2e708..a3fcc35ffd3b 100644 ---- a/drivers/i2c/busses/i2c-at91-master.c -+++ b/drivers/i2c/busses/i2c-at91-master.c -@@ -122,9 +122,11 @@ static void at91_twi_write_next_byte(struct at91_twi_dev *dev) - writeb_relaxed(*dev->buf, dev->base + AT91_TWI_THR); - - /* send stop when last byte has been written */ -- if (--dev->buf_len == 0) -+ if (--dev->buf_len == 0) { - if (!dev->use_alt_cmd) - at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP); -+ at91_twi_write(dev, AT91_TWI_IDR, AT91_TWI_TXRDY); -+ } - - dev_dbg(dev->dev, "wrote 0x%x, to go %zu\n", *dev->buf, dev->buf_len); - -@@ -542,9 +544,8 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev) - } else { - at91_twi_write_next_byte(dev); - at91_twi_write(dev, AT91_TWI_IER, -- AT91_TWI_TXCOMP | -- AT91_TWI_NACK | -- AT91_TWI_TXRDY); -+ AT91_TWI_TXCOMP | AT91_TWI_NACK | -+ (dev->buf_len ? AT91_TWI_TXRDY : 0)); - } - } - -diff --git a/drivers/i2c/busses/i2c-bcm-iproc.c b/drivers/i2c/busses/i2c-bcm-iproc.c -index a845b8decac8..ad1681872e39 100644 ---- a/drivers/i2c/busses/i2c-bcm-iproc.c -+++ b/drivers/i2c/busses/i2c-bcm-iproc.c -@@ -403,16 +403,18 @@ static bool bcm_iproc_i2c_slave_isr(struct bcm_iproc_i2c_dev *iproc_i2c, - static void bcm_iproc_i2c_read_valid_bytes(struct bcm_iproc_i2c_dev *iproc_i2c) - { - struct i2c_msg *msg = iproc_i2c->msg; -+ uint32_t val; - - /* Read valid data from RX FIFO */ - while (iproc_i2c->rx_bytes < msg->len) { -- if (!((iproc_i2c_rd_reg(iproc_i2c, M_FIFO_CTRL_OFFSET) >> M_FIFO_RX_CNT_SHIFT) -- & M_FIFO_RX_CNT_MASK)) -+ val = iproc_i2c_rd_reg(iproc_i2c, M_RX_OFFSET); -+ -+ /* rx fifo empty */ -+ if (!((val >> M_RX_STATUS_SHIFT) & M_RX_STATUS_MASK)) - break; - - msg->buf[iproc_i2c->rx_bytes] = -- (iproc_i2c_rd_reg(iproc_i2c, M_RX_OFFSET) >> -- M_RX_DATA_SHIFT) & M_RX_DATA_MASK; -+ (val >> M_RX_DATA_SHIFT) & M_RX_DATA_MASK; - iproc_i2c->rx_bytes++; - } - } -diff --git a/drivers/i2c/busses/i2c-nvidia-gpu.c b/drivers/i2c/busses/i2c-nvidia-gpu.c -index 1c8f708f212b..ee2412b7459c 100644 ---- a/drivers/i2c/busses/i2c-nvidia-gpu.c -+++ b/drivers/i2c/busses/i2c-nvidia-gpu.c -@@ -51,6 +51,7 @@ struct gpu_i2c_dev { - void __iomem *regs; - struct i2c_adapter adapter; - struct i2c_board_info *gpu_ccgx_ucsi; -+ struct i2c_client *ccgx_client; - }; - - static void gpu_enable_i2c_bus(struct gpu_i2c_dev *i2cd) -@@ -261,8 +262,6 @@ static const struct property_entry ccgx_props[] = { - - static int gpu_populate_client(struct gpu_i2c_dev *i2cd, int irq) - { -- struct i2c_client *ccgx_client; -- - i2cd->gpu_ccgx_ucsi = devm_kzalloc(i2cd->dev, - sizeof(*i2cd->gpu_ccgx_ucsi), - GFP_KERNEL); -@@ -274,8 +273,8 @@ static int gpu_populate_client(struct gpu_i2c_dev *i2cd, int irq) - i2cd->gpu_ccgx_ucsi->addr = 0x8; - i2cd->gpu_ccgx_ucsi->irq = irq; - i2cd->gpu_ccgx_ucsi->properties = ccgx_props; -- ccgx_client = i2c_new_device(&i2cd->adapter, i2cd->gpu_ccgx_ucsi); -- if (!ccgx_client) -+ i2cd->ccgx_client = i2c_new_device(&i2cd->adapter, i2cd->gpu_ccgx_ucsi); -+ if (!i2cd->ccgx_client) - return -ENODEV; - - return 0; -@@ -354,6 +353,13 @@ static __maybe_unused int gpu_i2c_resume(struct device *dev) - struct gpu_i2c_dev *i2cd = dev_get_drvdata(dev); - - gpu_enable_i2c_bus(i2cd); -+ /* -+ * Runtime resume ccgx client so that it can see for any -+ * connector change event. Old ccg firmware has known -+ * issue of not triggering interrupt when a device is -+ * connected to runtime resume the controller. -+ */ -+ pm_request_resume(&i2cd->ccgx_client->dev); - return 0; - } - -diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c -index 48337bef5b87..3d90c0bb049e 100644 ---- a/drivers/i2c/busses/i2c-stm32f7.c -+++ b/drivers/i2c/busses/i2c-stm32f7.c -@@ -25,7 +25,6 @@ - #include - #include - #include --#include - #include - #include - #include -@@ -1816,15 +1815,14 @@ static struct i2c_algorithm stm32f7_i2c_algo = { - - static int stm32f7_i2c_probe(struct platform_device *pdev) - { -- struct device_node *np = pdev->dev.of_node; - struct stm32f7_i2c_dev *i2c_dev; - const struct stm32f7_i2c_setup *setup; - struct resource *res; -- u32 irq_error, irq_event, clk_rate, rise_time, fall_time; -+ u32 clk_rate, rise_time, fall_time; - struct i2c_adapter *adap; - struct reset_control *rst; - dma_addr_t phy_addr; -- int ret; -+ int irq_error, irq_event, ret; - - i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); - if (!i2c_dev) -@@ -1836,16 +1834,20 @@ static int stm32f7_i2c_probe(struct platform_device *pdev) - return PTR_ERR(i2c_dev->base); - phy_addr = (dma_addr_t)res->start; - -- irq_event = irq_of_parse_and_map(np, 0); -- if (!irq_event) { -- dev_err(&pdev->dev, "IRQ event missing or invalid\n"); -- return -EINVAL; -+ irq_event = platform_get_irq(pdev, 0); -+ if (irq_event <= 0) { -+ if (irq_event != -EPROBE_DEFER) -+ dev_err(&pdev->dev, "Failed to get IRQ event: %d\n", -+ irq_event); -+ return irq_event ? : -ENOENT; - } - -- irq_error = irq_of_parse_and_map(np, 1); -- if (!irq_error) { -- dev_err(&pdev->dev, "IRQ error missing or invalid\n"); -- return -EINVAL; -+ irq_error = platform_get_irq(pdev, 1); -+ if (irq_error <= 0) { -+ if (irq_error != -EPROBE_DEFER) -+ dev_err(&pdev->dev, "Failed to get IRQ error: %d\n", -+ irq_error); -+ return irq_error ? : -ENOENT; - } - - i2c_dev->clk = devm_clk_get(&pdev->dev, NULL); -diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c -index 5f4bd52121fe..7837ea67f1f8 100644 ---- a/drivers/i3c/master.c -+++ b/drivers/i3c/master.c -@@ -91,6 +91,12 @@ void i3c_bus_normaluse_unlock(struct i3c_bus *bus) - up_read(&bus->lock); - } - -+static struct i3c_master_controller * -+i3c_bus_to_i3c_master(struct i3c_bus *i3cbus) -+{ -+ return container_of(i3cbus, struct i3c_master_controller, bus); -+} -+ - static struct i3c_master_controller *dev_to_i3cmaster(struct device *dev) - { - return container_of(dev, struct i3c_master_controller, dev); -@@ -565,20 +571,38 @@ static const struct device_type i3c_masterdev_type = { - .groups = i3c_masterdev_groups, - }; - --int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode) -+int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode, -+ unsigned long max_i2c_scl_rate) - { -- i3cbus->mode = mode; -+ struct i3c_master_controller *master = i3c_bus_to_i3c_master(i3cbus); - -- if (!i3cbus->scl_rate.i3c) -- i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; -+ i3cbus->mode = mode; - -- if (!i3cbus->scl_rate.i2c) { -- if (i3cbus->mode == I3C_BUS_MODE_MIXED_SLOW) -- i3cbus->scl_rate.i2c = I3C_BUS_I2C_FM_SCL_RATE; -- else -- i3cbus->scl_rate.i2c = I3C_BUS_I2C_FM_PLUS_SCL_RATE; -+ switch (i3cbus->mode) { -+ case I3C_BUS_MODE_PURE: -+ if (!i3cbus->scl_rate.i3c) -+ i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; -+ break; -+ case I3C_BUS_MODE_MIXED_FAST: -+ if (!i3cbus->scl_rate.i3c) -+ i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; -+ if (!i3cbus->scl_rate.i2c) -+ i3cbus->scl_rate.i2c = max_i2c_scl_rate; -+ break; -+ case I3C_BUS_MODE_MIXED_SLOW: -+ if (!i3cbus->scl_rate.i2c) -+ i3cbus->scl_rate.i2c = max_i2c_scl_rate; -+ if (!i3cbus->scl_rate.i3c || -+ i3cbus->scl_rate.i3c > i3cbus->scl_rate.i2c) -+ i3cbus->scl_rate.i3c = i3cbus->scl_rate.i2c; -+ break; -+ default: -+ return -EINVAL; - } - -+ dev_dbg(&master->dev, "i2c-scl = %ld Hz i3c-scl = %ld Hz\n", -+ i3cbus->scl_rate.i2c, i3cbus->scl_rate.i3c); -+ - /* - * I3C/I2C frequency may have been overridden, check that user-provided - * values are not exceeding max possible frequency. -@@ -1966,9 +1990,6 @@ of_i3c_master_add_i2c_boardinfo(struct i3c_master_controller *master, - /* LVR is encoded in reg[2]. */ - boardinfo->lvr = reg[2]; - -- if (boardinfo->lvr & I3C_LVR_I2C_FM_MODE) -- master->bus.scl_rate.i2c = I3C_BUS_I2C_FM_SCL_RATE; -- - list_add_tail(&boardinfo->node, &master->boardinfo.i2c); - of_node_get(node); - -@@ -2417,6 +2438,7 @@ int i3c_master_register(struct i3c_master_controller *master, - const struct i3c_master_controller_ops *ops, - bool secondary) - { -+ unsigned long i2c_scl_rate = I3C_BUS_I2C_FM_PLUS_SCL_RATE; - struct i3c_bus *i3cbus = i3c_master_get_bus(master); - enum i3c_bus_mode mode = I3C_BUS_MODE_PURE; - struct i2c_dev_boardinfo *i2cbi; -@@ -2466,9 +2488,12 @@ int i3c_master_register(struct i3c_master_controller *master, - ret = -EINVAL; - goto err_put_dev; - } -+ -+ if (i2cbi->lvr & I3C_LVR_I2C_FM_MODE) -+ i2c_scl_rate = I3C_BUS_I2C_FM_SCL_RATE; - } - -- ret = i3c_bus_set_mode(i3cbus, mode); -+ ret = i3c_bus_set_mode(i3cbus, mode, i2c_scl_rate); - if (ret) - goto err_put_dev; - -diff --git a/drivers/iio/accel/adxl372.c b/drivers/iio/accel/adxl372.c -index 3b84cb243a87..055227cb3d43 100644 ---- a/drivers/iio/accel/adxl372.c -+++ b/drivers/iio/accel/adxl372.c -@@ -782,10 +782,14 @@ static int adxl372_buffer_postenable(struct iio_dev *indio_dev) - unsigned int mask; - int i, ret; - -- ret = adxl372_set_interrupts(st, ADXL372_INT1_MAP_FIFO_FULL_MSK, 0); -+ ret = iio_triggered_buffer_postenable(indio_dev); - if (ret < 0) - return ret; - -+ ret = adxl372_set_interrupts(st, ADXL372_INT1_MAP_FIFO_FULL_MSK, 0); -+ if (ret < 0) -+ goto err; -+ - mask = *indio_dev->active_scan_mask; - - for (i = 0; i < ARRAY_SIZE(adxl372_axis_lookup_table); i++) { -@@ -793,8 +797,10 @@ static int adxl372_buffer_postenable(struct iio_dev *indio_dev) - break; - } - -- if (i == ARRAY_SIZE(adxl372_axis_lookup_table)) -- return -EINVAL; -+ if (i == ARRAY_SIZE(adxl372_axis_lookup_table)) { -+ ret = -EINVAL; -+ goto err; -+ } - - st->fifo_format = adxl372_axis_lookup_table[i].fifo_format; - st->fifo_set_size = bitmap_weight(indio_dev->active_scan_mask, -@@ -814,26 +820,25 @@ static int adxl372_buffer_postenable(struct iio_dev *indio_dev) - if (ret < 0) { - st->fifo_mode = ADXL372_FIFO_BYPASSED; - adxl372_set_interrupts(st, 0, 0); -- return ret; -+ goto err; - } - -- return iio_triggered_buffer_postenable(indio_dev); -+ return 0; -+ -+err: -+ iio_triggered_buffer_predisable(indio_dev); -+ return ret; - } - - static int adxl372_buffer_predisable(struct iio_dev *indio_dev) - { - struct adxl372_state *st = iio_priv(indio_dev); -- int ret; -- -- ret = iio_triggered_buffer_predisable(indio_dev); -- if (ret < 0) -- return ret; - - adxl372_set_interrupts(st, 0, 0); - st->fifo_mode = ADXL372_FIFO_BYPASSED; - adxl372_configure_fifo(st); - -- return 0; -+ return iio_triggered_buffer_predisable(indio_dev); - } - - static const struct iio_buffer_setup_ops adxl372_buffer_ops = { -diff --git a/drivers/iio/accel/cros_ec_accel_legacy.c b/drivers/iio/accel/cros_ec_accel_legacy.c -index 46bb2e421bb9..ad19d9c716f4 100644 ---- a/drivers/iio/accel/cros_ec_accel_legacy.c -+++ b/drivers/iio/accel/cros_ec_accel_legacy.c -@@ -319,7 +319,6 @@ static const struct iio_chan_spec_ext_info cros_ec_accel_legacy_ext_info[] = { - .modified = 1, \ - .info_mask_separate = \ - BIT(IIO_CHAN_INFO_RAW) | \ -- BIT(IIO_CHAN_INFO_SCALE) | \ - BIT(IIO_CHAN_INFO_CALIBBIAS), \ - .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE), \ - .ext_info = cros_ec_accel_legacy_ext_info, \ -diff --git a/drivers/iio/adc/ingenic-adc.c b/drivers/iio/adc/ingenic-adc.c -index 92b1d5037ac9..e234970b7150 100644 ---- a/drivers/iio/adc/ingenic-adc.c -+++ b/drivers/iio/adc/ingenic-adc.c -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -22,8 +23,11 @@ - #define JZ_ADC_REG_ADTCH 0x18 - #define JZ_ADC_REG_ADBDAT 0x1c - #define JZ_ADC_REG_ADSDAT 0x20 -+#define JZ_ADC_REG_ADCLK 0x28 - - #define JZ_ADC_REG_CFG_BAT_MD BIT(4) -+#define JZ_ADC_REG_ADCLK_CLKDIV_LSB 0 -+#define JZ_ADC_REG_ADCLK_CLKDIV10US_LSB 16 - - #define JZ_ADC_AUX_VREF 3300 - #define JZ_ADC_AUX_VREF_BITS 12 -@@ -34,6 +38,8 @@ - #define JZ4740_ADC_BATTERY_HIGH_VREF (7500 * 0.986) - #define JZ4740_ADC_BATTERY_HIGH_VREF_BITS 12 - -+struct ingenic_adc; -+ - struct ingenic_adc_soc_data { - unsigned int battery_high_vref; - unsigned int battery_high_vref_bits; -@@ -41,6 +47,7 @@ struct ingenic_adc_soc_data { - size_t battery_raw_avail_size; - const int *battery_scale_avail; - size_t battery_scale_avail_size; -+ int (*init_clk_div)(struct device *dev, struct ingenic_adc *adc); - }; - - struct ingenic_adc { -@@ -151,6 +158,42 @@ static const int jz4740_adc_battery_scale_avail[] = { - JZ_ADC_BATTERY_LOW_VREF, JZ_ADC_BATTERY_LOW_VREF_BITS, - }; - -+static int jz4725b_adc_init_clk_div(struct device *dev, struct ingenic_adc *adc) -+{ -+ struct clk *parent_clk; -+ unsigned long parent_rate, rate; -+ unsigned int div_main, div_10us; -+ -+ parent_clk = clk_get_parent(adc->clk); -+ if (!parent_clk) { -+ dev_err(dev, "ADC clock has no parent\n"); -+ return -ENODEV; -+ } -+ parent_rate = clk_get_rate(parent_clk); -+ -+ /* -+ * The JZ4725B ADC works at 500 kHz to 8 MHz. -+ * We pick the highest rate possible. -+ * In practice we typically get 6 MHz, half of the 12 MHz EXT clock. -+ */ -+ div_main = DIV_ROUND_UP(parent_rate, 8000000); -+ div_main = clamp(div_main, 1u, 64u); -+ rate = parent_rate / div_main; -+ if (rate < 500000 || rate > 8000000) { -+ dev_err(dev, "No valid divider for ADC main clock\n"); -+ return -EINVAL; -+ } -+ -+ /* We also need a divider that produces a 10us clock. */ -+ div_10us = DIV_ROUND_UP(rate, 100000); -+ -+ writel(((div_10us - 1) << JZ_ADC_REG_ADCLK_CLKDIV10US_LSB) | -+ (div_main - 1) << JZ_ADC_REG_ADCLK_CLKDIV_LSB, -+ adc->base + JZ_ADC_REG_ADCLK); -+ -+ return 0; -+} -+ - static const struct ingenic_adc_soc_data jz4725b_adc_soc_data = { - .battery_high_vref = JZ4725B_ADC_BATTERY_HIGH_VREF, - .battery_high_vref_bits = JZ4725B_ADC_BATTERY_HIGH_VREF_BITS, -@@ -158,6 +201,7 @@ static const struct ingenic_adc_soc_data jz4725b_adc_soc_data = { - .battery_raw_avail_size = ARRAY_SIZE(jz4725b_adc_battery_raw_avail), - .battery_scale_avail = jz4725b_adc_battery_scale_avail, - .battery_scale_avail_size = ARRAY_SIZE(jz4725b_adc_battery_scale_avail), -+ .init_clk_div = jz4725b_adc_init_clk_div, - }; - - static const struct ingenic_adc_soc_data jz4740_adc_soc_data = { -@@ -167,6 +211,7 @@ static const struct ingenic_adc_soc_data jz4740_adc_soc_data = { - .battery_raw_avail_size = ARRAY_SIZE(jz4740_adc_battery_raw_avail), - .battery_scale_avail = jz4740_adc_battery_scale_avail, - .battery_scale_avail_size = ARRAY_SIZE(jz4740_adc_battery_scale_avail), -+ .init_clk_div = NULL, /* no ADCLK register on JZ4740 */ - }; - - static int ingenic_adc_read_avail(struct iio_dev *iio_dev, -@@ -317,6 +362,15 @@ static int ingenic_adc_probe(struct platform_device *pdev) - return ret; - } - -+ /* Set clock dividers. */ -+ if (soc_data->init_clk_div) { -+ ret = soc_data->init_clk_div(dev, adc); -+ if (ret) { -+ clk_disable_unprepare(adc->clk); -+ return ret; -+ } -+ } -+ - /* Put hardware in a known passive state. */ - writeb(0x00, adc->base + JZ_ADC_REG_ENABLE); - writeb(0xff, adc->base + JZ_ADC_REG_CTRL); -diff --git a/drivers/iio/adc/max9611.c b/drivers/iio/adc/max9611.c -index 917223d5ff5b..0e3c6529fc4c 100644 ---- a/drivers/iio/adc/max9611.c -+++ b/drivers/iio/adc/max9611.c -@@ -83,7 +83,7 @@ - #define MAX9611_TEMP_MAX_POS 0x7f80 - #define MAX9611_TEMP_MAX_NEG 0xff80 - #define MAX9611_TEMP_MIN_NEG 0xd980 --#define MAX9611_TEMP_MASK GENMASK(7, 15) -+#define MAX9611_TEMP_MASK GENMASK(15, 7) - #define MAX9611_TEMP_SHIFT 0x07 - #define MAX9611_TEMP_RAW(_r) ((_r) >> MAX9611_TEMP_SHIFT) - #define MAX9611_TEMP_SCALE_NUM 1000000 -diff --git a/drivers/iio/adc/rcar-gyroadc.c b/drivers/iio/adc/rcar-gyroadc.c -index 2c0d0316d149..b373acce5927 100644 ---- a/drivers/iio/adc/rcar-gyroadc.c -+++ b/drivers/iio/adc/rcar-gyroadc.c -@@ -382,7 +382,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) - dev_err(dev, - "Only %i channels supported with %pOFn, but reg = <%i>.\n", - num_channels, child, reg); -- return ret; -+ return -EINVAL; - } - } - -@@ -391,7 +391,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) - dev_err(dev, - "Channel %i uses different ADC mode than the rest.\n", - reg); -- return ret; -+ return -EINVAL; - } - - /* Channel is valid, grab the regulator. */ -diff --git a/drivers/iio/adc/stm32-adc-core.c b/drivers/iio/adc/stm32-adc-core.c -index 2327ec18b40c..1f7ce5186dfc 100644 ---- a/drivers/iio/adc/stm32-adc-core.c -+++ b/drivers/iio/adc/stm32-adc-core.c -@@ -87,6 +87,7 @@ struct stm32_adc_priv_cfg { - * @domain: irq domain reference - * @aclk: clock reference for the analog circuitry - * @bclk: bus clock common for all ADCs, depends on part used -+ * @vdda: vdda analog supply reference - * @vref: regulator reference - * @cfg: compatible configuration data - * @common: common data for all ADC instances -@@ -97,6 +98,7 @@ struct stm32_adc_priv { - struct irq_domain *domain; - struct clk *aclk; - struct clk *bclk; -+ struct regulator *vdda; - struct regulator *vref; - const struct stm32_adc_priv_cfg *cfg; - struct stm32_adc_common common; -@@ -394,10 +396,16 @@ static int stm32_adc_core_hw_start(struct device *dev) - struct stm32_adc_priv *priv = to_stm32_adc_priv(common); - int ret; - -+ ret = regulator_enable(priv->vdda); -+ if (ret < 0) { -+ dev_err(dev, "vdda enable failed %d\n", ret); -+ return ret; -+ } -+ - ret = regulator_enable(priv->vref); - if (ret < 0) { - dev_err(dev, "vref enable failed\n"); -- return ret; -+ goto err_vdda_disable; - } - - if (priv->bclk) { -@@ -425,6 +433,8 @@ static int stm32_adc_core_hw_start(struct device *dev) - clk_disable_unprepare(priv->bclk); - err_regulator_disable: - regulator_disable(priv->vref); -+err_vdda_disable: -+ regulator_disable(priv->vdda); - - return ret; - } -@@ -441,6 +451,7 @@ static void stm32_adc_core_hw_stop(struct device *dev) - if (priv->bclk) - clk_disable_unprepare(priv->bclk); - regulator_disable(priv->vref); -+ regulator_disable(priv->vdda); - } - - static int stm32_adc_probe(struct platform_device *pdev) -@@ -468,6 +479,14 @@ static int stm32_adc_probe(struct platform_device *pdev) - return PTR_ERR(priv->common.base); - priv->common.phys_base = res->start; - -+ priv->vdda = devm_regulator_get(&pdev->dev, "vdda"); -+ if (IS_ERR(priv->vdda)) { -+ ret = PTR_ERR(priv->vdda); -+ if (ret != -EPROBE_DEFER) -+ dev_err(&pdev->dev, "vdda get failed, %d\n", ret); -+ return ret; -+ } -+ - priv->vref = devm_regulator_get(&pdev->dev, "vref"); - if (IS_ERR(priv->vref)) { - ret = PTR_ERR(priv->vref); -diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c -index 19adc2b23472..588907cc3b6b 100644 ---- a/drivers/iio/adc/stm32-dfsdm-adc.c -+++ b/drivers/iio/adc/stm32-dfsdm-adc.c -@@ -1456,6 +1456,12 @@ static int stm32_dfsdm_adc_probe(struct platform_device *pdev) - * So IRQ associated to filter instance 0 is dedicated to the Filter 0. - */ - irq = platform_get_irq(pdev, 0); -+ if (irq < 0) { -+ if (irq != -EPROBE_DEFER) -+ dev_err(dev, "Failed to get IRQ: %d\n", irq); -+ return irq; -+ } -+ - ret = devm_request_irq(dev, irq, stm32_dfsdm_irq, - 0, pdev->name, adc); - if (ret < 0) { -diff --git a/drivers/iio/adc/stm32-dfsdm-core.c b/drivers/iio/adc/stm32-dfsdm-core.c -index 0a4d3746d21c..26e2011c5868 100644 ---- a/drivers/iio/adc/stm32-dfsdm-core.c -+++ b/drivers/iio/adc/stm32-dfsdm-core.c -@@ -233,6 +233,8 @@ static int stm32_dfsdm_parse_of(struct platform_device *pdev, - } - priv->dfsdm.phys_base = res->start; - priv->dfsdm.base = devm_ioremap_resource(&pdev->dev, res); -+ if (IS_ERR(priv->dfsdm.base)) -+ return PTR_ERR(priv->dfsdm.base); - - /* - * "dfsdm" clock is mandatory for DFSDM peripheral clocking. -@@ -242,8 +244,10 @@ static int stm32_dfsdm_parse_of(struct platform_device *pdev, - */ - priv->clk = devm_clk_get(&pdev->dev, "dfsdm"); - if (IS_ERR(priv->clk)) { -- dev_err(&pdev->dev, "No stm32_dfsdm_clk clock found\n"); -- return -EINVAL; -+ ret = PTR_ERR(priv->clk); -+ if (ret != -EPROBE_DEFER) -+ dev_err(&pdev->dev, "Failed to get clock (%d)\n", ret); -+ return ret; - } - - priv->aclk = devm_clk_get(&pdev->dev, "audio"); -diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c -index 53a59957cc54..8a704cd5bddb 100644 ---- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c -+++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c -@@ -845,6 +845,25 @@ static const struct iio_chan_spec inv_mpu_channels[] = { - INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z), - }; - -+static const unsigned long inv_mpu_scan_masks[] = { -+ /* 3-axis accel */ -+ BIT(INV_MPU6050_SCAN_ACCL_X) -+ | BIT(INV_MPU6050_SCAN_ACCL_Y) -+ | BIT(INV_MPU6050_SCAN_ACCL_Z), -+ /* 3-axis gyro */ -+ BIT(INV_MPU6050_SCAN_GYRO_X) -+ | BIT(INV_MPU6050_SCAN_GYRO_Y) -+ | BIT(INV_MPU6050_SCAN_GYRO_Z), -+ /* 6-axis accel + gyro */ -+ BIT(INV_MPU6050_SCAN_ACCL_X) -+ | BIT(INV_MPU6050_SCAN_ACCL_Y) -+ | BIT(INV_MPU6050_SCAN_ACCL_Z) -+ | BIT(INV_MPU6050_SCAN_GYRO_X) -+ | BIT(INV_MPU6050_SCAN_GYRO_Y) -+ | BIT(INV_MPU6050_SCAN_GYRO_Z), -+ 0, -+}; -+ - static const struct iio_chan_spec inv_icm20602_channels[] = { - IIO_CHAN_SOFT_TIMESTAMP(INV_ICM20602_SCAN_TIMESTAMP), - { -@@ -871,6 +890,28 @@ static const struct iio_chan_spec inv_icm20602_channels[] = { - INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_ICM20602_SCAN_ACCL_Z), - }; - -+static const unsigned long inv_icm20602_scan_masks[] = { -+ /* 3-axis accel + temp (mandatory) */ -+ BIT(INV_ICM20602_SCAN_ACCL_X) -+ | BIT(INV_ICM20602_SCAN_ACCL_Y) -+ | BIT(INV_ICM20602_SCAN_ACCL_Z) -+ | BIT(INV_ICM20602_SCAN_TEMP), -+ /* 3-axis gyro + temp (mandatory) */ -+ BIT(INV_ICM20602_SCAN_GYRO_X) -+ | BIT(INV_ICM20602_SCAN_GYRO_Y) -+ | BIT(INV_ICM20602_SCAN_GYRO_Z) -+ | BIT(INV_ICM20602_SCAN_TEMP), -+ /* 6-axis accel + gyro + temp (mandatory) */ -+ BIT(INV_ICM20602_SCAN_ACCL_X) -+ | BIT(INV_ICM20602_SCAN_ACCL_Y) -+ | BIT(INV_ICM20602_SCAN_ACCL_Z) -+ | BIT(INV_ICM20602_SCAN_GYRO_X) -+ | BIT(INV_ICM20602_SCAN_GYRO_Y) -+ | BIT(INV_ICM20602_SCAN_GYRO_Z) -+ | BIT(INV_ICM20602_SCAN_TEMP), -+ 0, -+}; -+ - /* - * The user can choose any frequency between INV_MPU6050_MIN_FIFO_RATE and - * INV_MPU6050_MAX_FIFO_RATE, but only these frequencies are matched by the -@@ -1130,9 +1171,11 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, - if (chip_type == INV_ICM20602) { - indio_dev->channels = inv_icm20602_channels; - indio_dev->num_channels = ARRAY_SIZE(inv_icm20602_channels); -+ indio_dev->available_scan_masks = inv_icm20602_scan_masks; - } else { - indio_dev->channels = inv_mpu_channels; - indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels); -+ indio_dev->available_scan_masks = inv_mpu_scan_masks; - } - - indio_dev->info = &mpu_info; -diff --git a/drivers/iio/light/tsl2563.c b/drivers/iio/light/tsl2563.c -index d8c40a83097d..b8d48a092073 100644 ---- a/drivers/iio/light/tsl2563.c -+++ b/drivers/iio/light/tsl2563.c -@@ -273,7 +273,7 @@ static void tsl2563_wait_adc(struct tsl2563_chip *chip) - * TODO: Make sure that we wait at least required delay but why we - * have to extend it one tick more? - */ -- schedule_timeout_interruptible(msecs_to_jiffies(delay) + 2); -+ schedule_msec_hrtimeout_interruptible(delay + 2); - } - - static int tsl2563_adjust_gainlevel(struct tsl2563_chip *chip, u16 adc) -diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c -index 2f7d14159841..2a0f9ce8bb54 100644 ---- a/drivers/infiniband/core/addr.c -+++ b/drivers/infiniband/core/addr.c -@@ -337,7 +337,7 @@ static int dst_fetch_ha(const struct dst_entry *dst, - neigh_event_send(n, NULL); - ret = -ENODATA; - } else { -- memcpy(dev_addr->dst_dev_addr, n->ha, MAX_ADDR_LEN); -+ neigh_ha_snapshot(dev_addr->dst_dev_addr, n, dst->dev); - } - - neigh_release(n); -@@ -817,6 +817,7 @@ int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid, - union { - struct sockaddr_in _sockaddr_in; - struct sockaddr_in6 _sockaddr_in6; -+ struct sockaddr_ib _sockaddr_ib; - } sgid_addr, dgid_addr; - int ret; - -diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c -index 29f7b15c81d9..156d210de195 100644 ---- a/drivers/infiniband/core/device.c -+++ b/drivers/infiniband/core/device.c -@@ -98,6 +98,12 @@ static LIST_HEAD(client_list); - static DEFINE_XARRAY_FLAGS(clients, XA_FLAGS_ALLOC); - static DECLARE_RWSEM(clients_rwsem); - -+static void ib_client_put(struct ib_client *client) -+{ -+ if (refcount_dec_and_test(&client->uses)) -+ complete(&client->uses_zero); -+} -+ - /* - * If client_data is registered then the corresponding client must also still - * be registered. -@@ -650,6 +656,14 @@ static int add_client_context(struct ib_device *device, - return 0; - - down_write(&device->client_data_rwsem); -+ /* -+ * So long as the client is registered hold both the client and device -+ * unregistration locks. -+ */ -+ if (!refcount_inc_not_zero(&client->uses)) -+ goto out_unlock; -+ refcount_inc(&device->refcount); -+ - /* - * Another caller to add_client_context got here first and has already - * completely initialized context. -@@ -673,6 +687,9 @@ static int add_client_context(struct ib_device *device, - return 0; - - out: -+ ib_device_put(device); -+ ib_client_put(client); -+out_unlock: - up_write(&device->client_data_rwsem); - return ret; - } -@@ -692,7 +709,7 @@ static void remove_client_context(struct ib_device *device, - client_data = xa_load(&device->client_data, client_id); - xa_clear_mark(&device->client_data, client_id, CLIENT_DATA_REGISTERED); - client = xa_load(&clients, client_id); -- downgrade_write(&device->client_data_rwsem); -+ up_write(&device->client_data_rwsem); - - /* - * Notice we cannot be holding any exclusive locks when calling the -@@ -702,17 +719,13 @@ static void remove_client_context(struct ib_device *device, - * - * For this reason clients and drivers should not call the - * unregistration functions will holdling any locks. -- * -- * It tempting to drop the client_data_rwsem too, but this is required -- * to ensure that unregister_client does not return until all clients -- * are completely unregistered, which is required to avoid module -- * unloading races. - */ - if (client->remove) - client->remove(device, client_data); - - xa_erase(&device->client_data, client_id); -- up_read(&device->client_data_rwsem); -+ ib_device_put(device); -+ ib_client_put(client); - } - - static int alloc_port_data(struct ib_device *device) -@@ -1696,6 +1709,8 @@ int ib_register_client(struct ib_client *client) - unsigned long index; - int ret; - -+ refcount_set(&client->uses, 1); -+ init_completion(&client->uses_zero); - ret = assign_client_id(client); - if (ret) - return ret; -@@ -1731,16 +1746,29 @@ void ib_unregister_client(struct ib_client *client) - unsigned long index; - - down_write(&clients_rwsem); -+ ib_client_put(client); - xa_clear_mark(&clients, client->client_id, CLIENT_REGISTERED); - up_write(&clients_rwsem); -+ -+ /* We do not want to have locks while calling client->remove() */ -+ rcu_read_lock(); -+ xa_for_each (&devices, index, device) { -+ if (!ib_device_try_get(device)) -+ continue; -+ rcu_read_unlock(); -+ -+ remove_client_context(device, client->client_id); -+ -+ ib_device_put(device); -+ rcu_read_lock(); -+ } -+ rcu_read_unlock(); -+ - /* -- * Every device still known must be serialized to make sure we are -- * done with the client callbacks before we return. -+ * remove_client_context() is not a fence, it can return even though a -+ * removal is ongoing. Wait until all removals are completed. - */ -- down_read(&devices_rwsem); -- xa_for_each (&devices, index, device) -- remove_client_context(device, client->client_id); -- up_read(&devices_rwsem); -+ wait_for_completion(&client->uses_zero); - - down_write(&clients_rwsem); - list_del(&client->list); -diff --git a/drivers/infiniband/core/umem_odp.c b/drivers/infiniband/core/umem_odp.c -index f962b5bbfa40..e4b13a32692a 100644 ---- a/drivers/infiniband/core/umem_odp.c -+++ b/drivers/infiniband/core/umem_odp.c -@@ -151,6 +151,7 @@ static int ib_umem_notifier_invalidate_range_start(struct mmu_notifier *mn, - { - struct ib_ucontext_per_mm *per_mm = - container_of(mn, struct ib_ucontext_per_mm, mn); -+ int rc; - - if (mmu_notifier_range_blockable(range)) - down_read(&per_mm->umem_rwsem); -@@ -167,11 +168,14 @@ static int ib_umem_notifier_invalidate_range_start(struct mmu_notifier *mn, - return 0; - } - -- return rbt_ib_umem_for_each_in_range(&per_mm->umem_tree, range->start, -- range->end, -- invalidate_range_start_trampoline, -- mmu_notifier_range_blockable(range), -- NULL); -+ rc = rbt_ib_umem_for_each_in_range(&per_mm->umem_tree, range->start, -+ range->end, -+ invalidate_range_start_trampoline, -+ mmu_notifier_range_blockable(range), -+ NULL); -+ if (rc) -+ up_read(&per_mm->umem_rwsem); -+ return rc; - } - - static int invalidate_range_end_trampoline(struct ib_umem_odp *item, u64 start, -diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c -index 2c3685faa57a..a4a9f90f2482 100644 ---- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c -+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c -@@ -308,6 +308,7 @@ int bnxt_re_del_gid(const struct ib_gid_attr *attr, void **context) - struct bnxt_re_dev *rdev = to_bnxt_re_dev(attr->device, ibdev); - struct bnxt_qplib_sgid_tbl *sgid_tbl = &rdev->qplib_res.sgid_tbl; - struct bnxt_qplib_gid *gid_to_del; -+ u16 vlan_id = 0xFFFF; - - /* Delete the entry from the hardware */ - ctx = *context; -@@ -317,7 +318,8 @@ int bnxt_re_del_gid(const struct ib_gid_attr *attr, void **context) - if (sgid_tbl && sgid_tbl->active) { - if (ctx->idx >= sgid_tbl->max) - return -EINVAL; -- gid_to_del = &sgid_tbl->tbl[ctx->idx]; -+ gid_to_del = &sgid_tbl->tbl[ctx->idx].gid; -+ vlan_id = sgid_tbl->tbl[ctx->idx].vlan_id; - /* DEL_GID is called in WQ context(netdevice_event_work_handler) - * or via the ib_unregister_device path. In the former case QP1 - * may not be destroyed yet, in which case just return as FW -@@ -335,7 +337,8 @@ int bnxt_re_del_gid(const struct ib_gid_attr *attr, void **context) - } - ctx->refcnt--; - if (!ctx->refcnt) { -- rc = bnxt_qplib_del_sgid(sgid_tbl, gid_to_del, true); -+ rc = bnxt_qplib_del_sgid(sgid_tbl, gid_to_del, -+ vlan_id, true); - if (rc) { - dev_err(rdev_to_dev(rdev), - "Failed to remove GID: %#x", rc); -diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.c b/drivers/infiniband/hw/bnxt_re/qplib_res.c -index 37928b1111df..bdbde8e22420 100644 ---- a/drivers/infiniband/hw/bnxt_re/qplib_res.c -+++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c -@@ -488,7 +488,7 @@ static int bnxt_qplib_alloc_sgid_tbl(struct bnxt_qplib_res *res, - struct bnxt_qplib_sgid_tbl *sgid_tbl, - u16 max) - { -- sgid_tbl->tbl = kcalloc(max, sizeof(struct bnxt_qplib_gid), GFP_KERNEL); -+ sgid_tbl->tbl = kcalloc(max, sizeof(*sgid_tbl->tbl), GFP_KERNEL); - if (!sgid_tbl->tbl) - return -ENOMEM; - -@@ -526,9 +526,10 @@ static void bnxt_qplib_cleanup_sgid_tbl(struct bnxt_qplib_res *res, - for (i = 0; i < sgid_tbl->max; i++) { - if (memcmp(&sgid_tbl->tbl[i], &bnxt_qplib_gid_zero, - sizeof(bnxt_qplib_gid_zero))) -- bnxt_qplib_del_sgid(sgid_tbl, &sgid_tbl->tbl[i], true); -+ bnxt_qplib_del_sgid(sgid_tbl, &sgid_tbl->tbl[i].gid, -+ sgid_tbl->tbl[i].vlan_id, true); - } -- memset(sgid_tbl->tbl, 0, sizeof(struct bnxt_qplib_gid) * sgid_tbl->max); -+ memset(sgid_tbl->tbl, 0, sizeof(*sgid_tbl->tbl) * sgid_tbl->max); - memset(sgid_tbl->hw_id, -1, sizeof(u16) * sgid_tbl->max); - memset(sgid_tbl->vlan, 0, sizeof(u8) * sgid_tbl->max); - sgid_tbl->active = 0; -@@ -537,7 +538,11 @@ static void bnxt_qplib_cleanup_sgid_tbl(struct bnxt_qplib_res *res, - static void bnxt_qplib_init_sgid_tbl(struct bnxt_qplib_sgid_tbl *sgid_tbl, - struct net_device *netdev) - { -- memset(sgid_tbl->tbl, 0, sizeof(struct bnxt_qplib_gid) * sgid_tbl->max); -+ u32 i; -+ -+ for (i = 0; i < sgid_tbl->max; i++) -+ sgid_tbl->tbl[i].vlan_id = 0xffff; -+ - memset(sgid_tbl->hw_id, -1, sizeof(u16) * sgid_tbl->max); - } - -diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.h b/drivers/infiniband/hw/bnxt_re/qplib_res.h -index 30c42c92fac7..fbda11a7ab1a 100644 ---- a/drivers/infiniband/hw/bnxt_re/qplib_res.h -+++ b/drivers/infiniband/hw/bnxt_re/qplib_res.h -@@ -111,7 +111,7 @@ struct bnxt_qplib_pd_tbl { - }; - - struct bnxt_qplib_sgid_tbl { -- struct bnxt_qplib_gid *tbl; -+ struct bnxt_qplib_gid_info *tbl; - u16 *hw_id; - u16 max; - u16 active; -diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.c b/drivers/infiniband/hw/bnxt_re/qplib_sp.c -index 48793d3512ac..40296b97d21e 100644 ---- a/drivers/infiniband/hw/bnxt_re/qplib_sp.c -+++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.c -@@ -213,12 +213,12 @@ int bnxt_qplib_get_sgid(struct bnxt_qplib_res *res, - index, sgid_tbl->max); - return -EINVAL; - } -- memcpy(gid, &sgid_tbl->tbl[index], sizeof(*gid)); -+ memcpy(gid, &sgid_tbl->tbl[index].gid, sizeof(*gid)); - return 0; - } - - int bnxt_qplib_del_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, -- struct bnxt_qplib_gid *gid, bool update) -+ struct bnxt_qplib_gid *gid, u16 vlan_id, bool update) - { - struct bnxt_qplib_res *res = to_bnxt_qplib(sgid_tbl, - struct bnxt_qplib_res, -@@ -236,7 +236,8 @@ int bnxt_qplib_del_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, - return -ENOMEM; - } - for (index = 0; index < sgid_tbl->max; index++) { -- if (!memcmp(&sgid_tbl->tbl[index], gid, sizeof(*gid))) -+ if (!memcmp(&sgid_tbl->tbl[index].gid, gid, sizeof(*gid)) && -+ vlan_id == sgid_tbl->tbl[index].vlan_id) - break; - } - if (index == sgid_tbl->max) { -@@ -262,8 +263,9 @@ int bnxt_qplib_del_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, - if (rc) - return rc; - } -- memcpy(&sgid_tbl->tbl[index], &bnxt_qplib_gid_zero, -+ memcpy(&sgid_tbl->tbl[index].gid, &bnxt_qplib_gid_zero, - sizeof(bnxt_qplib_gid_zero)); -+ sgid_tbl->tbl[index].vlan_id = 0xFFFF; - sgid_tbl->vlan[index] = 0; - sgid_tbl->active--; - dev_dbg(&res->pdev->dev, -@@ -296,7 +298,8 @@ int bnxt_qplib_add_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, - } - free_idx = sgid_tbl->max; - for (i = 0; i < sgid_tbl->max; i++) { -- if (!memcmp(&sgid_tbl->tbl[i], gid, sizeof(*gid))) { -+ if (!memcmp(&sgid_tbl->tbl[i], gid, sizeof(*gid)) && -+ sgid_tbl->tbl[i].vlan_id == vlan_id) { - dev_dbg(&res->pdev->dev, - "SGID entry already exist in entry %d!\n", i); - *index = i; -@@ -351,6 +354,7 @@ int bnxt_qplib_add_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, - } - /* Add GID to the sgid_tbl */ - memcpy(&sgid_tbl->tbl[free_idx], gid, sizeof(*gid)); -+ sgid_tbl->tbl[free_idx].vlan_id = vlan_id; - sgid_tbl->active++; - if (vlan_id != 0xFFFF) - sgid_tbl->vlan[free_idx] = 1; -diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.h b/drivers/infiniband/hw/bnxt_re/qplib_sp.h -index 0ec3b12b0bcd..13d9432d5ce2 100644 ---- a/drivers/infiniband/hw/bnxt_re/qplib_sp.h -+++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.h -@@ -84,6 +84,11 @@ struct bnxt_qplib_gid { - u8 data[16]; - }; - -+struct bnxt_qplib_gid_info { -+ struct bnxt_qplib_gid gid; -+ u16 vlan_id; -+}; -+ - struct bnxt_qplib_ah { - struct bnxt_qplib_gid dgid; - struct bnxt_qplib_pd *pd; -@@ -221,7 +226,7 @@ int bnxt_qplib_get_sgid(struct bnxt_qplib_res *res, - struct bnxt_qplib_sgid_tbl *sgid_tbl, int index, - struct bnxt_qplib_gid *gid); - int bnxt_qplib_del_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, -- struct bnxt_qplib_gid *gid, bool update); -+ struct bnxt_qplib_gid *gid, u16 vlan_id, bool update); - int bnxt_qplib_add_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, - struct bnxt_qplib_gid *gid, u8 *mac, u16 vlan_id, - bool update, u32 *index); -diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c -index d5b643a1d9fd..67052dc3100c 100644 ---- a/drivers/infiniband/hw/hfi1/chip.c -+++ b/drivers/infiniband/hw/hfi1/chip.c -@@ -14452,7 +14452,7 @@ void hfi1_deinit_vnic_rsm(struct hfi1_devdata *dd) - clear_rcvctrl(dd, RCV_CTRL_RCV_RSM_ENABLE_SMASK); - } - --static void init_rxe(struct hfi1_devdata *dd) -+static int init_rxe(struct hfi1_devdata *dd) - { - struct rsm_map_table *rmt; - u64 val; -@@ -14461,6 +14461,9 @@ static void init_rxe(struct hfi1_devdata *dd) - write_csr(dd, RCV_ERR_MASK, ~0ull); - - rmt = alloc_rsm_map_table(dd); -+ if (!rmt) -+ return -ENOMEM; -+ - /* set up QOS, including the QPN map table */ - init_qos(dd, rmt); - init_fecn_handling(dd, rmt); -@@ -14487,6 +14490,7 @@ static void init_rxe(struct hfi1_devdata *dd) - val |= ((4ull & RCV_BYPASS_HDR_SIZE_MASK) << - RCV_BYPASS_HDR_SIZE_SHIFT); - write_csr(dd, RCV_BYPASS, val); -+ return 0; - } - - static void init_other(struct hfi1_devdata *dd) -@@ -15024,7 +15028,10 @@ int hfi1_init_dd(struct hfi1_devdata *dd) - goto bail_cleanup; - - /* set initial RXE CSRs */ -- init_rxe(dd); -+ ret = init_rxe(dd); -+ if (ret) -+ goto bail_cleanup; -+ - /* set initial TXE CSRs */ - init_txe(dd); - /* set initial non-RXE, non-TXE CSRs */ -diff --git a/drivers/infiniband/hw/hfi1/tid_rdma.c b/drivers/infiniband/hw/hfi1/tid_rdma.c -index aa9c8d3ef87b..fe7e7097e00a 100644 ---- a/drivers/infiniband/hw/hfi1/tid_rdma.c -+++ b/drivers/infiniband/hw/hfi1/tid_rdma.c -@@ -1620,6 +1620,7 @@ static int hfi1_kern_exp_rcv_alloc_flows(struct tid_rdma_request *req, - flows[i].req = req; - flows[i].npagesets = 0; - flows[i].pagesets[0].mapped = 0; -+ flows[i].resync_npkts = 0; - } - req->flows = flows; - return 0; -@@ -1673,34 +1674,6 @@ static struct tid_rdma_flow *find_flow_ib(struct tid_rdma_request *req, - return NULL; - } - --static struct tid_rdma_flow * --__find_flow_ranged(struct tid_rdma_request *req, u16 head, u16 tail, -- u32 psn, u16 *fidx) --{ -- for ( ; CIRC_CNT(head, tail, MAX_FLOWS); -- tail = CIRC_NEXT(tail, MAX_FLOWS)) { -- struct tid_rdma_flow *flow = &req->flows[tail]; -- u32 spsn, lpsn; -- -- spsn = full_flow_psn(flow, flow->flow_state.spsn); -- lpsn = full_flow_psn(flow, flow->flow_state.lpsn); -- -- if (cmp_psn(psn, spsn) >= 0 && cmp_psn(psn, lpsn) <= 0) { -- if (fidx) -- *fidx = tail; -- return flow; -- } -- } -- return NULL; --} -- --static struct tid_rdma_flow *find_flow(struct tid_rdma_request *req, -- u32 psn, u16 *fidx) --{ -- return __find_flow_ranged(req, req->setup_head, req->clear_tail, psn, -- fidx); --} -- - /* TID RDMA READ functions */ - u32 hfi1_build_tid_rdma_read_packet(struct rvt_swqe *wqe, - struct ib_other_headers *ohdr, u32 *bth1, -@@ -2790,19 +2763,7 @@ static bool handle_read_kdeth_eflags(struct hfi1_ctxtdata *rcd, - * to prevent continuous Flow Sequence errors for any - * packets that could be still in the fabric. - */ -- flow = find_flow(req, psn, NULL); -- if (!flow) { -- /* -- * We can't find the IB PSN matching the -- * received KDETH PSN. The only thing we can -- * do at this point is report the error to -- * the QP. -- */ -- hfi1_kern_read_tid_flow_free(qp); -- spin_unlock(&qp->s_lock); -- rvt_rc_error(qp, IB_WC_LOC_QP_OP_ERR); -- return ret; -- } -+ flow = &req->flows[req->clear_tail]; - if (priv->s_flags & HFI1_R_TID_SW_PSN) { - diff = cmp_psn(psn, - flow->flow_state.r_next_psn); -diff --git a/drivers/infiniband/hw/hfi1/verbs.c b/drivers/infiniband/hw/hfi1/verbs.c -index bad3229bad37..27f86b436b9e 100644 ---- a/drivers/infiniband/hw/hfi1/verbs.c -+++ b/drivers/infiniband/hw/hfi1/verbs.c -@@ -54,6 +54,7 @@ - #include - #include - #include -+#include - - #include "hfi.h" - #include "common.h" -@@ -1536,6 +1537,7 @@ static int hfi1_check_ah(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr) - sl = rdma_ah_get_sl(ah_attr); - if (sl >= ARRAY_SIZE(ibp->sl_to_sc)) - return -EINVAL; -+ sl = array_index_nospec(sl, ARRAY_SIZE(ibp->sl_to_sc)); - - sc5 = ibp->sl_to_sc[sl]; - if (sc_to_vlt(dd, sc5) > num_vls && sc_to_vlt(dd, sc5) != 0xf) -diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c -index 5689d742bafb..4c88d6f72574 100644 ---- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c -+++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c -@@ -772,6 +772,8 @@ static int i40iw_query_qp(struct ib_qp *ibqp, - struct i40iw_qp *iwqp = to_iwqp(ibqp); - struct i40iw_sc_qp *qp = &iwqp->sc_qp; - -+ attr->qp_state = iwqp->ibqp_state; -+ attr->cur_qp_state = attr->qp_state; - attr->qp_access_flags = 0; - attr->cap.max_send_wr = qp->qp_uk.sq_size; - attr->cap.max_recv_wr = qp->qp_uk.rq_size; -diff --git a/drivers/infiniband/hw/mlx5/mad.c b/drivers/infiniband/hw/mlx5/mad.c -index 6c529e6f3a01..348c1df69cdc 100644 ---- a/drivers/infiniband/hw/mlx5/mad.c -+++ b/drivers/infiniband/hw/mlx5/mad.c -@@ -200,19 +200,33 @@ static void pma_cnt_assign(struct ib_pma_portcounters *pma_cnt, - vl_15_dropped); - } - --static int process_pma_cmd(struct mlx5_core_dev *mdev, u8 port_num, -+static int process_pma_cmd(struct mlx5_ib_dev *dev, u8 port_num, - const struct ib_mad *in_mad, struct ib_mad *out_mad) - { -- int err; -+ struct mlx5_core_dev *mdev; -+ bool native_port = true; -+ u8 mdev_port_num; - void *out_cnt; -+ int err; - -+ mdev = mlx5_ib_get_native_port_mdev(dev, port_num, &mdev_port_num); -+ if (!mdev) { -+ /* Fail to get the native port, likely due to 2nd port is still -+ * unaffiliated. In such case default to 1st port and attached -+ * PF device. -+ */ -+ native_port = false; -+ mdev = dev->mdev; -+ mdev_port_num = 1; -+ } - /* Declaring support of extended counters */ - if (in_mad->mad_hdr.attr_id == IB_PMA_CLASS_PORT_INFO) { - struct ib_class_port_info cpi = {}; - - cpi.capability_mask = IB_PMA_CLASS_CAP_EXT_WIDTH; - memcpy((out_mad->data + 40), &cpi, sizeof(cpi)); -- return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY; -+ err = IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY; -+ goto done; - } - - if (in_mad->mad_hdr.attr_id == IB_PMA_PORT_COUNTERS_EXT) { -@@ -221,11 +235,13 @@ static int process_pma_cmd(struct mlx5_core_dev *mdev, u8 port_num, - int sz = MLX5_ST_SZ_BYTES(query_vport_counter_out); - - out_cnt = kvzalloc(sz, GFP_KERNEL); -- if (!out_cnt) -- return IB_MAD_RESULT_FAILURE; -+ if (!out_cnt) { -+ err = IB_MAD_RESULT_FAILURE; -+ goto done; -+ } - - err = mlx5_core_query_vport_counter(mdev, 0, 0, -- port_num, out_cnt, sz); -+ mdev_port_num, out_cnt, sz); - if (!err) - pma_cnt_ext_assign(pma_cnt_ext, out_cnt); - } else { -@@ -234,20 +250,23 @@ static int process_pma_cmd(struct mlx5_core_dev *mdev, u8 port_num, - int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); - - out_cnt = kvzalloc(sz, GFP_KERNEL); -- if (!out_cnt) -- return IB_MAD_RESULT_FAILURE; -+ if (!out_cnt) { -+ err = IB_MAD_RESULT_FAILURE; -+ goto done; -+ } - -- err = mlx5_core_query_ib_ppcnt(mdev, port_num, -+ err = mlx5_core_query_ib_ppcnt(mdev, mdev_port_num, - out_cnt, sz); - if (!err) - pma_cnt_assign(pma_cnt, out_cnt); -- } -- -+ } - kvfree(out_cnt); -- if (err) -- return IB_MAD_RESULT_FAILURE; -- -- return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY; -+ err = err ? IB_MAD_RESULT_FAILURE : -+ IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY; -+done: -+ if (native_port) -+ mlx5_ib_put_native_port_mdev(dev, port_num); -+ return err; - } - - int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, -@@ -259,8 +278,6 @@ int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, - struct mlx5_ib_dev *dev = to_mdev(ibdev); - const struct ib_mad *in_mad = (const struct ib_mad *)in; - struct ib_mad *out_mad = (struct ib_mad *)out; -- struct mlx5_core_dev *mdev; -- u8 mdev_port_num; - int ret; - - if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || -@@ -269,19 +286,14 @@ int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, - - memset(out_mad->data, 0, sizeof(out_mad->data)); - -- mdev = mlx5_ib_get_native_port_mdev(dev, port_num, &mdev_port_num); -- if (!mdev) -- return IB_MAD_RESULT_FAILURE; -- -- if (MLX5_CAP_GEN(mdev, vport_counters) && -+ if (MLX5_CAP_GEN(dev->mdev, vport_counters) && - in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT && - in_mad->mad_hdr.method == IB_MGMT_METHOD_GET) { -- ret = process_pma_cmd(mdev, mdev_port_num, in_mad, out_mad); -+ ret = process_pma_cmd(dev, port_num, in_mad, out_mad); - } else { - ret = process_mad(ibdev, mad_flags, port_num, in_wc, in_grh, - in_mad, out_mad); - } -- mlx5_ib_put_native_port_mdev(dev, port_num); - return ret; - } - -diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c -index 340290b883fe..a6713a3b6c80 100644 ---- a/drivers/infiniband/hw/mlx5/main.c -+++ b/drivers/infiniband/hw/mlx5/main.c -@@ -1043,15 +1043,19 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, - } - - if (MLX5_CAP_GEN(mdev, tag_matching)) { -- props->tm_caps.max_rndv_hdr_size = MLX5_TM_MAX_RNDV_MSG_SIZE; - props->tm_caps.max_num_tags = - (1 << MLX5_CAP_GEN(mdev, log_tag_matching_list_sz)) - 1; -- props->tm_caps.flags = IB_TM_CAP_RC; - props->tm_caps.max_ops = - 1 << MLX5_CAP_GEN(mdev, log_max_qp_sz); - props->tm_caps.max_sge = MLX5_TM_MAX_SGE; - } - -+ if (MLX5_CAP_GEN(mdev, tag_matching) && -+ MLX5_CAP_GEN(mdev, rndv_offload_rc)) { -+ props->tm_caps.flags = IB_TM_CAP_RNDV_RC; -+ props->tm_caps.max_rndv_hdr_size = MLX5_TM_MAX_RNDV_MSG_SIZE; -+ } -+ - if (MLX5_CAP_GEN(dev->mdev, cq_moderation)) { - props->cq_caps.max_cq_moderation_count = - MLX5_MAX_CQ_COUNT; -diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h -index 40eb8be482e4..f52b845f2f7b 100644 ---- a/drivers/infiniband/hw/mlx5/mlx5_ib.h -+++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h -@@ -480,6 +480,7 @@ struct mlx5_umr_wr { - u64 length; - int access_flags; - u32 mkey; -+ u8 ignore_free_state:1; - }; - - static inline const struct mlx5_umr_wr *umr_wr(const struct ib_send_wr *wr) -diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c -index 5f09699fab98..e54bec2c2965 100644 ---- a/drivers/infiniband/hw/mlx5/mr.c -+++ b/drivers/infiniband/hw/mlx5/mr.c -@@ -545,13 +545,16 @@ void mlx5_mr_cache_free(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) - return; - - c = order2idx(dev, mr->order); -- if (c < 0 || c >= MAX_MR_CACHE_ENTRIES) { -- mlx5_ib_warn(dev, "order %d, cache index %d\n", mr->order, c); -- return; -- } -+ WARN_ON(c < 0 || c >= MAX_MR_CACHE_ENTRIES); - -- if (unreg_umr(dev, mr)) -+ if (unreg_umr(dev, mr)) { -+ mr->allocated_from_cache = false; -+ destroy_mkey(dev, mr); -+ ent = &cache->ent[c]; -+ if (ent->cur < ent->limit) -+ queue_work(cache->wq, &ent->work); - return; -+ } - - ent = &cache->ent[c]; - spin_lock_irq(&ent->lock); -@@ -1373,9 +1376,11 @@ static int unreg_umr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) - return 0; - - umrwr.wr.send_flags = MLX5_IB_SEND_UMR_DISABLE_MR | -- MLX5_IB_SEND_UMR_FAIL_IF_FREE; -+ MLX5_IB_SEND_UMR_UPDATE_PD_ACCESS; - umrwr.wr.opcode = MLX5_IB_WR_UMR; -+ umrwr.pd = dev->umrc.pd; - umrwr.mkey = mr->mmkey.key; -+ umrwr.ignore_free_state = 1; - - return mlx5_ib_post_send_wait(dev, &umrwr); - } -@@ -1578,10 +1583,10 @@ static void clean_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) - mr->sig = NULL; - } - -- mlx5_free_priv_descs(mr); -- -- if (!allocated_from_cache) -+ if (!allocated_from_cache) { - destroy_mkey(dev, mr); -+ mlx5_free_priv_descs(mr); -+ } - } - - static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) -diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c -index f6623c77443a..6dbca72a73b1 100644 ---- a/drivers/infiniband/hw/mlx5/qp.c -+++ b/drivers/infiniband/hw/mlx5/qp.c -@@ -1718,7 +1718,6 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, - } - - MLX5_SET(tirc, tirc, rx_hash_fn, MLX5_RX_HASH_FN_TOEPLITZ); -- MLX5_SET(tirc, tirc, rx_hash_symmetric, 1); - memcpy(rss_key, ucmd.rx_hash_key, len); - break; - } -@@ -4262,10 +4261,14 @@ static int set_reg_umr_segment(struct mlx5_ib_dev *dev, - - memset(umr, 0, sizeof(*umr)); - -- if (wr->send_flags & MLX5_IB_SEND_UMR_FAIL_IF_FREE) -- umr->flags = MLX5_UMR_CHECK_FREE; /* fail if free */ -- else -- umr->flags = MLX5_UMR_CHECK_NOT_FREE; /* fail if not free */ -+ if (!umrwr->ignore_free_state) { -+ if (wr->send_flags & MLX5_IB_SEND_UMR_FAIL_IF_FREE) -+ /* fail if free */ -+ umr->flags = MLX5_UMR_CHECK_FREE; -+ else -+ /* fail if not free */ -+ umr->flags = MLX5_UMR_CHECK_NOT_FREE; -+ } - - umr->xlt_octowords = cpu_to_be16(get_xlt_octo(umrwr->xlt_size)); - if (wr->send_flags & MLX5_IB_SEND_UMR_UPDATE_XLT) { -diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c -index aca9f60f9b21..1cbfbd98eb22 100644 ---- a/drivers/infiniband/sw/rxe/rxe_resp.c -+++ b/drivers/infiniband/sw/rxe/rxe_resp.c -@@ -431,6 +431,7 @@ static enum resp_states check_rkey(struct rxe_qp *qp, - qp->resp.va = reth_va(pkt); - qp->resp.rkey = reth_rkey(pkt); - qp->resp.resid = reth_len(pkt); -+ qp->resp.length = reth_len(pkt); - } - access = (pkt->mask & RXE_READ_MASK) ? IB_ACCESS_REMOTE_READ - : IB_ACCESS_REMOTE_WRITE; -@@ -856,7 +857,9 @@ static enum resp_states do_complete(struct rxe_qp *qp, - pkt->mask & RXE_WRITE_MASK) ? - IB_WC_RECV_RDMA_WITH_IMM : IB_WC_RECV; - wc->vendor_err = 0; -- wc->byte_len = wqe->dma.length - wqe->dma.resid; -+ wc->byte_len = (pkt->mask & RXE_IMMDT_MASK && -+ pkt->mask & RXE_WRITE_MASK) ? -+ qp->resp.length : wqe->dma.length - wqe->dma.resid; - - /* fields after byte_len are different between kernel and user - * space -diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h -index e8be7f44e3be..28bfb3ece104 100644 ---- a/drivers/infiniband/sw/rxe/rxe_verbs.h -+++ b/drivers/infiniband/sw/rxe/rxe_verbs.h -@@ -213,6 +213,7 @@ struct rxe_resp_info { - struct rxe_mem *mr; - u32 resid; - u32 rkey; -+ u32 length; - u64 atomic_orig; - - /* SRQ only */ -diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c -index 9b5e11d3fb85..ac0583ff280d 100644 ---- a/drivers/infiniband/ulp/ipoib/ipoib_main.c -+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c -@@ -1893,12 +1893,6 @@ static void ipoib_child_init(struct net_device *ndev) - struct ipoib_dev_priv *priv = ipoib_priv(ndev); - struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent); - -- dev_hold(priv->parent); -- -- down_write(&ppriv->vlan_rwsem); -- list_add_tail(&priv->list, &ppriv->child_intfs); -- up_write(&ppriv->vlan_rwsem); -- - priv->max_ib_mtu = ppriv->max_ib_mtu; - set_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags); - memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr, INFINIBAND_ALEN); -@@ -1941,6 +1935,17 @@ static int ipoib_ndo_init(struct net_device *ndev) - if (rc) { - pr_warn("%s: failed to initialize device: %s port %d (ret = %d)\n", - priv->ca->name, priv->dev->name, priv->port, rc); -+ return rc; -+ } -+ -+ if (priv->parent) { -+ struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent); -+ -+ dev_hold(priv->parent); -+ -+ down_write(&ppriv->vlan_rwsem); -+ list_add_tail(&priv->list, &ppriv->child_intfs); -+ up_write(&ppriv->vlan_rwsem); - } - - return 0; -@@ -1958,6 +1963,14 @@ static void ipoib_ndo_uninit(struct net_device *dev) - */ - WARN_ON(!list_empty(&priv->child_intfs)); - -+ if (priv->parent) { -+ struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent); -+ -+ down_write(&ppriv->vlan_rwsem); -+ list_del(&priv->list); -+ up_write(&ppriv->vlan_rwsem); -+ } -+ - ipoib_neigh_hash_uninit(dev); - - ipoib_ib_dev_cleanup(dev); -@@ -1969,15 +1982,8 @@ static void ipoib_ndo_uninit(struct net_device *dev) - priv->wq = NULL; - } - -- if (priv->parent) { -- struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent); -- -- down_write(&ppriv->vlan_rwsem); -- list_del(&priv->list); -- up_write(&ppriv->vlan_rwsem); -- -+ if (priv->parent) - dev_put(priv->parent); -- } - } - - static int ipoib_set_vf_link_state(struct net_device *dev, int vf, int link_state) -@@ -1998,6 +2004,7 @@ static int ipoib_get_vf_config(struct net_device *dev, int vf, - return err; - - ivf->vf = vf; -+ memcpy(ivf->mac, dev->dev_addr, dev->addr_len); - - return 0; - } -diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c -index 4305da2c9037..0b09d0cd9b3c 100644 ---- a/drivers/infiniband/ulp/srp/ib_srp.c -+++ b/drivers/infiniband/ulp/srp/ib_srp.c -@@ -3483,13 +3483,14 @@ static const match_table_t srp_opt_tokens = { - * @net: [in] Network namespace. - * @sa: [out] Address family, IP address and port number. - * @addr_port_str: [in] IP address and port number. -+ * @has_port: [out] Whether or not @addr_port_str includes a port number. - * - * Parse the following address formats: - * - IPv4: :, e.g. 1.2.3.4:5. - * - IPv6: \[\]:, e.g. [1::2:3%4]:5. - */ - static int srp_parse_in(struct net *net, struct sockaddr_storage *sa, -- const char *addr_port_str) -+ const char *addr_port_str, bool *has_port) - { - char *addr_end, *addr = kstrdup(addr_port_str, GFP_KERNEL); - char *port_str; -@@ -3498,9 +3499,12 @@ static int srp_parse_in(struct net *net, struct sockaddr_storage *sa, - if (!addr) - return -ENOMEM; - port_str = strrchr(addr, ':'); -- if (!port_str) -- return -EINVAL; -- *port_str++ = '\0'; -+ if (port_str && strchr(port_str, ']')) -+ port_str = NULL; -+ if (port_str) -+ *port_str++ = '\0'; -+ if (has_port) -+ *has_port = port_str != NULL; - ret = inet_pton_with_scope(net, AF_INET, addr, port_str, sa); - if (ret && addr[0]) { - addr_end = addr + strlen(addr) - 1; -@@ -3522,6 +3526,7 @@ static int srp_parse_options(struct net *net, const char *buf, - char *p; - substring_t args[MAX_OPT_ARGS]; - unsigned long long ull; -+ bool has_port; - int opt_mask = 0; - int token; - int ret = -EINVAL; -@@ -3620,7 +3625,8 @@ static int srp_parse_options(struct net *net, const char *buf, - ret = -ENOMEM; - goto out; - } -- ret = srp_parse_in(net, &target->rdma_cm.src.ss, p); -+ ret = srp_parse_in(net, &target->rdma_cm.src.ss, p, -+ NULL); - if (ret < 0) { - pr_warn("bad source parameter '%s'\n", p); - kfree(p); -@@ -3636,7 +3642,10 @@ static int srp_parse_options(struct net *net, const char *buf, - ret = -ENOMEM; - goto out; - } -- ret = srp_parse_in(net, &target->rdma_cm.dst.ss, p); -+ ret = srp_parse_in(net, &target->rdma_cm.dst.ss, p, -+ &has_port); -+ if (!has_port) -+ ret = -EINVAL; - if (ret < 0) { - pr_warn("bad dest parameter '%s'\n", p); - kfree(p); -diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c -index 8996323ce8d9..34700eda0429 100644 ---- a/drivers/input/mouse/alps.c -+++ b/drivers/input/mouse/alps.c -@@ -21,6 +21,7 @@ - - #include "psmouse.h" - #include "alps.h" -+#include "trackpoint.h" - - /* - * Definitions for ALPS version 3 and 4 command mode protocol -@@ -2861,6 +2862,23 @@ static const struct alps_protocol_info *alps_match_table(unsigned char *e7, - return NULL; - } - -+static bool alps_is_cs19_trackpoint(struct psmouse *psmouse) -+{ -+ u8 param[2] = { 0 }; -+ -+ if (ps2_command(&psmouse->ps2dev, -+ param, MAKE_PS2_CMD(0, 2, TP_READ_ID))) -+ return false; -+ -+ /* -+ * param[0] contains the trackpoint device variant_id while -+ * param[1] contains the firmware_id. So far all alps -+ * trackpoint-only devices have their variant_ids equal -+ * TP_VARIANT_ALPS and their firmware_ids are in 0x20~0x2f range. -+ */ -+ return param[0] == TP_VARIANT_ALPS && ((param[1] & 0xf0) == 0x20); -+} -+ - static int alps_identify(struct psmouse *psmouse, struct alps_data *priv) - { - const struct alps_protocol_info *protocol; -@@ -3161,6 +3179,20 @@ int alps_detect(struct psmouse *psmouse, bool set_properties) - if (error) - return error; - -+ /* -+ * ALPS cs19 is a trackpoint-only device, and uses different -+ * protocol than DualPoint ones, so we return -EINVAL here and let -+ * trackpoint.c drive this device. If the trackpoint driver is not -+ * enabled, the device will fall back to a bare PS/2 mouse. -+ * If ps2_command() fails here, we depend on the immediately -+ * followed psmouse_reset() to reset the device to normal state. -+ */ -+ if (alps_is_cs19_trackpoint(psmouse)) { -+ psmouse_dbg(psmouse, -+ "ALPS CS19 trackpoint-only device detected, ignoring\n"); -+ return -EINVAL; -+ } -+ - /* - * Reset the device to make sure it is fully operational: - * on some laptops, like certain Dell Latitudes, we may -diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c -index a4345052abd2..a47c7add4e0e 100644 ---- a/drivers/input/mouse/elantech.c -+++ b/drivers/input/mouse/elantech.c -@@ -1807,6 +1807,30 @@ static int elantech_create_smbus(struct psmouse *psmouse, - leave_breadcrumbs); - } - -+static bool elantech_use_host_notify(struct psmouse *psmouse, -+ struct elantech_device_info *info) -+{ -+ if (ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version)) -+ return true; -+ -+ switch (info->bus) { -+ case ETP_BUS_PS2_ONLY: -+ /* expected case */ -+ break; -+ case ETP_BUS_SMB_HST_NTFY_ONLY: -+ case ETP_BUS_PS2_SMB_HST_NTFY: -+ /* SMbus implementation is stable since 2018 */ -+ if (dmi_get_bios_year() >= 2018) -+ return true; -+ default: -+ psmouse_dbg(psmouse, -+ "Ignoring SMBus bus provider %d\n", info->bus); -+ break; -+ } -+ -+ return false; -+} -+ - /** - * elantech_setup_smbus - called once the PS/2 devices are enumerated - * and decides to instantiate a SMBus InterTouch device. -@@ -1826,7 +1850,7 @@ static int elantech_setup_smbus(struct psmouse *psmouse, - * i2c_blacklist_pnp_ids. - * Old ICs are up to the user to decide. - */ -- if (!ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version) || -+ if (!elantech_use_host_notify(psmouse, info) || - psmouse_matches_pnp_id(psmouse, i2c_blacklist_pnp_ids)) - return -ENXIO; - } -@@ -1846,34 +1870,6 @@ static int elantech_setup_smbus(struct psmouse *psmouse, - return 0; - } - --static bool elantech_use_host_notify(struct psmouse *psmouse, -- struct elantech_device_info *info) --{ -- if (ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version)) -- return true; -- -- switch (info->bus) { -- case ETP_BUS_PS2_ONLY: -- /* expected case */ -- break; -- case ETP_BUS_SMB_ALERT_ONLY: -- /* fall-through */ -- case ETP_BUS_PS2_SMB_ALERT: -- psmouse_dbg(psmouse, "Ignoring SMBus provider through alert protocol.\n"); -- break; -- case ETP_BUS_SMB_HST_NTFY_ONLY: -- /* fall-through */ -- case ETP_BUS_PS2_SMB_HST_NTFY: -- return true; -- default: -- psmouse_dbg(psmouse, -- "Ignoring SMBus bus provider %d.\n", -- info->bus); -- } -- -- return false; --} -- - int elantech_init_smbus(struct psmouse *psmouse) - { - struct elantech_device_info info; -diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c -index b8ec301025b7..d0e32ae71312 100644 ---- a/drivers/input/mouse/synaptics.c -+++ b/drivers/input/mouse/synaptics.c -@@ -173,13 +173,16 @@ static const char * const smbus_pnp_ids[] = { - "LEN0072", /* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */ - "LEN0073", /* X1 Carbon G5 (Elantech) */ - "LEN0092", /* X1 Carbon 6 */ -+ "LEN0093", /* T480 */ - "LEN0096", /* X280 */ - "LEN0097", /* X280 -> ALPS trackpoint */ -+ "LEN009b", /* T580 */ - "LEN200f", /* T450s */ - "LEN2054", /* E480 */ - "LEN2055", /* E580 */ - "SYN3052", /* HP EliteBook 840 G4 */ - "SYN3221", /* HP 15-ay000 */ -+ "SYN323d", /* HP Spectre X360 13-w013dx */ - NULL - }; - -@@ -1339,7 +1342,9 @@ static int set_input_params(struct psmouse *psmouse, - if (psmouse_matches_pnp_id(psmouse, topbuttonpad_pnp_ids) && - !SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10)) - __set_bit(INPUT_PROP_TOPBUTTONPAD, dev->propbit); -- } -+ } else if (SYN_CAP_CLICKPAD2BTN(info->ext_cap_0c) || -+ SYN_CAP_CLICKPAD2BTN2(info->ext_cap_0c)) -+ __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); - - return 0; - } -diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h -index 08533d1b1b16..e85f840a27b3 100644 ---- a/drivers/input/mouse/synaptics.h -+++ b/drivers/input/mouse/synaptics.h -@@ -83,6 +83,7 @@ - */ - #define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & BIT(20)) /* 1-button ClickPad */ - #define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & BIT(8)) /* 2-button ClickPad */ -+#define SYN_CAP_CLICKPAD2BTN2(ex0c) ((ex0c) & BIT(21)) /* 2-button ClickPad */ - #define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & BIT(17)) - #define SYN_CAP_MIN_DIMENSIONS(ex0c) ((ex0c) & BIT(13)) - #define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & BIT(19)) -diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c -index 4b8b9d7aa75e..35031228a6d0 100644 ---- a/drivers/input/tablet/gtco.c -+++ b/drivers/input/tablet/gtco.c -@@ -78,6 +78,7 @@ Scott Hill shill@gtcocalcomp.com - - /* Max size of a single report */ - #define REPORT_MAX_SIZE 10 -+#define MAX_COLLECTION_LEVELS 10 - - - /* Bitmask whether pen is in range */ -@@ -223,8 +224,7 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report, - char maintype = 'x'; - char globtype[12]; - int indent = 0; -- char indentstr[10] = ""; -- -+ char indentstr[MAX_COLLECTION_LEVELS + 1] = { 0 }; - - dev_dbg(ddev, "======>>>>>>PARSE<<<<<<======\n"); - -@@ -350,6 +350,13 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report, - case TAG_MAIN_COL_START: - maintype = 'S'; - -+ if (indent == MAX_COLLECTION_LEVELS) { -+ dev_err(ddev, "Collection level %d would exceed limit of %d\n", -+ indent + 1, -+ MAX_COLLECTION_LEVELS); -+ break; -+ } -+ - if (data == 0) { - dev_dbg(ddev, "======>>>>>> Physical\n"); - strcpy(globtype, "Physical"); -@@ -369,8 +376,15 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report, - break; - - case TAG_MAIN_COL_END: -- dev_dbg(ddev, "<<<<<<======\n"); - maintype = 'E'; -+ -+ if (indent == 0) { -+ dev_err(ddev, "Collection level already at zero\n"); -+ break; -+ } -+ -+ dev_dbg(ddev, "<<<<<<======\n"); -+ - indent--; - for (x = 0; x < indent; x++) - indentstr[x] = '-'; -diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c -index a2cec6cacf57..16d70201de4a 100644 ---- a/drivers/input/touchscreen/usbtouchscreen.c -+++ b/drivers/input/touchscreen/usbtouchscreen.c -@@ -1659,6 +1659,8 @@ static int usbtouch_probe(struct usb_interface *intf, - if (!usbtouch || !input_dev) - goto out_free; - -+ mutex_init(&usbtouch->pm_mutex); -+ - type = &usbtouch_dev_info[id->driver_info]; - usbtouch->type = type; - if (!type->process_pkt) -diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c -index 4d5a694f02c2..0fee8f7957ec 100644 ---- a/drivers/iommu/arm-smmu-v3.c -+++ b/drivers/iommu/arm-smmu-v3.c -@@ -1884,9 +1884,13 @@ static int arm_smmu_enable_ats(struct arm_smmu_master *master) - - static void arm_smmu_disable_ats(struct arm_smmu_master *master) - { -+ struct arm_smmu_cmdq_ent cmd; -+ - if (!master->ats_enabled || !dev_is_pci(master->dev)) - return; - -+ arm_smmu_atc_inv_to_cmd(0, 0, 0, &cmd); -+ arm_smmu_atc_inv_master(master, &cmd); - pci_disable_ats(to_pci_dev(master->dev)); - master->ats_enabled = false; - } -@@ -1906,7 +1910,6 @@ static void arm_smmu_detach_dev(struct arm_smmu_master *master) - master->domain = NULL; - arm_smmu_install_ste_for_dev(master); - -- /* Disabling ATS invalidates all ATC entries */ - arm_smmu_disable_ats(master); - } - -diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c -index 162b3236e72c..2101601adf57 100644 ---- a/drivers/iommu/intel-iommu.c -+++ b/drivers/iommu/intel-iommu.c -@@ -3752,7 +3752,8 @@ static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size) - - freelist = domain_unmap(domain, start_pfn, last_pfn); - -- if (intel_iommu_strict || (pdev && pdev->untrusted)) { -+ if (intel_iommu_strict || (pdev && pdev->untrusted) || -+ !has_iova_flush_queue(&domain->iovad)) { - iommu_flush_iotlb_psi(iommu, domain, start_pfn, - nrpages, !freelist, 0); - /* free iova */ -diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c -index 9f0a2844371c..30db41e9f15c 100644 ---- a/drivers/iommu/iommu.c -+++ b/drivers/iommu/iommu.c -@@ -225,18 +225,21 @@ static int iommu_insert_resv_region(struct iommu_resv_region *new, - pos = pos->next; - } else if ((start >= a) && (end <= b)) { - if (new->type == type) -- goto done; -+ return 0; - else - pos = pos->next; - } else { - if (new->type == type) { - phys_addr_t new_start = min(a, start); - phys_addr_t new_end = max(b, end); -+ int ret; - - list_del(&entry->list); - entry->start = new_start; - entry->length = new_end - new_start + 1; -- iommu_insert_resv_region(entry, regions); -+ ret = iommu_insert_resv_region(entry, regions); -+ kfree(entry); -+ return ret; - } else { - pos = pos->next; - } -@@ -249,7 +252,6 @@ static int iommu_insert_resv_region(struct iommu_resv_region *new, - return -ENOMEM; - - list_add_tail(®ion->list, pos); --done: - return 0; - } - -diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c -index d499b2621239..3e1a8a675572 100644 ---- a/drivers/iommu/iova.c -+++ b/drivers/iommu/iova.c -@@ -54,9 +54,14 @@ init_iova_domain(struct iova_domain *iovad, unsigned long granule, - } - EXPORT_SYMBOL_GPL(init_iova_domain); - -+bool has_iova_flush_queue(struct iova_domain *iovad) -+{ -+ return !!iovad->fq; -+} -+ - static void free_iova_flush_queue(struct iova_domain *iovad) - { -- if (!iovad->fq) -+ if (!has_iova_flush_queue(iovad)) - return; - - if (timer_pending(&iovad->fq_timer)) -@@ -74,13 +79,14 @@ static void free_iova_flush_queue(struct iova_domain *iovad) - int init_iova_flush_queue(struct iova_domain *iovad, - iova_flush_cb flush_cb, iova_entry_dtor entry_dtor) - { -+ struct iova_fq __percpu *queue; - int cpu; - - atomic64_set(&iovad->fq_flush_start_cnt, 0); - atomic64_set(&iovad->fq_flush_finish_cnt, 0); - -- iovad->fq = alloc_percpu(struct iova_fq); -- if (!iovad->fq) -+ queue = alloc_percpu(struct iova_fq); -+ if (!queue) - return -ENOMEM; - - iovad->flush_cb = flush_cb; -@@ -89,13 +95,17 @@ int init_iova_flush_queue(struct iova_domain *iovad, - for_each_possible_cpu(cpu) { - struct iova_fq *fq; - -- fq = per_cpu_ptr(iovad->fq, cpu); -+ fq = per_cpu_ptr(queue, cpu); - fq->head = 0; - fq->tail = 0; - - spin_lock_init(&fq->lock); - } - -+ smp_wmb(); -+ -+ iovad->fq = queue; -+ - timer_setup(&iovad->fq_timer, fq_flush_timeout, 0); - atomic_set(&iovad->fq_timer_on, 0); - -@@ -127,8 +137,9 @@ __cached_rbnode_delete_update(struct iova_domain *iovad, struct iova *free) - struct iova *cached_iova; - - cached_iova = rb_entry(iovad->cached32_node, struct iova, node); -- if (free->pfn_hi < iovad->dma_32bit_pfn && -- free->pfn_lo >= cached_iova->pfn_lo) { -+ if (free == cached_iova || -+ (free->pfn_hi < iovad->dma_32bit_pfn && -+ free->pfn_lo >= cached_iova->pfn_lo)) { - iovad->cached32_node = rb_next(&free->node); - iovad->max32_alloc_size = iovad->dma_32bit_pfn; - } -diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c -index 6377cb864f4c..f3e44d6d9255 100644 ---- a/drivers/irqchip/irq-gic-v3.c -+++ b/drivers/irqchip/irq-gic-v3.c -@@ -461,8 +461,12 @@ static void gic_deactivate_unhandled(u32 irqnr) - - static inline void gic_handle_nmi(u32 irqnr, struct pt_regs *regs) - { -+ bool irqs_enabled = interrupts_enabled(regs); - int err; - -+ if (irqs_enabled) -+ nmi_enter(); -+ - if (static_branch_likely(&supports_deactivate_key)) - gic_write_eoir(irqnr); - /* -@@ -474,6 +478,9 @@ static inline void gic_handle_nmi(u32 irqnr, struct pt_regs *regs) - err = handle_domain_nmi(gic_data.domain, irqnr, regs); - if (err) - gic_deactivate_unhandled(irqnr); -+ -+ if (irqs_enabled) -+ nmi_exit(); - } - - static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) -diff --git a/drivers/irqchip/irq-meson-gpio.c b/drivers/irqchip/irq-meson-gpio.c -index 8eb92eb98f54..dcdc23b9dce6 100644 ---- a/drivers/irqchip/irq-meson-gpio.c -+++ b/drivers/irqchip/irq-meson-gpio.c -@@ -60,6 +60,7 @@ static const struct of_device_id meson_irq_gpio_matches[] = { - { .compatible = "amlogic,meson-gxbb-gpio-intc", .data = &gxbb_params }, - { .compatible = "amlogic,meson-gxl-gpio-intc", .data = &gxl_params }, - { .compatible = "amlogic,meson-axg-gpio-intc", .data = &axg_params }, -+ { .compatible = "amlogic,meson-g12a-gpio-intc", .data = &axg_params }, - { } - }; - -diff --git a/drivers/isdn/hardware/mISDN/hfcsusb.c b/drivers/isdn/hardware/mISDN/hfcsusb.c -index 4c99739b937e..0e224232f746 100644 ---- a/drivers/isdn/hardware/mISDN/hfcsusb.c -+++ b/drivers/isdn/hardware/mISDN/hfcsusb.c -@@ -1955,6 +1955,9 @@ hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id) - - /* get endpoint base */ - idx = ((ep_addr & 0x7f) - 1) * 2; -+ if (idx > 15) -+ return -EIO; -+ - if (ep_addr & 0x80) - idx++; - attr = ep->desc.bmAttributes; -diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c -index 7d555b110ecd..a600934fdd9c 100644 ---- a/drivers/lightnvm/core.c -+++ b/drivers/lightnvm/core.c -@@ -478,7 +478,7 @@ static void __nvm_remove_target(struct nvm_target *t, bool graceful) - */ - static int nvm_remove_tgt(struct nvm_ioctl_remove *remove) - { -- struct nvm_target *t; -+ struct nvm_target *t = NULL; - struct nvm_dev *dev; - - down_read(&nvm_lock); -diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c -index 773537804319..f546e6f28b8a 100644 ---- a/drivers/lightnvm/pblk-core.c -+++ b/drivers/lightnvm/pblk-core.c -@@ -323,14 +323,16 @@ void pblk_free_rqd(struct pblk *pblk, struct nvm_rq *rqd, int type) - void pblk_bio_free_pages(struct pblk *pblk, struct bio *bio, int off, - int nr_pages) - { -- struct bio_vec bv; -- int i; -- -- WARN_ON(off + nr_pages != bio->bi_vcnt); -- -- for (i = off; i < nr_pages + off; i++) { -- bv = bio->bi_io_vec[i]; -- mempool_free(bv.bv_page, &pblk->page_bio_pool); -+ struct bio_vec *bv; -+ struct page *page; -+ int i, e, nbv = 0; -+ -+ for (i = 0; i < bio->bi_vcnt; i++) { -+ bv = &bio->bi_io_vec[i]; -+ page = bv->bv_page; -+ for (e = 0; e < bv->bv_len; e += PBLK_EXPOSED_PAGE_SIZE, nbv++) -+ if (nbv >= off) -+ mempool_free(page++, &pblk->page_bio_pool); - } - } - -diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig -index 574e122ae105..bd4d86fc8244 100644 ---- a/drivers/macintosh/Kconfig -+++ b/drivers/macintosh/Kconfig -@@ -149,6 +149,13 @@ config INPUT_ADBHID - - If unsure, say Y. - -+config ADB_TRACKPAD_ABSOLUTE -+ bool "Enable absolute mode for adb trackpads" -+ depends on INPUT_ADBHID -+ help -+ Enable absolute mode in adb-base trackpads. This feature adds -+ compatibility with synaptics Xorg / Xfree drivers. -+ - config MAC_EMUMOUSEBTN - tristate "Support for mouse button 2+3 emulation" - depends on SYSCTL && INPUT -diff --git a/drivers/macintosh/adbhid.c b/drivers/macintosh/adbhid.c -index 75482eeab2c4..13f9321e06b2 100644 ---- a/drivers/macintosh/adbhid.c -+++ b/drivers/macintosh/adbhid.c -@@ -262,6 +262,15 @@ static struct adb_ids buttons_ids; - #define ADBMOUSE_MS_A3 8 /* Mouse systems A3 trackball (handler 3) */ - #define ADBMOUSE_MACALLY2 9 /* MacAlly 2-button mouse */ - -+#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE -+#define ABS_XMIN 310 -+#define ABS_XMAX 1700 -+#define ABS_YMIN 200 -+#define ABS_YMAX 1000 -+#define ABS_ZMIN 0 -+#define ABS_ZMAX 55 -+#endif -+ - static void - adbhid_keyboard_input(unsigned char *data, int nb, int apoll) - { -@@ -405,6 +414,9 @@ static void - adbhid_mouse_input(unsigned char *data, int nb, int autopoll) - { - int id = (data[0] >> 4) & 0x0f; -+#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE -+ int btn = 0; int x_axis = 0; int y_axis = 0; int z_axis = 0; -+#endif - - if (!adbhid[id]) { - pr_err("ADB HID on ID %d not yet registered\n", id); -@@ -436,6 +448,17 @@ adbhid_mouse_input(unsigned char *data, int nb, int autopoll) - high bits of y-axis motion. XY is additional - high bits of x-axis motion. - -+ For ADB Absolute motion protocol the data array will contain the -+ following values: -+ -+ BITS COMMENTS -+ data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd. -+ data[1] = byyy yyyy Left button and y-axis motion. -+ data[2] = bxxx xxxx Second button and x-axis motion. -+ data[3] = 1yyy 1xxx Half bits of y-axis and x-axis motion. -+ data[4] = 1yyy 1xxx Higher bits of y-axis and x-axis motion. -+ data[5] = 1zzz 1zzz Higher and lower bits of z-pressure. -+ - MacAlly 2-button mouse protocol. - - For MacAlly 2-button mouse protocol the data array will contain the -@@ -458,8 +481,17 @@ adbhid_mouse_input(unsigned char *data, int nb, int autopoll) - switch (adbhid[id]->mouse_kind) - { - case ADBMOUSE_TRACKPAD: -+#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE -+ x_axis = (data[2] & 0x7f) | ((data[3] & 0x07) << 7) | -+ ((data[4] & 0x07) << 10); -+ y_axis = (data[1] & 0x7f) | ((data[3] & 0x70) << 3) | -+ ((data[4] & 0x70) << 6); -+ z_axis = (data[5] & 0x07) | ((data[5] & 0x70) >> 1); -+ btn = (!(data[1] >> 7)) & 1; -+#else - data[1] = (data[1] & 0x7f) | ((data[1] & data[2]) & 0x80); - data[2] = data[2] | 0x80; -+#endif - break; - case ADBMOUSE_MICROSPEED: - data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7); -@@ -485,17 +517,39 @@ adbhid_mouse_input(unsigned char *data, int nb, int autopoll) - break; - } - -- input_report_key(adbhid[id]->input, BTN_LEFT, !((data[1] >> 7) & 1)); -- input_report_key(adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1)); -+#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE -+ if ( adbhid[id]->mouse_kind == ADBMOUSE_TRACKPAD ) { - -- if (nb >= 4 && adbhid[id]->mouse_kind != ADBMOUSE_TRACKPAD) -- input_report_key(adbhid[id]->input, BTN_RIGHT, !((data[3] >> 7) & 1)); -+ if(z_axis > 30) input_report_key(adbhid[id]->input, BTN_TOUCH, 1); -+ if(z_axis < 25) input_report_key(adbhid[id]->input, BTN_TOUCH, 0); - -- input_report_rel(adbhid[id]->input, REL_X, -- ((data[2]&0x7f) < 64 ? (data[2]&0x7f) : (data[2]&0x7f)-128 )); -- input_report_rel(adbhid[id]->input, REL_Y, -- ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 )); -+ if(z_axis > 0){ -+ input_report_abs(adbhid[id]->input, ABS_X, x_axis); -+ input_report_abs(adbhid[id]->input, ABS_Y, y_axis); -+ input_report_key(adbhid[id]->input, BTN_TOOL_FINGER, 1); -+ input_report_key(adbhid[id]->input, ABS_TOOL_WIDTH, 5); -+ } else { -+ input_report_key(adbhid[id]->input, BTN_TOOL_FINGER, 0); -+ input_report_key(adbhid[id]->input, ABS_TOOL_WIDTH, 0); -+ } -+ -+ input_report_abs(adbhid[id]->input, ABS_PRESSURE, z_axis); -+ input_report_key(adbhid[id]->input, BTN_LEFT, btn); -+ } else { -+#endif -+ input_report_key(adbhid[id]->input, BTN_LEFT, !((data[1] >> 7) & 1)); -+ input_report_key(adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1)); -+ -+ if (nb >= 4 && adbhid[id]->mouse_kind != ADBMOUSE_TRACKPAD) -+ input_report_key(adbhid[id]->input, BTN_RIGHT, !((data[3] >> 7) & 1)); - -+ input_report_rel(adbhid[id]->input, REL_X, -+ ((data[2]&0x7f) < 64 ? (data[2]&0x7f) : (data[2]&0x7f)-128 )); -+ input_report_rel(adbhid[id]->input, REL_Y, -+ ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 )); -+#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE -+ } -+#endif - input_sync(adbhid[id]->input); - } - -@@ -850,6 +904,15 @@ adbhid_input_register(int id, int default_id, int original_handler_id, - input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | - BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); - input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); -+#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE -+ set_bit(EV_ABS, input_dev->evbit); -+ input_set_abs_params(input_dev, ABS_X, ABS_XMIN, ABS_XMAX, 0, 0); -+ input_set_abs_params(input_dev, ABS_Y, ABS_YMIN, ABS_YMAX, 0, 0); -+ input_set_abs_params(input_dev, ABS_PRESSURE, ABS_ZMIN, ABS_ZMAX, 0, 0); -+ set_bit(BTN_TOUCH, input_dev->keybit); -+ set_bit(BTN_TOOL_FINGER, input_dev->keybit); -+ set_bit(ABS_TOOL_WIDTH, input_dev->absbit); -+#endif - break; - - case ADB_MISC: -@@ -1128,7 +1191,11 @@ init_trackpad(int id) - r1_buffer[3], - r1_buffer[4], - r1_buffer[5], -+#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE -+ 0x00, /* Enable absolute mode */ -+#else - 0x03, /*r1_buffer[6],*/ -+#endif - r1_buffer[7]); - - /* Without this flush, the trackpad may be locked up */ -diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c -index f4b1950d35f3..0b821a5b2db8 100644 ---- a/drivers/mailbox/mailbox.c -+++ b/drivers/mailbox/mailbox.c -@@ -418,11 +418,13 @@ struct mbox_chan *mbox_request_channel_byname(struct mbox_client *cl, - - of_property_for_each_string(np, "mbox-names", prop, mbox_name) { - if (!strncmp(name, mbox_name, strlen(name))) -- break; -+ return mbox_request_channel(cl, index); - index++; - } - -- return mbox_request_channel(cl, index); -+ dev_err(cl->dev, "%s() could not locate channel named \"%s\"\n", -+ __func__, name); -+ return ERR_PTR(-EINVAL); - } - EXPORT_SYMBOL_GPL(mbox_request_channel_byname); - -diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c -index f8986effcb50..6f776823b9ba 100644 ---- a/drivers/md/bcache/alloc.c -+++ b/drivers/md/bcache/alloc.c -@@ -393,6 +393,11 @@ long bch_bucket_alloc(struct cache *ca, unsigned int reserve, bool wait) - struct bucket *b; - long r; - -+ -+ /* No allocation if CACHE_SET_IO_DISABLE bit is set */ -+ if (unlikely(test_bit(CACHE_SET_IO_DISABLE, &ca->set->flags))) -+ return -1; -+ - /* fastpath */ - if (fifo_pop(&ca->free[RESERVE_NONE], r) || - fifo_pop(&ca->free[reserve], r)) -@@ -484,6 +489,10 @@ int __bch_bucket_alloc_set(struct cache_set *c, unsigned int reserve, - { - int i; - -+ /* No allocation if CACHE_SET_IO_DISABLE bit is set */ -+ if (unlikely(test_bit(CACHE_SET_IO_DISABLE, &c->flags))) -+ return -1; -+ - lockdep_assert_held(&c->bucket_lock); - BUG_ON(!n || n > c->caches_loaded || n > MAX_CACHES_PER_SET); - -diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h -index fdf75352e16a..e30a983a68cd 100644 ---- a/drivers/md/bcache/bcache.h -+++ b/drivers/md/bcache/bcache.h -@@ -726,8 +726,6 @@ struct cache_set { - - #define BUCKET_HASH_BITS 12 - struct hlist_head bucket_hash[1 << BUCKET_HASH_BITS]; -- -- DECLARE_HEAP(struct btree *, flush_btree); - }; - - struct bbio { -diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c -index c25097968319..4d93f07f63e5 100644 ---- a/drivers/md/bcache/io.c -+++ b/drivers/md/bcache/io.c -@@ -58,6 +58,18 @@ void bch_count_backing_io_errors(struct cached_dev *dc, struct bio *bio) - - WARN_ONCE(!dc, "NULL pointer of struct cached_dev"); - -+ /* -+ * Read-ahead requests on a degrading and recovering md raid -+ * (e.g. raid6) device might be failured immediately by md -+ * raid code, which is not a real hardware media failure. So -+ * we shouldn't count failed REQ_RAHEAD bio to dc->io_errors. -+ */ -+ if (bio->bi_opf & REQ_RAHEAD) { -+ pr_warn_ratelimited("%s: Read-ahead I/O failed on backing device, ignore", -+ dc->backing_dev_name); -+ return; -+ } -+ - errors = atomic_add_return(1, &dc->io_errors); - if (errors < dc->error_limit) - pr_err("%s: IO error on backing device, unrecoverable", -diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c -index 12dae9348147..cae2aff5e27a 100644 ---- a/drivers/md/bcache/journal.c -+++ b/drivers/md/bcache/journal.c -@@ -268,7 +268,7 @@ int bch_journal_read(struct cache_set *c, struct list_head *list) - struct journal_replay, - list)->j.seq; - -- return ret; -+ return 0; - #undef read_bucket - } - -@@ -391,12 +391,6 @@ int bch_journal_replay(struct cache_set *s, struct list_head *list) - } - - /* Journalling */ --#define journal_max_cmp(l, r) \ -- (fifo_idx(&c->journal.pin, btree_current_write(l)->journal) < \ -- fifo_idx(&(c)->journal.pin, btree_current_write(r)->journal)) --#define journal_min_cmp(l, r) \ -- (fifo_idx(&c->journal.pin, btree_current_write(l)->journal) > \ -- fifo_idx(&(c)->journal.pin, btree_current_write(r)->journal)) - - static void btree_flush_write(struct cache_set *c) - { -@@ -404,35 +398,25 @@ static void btree_flush_write(struct cache_set *c) - * Try to find the btree node with that references the oldest journal - * entry, best is our current candidate and is locked if non NULL: - */ -- struct btree *b; -- int i; -+ struct btree *b, *best; -+ unsigned int i; - - atomic_long_inc(&c->flush_write); -- - retry: -- spin_lock(&c->journal.lock); -- if (heap_empty(&c->flush_btree)) { -- for_each_cached_btree(b, c, i) -- if (btree_current_write(b)->journal) { -- if (!heap_full(&c->flush_btree)) -- heap_add(&c->flush_btree, b, -- journal_max_cmp); -- else if (journal_max_cmp(b, -- heap_peek(&c->flush_btree))) { -- c->flush_btree.data[0] = b; -- heap_sift(&c->flush_btree, 0, -- journal_max_cmp); -- } -+ best = NULL; -+ -+ for_each_cached_btree(b, c, i) -+ if (btree_current_write(b)->journal) { -+ if (!best) -+ best = b; -+ else if (journal_pin_cmp(c, -+ btree_current_write(best)->journal, -+ btree_current_write(b)->journal)) { -+ best = b; - } -+ } - -- for (i = c->flush_btree.used / 2 - 1; i >= 0; --i) -- heap_sift(&c->flush_btree, i, journal_min_cmp); -- } -- -- b = NULL; -- heap_pop(&c->flush_btree, b, journal_min_cmp); -- spin_unlock(&c->journal.lock); -- -+ b = best; - if (b) { - mutex_lock(&b->write_lock); - if (!btree_current_write(b)->journal) { -@@ -811,6 +795,10 @@ atomic_t *bch_journal(struct cache_set *c, - struct journal_write *w; - atomic_t *ret; - -+ /* No journaling if CACHE_SET_IO_DISABLE set already */ -+ if (unlikely(test_bit(CACHE_SET_IO_DISABLE, &c->flags))) -+ return NULL; -+ - if (!CACHE_SYNC(&c->sb)) - return NULL; - -@@ -855,7 +843,6 @@ void bch_journal_free(struct cache_set *c) - free_pages((unsigned long) c->journal.w[1].data, JSET_BITS); - free_pages((unsigned long) c->journal.w[0].data, JSET_BITS); - free_fifo(&c->journal.pin); -- free_heap(&c->flush_btree); - } - - int bch_journal_alloc(struct cache_set *c) -@@ -870,8 +857,7 @@ int bch_journal_alloc(struct cache_set *c) - j->w[0].c = c; - j->w[1].c = c; - -- if (!(init_heap(&c->flush_btree, 128, GFP_KERNEL)) || -- !(init_fifo(&j->pin, JOURNAL_PIN, GFP_KERNEL)) || -+ if (!(init_fifo(&j->pin, JOURNAL_PIN, GFP_KERNEL)) || - !(j->w[0].data = (void *) __get_free_pages(GFP_KERNEL, JSET_BITS)) || - !(j->w[1].data = (void *) __get_free_pages(GFP_KERNEL, JSET_BITS))) - return -ENOMEM; -diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c -index 1b63ac876169..6daf777105fb 100644 ---- a/drivers/md/bcache/super.c -+++ b/drivers/md/bcache/super.c -@@ -40,6 +40,7 @@ static const char invalid_uuid[] = { - - static struct kobject *bcache_kobj; - struct mutex bch_register_lock; -+bool bcache_is_reboot; - LIST_HEAD(bch_cache_sets); - static LIST_HEAD(uncached_devices); - -@@ -49,6 +50,7 @@ static wait_queue_head_t unregister_wait; - struct workqueue_struct *bcache_wq; - struct workqueue_struct *bch_journal_wq; - -+ - #define BTREE_MAX_PAGES (256 * 1024 / PAGE_SIZE) - /* limitation of partitions number on single bcache device */ - #define BCACHE_MINORS 128 -@@ -1190,18 +1192,16 @@ static void cached_dev_free(struct closure *cl) - { - struct cached_dev *dc = container_of(cl, struct cached_dev, disk.cl); - -- mutex_lock(&bch_register_lock); -- - if (test_and_clear_bit(BCACHE_DEV_WB_RUNNING, &dc->disk.flags)) - cancel_writeback_rate_update_dwork(dc); - - if (!IS_ERR_OR_NULL(dc->writeback_thread)) - kthread_stop(dc->writeback_thread); -- if (dc->writeback_write_wq) -- destroy_workqueue(dc->writeback_write_wq); - if (!IS_ERR_OR_NULL(dc->status_update_thread)) - kthread_stop(dc->status_update_thread); - -+ mutex_lock(&bch_register_lock); -+ - if (atomic_read(&dc->running)) - bd_unlink_disk_holder(dc->bdev, dc->disk.disk); - bcache_device_free(&dc->disk); -@@ -1437,8 +1437,6 @@ int bch_flash_dev_create(struct cache_set *c, uint64_t size) - - bool bch_cached_dev_error(struct cached_dev *dc) - { -- struct cache_set *c; -- - if (!dc || test_bit(BCACHE_DEV_CLOSING, &dc->disk.flags)) - return false; - -@@ -1449,21 +1447,6 @@ bool bch_cached_dev_error(struct cached_dev *dc) - pr_err("stop %s: too many IO errors on backing device %s\n", - dc->disk.disk->disk_name, dc->backing_dev_name); - -- /* -- * If the cached device is still attached to a cache set, -- * even dc->io_disable is true and no more I/O requests -- * accepted, cache device internal I/O (writeback scan or -- * garbage collection) may still prevent bcache device from -- * being stopped. So here CACHE_SET_IO_DISABLE should be -- * set to c->flags too, to make the internal I/O to cache -- * device rejected and stopped immediately. -- * If c is NULL, that means the bcache device is not attached -- * to any cache set, then no CACHE_SET_IO_DISABLE bit to set. -- */ -- c = dc->disk.c; -- if (c && test_and_set_bit(CACHE_SET_IO_DISABLE, &c->flags)) -- pr_info("CACHE_SET_IO_DISABLE already set"); -- - bcache_device_stop(&dc->disk); - return true; - } -@@ -1564,7 +1547,7 @@ static void cache_set_flush(struct closure *cl) - kobject_put(&c->internal); - kobject_del(&c->kobj); - -- if (c->gc_thread) -+ if (!IS_ERR_OR_NULL(c->gc_thread)) - kthread_stop(c->gc_thread); - - if (!IS_ERR_OR_NULL(c->root)) -@@ -2301,6 +2284,11 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, - if (!try_module_get(THIS_MODULE)) - return -EBUSY; - -+ /* For latest state of bcache_is_reboot */ -+ smp_mb(); -+ if (bcache_is_reboot) -+ return -EBUSY; -+ - path = kstrndup(buffer, size, GFP_KERNEL); - if (!path) - goto err; -@@ -2380,6 +2368,9 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, - - static int bcache_reboot(struct notifier_block *n, unsigned long code, void *x) - { -+ if (bcache_is_reboot) -+ return NOTIFY_DONE; -+ - if (code == SYS_DOWN || - code == SYS_HALT || - code == SYS_POWER_OFF) { -@@ -2392,19 +2383,45 @@ static int bcache_reboot(struct notifier_block *n, unsigned long code, void *x) - - mutex_lock(&bch_register_lock); - -+ if (bcache_is_reboot) -+ goto out; -+ -+ /* New registration is rejected since now */ -+ bcache_is_reboot = true; -+ /* -+ * Make registering caller (if there is) on other CPU -+ * core know bcache_is_reboot set to true earlier -+ */ -+ smp_mb(); -+ - if (list_empty(&bch_cache_sets) && - list_empty(&uncached_devices)) - goto out; - -+ mutex_unlock(&bch_register_lock); -+ - pr_info("Stopping all devices:"); - -+ /* -+ * The reason bch_register_lock is not held to call -+ * bch_cache_set_stop() and bcache_device_stop() is to -+ * avoid potential deadlock during reboot, because cache -+ * set or bcache device stopping process will acqurie -+ * bch_register_lock too. -+ * -+ * We are safe here because bcache_is_reboot sets to -+ * true already, register_bcache() will reject new -+ * registration now. bcache_is_reboot also makes sure -+ * bcache_reboot() won't be re-entered on by other thread, -+ * so there is no race in following list iteration by -+ * list_for_each_entry_safe(). -+ */ - list_for_each_entry_safe(c, tc, &bch_cache_sets, list) - bch_cache_set_stop(c); - - list_for_each_entry_safe(dc, tdc, &uncached_devices, list) - bcache_device_stop(&dc->disk); - -- mutex_unlock(&bch_register_lock); - - /* - * Give an early chance for other kthreads and -@@ -2531,6 +2548,8 @@ static int __init bcache_init(void) - bch_debug_init(); - closure_debug_init(); - -+ bcache_is_reboot = false; -+ - return 0; - err: - bcache_exit(); -diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c -index bfb437ffb13c..54cd1727d20c 100644 ---- a/drivers/md/bcache/sysfs.c -+++ b/drivers/md/bcache/sysfs.c -@@ -16,6 +16,8 @@ - #include - #include - -+extern bool bcache_is_reboot; -+ - /* Default is 0 ("writethrough") */ - static const char * const bch_cache_modes[] = { - "writethrough", -@@ -180,7 +182,7 @@ SHOW(__bch_cached_dev) - var_print(writeback_percent); - sysfs_hprint(writeback_rate, - wb ? atomic_long_read(&dc->writeback_rate.rate) << 9 : 0); -- sysfs_hprint(io_errors, atomic_read(&dc->io_errors)); -+ sysfs_printf(io_errors, "%i", atomic_read(&dc->io_errors)); - sysfs_printf(io_error_limit, "%i", dc->error_limit); - sysfs_printf(io_disable, "%i", dc->io_disable); - var_print(writeback_rate_update_seconds); -@@ -271,6 +273,10 @@ STORE(__cached_dev) - struct cache_set *c; - struct kobj_uevent_env *env; - -+ /* no user space access if system is rebooting */ -+ if (bcache_is_reboot) -+ return -EBUSY; -+ - #define d_strtoul(var) sysfs_strtoul(var, dc->var) - #define d_strtoul_nonzero(var) sysfs_strtoul_clamp(var, dc->var, 1, INT_MAX) - #define d_strtoi_h(var) sysfs_hatoi(var, dc->var) -@@ -408,6 +414,10 @@ STORE(bch_cached_dev) - struct cached_dev *dc = container_of(kobj, struct cached_dev, - disk.kobj); - -+ /* no user space access if system is rebooting */ -+ if (bcache_is_reboot) -+ return -EBUSY; -+ - mutex_lock(&bch_register_lock); - size = __cached_dev_store(kobj, attr, buf, size); - -@@ -464,7 +474,7 @@ static struct attribute *bch_cached_dev_files[] = { - &sysfs_writeback_rate_p_term_inverse, - &sysfs_writeback_rate_minimum, - &sysfs_writeback_rate_debug, -- &sysfs_errors, -+ &sysfs_io_errors, - &sysfs_io_error_limit, - &sysfs_io_disable, - &sysfs_dirty_data, -@@ -511,6 +521,10 @@ STORE(__bch_flash_dev) - kobj); - struct uuid_entry *u = &d->c->uuids[d->id]; - -+ /* no user space access if system is rebooting */ -+ if (bcache_is_reboot) -+ return -EBUSY; -+ - sysfs_strtoul(data_csum, d->data_csum); - - if (attr == &sysfs_size) { -@@ -746,6 +760,10 @@ STORE(__bch_cache_set) - struct cache_set *c = container_of(kobj, struct cache_set, kobj); - ssize_t v; - -+ /* no user space access if system is rebooting */ -+ if (bcache_is_reboot) -+ return -EBUSY; -+ - if (attr == &sysfs_unregister) - bch_cache_set_unregister(c); - -@@ -865,6 +883,10 @@ STORE(bch_cache_set_internal) - { - struct cache_set *c = container_of(kobj, struct cache_set, internal); - -+ /* no user space access if system is rebooting */ -+ if (bcache_is_reboot) -+ return -EBUSY; -+ - return bch_cache_set_store(&c->kobj, attr, buf, size); - } - -@@ -1050,6 +1072,10 @@ STORE(__bch_cache) - struct cache *ca = container_of(kobj, struct cache, kobj); - ssize_t v; - -+ /* no user space access if system is rebooting */ -+ if (bcache_is_reboot) -+ return -EBUSY; -+ - if (attr == &sysfs_discard) { - bool v = strtoul_or_return(buf); - -diff --git a/drivers/md/bcache/util.h b/drivers/md/bcache/util.h -index 1fbced94e4cc..c029f7443190 100644 ---- a/drivers/md/bcache/util.h -+++ b/drivers/md/bcache/util.h -@@ -113,8 +113,6 @@ do { \ - - #define heap_full(h) ((h)->used == (h)->size) - --#define heap_empty(h) ((h)->used == 0) -- - #define DECLARE_FIFO(type, name) \ - struct { \ - size_t front, back, size, mask; \ -diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c -index 73f0efac2b9f..e9ffcea1ca50 100644 ---- a/drivers/md/bcache/writeback.c -+++ b/drivers/md/bcache/writeback.c -@@ -735,6 +735,10 @@ static int bch_writeback_thread(void *arg) - } - } - -+ if (dc->writeback_write_wq) { -+ flush_workqueue(dc->writeback_write_wq); -+ destroy_workqueue(dc->writeback_write_wq); -+ } - cached_dev_put(dc); - wait_for_kthread_stop(); - -@@ -830,6 +834,7 @@ int bch_cached_dev_writeback_start(struct cached_dev *dc) - "bcache_writeback"); - if (IS_ERR(dc->writeback_thread)) { - cached_dev_put(dc); -+ destroy_workqueue(dc->writeback_write_wq); - return PTR_ERR(dc->writeback_thread); - } - dc->writeback_running = true; -diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c -index 2a48ea3f1b30..b6b5acc92ca2 100644 ---- a/drivers/md/dm-bufio.c -+++ b/drivers/md/dm-bufio.c -@@ -1599,9 +1599,7 @@ dm_bufio_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) - unsigned long freed; - - c = container_of(shrink, struct dm_bufio_client, shrinker); -- if (sc->gfp_mask & __GFP_FS) -- dm_bufio_lock(c); -- else if (!dm_bufio_trylock(c)) -+ if (!dm_bufio_trylock(c)) - return SHRINK_STOP; - - freed = __scan(c, sc->nr_to_scan, sc->gfp_mask); -diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c -index 7f0840601737..4c68a7b93d5e 100644 ---- a/drivers/md/dm-thin-metadata.c -+++ b/drivers/md/dm-thin-metadata.c -@@ -2046,16 +2046,19 @@ int dm_pool_register_metadata_threshold(struct dm_pool_metadata *pmd, - - int dm_pool_metadata_set_needs_check(struct dm_pool_metadata *pmd) - { -- int r; -+ int r = -EINVAL; - struct dm_block *sblock; - struct thin_disk_superblock *disk_super; - - pmd_write_lock(pmd); -+ if (pmd->fail_io) -+ goto out; -+ - pmd->flags |= THIN_METADATA_NEEDS_CHECK_FLAG; - - r = superblock_lock(pmd, &sblock); - if (r) { -- DMERR("couldn't read superblock"); -+ DMERR("couldn't lock superblock"); - goto out; - } - -diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c -index d8334cd45d7c..4cdde7a02e94 100644 ---- a/drivers/md/dm-zoned-metadata.c -+++ b/drivers/md/dm-zoned-metadata.c -@@ -1593,30 +1593,6 @@ struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd) - return zone; - } - --/* -- * Activate a zone (increment its reference count). -- */ --void dmz_activate_zone(struct dm_zone *zone) --{ -- set_bit(DMZ_ACTIVE, &zone->flags); -- atomic_inc(&zone->refcount); --} -- --/* -- * Deactivate a zone. This decrement the zone reference counter -- * and clears the active state of the zone once the count reaches 0, -- * indicating that all BIOs to the zone have completed. Returns -- * true if the zone was deactivated. -- */ --void dmz_deactivate_zone(struct dm_zone *zone) --{ -- if (atomic_dec_and_test(&zone->refcount)) { -- WARN_ON(!test_bit(DMZ_ACTIVE, &zone->flags)); -- clear_bit_unlock(DMZ_ACTIVE, &zone->flags); -- smp_mb__after_atomic(); -- } --} -- - /* - * Get the zone mapping a chunk, if the chunk is mapped already. - * If no mapping exist and the operation is WRITE, a zone is -diff --git a/drivers/md/dm-zoned.h b/drivers/md/dm-zoned.h -index 12419f0bfe78..ed8de49c9a08 100644 ---- a/drivers/md/dm-zoned.h -+++ b/drivers/md/dm-zoned.h -@@ -115,7 +115,6 @@ enum { - DMZ_BUF, - - /* Zone internal state */ -- DMZ_ACTIVE, - DMZ_RECLAIM, - DMZ_SEQ_WRITE_ERR, - }; -@@ -128,7 +127,6 @@ enum { - #define dmz_is_empty(z) ((z)->wp_block == 0) - #define dmz_is_offline(z) test_bit(DMZ_OFFLINE, &(z)->flags) - #define dmz_is_readonly(z) test_bit(DMZ_READ_ONLY, &(z)->flags) --#define dmz_is_active(z) test_bit(DMZ_ACTIVE, &(z)->flags) - #define dmz_in_reclaim(z) test_bit(DMZ_RECLAIM, &(z)->flags) - #define dmz_seq_write_err(z) test_bit(DMZ_SEQ_WRITE_ERR, &(z)->flags) - -@@ -188,8 +186,30 @@ void dmz_unmap_zone(struct dmz_metadata *zmd, struct dm_zone *zone); - unsigned int dmz_nr_rnd_zones(struct dmz_metadata *zmd); - unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd); - --void dmz_activate_zone(struct dm_zone *zone); --void dmz_deactivate_zone(struct dm_zone *zone); -+/* -+ * Activate a zone (increment its reference count). -+ */ -+static inline void dmz_activate_zone(struct dm_zone *zone) -+{ -+ atomic_inc(&zone->refcount); -+} -+ -+/* -+ * Deactivate a zone. This decrement the zone reference counter -+ * indicating that all BIOs to the zone have completed when the count is 0. -+ */ -+static inline void dmz_deactivate_zone(struct dm_zone *zone) -+{ -+ atomic_dec(&zone->refcount); -+} -+ -+/* -+ * Test if a zone is active, that is, has a refcount > 0. -+ */ -+static inline bool dmz_is_active(struct dm_zone *zone) -+{ -+ return atomic_read(&zone->refcount); -+} - - int dmz_lock_zone_reclaim(struct dm_zone *zone); - void dmz_unlock_zone_reclaim(struct dm_zone *zone); -diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c -index b83bce2beb66..da94cbaa1a9e 100644 ---- a/drivers/md/raid5.c -+++ b/drivers/md/raid5.c -@@ -7672,7 +7672,7 @@ static int raid5_remove_disk(struct mddev *mddev, struct md_rdev *rdev) - static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev) - { - struct r5conf *conf = mddev->private; -- int err = -EEXIST; -+ int ret, err = -EEXIST; - int disk; - struct disk_info *p; - int first = 0; -@@ -7687,7 +7687,14 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev) - * The array is in readonly mode if journal is missing, so no - * write requests running. We should be safe - */ -- log_init(conf, rdev, false); -+ ret = log_init(conf, rdev, false); -+ if (ret) -+ return ret; -+ -+ ret = r5l_start(conf->log); -+ if (ret) -+ return ret; -+ - return 0; - } - if (mddev->recovery_disabled == conf->recovery_disabled) -diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c -index 3cf25abf5807..cfccee87909a 100644 ---- a/drivers/media/common/videobuf2/videobuf2-core.c -+++ b/drivers/media/common/videobuf2/videobuf2-core.c -@@ -207,6 +207,10 @@ static int __vb2_buf_mem_alloc(struct vb2_buffer *vb) - for (plane = 0; plane < vb->num_planes; ++plane) { - unsigned long size = PAGE_ALIGN(vb->planes[plane].length); - -+ /* Did it wrap around? */ -+ if (size < vb->planes[plane].length) -+ goto free; -+ - mem_priv = call_ptr_memop(vb, alloc, - q->alloc_devs[plane] ? : q->dev, - q->dma_attrs, size, q->dma_dir, q->gfp_flags); -diff --git a/drivers/media/common/videobuf2/videobuf2-dma-sg.c b/drivers/media/common/videobuf2/videobuf2-dma-sg.c -index 4a4c49d6085c..0f06f08346ba 100644 ---- a/drivers/media/common/videobuf2/videobuf2-dma-sg.c -+++ b/drivers/media/common/videobuf2/videobuf2-dma-sg.c -@@ -59,7 +59,7 @@ static int vb2_dma_sg_alloc_compacted(struct vb2_dma_sg_buf *buf, - gfp_t gfp_flags) - { - unsigned int last_page = 0; -- int size = buf->size; -+ unsigned long size = buf->size; - - while (size > 0) { - struct page *pages; -diff --git a/drivers/media/dvb-frontends/stv0297.c b/drivers/media/dvb-frontends/stv0297.c -index dac396c95a59..6d5962d5697a 100644 ---- a/drivers/media/dvb-frontends/stv0297.c -+++ b/drivers/media/dvb-frontends/stv0297.c -@@ -682,7 +682,7 @@ static const struct dvb_frontend_ops stv0297_ops = { - .delsys = { SYS_DVBC_ANNEX_A }, - .info = { - .name = "ST STV0297 DVB-C", -- .frequency_min_hz = 470 * MHz, -+ .frequency_min_hz = 47 * MHz, - .frequency_max_hz = 862 * MHz, - .frequency_stepsize_hz = 62500, - .symbol_rate_min = 870000, -diff --git a/drivers/media/dvb-frontends/tua6100.c b/drivers/media/dvb-frontends/tua6100.c -index f7c3e6be8e4d..2483f614d0e7 100644 ---- a/drivers/media/dvb-frontends/tua6100.c -+++ b/drivers/media/dvb-frontends/tua6100.c -@@ -67,8 +67,8 @@ static int tua6100_set_params(struct dvb_frontend *fe) - struct i2c_msg msg1 = { .addr = priv->i2c_address, .flags = 0, .buf = reg1, .len = 4 }; - struct i2c_msg msg2 = { .addr = priv->i2c_address, .flags = 0, .buf = reg2, .len = 3 }; - --#define _R 4 --#define _P 32 -+#define _R_VAL 4 -+#define _P_VAL 32 - #define _ri 4000000 - - // setup register 0 -@@ -83,14 +83,14 @@ static int tua6100_set_params(struct dvb_frontend *fe) - else - reg1[1] = 0x0c; - -- if (_P == 64) -+ if (_P_VAL == 64) - reg1[1] |= 0x40; - if (c->frequency >= 1525000) - reg1[1] |= 0x80; - - // register 2 -- reg2[1] = (_R >> 8) & 0x03; -- reg2[2] = _R; -+ reg2[1] = (_R_VAL >> 8) & 0x03; -+ reg2[2] = _R_VAL; - if (c->frequency < 1455000) - reg2[1] |= 0x1c; - else if (c->frequency < 1630000) -@@ -102,18 +102,18 @@ static int tua6100_set_params(struct dvb_frontend *fe) - * The N divisor ratio (note: c->frequency is in kHz, but we - * need it in Hz) - */ -- prediv = (c->frequency * _R) / (_ri / 1000); -- div = prediv / _P; -+ prediv = (c->frequency * _R_VAL) / (_ri / 1000); -+ div = prediv / _P_VAL; - reg1[1] |= (div >> 9) & 0x03; - reg1[2] = div >> 1; - reg1[3] = (div << 7); -- priv->frequency = ((div * _P) * (_ri / 1000)) / _R; -+ priv->frequency = ((div * _P_VAL) * (_ri / 1000)) / _R_VAL; - - // Finally, calculate and store the value for A -- reg1[3] |= (prediv - (div*_P)) & 0x7f; -+ reg1[3] |= (prediv - (div*_P_VAL)) & 0x7f; - --#undef _R --#undef _P -+#undef _R_VAL -+#undef _P_VAL - #undef _ri - - if (fe->ops.i2c_gate_ctrl) -diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile -index d8ad9dad495d..fd4ea86dedd5 100644 ---- a/drivers/media/i2c/Makefile -+++ b/drivers/media/i2c/Makefile -@@ -35,7 +35,7 @@ obj-$(CONFIG_VIDEO_ADV748X) += adv748x/ - obj-$(CONFIG_VIDEO_ADV7604) += adv7604.o - obj-$(CONFIG_VIDEO_ADV7842) += adv7842.o - obj-$(CONFIG_VIDEO_AD9389B) += ad9389b.o --obj-$(CONFIG_VIDEO_ADV7511) += adv7511.o -+obj-$(CONFIG_VIDEO_ADV7511) += adv7511-v4l2.o - obj-$(CONFIG_VIDEO_VPX3220) += vpx3220.o - obj-$(CONFIG_VIDEO_VS6624) += vs6624.o - obj-$(CONFIG_VIDEO_BT819) += bt819.o -diff --git a/drivers/media/i2c/adv7511.c b/drivers/media/i2c/adv7511-v4l2.c -similarity index 99% -rename from drivers/media/i2c/adv7511.c -rename to drivers/media/i2c/adv7511-v4l2.c -index cec5ebb1c9e6..2ad6bdf1a9fc 100644 ---- a/drivers/media/i2c/adv7511.c -+++ b/drivers/media/i2c/adv7511-v4l2.c -@@ -5,6 +5,11 @@ - * Copyright 2013 Cisco Systems, Inc. and/or its affiliates. All rights reserved. - */ - -+/* -+ * This file is named adv7511-v4l2.c so it doesn't conflict with the Analog -+ * Device ADV7511 (config fragment CONFIG_DRM_I2C_ADV7511). -+ */ -+ - - #include - #include -diff --git a/drivers/media/i2c/msp3400-driver.c b/drivers/media/i2c/msp3400-driver.c -index 39530d43590e..a7caf2eb5771 100644 ---- a/drivers/media/i2c/msp3400-driver.c -+++ b/drivers/media/i2c/msp3400-driver.c -@@ -170,7 +170,7 @@ static int msp_read(struct i2c_client *client, int dev, int addr) - break; - dev_warn(&client->dev, "I/O error #%d (read 0x%02x/0x%02x)\n", err, - dev, addr); -- schedule_timeout_interruptible(msecs_to_jiffies(10)); -+ schedule_msec_hrtimeout_interruptible((10)); - } - if (err == 3) { - dev_warn(&client->dev, "resetting chip, sound will go off.\n"); -@@ -211,7 +211,7 @@ static int msp_write(struct i2c_client *client, int dev, int addr, int val) - break; - dev_warn(&client->dev, "I/O error #%d (write 0x%02x/0x%02x)\n", err, - dev, addr); -- schedule_timeout_interruptible(msecs_to_jiffies(10)); -+ schedule_msec_hrtimeout_interruptible((10)); - } - if (err == 3) { - dev_warn(&client->dev, "resetting chip, sound will go off.\n"); -diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c -index 362c3b93636e..5a642b5ad076 100644 ---- a/drivers/media/i2c/mt9m111.c -+++ b/drivers/media/i2c/mt9m111.c -@@ -1245,9 +1245,11 @@ static int mt9m111_probe(struct i2c_client *client, - if (!mt9m111) - return -ENOMEM; - -- ret = mt9m111_probe_fw(client, mt9m111); -- if (ret) -- return ret; -+ if (dev_fwnode(&client->dev)) { -+ ret = mt9m111_probe_fw(client, mt9m111); -+ if (ret) -+ return ret; -+ } - - mt9m111->clk = v4l2_clk_get(&client->dev, "mclk"); - if (IS_ERR(mt9m111->clk)) -diff --git a/drivers/media/i2c/ov7740.c b/drivers/media/i2c/ov7740.c -index 54e80a60aa57..63011d4b4738 100644 ---- a/drivers/media/i2c/ov7740.c -+++ b/drivers/media/i2c/ov7740.c -@@ -785,7 +785,11 @@ static int ov7740_try_fmt_internal(struct v4l2_subdev *sd, - - fsize++; - } -- -+ if (i >= ARRAY_SIZE(ov7740_framesizes)) { -+ fsize = &ov7740_framesizes[0]; -+ fmt->width = fsize->width; -+ fmt->height = fsize->height; -+ } - if (ret_frmsize != NULL) - *ret_frmsize = fsize; - -diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c -index 9ae481ddd975..e19df5165e78 100644 ---- a/drivers/media/media-device.c -+++ b/drivers/media/media-device.c -@@ -494,6 +494,7 @@ static long media_device_enum_links32(struct media_device *mdev, - { - struct media_links_enum links; - compat_uptr_t pads_ptr, links_ptr; -+ int ret; - - memset(&links, 0, sizeof(links)); - -@@ -505,7 +506,14 @@ static long media_device_enum_links32(struct media_device *mdev, - links.pads = compat_ptr(pads_ptr); - links.links = compat_ptr(links_ptr); - -- return media_device_enum_links(mdev, &links); -+ ret = media_device_enum_links(mdev, &links); -+ if (ret) -+ return ret; -+ -+ if (copy_to_user(ulinks->reserved, links.reserved, -+ sizeof(ulinks->reserved))) -+ return -EFAULT; -+ return 0; - } - - #define MEDIA_IOC_ENUM_LINKS32 _IOWR('|', 0x02, struct media_links_enum32) -diff --git a/drivers/media/pci/cx18/cx18-gpio.c b/drivers/media/pci/cx18/cx18-gpio.c -index cf7cfda94107..f63e17489547 100644 ---- a/drivers/media/pci/cx18/cx18-gpio.c -+++ b/drivers/media/pci/cx18/cx18-gpio.c -@@ -81,11 +81,11 @@ static void gpio_reset_seq(struct cx18 *cx, u32 active_lo, u32 active_hi, - - /* Assert */ - gpio_update(cx, mask, ~active_lo); -- schedule_timeout_uninterruptible(msecs_to_jiffies(assert_msecs)); -+ schedule_msec_hrtimeout_uninterruptible((assert_msecs)); - - /* Deassert */ - gpio_update(cx, mask, ~active_hi); -- schedule_timeout_uninterruptible(msecs_to_jiffies(recovery_msecs)); -+ schedule_msec_hrtimeout_uninterruptible((recovery_msecs)); - } - - /* -diff --git a/drivers/media/pci/ivtv/ivtv-gpio.c b/drivers/media/pci/ivtv/ivtv-gpio.c -index 856e7ab7f33e..766a26251337 100644 ---- a/drivers/media/pci/ivtv/ivtv-gpio.c -+++ b/drivers/media/pci/ivtv/ivtv-gpio.c -@@ -105,7 +105,7 @@ void ivtv_reset_ir_gpio(struct ivtv *itv) - curout = (curout & ~0xF) | 1; - write_reg(curout, IVTV_REG_GPIO_OUT); - /* We could use something else for smaller time */ -- schedule_timeout_interruptible(msecs_to_jiffies(1)); -+ schedule_msec_hrtimeout_interruptible((1)); - curout |= 2; - write_reg(curout, IVTV_REG_GPIO_OUT); - curdir &= ~0x80; -@@ -125,11 +125,11 @@ int ivtv_reset_tuner_gpio(void *dev, int component, int cmd, int value) - curout = read_reg(IVTV_REG_GPIO_OUT); - curout &= ~(1 << itv->card->xceive_pin); - write_reg(curout, IVTV_REG_GPIO_OUT); -- schedule_timeout_interruptible(msecs_to_jiffies(1)); -+ schedule_msec_hrtimeout_interruptible((1)); - - curout |= 1 << itv->card->xceive_pin; - write_reg(curout, IVTV_REG_GPIO_OUT); -- schedule_timeout_interruptible(msecs_to_jiffies(1)); -+ schedule_msec_hrtimeout_interruptible((1)); - return 0; - } - -diff --git a/drivers/media/pci/ivtv/ivtv-ioctl.c b/drivers/media/pci/ivtv/ivtv-ioctl.c -index d1e358a2273e..e022ff80e026 100644 ---- a/drivers/media/pci/ivtv/ivtv-ioctl.c -+++ b/drivers/media/pci/ivtv/ivtv-ioctl.c -@@ -1144,7 +1144,7 @@ void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id std) - TASK_UNINTERRUPTIBLE); - if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100) - break; -- schedule_timeout(msecs_to_jiffies(25)); -+ schedule_msec_hrtimeout((25)); - } - finish_wait(&itv->vsync_waitq, &wait); - mutex_lock(&itv->serialize_lock); -diff --git a/drivers/media/pci/ivtv/ivtv-streams.c b/drivers/media/pci/ivtv/ivtv-streams.c -index a641f20e3f86..e1b40d2b4bed 100644 ---- a/drivers/media/pci/ivtv/ivtv-streams.c -+++ b/drivers/media/pci/ivtv/ivtv-streams.c -@@ -843,7 +843,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end) - while (!test_bit(IVTV_F_I_EOS, &itv->i_flags) && - time_before(jiffies, - then + msecs_to_jiffies(2000))) { -- schedule_timeout(msecs_to_jiffies(10)); -+ schedule_msec_hrtimeout((10)); - } - - /* To convert jiffies to ms, we must multiply by 1000 -diff --git a/drivers/media/pci/saa7164/saa7164-core.c b/drivers/media/pci/saa7164/saa7164-core.c -index c594aff92e70..9ae04e18e6c6 100644 ---- a/drivers/media/pci/saa7164/saa7164-core.c -+++ b/drivers/media/pci/saa7164/saa7164-core.c -@@ -1112,16 +1112,25 @@ static int saa7164_proc_show(struct seq_file *m, void *v) - return 0; - } - -+static struct proc_dir_entry *saa7164_pe; -+ - static int saa7164_proc_create(void) - { -- struct proc_dir_entry *pe; -- -- pe = proc_create_single("saa7164", S_IRUGO, NULL, saa7164_proc_show); -- if (!pe) -+ saa7164_pe = proc_create_single("saa7164", 0444, NULL, saa7164_proc_show); -+ if (!saa7164_pe) - return -ENOMEM; - - return 0; - } -+ -+static void saa7164_proc_destroy(void) -+{ -+ if (saa7164_pe) -+ remove_proc_entry("saa7164", NULL); -+} -+#else -+static int saa7164_proc_create(void) { return 0; } -+static void saa7164_proc_destroy(void) {} - #endif - - static int saa7164_thread_function(void *data) -@@ -1493,19 +1502,21 @@ static struct pci_driver saa7164_pci_driver = { - - static int __init saa7164_init(void) - { -- printk(KERN_INFO "saa7164 driver loaded\n"); -+ int ret = pci_register_driver(&saa7164_pci_driver); -+ -+ if (ret) -+ return ret; - --#ifdef CONFIG_PROC_FS - saa7164_proc_create(); --#endif -- return pci_register_driver(&saa7164_pci_driver); -+ -+ pr_info("saa7164 driver loaded\n"); -+ -+ return 0; - } - - static void __exit saa7164_fini(void) - { --#ifdef CONFIG_PROC_FS -- remove_proc_entry("saa7164", NULL); --#endif -+ saa7164_proc_destroy(); - pci_unregister_driver(&saa7164_pci_driver); - } - -diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c -index 8144fe36ad48..de0f192afa8b 100644 ---- a/drivers/media/platform/aspeed-video.c -+++ b/drivers/media/platform/aspeed-video.c -@@ -187,6 +187,7 @@ enum { - VIDEO_STREAMING, - VIDEO_FRAME_INPRG, - VIDEO_STOPPED, -+ VIDEO_CLOCKS_ON, - }; - - struct aspeed_video_addr { -@@ -483,19 +484,29 @@ static void aspeed_video_enable_mode_detect(struct aspeed_video *video) - - static void aspeed_video_off(struct aspeed_video *video) - { -+ if (!test_bit(VIDEO_CLOCKS_ON, &video->flags)) -+ return; -+ - /* Disable interrupts */ - aspeed_video_write(video, VE_INTERRUPT_CTRL, 0); - - /* Turn off the relevant clocks */ - clk_disable_unprepare(video->vclk); - clk_disable_unprepare(video->eclk); -+ -+ clear_bit(VIDEO_CLOCKS_ON, &video->flags); - } - - static void aspeed_video_on(struct aspeed_video *video) - { -+ if (test_bit(VIDEO_CLOCKS_ON, &video->flags)) -+ return; -+ - /* Turn on the relevant clocks */ - clk_prepare_enable(video->eclk); - clk_prepare_enable(video->vclk); -+ -+ set_bit(VIDEO_CLOCKS_ON, &video->flags); - } - - static void aspeed_video_bufs_done(struct aspeed_video *video, -@@ -1589,8 +1600,9 @@ static int aspeed_video_init(struct aspeed_video *video) - return -ENODEV; - } - -- rc = devm_request_irq(dev, irq, aspeed_video_irq, IRQF_SHARED, -- DEVICE_NAME, video); -+ rc = devm_request_threaded_irq(dev, irq, NULL, aspeed_video_irq, -+ IRQF_ONESHOT | IRQF_SHARED, DEVICE_NAME, -+ video); - if (rc < 0) { - dev_err(dev, "Unable to request IRQ %d\n", irq); - return rc; -diff --git a/drivers/media/platform/coda/Makefile b/drivers/media/platform/coda/Makefile -index f13adacd924e..cfe3ef8fad8a 100644 ---- a/drivers/media/platform/coda/Makefile -+++ b/drivers/media/platform/coda/Makefile -@@ -1,7 +1,7 @@ - # SPDX-License-Identifier: GPL-2.0-only - ccflags-y += -I$(src) - --coda-objs := coda-common.o coda-bit.o coda-gdi.o coda-h264.o coda-jpeg.o -+coda-vpu-objs := coda-common.o coda-bit.o coda-gdi.o coda-h264.o coda-jpeg.o - --obj-$(CONFIG_VIDEO_CODA) += coda.o -+obj-$(CONFIG_VIDEO_CODA) += coda-vpu.o - obj-$(CONFIG_VIDEO_IMX_VDOA) += imx-vdoa.o -diff --git a/drivers/media/platform/coda/coda-bit.c b/drivers/media/platform/coda/coda-bit.c -index 976f6aa69f41..8f918eb7eb77 100644 ---- a/drivers/media/platform/coda/coda-bit.c -+++ b/drivers/media/platform/coda/coda-bit.c -@@ -1739,6 +1739,7 @@ static int __coda_start_decoding(struct coda_ctx *ctx) - v4l2_err(&dev->v4l2_dev, "CODA_COMMAND_SEQ_INIT timeout\n"); - return ret; - } -+ ctx->sequence_offset = ~0U; - ctx->initialized = 1; - - /* Update kfifo out pointer from coda bitstream read pointer */ -@@ -2146,12 +2147,17 @@ static void coda_finish_decode(struct coda_ctx *ctx) - else if (ctx->display_idx < 0) - ctx->hold = true; - } else if (decoded_idx == -2) { -+ if (ctx->display_idx >= 0 && -+ ctx->display_idx < ctx->num_internal_frames) -+ ctx->sequence_offset++; - /* no frame was decoded, we still return remaining buffers */ - } else if (decoded_idx < 0 || decoded_idx >= ctx->num_internal_frames) { - v4l2_err(&dev->v4l2_dev, - "decoded frame index out of range: %d\n", decoded_idx); - } else { -- val = coda_read(dev, CODA_RET_DEC_PIC_FRAME_NUM) - 1; -+ val = coda_read(dev, CODA_RET_DEC_PIC_FRAME_NUM); -+ if (ctx->sequence_offset == -1) -+ ctx->sequence_offset = val; - val -= ctx->sequence_offset; - spin_lock(&ctx->buffer_meta_lock); - if (!list_empty(&ctx->buffer_meta_list)) { -@@ -2304,7 +2310,6 @@ irqreturn_t coda_irq_handler(int irq, void *data) - if (ctx == NULL) { - v4l2_err(&dev->v4l2_dev, - "Instance released before the end of transaction\n"); -- mutex_unlock(&dev->coda_mutex); - return IRQ_HANDLED; - } - -diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c -index 6238047273f2..68a585d3af91 100644 ---- a/drivers/media/platform/coda/coda-common.c -+++ b/drivers/media/platform/coda/coda-common.c -@@ -1024,6 +1024,8 @@ static int coda_encoder_cmd(struct file *file, void *fh, - /* Set the stream-end flag on this context */ - ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG; - -+ flush_work(&ctx->pic_run_work); -+ - /* If there is no buffer in flight, wake up */ - if (!ctx->streamon_out || ctx->qsequence == ctx->osequence) { - dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, -diff --git a/drivers/media/platform/davinci/vpif_capture.c b/drivers/media/platform/davinci/vpif_capture.c -index 61809d2050fa..f0f7ef638c56 100644 ---- a/drivers/media/platform/davinci/vpif_capture.c -+++ b/drivers/media/platform/davinci/vpif_capture.c -@@ -1376,6 +1376,14 @@ static int initialize_vpif(void) - return err; - } - -+static inline void free_vpif_objs(void) -+{ -+ int i; -+ -+ for (i = 0; i < VPIF_CAPTURE_MAX_DEVICES; i++) -+ kfree(vpif_obj.dev[i]); -+} -+ - static int vpif_async_bound(struct v4l2_async_notifier *notifier, - struct v4l2_subdev *subdev, - struct v4l2_async_subdev *asd) -@@ -1645,7 +1653,7 @@ static __init int vpif_probe(struct platform_device *pdev) - err = v4l2_device_register(vpif_dev, &vpif_obj.v4l2_dev); - if (err) { - v4l2_err(vpif_dev->driver, "Error registering v4l2 device\n"); -- goto cleanup; -+ goto vpif_free; - } - - while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, res_idx))) { -@@ -1692,7 +1700,9 @@ static __init int vpif_probe(struct platform_device *pdev) - "registered sub device %s\n", - subdevdata->name); - } -- vpif_probe_complete(); -+ err = vpif_probe_complete(); -+ if (err) -+ goto probe_subdev_out; - } else { - vpif_obj.notifier.ops = &vpif_async_ops; - err = v4l2_async_notifier_register(&vpif_obj.v4l2_dev, -@@ -1711,6 +1721,8 @@ static __init int vpif_probe(struct platform_device *pdev) - kfree(vpif_obj.sd); - vpif_unregister: - v4l2_device_unregister(&vpif_obj.v4l2_dev); -+vpif_free: -+ free_vpif_objs(); - cleanup: - v4l2_async_notifier_cleanup(&vpif_obj.notifier); - -diff --git a/drivers/media/platform/davinci/vpss.c b/drivers/media/platform/davinci/vpss.c -index 3f079ac1b080..be91b0c7d20b 100644 ---- a/drivers/media/platform/davinci/vpss.c -+++ b/drivers/media/platform/davinci/vpss.c -@@ -509,6 +509,11 @@ static int __init vpss_init(void) - return -EBUSY; - - oper_cfg.vpss_regs_base2 = ioremap(VPSS_CLK_CTRL, 4); -+ if (unlikely(!oper_cfg.vpss_regs_base2)) { -+ release_mem_region(VPSS_CLK_CTRL, 4); -+ return -ENOMEM; -+ } -+ - writel(VPSS_CLK_CTRL_VENCCLKEN | - VPSS_CLK_CTRL_DACCLKEN, oper_cfg.vpss_regs_base2); - -diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c b/drivers/media/platform/marvell-ccic/mcam-core.c -index f1b301810260..0a6411b877e9 100644 ---- a/drivers/media/platform/marvell-ccic/mcam-core.c -+++ b/drivers/media/platform/marvell-ccic/mcam-core.c -@@ -200,7 +200,6 @@ struct mcam_vb_buffer { - struct list_head queue; - struct mcam_dma_desc *dma_desc; /* Descriptor virtual address */ - dma_addr_t dma_desc_pa; /* Descriptor physical address */ -- int dma_desc_nent; /* Number of mapped descriptors */ - }; - - static inline struct mcam_vb_buffer *vb_to_mvb(struct vb2_v4l2_buffer *vb) -@@ -608,9 +607,11 @@ static void mcam_dma_contig_done(struct mcam_camera *cam, int frame) - static void mcam_sg_next_buffer(struct mcam_camera *cam) - { - struct mcam_vb_buffer *buf; -+ struct sg_table *sg_table; - - buf = list_first_entry(&cam->buffers, struct mcam_vb_buffer, queue); - list_del_init(&buf->queue); -+ sg_table = vb2_dma_sg_plane_desc(&buf->vb_buf.vb2_buf, 0); - /* - * Very Bad Not Good Things happen if you don't clear - * C1_DESC_ENA before making any descriptor changes. -@@ -618,7 +619,7 @@ static void mcam_sg_next_buffer(struct mcam_camera *cam) - mcam_reg_clear_bit(cam, REG_CTRL1, C1_DESC_ENA); - mcam_reg_write(cam, REG_DMA_DESC_Y, buf->dma_desc_pa); - mcam_reg_write(cam, REG_DESC_LEN_Y, -- buf->dma_desc_nent*sizeof(struct mcam_dma_desc)); -+ sg_table->nents * sizeof(struct mcam_dma_desc)); - mcam_reg_write(cam, REG_DESC_LEN_U, 0); - mcam_reg_write(cam, REG_DESC_LEN_V, 0); - mcam_reg_set_bit(cam, REG_CTRL1, C1_DESC_ENA); -diff --git a/drivers/media/platform/meson/ao-cec-g12a.c b/drivers/media/platform/meson/ao-cec-g12a.c -index 3620a1e310f5..ddfd060625da 100644 ---- a/drivers/media/platform/meson/ao-cec-g12a.c -+++ b/drivers/media/platform/meson/ao-cec-g12a.c -@@ -415,7 +415,6 @@ static const struct regmap_config meson_ao_cec_g12a_cec_regmap_conf = { - .reg_read = meson_ao_cec_g12a_read, - .reg_write = meson_ao_cec_g12a_write, - .max_register = 0xffff, -- .fast_io = true, - }; - - static inline void -diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c -index 1eba23409ff3..d3d1748a7ef6 100644 ---- a/drivers/media/platform/qcom/venus/firmware.c -+++ b/drivers/media/platform/qcom/venus/firmware.c -@@ -78,11 +78,11 @@ static int venus_load_fw(struct venus_core *core, const char *fwname, - - ret = of_address_to_resource(node, 0, &r); - if (ret) -- return ret; -+ goto err_put_node; - - ret = request_firmware(&mdt, fwname, dev); - if (ret < 0) -- return ret; -+ goto err_put_node; - - fw_size = qcom_mdt_get_size(mdt); - if (fw_size < 0) { -@@ -116,6 +116,8 @@ static int venus_load_fw(struct venus_core *core, const char *fwname, - memunmap(mem_va); - err_release_fw: - release_firmware(mdt); -+err_put_node: -+ of_node_put(node); - return ret; - } - -diff --git a/drivers/media/platform/rcar_fdp1.c b/drivers/media/platform/rcar_fdp1.c -index 6a90bc4c476e..b8615a288e2b 100644 ---- a/drivers/media/platform/rcar_fdp1.c -+++ b/drivers/media/platform/rcar_fdp1.c -@@ -257,6 +257,8 @@ MODULE_PARM_DESC(debug, "activate debug info"); - #define FD1_IP_H3_ES1 0x02010101 - #define FD1_IP_M3W 0x02010202 - #define FD1_IP_H3 0x02010203 -+#define FD1_IP_M3N 0x02010204 -+#define FD1_IP_E3 0x02010205 - - /* LUTs */ - #define FD1_LUT_DIF_ADJ 0x1000 -@@ -2365,6 +2367,12 @@ static int fdp1_probe(struct platform_device *pdev) - case FD1_IP_H3: - dprintk(fdp1, "FDP1 Version R-Car H3\n"); - break; -+ case FD1_IP_M3N: -+ dprintk(fdp1, "FDP1 Version R-Car M3N\n"); -+ break; -+ case FD1_IP_E3: -+ dprintk(fdp1, "FDP1 Version R-Car E3\n"); -+ break; - default: - dev_err(fdp1->dev, "FDP1 Unidentifiable (0x%08x)\n", - hw_version); -diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c -index 4e936b95018a..481088a83212 100644 ---- a/drivers/media/platform/s5p-mfc/s5p_mfc.c -+++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c -@@ -523,7 +523,8 @@ static void s5p_mfc_handle_seq_done(struct s5p_mfc_ctx *ctx, - dev); - ctx->mv_count = s5p_mfc_hw_call(dev->mfc_ops, get_mv_count, - dev); -- ctx->scratch_buf_size = s5p_mfc_hw_call(dev->mfc_ops, -+ if (FW_HAS_E_MIN_SCRATCH_BUF(dev)) -+ ctx->scratch_buf_size = s5p_mfc_hw_call(dev->mfc_ops, - get_min_scratch_buf_size, dev); - if (ctx->img_width == 0 || ctx->img_height == 0) - ctx->state = MFCINST_ERROR; -diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c -index 2e62f8721fa5..7d52431c2c83 100644 ---- a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c -+++ b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c -@@ -34,6 +34,11 @@ int s5p_mfc_init_pm(struct s5p_mfc_dev *dev) - for (i = 0; i < pm->num_clocks; i++) { - pm->clocks[i] = devm_clk_get(pm->device, pm->clk_names[i]); - if (IS_ERR(pm->clocks[i])) { -+ /* additional clocks are optional */ -+ if (i && PTR_ERR(pm->clocks[i]) == -ENOENT) { -+ pm->clocks[i] = NULL; -+ continue; -+ } - mfc_err("Failed to get clock: %s\n", - pm->clk_names[i]); - return PTR_ERR(pm->clocks[i]); -diff --git a/drivers/media/platform/vim2m.c b/drivers/media/platform/vim2m.c -index 243c82b5d537..acd3bd48c7e2 100644 ---- a/drivers/media/platform/vim2m.c -+++ b/drivers/media/platform/vim2m.c -@@ -1359,7 +1359,7 @@ static int vim2m_probe(struct platform_device *pdev) - MEDIA_ENT_F_PROC_VIDEO_SCALER); - if (ret) { - v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem media controller\n"); -- goto error_m2m; -+ goto error_dev; - } - - ret = media_device_register(&dev->mdev); -@@ -1373,11 +1373,11 @@ static int vim2m_probe(struct platform_device *pdev) - #ifdef CONFIG_MEDIA_CONTROLLER - error_m2m_mc: - v4l2_m2m_unregister_media_controller(dev->m2m_dev); --error_m2m: -- v4l2_m2m_release(dev->m2m_dev); - #endif - error_dev: - video_unregister_device(&dev->vfd); -+ /* vim2m_device_release called by video_unregister_device to release various objects */ -+ return ret; - error_v4l2: - v4l2_device_unregister(&dev->v4l2_dev); - error_free: -diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c -index 946dc0908566..664855708fdf 100644 ---- a/drivers/media/platform/vimc/vimc-capture.c -+++ b/drivers/media/platform/vimc/vimc-capture.c -@@ -142,12 +142,15 @@ static int vimc_cap_s_fmt_vid_cap(struct file *file, void *priv, - struct v4l2_format *f) - { - struct vimc_cap_device *vcap = video_drvdata(file); -+ int ret; - - /* Do not change the format while stream is on */ - if (vb2_is_busy(&vcap->queue)) - return -EBUSY; - -- vimc_cap_try_fmt_vid_cap(file, priv, f); -+ ret = vimc_cap_try_fmt_vid_cap(file, priv, f); -+ if (ret) -+ return ret; - - dev_dbg(vcap->dev, "%s: format update: " - "old:%dx%d (0x%x, %d, %d, %d, %d) " -diff --git a/drivers/media/radio/radio-mr800.c b/drivers/media/radio/radio-mr800.c -index f53f9064e1e9..55ea45d72653 100644 ---- a/drivers/media/radio/radio-mr800.c -+++ b/drivers/media/radio/radio-mr800.c -@@ -369,7 +369,7 @@ static int vidioc_s_hw_freq_seek(struct file *file, void *priv, - retval = -ENODATA; - break; - } -- if (schedule_timeout_interruptible(msecs_to_jiffies(10))) { -+ if (schedule_msec_hrtimeout_interruptible((10))) { - retval = -ERESTARTSYS; - break; - } -diff --git a/drivers/media/radio/radio-raremono.c b/drivers/media/radio/radio-raremono.c -index 5e782b3c2fa9..bf1ee654df80 100644 ---- a/drivers/media/radio/radio-raremono.c -+++ b/drivers/media/radio/radio-raremono.c -@@ -271,6 +271,14 @@ static int vidioc_g_frequency(struct file *file, void *priv, - return 0; - } - -+static void raremono_device_release(struct v4l2_device *v4l2_dev) -+{ -+ struct raremono_device *radio = to_raremono_dev(v4l2_dev); -+ -+ kfree(radio->buffer); -+ kfree(radio); -+} -+ - /* File system interface */ - static const struct v4l2_file_operations usb_raremono_fops = { - .owner = THIS_MODULE, -@@ -295,12 +303,14 @@ static int usb_raremono_probe(struct usb_interface *intf, - struct raremono_device *radio; - int retval = 0; - -- radio = devm_kzalloc(&intf->dev, sizeof(struct raremono_device), GFP_KERNEL); -- if (radio) -- radio->buffer = devm_kmalloc(&intf->dev, BUFFER_LENGTH, GFP_KERNEL); -- -- if (!radio || !radio->buffer) -+ radio = kzalloc(sizeof(*radio), GFP_KERNEL); -+ if (!radio) -+ return -ENOMEM; -+ radio->buffer = kmalloc(BUFFER_LENGTH, GFP_KERNEL); -+ if (!radio->buffer) { -+ kfree(radio); - return -ENOMEM; -+ } - - radio->usbdev = interface_to_usbdev(intf); - radio->intf = intf; -@@ -324,7 +334,8 @@ static int usb_raremono_probe(struct usb_interface *intf, - if (retval != 3 || - (get_unaligned_be16(&radio->buffer[1]) & 0xfff) == 0x0242) { - dev_info(&intf->dev, "this is not Thanko's Raremono.\n"); -- return -ENODEV; -+ retval = -ENODEV; -+ goto free_mem; - } - - dev_info(&intf->dev, "Thanko's Raremono connected: (%04X:%04X)\n", -@@ -333,7 +344,7 @@ static int usb_raremono_probe(struct usb_interface *intf, - retval = v4l2_device_register(&intf->dev, &radio->v4l2_dev); - if (retval < 0) { - dev_err(&intf->dev, "couldn't register v4l2_device\n"); -- return retval; -+ goto free_mem; - } - - mutex_init(&radio->lock); -@@ -345,6 +356,7 @@ static int usb_raremono_probe(struct usb_interface *intf, - radio->vdev.ioctl_ops = &usb_raremono_ioctl_ops; - radio->vdev.lock = &radio->lock; - radio->vdev.release = video_device_release_empty; -+ radio->v4l2_dev.release = raremono_device_release; - - usb_set_intfdata(intf, &radio->v4l2_dev); - -@@ -360,6 +372,10 @@ static int usb_raremono_probe(struct usb_interface *intf, - } - dev_err(&intf->dev, "could not register video device\n"); - v4l2_device_unregister(&radio->v4l2_dev); -+ -+free_mem: -+ kfree(radio->buffer); -+ kfree(radio); - return retval; - } - -diff --git a/drivers/media/radio/radio-tea5777.c b/drivers/media/radio/radio-tea5777.c -index 49d4beba341e..ef8e9294c295 100644 ---- a/drivers/media/radio/radio-tea5777.c -+++ b/drivers/media/radio/radio-tea5777.c -@@ -235,7 +235,7 @@ static int radio_tea5777_update_read_reg(struct radio_tea5777 *tea, int wait) - } - - if (wait) { -- if (schedule_timeout_interruptible(msecs_to_jiffies(wait))) -+ if (schedule_msec_hrtimeout_interruptible((wait))) - return -ERESTARTSYS; - } - -diff --git a/drivers/media/radio/tea575x.c b/drivers/media/radio/tea575x.c -index 64613dd145a1..105d97da584e 100644 ---- a/drivers/media/radio/tea575x.c -+++ b/drivers/media/radio/tea575x.c -@@ -405,7 +405,7 @@ int snd_tea575x_s_hw_freq_seek(struct file *file, struct snd_tea575x *tea, - for (;;) { - if (time_after(jiffies, timeout)) - break; -- if (schedule_timeout_interruptible(msecs_to_jiffies(10))) { -+ if (schedule_msec_hrtimeout_interruptible((10))) { - /* some signal arrived, stop search */ - tea->val &= ~TEA575X_BIT_SEARCH; - snd_tea575x_set_freq(tea); -diff --git a/drivers/media/radio/wl128x/fmdrv_v4l2.c b/drivers/media/radio/wl128x/fmdrv_v4l2.c -index c80a6df47f5e..469366dae1d5 100644 ---- a/drivers/media/radio/wl128x/fmdrv_v4l2.c -+++ b/drivers/media/radio/wl128x/fmdrv_v4l2.c -@@ -541,6 +541,7 @@ int fm_v4l2_init_video_device(struct fmdev *fmdev, int radio_nr) - - /* Register with V4L2 subsystem as RADIO device */ - if (video_register_device(&gradio_dev, VFL_TYPE_RADIO, radio_nr)) { -+ v4l2_device_unregister(&fmdev->v4l2_dev); - fmerr("Could not register video device\n"); - return -ENOMEM; - } -@@ -554,6 +555,8 @@ int fm_v4l2_init_video_device(struct fmdev *fmdev, int radio_nr) - if (ret < 0) { - fmerr("(fmdev): Can't init ctrl handler\n"); - v4l2_ctrl_handler_free(&fmdev->ctrl_handler); -+ video_unregister_device(fmdev->radio_dev); -+ v4l2_device_unregister(&fmdev->v4l2_dev); - return -EBUSY; - } - -diff --git a/drivers/media/rc/ir-spi.c b/drivers/media/rc/ir-spi.c -index 66334e8d63ba..c58f2d38a458 100644 ---- a/drivers/media/rc/ir-spi.c -+++ b/drivers/media/rc/ir-spi.c -@@ -161,6 +161,7 @@ static const struct of_device_id ir_spi_of_match[] = { - { .compatible = "ir-spi-led" }, - {}, - }; -+MODULE_DEVICE_TABLE(of, ir_spi_of_match); - - static struct spi_driver ir_spi_driver = { - .probe = ir_spi_probe, -diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c -index f746f6e2f686..a8a72d5fbd12 100644 ---- a/drivers/media/usb/au0828/au0828-core.c -+++ b/drivers/media/usb/au0828/au0828-core.c -@@ -719,6 +719,12 @@ static int au0828_usb_probe(struct usb_interface *interface, - /* Setup */ - au0828_card_setup(dev); - -+ /* -+ * Store the pointer to the au0828_dev so it can be accessed in -+ * au0828_usb_disconnect -+ */ -+ usb_set_intfdata(interface, dev); -+ - /* Analog TV */ - retval = au0828_analog_register(dev, interface); - if (retval) { -@@ -737,12 +743,6 @@ static int au0828_usb_probe(struct usb_interface *interface, - /* Remote controller */ - au0828_rc_register(dev); - -- /* -- * Store the pointer to the au0828_dev so it can be accessed in -- * au0828_usb_disconnect -- */ -- usb_set_intfdata(interface, dev); -- - pr_info("Registered device AU0828 [%s]\n", - dev->board.name == NULL ? "Unset" : dev->board.name); - -diff --git a/drivers/media/usb/cpia2/cpia2_usb.c b/drivers/media/usb/cpia2/cpia2_usb.c -index b2268981c963..17468f7d78ed 100644 ---- a/drivers/media/usb/cpia2/cpia2_usb.c -+++ b/drivers/media/usb/cpia2/cpia2_usb.c -@@ -893,7 +893,6 @@ static void cpia2_usb_disconnect(struct usb_interface *intf) - cpia2_unregister_camera(cam); - v4l2_device_disconnect(&cam->v4l2_dev); - mutex_unlock(&cam->v4l2_lock); -- v4l2_device_put(&cam->v4l2_dev); - - if(cam->buffers) { - DBG("Wakeup waiting processes\n"); -@@ -902,6 +901,8 @@ static void cpia2_usb_disconnect(struct usb_interface *intf) - wake_up_interruptible(&cam->wq_stream); - } - -+ v4l2_device_put(&cam->v4l2_dev); -+ - LOG("CPiA2 camera disconnected.\n"); - } - -diff --git a/drivers/media/usb/dvb-usb/dvb-usb-init.c b/drivers/media/usb/dvb-usb/dvb-usb-init.c -index e97f6edc98de..65f2b1a20ca1 100644 ---- a/drivers/media/usb/dvb-usb/dvb-usb-init.c -+++ b/drivers/media/usb/dvb-usb/dvb-usb-init.c -@@ -284,12 +284,15 @@ EXPORT_SYMBOL(dvb_usb_device_init); - void dvb_usb_device_exit(struct usb_interface *intf) - { - struct dvb_usb_device *d = usb_get_intfdata(intf); -- const char *name = "generic DVB-USB module"; -+ const char *default_name = "generic DVB-USB module"; -+ char name[40]; - - usb_set_intfdata(intf, NULL); - if (d != NULL && d->desc != NULL) { -- name = d->desc->name; -+ strscpy(name, d->desc->name, sizeof(name)); - dvb_usb_exit(d); -+ } else { -+ strscpy(name, default_name, sizeof(name)); - } - info("%s successfully deinitialized and disconnected.", name); - -diff --git a/drivers/media/usb/hdpvr/hdpvr-video.c b/drivers/media/usb/hdpvr/hdpvr-video.c -index 7580fc5f2f12..6a6405b80797 100644 ---- a/drivers/media/usb/hdpvr/hdpvr-video.c -+++ b/drivers/media/usb/hdpvr/hdpvr-video.c -@@ -435,7 +435,7 @@ static ssize_t hdpvr_read(struct file *file, char __user *buffer, size_t count, - /* wait for the first buffer */ - if (!(file->f_flags & O_NONBLOCK)) { - if (wait_event_interruptible(dev->wait_data, -- hdpvr_get_next_buffer(dev))) -+ !list_empty_careful(&dev->rec_buff_list))) - return -ERESTARTSYS; - } - -@@ -461,10 +461,17 @@ static ssize_t hdpvr_read(struct file *file, char __user *buffer, size_t count, - goto err; - } - if (!err) { -- v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev, -- "timeout: restart streaming\n"); -+ v4l2_info(&dev->v4l2_dev, -+ "timeout: restart streaming\n"); -+ mutex_lock(&dev->io_mutex); - hdpvr_stop_streaming(dev); -- msecs_to_jiffies(4000); -+ mutex_unlock(&dev->io_mutex); -+ /* -+ * The FW needs about 4 seconds after streaming -+ * stopped before it is ready to restart -+ * streaming. -+ */ -+ msleep(4000); - err = hdpvr_start_streaming(dev); - if (err) { - ret = err; -@@ -1127,9 +1134,7 @@ static void hdpvr_device_release(struct video_device *vdev) - struct hdpvr_device *dev = video_get_drvdata(vdev); - - hdpvr_delete(dev); -- mutex_lock(&dev->io_mutex); - flush_work(&dev->worker); -- mutex_unlock(&dev->io_mutex); - - v4l2_device_unregister(&dev->v4l2_dev); - v4l2_ctrl_handler_free(&dev->hdl); -diff --git a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c -index 70b5cb08d65b..bbf361ce0bd0 100644 ---- a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c -+++ b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c -@@ -1670,7 +1670,7 @@ static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl) - } - if (!hdw->flag_decoder_missed) { - pvr2_trace(PVR2_TRACE_ERROR_LEGS, -- "WARNING: No decoder present"); -+ "***WARNING*** No decoder present"); - hdw->flag_decoder_missed = !0; - trace_stbit("flag_decoder_missed", - hdw->flag_decoder_missed); -@@ -2356,7 +2356,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, - if (hdw_desc->flag_is_experimental) { - pvr2_trace(PVR2_TRACE_INFO, "**********"); - pvr2_trace(PVR2_TRACE_INFO, -- "WARNING: Support for this device (%s) is experimental.", -+ "***WARNING*** Support for this device (%s) is experimental.", - hdw_desc->description); - pvr2_trace(PVR2_TRACE_INFO, - "Important functionality might not be entirely working."); -diff --git a/drivers/media/usb/pvrusb2/pvrusb2-i2c-core.c b/drivers/media/usb/pvrusb2/pvrusb2-i2c-core.c -index 68e323f8d9cf..275394bafe7d 100644 ---- a/drivers/media/usb/pvrusb2/pvrusb2-i2c-core.c -+++ b/drivers/media/usb/pvrusb2/pvrusb2-i2c-core.c -@@ -333,11 +333,11 @@ static int i2c_hack_cx25840(struct pvr2_hdw *hdw, - - if ((ret != 0) || (*rdata == 0x04) || (*rdata == 0x0a)) { - pvr2_trace(PVR2_TRACE_ERROR_LEGS, -- "WARNING: Detected a wedged cx25840 chip; the device will not work."); -+ "***WARNING*** Detected a wedged cx25840 chip; the device will not work."); - pvr2_trace(PVR2_TRACE_ERROR_LEGS, -- "WARNING: Try power cycling the pvrusb2 device."); -+ "***WARNING*** Try power cycling the pvrusb2 device."); - pvr2_trace(PVR2_TRACE_ERROR_LEGS, -- "WARNING: Disabling further access to the device to prevent other foul-ups."); -+ "***WARNING*** Disabling further access to the device to prevent other foul-ups."); - // This blocks all further communication with the part. - hdw->i2c_func[0x44] = NULL; - pvr2_hdw_render_useless(hdw); -diff --git a/drivers/media/usb/pvrusb2/pvrusb2-std.c b/drivers/media/usb/pvrusb2/pvrusb2-std.c -index 447279b4a545..e7ab41401577 100644 ---- a/drivers/media/usb/pvrusb2/pvrusb2-std.c -+++ b/drivers/media/usb/pvrusb2/pvrusb2-std.c -@@ -343,7 +343,7 @@ struct v4l2_standard *pvr2_std_create_enum(unsigned int *countptr, - bcnt = pvr2_std_id_to_str(buf,sizeof(buf),fmsk); - pvr2_trace( - PVR2_TRACE_ERROR_LEGS, -- "WARNING: Failed to classify the following standard(s): %.*s", -+ "***WARNING*** Failed to classify the following standard(s): %.*s", - bcnt,buf); - } - -diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c -index 26163a5bde7d..e399b9fad757 100644 ---- a/drivers/media/usb/uvc/uvc_ctrl.c -+++ b/drivers/media/usb/uvc/uvc_ctrl.c -@@ -2345,7 +2345,9 @@ void uvc_ctrl_cleanup_device(struct uvc_device *dev) - struct uvc_entity *entity; - unsigned int i; - -- cancel_work_sync(&dev->async_ctrl.work); -+ /* Can be uninitialized if we are aborting on probe error. */ -+ if (dev->async_ctrl.work.func) -+ cancel_work_sync(&dev->async_ctrl.work); - - /* Free controls and control mappings for all entities. */ - list_for_each_entry(entity, &dev->entities, list) { -diff --git a/drivers/media/usb/zr364xx/zr364xx.c b/drivers/media/usb/zr364xx/zr364xx.c -index 37a7992585df..48803eb773ed 100644 ---- a/drivers/media/usb/zr364xx/zr364xx.c -+++ b/drivers/media/usb/zr364xx/zr364xx.c -@@ -694,7 +694,8 @@ static int zr364xx_vidioc_querycap(struct file *file, void *priv, - struct zr364xx_camera *cam = video_drvdata(file); - - strscpy(cap->driver, DRIVER_DESC, sizeof(cap->driver)); -- strscpy(cap->card, cam->udev->product, sizeof(cap->card)); -+ if (cam->udev->product) -+ strscpy(cap->card, cam->udev->product, sizeof(cap->card)); - strscpy(cap->bus_info, dev_name(&cam->udev->dev), - sizeof(cap->bus_info)); - cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | -diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c -index 7d3a33258748..4d385489be6d 100644 ---- a/drivers/media/v4l2-core/v4l2-ctrls.c -+++ b/drivers/media/v4l2-core/v4l2-ctrls.c -@@ -2149,15 +2149,6 @@ static int handler_new_ref(struct v4l2_ctrl_handler *hdl, - if (size_extra_req) - new_ref->p_req.p = &new_ref[1]; - -- if (ctrl->handler == hdl) { -- /* By default each control starts in a cluster of its own. -- new_ref->ctrl is basically a cluster array with one -- element, so that's perfect to use as the cluster pointer. -- But only do this for the handler that owns the control. */ -- ctrl->cluster = &new_ref->ctrl; -- ctrl->ncontrols = 1; -- } -- - INIT_LIST_HEAD(&new_ref->node); - - mutex_lock(hdl->lock); -@@ -2190,6 +2181,15 @@ static int handler_new_ref(struct v4l2_ctrl_handler *hdl, - hdl->buckets[bucket] = new_ref; - if (ctrl_ref) - *ctrl_ref = new_ref; -+ if (ctrl->handler == hdl) { -+ /* By default each control starts in a cluster of its own. -+ * new_ref->ctrl is basically a cluster array with one -+ * element, so that's perfect to use as the cluster pointer. -+ * But only do this for the handler that owns the control. -+ */ -+ ctrl->cluster = &new_ref->ctrl; -+ ctrl->ncontrols = 1; -+ } - - unlock: - mutex_unlock(hdl->lock); -@@ -2369,16 +2369,15 @@ struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl, - v4l2_ctrl_fill(cfg->id, &name, &type, &min, &max, &step, - &def, &flags); - -- is_menu = (cfg->type == V4L2_CTRL_TYPE_MENU || -- cfg->type == V4L2_CTRL_TYPE_INTEGER_MENU); -+ is_menu = (type == V4L2_CTRL_TYPE_MENU || -+ type == V4L2_CTRL_TYPE_INTEGER_MENU); - if (is_menu) - WARN_ON(step); - else - WARN_ON(cfg->menu_skip_mask); -- if (cfg->type == V4L2_CTRL_TYPE_MENU && qmenu == NULL) -+ if (type == V4L2_CTRL_TYPE_MENU && !qmenu) { - qmenu = v4l2_ctrl_get_menu(cfg->id); -- else if (cfg->type == V4L2_CTRL_TYPE_INTEGER_MENU && -- qmenu_int == NULL) { -+ } else if (type == V4L2_CTRL_TYPE_INTEGER_MENU && !qmenu_int) { - handler_set_err(hdl, -EINVAL); - return NULL; - } -diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c -index 6cfb293396f2..693ee73eb291 100644 ---- a/drivers/memstick/core/memstick.c -+++ b/drivers/memstick/core/memstick.c -@@ -625,13 +625,18 @@ static int __init memstick_init(void) - return -ENOMEM; - - rc = bus_register(&memstick_bus_type); -- if (!rc) -- rc = class_register(&memstick_host_class); -+ if (rc) -+ goto error_destroy_workqueue; - -- if (!rc) -- return 0; -+ rc = class_register(&memstick_host_class); -+ if (rc) -+ goto error_bus_unregister; -+ -+ return 0; - -+error_bus_unregister: - bus_unregister(&memstick_bus_type); -+error_destroy_workqueue: - destroy_workqueue(workqueue); - - return rc; -diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c -index 2bdc7b02157a..4a31907a4525 100644 ---- a/drivers/mfd/arizona-core.c -+++ b/drivers/mfd/arizona-core.c -@@ -993,7 +993,7 @@ int arizona_dev_init(struct arizona *arizona) - unsigned int reg, val; - int (*apply_patch)(struct arizona *) = NULL; - const struct mfd_cell *subdevs = NULL; -- int n_subdevs, ret, i; -+ int n_subdevs = 0, ret, i; - - dev_set_drvdata(arizona->dev, arizona); - mutex_init(&arizona->clk_lock); -diff --git a/drivers/mfd/cros_ec_dev.c b/drivers/mfd/cros_ec_dev.c -index a5391f96eafd..607383b67cf1 100644 ---- a/drivers/mfd/cros_ec_dev.c -+++ b/drivers/mfd/cros_ec_dev.c -@@ -285,13 +285,15 @@ static void cros_ec_sensors_register(struct cros_ec_dev *ec) - - resp = (struct ec_response_motion_sense *)msg->data; - sensor_num = resp->dump.sensor_count; -- /* Allocate 1 extra sensors in FIFO are needed */ -- sensor_cells = kcalloc(sensor_num + 1, sizeof(struct mfd_cell), -+ /* -+ * Allocate 2 extra sensors if lid angle sensor and/or FIFO are needed. -+ */ -+ sensor_cells = kcalloc(sensor_num + 2, sizeof(struct mfd_cell), - GFP_KERNEL); - if (sensor_cells == NULL) - goto error; - -- sensor_platforms = kcalloc(sensor_num + 1, -+ sensor_platforms = kcalloc(sensor_num, - sizeof(struct cros_ec_sensor_platform), - GFP_KERNEL); - if (sensor_platforms == NULL) -@@ -351,6 +353,11 @@ static void cros_ec_sensors_register(struct cros_ec_dev *ec) - sensor_cells[id].name = "cros-ec-ring"; - id++; - } -+ if (cros_ec_check_features(ec, -+ EC_FEATURE_REFINED_TABLET_MODE_HYSTERESIS)) { -+ sensor_cells[id].name = "cros-ec-lid-angle"; -+ id++; -+ } - - ret = mfd_add_devices(ec->dev, 0, sensor_cells, id, - NULL, 0, NULL); -diff --git a/drivers/mfd/hi655x-pmic.c b/drivers/mfd/hi655x-pmic.c -index f1c51ce309fa..7e3959aaa285 100644 ---- a/drivers/mfd/hi655x-pmic.c -+++ b/drivers/mfd/hi655x-pmic.c -@@ -109,6 +109,8 @@ static int hi655x_pmic_probe(struct platform_device *pdev) - - pmic->regmap = devm_regmap_init_mmio_clk(dev, NULL, base, - &hi655x_regmap_config); -+ if (IS_ERR(pmic->regmap)) -+ return PTR_ERR(pmic->regmap); - - regmap_read(pmic->regmap, HI655X_BUS_ADDR(HI655X_VER_REG), &pmic->ver); - if ((pmic->ver < PMU_VER_START) || (pmic->ver > PMU_VER_END)) { -diff --git a/drivers/mfd/madera-core.c b/drivers/mfd/madera-core.c -index 2a77988d0462..826b971ccb86 100644 ---- a/drivers/mfd/madera-core.c -+++ b/drivers/mfd/madera-core.c -@@ -286,6 +286,7 @@ const struct of_device_id madera_of_match[] = { - { .compatible = "cirrus,wm1840", .data = (void *)WM1840 }, - {} - }; -+MODULE_DEVICE_TABLE(of, madera_of_match); - EXPORT_SYMBOL_GPL(madera_of_match); - - static int madera_get_reset_gpio(struct madera *madera) -diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c -index dbf684c4ebfb..23276a80e3b4 100644 ---- a/drivers/mfd/mfd-core.c -+++ b/drivers/mfd/mfd-core.c -@@ -175,6 +175,7 @@ static int mfd_add_device(struct device *parent, int id, - for_each_child_of_node(parent->of_node, np) { - if (of_device_is_compatible(np, cell->of_compatible)) { - pdev->dev.of_node = np; -+ pdev->dev.fwnode = &np->fwnode; - break; - } - } -diff --git a/drivers/mfd/ucb1x00-core.c b/drivers/mfd/ucb1x00-core.c -index b690796d24d4..448b13da62b4 100644 ---- a/drivers/mfd/ucb1x00-core.c -+++ b/drivers/mfd/ucb1x00-core.c -@@ -250,7 +250,7 @@ unsigned int ucb1x00_adc_read(struct ucb1x00 *ucb, int adc_channel, int sync) - break; - /* yield to other processes */ - set_current_state(TASK_INTERRUPTIBLE); -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - } - - return UCB_ADC_DAT(val); -diff --git a/drivers/misc/eeprom/Kconfig b/drivers/misc/eeprom/Kconfig -index f88094719552..f2abe27010ef 100644 ---- a/drivers/misc/eeprom/Kconfig -+++ b/drivers/misc/eeprom/Kconfig -@@ -5,6 +5,7 @@ config EEPROM_AT24 - tristate "I2C EEPROMs / RAMs / ROMs from most vendors" - depends on I2C && SYSFS - select NVMEM -+ select NVMEM_SYSFS - select REGMAP_I2C - help - Enable this driver to get read/write support to most I2C EEPROMs -@@ -34,6 +35,7 @@ config EEPROM_AT25 - tristate "SPI EEPROMs from most vendors" - depends on SPI && SYSFS - select NVMEM -+ select NVMEM_SYSFS - help - Enable this driver to get read/write support to most SPI EEPROMs, - after you configure the board init code to know about each eeprom -@@ -80,6 +82,7 @@ config EEPROM_93XX46 - depends on SPI && SYSFS - select REGMAP - select NVMEM -+ select NVMEM_SYSFS - help - Driver for the microwire EEPROM chipsets 93xx46x. The driver - supports both read and write commands and also the command to -diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c -index 63aa541c9608..50f0f3c66934 100644 ---- a/drivers/misc/eeprom/at24.c -+++ b/drivers/misc/eeprom/at24.c -@@ -719,7 +719,7 @@ static int at24_probe(struct i2c_client *client) - nvmem_config.name = dev_name(dev); - nvmem_config.dev = dev; - nvmem_config.read_only = !writable; -- nvmem_config.root_only = true; -+ nvmem_config.root_only = !(flags & AT24_FLAG_IRUGO); - nvmem_config.owner = THIS_MODULE; - nvmem_config.compat = true; - nvmem_config.base_dev = dev; -diff --git a/drivers/misc/lkdtm/Makefile b/drivers/misc/lkdtm/Makefile -index 951c984de61a..fb10eafe9bde 100644 ---- a/drivers/misc/lkdtm/Makefile -+++ b/drivers/misc/lkdtm/Makefile -@@ -15,8 +15,7 @@ KCOV_INSTRUMENT_rodata.o := n - - OBJCOPYFLAGS := - OBJCOPYFLAGS_rodata_objcopy.o := \ -- --set-section-flags .text=alloc,readonly \ -- --rename-section .text=.rodata -+ --rename-section .text=.rodata,alloc,readonly,load - targets += rodata.o rodata_objcopy.o - $(obj)/rodata_objcopy.o: $(obj)/rodata.o FORCE - $(call if_changed,objcopy) -diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h -index d74b182e19f3..6c0173772162 100644 ---- a/drivers/misc/mei/hw-me-regs.h -+++ b/drivers/misc/mei/hw-me-regs.h -@@ -81,6 +81,9 @@ - - #define MEI_DEV_ID_ICP_LP 0x34E0 /* Ice Lake Point LP */ - -+#define MEI_DEV_ID_MCC 0x4B70 /* Mule Creek Canyon (EHL) */ -+#define MEI_DEV_ID_MCC_4 0x4B75 /* Mule Creek Canyon 4 (EHL) */ -+ - /* - * MEI HW Section - */ -diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c -index 7a2b3545a7f9..57cb68f5cc64 100644 ---- a/drivers/misc/mei/pci-me.c -+++ b/drivers/misc/mei/pci-me.c -@@ -98,6 +98,9 @@ static const struct pci_device_id mei_me_pci_tbl[] = { - - {MEI_PCI_DEVICE(MEI_DEV_ID_ICP_LP, MEI_ME_PCH12_CFG)}, - -+ {MEI_PCI_DEVICE(MEI_DEV_ID_MCC, MEI_ME_PCH12_CFG)}, -+ {MEI_PCI_DEVICE(MEI_DEV_ID_MCC_4, MEI_ME_PCH8_CFG)}, -+ - /* required last entry */ - {0, } - }; -diff --git a/drivers/misc/sgi-xp/xpc_channel.c b/drivers/misc/sgi-xp/xpc_channel.c -index 8e6607fc8a67..b9ab770bbdb5 100644 ---- a/drivers/misc/sgi-xp/xpc_channel.c -+++ b/drivers/misc/sgi-xp/xpc_channel.c -@@ -834,7 +834,7 @@ xpc_allocate_msg_wait(struct xpc_channel *ch) - - atomic_inc(&ch->n_on_msg_allocate_wq); - prepare_to_wait(&ch->msg_allocate_wq, &wait, TASK_INTERRUPTIBLE); -- ret = schedule_timeout(1); -+ ret = schedule_min_hrtimeout(); - finish_wait(&ch->msg_allocate_wq, &wait); - atomic_dec(&ch->n_on_msg_allocate_wq); - -diff --git a/drivers/misc/vmw_vmci/vmci_context.c b/drivers/misc/vmw_vmci/vmci_context.c -index 300ed69fe2c7..16695366ec92 100644 ---- a/drivers/misc/vmw_vmci/vmci_context.c -+++ b/drivers/misc/vmw_vmci/vmci_context.c -@@ -21,6 +21,9 @@ - #include "vmci_driver.h" - #include "vmci_event.h" - -+/* Use a wide upper bound for the maximum contexts. */ -+#define VMCI_MAX_CONTEXTS 2000 -+ - /* - * List of current VMCI contexts. Contexts can be added by - * vmci_ctx_create() and removed via vmci_ctx_destroy(). -@@ -117,19 +120,22 @@ struct vmci_ctx *vmci_ctx_create(u32 cid, u32 priv_flags, - /* Initialize host-specific VMCI context. */ - init_waitqueue_head(&context->host_context.wait_queue); - -- context->queue_pair_array = vmci_handle_arr_create(0); -+ context->queue_pair_array = -+ vmci_handle_arr_create(0, VMCI_MAX_GUEST_QP_COUNT); - if (!context->queue_pair_array) { - error = -ENOMEM; - goto err_free_ctx; - } - -- context->doorbell_array = vmci_handle_arr_create(0); -+ context->doorbell_array = -+ vmci_handle_arr_create(0, VMCI_MAX_GUEST_DOORBELL_COUNT); - if (!context->doorbell_array) { - error = -ENOMEM; - goto err_free_qp_array; - } - -- context->pending_doorbell_array = vmci_handle_arr_create(0); -+ context->pending_doorbell_array = -+ vmci_handle_arr_create(0, VMCI_MAX_GUEST_DOORBELL_COUNT); - if (!context->pending_doorbell_array) { - error = -ENOMEM; - goto err_free_db_array; -@@ -204,7 +210,7 @@ static int ctx_fire_notification(u32 context_id, u32 priv_flags) - * We create an array to hold the subscribers we find when - * scanning through all contexts. - */ -- subscriber_array = vmci_handle_arr_create(0); -+ subscriber_array = vmci_handle_arr_create(0, VMCI_MAX_CONTEXTS); - if (subscriber_array == NULL) - return VMCI_ERROR_NO_MEM; - -@@ -623,20 +629,26 @@ int vmci_ctx_add_notification(u32 context_id, u32 remote_cid) - - spin_lock(&context->lock); - -- list_for_each_entry(n, &context->notifier_list, node) { -- if (vmci_handle_is_equal(n->handle, notifier->handle)) { -- exists = true; -- break; -+ if (context->n_notifiers < VMCI_MAX_CONTEXTS) { -+ list_for_each_entry(n, &context->notifier_list, node) { -+ if (vmci_handle_is_equal(n->handle, notifier->handle)) { -+ exists = true; -+ break; -+ } - } -- } - -- if (exists) { -- kfree(notifier); -- result = VMCI_ERROR_ALREADY_EXISTS; -+ if (exists) { -+ kfree(notifier); -+ result = VMCI_ERROR_ALREADY_EXISTS; -+ } else { -+ list_add_tail_rcu(¬ifier->node, -+ &context->notifier_list); -+ context->n_notifiers++; -+ result = VMCI_SUCCESS; -+ } - } else { -- list_add_tail_rcu(¬ifier->node, &context->notifier_list); -- context->n_notifiers++; -- result = VMCI_SUCCESS; -+ kfree(notifier); -+ result = VMCI_ERROR_NO_MEM; - } - - spin_unlock(&context->lock); -@@ -721,8 +733,7 @@ static int vmci_ctx_get_chkpt_doorbells(struct vmci_ctx *context, - u32 *buf_size, void **pbuf) - { - struct dbell_cpt_state *dbells; -- size_t n_doorbells; -- int i; -+ u32 i, n_doorbells; - - n_doorbells = vmci_handle_arr_get_size(context->doorbell_array); - if (n_doorbells > 0) { -@@ -860,7 +871,8 @@ int vmci_ctx_rcv_notifications_get(u32 context_id, - spin_lock(&context->lock); - - *db_handle_array = context->pending_doorbell_array; -- context->pending_doorbell_array = vmci_handle_arr_create(0); -+ context->pending_doorbell_array = -+ vmci_handle_arr_create(0, VMCI_MAX_GUEST_DOORBELL_COUNT); - if (!context->pending_doorbell_array) { - context->pending_doorbell_array = *db_handle_array; - *db_handle_array = NULL; -@@ -942,12 +954,11 @@ int vmci_ctx_dbell_create(u32 context_id, struct vmci_handle handle) - return VMCI_ERROR_NOT_FOUND; - - spin_lock(&context->lock); -- if (!vmci_handle_arr_has_entry(context->doorbell_array, handle)) { -- vmci_handle_arr_append_entry(&context->doorbell_array, handle); -- result = VMCI_SUCCESS; -- } else { -+ if (!vmci_handle_arr_has_entry(context->doorbell_array, handle)) -+ result = vmci_handle_arr_append_entry(&context->doorbell_array, -+ handle); -+ else - result = VMCI_ERROR_DUPLICATE_ENTRY; -- } - - spin_unlock(&context->lock); - vmci_ctx_put(context); -@@ -1083,15 +1094,16 @@ int vmci_ctx_notify_dbell(u32 src_cid, - if (!vmci_handle_arr_has_entry( - dst_context->pending_doorbell_array, - handle)) { -- vmci_handle_arr_append_entry( -+ result = vmci_handle_arr_append_entry( - &dst_context->pending_doorbell_array, - handle); -- -- ctx_signal_notify(dst_context); -- wake_up(&dst_context->host_context.wait_queue); -- -+ if (result == VMCI_SUCCESS) { -+ ctx_signal_notify(dst_context); -+ wake_up(&dst_context->host_context.wait_queue); -+ } -+ } else { -+ result = VMCI_SUCCESS; - } -- result = VMCI_SUCCESS; - } - spin_unlock(&dst_context->lock); - } -@@ -1118,13 +1130,11 @@ int vmci_ctx_qp_create(struct vmci_ctx *context, struct vmci_handle handle) - if (context == NULL || vmci_handle_is_invalid(handle)) - return VMCI_ERROR_INVALID_ARGS; - -- if (!vmci_handle_arr_has_entry(context->queue_pair_array, handle)) { -- vmci_handle_arr_append_entry(&context->queue_pair_array, -- handle); -- result = VMCI_SUCCESS; -- } else { -+ if (!vmci_handle_arr_has_entry(context->queue_pair_array, handle)) -+ result = vmci_handle_arr_append_entry( -+ &context->queue_pair_array, handle); -+ else - result = VMCI_ERROR_DUPLICATE_ENTRY; -- } - - return result; - } -diff --git a/drivers/misc/vmw_vmci/vmci_handle_array.c b/drivers/misc/vmw_vmci/vmci_handle_array.c -index c527388f5d7b..de7fee7ead1b 100644 ---- a/drivers/misc/vmw_vmci/vmci_handle_array.c -+++ b/drivers/misc/vmw_vmci/vmci_handle_array.c -@@ -8,24 +8,29 @@ - #include - #include "vmci_handle_array.h" - --static size_t handle_arr_calc_size(size_t capacity) -+static size_t handle_arr_calc_size(u32 capacity) - { -- return sizeof(struct vmci_handle_arr) + -+ return VMCI_HANDLE_ARRAY_HEADER_SIZE + - capacity * sizeof(struct vmci_handle); - } - --struct vmci_handle_arr *vmci_handle_arr_create(size_t capacity) -+struct vmci_handle_arr *vmci_handle_arr_create(u32 capacity, u32 max_capacity) - { - struct vmci_handle_arr *array; - -+ if (max_capacity == 0 || capacity > max_capacity) -+ return NULL; -+ - if (capacity == 0) -- capacity = VMCI_HANDLE_ARRAY_DEFAULT_SIZE; -+ capacity = min((u32)VMCI_HANDLE_ARRAY_DEFAULT_CAPACITY, -+ max_capacity); - - array = kmalloc(handle_arr_calc_size(capacity), GFP_ATOMIC); - if (!array) - return NULL; - - array->capacity = capacity; -+ array->max_capacity = max_capacity; - array->size = 0; - - return array; -@@ -36,27 +41,34 @@ void vmci_handle_arr_destroy(struct vmci_handle_arr *array) - kfree(array); - } - --void vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, -- struct vmci_handle handle) -+int vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, -+ struct vmci_handle handle) - { - struct vmci_handle_arr *array = *array_ptr; - - if (unlikely(array->size >= array->capacity)) { - /* reallocate. */ - struct vmci_handle_arr *new_array; -- size_t new_capacity = array->capacity * VMCI_ARR_CAP_MULT; -- size_t new_size = handle_arr_calc_size(new_capacity); -+ u32 capacity_bump = min(array->max_capacity - array->capacity, -+ array->capacity); -+ size_t new_size = handle_arr_calc_size(array->capacity + -+ capacity_bump); -+ -+ if (array->size >= array->max_capacity) -+ return VMCI_ERROR_NO_MEM; - - new_array = krealloc(array, new_size, GFP_ATOMIC); - if (!new_array) -- return; -+ return VMCI_ERROR_NO_MEM; - -- new_array->capacity = new_capacity; -+ new_array->capacity += capacity_bump; - *array_ptr = array = new_array; - } - - array->entries[array->size] = handle; - array->size++; -+ -+ return VMCI_SUCCESS; - } - - /* -@@ -66,7 +78,7 @@ struct vmci_handle vmci_handle_arr_remove_entry(struct vmci_handle_arr *array, - struct vmci_handle entry_handle) - { - struct vmci_handle handle = VMCI_INVALID_HANDLE; -- size_t i; -+ u32 i; - - for (i = 0; i < array->size; i++) { - if (vmci_handle_is_equal(array->entries[i], entry_handle)) { -@@ -101,7 +113,7 @@ struct vmci_handle vmci_handle_arr_remove_tail(struct vmci_handle_arr *array) - * Handle at given index, VMCI_INVALID_HANDLE if invalid index. - */ - struct vmci_handle --vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, size_t index) -+vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, u32 index) - { - if (unlikely(index >= array->size)) - return VMCI_INVALID_HANDLE; -@@ -112,7 +124,7 @@ vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, size_t index) - bool vmci_handle_arr_has_entry(const struct vmci_handle_arr *array, - struct vmci_handle entry_handle) - { -- size_t i; -+ u32 i; - - for (i = 0; i < array->size; i++) - if (vmci_handle_is_equal(array->entries[i], entry_handle)) -diff --git a/drivers/misc/vmw_vmci/vmci_handle_array.h b/drivers/misc/vmw_vmci/vmci_handle_array.h -index bd1559a548e9..96193f85be5b 100644 ---- a/drivers/misc/vmw_vmci/vmci_handle_array.h -+++ b/drivers/misc/vmw_vmci/vmci_handle_array.h -@@ -9,32 +9,41 @@ - #define _VMCI_HANDLE_ARRAY_H_ - - #include -+#include - #include - --#define VMCI_HANDLE_ARRAY_DEFAULT_SIZE 4 --#define VMCI_ARR_CAP_MULT 2 /* Array capacity multiplier */ -- - struct vmci_handle_arr { -- size_t capacity; -- size_t size; -+ u32 capacity; -+ u32 max_capacity; -+ u32 size; -+ u32 pad; - struct vmci_handle entries[]; - }; - --struct vmci_handle_arr *vmci_handle_arr_create(size_t capacity); -+#define VMCI_HANDLE_ARRAY_HEADER_SIZE \ -+ offsetof(struct vmci_handle_arr, entries) -+/* Select a default capacity that results in a 64 byte sized array */ -+#define VMCI_HANDLE_ARRAY_DEFAULT_CAPACITY 6 -+/* Make sure that the max array size can be expressed by a u32 */ -+#define VMCI_HANDLE_ARRAY_MAX_CAPACITY \ -+ ((U32_MAX - VMCI_HANDLE_ARRAY_HEADER_SIZE - 1) / \ -+ sizeof(struct vmci_handle)) -+ -+struct vmci_handle_arr *vmci_handle_arr_create(u32 capacity, u32 max_capacity); - void vmci_handle_arr_destroy(struct vmci_handle_arr *array); --void vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, -- struct vmci_handle handle); -+int vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, -+ struct vmci_handle handle); - struct vmci_handle vmci_handle_arr_remove_entry(struct vmci_handle_arr *array, - struct vmci_handle - entry_handle); - struct vmci_handle vmci_handle_arr_remove_tail(struct vmci_handle_arr *array); - struct vmci_handle --vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, size_t index); -+vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, u32 index); - bool vmci_handle_arr_has_entry(const struct vmci_handle_arr *array, - struct vmci_handle entry_handle); - struct vmci_handle *vmci_handle_arr_get_handles(struct vmci_handle_arr *array); - --static inline size_t vmci_handle_arr_get_size( -+static inline u32 vmci_handle_arr_get_size( - const struct vmci_handle_arr *array) - { - return array->size; -diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c -index 3557d5c51141..245a6fd668c8 100644 ---- a/drivers/mmc/core/queue.c -+++ b/drivers/mmc/core/queue.c -@@ -10,6 +10,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -430,6 +431,10 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card) - goto free_tag_set; - } - -+ if (mmc_host_is_spi(host) && host->use_spi_crc) -+ mq->queue->backing_dev_info->capabilities |= -+ BDI_CAP_STABLE_WRITES; -+ - mq->queue->queuedata = mq; - blk_queue_rq_timeout(mq->queue, 60 * HZ); - -diff --git a/drivers/mmc/host/cavium.c b/drivers/mmc/host/cavium.c -index ed5cefb83768..89deb451e0ac 100644 ---- a/drivers/mmc/host/cavium.c -+++ b/drivers/mmc/host/cavium.c -@@ -374,6 +374,7 @@ static int finish_dma_single(struct cvm_mmc_host *host, struct mmc_data *data) - { - data->bytes_xfered = data->blocks * data->blksz; - data->error = 0; -+ dma_unmap_sg(host->dev, data->sg, data->sg_len, get_dma_dir(data)); - return 1; - } - -@@ -1046,7 +1047,8 @@ int cvm_mmc_of_slot_probe(struct device *dev, struct cvm_mmc_host *host) - mmc->max_segs = 1; - - /* DMA size field can address up to 8 MB */ -- mmc->max_seg_size = 8 * 1024 * 1024; -+ mmc->max_seg_size = min_t(unsigned int, 8 * 1024 * 1024, -+ dma_get_max_seg_size(host->dev)); - mmc->max_req_size = mmc->max_seg_size; - /* External DMA is in 512 byte blocks */ - mmc->max_blk_size = 512; -diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c -index b53b6b7d4dd4..60c3a06e3469 100644 ---- a/drivers/mmc/host/dw_mmc.c -+++ b/drivers/mmc/host/dw_mmc.c -@@ -2034,8 +2034,7 @@ static void dw_mci_tasklet_func(unsigned long priv) - * delayed. Allowing the transfer to take place - * avoids races and keeps things simple. - */ -- if ((err != -ETIMEDOUT) && -- (cmd->opcode == MMC_SEND_TUNING_BLOCK)) { -+ if (err != -ETIMEDOUT) { - state = STATE_SENDING_DATA; - continue; - } -diff --git a/drivers/mmc/host/meson-mx-sdio.c b/drivers/mmc/host/meson-mx-sdio.c -index 2d736e416775..ba9a63db73da 100644 ---- a/drivers/mmc/host/meson-mx-sdio.c -+++ b/drivers/mmc/host/meson-mx-sdio.c -@@ -73,7 +73,7 @@ - #define MESON_MX_SDIO_IRQC_IF_CONFIG_MASK GENMASK(7, 6) - #define MESON_MX_SDIO_IRQC_FORCE_DATA_CLK BIT(8) - #define MESON_MX_SDIO_IRQC_FORCE_DATA_CMD BIT(9) -- #define MESON_MX_SDIO_IRQC_FORCE_DATA_DAT_MASK GENMASK(10, 13) -+ #define MESON_MX_SDIO_IRQC_FORCE_DATA_DAT_MASK GENMASK(13, 10) - #define MESON_MX_SDIO_IRQC_SOFT_RESET BIT(15) - #define MESON_MX_SDIO_IRQC_FORCE_HALT BIT(30) - #define MESON_MX_SDIO_IRQC_HALT_HOLE BIT(31) -diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c -index 5fc76a1993d0..9cf14b359c14 100644 ---- a/drivers/mmc/host/sdhci-msm.c -+++ b/drivers/mmc/host/sdhci-msm.c -@@ -575,11 +575,14 @@ static int msm_init_cm_dll(struct sdhci_host *host) - struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); - struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host); - int wait_cnt = 50; -- unsigned long flags; -+ unsigned long flags, xo_clk = 0; - u32 config; - const struct sdhci_msm_offset *msm_offset = - msm_host->offset; - -+ if (msm_host->use_14lpp_dll_reset && !IS_ERR_OR_NULL(msm_host->xo_clk)) -+ xo_clk = clk_get_rate(msm_host->xo_clk); -+ - spin_lock_irqsave(&host->lock, flags); - - /* -@@ -627,10 +630,10 @@ static int msm_init_cm_dll(struct sdhci_host *host) - config &= CORE_FLL_CYCLE_CNT; - if (config) - mclk_freq = DIV_ROUND_CLOSEST_ULL((host->clock * 8), -- clk_get_rate(msm_host->xo_clk)); -+ xo_clk); - else - mclk_freq = DIV_ROUND_CLOSEST_ULL((host->clock * 4), -- clk_get_rate(msm_host->xo_clk)); -+ xo_clk); - - config = readl_relaxed(host->ioaddr + - msm_offset->core_dll_config_2); -diff --git a/drivers/mmc/host/sdhci-pci-o2micro.c b/drivers/mmc/host/sdhci-pci-o2micro.c -index dd21315922c8..9dc4548271b4 100644 ---- a/drivers/mmc/host/sdhci-pci-o2micro.c -+++ b/drivers/mmc/host/sdhci-pci-o2micro.c -@@ -395,11 +395,21 @@ int sdhci_pci_o2_probe_slot(struct sdhci_pci_slot *slot) - { - struct sdhci_pci_chip *chip; - struct sdhci_host *host; -- u32 reg; -+ u32 reg, caps; - int ret; - - chip = slot->chip; - host = slot->host; -+ -+ caps = sdhci_readl(host, SDHCI_CAPABILITIES); -+ -+ /* -+ * mmc_select_bus_width() will test the bus to determine the actual bus -+ * width. -+ */ -+ if (caps & SDHCI_CAN_DO_8BIT) -+ host->mmc->caps |= MMC_CAP_8_BIT_DATA; -+ - switch (chip->pdev->device) { - case PCI_DEVICE_ID_O2_SDS0: - case PCI_DEVICE_ID_O2_SEABIRD0: -diff --git a/drivers/mmc/host/sdhci-sprd.c b/drivers/mmc/host/sdhci-sprd.c -index 9a822e2e9f0b..06f84a4d79e0 100644 ---- a/drivers/mmc/host/sdhci-sprd.c -+++ b/drivers/mmc/host/sdhci-sprd.c -@@ -405,6 +405,7 @@ static int sdhci_sprd_probe(struct platform_device *pdev) - sdhci_cleanup_host(host); - - pm_runtime_disable: -+ pm_runtime_put_noidle(&pdev->dev); - pm_runtime_disable(&pdev->dev); - pm_runtime_set_suspended(&pdev->dev); - -diff --git a/drivers/mtd/nand/raw/mtk_nand.c b/drivers/mtd/nand/raw/mtk_nand.c -index dceff28c9a31..23fe19397315 100644 ---- a/drivers/mtd/nand/raw/mtk_nand.c -+++ b/drivers/mtd/nand/raw/mtk_nand.c -@@ -500,7 +500,8 @@ static int mtk_nfc_setup_data_interface(struct nand_chip *chip, int csline, - { - struct mtk_nfc *nfc = nand_get_controller_data(chip); - const struct nand_sdr_timings *timings; -- u32 rate, tpoecs, tprecs, tc2r, tw2r, twh, twst, trlt; -+ u32 rate, tpoecs, tprecs, tc2r, tw2r, twh, twst = 0, trlt = 0; -+ u32 thold; - - timings = nand_get_sdr_timings(conf); - if (IS_ERR(timings)) -@@ -536,11 +537,28 @@ static int mtk_nfc_setup_data_interface(struct nand_chip *chip, int csline, - twh = DIV_ROUND_UP(twh * rate, 1000000) - 1; - twh &= 0xf; - -- twst = timings->tWP_min / 1000; -+ /* Calculate real WE#/RE# hold time in nanosecond */ -+ thold = (twh + 1) * 1000000 / rate; -+ /* nanosecond to picosecond */ -+ thold *= 1000; -+ -+ /* -+ * WE# low level time should be expaned to meet WE# pulse time -+ * and WE# cycle time at the same time. -+ */ -+ if (thold < timings->tWC_min) -+ twst = timings->tWC_min - thold; -+ twst = max(timings->tWP_min, twst) / 1000; - twst = DIV_ROUND_UP(twst * rate, 1000000) - 1; - twst &= 0xf; - -- trlt = max(timings->tREA_max, timings->tRP_min) / 1000; -+ /* -+ * RE# low level time should be expaned to meet RE# pulse time, -+ * RE# access time and RE# cycle time at the same time. -+ */ -+ if (thold < timings->tRC_min) -+ trlt = timings->tRC_min - thold; -+ trlt = max3(trlt, timings->tREA_max, timings->tRP_min) / 1000; - trlt = DIV_ROUND_UP(trlt * rate, 1000000) - 1; - trlt &= 0xf; - -diff --git a/drivers/mtd/nand/raw/nand_micron.c b/drivers/mtd/nand/raw/nand_micron.c -index 1622d3145587..8ca9fad6e6ad 100644 ---- a/drivers/mtd/nand/raw/nand_micron.c -+++ b/drivers/mtd/nand/raw/nand_micron.c -@@ -390,6 +390,14 @@ static int micron_supports_on_die_ecc(struct nand_chip *chip) - (chip->id.data[4] & MICRON_ID_INTERNAL_ECC_MASK) != 0x2) - return MICRON_ON_DIE_UNSUPPORTED; - -+ /* -+ * It seems that there are devices which do not support ECC officially. -+ * At least the MT29F2G08ABAGA / MT29F2G08ABBGA devices supports -+ * enabling the ECC feature but don't reflect that to the READ_ID table. -+ * So we have to guarantee that we disable the ECC feature directly -+ * after we did the READ_ID table command. Later we can evaluate the -+ * ECC_ENABLE support. -+ */ - ret = micron_nand_on_die_ecc_setup(chip, true); - if (ret) - return MICRON_ON_DIE_UNSUPPORTED; -@@ -398,13 +406,13 @@ static int micron_supports_on_die_ecc(struct nand_chip *chip) - if (ret) - return MICRON_ON_DIE_UNSUPPORTED; - -- if (!(id[4] & MICRON_ID_ECC_ENABLED)) -- return MICRON_ON_DIE_UNSUPPORTED; -- - ret = micron_nand_on_die_ecc_setup(chip, false); - if (ret) - return MICRON_ON_DIE_UNSUPPORTED; - -+ if (!(id[4] & MICRON_ID_ECC_ENABLED)) -+ return MICRON_ON_DIE_UNSUPPORTED; -+ - ret = nand_readid_op(chip, 0, id, sizeof(id)); - if (ret) - return MICRON_ON_DIE_UNSUPPORTED; -diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c -index 4c15bb58c623..20560c0b1f5d 100644 ---- a/drivers/mtd/nand/spi/core.c -+++ b/drivers/mtd/nand/spi/core.c -@@ -511,12 +511,12 @@ static int spinand_mtd_read(struct mtd_info *mtd, loff_t from, - if (ret == -EBADMSG) { - ecc_failed = true; - mtd->ecc_stats.failed++; -- ret = 0; - } else { - mtd->ecc_stats.corrected += ret; - max_bitflips = max_t(unsigned int, max_bitflips, ret); - } - -+ ret = 0; - ops->retlen += iter.req.datalen; - ops->oobretlen += iter.req.ooblen; - } -diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c -index 799fc38c5c34..b0aab3a0a1bf 100644 ---- a/drivers/net/bonding/bond_main.c -+++ b/drivers/net/bonding/bond_main.c -@@ -3866,8 +3866,8 @@ static netdev_tx_t bond_xmit_roundrobin(struct sk_buff *skb, - struct net_device *bond_dev) - { - struct bonding *bond = netdev_priv(bond_dev); -- struct iphdr *iph = ip_hdr(skb); - struct slave *slave; -+ int slave_cnt; - u32 slave_id; - - /* Start with the curr_active_slave that joined the bond as the -@@ -3876,23 +3876,32 @@ static netdev_tx_t bond_xmit_roundrobin(struct sk_buff *skb, - * send the join/membership reports. The curr_active_slave found - * will send all of this type of traffic. - */ -- if (iph->protocol == IPPROTO_IGMP && skb->protocol == htons(ETH_P_IP)) { -- slave = rcu_dereference(bond->curr_active_slave); -- if (slave) -- bond_dev_queue_xmit(bond, skb, slave->dev); -- else -- bond_xmit_slave_id(bond, skb, 0); -- } else { -- int slave_cnt = READ_ONCE(bond->slave_cnt); -+ if (skb->protocol == htons(ETH_P_IP)) { -+ int noff = skb_network_offset(skb); -+ struct iphdr *iph; - -- if (likely(slave_cnt)) { -- slave_id = bond_rr_gen_slave_id(bond); -- bond_xmit_slave_id(bond, skb, slave_id % slave_cnt); -- } else { -- bond_tx_drop(bond_dev, skb); -+ if (unlikely(!pskb_may_pull(skb, noff + sizeof(*iph)))) -+ goto non_igmp; -+ -+ iph = ip_hdr(skb); -+ if (iph->protocol == IPPROTO_IGMP) { -+ slave = rcu_dereference(bond->curr_active_slave); -+ if (slave) -+ bond_dev_queue_xmit(bond, skb, slave->dev); -+ else -+ bond_xmit_slave_id(bond, skb, 0); -+ return NETDEV_TX_OK; - } - } - -+non_igmp: -+ slave_cnt = READ_ONCE(bond->slave_cnt); -+ if (likely(slave_cnt)) { -+ slave_id = bond_rr_gen_slave_id(bond); -+ bond_xmit_slave_id(bond, skb, slave_id % slave_cnt); -+ } else { -+ bond_tx_drop(bond_dev, skb); -+ } - return NETDEV_TX_OK; - } - -diff --git a/drivers/net/caif/caif_hsi.c b/drivers/net/caif/caif_hsi.c -index b2f10b6ad6e5..637757144221 100644 ---- a/drivers/net/caif/caif_hsi.c -+++ b/drivers/net/caif/caif_hsi.c -@@ -939,7 +939,7 @@ static void cfhsi_wake_down(struct work_struct *work) - break; - - set_current_state(TASK_INTERRUPTIBLE); -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - retry--; - } - -@@ -1455,7 +1455,7 @@ static void __exit cfhsi_exit_module(void) - rtnl_lock(); - list_for_each_safe(list_node, n, &cfhsi_list) { - cfhsi = list_entry(list_node, struct cfhsi, list); -- unregister_netdev(cfhsi->ndev); -+ unregister_netdevice(cfhsi->ndev); - } - rtnl_unlock(); - } -diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c -index f2fe344593d5..fcec8bcb53d6 100644 ---- a/drivers/net/can/flexcan.c -+++ b/drivers/net/can/flexcan.c -@@ -400,9 +400,10 @@ static void flexcan_enable_wakeup_irq(struct flexcan_priv *priv, bool enable) - priv->write(reg_mcr, ®s->mcr); - } - --static inline void flexcan_enter_stop_mode(struct flexcan_priv *priv) -+static inline int flexcan_enter_stop_mode(struct flexcan_priv *priv) - { - struct flexcan_regs __iomem *regs = priv->regs; -+ unsigned int ackval; - u32 reg_mcr; - - reg_mcr = priv->read(®s->mcr); -@@ -412,20 +413,37 @@ static inline void flexcan_enter_stop_mode(struct flexcan_priv *priv) - /* enable stop request */ - regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr, - 1 << priv->stm.req_bit, 1 << priv->stm.req_bit); -+ -+ /* get stop acknowledgment */ -+ if (regmap_read_poll_timeout(priv->stm.gpr, priv->stm.ack_gpr, -+ ackval, ackval & (1 << priv->stm.ack_bit), -+ 0, FLEXCAN_TIMEOUT_US)) -+ return -ETIMEDOUT; -+ -+ return 0; - } - --static inline void flexcan_exit_stop_mode(struct flexcan_priv *priv) -+static inline int flexcan_exit_stop_mode(struct flexcan_priv *priv) - { - struct flexcan_regs __iomem *regs = priv->regs; -+ unsigned int ackval; - u32 reg_mcr; - - /* remove stop request */ - regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr, - 1 << priv->stm.req_bit, 0); - -+ /* get stop acknowledgment */ -+ if (regmap_read_poll_timeout(priv->stm.gpr, priv->stm.ack_gpr, -+ ackval, !(ackval & (1 << priv->stm.ack_bit)), -+ 0, FLEXCAN_TIMEOUT_US)) -+ return -ETIMEDOUT; -+ - reg_mcr = priv->read(®s->mcr); - reg_mcr &= ~FLEXCAN_MCR_SLF_WAK; - priv->write(reg_mcr, ®s->mcr); -+ -+ return 0; - } - - static inline void flexcan_error_irq_enable(const struct flexcan_priv *priv) -@@ -1437,10 +1455,10 @@ static int flexcan_setup_stop_mode(struct platform_device *pdev) - - priv = netdev_priv(dev); - priv->stm.gpr = syscon_node_to_regmap(gpr_np); -- of_node_put(gpr_np); - if (IS_ERR(priv->stm.gpr)) { - dev_dbg(&pdev->dev, "could not find gpr regmap\n"); -- return PTR_ERR(priv->stm.gpr); -+ ret = PTR_ERR(priv->stm.gpr); -+ goto out_put_node; - } - - priv->stm.req_gpr = out_val[1]; -@@ -1455,7 +1473,9 @@ static int flexcan_setup_stop_mode(struct platform_device *pdev) - - device_set_wakeup_capable(&pdev->dev, true); - -- return 0; -+out_put_node: -+ of_node_put(gpr_np); -+ return ret; - } - - static const struct of_device_id flexcan_of_match[] = { -@@ -1612,7 +1632,9 @@ static int __maybe_unused flexcan_suspend(struct device *device) - */ - if (device_may_wakeup(device)) { - enable_irq_wake(dev->irq); -- flexcan_enter_stop_mode(priv); -+ err = flexcan_enter_stop_mode(priv); -+ if (err) -+ return err; - } else { - err = flexcan_chip_disable(priv); - if (err) -@@ -1662,10 +1684,13 @@ static int __maybe_unused flexcan_noirq_resume(struct device *device) - { - struct net_device *dev = dev_get_drvdata(device); - struct flexcan_priv *priv = netdev_priv(dev); -+ int err; - - if (netif_running(dev) && device_may_wakeup(device)) { - flexcan_enable_wakeup_irq(priv, false); -- flexcan_exit_stop_mode(priv); -+ err = flexcan_exit_stop_mode(priv); -+ if (err) -+ return err; - } - - return 0; -diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c -index 05410008aa6b..de34a4b82d4a 100644 ---- a/drivers/net/can/rcar/rcar_canfd.c -+++ b/drivers/net/can/rcar/rcar_canfd.c -@@ -1508,10 +1508,11 @@ static int rcar_canfd_rx_poll(struct napi_struct *napi, int quota) - - /* All packets processed */ - if (num_pkts < quota) { -- napi_complete_done(napi, num_pkts); -- /* Enable Rx FIFO interrupts */ -- rcar_canfd_set_bit(priv->base, RCANFD_RFCC(ridx), -- RCANFD_RFCC_RFIE); -+ if (napi_complete_done(napi, num_pkts)) { -+ /* Enable Rx FIFO interrupts */ -+ rcar_canfd_set_bit(priv->base, RCANFD_RFCC(ridx), -+ RCANFD_RFCC_RFIE); -+ } - } - return num_pkts; - } -diff --git a/drivers/net/can/usb/peak_usb/pcan_usb.c b/drivers/net/can/usb/peak_usb/pcan_usb.c -index 15ce5ad1d632..7ab56f64a518 100644 ---- a/drivers/net/can/usb/peak_usb/pcan_usb.c -+++ b/drivers/net/can/usb/peak_usb/pcan_usb.c -@@ -242,7 +242,7 @@ static int pcan_usb_write_mode(struct peak_usb_device *dev, u8 onoff) - } else { - /* the PCAN-USB needs time to init */ - set_current_state(TASK_INTERRUPTIBLE); -- schedule_timeout(msecs_to_jiffies(PCAN_USB_STARTUP_TIMEOUT)); -+ schedule_msec_hrtimeout((PCAN_USB_STARTUP_TIMEOUT)); - } - - return err; -diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.c b/drivers/net/can/usb/peak_usb/pcan_usb_core.c -index 458154c9b482..22b9c8e6d040 100644 ---- a/drivers/net/can/usb/peak_usb/pcan_usb_core.c -+++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.c -@@ -568,16 +568,16 @@ static int peak_usb_ndo_stop(struct net_device *netdev) - dev->state &= ~PCAN_USB_STATE_STARTED; - netif_stop_queue(netdev); - -+ close_candev(netdev); -+ -+ dev->can.state = CAN_STATE_STOPPED; -+ - /* unlink all pending urbs and free used memory */ - peak_usb_unlink_all_urbs(dev); - - if (dev->adapter->dev_stop) - dev->adapter->dev_stop(dev); - -- close_candev(netdev); -- -- dev->can.state = CAN_STATE_STOPPED; -- - /* can set bus off now */ - if (dev->adapter->dev_set_bus) { - int err = dev->adapter->dev_set_bus(dev, 0); -diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c -index 063c7a671b41..2e8b1ab2c6f7 100644 ---- a/drivers/net/dsa/mv88e6xxx/chip.c -+++ b/drivers/net/dsa/mv88e6xxx/chip.c -@@ -4711,6 +4711,8 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev) - err = PTR_ERR(chip->reset); - goto out; - } -+ if (chip->reset) -+ usleep_range(1000, 2000); - - err = mv88e6xxx_detect(chip); - if (err) -diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c -index 1c3959efebc4..844e038f3dc6 100644 ---- a/drivers/net/dsa/sja1105/sja1105_main.c -+++ b/drivers/net/dsa/sja1105/sja1105_main.c -@@ -734,15 +734,16 @@ static int sja1105_adjust_port_config(struct sja1105_private *priv, int port, - return sja1105_clocking_setup_port(priv, port); - } - --static void sja1105_adjust_link(struct dsa_switch *ds, int port, -- struct phy_device *phydev) -+static void sja1105_mac_config(struct dsa_switch *ds, int port, -+ unsigned int link_an_mode, -+ const struct phylink_link_state *state) - { - struct sja1105_private *priv = ds->priv; - -- if (!phydev->link) -+ if (!state->link) - sja1105_adjust_port_config(priv, port, 0, false); - else -- sja1105_adjust_port_config(priv, port, phydev->speed, true); -+ sja1105_adjust_port_config(priv, port, state->speed, true); - } - - static void sja1105_phylink_validate(struct dsa_switch *ds, int port, -@@ -1515,9 +1516,9 @@ static int sja1105_set_ageing_time(struct dsa_switch *ds, - static const struct dsa_switch_ops sja1105_switch_ops = { - .get_tag_protocol = sja1105_get_tag_protocol, - .setup = sja1105_setup, -- .adjust_link = sja1105_adjust_link, - .set_ageing_time = sja1105_set_ageing_time, - .phylink_validate = sja1105_phylink_validate, -+ .phylink_mac_config = sja1105_mac_config, - .get_strings = sja1105_get_strings, - .get_ethtool_stats = sja1105_get_ethtool_stats, - .get_sset_count = sja1105_get_sset_count, -diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c -index 008ad0ca89ba..4039a9599d79 100644 ---- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c -+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c -@@ -285,6 +285,9 @@ int bnx2x_tx_int(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata) - hw_cons = le16_to_cpu(*txdata->tx_cons_sb); - sw_cons = txdata->tx_pkt_cons; - -+ /* Ensure subsequent loads occur after hw_cons */ -+ smp_rmb(); -+ - while (sw_cons != hw_cons) { - u16 pkt_cons; - -@@ -1931,8 +1934,7 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb, - } - - /* select a non-FCoE queue */ -- return netdev_pick_tx(dev, skb, NULL) % -- (BNX2X_NUM_ETH_QUEUES(bp) * bp->max_cos); -+ return netdev_pick_tx(dev, skb, NULL) % (BNX2X_NUM_ETH_QUEUES(bp)); - } - - void bnx2x_set_num_queues(struct bnx2x *bp) -@@ -3857,9 +3859,12 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) - - if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) { - if (!(bp->flags & TX_TIMESTAMPING_EN)) { -+ bp->eth_stats.ptp_skip_tx_ts++; - BNX2X_ERR("Tx timestamping was not enabled, this packet will not be timestamped\n"); - } else if (bp->ptp_tx_skb) { -- BNX2X_ERR("The device supports only a single outstanding packet to timestamp, this packet will not be timestamped\n"); -+ bp->eth_stats.ptp_skip_tx_ts++; -+ netdev_err_once(bp->dev, -+ "Device supports only a single outstanding packet to timestamp, this packet won't be timestamped\n"); - } else { - skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; - /* schedule check for Tx timestamp */ -diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c -index 51fc845de31a..4a0ba6801c9e 100644 ---- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c -+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c -@@ -182,7 +182,9 @@ static const struct { - { STATS_OFFSET32(driver_filtered_tx_pkt), - 4, false, "driver_filtered_tx_pkt" }, - { STATS_OFFSET32(eee_tx_lpi), -- 4, true, "Tx LPI entry count"} -+ 4, true, "Tx LPI entry count"}, -+ { STATS_OFFSET32(ptp_skip_tx_ts), -+ 4, false, "ptp_skipped_tx_tstamp" }, - }; - - #define BNX2X_NUM_STATS ARRAY_SIZE(bnx2x_stats_arr) -diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c -index 03ac10b1cd1e..2cc14db8f0ec 100644 ---- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c -+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c -@@ -15214,11 +15214,24 @@ static void bnx2x_ptp_task(struct work_struct *work) - u32 val_seq; - u64 timestamp, ns; - struct skb_shared_hwtstamps shhwtstamps; -+ bool bail = true; -+ int i; -+ -+ /* FW may take a while to complete timestamping; try a bit and if it's -+ * still not complete, may indicate an error state - bail out then. -+ */ -+ for (i = 0; i < 10; i++) { -+ /* Read Tx timestamp registers */ -+ val_seq = REG_RD(bp, port ? NIG_REG_P1_TLLH_PTP_BUF_SEQID : -+ NIG_REG_P0_TLLH_PTP_BUF_SEQID); -+ if (val_seq & 0x10000) { -+ bail = false; -+ break; -+ } -+ msleep(1 << i); -+ } - -- /* Read Tx timestamp registers */ -- val_seq = REG_RD(bp, port ? NIG_REG_P1_TLLH_PTP_BUF_SEQID : -- NIG_REG_P0_TLLH_PTP_BUF_SEQID); -- if (val_seq & 0x10000) { -+ if (!bail) { - /* There is a valid timestamp value */ - timestamp = REG_RD(bp, port ? NIG_REG_P1_TLLH_PTP_BUF_TS_MSB : - NIG_REG_P0_TLLH_PTP_BUF_TS_MSB); -@@ -15233,16 +15246,18 @@ static void bnx2x_ptp_task(struct work_struct *work) - memset(&shhwtstamps, 0, sizeof(shhwtstamps)); - shhwtstamps.hwtstamp = ns_to_ktime(ns); - skb_tstamp_tx(bp->ptp_tx_skb, &shhwtstamps); -- dev_kfree_skb_any(bp->ptp_tx_skb); -- bp->ptp_tx_skb = NULL; - - DP(BNX2X_MSG_PTP, "Tx timestamp, timestamp cycles = %llu, ns = %llu\n", - timestamp, ns); - } else { -- DP(BNX2X_MSG_PTP, "There is no valid Tx timestamp yet\n"); -- /* Reschedule to keep checking for a valid timestamp value */ -- schedule_work(&bp->ptp_task); -+ DP(BNX2X_MSG_PTP, -+ "Tx timestamp is not recorded (register read=%u)\n", -+ val_seq); -+ bp->eth_stats.ptp_skip_tx_ts++; - } -+ -+ dev_kfree_skb_any(bp->ptp_tx_skb); -+ bp->ptp_tx_skb = NULL; - } - - void bnx2x_set_rx_ts(struct bnx2x *bp, struct sk_buff *skb) -diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h -index b2644ed13d06..d55e63692cf3 100644 ---- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h -+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h -@@ -207,6 +207,9 @@ struct bnx2x_eth_stats { - u32 driver_filtered_tx_pkt; - /* src: Clear-on-Read register; Will not survive PMF Migration */ - u32 eee_tx_lpi; -+ -+ /* PTP */ -+ u32 ptp_skip_tx_ts; - }; - - struct bnx2x_eth_q_stats { -diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c -index f758b2e0591f..7afae9d80e75 100644 ---- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c -+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c -@@ -3022,7 +3022,7 @@ static int bnxt_alloc_vnics(struct bnxt *bp) - int num_vnics = 1; - - #ifdef CONFIG_RFS_ACCEL -- if (bp->flags & BNXT_FLAG_RFS) -+ if ((bp->flags & (BNXT_FLAG_RFS | BNXT_FLAG_CHIP_P5)) == BNXT_FLAG_RFS) - num_vnics += bp->rx_nr_rings; - #endif - -@@ -5508,7 +5508,16 @@ static int bnxt_cp_rings_in_use(struct bnxt *bp) - - static int bnxt_get_func_stat_ctxs(struct bnxt *bp) - { -- return bp->cp_nr_rings + bnxt_get_ulp_stat_ctxs(bp); -+ int ulp_stat = bnxt_get_ulp_stat_ctxs(bp); -+ int cp = bp->cp_nr_rings; -+ -+ if (!ulp_stat) -+ return cp; -+ -+ if (bnxt_nq_rings_in_use(bp) > cp + bnxt_get_ulp_msix_num(bp)) -+ return bnxt_get_ulp_msix_base(bp) + ulp_stat; -+ -+ return cp + ulp_stat; - } - - static bool bnxt_need_reserve_rings(struct bnxt *bp) -@@ -7124,6 +7133,9 @@ static int bnxt_alloc_rfs_vnics(struct bnxt *bp) - #ifdef CONFIG_RFS_ACCEL - int i, rc = 0; - -+ if (bp->flags & BNXT_FLAG_CHIP_P5) -+ return 0; -+ - for (i = 0; i < bp->rx_nr_rings; i++) { - struct bnxt_vnic_info *vnic; - u16 vnic_id = i + 1; -@@ -7477,11 +7489,7 @@ unsigned int bnxt_get_avail_cp_rings_for_en(struct bnxt *bp) - - unsigned int bnxt_get_avail_stat_ctxs_for_en(struct bnxt *bp) - { -- unsigned int stat; -- -- stat = bnxt_get_max_func_stat_ctxs(bp) - bnxt_get_ulp_stat_ctxs(bp); -- stat -= bp->cp_nr_rings; -- return stat; -+ return bnxt_get_max_func_stat_ctxs(bp) - bnxt_get_func_stat_ctxs(bp); - } - - int bnxt_get_avail_msix(struct bnxt *bp, int num) -@@ -9587,7 +9595,7 @@ int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs, - return -ENOMEM; - - vnics = 1; -- if (bp->flags & BNXT_FLAG_RFS) -+ if ((bp->flags & (BNXT_FLAG_RFS | BNXT_FLAG_CHIP_P5)) == BNXT_FLAG_RFS) - vnics += rx_rings; - - if (bp->flags & BNXT_FLAG_AGG_RINGS) -@@ -10262,10 +10270,10 @@ static void bnxt_remove_one(struct pci_dev *pdev) - bnxt_dcb_free(bp); - kfree(bp->edev); - bp->edev = NULL; -+ bnxt_cleanup_pci(bp); - bnxt_free_ctx_mem(bp); - kfree(bp->ctx); - bp->ctx = NULL; -- bnxt_cleanup_pci(bp); - bnxt_free_port_stats(bp); - free_netdev(dev); - } -@@ -10859,6 +10867,7 @@ static void bnxt_shutdown(struct pci_dev *pdev) - - if (system_state == SYSTEM_POWER_OFF) { - bnxt_clear_int_mode(bp); -+ pci_disable_device(pdev); - pci_wake_from_d3(pdev, bp->wol); - pci_set_power_state(pdev, PCI_D3hot); - } -diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c -index bfa342a98d08..fc77caf0a076 100644 ---- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c -+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c -@@ -157,8 +157,10 @@ static int bnxt_req_msix_vecs(struct bnxt_en_dev *edev, int ulp_id, - - if (BNXT_NEW_RM(bp)) { - struct bnxt_hw_resc *hw_resc = &bp->hw_resc; -+ int resv_msix; - -- avail_msix = hw_resc->resv_irqs - bp->cp_nr_rings; -+ resv_msix = hw_resc->resv_irqs - bp->cp_nr_rings; -+ avail_msix = min_t(int, resv_msix, avail_msix); - edev->ulp_tbl[ulp_id].msix_requested = avail_msix; - } - bnxt_fill_msix_vecs(bp, ent); -diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c -index 41b50e6570ea..2369b4bd63e3 100644 ---- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c -+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c -@@ -3083,39 +3083,42 @@ static void bcmgenet_timeout(struct net_device *dev) - netif_tx_wake_all_queues(dev); - } - --#define MAX_MC_COUNT 16 -+#define MAX_MDF_FILTER 17 - - static inline void bcmgenet_set_mdf_addr(struct bcmgenet_priv *priv, - unsigned char *addr, -- int *i, -- int *mc) -+ int *i) - { -- u32 reg; -- - bcmgenet_umac_writel(priv, addr[0] << 8 | addr[1], - UMAC_MDF_ADDR + (*i * 4)); - bcmgenet_umac_writel(priv, addr[2] << 24 | addr[3] << 16 | - addr[4] << 8 | addr[5], - UMAC_MDF_ADDR + ((*i + 1) * 4)); -- reg = bcmgenet_umac_readl(priv, UMAC_MDF_CTRL); -- reg |= (1 << (MAX_MC_COUNT - *mc)); -- bcmgenet_umac_writel(priv, reg, UMAC_MDF_CTRL); - *i += 2; -- (*mc)++; - } - - static void bcmgenet_set_rx_mode(struct net_device *dev) - { - struct bcmgenet_priv *priv = netdev_priv(dev); - struct netdev_hw_addr *ha; -- int i, mc; -+ int i, nfilter; - u32 reg; - - netif_dbg(priv, hw, dev, "%s: %08X\n", __func__, dev->flags); - -- /* Promiscuous mode */ -+ /* Number of filters needed */ -+ nfilter = netdev_uc_count(dev) + netdev_mc_count(dev) + 2; -+ -+ /* -+ * Turn on promicuous mode for three scenarios -+ * 1. IFF_PROMISC flag is set -+ * 2. IFF_ALLMULTI flag is set -+ * 3. The number of filters needed exceeds the number filters -+ * supported by the hardware. -+ */ - reg = bcmgenet_umac_readl(priv, UMAC_CMD); -- if (dev->flags & IFF_PROMISC) { -+ if ((dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) || -+ (nfilter > MAX_MDF_FILTER)) { - reg |= CMD_PROMISC; - bcmgenet_umac_writel(priv, reg, UMAC_CMD); - bcmgenet_umac_writel(priv, 0, UMAC_MDF_CTRL); -@@ -3125,32 +3128,24 @@ static void bcmgenet_set_rx_mode(struct net_device *dev) - bcmgenet_umac_writel(priv, reg, UMAC_CMD); - } - -- /* UniMac doesn't support ALLMULTI */ -- if (dev->flags & IFF_ALLMULTI) { -- netdev_warn(dev, "ALLMULTI is not supported\n"); -- return; -- } -- - /* update MDF filter */ - i = 0; -- mc = 0; - /* Broadcast */ -- bcmgenet_set_mdf_addr(priv, dev->broadcast, &i, &mc); -+ bcmgenet_set_mdf_addr(priv, dev->broadcast, &i); - /* my own address.*/ -- bcmgenet_set_mdf_addr(priv, dev->dev_addr, &i, &mc); -- /* Unicast list*/ -- if (netdev_uc_count(dev) > (MAX_MC_COUNT - mc)) -- return; -+ bcmgenet_set_mdf_addr(priv, dev->dev_addr, &i); - -- if (!netdev_uc_empty(dev)) -- netdev_for_each_uc_addr(ha, dev) -- bcmgenet_set_mdf_addr(priv, ha->addr, &i, &mc); -- /* Multicast */ -- if (netdev_mc_empty(dev) || netdev_mc_count(dev) >= (MAX_MC_COUNT - mc)) -- return; -+ /* Unicast */ -+ netdev_for_each_uc_addr(ha, dev) -+ bcmgenet_set_mdf_addr(priv, ha->addr, &i); - -+ /* Multicast */ - netdev_for_each_mc_addr(ha, dev) -- bcmgenet_set_mdf_addr(priv, ha->addr, &i, &mc); -+ bcmgenet_set_mdf_addr(priv, ha->addr, &i); -+ -+ /* Enable filters */ -+ reg = GENMASK(MAX_MDF_FILTER - 1, MAX_MDF_FILTER - nfilter); -+ bcmgenet_umac_writel(priv, reg, UMAC_MDF_CTRL); - } - - /* Set the hardware MAC address. */ -diff --git a/drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c b/drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c -index a76529a7662d..c2e92786608b 100644 ---- a/drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c -+++ b/drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c -@@ -1054,14 +1054,12 @@ static void cudbg_t4_fwcache(struct cudbg_init *pdbg_init, - } - } - --static int cudbg_collect_mem_region(struct cudbg_init *pdbg_init, -- struct cudbg_buffer *dbg_buff, -- struct cudbg_error *cudbg_err, -- u8 mem_type) -+static unsigned long cudbg_mem_region_size(struct cudbg_init *pdbg_init, -+ struct cudbg_error *cudbg_err, -+ u8 mem_type) - { - struct adapter *padap = pdbg_init->adap; - struct cudbg_meminfo mem_info; -- unsigned long size; - u8 mc_idx; - int rc; - -@@ -1075,7 +1073,16 @@ static int cudbg_collect_mem_region(struct cudbg_init *pdbg_init, - if (rc) - return rc; - -- size = mem_info.avail[mc_idx].limit - mem_info.avail[mc_idx].base; -+ return mem_info.avail[mc_idx].limit - mem_info.avail[mc_idx].base; -+} -+ -+static int cudbg_collect_mem_region(struct cudbg_init *pdbg_init, -+ struct cudbg_buffer *dbg_buff, -+ struct cudbg_error *cudbg_err, -+ u8 mem_type) -+{ -+ unsigned long size = cudbg_mem_region_size(pdbg_init, cudbg_err, mem_type); -+ - return cudbg_read_fw_mem(pdbg_init, dbg_buff, mem_type, size, - cudbg_err); - } -diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c -index 82015c8a5ed7..b7a246b33599 100644 ---- a/drivers/net/ethernet/emulex/benet/be_main.c -+++ b/drivers/net/ethernet/emulex/benet/be_main.c -@@ -4697,8 +4697,12 @@ int be_update_queues(struct be_adapter *adapter) - struct net_device *netdev = adapter->netdev; - int status; - -- if (netif_running(netdev)) -+ if (netif_running(netdev)) { -+ /* device cannot transmit now, avoid dev_watchdog timeouts */ -+ netif_carrier_off(netdev); -+ - be_close(netdev); -+ } - - be_cancel_worker(adapter); - -diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c -index 38f10f7dcbc3..831bb709e783 100644 ---- a/drivers/net/ethernet/freescale/fec_main.c -+++ b/drivers/net/ethernet/freescale/fec_main.c -@@ -1689,10 +1689,10 @@ static void fec_get_mac(struct net_device *ndev) - */ - if (!is_valid_ether_addr(iap)) { - /* Report it and use a random ethernet address instead */ -- netdev_err(ndev, "Invalid MAC address: %pM\n", iap); -+ dev_err(&fep->pdev->dev, "Invalid MAC address: %pM\n", iap); - eth_hw_addr_random(ndev); -- netdev_info(ndev, "Using random MAC address: %pM\n", -- ndev->dev_addr); -+ dev_info(&fep->pdev->dev, "Using random MAC address: %pM\n", -+ ndev->dev_addr); - return; - } - -diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c -index fa8b8506b120..738e01393b68 100644 ---- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c -+++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c -@@ -251,6 +251,7 @@ void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo) - - ae_algo->ops->uninit_ae_dev(ae_dev); - hnae3_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0); -+ ae_dev->ops = NULL; - } - - list_del(&ae_algo->node); -@@ -351,6 +352,7 @@ void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev) - - ae_algo->ops->uninit_ae_dev(ae_dev); - hnae3_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0); -+ ae_dev->ops = NULL; - } - - list_del(&ae_dev->node); -diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c -index f326805543a4..66b691b7221f 100644 ---- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c -+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c -@@ -4,6 +4,9 @@ - #include - #include - #include -+#ifdef CONFIG_RFS_ACCEL -+#include -+#endif - #include - #include - #include -@@ -24,8 +27,7 @@ - #define hns3_set_field(origin, shift, val) ((origin) |= ((val) << (shift))) - #define hns3_tx_bd_count(S) DIV_ROUND_UP(S, HNS3_MAX_BD_SIZE) - --static void hns3_clear_all_ring(struct hnae3_handle *h); --static void hns3_force_clear_all_rx_ring(struct hnae3_handle *h); -+static void hns3_clear_all_ring(struct hnae3_handle *h, bool force); - static void hns3_remove_hw_addr(struct net_device *netdev); - - static const char hns3_driver_name[] = "hns3"; -@@ -79,23 +81,6 @@ static irqreturn_t hns3_irq_handle(int irq, void *vector) - return IRQ_HANDLED; - } - --/* This callback function is used to set affinity changes to the irq affinity -- * masks when the irq_set_affinity_notifier function is used. -- */ --static void hns3_nic_irq_affinity_notify(struct irq_affinity_notify *notify, -- const cpumask_t *mask) --{ -- struct hns3_enet_tqp_vector *tqp_vectors = -- container_of(notify, struct hns3_enet_tqp_vector, -- affinity_notify); -- -- tqp_vectors->affinity_mask = *mask; --} -- --static void hns3_nic_irq_affinity_release(struct kref *ref) --{ --} -- - static void hns3_nic_uninit_irq(struct hns3_nic_priv *priv) - { - struct hns3_enet_tqp_vector *tqp_vectors; -@@ -107,8 +92,7 @@ static void hns3_nic_uninit_irq(struct hns3_nic_priv *priv) - if (tqp_vectors->irq_init_flag != HNS3_VECTOR_INITED) - continue; - -- /* clear the affinity notifier and affinity mask */ -- irq_set_affinity_notifier(tqp_vectors->vector_irq, NULL); -+ /* clear the affinity mask */ - irq_set_affinity_hint(tqp_vectors->vector_irq, NULL); - - /* release the irq resource */ -@@ -161,12 +145,6 @@ static int hns3_nic_init_irq(struct hns3_nic_priv *priv) - return ret; - } - -- tqp_vectors->affinity_notify.notify = -- hns3_nic_irq_affinity_notify; -- tqp_vectors->affinity_notify.release = -- hns3_nic_irq_affinity_release; -- irq_set_affinity_notifier(tqp_vectors->vector_irq, -- &tqp_vectors->affinity_notify); - irq_set_affinity_hint(tqp_vectors->vector_irq, - &tqp_vectors->affinity_mask); - -@@ -340,6 +318,40 @@ static void hns3_tqp_disable(struct hnae3_queue *tqp) - hns3_write_dev(tqp, HNS3_RING_EN_REG, rcb_reg); - } - -+static void hns3_free_rx_cpu_rmap(struct net_device *netdev) -+{ -+#ifdef CONFIG_RFS_ACCEL -+ free_irq_cpu_rmap(netdev->rx_cpu_rmap); -+ netdev->rx_cpu_rmap = NULL; -+#endif -+} -+ -+static int hns3_set_rx_cpu_rmap(struct net_device *netdev) -+{ -+#ifdef CONFIG_RFS_ACCEL -+ struct hns3_nic_priv *priv = netdev_priv(netdev); -+ struct hns3_enet_tqp_vector *tqp_vector; -+ int i, ret; -+ -+ if (!netdev->rx_cpu_rmap) { -+ netdev->rx_cpu_rmap = alloc_irq_cpu_rmap(priv->vector_num); -+ if (!netdev->rx_cpu_rmap) -+ return -ENOMEM; -+ } -+ -+ for (i = 0; i < priv->vector_num; i++) { -+ tqp_vector = &priv->tqp_vector[i]; -+ ret = irq_cpu_rmap_add(netdev->rx_cpu_rmap, -+ tqp_vector->vector_irq); -+ if (ret) { -+ hns3_free_rx_cpu_rmap(netdev); -+ return ret; -+ } -+ } -+#endif -+ return 0; -+} -+ - static int hns3_nic_net_up(struct net_device *netdev) - { - struct hns3_nic_priv *priv = netdev_priv(netdev); -@@ -351,11 +363,16 @@ static int hns3_nic_net_up(struct net_device *netdev) - if (ret) - return ret; - -+ /* the device can work without cpu rmap, only aRFS needs it */ -+ ret = hns3_set_rx_cpu_rmap(netdev); -+ if (ret) -+ netdev_warn(netdev, "set rx cpu rmap fail, ret=%d!\n", ret); -+ - /* get irq resource for all vectors */ - ret = hns3_nic_init_irq(priv); - if (ret) { - netdev_err(netdev, "hns init irq failed! ret=%d\n", ret); -- return ret; -+ goto free_rmap; - } - - clear_bit(HNS3_NIC_STATE_DOWN, &priv->state); -@@ -384,7 +401,8 @@ static int hns3_nic_net_up(struct net_device *netdev) - hns3_vector_disable(&priv->tqp_vector[j]); - - hns3_nic_uninit_irq(priv); -- -+free_rmap: -+ hns3_free_rx_cpu_rmap(netdev); - return ret; - } - -@@ -447,6 +465,20 @@ static int hns3_nic_net_open(struct net_device *netdev) - return 0; - } - -+static void hns3_reset_tx_queue(struct hnae3_handle *h) -+{ -+ struct net_device *ndev = h->kinfo.netdev; -+ struct hns3_nic_priv *priv = netdev_priv(ndev); -+ struct netdev_queue *dev_queue; -+ u32 i; -+ -+ for (i = 0; i < h->kinfo.num_tqps; i++) { -+ dev_queue = netdev_get_tx_queue(ndev, -+ priv->ring_data[i].queue_index); -+ netdev_tx_reset_queue(dev_queue); -+ } -+} -+ - static void hns3_nic_net_down(struct net_device *netdev) - { - struct hns3_nic_priv *priv = netdev_priv(netdev); -@@ -467,10 +499,19 @@ static void hns3_nic_net_down(struct net_device *netdev) - if (ops->stop) - ops->stop(priv->ae_handle); - -+ hns3_free_rx_cpu_rmap(netdev); -+ - /* free irq resources */ - hns3_nic_uninit_irq(priv); - -- hns3_clear_all_ring(priv->ae_handle); -+ /* delay ring buffer clearing to hns3_reset_notify_uninit_enet -+ * during reset process, because driver may not be able -+ * to disable the ring through firmware when downing the netdev. -+ */ -+ if (!hns3_nic_resetting(netdev)) -+ hns3_clear_all_ring(priv->ae_handle, false); -+ -+ hns3_reset_tx_queue(priv->ae_handle); - } - - static int hns3_nic_net_stop(struct net_device *netdev) -@@ -1493,12 +1534,12 @@ static void hns3_nic_get_stats64(struct net_device *netdev, - static int hns3_setup_tc(struct net_device *netdev, void *type_data) - { - struct tc_mqprio_qopt_offload *mqprio_qopt = type_data; -- struct hnae3_handle *h = hns3_get_handle(netdev); -- struct hnae3_knic_private_info *kinfo = &h->kinfo; - u8 *prio_tc = mqprio_qopt->qopt.prio_tc_map; -+ struct hnae3_knic_private_info *kinfo; - u8 tc = mqprio_qopt->qopt.num_tc; - u16 mode = mqprio_qopt->mode; - u8 hw = mqprio_qopt->qopt.hw; -+ struct hnae3_handle *h; - - if (!((hw == TC_MQPRIO_HW_OFFLOAD_TCS && - mode == TC_MQPRIO_MODE_CHANNEL) || (!hw && tc == 0))) -@@ -1510,6 +1551,9 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data) - if (!netdev) - return -EINVAL; - -+ h = hns3_get_handle(netdev); -+ kinfo = &h->kinfo; -+ - return (kinfo->dcb_ops && kinfo->dcb_ops->setup_tc) ? - kinfo->dcb_ops->setup_tc(h, tc, prio_tc) : -EOPNOTSUPP; - } -@@ -1895,9 +1939,9 @@ static pci_ers_result_t hns3_error_detected(struct pci_dev *pdev, - if (state == pci_channel_io_perm_failure) - return PCI_ERS_RESULT_DISCONNECT; - -- if (!ae_dev) { -+ if (!ae_dev || !ae_dev->ops) { - dev_err(&pdev->dev, -- "Can't recover - error happened during device init\n"); -+ "Can't recover - error happened before device initialized\n"); - return PCI_ERS_RESULT_NONE; - } - -@@ -1916,6 +1960,9 @@ static pci_ers_result_t hns3_slot_reset(struct pci_dev *pdev) - - dev_info(dev, "requesting reset due to PCI error\n"); - -+ if (!ae_dev || !ae_dev->ops) -+ return PCI_ERS_RESULT_NONE; -+ - /* request the reset */ - if (ae_dev->ops->reset_event) { - if (!ae_dev->override_pci_need_reset) -@@ -3331,8 +3378,6 @@ static void hns3_nic_uninit_vector_data(struct hns3_nic_priv *priv) - hns3_free_vector_ring_chain(tqp_vector, &vector_ring_chain); - - if (tqp_vector->irq_init_flag == HNS3_VECTOR_INITED) { -- irq_set_affinity_notifier(tqp_vector->vector_irq, -- NULL); - irq_set_affinity_hint(tqp_vector->vector_irq, NULL); - free_irq(tqp_vector->vector_irq, tqp_vector); - tqp_vector->irq_init_flag = HNS3_VECTOR_NOT_INITED; -@@ -3858,7 +3903,7 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset) - - hns3_del_all_fd_rules(netdev, true); - -- hns3_force_clear_all_rx_ring(handle); -+ hns3_clear_all_ring(handle, true); - - hns3_uninit_phy(netdev); - -@@ -4030,40 +4075,26 @@ static void hns3_force_clear_rx_ring(struct hns3_enet_ring *ring) - } - } - --static void hns3_force_clear_all_rx_ring(struct hnae3_handle *h) --{ -- struct net_device *ndev = h->kinfo.netdev; -- struct hns3_nic_priv *priv = netdev_priv(ndev); -- struct hns3_enet_ring *ring; -- u32 i; -- -- for (i = 0; i < h->kinfo.num_tqps; i++) { -- ring = priv->ring_data[i + h->kinfo.num_tqps].ring; -- hns3_force_clear_rx_ring(ring); -- } --} -- --static void hns3_clear_all_ring(struct hnae3_handle *h) -+static void hns3_clear_all_ring(struct hnae3_handle *h, bool force) - { - struct net_device *ndev = h->kinfo.netdev; - struct hns3_nic_priv *priv = netdev_priv(ndev); - u32 i; - - for (i = 0; i < h->kinfo.num_tqps; i++) { -- struct netdev_queue *dev_queue; - struct hns3_enet_ring *ring; - - ring = priv->ring_data[i].ring; - hns3_clear_tx_ring(ring); -- dev_queue = netdev_get_tx_queue(ndev, -- priv->ring_data[i].queue_index); -- netdev_tx_reset_queue(dev_queue); - - ring = priv->ring_data[i + h->kinfo.num_tqps].ring; - /* Continue to clear other rings even if clearing some - * rings failed. - */ -- hns3_clear_rx_ring(ring); -+ if (force) -+ hns3_force_clear_rx_ring(ring); -+ else -+ hns3_clear_rx_ring(ring); - } - } - -@@ -4272,7 +4303,8 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle) - return 0; - } - -- hns3_force_clear_all_rx_ring(handle); -+ hns3_clear_all_ring(handle, true); -+ hns3_reset_tx_queue(priv->ae_handle); - - hns3_nic_uninit_vector_data(priv); - -diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c -index d1588ea6132c..24fce343e7fc 100644 ---- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c -+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c -@@ -243,11 +243,13 @@ static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode) - - skb_get(skb); - tx_ret = hns3_nic_net_xmit(skb, ndev); -- if (tx_ret == NETDEV_TX_OK) -+ if (tx_ret == NETDEV_TX_OK) { - good_cnt++; -- else -+ } else { -+ kfree_skb(skb); - netdev_err(ndev, "hns3_lb_run_test xmit failed: %d\n", - tx_ret); -+ } - } - if (good_cnt != HNS3_NIC_LB_TEST_PKT_NUM) { - ret_val = HNS3_NIC_LB_TEST_TX_CNT_ERR; -diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c -index d3b1f8cb1155..f2bffc05e902 100644 ---- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c -+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c -@@ -552,8 +552,7 @@ static u8 *hclge_comm_get_strings(u32 stringset, - return buff; - - for (i = 0; i < size; i++) { -- snprintf(buff, ETH_GSTRING_LEN, -- strs[i].desc); -+ snprintf(buff, ETH_GSTRING_LEN, "%s", strs[i].desc); - buff = buff + ETH_GSTRING_LEN; - } - -@@ -1058,6 +1057,7 @@ static void hclge_parse_copper_link_mode(struct hclge_dev *hdev, - linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, supported); - linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, supported); - linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, supported); -+ linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, supported); - } - - static void hclge_parse_link_mode(struct hclge_dev *hdev, u8 speed_ability) -@@ -2389,6 +2389,15 @@ static int hclge_mac_init(struct hclge_dev *hdev) - return ret; - } - -+ if (hdev->hw.mac.support_autoneg) { -+ ret = hclge_set_autoneg_en(hdev, hdev->hw.mac.autoneg); -+ if (ret) { -+ dev_err(&hdev->pdev->dev, -+ "Config mac autoneg fail ret=%d\n", ret); -+ return ret; -+ } -+ } -+ - mac->link = 0; - - if (mac->user_fec_mode & BIT(HNAE3_FEC_USER_DEF)) { -@@ -2508,6 +2517,9 @@ static void hclge_update_link_status(struct hclge_dev *hdev) - - static void hclge_update_port_capability(struct hclge_mac *mac) - { -+ /* update fec ability by speed */ -+ hclge_convert_setting_fec(mac); -+ - /* firmware can not identify back plane type, the media type - * read from configuration can help deal it - */ -@@ -2580,6 +2592,11 @@ static int hclge_get_sfp_info(struct hclge_dev *hdev, struct hclge_mac *mac) - mac->speed_ability = le32_to_cpu(resp->speed_ability); - mac->autoneg = resp->autoneg; - mac->support_autoneg = resp->autoneg_ability; -+ mac->speed_type = QUERY_ACTIVE_SPEED; -+ if (!resp->active_fec) -+ mac->fec_mode = 0; -+ else -+ mac->fec_mode = BIT(resp->active_fec); - } else { - mac->speed_type = QUERY_SFP_SPEED; - } -diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c -index 1e8134892d77..32d6a59b731a 100644 ---- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c -+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c -@@ -224,6 +224,13 @@ int hclge_mac_connect_phy(struct hnae3_handle *handle) - linkmode_and(phydev->supported, phydev->supported, mask); - linkmode_copy(phydev->advertising, phydev->supported); - -+ /* supported flag is Pause and Asym Pause, but default advertising -+ * should be rx on, tx on, so need clear Asym Pause in advertising -+ * flag -+ */ -+ linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, -+ phydev->advertising); -+ - return 0; - } - -diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c -index a7bbb6d3091a..0d53062f7bb5 100644 ---- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c -+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c -@@ -54,7 +54,8 @@ static int hclge_shaper_para_calc(u32 ir, u8 shaper_level, - u32 tick; - - /* Calc tick */ -- if (shaper_level >= HCLGE_SHAPER_LVL_CNT) -+ if (shaper_level >= HCLGE_SHAPER_LVL_CNT || -+ ir > HCLGE_ETHER_MAX_RATE) - return -EINVAL; - - tick = tick_array[shaper_level]; -@@ -1124,6 +1125,9 @@ static int hclge_tm_schd_mode_vnet_base_cfg(struct hclge_vport *vport) - int ret; - u8 i; - -+ if (vport->vport_id >= HNAE3_MAX_TC) -+ return -EINVAL; -+ - ret = hclge_tm_pri_schd_mode_cfg(hdev, vport->vport_id); - if (ret) - return ret; -diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c -index 5d53467ee2d2..3b02745605d4 100644 ---- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c -+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c -@@ -2512,6 +2512,12 @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev) - return ret; - } - -+ if (pdev->revision >= 0x21) { -+ ret = hclgevf_set_promisc_mode(hdev, true); -+ if (ret) -+ return ret; -+ } -+ - dev_info(&hdev->pdev->dev, "Reset done\n"); - - return 0; -@@ -2591,9 +2597,11 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) - * firmware makes sure broadcast packets can be accepted. - * For revision 0x21, default to enable broadcast promisc mode. - */ -- ret = hclgevf_set_promisc_mode(hdev, true); -- if (ret) -- goto err_config; -+ if (pdev->revision >= 0x21) { -+ ret = hclgevf_set_promisc_mode(hdev, true); -+ if (ret) -+ goto err_config; -+ } - - /* Initialize RSS for this VF */ - ret = hclgevf_rss_init_hw(hdev); -diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c -index 0e09bede42a2..b081a1ef6859 100644 ---- a/drivers/net/ethernet/intel/e1000e/netdev.c -+++ b/drivers/net/ethernet/intel/e1000e/netdev.c -@@ -4208,7 +4208,7 @@ void e1000e_up(struct e1000_adapter *adapter) - e1000_configure_msix(adapter); - e1000_irq_enable(adapter); - -- netif_start_queue(adapter->netdev); -+ /* Tx queue started by watchdog timer when link is up */ - - e1000e_trigger_lsc(adapter); - } -@@ -4606,6 +4606,7 @@ int e1000e_open(struct net_device *netdev) - pm_runtime_get_sync(&pdev->dev); - - netif_carrier_off(netdev); -+ netif_stop_queue(netdev); - - /* allocate transmit descriptors */ - err = e1000e_setup_tx_resources(adapter->tx_ring); -@@ -4666,7 +4667,6 @@ int e1000e_open(struct net_device *netdev) - e1000_irq_enable(adapter); - - adapter->tx_hang_recheck = false; -- netif_start_queue(netdev); - - hw->mac.get_link_status = true; - pm_runtime_put(&pdev->dev); -@@ -5288,6 +5288,7 @@ static void e1000_watchdog_task(struct work_struct *work) - if (phy->ops.cfg_on_link_up) - phy->ops.cfg_on_link_up(hw); - -+ netif_wake_queue(netdev); - netif_carrier_on(netdev); - - if (!test_bit(__E1000_DOWN, &adapter->state)) -@@ -5301,6 +5302,7 @@ static void e1000_watchdog_task(struct work_struct *work) - /* Link status message must follow this format */ - pr_info("%s NIC Link is Down\n", adapter->netdev->name); - netif_carrier_off(netdev); -+ netif_stop_queue(netdev); - if (!test_bit(__E1000_DOWN, &adapter->state)) - mod_timer(&adapter->phy_info_timer, - round_jiffies(jiffies + 2 * HZ)); -@@ -5308,13 +5310,8 @@ static void e1000_watchdog_task(struct work_struct *work) - /* 8000ES2LAN requires a Rx packet buffer work-around - * on link down event; reset the controller to flush - * the Rx packet buffer. -- * -- * If the link is lost the controller stops DMA, but -- * if there is queued Tx work it cannot be done. So -- * reset the controller to flush the Tx packet buffers. - */ -- if ((adapter->flags & FLAG_RX_NEEDS_RESTART) || -- e1000_desc_unused(tx_ring) + 1 < tx_ring->count) -+ if (adapter->flags & FLAG_RX_NEEDS_RESTART) - adapter->flags |= FLAG_RESTART_NOW; - else - pm_schedule_suspend(netdev->dev.parent, -@@ -5337,6 +5334,14 @@ static void e1000_watchdog_task(struct work_struct *work) - adapter->gotc_old = adapter->stats.gotc; - spin_unlock(&adapter->stats64_lock); - -+ /* If the link is lost the controller stops DMA, but -+ * if there is queued Tx work it cannot be done. So -+ * reset the controller to flush the Tx packet buffers. -+ */ -+ if (!netif_carrier_ok(netdev) && -+ (e1000_desc_unused(tx_ring) + 1 < tx_ring->count)) -+ adapter->flags |= FLAG_RESTART_NOW; -+ - /* If reset is necessary, do it outside of interrupt context. */ - if (adapter->flags & FLAG_RESTART_NOW) { - schedule_work(&adapter->reset_task); -diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.c b/drivers/net/ethernet/intel/iavf/iavf_txrx.c -index 06d1509d57f7..26422bc9ca8c 100644 ---- a/drivers/net/ethernet/intel/iavf/iavf_txrx.c -+++ b/drivers/net/ethernet/intel/iavf/iavf_txrx.c -@@ -1236,6 +1236,9 @@ static void iavf_add_rx_frag(struct iavf_ring *rx_ring, - unsigned int truesize = SKB_DATA_ALIGN(size + iavf_rx_offset(rx_ring)); - #endif - -+ if (!size) -+ return; -+ - skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_buffer->page, - rx_buffer->page_offset, size, truesize); - -@@ -1260,6 +1263,9 @@ static struct iavf_rx_buffer *iavf_get_rx_buffer(struct iavf_ring *rx_ring, - { - struct iavf_rx_buffer *rx_buffer; - -+ if (!size) -+ return NULL; -+ - rx_buffer = &rx_ring->rx_bi[rx_ring->next_to_clean]; - prefetchw(rx_buffer->page); - -@@ -1290,7 +1296,7 @@ static struct sk_buff *iavf_construct_skb(struct iavf_ring *rx_ring, - struct iavf_rx_buffer *rx_buffer, - unsigned int size) - { -- void *va = page_address(rx_buffer->page) + rx_buffer->page_offset; -+ void *va; - #if (PAGE_SIZE < 8192) - unsigned int truesize = iavf_rx_pg_size(rx_ring) / 2; - #else -@@ -1299,7 +1305,10 @@ static struct sk_buff *iavf_construct_skb(struct iavf_ring *rx_ring, - unsigned int headlen; - struct sk_buff *skb; - -+ if (!rx_buffer) -+ return NULL; - /* prefetch first cache line of first page */ -+ va = page_address(rx_buffer->page) + rx_buffer->page_offset; - prefetch(va); - #if L1_CACHE_BYTES < 128 - prefetch(va + L1_CACHE_BYTES); -@@ -1354,7 +1363,7 @@ static struct sk_buff *iavf_build_skb(struct iavf_ring *rx_ring, - struct iavf_rx_buffer *rx_buffer, - unsigned int size) - { -- void *va = page_address(rx_buffer->page) + rx_buffer->page_offset; -+ void *va; - #if (PAGE_SIZE < 8192) - unsigned int truesize = iavf_rx_pg_size(rx_ring) / 2; - #else -@@ -1363,7 +1372,10 @@ static struct sk_buff *iavf_build_skb(struct iavf_ring *rx_ring, - #endif - struct sk_buff *skb; - -+ if (!rx_buffer) -+ return NULL; - /* prefetch first cache line of first page */ -+ va = page_address(rx_buffer->page) + rx_buffer->page_offset; - prefetch(va); - #if L1_CACHE_BYTES < 128 - prefetch(va + L1_CACHE_BYTES); -@@ -1398,6 +1410,9 @@ static struct sk_buff *iavf_build_skb(struct iavf_ring *rx_ring, - static void iavf_put_rx_buffer(struct iavf_ring *rx_ring, - struct iavf_rx_buffer *rx_buffer) - { -+ if (!rx_buffer) -+ return; -+ - if (iavf_can_reuse_rx_page(rx_buffer)) { - /* hand second half of page back to the ring */ - iavf_reuse_rx_page(rx_ring, rx_buffer); -@@ -1496,11 +1511,12 @@ static int iavf_clean_rx_irq(struct iavf_ring *rx_ring, int budget) - * verified the descriptor has been written back. - */ - dma_rmb(); -+#define IAVF_RXD_DD BIT(IAVF_RX_DESC_STATUS_DD_SHIFT) -+ if (!iavf_test_staterr(rx_desc, IAVF_RXD_DD)) -+ break; - - size = (qword & IAVF_RXD_QW1_LENGTH_PBUF_MASK) >> - IAVF_RXD_QW1_LENGTH_PBUF_SHIFT; -- if (!size) -- break; - - iavf_trace(clean_rx_irq, rx_ring, rx_desc, skb); - rx_buffer = iavf_get_rx_buffer(rx_ring, size); -@@ -1516,7 +1532,8 @@ static int iavf_clean_rx_irq(struct iavf_ring *rx_ring, int budget) - /* exit if we failed to retrieve a buffer */ - if (!skb) { - rx_ring->rx_stats.alloc_buff_failed++; -- rx_buffer->pagecnt_bias++; -+ if (rx_buffer) -+ rx_buffer->pagecnt_bias++; - break; - } - -diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h -index 792e6e42030e..754c7080c3fc 100644 ---- a/drivers/net/ethernet/intel/ice/ice.h -+++ b/drivers/net/ethernet/intel/ice/ice.h -@@ -451,7 +451,6 @@ int ice_set_rss(struct ice_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size); - int ice_get_rss(struct ice_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size); - void ice_fill_rss_lut(u8 *lut, u16 rss_table_size, u16 rss_size); - void ice_print_link_msg(struct ice_vsi *vsi, bool isup); --void ice_napi_del(struct ice_vsi *vsi); - #ifdef CONFIG_DCB - int ice_pf_ena_all_vsi(struct ice_pf *pf, bool locked); - void ice_pf_dis_all_vsi(struct ice_pf *pf, bool locked); -diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c -index fbf1eba0cc2a..f14fa51cc704 100644 ---- a/drivers/net/ethernet/intel/ice/ice_lib.c -+++ b/drivers/net/ethernet/intel/ice/ice_lib.c -@@ -2754,19 +2754,14 @@ int ice_vsi_release(struct ice_vsi *vsi) - - if (vsi->type == ICE_VSI_VF) - vf = &pf->vf[vsi->vf_id]; -- /* do not unregister and free netdevs while driver is in the reset -- * recovery pending state. Since reset/rebuild happens through PF -- * service task workqueue, its not a good idea to unregister netdev -- * that is associated to the PF that is running the work queue items -- * currently. This is done to avoid check_flush_dependency() warning -- * on this wq -+ /* do not unregister while driver is in the reset recovery pending -+ * state. Since reset/rebuild happens through PF service task workqueue, -+ * it's not a good idea to unregister netdev that is associated to the -+ * PF that is running the work queue items currently. This is done to -+ * avoid check_flush_dependency() warning on this wq - */ -- if (vsi->netdev && !ice_is_reset_in_progress(pf->state)) { -- ice_napi_del(vsi); -+ if (vsi->netdev && !ice_is_reset_in_progress(pf->state)) - unregister_netdev(vsi->netdev); -- free_netdev(vsi->netdev); -- vsi->netdev = NULL; -- } - - if (test_bit(ICE_FLAG_RSS_ENA, pf->flags)) - ice_rss_clean(vsi); -@@ -2799,6 +2794,13 @@ int ice_vsi_release(struct ice_vsi *vsi) - ice_rm_vsi_lan_cfg(vsi->port_info, vsi->idx); - ice_vsi_delete(vsi); - ice_vsi_free_q_vectors(vsi); -+ -+ /* make sure unregister_netdev() was called by checking __ICE_DOWN */ -+ if (vsi->netdev && test_bit(__ICE_DOWN, vsi->state)) { -+ free_netdev(vsi->netdev); -+ vsi->netdev = NULL; -+ } -+ - ice_vsi_clear_rings(vsi); - - ice_vsi_put_qs(vsi); -diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c -index 7843abf4d44d..1c803106e301 100644 ---- a/drivers/net/ethernet/intel/ice/ice_main.c -+++ b/drivers/net/ethernet/intel/ice/ice_main.c -@@ -1161,16 +1161,16 @@ static void ice_handle_mdd_event(struct ice_pf *pf) - } - } - -- /* see if one of the VFs needs to be reset */ -- for (i = 0; i < pf->num_alloc_vfs && mdd_detected; i++) { -+ /* check to see if one of the VFs caused the MDD */ -+ for (i = 0; i < pf->num_alloc_vfs; i++) { - struct ice_vf *vf = &pf->vf[i]; - -- mdd_detected = false; -+ bool vf_mdd_detected = false; - - reg = rd32(hw, VP_MDET_TX_PQM(i)); - if (reg & VP_MDET_TX_PQM_VALID_M) { - wr32(hw, VP_MDET_TX_PQM(i), 0xFFFF); -- mdd_detected = true; -+ vf_mdd_detected = true; - dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n", - i); - } -@@ -1178,7 +1178,7 @@ static void ice_handle_mdd_event(struct ice_pf *pf) - reg = rd32(hw, VP_MDET_TX_TCLAN(i)); - if (reg & VP_MDET_TX_TCLAN_VALID_M) { - wr32(hw, VP_MDET_TX_TCLAN(i), 0xFFFF); -- mdd_detected = true; -+ vf_mdd_detected = true; - dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n", - i); - } -@@ -1186,7 +1186,7 @@ static void ice_handle_mdd_event(struct ice_pf *pf) - reg = rd32(hw, VP_MDET_TX_TDPU(i)); - if (reg & VP_MDET_TX_TDPU_VALID_M) { - wr32(hw, VP_MDET_TX_TDPU(i), 0xFFFF); -- mdd_detected = true; -+ vf_mdd_detected = true; - dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n", - i); - } -@@ -1194,19 +1194,18 @@ static void ice_handle_mdd_event(struct ice_pf *pf) - reg = rd32(hw, VP_MDET_RX(i)); - if (reg & VP_MDET_RX_VALID_M) { - wr32(hw, VP_MDET_RX(i), 0xFFFF); -- mdd_detected = true; -+ vf_mdd_detected = true; - dev_info(&pf->pdev->dev, "RX driver issue detected on VF %d\n", - i); - } - -- if (mdd_detected) { -+ if (vf_mdd_detected) { - vf->num_mdd_events++; -- dev_info(&pf->pdev->dev, -- "Use PF Control I/F to re-enable the VF\n"); -- set_bit(ICE_VF_STATE_DIS, vf->vf_states); -+ if (vf->num_mdd_events > 1) -+ dev_info(&pf->pdev->dev, "VF %d has had %llu MDD events since last boot\n", -+ i, vf->num_mdd_events); - } - } -- - } - - /** -@@ -1667,7 +1666,7 @@ static int ice_req_irq_msix_misc(struct ice_pf *pf) - * ice_napi_del - Remove NAPI handler for the VSI - * @vsi: VSI for which NAPI handler is to be removed - */ --void ice_napi_del(struct ice_vsi *vsi) -+static void ice_napi_del(struct ice_vsi *vsi) - { - int v_idx; - -diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c -index a805cbdd69be..81ea77978355 100644 ---- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c -+++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c -@@ -1134,7 +1134,7 @@ static int ice_alloc_vfs(struct ice_pf *pf, u16 num_alloc_vfs) - GFP_KERNEL); - if (!vfs) { - ret = -ENOMEM; -- goto err_unroll_sriov; -+ goto err_pci_disable_sriov; - } - pf->vf = vfs; - -@@ -1154,12 +1154,19 @@ static int ice_alloc_vfs(struct ice_pf *pf, u16 num_alloc_vfs) - pf->num_alloc_vfs = num_alloc_vfs; - - /* VF resources get allocated during reset */ -- if (!ice_reset_all_vfs(pf, true)) -+ if (!ice_reset_all_vfs(pf, true)) { -+ ret = -EIO; - goto err_unroll_sriov; -+ } - - goto err_unroll_intr; - - err_unroll_sriov: -+ pf->vf = NULL; -+ devm_kfree(&pf->pdev->dev, vfs); -+ vfs = NULL; -+ pf->num_alloc_vfs = 0; -+err_pci_disable_sriov: - pci_disable_sriov(pf->pdev); - err_unroll_intr: - /* rearm interrupts here */ -diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c -index 39f33afc479c..005c1693efc8 100644 ---- a/drivers/net/ethernet/intel/igb/igb_main.c -+++ b/drivers/net/ethernet/intel/igb/igb_main.c -@@ -5687,6 +5687,7 @@ static void igb_tx_ctxtdesc(struct igb_ring *tx_ring, - */ - if (tx_ring->launchtime_enable) { - ts = ns_to_timespec64(first->skb->tstamp); -+ first->skb->tstamp = 0; - context_desc->seqnum_seed = cpu_to_le32(ts.tv_nsec / 32); - } else { - context_desc->seqnum_seed = 0; -diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c -index acba067cc15a..7c52ae8ac005 100644 ---- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c -+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c -@@ -3226,7 +3226,8 @@ static int ixgbe_get_module_info(struct net_device *dev, - page_swap = true; - } - -- if (sff8472_rev == IXGBE_SFF_SFF_8472_UNSUP || page_swap) { -+ if (sff8472_rev == IXGBE_SFF_SFF_8472_UNSUP || page_swap || -+ !(addr_mode & IXGBE_SFF_DDM_IMPLEMENTED)) { - /* We have a SFP, but it does not support SFF-8472 */ - modinfo->type = ETH_MODULE_SFF_8079; - modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; -diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c -index ff85ce5791a3..31629fc7e820 100644 ---- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c -+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c -@@ -842,6 +842,9 @@ void ixgbe_ipsec_vf_clear(struct ixgbe_adapter *adapter, u32 vf) - struct ixgbe_ipsec *ipsec = adapter->ipsec; - int i; - -+ if (!ipsec) -+ return; -+ - /* search rx sa table */ - for (i = 0; i < IXGBE_IPSEC_MAX_SA_COUNT && ipsec->num_rx_sa; i++) { - if (!ipsec->rx_tbl[i].used) -diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h -index 214b01085718..6544c4539c0d 100644 ---- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h -+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h -@@ -45,6 +45,7 @@ - #define IXGBE_SFF_SOFT_RS_SELECT_10G 0x8 - #define IXGBE_SFF_SOFT_RS_SELECT_1G 0x0 - #define IXGBE_SFF_ADDRESSING_MODE 0x4 -+#define IXGBE_SFF_DDM_IMPLEMENTED 0x40 - #define IXGBE_SFF_QSFP_DA_ACTIVE_CABLE 0x1 - #define IXGBE_SFF_QSFP_DA_PASSIVE_CABLE 0x8 - #define IXGBE_SFF_QSFP_CONNECTOR_NOT_SEPARABLE 0x23 -diff --git a/drivers/net/ethernet/marvell/mvmdio.c b/drivers/net/ethernet/marvell/mvmdio.c -index c5dac6bd2be4..aca878a3f81f 100644 ---- a/drivers/net/ethernet/marvell/mvmdio.c -+++ b/drivers/net/ethernet/marvell/mvmdio.c -@@ -64,7 +64,7 @@ - - struct orion_mdio_dev { - void __iomem *regs; -- struct clk *clk[3]; -+ struct clk *clk[4]; - /* - * If we have access to the error interrupt pin (which is - * somewhat misnamed as it not only reflects internal errors -@@ -319,11 +319,31 @@ static int orion_mdio_probe(struct platform_device *pdev) - - init_waitqueue_head(&dev->smi_busy_wait); - -- for (i = 0; i < ARRAY_SIZE(dev->clk); i++) { -- dev->clk[i] = of_clk_get(pdev->dev.of_node, i); -- if (IS_ERR(dev->clk[i])) -- break; -- clk_prepare_enable(dev->clk[i]); -+ if (pdev->dev.of_node) { -+ for (i = 0; i < ARRAY_SIZE(dev->clk); i++) { -+ dev->clk[i] = of_clk_get(pdev->dev.of_node, i); -+ if (PTR_ERR(dev->clk[i]) == -EPROBE_DEFER) { -+ ret = -EPROBE_DEFER; -+ goto out_clk; -+ } -+ if (IS_ERR(dev->clk[i])) -+ break; -+ clk_prepare_enable(dev->clk[i]); -+ } -+ -+ if (!IS_ERR(of_clk_get(pdev->dev.of_node, -+ ARRAY_SIZE(dev->clk)))) -+ dev_warn(&pdev->dev, -+ "unsupported number of clocks, limiting to the first " -+ __stringify(ARRAY_SIZE(dev->clk)) "\n"); -+ } else { -+ dev->clk[0] = clk_get(&pdev->dev, NULL); -+ if (PTR_ERR(dev->clk[0]) == -EPROBE_DEFER) { -+ ret = -EPROBE_DEFER; -+ goto out_clk; -+ } -+ if (!IS_ERR(dev->clk[0])) -+ clk_prepare_enable(dev->clk[0]); - } - - dev->err_interrupt = platform_get_irq(pdev, 0); -@@ -362,6 +382,7 @@ static int orion_mdio_probe(struct platform_device *pdev) - if (dev->err_interrupt > 0) - writel(0, dev->regs + MVMDIO_ERR_INT_MASK); - -+out_clk: - for (i = 0; i < ARRAY_SIZE(dev->clk); i++) { - if (IS_ERR(dev->clk[i])) - break; -diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c -index a57d17ab91f0..fb06c0aa620a 100644 ---- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c -+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c -@@ -1242,6 +1242,12 @@ int mvpp2_ethtool_cls_rule_ins(struct mvpp2_port *port, - - input.fs = &info->fs; - -+ /* We need to manually set the rss_ctx, since this info isn't present -+ * in info->fs -+ */ -+ if (info->fs.flow_type & FLOW_RSS) -+ input.rss_ctx = info->rss_context; -+ - ethtool_rule = ethtool_rx_flow_rule_create(&input); - if (IS_ERR(ethtool_rule)) { - ret = PTR_ERR(ethtool_rule); -diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c -index d8e5241097a9..50ed1bdb632d 100644 ---- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c -+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c -@@ -3609,6 +3609,7 @@ static int mvpp2_set_mac_address(struct net_device *dev, void *p) - static int mvpp2_change_mtu(struct net_device *dev, int mtu) - { - struct mvpp2_port *port = netdev_priv(dev); -+ bool running = netif_running(dev); - int err; - - if (!IS_ALIGNED(MVPP2_RX_PKT_SIZE(mtu), 8)) { -@@ -3617,40 +3618,24 @@ static int mvpp2_change_mtu(struct net_device *dev, int mtu) - mtu = ALIGN(MVPP2_RX_PKT_SIZE(mtu), 8); - } - -- if (!netif_running(dev)) { -- err = mvpp2_bm_update_mtu(dev, mtu); -- if (!err) { -- port->pkt_size = MVPP2_RX_PKT_SIZE(mtu); -- return 0; -- } -- -- /* Reconfigure BM to the original MTU */ -- err = mvpp2_bm_update_mtu(dev, dev->mtu); -- if (err) -- goto log_error; -- } -- -- mvpp2_stop_dev(port); -+ if (running) -+ mvpp2_stop_dev(port); - - err = mvpp2_bm_update_mtu(dev, mtu); -- if (!err) { -+ if (err) { -+ netdev_err(dev, "failed to change MTU\n"); -+ /* Reconfigure BM to the original MTU */ -+ mvpp2_bm_update_mtu(dev, dev->mtu); -+ } else { - port->pkt_size = MVPP2_RX_PKT_SIZE(mtu); -- goto out_start; - } - -- /* Reconfigure BM to the original MTU */ -- err = mvpp2_bm_update_mtu(dev, dev->mtu); -- if (err) -- goto log_error; -- --out_start: -- mvpp2_start_dev(port); -- mvpp2_egress_enable(port); -- mvpp2_ingress_enable(port); -+ if (running) { -+ mvpp2_start_dev(port); -+ mvpp2_egress_enable(port); -+ mvpp2_ingress_enable(port); -+ } - -- return 0; --log_error: -- netdev_err(dev, "failed to change MTU\n"); - return err; - } - -@@ -5609,9 +5594,6 @@ static int mvpp2_remove(struct platform_device *pdev) - - mvpp2_dbgfs_cleanup(priv); - -- flush_workqueue(priv->stats_queue); -- destroy_workqueue(priv->stats_queue); -- - fwnode_for_each_available_child_node(fwnode, port_fwnode) { - if (priv->port_list[i]) { - mutex_destroy(&priv->port_list[i]->gather_stats_lock); -@@ -5620,6 +5602,8 @@ static int mvpp2_remove(struct platform_device *pdev) - i++; - } - -+ destroy_workqueue(priv->stats_queue); -+ - for (i = 0; i < MVPP2_BM_POOLS_NUM; i++) { - struct mvpp2_bm_pool *bm_pool = &priv->bm_pools[i]; - -diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c -index ae2240074d8e..5692c6087bbb 100644 ---- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c -+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c -@@ -312,7 +312,8 @@ static void mvpp2_prs_sram_shift_set(struct mvpp2_prs_entry *pe, int shift, - } - - /* Set value */ -- pe->sram[MVPP2_BIT_TO_WORD(MVPP2_PRS_SRAM_SHIFT_OFFS)] = shift & MVPP2_PRS_SRAM_SHIFT_MASK; -+ pe->sram[MVPP2_BIT_TO_WORD(MVPP2_PRS_SRAM_SHIFT_OFFS)] |= -+ shift & MVPP2_PRS_SRAM_SHIFT_MASK; - - /* Reset and set operation */ - mvpp2_prs_sram_bits_clear(pe, MVPP2_PRS_SRAM_OP_SEL_SHIFT_OFFS, -diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c -index fe518c854d1f..c93a6f9b735b 100644 ---- a/drivers/net/ethernet/marvell/sky2.c -+++ b/drivers/net/ethernet/marvell/sky2.c -@@ -4917,6 +4917,13 @@ static const struct dmi_system_id msi_blacklist[] = { - DMI_MATCH(DMI_PRODUCT_NAME, "P-79"), - }, - }, -+ { -+ .ident = "ASUS P6T", -+ .matches = { -+ DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), -+ DMI_MATCH(DMI_BOARD_NAME, "P6T"), -+ }, -+ }, - {} - }; - -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/dev.c b/drivers/net/ethernet/mellanox/mlx5/core/dev.c -index f6b1da99e6c2..ba5f46da1c5c 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/dev.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/dev.c -@@ -213,7 +213,7 @@ void mlx5_unregister_device(struct mlx5_core_dev *dev) - struct mlx5_interface *intf; - - mutex_lock(&mlx5_intf_mutex); -- list_for_each_entry(intf, &intf_list, list) -+ list_for_each_entry_reverse(intf, &intf_list, list) - mlx5_remove_device(intf, priv); - list_del(&priv->dev_list); - mutex_unlock(&mlx5_intf_mutex); -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h -index cc6797e24571..cc227a7aa79f 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en.h -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h -@@ -294,6 +294,7 @@ enum { - MLX5E_RQ_STATE_ENABLED, - MLX5E_RQ_STATE_AM, - MLX5E_RQ_STATE_NO_CSUM_COMPLETE, -+ MLX5E_RQ_STATE_CSUM_FULL, /* cqe_csum_full hw bit is set */ - }; - - struct mlx5e_cq { -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/port.c b/drivers/net/ethernet/mellanox/mlx5/core/en/port.c -index d5e5afbdca6d..f777994f3005 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en/port.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/port.c -@@ -78,9 +78,10 @@ static const u32 mlx5e_ext_link_speed[MLX5E_EXT_LINK_MODES_NUMBER] = { - }; - - static void mlx5e_port_get_speed_arr(struct mlx5_core_dev *mdev, -- const u32 **arr, u32 *size) -+ const u32 **arr, u32 *size, -+ bool force_legacy) - { -- bool ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet); -+ bool ext = force_legacy ? false : MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet); - - *size = ext ? ARRAY_SIZE(mlx5e_ext_link_speed) : - ARRAY_SIZE(mlx5e_link_speed); -@@ -152,7 +153,8 @@ int mlx5_port_set_eth_ptys(struct mlx5_core_dev *dev, bool an_disable, - sizeof(out), MLX5_REG_PTYS, 0, 1); - } - --u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper) -+u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper, -+ bool force_legacy) - { - unsigned long temp = eth_proto_oper; - const u32 *table; -@@ -160,7 +162,7 @@ u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper) - u32 max_size; - int i; - -- mlx5e_port_get_speed_arr(mdev, &table, &max_size); -+ mlx5e_port_get_speed_arr(mdev, &table, &max_size, force_legacy); - i = find_first_bit(&temp, max_size); - if (i < max_size) - speed = table[i]; -@@ -170,6 +172,7 @@ u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper) - int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) - { - struct mlx5e_port_eth_proto eproto; -+ bool force_legacy = false; - bool ext; - int err; - -@@ -177,8 +180,13 @@ int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) - err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto); - if (err) - goto out; -- -- *speed = mlx5e_port_ptys2speed(mdev, eproto.oper); -+ if (ext && !eproto.admin) { -+ force_legacy = true; -+ err = mlx5_port_query_eth_proto(mdev, 1, false, &eproto); -+ if (err) -+ goto out; -+ } -+ *speed = mlx5e_port_ptys2speed(mdev, eproto.oper, force_legacy); - if (!(*speed)) - err = -EINVAL; - -@@ -201,7 +209,7 @@ int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) - if (err) - return err; - -- mlx5e_port_get_speed_arr(mdev, &table, &max_size); -+ mlx5e_port_get_speed_arr(mdev, &table, &max_size, false); - for (i = 0; i < max_size; ++i) - if (eproto.cap & MLX5E_PROT_MASK(i)) - max_speed = max(max_speed, table[i]); -@@ -210,14 +218,15 @@ int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) - return 0; - } - --u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed) -+u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed, -+ bool force_legacy) - { - u32 link_modes = 0; - const u32 *table; - u32 max_size; - int i; - -- mlx5e_port_get_speed_arr(mdev, &table, &max_size); -+ mlx5e_port_get_speed_arr(mdev, &table, &max_size, force_legacy); - for (i = 0; i < max_size; ++i) { - if (table[i] == speed) - link_modes |= MLX5E_PROT_MASK(i); -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/port.h b/drivers/net/ethernet/mellanox/mlx5/core/en/port.h -index 70f536ec51c4..4a7f4497692b 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en/port.h -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/port.h -@@ -48,10 +48,12 @@ void mlx5_port_query_eth_autoneg(struct mlx5_core_dev *dev, u8 *an_status, - u8 *an_disable_cap, u8 *an_disable_admin); - int mlx5_port_set_eth_ptys(struct mlx5_core_dev *dev, bool an_disable, - u32 proto_admin, bool ext); --u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper); -+u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper, -+ bool force_legacy); - int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed); - int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed); --u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed); -+u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed, -+ bool force_legacy); - - int mlx5e_port_query_pbmc(struct mlx5_core_dev *mdev, void *out); - int mlx5e_port_set_pbmc(struct mlx5_core_dev *mdev, void *in); -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c -index 476dd97f7f2f..f3d98748b211 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c -@@ -142,22 +142,20 @@ static int mlx5e_tx_reporter_timeout_recover(struct mlx5e_txqsq *sq) - { - struct mlx5_eq_comp *eq = sq->cq.mcq.eq; - u32 eqe_count; -- int ret; - - netdev_err(sq->channel->netdev, "EQ 0x%x: Cons = 0x%x, irqn = 0x%x\n", - eq->core.eqn, eq->core.cons_index, eq->core.irqn); - - eqe_count = mlx5_eq_poll_irq_disabled(eq); -- ret = eqe_count ? false : true; - if (!eqe_count) { - clear_bit(MLX5E_SQ_STATE_ENABLED, &sq->state); -- return ret; -+ return -EIO; - } - - netdev_err(sq->channel->netdev, "Recover %d eqes on EQ 0x%x\n", - eqe_count, eq->core.eqn); - sq->channel->stats->eq_rearm++; -- return ret; -+ return 0; - } - - int mlx5e_tx_reporter_timeout(struct mlx5e_txqsq *sq) -@@ -264,13 +262,13 @@ static int mlx5e_tx_reporter_diagnose(struct devlink_health_reporter *reporter, - - err = mlx5_core_query_sq_state(priv->mdev, sq->sqn, &state); - if (err) -- break; -+ goto unlock; - - err = mlx5e_tx_reporter_build_diagnose_output(fmsg, sq->sqn, - state, - netif_xmit_stopped(sq->txq)); - if (err) -- break; -+ goto unlock; - } - err = devlink_fmsg_arr_pair_nest_end(fmsg); - if (err) -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c -index dd764e0471f2..f637d81f08bc 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c -@@ -764,7 +764,7 @@ static void ptys2ethtool_supported_advertised_port(struct ethtool_link_ksettings - } - - static void get_speed_duplex(struct net_device *netdev, -- u32 eth_proto_oper, -+ u32 eth_proto_oper, bool force_legacy, - struct ethtool_link_ksettings *link_ksettings) - { - struct mlx5e_priv *priv = netdev_priv(netdev); -@@ -774,7 +774,7 @@ static void get_speed_duplex(struct net_device *netdev, - if (!netif_carrier_ok(netdev)) - goto out; - -- speed = mlx5e_port_ptys2speed(priv->mdev, eth_proto_oper); -+ speed = mlx5e_port_ptys2speed(priv->mdev, eth_proto_oper, force_legacy); - if (!speed) { - speed = SPEED_UNKNOWN; - goto out; -@@ -893,8 +893,8 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv, - /* Fields: eth_proto_admin and ext_eth_proto_admin are - * mutually exclusive. Hence try reading legacy advertising - * when extended advertising is zero. -- * admin_ext indicates how eth_proto_admin should be -- * interpreted -+ * admin_ext indicates which proto_admin (ext vs. legacy) -+ * should be read and interpreted - */ - admin_ext = ext; - if (ext && !eth_proto_admin) { -@@ -903,7 +903,7 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv, - admin_ext = false; - } - -- eth_proto_oper = MLX5_GET_ETH_PROTO(ptys_reg, out, ext, -+ eth_proto_oper = MLX5_GET_ETH_PROTO(ptys_reg, out, admin_ext, - eth_proto_oper); - eth_proto_lp = MLX5_GET(ptys_reg, out, eth_proto_lp_advertise); - an_disable_admin = MLX5_GET(ptys_reg, out, an_disable_admin); -@@ -918,7 +918,8 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv, - get_supported(mdev, eth_proto_cap, link_ksettings); - get_advertising(eth_proto_admin, tx_pause, rx_pause, link_ksettings, - admin_ext); -- get_speed_duplex(priv->netdev, eth_proto_oper, link_ksettings); -+ get_speed_duplex(priv->netdev, eth_proto_oper, !admin_ext, -+ link_ksettings); - - eth_proto_oper = eth_proto_oper ? eth_proto_oper : eth_proto_cap; - -@@ -995,45 +996,69 @@ static u32 mlx5e_ethtool2ptys_ext_adver_link(const unsigned long *link_modes) - return ptys_modes; - } - -+static bool ext_link_mode_requested(const unsigned long *adver) -+{ -+#define MLX5E_MIN_PTYS_EXT_LINK_MODE_BIT ETHTOOL_LINK_MODE_50000baseKR_Full_BIT -+ int size = __ETHTOOL_LINK_MODE_MASK_NBITS - MLX5E_MIN_PTYS_EXT_LINK_MODE_BIT; -+ __ETHTOOL_DECLARE_LINK_MODE_MASK(modes); -+ -+ bitmap_set(modes, MLX5E_MIN_PTYS_EXT_LINK_MODE_BIT, size); -+ return bitmap_intersects(modes, adver, __ETHTOOL_LINK_MODE_MASK_NBITS); -+} -+ -+static bool ext_speed_requested(u32 speed) -+{ -+#define MLX5E_MAX_PTYS_LEGACY_SPEED 100000 -+ return !!(speed > MLX5E_MAX_PTYS_LEGACY_SPEED); -+} -+ -+static bool ext_requested(u8 autoneg, const unsigned long *adver, u32 speed) -+{ -+ bool ext_link_mode = ext_link_mode_requested(adver); -+ bool ext_speed = ext_speed_requested(speed); -+ -+ return autoneg == AUTONEG_ENABLE ? ext_link_mode : ext_speed; -+} -+ - int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv, - const struct ethtool_link_ksettings *link_ksettings) - { - struct mlx5_core_dev *mdev = priv->mdev; - struct mlx5e_port_eth_proto eproto; -+ const unsigned long *adver; - bool an_changes = false; - u8 an_disable_admin; - bool ext_supported; -- bool ext_requested; - u8 an_disable_cap; - bool an_disable; - u32 link_modes; - u8 an_status; -+ u8 autoneg; - u32 speed; -+ bool ext; - int err; - - u32 (*ethtool2ptys_adver_func)(const unsigned long *adver); - --#define MLX5E_PTYS_EXT ((1ULL << ETHTOOL_LINK_MODE_50000baseKR_Full_BIT) - 1) -+ adver = link_ksettings->link_modes.advertising; -+ autoneg = link_ksettings->base.autoneg; -+ speed = link_ksettings->base.speed; - -- ext_requested = !!(link_ksettings->link_modes.advertising[0] > -- MLX5E_PTYS_EXT || -- link_ksettings->link_modes.advertising[1]); -+ ext = ext_requested(autoneg, adver, speed), - ext_supported = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet); -- ext_requested &= ext_supported; -+ if (!ext_supported && ext) -+ return -EOPNOTSUPP; - -- speed = link_ksettings->base.speed; -- ethtool2ptys_adver_func = ext_requested ? -- mlx5e_ethtool2ptys_ext_adver_link : -+ ethtool2ptys_adver_func = ext ? mlx5e_ethtool2ptys_ext_adver_link : - mlx5e_ethtool2ptys_adver_link; -- err = mlx5_port_query_eth_proto(mdev, 1, ext_requested, &eproto); -+ err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto); - if (err) { - netdev_err(priv->netdev, "%s: query port eth proto failed: %d\n", - __func__, err); - goto out; - } -- link_modes = link_ksettings->base.autoneg == AUTONEG_ENABLE ? -- ethtool2ptys_adver_func(link_ksettings->link_modes.advertising) : -- mlx5e_port_speed2linkmodes(mdev, speed); -+ link_modes = autoneg == AUTONEG_ENABLE ? ethtool2ptys_adver_func(adver) : -+ mlx5e_port_speed2linkmodes(mdev, speed, !ext); - - link_modes = link_modes & eproto.cap; - if (!link_modes) { -@@ -1046,14 +1071,14 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv, - mlx5_port_query_eth_autoneg(mdev, &an_status, &an_disable_cap, - &an_disable_admin); - -- an_disable = link_ksettings->base.autoneg == AUTONEG_DISABLE; -+ an_disable = autoneg == AUTONEG_DISABLE; - an_changes = ((!an_disable && an_disable_admin) || - (an_disable && !an_disable_admin)); - - if (!an_changes && link_modes == eproto.admin) - goto out; - -- mlx5_port_set_eth_ptys(mdev, an_disable, link_modes, ext_requested); -+ mlx5_port_set_eth_ptys(mdev, an_disable, link_modes, ext); - mlx5_toggle_port_link(mdev); - - out: -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c -index a8e8350b38aa..882d26b8095d 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c -@@ -340,12 +340,11 @@ static inline u64 mlx5e_get_mpwqe_offset(struct mlx5e_rq *rq, u16 wqe_ix) - - static void mlx5e_init_frags_partition(struct mlx5e_rq *rq) - { -- struct mlx5e_wqe_frag_info next_frag, *prev; -+ struct mlx5e_wqe_frag_info next_frag = {}; -+ struct mlx5e_wqe_frag_info *prev = NULL; - int i; - - next_frag.di = &rq->wqe.di[0]; -- next_frag.offset = 0; -- prev = NULL; - - for (i = 0; i < mlx5_wq_cyc_get_size(&rq->wqe.wq); i++) { - struct mlx5e_rq_frag_info *frag_info = &rq->wqe.info.arr[0]; -@@ -855,6 +854,9 @@ static int mlx5e_open_rq(struct mlx5e_channel *c, - if (err) - goto err_destroy_rq; - -+ if (MLX5_CAP_ETH(c->mdev, cqe_checksum_full)) -+ __set_bit(MLX5E_RQ_STATE_CSUM_FULL, &c->rq.state); -+ - if (params->rx_dim_enabled) - __set_bit(MLX5E_RQ_STATE_AM, &c->rq.state); - -@@ -4192,8 +4194,6 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog) - /* no need for full reset when exchanging programs */ - reset = (!priv->channels.params.xdp_prog || !prog); - -- if (was_opened && reset) -- mlx5e_close_locked(netdev); - if (was_opened && !reset) { - /* num_channels is invariant here, so we can take the - * batched reference right upfront. -@@ -4205,20 +4205,31 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog) - } - } - -- /* exchange programs, extra prog reference we got from caller -- * as long as we don't fail from this point onwards. -- */ -- old_prog = xchg(&priv->channels.params.xdp_prog, prog); -+ if (was_opened && reset) { -+ struct mlx5e_channels new_channels = {}; -+ -+ new_channels.params = priv->channels.params; -+ new_channels.params.xdp_prog = prog; -+ mlx5e_set_rq_type(priv->mdev, &new_channels.params); -+ old_prog = priv->channels.params.xdp_prog; -+ -+ err = mlx5e_safe_switch_channels(priv, &new_channels, NULL); -+ if (err) -+ goto unlock; -+ } else { -+ /* exchange programs, extra prog reference we got from caller -+ * as long as we don't fail from this point onwards. -+ */ -+ old_prog = xchg(&priv->channels.params.xdp_prog, prog); -+ } -+ - if (old_prog) - bpf_prog_put(old_prog); - -- if (reset) /* change RQ type according to priv->xdp_prog */ -+ if (!was_opened && reset) /* change RQ type according to priv->xdp_prog */ - mlx5e_set_rq_type(priv->mdev, &priv->channels.params); - -- if (was_opened && reset) -- err = mlx5e_open_locked(netdev); -- -- if (!test_bit(MLX5E_STATE_OPENED, &priv->state) || reset) -+ if (!was_opened || reset) - goto unlock; - - /* exchanging programs w/o reset, we update ref counts on behalf -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c -index 13133e7f088e..8a5f9411cac6 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c -@@ -873,8 +873,14 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, - if (unlikely(get_ip_proto(skb, network_depth, proto) == IPPROTO_SCTP)) - goto csum_unnecessary; - -+ stats->csum_complete++; - skb->ip_summed = CHECKSUM_COMPLETE; - skb->csum = csum_unfold((__force __sum16)cqe->check_sum); -+ -+ if (test_bit(MLX5E_RQ_STATE_CSUM_FULL, &rq->state)) -+ return; /* CQE csum covers all received bytes */ -+ -+ /* csum might need some fixups ...*/ - if (network_depth > ETH_HLEN) - /* CQE csum is calculated from the IP header and does - * not cover VLAN headers (if present). This will add -@@ -885,7 +891,6 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, - skb->csum); - - mlx5e_skb_padding_csum(skb, network_depth, proto, stats); -- stats->csum_complete++; - return; - } - -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c -index e40c60d1631f..ee95f96ead4e 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c -@@ -1210,13 +1210,13 @@ static struct mlx5_fc *mlx5e_tc_get_counter(struct mlx5e_tc_flow *flow) - void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe) - { - struct mlx5e_neigh *m_neigh = &nhe->m_neigh; -- u64 bytes, packets, lastuse = 0; - struct mlx5e_tc_flow *flow; - struct mlx5e_encap_entry *e; - struct mlx5_fc *counter; - struct neigh_table *tbl; - bool neigh_used = false; - struct neighbour *n; -+ u64 lastuse; - - if (m_neigh->family == AF_INET) - tbl = &arp_tbl; -@@ -1236,7 +1236,7 @@ void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe) - encaps[efi->index]); - if (flow->flags & MLX5E_TC_FLOW_OFFLOADED) { - counter = mlx5e_tc_get_counter(flow); -- mlx5_fc_query_cached(counter, &bytes, &packets, &lastuse); -+ lastuse = mlx5_fc_query_lastuse(counter); - if (time_after((unsigned long)lastuse, nhe->reported_lastuse)) { - neigh_used = true; - break; -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c -index 6a921e24cd5e..535221b5256b 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c -@@ -939,7 +939,7 @@ int esw_vport_enable_egress_acl(struct mlx5_eswitch *esw, - vport->vport, MLX5_CAP_ESW_EGRESS_ACL(dev, log_max_ft_size)); - - root_ns = mlx5_get_flow_vport_acl_namespace(dev, MLX5_FLOW_NAMESPACE_ESW_EGRESS, -- vport->vport); -+ mlx5_eswitch_vport_num_to_index(esw, vport->vport)); - if (!root_ns) { - esw_warn(dev, "Failed to get E-Switch egress flow namespace for vport (%d)\n", vport->vport); - return -EOPNOTSUPP; -@@ -1057,7 +1057,7 @@ int esw_vport_enable_ingress_acl(struct mlx5_eswitch *esw, - vport->vport, MLX5_CAP_ESW_INGRESS_ACL(dev, log_max_ft_size)); - - root_ns = mlx5_get_flow_vport_acl_namespace(dev, MLX5_FLOW_NAMESPACE_ESW_INGRESS, -- vport->vport); -+ mlx5_eswitch_vport_num_to_index(esw, vport->vport)); - if (!root_ns) { - esw_warn(dev, "Failed to get E-Switch ingress flow namespace for vport (%d)\n", vport->vport); - return -EOPNOTSUPP; -@@ -1882,11 +1882,6 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev) - esw->enabled_vports = 0; - esw->mode = SRIOV_NONE; - esw->offloads.inline_mode = MLX5_INLINE_MODE_NONE; -- if (MLX5_CAP_ESW_FLOWTABLE_FDB(dev, reformat) && -- MLX5_CAP_ESW_FLOWTABLE_FDB(dev, decap)) -- esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_BASIC; -- else -- esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE; - - dev->priv.eswitch = esw; - return 0; -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c -index 47b446d30f71..c2beadc41c40 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c -@@ -1840,6 +1840,12 @@ int esw_offloads_init(struct mlx5_eswitch *esw, int vf_nvports, - { - int err; - -+ if (MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, reformat) && -+ MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, decap)) -+ esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_BASIC; -+ else -+ esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE; -+ - err = esw_offloads_steering_init(esw, vf_nvports, total_nvports); - if (err) - return err; -@@ -1901,6 +1907,7 @@ void esw_offloads_cleanup(struct mlx5_eswitch *esw) - esw_offloads_devcom_cleanup(esw); - esw_offloads_unload_all_reps(esw, num_vfs); - esw_offloads_steering_cleanup(esw); -+ esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE; - } - - static int esw_mode_from_devlink(u16 mode, u16 *mlx5_mode) -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h -index a08c3d09a50f..2664a05eee00 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h -+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h -@@ -68,7 +68,7 @@ enum fs_flow_table_type { - FS_FT_SNIFFER_RX = 0X5, - FS_FT_SNIFFER_TX = 0X6, - FS_FT_RDMA_RX = 0X7, -- FS_FT_MAX_TYPE = FS_FT_SNIFFER_TX, -+ FS_FT_MAX_TYPE = FS_FT_RDMA_RX, - }; - - enum fs_flow_table_op_mod { -@@ -274,7 +274,8 @@ void mlx5_cleanup_fs(struct mlx5_core_dev *dev); - (type == FS_FT_FDB) ? MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, cap) : \ - (type == FS_FT_SNIFFER_RX) ? MLX5_CAP_FLOWTABLE_SNIFFER_RX(mdev, cap) : \ - (type == FS_FT_SNIFFER_TX) ? MLX5_CAP_FLOWTABLE_SNIFFER_TX(mdev, cap) : \ -- (BUILD_BUG_ON_ZERO(FS_FT_SNIFFER_TX != FS_FT_MAX_TYPE))\ -+ (type == FS_FT_RDMA_RX) ? MLX5_CAP_FLOWTABLE_RDMA_RX(mdev, cap) : \ -+ (BUILD_BUG_ON_ZERO(FS_FT_RDMA_RX != FS_FT_MAX_TYPE))\ - ) - - #endif -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c -index c6c28f56aa29..add9db67028f 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c -@@ -367,6 +367,11 @@ int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter, - } - EXPORT_SYMBOL(mlx5_fc_query); - -+u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter) -+{ -+ return counter->cache.lastuse; -+} -+ - void mlx5_fc_query_cached(struct mlx5_fc *counter, - u64 *bytes, u64 *packets, u64 *lastuse) - { -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c -index 9ca492b430d8..603d294757b4 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c -@@ -698,7 +698,9 @@ static int mlx5_rdma_setup_rn(struct ib_device *ibdev, u8 port_num, - - prof->init(mdev, netdev, prof, ipriv); - -- mlx5e_attach_netdev(epriv); -+ err = mlx5e_attach_netdev(epriv); -+ if (err) -+ goto detach; - netif_carrier_off(netdev); - - /* set rdma_netdev func pointers */ -@@ -714,6 +716,11 @@ static int mlx5_rdma_setup_rn(struct ib_device *ibdev, u8 port_num, - - return 0; - -+detach: -+ prof->cleanup(epriv); -+ if (ipriv->sub_interface) -+ return err; -+ mlx5e_destroy_mdev_resources(mdev); - destroy_ht: - mlx5i_pkey_qpn_ht_cleanup(netdev); - return err; -diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/port_tun.c b/drivers/net/ethernet/mellanox/mlx5/core/lib/port_tun.c -index be69c1d7941a..48b5c847b642 100644 ---- a/drivers/net/ethernet/mellanox/mlx5/core/lib/port_tun.c -+++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/port_tun.c -@@ -98,27 +98,12 @@ static int mlx5_set_entropy(struct mlx5_tun_entropy *tun_entropy, - */ - if (entropy_flags.gre_calc_supported && - reformat_type == MLX5_REFORMAT_TYPE_L2_TO_NVGRE) { -- /* Other applications may change the global FW entropy -- * calculations settings. Check that the current entropy value -- * is the negative of the updated value. -- */ -- if (entropy_flags.force_enabled && -- enable == entropy_flags.gre_calc_enabled) { -- mlx5_core_warn(tun_entropy->mdev, -- "Unexpected GRE entropy calc setting - expected %d", -- !entropy_flags.gre_calc_enabled); -- return -EOPNOTSUPP; -- } -- err = mlx5_set_port_gre_tun_entropy_calc(tun_entropy->mdev, enable, -- entropy_flags.force_supported); -+ if (!entropy_flags.force_supported) -+ return 0; -+ err = mlx5_set_port_gre_tun_entropy_calc(tun_entropy->mdev, -+ enable, !enable); - if (err) - return err; -- /* if we turn on the entropy we don't need to force it anymore */ -- if (entropy_flags.force_supported && enable) { -- err = mlx5_set_port_gre_tun_entropy_calc(tun_entropy->mdev, 1, 0); -- if (err) -- return err; -- } - } else if (entropy_flags.calc_supported) { - /* Other applications may change the global FW entropy - * calculations settings. Check that the current entropy value -diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c -index 23204356ad88..d51442e63aba 100644 ---- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c -+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c -@@ -5989,7 +5989,7 @@ static int __init mlxsw_sp_module_init(void) - return 0; - - err_sp2_pci_driver_register: -- mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver); -+ mlxsw_pci_driver_unregister(&mlxsw_sp1_pci_driver); - err_sp1_pci_driver_register: - mlxsw_core_driver_unregister(&mlxsw_sp2_driver); - err_sp2_core_driver_register: -diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h -index 8601b3041acd..332195d96c62 100644 ---- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h -+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h -@@ -805,6 +805,7 @@ int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port, - struct tc_prio_qopt_offload *p); - - /* spectrum_fid.c */ -+bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index); - bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid); - struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp, - u16 fid_index); -diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c -index 1537f70bc26d..888ba4300bcc 100644 ---- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c -+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c -@@ -437,8 +437,8 @@ static const struct mlxsw_sp_sb_pr mlxsw_sp1_sb_prs[] = { - MLXSW_SP1_SB_PR_CPU_SIZE, true, false), - }; - --#define MLXSW_SP2_SB_PR_INGRESS_SIZE 38128752 --#define MLXSW_SP2_SB_PR_EGRESS_SIZE 38128752 -+#define MLXSW_SP2_SB_PR_INGRESS_SIZE 35297568 -+#define MLXSW_SP2_SB_PR_EGRESS_SIZE 35297568 - #define MLXSW_SP2_SB_PR_CPU_SIZE (256 * 1000) - - /* Order according to mlxsw_sp2_sb_pool_dess */ -diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c -index b25048c6c761..21296fa7f7fb 100644 ---- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c -+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c -@@ -408,14 +408,6 @@ static int mlxsw_sp_port_dcb_app_update(struct mlxsw_sp_port *mlxsw_sp_port) - have_dscp = mlxsw_sp_port_dcb_app_prio_dscp_map(mlxsw_sp_port, - &prio_map); - -- if (!have_dscp) { -- err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port, -- MLXSW_REG_QPTS_TRUST_STATE_PCP); -- if (err) -- netdev_err(mlxsw_sp_port->dev, "Couldn't switch to trust L2\n"); -- return err; -- } -- - mlxsw_sp_port_dcb_app_dscp_prio_map(mlxsw_sp_port, default_prio, - &dscp_map); - err = mlxsw_sp_port_dcb_app_update_qpdpm(mlxsw_sp_port, -@@ -432,6 +424,14 @@ static int mlxsw_sp_port_dcb_app_update(struct mlxsw_sp_port *mlxsw_sp_port) - return err; - } - -+ if (!have_dscp) { -+ err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port, -+ MLXSW_REG_QPTS_TRUST_STATE_PCP); -+ if (err) -+ netdev_err(mlxsw_sp_port->dev, "Couldn't switch to trust L2\n"); -+ return err; -+ } -+ - err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port, - MLXSW_REG_QPTS_TRUST_STATE_DSCP); - if (err) { -diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c -index 46baf3b44309..8df3cb21baa6 100644 ---- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c -+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c -@@ -126,6 +126,16 @@ static const int *mlxsw_sp_packet_type_sfgc_types[] = { - [MLXSW_SP_FLOOD_TYPE_MC] = mlxsw_sp_sfgc_mc_packet_types, - }; - -+bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index) -+{ -+ enum mlxsw_sp_fid_type fid_type = MLXSW_SP_FID_TYPE_DUMMY; -+ struct mlxsw_sp_fid_family *fid_family; -+ -+ fid_family = mlxsw_sp->fid_core->fid_family_arr[fid_type]; -+ -+ return fid_family->start_index == fid_index; -+} -+ - bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid) - { - return fid->fid_family->lag_vid_valid; -diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c -index 50111f228d77..5ecb45118400 100644 ---- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c -+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c -@@ -2468,6 +2468,9 @@ static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp, - goto just_remove; - } - -+ if (mlxsw_sp_fid_is_dummy(mlxsw_sp, fid)) -+ goto just_remove; -+ - mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid); - if (!mlxsw_sp_port_vlan) { - netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n"); -@@ -2527,6 +2530,9 @@ static void mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp *mlxsw_sp, - goto just_remove; - } - -+ if (mlxsw_sp_fid_is_dummy(mlxsw_sp, fid)) -+ goto just_remove; -+ - mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid); - if (!mlxsw_sp_port_vlan) { - netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n"); -diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c -index 02ad11e0b0d8..58e76e7cb0d6 100644 ---- a/drivers/net/ethernet/mscc/ocelot.c -+++ b/drivers/net/ethernet/mscc/ocelot.c -@@ -1797,6 +1797,7 @@ EXPORT_SYMBOL(ocelot_init); - - void ocelot_deinit(struct ocelot *ocelot) - { -+ cancel_delayed_work(&ocelot->stats_work); - destroy_workqueue(ocelot->stats_queue); - mutex_destroy(&ocelot->stats_lock); - } -diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c -index fccdb06fc5c5..8c40739e0d1b 100644 ---- a/drivers/net/ethernet/qlogic/qed/qed_dev.c -+++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c -@@ -3443,6 +3443,7 @@ static void qed_nvm_info_free(struct qed_hwfn *p_hwfn) - static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn, - void __iomem *p_regview, - void __iomem *p_doorbells, -+ u64 db_phys_addr, - enum qed_pci_personality personality) - { - struct qed_dev *cdev = p_hwfn->cdev; -@@ -3451,6 +3452,7 @@ static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn, - /* Split PCI bars evenly between hwfns */ - p_hwfn->regview = p_regview; - p_hwfn->doorbells = p_doorbells; -+ p_hwfn->db_phys_addr = db_phys_addr; - - if (IS_VF(p_hwfn->cdev)) - return qed_vf_hw_prepare(p_hwfn); -@@ -3546,7 +3548,9 @@ int qed_hw_prepare(struct qed_dev *cdev, - /* Initialize the first hwfn - will learn number of hwfns */ - rc = qed_hw_prepare_single(p_hwfn, - cdev->regview, -- cdev->doorbells, personality); -+ cdev->doorbells, -+ cdev->db_phys_addr, -+ personality); - if (rc) - return rc; - -@@ -3555,22 +3559,25 @@ int qed_hw_prepare(struct qed_dev *cdev, - /* Initialize the rest of the hwfns */ - if (cdev->num_hwfns > 1) { - void __iomem *p_regview, *p_doorbell; -- u8 __iomem *addr; -+ u64 db_phys_addr; -+ u32 offset; - - /* adjust bar offset for second engine */ -- addr = cdev->regview + -- qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, -- BAR_ID_0) / 2; -- p_regview = addr; -+ offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, -+ BAR_ID_0) / 2; -+ p_regview = cdev->regview + offset; - -- addr = cdev->doorbells + -- qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, -- BAR_ID_1) / 2; -- p_doorbell = addr; -+ offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, -+ BAR_ID_1) / 2; -+ -+ p_doorbell = cdev->doorbells + offset; -+ -+ db_phys_addr = cdev->db_phys_addr + offset; - - /* prepare second hw function */ - rc = qed_hw_prepare_single(&cdev->hwfns[1], p_regview, -- p_doorbell, personality); -+ p_doorbell, db_phys_addr, -+ personality); - - /* in case of error, need to free the previously - * initiliazed hwfn 0. -diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c -index ded556b7bab5..eeea8683d99b 100644 ---- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c -+++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c -@@ -2708,6 +2708,8 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn, - data.input.rx_num_desc = n_ooo_bufs * 2; - data.input.tx_num_desc = data.input.rx_num_desc; - data.input.tx_max_bds_per_packet = QED_IWARP_MAX_BDS_PER_FPDU; -+ data.input.tx_tc = PKT_LB_TC; -+ data.input.tx_dest = QED_LL2_TX_DEST_LB; - data.p_connection_handle = &iwarp_info->ll2_mpa_handle; - data.input.secondary_queue = true; - data.cbs = &cbs; -diff --git a/drivers/net/ethernet/qlogic/qed/qed_rdma.c b/drivers/net/ethernet/qlogic/qed/qed_rdma.c -index 7873d6dfd91f..13802b825d65 100644 ---- a/drivers/net/ethernet/qlogic/qed/qed_rdma.c -+++ b/drivers/net/ethernet/qlogic/qed/qed_rdma.c -@@ -803,7 +803,7 @@ static int qed_rdma_add_user(void *rdma_cxt, - dpi_start_offset + - ((out_params->dpi) * p_hwfn->dpi_size)); - -- out_params->dpi_phys_addr = p_hwfn->cdev->db_phys_addr + -+ out_params->dpi_phys_addr = p_hwfn->db_phys_addr + - dpi_start_offset + - ((out_params->dpi) * p_hwfn->dpi_size); - -diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h -index 4bf20d0651c4..90ad5694e2af 100644 ---- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h -+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h -@@ -51,7 +51,7 @@ struct rmnet_map_dl_csum_trailer { - struct rmnet_map_ul_csum_header { - __be16 csum_start_offset; - u16 csum_insert_offset:14; -- u16 udp_ip4_ind:1; -+ u16 udp_ind:1; - u16 csum_enabled:1; - } __aligned(1); - -diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c -index 60189923737a..21d38167f961 100644 ---- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c -+++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c -@@ -206,9 +206,9 @@ rmnet_map_ipv4_ul_csum_header(void *iphdr, - ul_header->csum_insert_offset = skb->csum_offset; - ul_header->csum_enabled = 1; - if (ip4h->protocol == IPPROTO_UDP) -- ul_header->udp_ip4_ind = 1; -+ ul_header->udp_ind = 1; - else -- ul_header->udp_ip4_ind = 0; -+ ul_header->udp_ind = 0; - - /* Changing remaining fields to network order */ - hdr++; -@@ -239,6 +239,7 @@ rmnet_map_ipv6_ul_csum_header(void *ip6hdr, - struct rmnet_map_ul_csum_header *ul_header, - struct sk_buff *skb) - { -+ struct ipv6hdr *ip6h = (struct ipv6hdr *)ip6hdr; - __be16 *hdr = (__be16 *)ul_header, offset; - - offset = htons((__force u16)(skb_transport_header(skb) - -@@ -246,7 +247,11 @@ rmnet_map_ipv6_ul_csum_header(void *ip6hdr, - ul_header->csum_start_offset = offset; - ul_header->csum_insert_offset = skb->csum_offset; - ul_header->csum_enabled = 1; -- ul_header->udp_ip4_ind = 0; -+ -+ if (ip6h->nexthdr == IPPROTO_UDP) -+ ul_header->udp_ind = 1; -+ else -+ ul_header->udp_ind = 0; - - /* Changing remaining fields to network order */ - hdr++; -@@ -419,7 +424,7 @@ void rmnet_map_checksum_uplink_packet(struct sk_buff *skb, - ul_header->csum_start_offset = 0; - ul_header->csum_insert_offset = 0; - ul_header->csum_enabled = 0; -- ul_header->udp_ip4_ind = 0; -+ ul_header->udp_ind = 0; - - priv->stats.csum_sw++; - } -diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c -index d06a61f00e78..36261b2959b4 100644 ---- a/drivers/net/ethernet/realtek/r8169.c -+++ b/drivers/net/ethernet/realtek/r8169.c -@@ -5157,6 +5157,143 @@ static void rtl_hw_start_8411_2(struct rtl8169_private *tp) - /* disable aspm and clock request before access ephy */ - rtl_hw_aspm_clkreq_enable(tp, false); - rtl_ephy_init(tp, e_info_8411_2); -+ -+ /* The following Realtek-provided magic fixes an issue with the RX unit -+ * getting confused after the PHY having been powered-down. -+ */ -+ r8168_mac_ocp_write(tp, 0xFC28, 0x0000); -+ r8168_mac_ocp_write(tp, 0xFC2A, 0x0000); -+ r8168_mac_ocp_write(tp, 0xFC2C, 0x0000); -+ r8168_mac_ocp_write(tp, 0xFC2E, 0x0000); -+ r8168_mac_ocp_write(tp, 0xFC30, 0x0000); -+ r8168_mac_ocp_write(tp, 0xFC32, 0x0000); -+ r8168_mac_ocp_write(tp, 0xFC34, 0x0000); -+ r8168_mac_ocp_write(tp, 0xFC36, 0x0000); -+ mdelay(3); -+ r8168_mac_ocp_write(tp, 0xFC26, 0x0000); -+ -+ r8168_mac_ocp_write(tp, 0xF800, 0xE008); -+ r8168_mac_ocp_write(tp, 0xF802, 0xE00A); -+ r8168_mac_ocp_write(tp, 0xF804, 0xE00C); -+ r8168_mac_ocp_write(tp, 0xF806, 0xE00E); -+ r8168_mac_ocp_write(tp, 0xF808, 0xE027); -+ r8168_mac_ocp_write(tp, 0xF80A, 0xE04F); -+ r8168_mac_ocp_write(tp, 0xF80C, 0xE05E); -+ r8168_mac_ocp_write(tp, 0xF80E, 0xE065); -+ r8168_mac_ocp_write(tp, 0xF810, 0xC602); -+ r8168_mac_ocp_write(tp, 0xF812, 0xBE00); -+ r8168_mac_ocp_write(tp, 0xF814, 0x0000); -+ r8168_mac_ocp_write(tp, 0xF816, 0xC502); -+ r8168_mac_ocp_write(tp, 0xF818, 0xBD00); -+ r8168_mac_ocp_write(tp, 0xF81A, 0x074C); -+ r8168_mac_ocp_write(tp, 0xF81C, 0xC302); -+ r8168_mac_ocp_write(tp, 0xF81E, 0xBB00); -+ r8168_mac_ocp_write(tp, 0xF820, 0x080A); -+ r8168_mac_ocp_write(tp, 0xF822, 0x6420); -+ r8168_mac_ocp_write(tp, 0xF824, 0x48C2); -+ r8168_mac_ocp_write(tp, 0xF826, 0x8C20); -+ r8168_mac_ocp_write(tp, 0xF828, 0xC516); -+ r8168_mac_ocp_write(tp, 0xF82A, 0x64A4); -+ r8168_mac_ocp_write(tp, 0xF82C, 0x49C0); -+ r8168_mac_ocp_write(tp, 0xF82E, 0xF009); -+ r8168_mac_ocp_write(tp, 0xF830, 0x74A2); -+ r8168_mac_ocp_write(tp, 0xF832, 0x8CA5); -+ r8168_mac_ocp_write(tp, 0xF834, 0x74A0); -+ r8168_mac_ocp_write(tp, 0xF836, 0xC50E); -+ r8168_mac_ocp_write(tp, 0xF838, 0x9CA2); -+ r8168_mac_ocp_write(tp, 0xF83A, 0x1C11); -+ r8168_mac_ocp_write(tp, 0xF83C, 0x9CA0); -+ r8168_mac_ocp_write(tp, 0xF83E, 0xE006); -+ r8168_mac_ocp_write(tp, 0xF840, 0x74F8); -+ r8168_mac_ocp_write(tp, 0xF842, 0x48C4); -+ r8168_mac_ocp_write(tp, 0xF844, 0x8CF8); -+ r8168_mac_ocp_write(tp, 0xF846, 0xC404); -+ r8168_mac_ocp_write(tp, 0xF848, 0xBC00); -+ r8168_mac_ocp_write(tp, 0xF84A, 0xC403); -+ r8168_mac_ocp_write(tp, 0xF84C, 0xBC00); -+ r8168_mac_ocp_write(tp, 0xF84E, 0x0BF2); -+ r8168_mac_ocp_write(tp, 0xF850, 0x0C0A); -+ r8168_mac_ocp_write(tp, 0xF852, 0xE434); -+ r8168_mac_ocp_write(tp, 0xF854, 0xD3C0); -+ r8168_mac_ocp_write(tp, 0xF856, 0x49D9); -+ r8168_mac_ocp_write(tp, 0xF858, 0xF01F); -+ r8168_mac_ocp_write(tp, 0xF85A, 0xC526); -+ r8168_mac_ocp_write(tp, 0xF85C, 0x64A5); -+ r8168_mac_ocp_write(tp, 0xF85E, 0x1400); -+ r8168_mac_ocp_write(tp, 0xF860, 0xF007); -+ r8168_mac_ocp_write(tp, 0xF862, 0x0C01); -+ r8168_mac_ocp_write(tp, 0xF864, 0x8CA5); -+ r8168_mac_ocp_write(tp, 0xF866, 0x1C15); -+ r8168_mac_ocp_write(tp, 0xF868, 0xC51B); -+ r8168_mac_ocp_write(tp, 0xF86A, 0x9CA0); -+ r8168_mac_ocp_write(tp, 0xF86C, 0xE013); -+ r8168_mac_ocp_write(tp, 0xF86E, 0xC519); -+ r8168_mac_ocp_write(tp, 0xF870, 0x74A0); -+ r8168_mac_ocp_write(tp, 0xF872, 0x48C4); -+ r8168_mac_ocp_write(tp, 0xF874, 0x8CA0); -+ r8168_mac_ocp_write(tp, 0xF876, 0xC516); -+ r8168_mac_ocp_write(tp, 0xF878, 0x74A4); -+ r8168_mac_ocp_write(tp, 0xF87A, 0x48C8); -+ r8168_mac_ocp_write(tp, 0xF87C, 0x48CA); -+ r8168_mac_ocp_write(tp, 0xF87E, 0x9CA4); -+ r8168_mac_ocp_write(tp, 0xF880, 0xC512); -+ r8168_mac_ocp_write(tp, 0xF882, 0x1B00); -+ r8168_mac_ocp_write(tp, 0xF884, 0x9BA0); -+ r8168_mac_ocp_write(tp, 0xF886, 0x1B1C); -+ r8168_mac_ocp_write(tp, 0xF888, 0x483F); -+ r8168_mac_ocp_write(tp, 0xF88A, 0x9BA2); -+ r8168_mac_ocp_write(tp, 0xF88C, 0x1B04); -+ r8168_mac_ocp_write(tp, 0xF88E, 0xC508); -+ r8168_mac_ocp_write(tp, 0xF890, 0x9BA0); -+ r8168_mac_ocp_write(tp, 0xF892, 0xC505); -+ r8168_mac_ocp_write(tp, 0xF894, 0xBD00); -+ r8168_mac_ocp_write(tp, 0xF896, 0xC502); -+ r8168_mac_ocp_write(tp, 0xF898, 0xBD00); -+ r8168_mac_ocp_write(tp, 0xF89A, 0x0300); -+ r8168_mac_ocp_write(tp, 0xF89C, 0x051E); -+ r8168_mac_ocp_write(tp, 0xF89E, 0xE434); -+ r8168_mac_ocp_write(tp, 0xF8A0, 0xE018); -+ r8168_mac_ocp_write(tp, 0xF8A2, 0xE092); -+ r8168_mac_ocp_write(tp, 0xF8A4, 0xDE20); -+ r8168_mac_ocp_write(tp, 0xF8A6, 0xD3C0); -+ r8168_mac_ocp_write(tp, 0xF8A8, 0xC50F); -+ r8168_mac_ocp_write(tp, 0xF8AA, 0x76A4); -+ r8168_mac_ocp_write(tp, 0xF8AC, 0x49E3); -+ r8168_mac_ocp_write(tp, 0xF8AE, 0xF007); -+ r8168_mac_ocp_write(tp, 0xF8B0, 0x49C0); -+ r8168_mac_ocp_write(tp, 0xF8B2, 0xF103); -+ r8168_mac_ocp_write(tp, 0xF8B4, 0xC607); -+ r8168_mac_ocp_write(tp, 0xF8B6, 0xBE00); -+ r8168_mac_ocp_write(tp, 0xF8B8, 0xC606); -+ r8168_mac_ocp_write(tp, 0xF8BA, 0xBE00); -+ r8168_mac_ocp_write(tp, 0xF8BC, 0xC602); -+ r8168_mac_ocp_write(tp, 0xF8BE, 0xBE00); -+ r8168_mac_ocp_write(tp, 0xF8C0, 0x0C4C); -+ r8168_mac_ocp_write(tp, 0xF8C2, 0x0C28); -+ r8168_mac_ocp_write(tp, 0xF8C4, 0x0C2C); -+ r8168_mac_ocp_write(tp, 0xF8C6, 0xDC00); -+ r8168_mac_ocp_write(tp, 0xF8C8, 0xC707); -+ r8168_mac_ocp_write(tp, 0xF8CA, 0x1D00); -+ r8168_mac_ocp_write(tp, 0xF8CC, 0x8DE2); -+ r8168_mac_ocp_write(tp, 0xF8CE, 0x48C1); -+ r8168_mac_ocp_write(tp, 0xF8D0, 0xC502); -+ r8168_mac_ocp_write(tp, 0xF8D2, 0xBD00); -+ r8168_mac_ocp_write(tp, 0xF8D4, 0x00AA); -+ r8168_mac_ocp_write(tp, 0xF8D6, 0xE0C0); -+ r8168_mac_ocp_write(tp, 0xF8D8, 0xC502); -+ r8168_mac_ocp_write(tp, 0xF8DA, 0xBD00); -+ r8168_mac_ocp_write(tp, 0xF8DC, 0x0132); -+ -+ r8168_mac_ocp_write(tp, 0xFC26, 0x8000); -+ -+ r8168_mac_ocp_write(tp, 0xFC2A, 0x0743); -+ r8168_mac_ocp_write(tp, 0xFC2C, 0x0801); -+ r8168_mac_ocp_write(tp, 0xFC2E, 0x0BE9); -+ r8168_mac_ocp_write(tp, 0xFC30, 0x02FD); -+ r8168_mac_ocp_write(tp, 0xFC32, 0x0C25); -+ r8168_mac_ocp_write(tp, 0xFC34, 0x00A9); -+ r8168_mac_ocp_write(tp, 0xFC36, 0x012D); -+ - rtl_hw_aspm_clkreq_enable(tp, true); - } - -@@ -6913,13 +7050,18 @@ static int rtl_alloc_irq(struct rtl8169_private *tp) - { - unsigned int flags; - -- if (tp->mac_version <= RTL_GIGA_MAC_VER_06) { -+ switch (tp->mac_version) { -+ case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06: - rtl_unlock_config_regs(tp); - RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~MSIEnable); - rtl_lock_config_regs(tp); -+ /* fall through */ -+ case RTL_GIGA_MAC_VER_07 ... RTL_GIGA_MAC_VER_24: - flags = PCI_IRQ_LEGACY; -- } else { -+ break; -+ default: - flags = PCI_IRQ_ALL_TYPES; -+ break; - } - - return pci_alloc_irq_vectors(tp->pci_dev, 1, 1, flags); -diff --git a/drivers/net/ethernet/rocker/rocker_main.c b/drivers/net/ethernet/rocker/rocker_main.c -index 3e5bc1fc3c46..c245a0f15066 100644 ---- a/drivers/net/ethernet/rocker/rocker_main.c -+++ b/drivers/net/ethernet/rocker/rocker_main.c -@@ -2208,6 +2208,7 @@ static int rocker_router_fib_event(struct notifier_block *nb, - - if (fen_info->fi->fib_nh_is_v6) { - NL_SET_ERR_MSG_MOD(info->extack, "IPv6 gateway with IPv4 route is not supported"); -+ kfree(fib_work); - return notifier_from_errno(-EINVAL); - } - } -diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c -index cba5881b2746..a10ef700f16d 100644 ---- a/drivers/net/ethernet/socionext/netsec.c -+++ b/drivers/net/ethernet/socionext/netsec.c -@@ -1029,7 +1029,6 @@ static void netsec_free_dring(struct netsec_priv *priv, int id) - static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id) - { - struct netsec_desc_ring *dring = &priv->desc_ring[id]; -- int i; - - dring->vaddr = dma_alloc_coherent(priv->dev, DESC_SZ * DESC_NUM, - &dring->desc_dma, GFP_KERNEL); -@@ -1040,19 +1039,6 @@ static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id) - if (!dring->desc) - goto err; - -- if (id == NETSEC_RING_TX) { -- for (i = 0; i < DESC_NUM; i++) { -- struct netsec_de *de; -- -- de = dring->vaddr + (DESC_SZ * i); -- /* de->attr is not going to be accessed by the NIC -- * until netsec_set_tx_de() is called. -- * No need for a dma_wmb() here -- */ -- de->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD; -- } -- } -- - return 0; - err: - netsec_free_dring(priv, id); -@@ -1060,6 +1046,23 @@ static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id) - return -ENOMEM; - } - -+static void netsec_setup_tx_dring(struct netsec_priv *priv) -+{ -+ struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_TX]; -+ int i; -+ -+ for (i = 0; i < DESC_NUM; i++) { -+ struct netsec_de *de; -+ -+ de = dring->vaddr + (DESC_SZ * i); -+ /* de->attr is not going to be accessed by the NIC -+ * until netsec_set_tx_de() is called. -+ * No need for a dma_wmb() here -+ */ -+ de->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD; -+ } -+} -+ - static int netsec_setup_rx_dring(struct netsec_priv *priv) - { - struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_RX]; -@@ -1361,6 +1364,7 @@ static int netsec_netdev_open(struct net_device *ndev) - - pm_runtime_get_sync(priv->dev); - -+ netsec_setup_tx_dring(priv); - ret = netsec_setup_rx_dring(priv); - if (ret) { - netif_err(priv, probe, priv->ndev, -diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h -index ceb0d23f5041..c265cc5770e8 100644 ---- a/drivers/net/ethernet/stmicro/stmmac/common.h -+++ b/drivers/net/ethernet/stmicro/stmmac/common.h -@@ -251,7 +251,7 @@ struct stmmac_safety_stats { - #define STMMAC_COAL_TX_TIMER 1000 - #define STMMAC_MAX_COAL_TX_TICK 100000 - #define STMMAC_TX_MAX_FRAMES 256 --#define STMMAC_TX_FRAMES 25 -+#define STMMAC_TX_FRAMES 1 - - /* Packets types */ - enum packets_types { -diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c -index a69c34f605b1..98a15ba8be9f 100644 ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c -@@ -884,6 +884,11 @@ static int sun8i_dwmac_set_syscon(struct stmmac_priv *priv) - * address. No need to mask it again. - */ - reg |= 1 << H3_EPHY_ADDR_SHIFT; -+ } else { -+ /* For SoCs without internal PHY the PHY selection bit should be -+ * set to 0 (external PHY). -+ */ -+ reg &= ~H3_EPHY_SELECT; - } - - if (!of_property_read_u32(node, "allwinner,tx-delay-ps", &val)) { -diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c -index 9fff81170163..54f4ffb36d60 100644 ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c -@@ -206,6 +206,12 @@ static void dwmac1000_set_filter(struct mac_device_info *hw, - GMAC_ADDR_LOW(reg)); - reg++; - } -+ -+ while (reg <= perfect_addr_number) { -+ writel(0, ioaddr + GMAC_ADDR_HIGH(reg)); -+ writel(0, ioaddr + GMAC_ADDR_LOW(reg)); -+ reg++; -+ } - } - - #ifdef FRAME_FILTER_DEBUG -diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c -index 99d772517242..e3850938cf2f 100644 ---- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c -+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c -@@ -443,14 +443,20 @@ static void dwmac4_set_filter(struct mac_device_info *hw, - * are required - */ - value |= GMAC_PACKET_FILTER_PR; -- } else if (!netdev_uc_empty(dev)) { -- int reg = 1; -+ } else { - struct netdev_hw_addr *ha; -+ int reg = 1; - - netdev_for_each_uc_addr(ha, dev) { - dwmac4_set_umac_addr(hw, ha->addr, reg); - reg++; - } -+ -+ while (reg <= GMAC_MAX_PERFECT_ADDRESSES) { -+ writel(0, ioaddr + GMAC_ADDR_HIGH(reg)); -+ writel(0, ioaddr + GMAC_ADDR_LOW(reg)); -+ reg++; -+ } - } - - writel(value, ioaddr + GMAC_PACKET_FILTER); -@@ -468,8 +474,9 @@ static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex, - if (fc & FLOW_RX) { - pr_debug("\tReceive Flow-Control ON\n"); - flow |= GMAC_RX_FLOW_CTRL_RFE; -- writel(flow, ioaddr + GMAC_RX_FLOW_CTRL); - } -+ writel(flow, ioaddr + GMAC_RX_FLOW_CTRL); -+ - if (fc & FLOW_TX) { - pr_debug("\tTransmit Flow-Control ON\n"); - -@@ -477,7 +484,7 @@ static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex, - pr_debug("\tduplex mode: PAUSE %d\n", pause_time); - - for (queue = 0; queue < tx_cnt; queue++) { -- flow |= GMAC_TX_FLOW_CTRL_TFE; -+ flow = GMAC_TX_FLOW_CTRL_TFE; - - if (duplex) - flow |= -@@ -485,6 +492,9 @@ static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex, - - writel(flow, ioaddr + GMAC_QX_TX_FLOW_CTRL(queue)); - } -+ } else { -+ for (queue = 0; queue < tx_cnt; queue++) -+ writel(0, ioaddr + GMAC_QX_TX_FLOW_CTRL(queue)); - } - } - -diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -index 06358fe5b245..b14f46a57154 100644 ---- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c -@@ -2048,6 +2048,9 @@ static int stmmac_napi_check(struct stmmac_priv *priv, u32 chan) - &priv->xstats, chan); - struct stmmac_channel *ch = &priv->channel[chan]; - -+ if (status) -+ status |= handle_rx | handle_tx; -+ - if ((status & handle_rx) && (chan < priv->plat->rx_queues_to_use)) { - stmmac_disable_dma_irq(priv, priv->ioaddr, chan); - napi_schedule_irqoff(&ch->rx_napi); -@@ -3045,17 +3048,8 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) - - /* Manage oversized TCP frames for GMAC4 device */ - if (skb_is_gso(skb) && priv->tso) { -- if (skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { -- /* -- * There is no way to determine the number of TSO -- * capable Queues. Let's use always the Queue 0 -- * because if TSO is supported then at least this -- * one will be capable. -- */ -- skb_set_queue_mapping(skb, 0); -- -+ if (skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) - return stmmac_tso_xmit(skb, dev); -- } - } - - if (unlikely(stmmac_tx_avail(priv, queue) < nfrags + 1)) { -@@ -3872,6 +3866,22 @@ static int stmmac_setup_tc(struct net_device *ndev, enum tc_setup_type type, - } - } - -+static u16 stmmac_select_queue(struct net_device *dev, struct sk_buff *skb, -+ struct net_device *sb_dev) -+{ -+ if (skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { -+ /* -+ * There is no way to determine the number of TSO -+ * capable Queues. Let's use always the Queue 0 -+ * because if TSO is supported then at least this -+ * one will be capable. -+ */ -+ return 0; -+ } -+ -+ return netdev_pick_tx(dev, skb, NULL) % dev->real_num_tx_queues; -+} -+ - static int stmmac_set_mac_address(struct net_device *ndev, void *addr) - { - struct stmmac_priv *priv = netdev_priv(ndev); -@@ -4088,6 +4098,7 @@ static const struct net_device_ops stmmac_netdev_ops = { - .ndo_tx_timeout = stmmac_tx_timeout, - .ndo_do_ioctl = stmmac_ioctl, - .ndo_setup_tc = stmmac_setup_tc, -+ .ndo_select_queue = stmmac_select_queue, - #ifdef CONFIG_NET_POLL_CONTROLLER - .ndo_poll_controller = stmmac_poll_controller, - #endif -@@ -4363,8 +4374,9 @@ int stmmac_dvr_probe(struct device *device, - NAPI_POLL_WEIGHT); - } - if (queue < priv->plat->tx_queues_to_use) { -- netif_napi_add(ndev, &ch->tx_napi, stmmac_napi_poll_tx, -- NAPI_POLL_WEIGHT); -+ netif_tx_napi_add(ndev, &ch->tx_napi, -+ stmmac_napi_poll_tx, -+ NAPI_POLL_WEIGHT); - } - } - -diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c -index 634fc484a0b3..4e3026f9abed 100644 ---- a/drivers/net/ethernet/ti/cpsw.c -+++ b/drivers/net/ethernet/ti/cpsw.c -@@ -2179,6 +2179,7 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data, - return ret; - } - -+ slave_data->slave_node = slave_node; - slave_data->phy_node = of_parse_phandle(slave_node, - "phy-handle", 0); - parp = of_get_property(slave_node, "phy_id", &lenp); -@@ -2330,6 +2331,7 @@ static int cpsw_probe_dual_emac(struct cpsw_priv *priv) - - /* register the network device */ - SET_NETDEV_DEV(ndev, cpsw->dev); -+ ndev->dev.of_node = cpsw->slaves[1].data->slave_node; - ret = register_netdev(ndev); - if (ret) - dev_err(cpsw->dev, "cpsw: error registering net device\n"); -@@ -2507,6 +2509,7 @@ static int cpsw_probe(struct platform_device *pdev) - - /* register the network device */ - SET_NETDEV_DEV(ndev, dev); -+ ndev->dev.of_node = cpsw->slaves[0].data->slave_node; - ret = register_netdev(ndev); - if (ret) { - dev_err(dev, "error registering net device\n"); -diff --git a/drivers/net/ethernet/ti/cpsw_priv.h b/drivers/net/ethernet/ti/cpsw_priv.h -index 04795b97ee71..e32f11da2dce 100644 ---- a/drivers/net/ethernet/ti/cpsw_priv.h -+++ b/drivers/net/ethernet/ti/cpsw_priv.h -@@ -272,6 +272,7 @@ struct cpsw_host_regs { - }; - - struct cpsw_slave_data { -+ struct device_node *slave_node; - struct device_node *phy_node; - char phy_id[MII_BUS_ID_SIZE]; - int phy_if; -diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c -index 831967f6eff8..65c16772e589 100644 ---- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c -+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c -@@ -615,6 +615,10 @@ static void axienet_start_xmit_done(struct net_device *ndev) - - ndev->stats.tx_packets += packets; - ndev->stats.tx_bytes += size; -+ -+ /* Matches barrier in axienet_start_xmit */ -+ smp_mb(); -+ - netif_wake_queue(ndev); - } - -@@ -670,9 +674,19 @@ axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev) - cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; - - if (axienet_check_tx_bd_space(lp, num_frag)) { -- if (!netif_queue_stopped(ndev)) -- netif_stop_queue(ndev); -- return NETDEV_TX_BUSY; -+ if (netif_queue_stopped(ndev)) -+ return NETDEV_TX_BUSY; -+ -+ netif_stop_queue(ndev); -+ -+ /* Matches barrier in axienet_start_xmit_done */ -+ smp_mb(); -+ -+ /* Space might have just been freed - check again */ -+ if (axienet_check_tx_bd_space(lp, num_frag)) -+ return NETDEV_TX_BUSY; -+ -+ netif_wake_queue(ndev); - } - - if (skb->ip_summed == CHECKSUM_PARTIAL) { -diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c -index fc45b749db46..607f38712b4e 100644 ---- a/drivers/net/gtp.c -+++ b/drivers/net/gtp.c -@@ -285,16 +285,29 @@ static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb) - return gtp_rx(pctx, skb, hdrlen, gtp->role); - } - --static void gtp_encap_destroy(struct sock *sk) -+static void __gtp_encap_destroy(struct sock *sk) - { - struct gtp_dev *gtp; - -- gtp = rcu_dereference_sk_user_data(sk); -+ lock_sock(sk); -+ gtp = sk->sk_user_data; - if (gtp) { -+ if (gtp->sk0 == sk) -+ gtp->sk0 = NULL; -+ else -+ gtp->sk1u = NULL; - udp_sk(sk)->encap_type = 0; - rcu_assign_sk_user_data(sk, NULL); - sock_put(sk); - } -+ release_sock(sk); -+} -+ -+static void gtp_encap_destroy(struct sock *sk) -+{ -+ rtnl_lock(); -+ __gtp_encap_destroy(sk); -+ rtnl_unlock(); - } - - static void gtp_encap_disable_sock(struct sock *sk) -@@ -302,7 +315,7 @@ static void gtp_encap_disable_sock(struct sock *sk) - if (!sk) - return; - -- gtp_encap_destroy(sk); -+ __gtp_encap_destroy(sk); - } - - static void gtp_encap_disable(struct gtp_dev *gtp) -@@ -796,7 +809,8 @@ static struct sock *gtp_encap_enable_socket(int fd, int type, - goto out_sock; - } - -- if (rcu_dereference_sk_user_data(sock->sk)) { -+ lock_sock(sock->sk); -+ if (sock->sk->sk_user_data) { - sk = ERR_PTR(-EBUSY); - goto out_sock; - } -@@ -812,6 +826,7 @@ static struct sock *gtp_encap_enable_socket(int fd, int type, - setup_udp_tunnel_sock(sock_net(sock->sk), sock, &tuncfg); - - out_sock: -+ release_sock(sock->sk); - sockfd_put(sock); - return sk; - } -@@ -843,8 +858,13 @@ static int gtp_encap_enable(struct gtp_dev *gtp, struct nlattr *data[]) - - if (data[IFLA_GTP_ROLE]) { - role = nla_get_u32(data[IFLA_GTP_ROLE]); -- if (role > GTP_ROLE_SGSN) -+ if (role > GTP_ROLE_SGSN) { -+ if (sk0) -+ gtp_encap_disable_sock(sk0); -+ if (sk1u) -+ gtp_encap_disable_sock(sk1u); - return -EINVAL; -+ } - } - - gtp->sk0 = sk0; -@@ -945,7 +965,7 @@ static int ipv4_pdp_add(struct gtp_dev *gtp, struct sock *sk, - - } - -- pctx = kmalloc(sizeof(struct pdp_ctx), GFP_KERNEL); -+ pctx = kmalloc(sizeof(*pctx), GFP_ATOMIC); - if (pctx == NULL) - return -ENOMEM; - -@@ -1034,6 +1054,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info) - return -EINVAL; - } - -+ rtnl_lock(); - rcu_read_lock(); - - gtp = gtp_find_dev(sock_net(skb->sk), info->attrs); -@@ -1058,6 +1079,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info) - - out_unlock: - rcu_read_unlock(); -+ rtnl_unlock(); - return err; - } - -@@ -1360,9 +1382,9 @@ late_initcall(gtp_init); - - static void __exit gtp_fini(void) - { -- unregister_pernet_subsys(>p_net_ops); - genl_unregister_family(>p_genl_family); - rtnl_link_unregister(>p_link_ops); -+ unregister_pernet_subsys(>p_net_ops); - - pr_info("GTP module unloaded\n"); - } -diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c -index afdcc5664ea6..3544e1991579 100644 ---- a/drivers/net/hyperv/netvsc_drv.c -+++ b/drivers/net/hyperv/netvsc_drv.c -@@ -836,7 +836,6 @@ int netvsc_recv_callback(struct net_device *net, - - if (unlikely(!skb)) { - ++net_device_ctx->eth_stats.rx_no_memory; -- rcu_read_unlock(); - return NVSP_STAT_FAIL; - } - -diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c -index 75aebf65cd09..8f46aa1ddec0 100644 ---- a/drivers/net/macsec.c -+++ b/drivers/net/macsec.c -@@ -865,6 +865,7 @@ static void macsec_reset_skb(struct sk_buff *skb, struct net_device *dev) - - static void macsec_finalize_skb(struct sk_buff *skb, u8 icv_len, u8 hdr_len) - { -+ skb->ip_summed = CHECKSUM_NONE; - memmove(skb->data + hdr_len, skb->data, 2 * ETH_ALEN); - skb_pull(skb, hdr_len); - pskb_trim_unique(skb, skb->len - icv_len); -@@ -1099,10 +1100,9 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) - } - - skb = skb_unshare(skb, GFP_ATOMIC); -- if (!skb) { -- *pskb = NULL; -+ *pskb = skb; -+ if (!skb) - return RX_HANDLER_CONSUMED; -- } - - pulled_sci = pskb_may_pull(skb, macsec_extra_len(true)); - if (!pulled_sci) { -diff --git a/drivers/net/phy/fixed_phy.c b/drivers/net/phy/fixed_phy.c -index 3ffe46df249e..7c5265fd2b94 100644 ---- a/drivers/net/phy/fixed_phy.c -+++ b/drivers/net/phy/fixed_phy.c -@@ -216,8 +216,10 @@ static struct gpio_desc *fixed_phy_get_gpiod(struct device_node *np) - if (IS_ERR(gpiod)) { - if (PTR_ERR(gpiod) == -EPROBE_DEFER) - return gpiod; -- pr_err("error getting GPIO for fixed link %pOF, proceed without\n", -- fixed_link_node); -+ -+ if (PTR_ERR(gpiod) != -ENOENT) -+ pr_err("error getting GPIO for fixed link %pOF, proceed without\n", -+ fixed_link_node); - gpiod = NULL; - } - -diff --git a/drivers/net/phy/mscc.c b/drivers/net/phy/mscc.c -index 28676af97b42..645d354ffb48 100644 ---- a/drivers/net/phy/mscc.c -+++ b/drivers/net/phy/mscc.c -@@ -2226,8 +2226,8 @@ static int vsc8514_probe(struct phy_device *phydev) - vsc8531->supp_led_modes = VSC85XX_SUPP_LED_MODES; - vsc8531->hw_stats = vsc85xx_hw_stats; - vsc8531->nstats = ARRAY_SIZE(vsc85xx_hw_stats); -- vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats, -- sizeof(u64), GFP_KERNEL); -+ vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, -+ sizeof(u64), GFP_KERNEL); - if (!vsc8531->stats) - return -ENOMEM; - -@@ -2251,8 +2251,8 @@ static int vsc8574_probe(struct phy_device *phydev) - vsc8531->supp_led_modes = VSC8584_SUPP_LED_MODES; - vsc8531->hw_stats = vsc8584_hw_stats; - vsc8531->nstats = ARRAY_SIZE(vsc8584_hw_stats); -- vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats, -- sizeof(u64), GFP_KERNEL); -+ vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, -+ sizeof(u64), GFP_KERNEL); - if (!vsc8531->stats) - return -ENOMEM; - -@@ -2281,8 +2281,8 @@ static int vsc8584_probe(struct phy_device *phydev) - vsc8531->supp_led_modes = VSC8584_SUPP_LED_MODES; - vsc8531->hw_stats = vsc8584_hw_stats; - vsc8531->nstats = ARRAY_SIZE(vsc8584_hw_stats); -- vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats, -- sizeof(u64), GFP_KERNEL); -+ vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, -+ sizeof(u64), GFP_KERNEL); - if (!vsc8531->stats) - return -ENOMEM; - -@@ -2311,8 +2311,8 @@ static int vsc85xx_probe(struct phy_device *phydev) - vsc8531->supp_led_modes = VSC85XX_SUPP_LED_MODES; - vsc8531->hw_stats = vsc85xx_hw_stats; - vsc8531->nstats = ARRAY_SIZE(vsc85xx_hw_stats); -- vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats, -- sizeof(u64), GFP_KERNEL); -+ vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, -+ sizeof(u64), GFP_KERNEL); - if (!vsc8531->stats) - return -ENOMEM; - -diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c -index dcc93a873174..ffa402732aea 100644 ---- a/drivers/net/phy/phy_device.c -+++ b/drivers/net/phy/phy_device.c -@@ -948,6 +948,9 @@ int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, - { - int rc; - -+ if (!dev) -+ return -EINVAL; -+ - rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); - if (rc) - return rc; -@@ -1290,6 +1293,9 @@ struct phy_device *phy_attach(struct net_device *dev, const char *bus_id, - struct device *d; - int rc; - -+ if (!dev) -+ return ERR_PTR(-EINVAL); -+ - /* Search the list of PHY devices on the mdio bus for the - * PHY with the requested name - */ -@@ -1724,6 +1730,12 @@ int genphy_update_link(struct phy_device *phydev) - phydev->link = status & BMSR_LSTATUS ? 1 : 0; - phydev->autoneg_complete = status & BMSR_ANEGCOMPLETE ? 1 : 0; - -+ /* Consider the case that autoneg was started and "aneg complete" -+ * bit has been reset, but "link up" bit not yet. -+ */ -+ if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete) -+ phydev->link = 0; -+ - return 0; - } - EXPORT_SYMBOL(genphy_update_link); -diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c -index 4c0616ba314d..c45ee6e3fe01 100644 ---- a/drivers/net/phy/phylink.c -+++ b/drivers/net/phy/phylink.c -@@ -195,6 +195,8 @@ static int phylink_parse_fixedlink(struct phylink *pl, - pl->supported, true); - linkmode_zero(pl->supported); - phylink_set(pl->supported, MII); -+ phylink_set(pl->supported, Pause); -+ phylink_set(pl->supported, Asym_Pause); - if (s) { - __set_bit(s->bit, pl->supported); - } else { -@@ -912,10 +914,10 @@ void phylink_start(struct phylink *pl) - - if (pl->link_an_mode == MLO_AN_FIXED && !IS_ERR(pl->link_gpio)) - mod_timer(&pl->link_poll, jiffies + HZ); -- if (pl->sfp_bus) -- sfp_upstream_start(pl->sfp_bus); - if (pl->phydev) - phy_start(pl->phydev); -+ if (pl->sfp_bus) -+ sfp_upstream_start(pl->sfp_bus); - } - EXPORT_SYMBOL_GPL(phylink_start); - -@@ -932,10 +934,10 @@ void phylink_stop(struct phylink *pl) - { - ASSERT_RTNL(); - -- if (pl->phydev) -- phy_stop(pl->phydev); - if (pl->sfp_bus) - sfp_upstream_stop(pl->sfp_bus); -+ if (pl->phydev) -+ phy_stop(pl->phydev); - if (pl->link_an_mode == MLO_AN_FIXED && !IS_ERR(pl->link_gpio)) - del_timer_sync(&pl->link_poll); - -diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c -index 71812be0ac64..be0271a51b0a 100644 ---- a/drivers/net/phy/sfp.c -+++ b/drivers/net/phy/sfp.c -@@ -186,10 +186,11 @@ struct sfp { - struct gpio_desc *gpio[GPIO_MAX]; - - bool attached; -+ struct mutex st_mutex; /* Protects state */ - unsigned int state; - struct delayed_work poll; - struct delayed_work timeout; -- struct mutex sm_mutex; -+ struct mutex sm_mutex; /* Protects state machine */ - unsigned char sm_mod_state; - unsigned char sm_dev_state; - unsigned short sm_state; -@@ -514,7 +515,7 @@ static int sfp_hwmon_read_sensor(struct sfp *sfp, int reg, long *value) - - static void sfp_hwmon_to_rx_power(long *value) - { -- *value = DIV_ROUND_CLOSEST(*value, 100); -+ *value = DIV_ROUND_CLOSEST(*value, 10); - } - - static void sfp_hwmon_calibrate(struct sfp *sfp, unsigned int slope, int offset, -@@ -1719,6 +1720,7 @@ static void sfp_check_state(struct sfp *sfp) - { - unsigned int state, i, changed; - -+ mutex_lock(&sfp->st_mutex); - state = sfp_get_state(sfp); - changed = state ^ sfp->state; - changed &= SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT; -@@ -1744,6 +1746,7 @@ static void sfp_check_state(struct sfp *sfp) - sfp_sm_event(sfp, state & SFP_F_LOS ? - SFP_E_LOS_HIGH : SFP_E_LOS_LOW); - rtnl_unlock(); -+ mutex_unlock(&sfp->st_mutex); - } - - static irqreturn_t sfp_irq(int irq, void *data) -@@ -1774,6 +1777,7 @@ static struct sfp *sfp_alloc(struct device *dev) - sfp->dev = dev; - - mutex_init(&sfp->sm_mutex); -+ mutex_init(&sfp->st_mutex); - INIT_DELAYED_WORK(&sfp->poll, sfp_poll); - INIT_DELAYED_WORK(&sfp->timeout, sfp_timeout); - -diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c -index 1d902ecb4aa8..a44dd3c8af63 100644 ---- a/drivers/net/ppp/pppoe.c -+++ b/drivers/net/ppp/pppoe.c -@@ -1115,6 +1115,9 @@ static const struct proto_ops pppoe_ops = { - .recvmsg = pppoe_recvmsg, - .mmap = sock_no_mmap, - .ioctl = pppox_ioctl, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = pppox_compat_ioctl, -+#endif - }; - - static const struct pppox_proto pppoe_proto = { -diff --git a/drivers/net/ppp/pppox.c b/drivers/net/ppp/pppox.c -index 5ef422a43d70..08364f10a43f 100644 ---- a/drivers/net/ppp/pppox.c -+++ b/drivers/net/ppp/pppox.c -@@ -17,6 +17,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -98,6 +99,18 @@ int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) - - EXPORT_SYMBOL(pppox_ioctl); - -+#ifdef CONFIG_COMPAT -+int pppox_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) -+{ -+ if (cmd == PPPOEIOCSFWD32) -+ cmd = PPPOEIOCSFWD; -+ -+ return pppox_ioctl(sock, cmd, (unsigned long)compat_ptr(arg)); -+} -+ -+EXPORT_SYMBOL(pppox_compat_ioctl); -+#endif -+ - static int pppox_create(struct net *net, struct socket *sock, int protocol, - int kern) - { -diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c -index a8e52c8e4128..734de7de03f7 100644 ---- a/drivers/net/ppp/pptp.c -+++ b/drivers/net/ppp/pptp.c -@@ -623,6 +623,9 @@ static const struct proto_ops pptp_ops = { - .recvmsg = sock_no_recvmsg, - .mmap = sock_no_mmap, - .ioctl = pppox_ioctl, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = pppox_compat_ioctl, -+#endif - }; - - static const struct pppox_proto pppox_pptp_proto = { -diff --git a/drivers/net/tun.c b/drivers/net/tun.c -index d7c55e0fa8f4..192ac47fd055 100644 ---- a/drivers/net/tun.c -+++ b/drivers/net/tun.c -@@ -1600,7 +1600,8 @@ static bool tun_can_build_skb(struct tun_struct *tun, struct tun_file *tfile, - return true; - } - --static struct sk_buff *__tun_build_skb(struct page_frag *alloc_frag, char *buf, -+static struct sk_buff *__tun_build_skb(struct tun_file *tfile, -+ struct page_frag *alloc_frag, char *buf, - int buflen, int len, int pad) - { - struct sk_buff *skb = build_skb(buf, buflen); -@@ -1610,6 +1611,7 @@ static struct sk_buff *__tun_build_skb(struct page_frag *alloc_frag, char *buf, - - skb_reserve(skb, pad); - skb_put(skb, len); -+ skb_set_owner_w(skb, tfile->socket.sk); - - get_page(alloc_frag->page); - alloc_frag->offset += buflen; -@@ -1687,7 +1689,8 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, - */ - if (hdr->gso_type || !xdp_prog) { - *skb_xdp = 1; -- return __tun_build_skb(alloc_frag, buf, buflen, len, pad); -+ return __tun_build_skb(tfile, alloc_frag, buf, buflen, len, -+ pad); - } - - *skb_xdp = 0; -@@ -1724,7 +1727,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, - rcu_read_unlock(); - local_bh_enable(); - -- return __tun_build_skb(alloc_frag, buf, buflen, len, pad); -+ return __tun_build_skb(tfile, alloc_frag, buf, buflen, len, pad); - - err_xdp: - put_page(alloc_frag->page); -diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c -index c9bc96310ed4..ef548beba684 100644 ---- a/drivers/net/usb/asix_devices.c -+++ b/drivers/net/usb/asix_devices.c -@@ -226,7 +226,7 @@ static void asix_phy_reset(struct usbnet *dev, unsigned int reset_bits) - static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) - { - int ret = 0; -- u8 buf[ETH_ALEN]; -+ u8 buf[ETH_ALEN] = {0}; - int i; - unsigned long gpio_bits = dev->driver_info->data; - -@@ -677,7 +677,7 @@ static int asix_resume(struct usb_interface *intf) - static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) - { - int ret, i; -- u8 buf[ETH_ALEN], chipcode = 0; -+ u8 buf[ETH_ALEN] = {0}, chipcode = 0; - u32 phyid; - struct asix_common_private *priv; - -@@ -1061,7 +1061,7 @@ static const struct net_device_ops ax88178_netdev_ops = { - static int ax88178_bind(struct usbnet *dev, struct usb_interface *intf) - { - int ret; -- u8 buf[ETH_ALEN]; -+ u8 buf[ETH_ALEN] = {0}; - - usbnet_get_endpoints(dev,intf); - -diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c -index 3d92ea6fcc02..de564401fd4d 100644 ---- a/drivers/net/usb/lan78xx.c -+++ b/drivers/net/usb/lan78xx.c -@@ -2674,7 +2674,7 @@ static void lan78xx_terminate_urbs(struct lan78xx_net *dev) - while (!skb_queue_empty(&dev->rxq) && - !skb_queue_empty(&dev->txq) && - !skb_queue_empty(&dev->done)) { -- schedule_timeout(msecs_to_jiffies(UNLINK_TIMEOUT_MS)); -+ schedule_msec_hrtimeout((UNLINK_TIMEOUT_MS)); - set_current_state(TASK_UNINTERRUPTIBLE); - netif_dbg(dev, ifdown, dev->net, - "waited for %d urb completions\n", temp); -diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c -index 72514c46b478..38fa9d1edc04 100644 ---- a/drivers/net/usb/usbnet.c -+++ b/drivers/net/usb/usbnet.c -@@ -759,7 +759,7 @@ static void wait_skb_queue_empty(struct sk_buff_head *q) - spin_lock_irqsave(&q->lock, flags); - while (!skb_queue_empty(q)) { - spin_unlock_irqrestore(&q->lock, flags); -- schedule_timeout(msecs_to_jiffies(UNLINK_TIMEOUT_MS)); -+ schedule_msec_hrtimeout((UNLINK_TIMEOUT_MS)); - set_current_state(TASK_UNINTERRUPTIBLE); - spin_lock_irqsave(&q->lock, flags); - } -diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c -index 311b0cc6eb98..97fb0cb1b97a 100644 ---- a/drivers/net/vrf.c -+++ b/drivers/net/vrf.c -@@ -165,23 +165,29 @@ static int vrf_ip6_local_out(struct net *net, struct sock *sk, - static netdev_tx_t vrf_process_v6_outbound(struct sk_buff *skb, - struct net_device *dev) - { -- const struct ipv6hdr *iph = ipv6_hdr(skb); -+ const struct ipv6hdr *iph; - struct net *net = dev_net(skb->dev); -- struct flowi6 fl6 = { -- /* needed to match OIF rule */ -- .flowi6_oif = dev->ifindex, -- .flowi6_iif = LOOPBACK_IFINDEX, -- .daddr = iph->daddr, -- .saddr = iph->saddr, -- .flowlabel = ip6_flowinfo(iph), -- .flowi6_mark = skb->mark, -- .flowi6_proto = iph->nexthdr, -- .flowi6_flags = FLOWI_FLAG_SKIP_NH_OIF, -- }; -+ struct flowi6 fl6; - int ret = NET_XMIT_DROP; - struct dst_entry *dst; - struct dst_entry *dst_null = &net->ipv6.ip6_null_entry->dst; - -+ if (!pskb_may_pull(skb, ETH_HLEN + sizeof(struct ipv6hdr))) -+ goto err; -+ -+ iph = ipv6_hdr(skb); -+ -+ memset(&fl6, 0, sizeof(fl6)); -+ /* needed to match OIF rule */ -+ fl6.flowi6_oif = dev->ifindex; -+ fl6.flowi6_iif = LOOPBACK_IFINDEX; -+ fl6.daddr = iph->daddr; -+ fl6.saddr = iph->saddr; -+ fl6.flowlabel = ip6_flowinfo(iph); -+ fl6.flowi6_mark = skb->mark; -+ fl6.flowi6_proto = iph->nexthdr; -+ fl6.flowi6_flags = FLOWI_FLAG_SKIP_NH_OIF; -+ - dst = ip6_route_output(net, NULL, &fl6); - if (dst == dst_null) - goto err; -@@ -237,21 +243,27 @@ static int vrf_ip_local_out(struct net *net, struct sock *sk, - static netdev_tx_t vrf_process_v4_outbound(struct sk_buff *skb, - struct net_device *vrf_dev) - { -- struct iphdr *ip4h = ip_hdr(skb); -+ struct iphdr *ip4h; - int ret = NET_XMIT_DROP; -- struct flowi4 fl4 = { -- /* needed to match OIF rule */ -- .flowi4_oif = vrf_dev->ifindex, -- .flowi4_iif = LOOPBACK_IFINDEX, -- .flowi4_tos = RT_TOS(ip4h->tos), -- .flowi4_flags = FLOWI_FLAG_ANYSRC | FLOWI_FLAG_SKIP_NH_OIF, -- .flowi4_proto = ip4h->protocol, -- .daddr = ip4h->daddr, -- .saddr = ip4h->saddr, -- }; -+ struct flowi4 fl4; - struct net *net = dev_net(vrf_dev); - struct rtable *rt; - -+ if (!pskb_may_pull(skb, ETH_HLEN + sizeof(struct iphdr))) -+ goto err; -+ -+ ip4h = ip_hdr(skb); -+ -+ memset(&fl4, 0, sizeof(fl4)); -+ /* needed to match OIF rule */ -+ fl4.flowi4_oif = vrf_dev->ifindex; -+ fl4.flowi4_iif = LOOPBACK_IFINDEX; -+ fl4.flowi4_tos = RT_TOS(ip4h->tos); -+ fl4.flowi4_flags = FLOWI_FLAG_ANYSRC | FLOWI_FLAG_SKIP_NH_OIF; -+ fl4.flowi4_proto = ip4h->protocol; -+ fl4.daddr = ip4h->daddr; -+ fl4.saddr = ip4h->saddr; -+ - rt = ip_route_output_flow(net, &fl4, NULL); - if (IS_ERR(rt)) - goto err; -diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c -index 083f3f0bf37f..b4283f52a09d 100644 ---- a/drivers/net/vxlan.c -+++ b/drivers/net/vxlan.c -@@ -804,6 +804,14 @@ static struct vxlan_fdb *vxlan_fdb_alloc(struct vxlan_dev *vxlan, - return f; - } - -+static void vxlan_fdb_insert(struct vxlan_dev *vxlan, const u8 *mac, -+ __be32 src_vni, struct vxlan_fdb *f) -+{ -+ ++vxlan->addrcnt; -+ hlist_add_head_rcu(&f->hlist, -+ vxlan_fdb_head(vxlan, mac, src_vni)); -+} -+ - static int vxlan_fdb_create(struct vxlan_dev *vxlan, - const u8 *mac, union vxlan_addr *ip, - __u16 state, __be16 port, __be32 src_vni, -@@ -829,18 +837,13 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan, - return rc; - } - -- ++vxlan->addrcnt; -- hlist_add_head_rcu(&f->hlist, -- vxlan_fdb_head(vxlan, mac, src_vni)); -- - *fdb = f; - - return 0; - } - --static void vxlan_fdb_free(struct rcu_head *head) -+static void __vxlan_fdb_free(struct vxlan_fdb *f) - { -- struct vxlan_fdb *f = container_of(head, struct vxlan_fdb, rcu); - struct vxlan_rdst *rd, *nd; - - list_for_each_entry_safe(rd, nd, &f->remotes, list) { -@@ -850,6 +853,13 @@ static void vxlan_fdb_free(struct rcu_head *head) - kfree(f); - } - -+static void vxlan_fdb_free(struct rcu_head *head) -+{ -+ struct vxlan_fdb *f = container_of(head, struct vxlan_fdb, rcu); -+ -+ __vxlan_fdb_free(f); -+} -+ - static void vxlan_fdb_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f, - bool do_notify, bool swdev_notify) - { -@@ -977,6 +987,7 @@ static int vxlan_fdb_update_create(struct vxlan_dev *vxlan, - if (rc < 0) - return rc; - -+ vxlan_fdb_insert(vxlan, mac, src_vni, f); - rc = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_NEWNEIGH, - swdev_notify, extack); - if (rc) -@@ -3571,12 +3582,17 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev, - if (err) - goto errout; - -- /* notify default fdb entry */ - if (f) { -+ vxlan_fdb_insert(vxlan, all_zeros_mac, -+ vxlan->default_dst.remote_vni, f); -+ -+ /* notify default fdb entry */ - err = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), - RTM_NEWNEIGH, true, extack); -- if (err) -- goto errout; -+ if (err) { -+ vxlan_fdb_destroy(vxlan, f, false, false); -+ goto unregister; -+ } - } - - list_add(&vxlan->next, &vn->vxlan_list); -@@ -3588,7 +3604,8 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev, - * destroy the entry by hand here. - */ - if (f) -- vxlan_fdb_destroy(vxlan, f, false, false); -+ __vxlan_fdb_free(f); -+unregister: - if (unregister) - unregister_netdevice(dev); - return err; -diff --git a/drivers/net/wireless/ath/ath10k/debugfs_sta.c b/drivers/net/wireless/ath/ath10k/debugfs_sta.c -index c704ae371c4d..42931a669b02 100644 ---- a/drivers/net/wireless/ath/ath10k/debugfs_sta.c -+++ b/drivers/net/wireless/ath/ath10k/debugfs_sta.c -@@ -663,6 +663,13 @@ static ssize_t ath10k_dbg_sta_dump_tx_stats(struct file *file, - - mutex_lock(&ar->conf_mutex); - -+ if (!arsta->tx_stats) { -+ ath10k_warn(ar, "failed to get tx stats"); -+ mutex_unlock(&ar->conf_mutex); -+ kfree(buf); -+ return 0; -+ } -+ - spin_lock_bh(&ar->data_lock); - for (k = 0; k < ATH10K_STATS_TYPE_MAX; k++) { - for (j = 0; j < ATH10K_COUNTER_TYPE_MAX; j++) { -diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c -index 1acc622d2183..f22840bbc389 100644 ---- a/drivers/net/wireless/ath/ath10k/htt_rx.c -+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c -@@ -2277,7 +2277,9 @@ static void ath10k_htt_rx_tx_compl_ind(struct ath10k *ar, - * Note that with only one concurrent reader and one concurrent - * writer, you don't need extra locking to use these macro. - */ -- if (!kfifo_put(&htt->txdone_fifo, tx_done)) { -+ if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) { -+ ath10k_txrx_tx_unref(htt, &tx_done); -+ } else if (!kfifo_put(&htt->txdone_fifo, tx_done)) { - ath10k_warn(ar, "txdone fifo overrun, msdu_id %d status %d\n", - tx_done.msdu_id, tx_done.status); - ath10k_txrx_tx_unref(htt, &tx_done); -diff --git a/drivers/net/wireless/ath/ath10k/hw.c b/drivers/net/wireless/ath/ath10k/hw.c -index ad082b7d7643..b242085c3c16 100644 ---- a/drivers/net/wireless/ath/ath10k/hw.c -+++ b/drivers/net/wireless/ath/ath10k/hw.c -@@ -158,7 +158,7 @@ const struct ath10k_hw_values qca6174_values = { - }; - - const struct ath10k_hw_values qca99x0_values = { -- .rtc_state_val_on = 5, -+ .rtc_state_val_on = 7, - .ce_count = 12, - .msi_assign_ce_max = 12, - .num_target_ce_config_wlan = 10, -diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c -index 9c703d287333..b500fd427595 100644 ---- a/drivers/net/wireless/ath/ath10k/mac.c -+++ b/drivers/net/wireless/ath/ath10k/mac.c -@@ -1630,6 +1630,10 @@ static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif) - if (arvif->vdev_type != WMI_VDEV_TYPE_AP) - return 0; - -+ /* For mesh, probe response and beacon share the same template */ -+ if (ieee80211_vif_is_mesh(vif)) -+ return 0; -+ - prb = ieee80211_proberesp_get(hw, vif); - if (!prb) { - ath10k_warn(ar, "failed to get probe resp template from mac80211\n"); -@@ -5588,8 +5592,8 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw, - struct cfg80211_chan_def def; - u32 vdev_param, pdev_param, slottime, preamble; - u16 bitrate, hw_value; -- u8 rate, basic_rate_idx; -- int rateidx, ret = 0, hw_rate_code; -+ u8 rate, basic_rate_idx, rateidx; -+ int ret = 0, hw_rate_code, mcast_rate; - enum nl80211_band band; - const struct ieee80211_supported_band *sband; - -@@ -5776,7 +5780,11 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw, - if (changed & BSS_CHANGED_MCAST_RATE && - !ath10k_mac_vif_chan(arvif->vif, &def)) { - band = def.chan->band; -- rateidx = vif->bss_conf.mcast_rate[band] - 1; -+ mcast_rate = vif->bss_conf.mcast_rate[band]; -+ if (mcast_rate > 0) -+ rateidx = mcast_rate - 1; -+ else -+ rateidx = ffs(vif->bss_conf.basic_rates) - 1; - - if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) - rateidx += ATH10K_MAC_FIRST_OFDM_RATE_IDX; -diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c -index 2c27f407a851..6e5f7ae00253 100644 ---- a/drivers/net/wireless/ath/ath10k/pci.c -+++ b/drivers/net/wireless/ath/ath10k/pci.c -@@ -2059,6 +2059,11 @@ static void ath10k_pci_hif_stop(struct ath10k *ar) - - ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot hif stop\n"); - -+ ath10k_pci_irq_disable(ar); -+ ath10k_pci_irq_sync(ar); -+ napi_synchronize(&ar->napi); -+ napi_disable(&ar->napi); -+ - /* Most likely the device has HTT Rx ring configured. The only way to - * prevent the device from accessing (and possible corrupting) host - * memory is to reset the chip now. -@@ -2072,10 +2077,6 @@ static void ath10k_pci_hif_stop(struct ath10k *ar) - */ - ath10k_pci_safe_chip_reset(ar); - -- ath10k_pci_irq_disable(ar); -- ath10k_pci_irq_sync(ar); -- napi_synchronize(&ar->napi); -- napi_disable(&ar->napi); - ath10k_pci_flush(ar); - - spin_lock_irqsave(&ar_pci->ps_lock, flags); -diff --git a/drivers/net/wireless/ath/ath10k/qmi.c b/drivers/net/wireless/ath/ath10k/qmi.c -index a7bc2c70d076..8f8f717a23ee 100644 ---- a/drivers/net/wireless/ath/ath10k/qmi.c -+++ b/drivers/net/wireless/ath/ath10k/qmi.c -@@ -1002,6 +1002,7 @@ int ath10k_qmi_deinit(struct ath10k *ar) - qmi_handle_release(&qmi->qmi_hdl); - cancel_work_sync(&qmi->event_work); - destroy_workqueue(qmi->event_wq); -+ kfree(qmi); - ar_snoc->qmi = NULL; - - return 0; -diff --git a/drivers/net/wireless/ath/ath10k/sdio.c b/drivers/net/wireless/ath/ath10k/sdio.c -index fae56c67766f..28bdf0212538 100644 ---- a/drivers/net/wireless/ath/ath10k/sdio.c -+++ b/drivers/net/wireless/ath/ath10k/sdio.c -@@ -602,6 +602,10 @@ static int ath10k_sdio_mbox_rx_alloc(struct ath10k *ar, - full_len, - last_in_bundle, - last_in_bundle); -+ if (ret) { -+ ath10k_warn(ar, "alloc_rx_pkt error %d\n", ret); -+ goto err; -+ } - } - - ar_sdio->n_rx_pkts = i; -@@ -2077,6 +2081,9 @@ static void ath10k_sdio_remove(struct sdio_func *func) - cancel_work_sync(&ar_sdio->wr_async_work); - ath10k_core_unregister(ar); - ath10k_core_destroy(ar); -+ -+ flush_workqueue(ar_sdio->workqueue); -+ destroy_workqueue(ar_sdio->workqueue); - } - - static const struct sdio_device_id ath10k_sdio_devices[] = { -diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c -index c5818d28f55a..4102df016931 100644 ---- a/drivers/net/wireless/ath/ath10k/txrx.c -+++ b/drivers/net/wireless/ath/ath10k/txrx.c -@@ -150,6 +150,9 @@ struct ath10k_peer *ath10k_peer_find_by_id(struct ath10k *ar, int peer_id) - { - struct ath10k_peer *peer; - -+ if (peer_id >= BITS_PER_TYPE(peer->peer_ids)) -+ return NULL; -+ - lockdep_assert_held(&ar->data_lock); - - list_for_each_entry(peer, &ar->peers, list) -diff --git a/drivers/net/wireless/ath/ath10k/usb.c b/drivers/net/wireless/ath/ath10k/usb.c -index 970cf69ac35f..a3ecf7d77949 100644 ---- a/drivers/net/wireless/ath/ath10k/usb.c -+++ b/drivers/net/wireless/ath/ath10k/usb.c -@@ -1016,7 +1016,7 @@ static int ath10k_usb_probe(struct usb_interface *interface, - } - - /* TODO: remove this once USB support is fully implemented */ -- ath10k_warn(ar, "WARNING: ath10k USB support is incomplete, don't expect anything to work!\n"); -+ ath10k_warn(ar, "Warning: ath10k USB support is incomplete, don't expect anything to work!\n"); - - return 0; - -diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c -index 582fb11f648a..02709fc99034 100644 ---- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c -+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c -@@ -2840,8 +2840,10 @@ ath10k_wmi_tlv_op_gen_mgmt_tx_send(struct ath10k *ar, struct sk_buff *msdu, - if ((ieee80211_is_action(hdr->frame_control) || - ieee80211_is_deauth(hdr->frame_control) || - ieee80211_is_disassoc(hdr->frame_control)) && -- ieee80211_has_protected(hdr->frame_control)) -+ ieee80211_has_protected(hdr->frame_control)) { -+ skb_put(msdu, IEEE80211_CCMP_MIC_LEN); - buf_len += IEEE80211_CCMP_MIC_LEN; -+ } - - buf_len = min_t(u32, buf_len, WMI_TLV_MGMT_TX_FRAME_MAX_LEN); - buf_len = round_up(buf_len, 4); -diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h -index e1c40bb69932..12f57f9adbba 100644 ---- a/drivers/net/wireless/ath/ath10k/wmi.h -+++ b/drivers/net/wireless/ath/ath10k/wmi.h -@@ -4535,9 +4535,10 @@ enum wmi_10_4_stats_id { - }; - - enum wmi_tlv_stats_id { -- WMI_TLV_STAT_PDEV = BIT(0), -- WMI_TLV_STAT_VDEV = BIT(1), -- WMI_TLV_STAT_PEER = BIT(2), -+ WMI_TLV_STAT_PEER = BIT(0), -+ WMI_TLV_STAT_AP = BIT(1), -+ WMI_TLV_STAT_PDEV = BIT(2), -+ WMI_TLV_STAT_VDEV = BIT(3), - WMI_TLV_STAT_PEER_EXTD = BIT(10), - }; - -diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c -index 68854c45d0a4..9ab6aa9ded5c 100644 ---- a/drivers/net/wireless/ath/ath6kl/wmi.c -+++ b/drivers/net/wireless/ath/ath6kl/wmi.c -@@ -1176,6 +1176,10 @@ static int ath6kl_wmi_pstream_timeout_event_rx(struct wmi *wmi, u8 *datap, - return -EINVAL; - - ev = (struct wmi_pstream_timeout_event *) datap; -+ if (ev->traffic_class >= WMM_NUM_AC) { -+ ath6kl_err("invalid traffic class: %d\n", ev->traffic_class); -+ return -EINVAL; -+ } - - /* - * When the pstream (fat pipe == AC) timesout, it means there were -@@ -1517,6 +1521,10 @@ static int ath6kl_wmi_cac_event_rx(struct wmi *wmi, u8 *datap, int len, - return -EINVAL; - - reply = (struct wmi_cac_event *) datap; -+ if (reply->ac >= WMM_NUM_AC) { -+ ath6kl_err("invalid AC: %d\n", reply->ac); -+ return -EINVAL; -+ } - - if ((reply->cac_indication == CAC_INDICATION_ADMISSION_RESP) && - (reply->status_code != IEEE80211_TSPEC_STATUS_ADMISS_ACCEPTED)) { -@@ -2633,7 +2641,7 @@ int ath6kl_wmi_delete_pstream_cmd(struct wmi *wmi, u8 if_idx, u8 traffic_class, - u16 active_tsids = 0; - int ret; - -- if (traffic_class > 3) { -+ if (traffic_class >= WMM_NUM_AC) { - ath6kl_err("invalid traffic class: %d\n", traffic_class); - return -EINVAL; - } -diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c -index 8581d917635a..b6773d613f0c 100644 ---- a/drivers/net/wireless/ath/ath9k/hw.c -+++ b/drivers/net/wireless/ath/ath9k/hw.c -@@ -252,8 +252,9 @@ void ath9k_hw_get_channel_centers(struct ath_hw *ah, - /* Chip Revisions */ - /******************/ - --static void ath9k_hw_read_revisions(struct ath_hw *ah) -+static bool ath9k_hw_read_revisions(struct ath_hw *ah) - { -+ u32 srev; - u32 val; - - if (ah->get_mac_revision) -@@ -269,25 +270,33 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah) - val = REG_READ(ah, AR_SREV); - ah->hw_version.macRev = MS(val, AR_SREV_REVISION2); - } -- return; -+ return true; - case AR9300_DEVID_AR9340: - ah->hw_version.macVersion = AR_SREV_VERSION_9340; -- return; -+ return true; - case AR9300_DEVID_QCA955X: - ah->hw_version.macVersion = AR_SREV_VERSION_9550; -- return; -+ return true; - case AR9300_DEVID_AR953X: - ah->hw_version.macVersion = AR_SREV_VERSION_9531; -- return; -+ return true; - case AR9300_DEVID_QCA956X: - ah->hw_version.macVersion = AR_SREV_VERSION_9561; -- return; -+ return true; - } - -- val = REG_READ(ah, AR_SREV) & AR_SREV_ID; -+ srev = REG_READ(ah, AR_SREV); -+ -+ if (srev == -EIO) { -+ ath_err(ath9k_hw_common(ah), -+ "Failed to read SREV register"); -+ return false; -+ } -+ -+ val = srev & AR_SREV_ID; - - if (val == 0xFF) { -- val = REG_READ(ah, AR_SREV); -+ val = srev; - ah->hw_version.macVersion = - (val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S; - ah->hw_version.macRev = MS(val, AR_SREV_REVISION2); -@@ -306,6 +315,8 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah) - if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE) - ah->is_pciexpress = true; - } -+ -+ return true; - } - - /************************************/ -@@ -559,7 +570,10 @@ static int __ath9k_hw_init(struct ath_hw *ah) - struct ath_common *common = ath9k_hw_common(ah); - int r = 0; - -- ath9k_hw_read_revisions(ah); -+ if (!ath9k_hw_read_revisions(ah)) { -+ ath_err(common, "Could not read hardware revisions"); -+ return -EOPNOTSUPP; -+ } - - switch (ah->hw_version.macVersion) { - case AR_SREV_VERSION_5416_PCI: -diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c -index 4e97f7f3b2a3..06e660858766 100644 ---- a/drivers/net/wireless/ath/ath9k/recv.c -+++ b/drivers/net/wireless/ath/ath9k/recv.c -@@ -815,6 +815,7 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc, - struct ath_common *common = ath9k_hw_common(ah); - struct ieee80211_hdr *hdr; - bool discard_current = sc->rx.discard_next; -+ bool is_phyerr; - - /* - * Discard corrupt descriptors which are marked in -@@ -827,8 +828,11 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc, - - /* - * Discard zero-length packets and packets smaller than an ACK -+ * which are not PHY_ERROR (short radar pulses have a length of 3) - */ -- if (rx_stats->rs_datalen < 10) { -+ is_phyerr = rx_stats->rs_status & ATH9K_RXERR_PHY; -+ if (!rx_stats->rs_datalen || -+ (rx_stats->rs_datalen < 10 && !is_phyerr)) { - RX_STAT_INC(sc, rx_len_err); - goto corrupt; - } -diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c -index b17e1ca40995..3be0aeedb9b5 100644 ---- a/drivers/net/wireless/ath/ath9k/xmit.c -+++ b/drivers/net/wireless/ath/ath9k/xmit.c -@@ -668,7 +668,8 @@ static bool bf_is_ampdu_not_probing(struct ath_buf *bf) - static void ath_tx_count_airtime(struct ath_softc *sc, - struct ieee80211_sta *sta, - struct ath_buf *bf, -- struct ath_tx_status *ts) -+ struct ath_tx_status *ts, -+ u8 tid) - { - u32 airtime = 0; - int i; -@@ -679,7 +680,7 @@ static void ath_tx_count_airtime(struct ath_softc *sc, - airtime += rate_dur * bf->rates[i].count; - } - -- ieee80211_sta_register_airtime(sta, ts->tid, airtime, 0); -+ ieee80211_sta_register_airtime(sta, tid, airtime, 0); - } - - static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq, -@@ -709,7 +710,7 @@ static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq, - if (sta) { - struct ath_node *an = (struct ath_node *)sta->drv_priv; - tid = ath_get_skb_tid(sc, an, bf->bf_mpdu); -- ath_tx_count_airtime(sc, sta, bf, ts); -+ ath_tx_count_airtime(sc, sta, bf, ts, tid->tidno); - if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY)) - tid->clear_ps_filter = true; - } -diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c -index e7c3f3b8457d..99f1897a775d 100644 ---- a/drivers/net/wireless/ath/carl9170/usb.c -+++ b/drivers/net/wireless/ath/carl9170/usb.c -@@ -128,6 +128,8 @@ static const struct usb_device_id carl9170_usb_ids[] = { - }; - MODULE_DEVICE_TABLE(usb, carl9170_usb_ids); - -+static struct usb_driver carl9170_driver; -+ - static void carl9170_usb_submit_data_urb(struct ar9170 *ar) - { - struct urb *urb; -@@ -966,32 +968,28 @@ static int carl9170_usb_init_device(struct ar9170 *ar) - - static void carl9170_usb_firmware_failed(struct ar9170 *ar) - { -- struct device *parent = ar->udev->dev.parent; -- struct usb_device *udev; -- -- /* -- * Store a copy of the usb_device pointer locally. -- * This is because device_release_driver initiates -- * carl9170_usb_disconnect, which in turn frees our -- * driver context (ar). -+ /* Store a copies of the usb_interface and usb_device pointer locally. -+ * This is because release_driver initiates carl9170_usb_disconnect, -+ * which in turn frees our driver context (ar). - */ -- udev = ar->udev; -+ struct usb_interface *intf = ar->intf; -+ struct usb_device *udev = ar->udev; - - complete(&ar->fw_load_wait); -+ /* at this point 'ar' could be already freed. Don't use it anymore */ -+ ar = NULL; - - /* unbind anything failed */ -- if (parent) -- device_lock(parent); -- -- device_release_driver(&udev->dev); -- if (parent) -- device_unlock(parent); -+ usb_lock_device(udev); -+ usb_driver_release_interface(&carl9170_driver, intf); -+ usb_unlock_device(udev); - -- usb_put_dev(udev); -+ usb_put_intf(intf); - } - - static void carl9170_usb_firmware_finish(struct ar9170 *ar) - { -+ struct usb_interface *intf = ar->intf; - int err; - - err = carl9170_parse_firmware(ar); -@@ -1009,7 +1007,7 @@ static void carl9170_usb_firmware_finish(struct ar9170 *ar) - goto err_unrx; - - complete(&ar->fw_load_wait); -- usb_put_dev(ar->udev); -+ usb_put_intf(intf); - return; - - err_unrx: -@@ -1052,7 +1050,6 @@ static int carl9170_usb_probe(struct usb_interface *intf, - return PTR_ERR(ar); - - udev = interface_to_usbdev(intf); -- usb_get_dev(udev); - ar->udev = udev; - ar->intf = intf; - ar->features = id->driver_info; -@@ -1094,15 +1091,14 @@ static int carl9170_usb_probe(struct usb_interface *intf, - atomic_set(&ar->rx_anch_urbs, 0); - atomic_set(&ar->rx_pool_urbs, 0); - -- usb_get_dev(ar->udev); -+ usb_get_intf(intf); - - carl9170_set_state(ar, CARL9170_STOPPED); - - err = request_firmware_nowait(THIS_MODULE, 1, CARL9170FW_NAME, - &ar->udev->dev, GFP_KERNEL, ar, carl9170_usb_firmware_step2); - if (err) { -- usb_put_dev(udev); -- usb_put_dev(udev); -+ usb_put_intf(intf); - carl9170_free(ar); - } - return err; -@@ -1131,7 +1127,6 @@ static void carl9170_usb_disconnect(struct usb_interface *intf) - - carl9170_release_firmware(ar); - carl9170_free(ar); -- usb_put_dev(udev); - } - - #ifdef CONFIG_PM -diff --git a/drivers/net/wireless/ath/dfs_pattern_detector.c b/drivers/net/wireless/ath/dfs_pattern_detector.c -index d52b31b45df7..a274eb0d1968 100644 ---- a/drivers/net/wireless/ath/dfs_pattern_detector.c -+++ b/drivers/net/wireless/ath/dfs_pattern_detector.c -@@ -111,7 +111,7 @@ static const struct radar_detector_specs jp_radar_ref_types[] = { - JP_PATTERN(0, 0, 1, 1428, 1428, 1, 18, 29, false), - JP_PATTERN(1, 2, 3, 3846, 3846, 1, 18, 29, false), - JP_PATTERN(2, 0, 1, 1388, 1388, 1, 18, 50, false), -- JP_PATTERN(3, 1, 2, 4000, 4000, 1, 18, 50, false), -+ JP_PATTERN(3, 0, 4, 4000, 4000, 1, 18, 50, false), - JP_PATTERN(4, 0, 5, 150, 230, 1, 23, 50, false), - JP_PATTERN(5, 6, 10, 200, 500, 1, 16, 50, false), - JP_PATTERN(6, 11, 20, 200, 500, 1, 12, 50, false), -diff --git a/drivers/net/wireless/ath/wil6210/interrupt.c b/drivers/net/wireless/ath/wil6210/interrupt.c -index 3f5bd177d55f..b00a13d6d530 100644 ---- a/drivers/net/wireless/ath/wil6210/interrupt.c -+++ b/drivers/net/wireless/ath/wil6210/interrupt.c -@@ -296,21 +296,24 @@ void wil_configure_interrupt_moderation(struct wil6210_priv *wil) - static irqreturn_t wil6210_irq_rx(int irq, void *cookie) - { - struct wil6210_priv *wil = cookie; -- u32 isr = wil_ioread32_and_clear(wil->csr + -- HOSTADDR(RGF_DMA_EP_RX_ICR) + -- offsetof(struct RGF_ICR, ICR)); -+ u32 isr; - bool need_unmask = true; - -+ wil6210_mask_irq_rx(wil); -+ -+ isr = wil_ioread32_and_clear(wil->csr + -+ HOSTADDR(RGF_DMA_EP_RX_ICR) + -+ offsetof(struct RGF_ICR, ICR)); -+ - trace_wil6210_irq_rx(isr); - wil_dbg_irq(wil, "ISR RX 0x%08x\n", isr); - - if (unlikely(!isr)) { - wil_err_ratelimited(wil, "spurious IRQ: RX\n"); -+ wil6210_unmask_irq_rx(wil); - return IRQ_NONE; - } - -- wil6210_mask_irq_rx(wil); -- - /* RX_DONE and RX_HTRSH interrupts are the same if interrupt - * moderation is not used. Interrupt moderation may cause RX - * buffer overflow while RX_DONE is delayed. The required -@@ -355,21 +358,24 @@ static irqreturn_t wil6210_irq_rx(int irq, void *cookie) - static irqreturn_t wil6210_irq_rx_edma(int irq, void *cookie) - { - struct wil6210_priv *wil = cookie; -- u32 isr = wil_ioread32_and_clear(wil->csr + -- HOSTADDR(RGF_INT_GEN_RX_ICR) + -- offsetof(struct RGF_ICR, ICR)); -+ u32 isr; - bool need_unmask = true; - -+ wil6210_mask_irq_rx_edma(wil); -+ -+ isr = wil_ioread32_and_clear(wil->csr + -+ HOSTADDR(RGF_INT_GEN_RX_ICR) + -+ offsetof(struct RGF_ICR, ICR)); -+ - trace_wil6210_irq_rx(isr); - wil_dbg_irq(wil, "ISR RX 0x%08x\n", isr); - - if (unlikely(!isr)) { - wil_err(wil, "spurious IRQ: RX\n"); -+ wil6210_unmask_irq_rx_edma(wil); - return IRQ_NONE; - } - -- wil6210_mask_irq_rx_edma(wil); -- - if (likely(isr & BIT_RX_STATUS_IRQ)) { - wil_dbg_irq(wil, "RX status ring\n"); - isr &= ~BIT_RX_STATUS_IRQ; -@@ -403,21 +409,24 @@ static irqreturn_t wil6210_irq_rx_edma(int irq, void *cookie) - static irqreturn_t wil6210_irq_tx_edma(int irq, void *cookie) - { - struct wil6210_priv *wil = cookie; -- u32 isr = wil_ioread32_and_clear(wil->csr + -- HOSTADDR(RGF_INT_GEN_TX_ICR) + -- offsetof(struct RGF_ICR, ICR)); -+ u32 isr; - bool need_unmask = true; - -+ wil6210_mask_irq_tx_edma(wil); -+ -+ isr = wil_ioread32_and_clear(wil->csr + -+ HOSTADDR(RGF_INT_GEN_TX_ICR) + -+ offsetof(struct RGF_ICR, ICR)); -+ - trace_wil6210_irq_tx(isr); - wil_dbg_irq(wil, "ISR TX 0x%08x\n", isr); - - if (unlikely(!isr)) { - wil_err(wil, "spurious IRQ: TX\n"); -+ wil6210_unmask_irq_tx_edma(wil); - return IRQ_NONE; - } - -- wil6210_mask_irq_tx_edma(wil); -- - if (likely(isr & BIT_TX_STATUS_IRQ)) { - wil_dbg_irq(wil, "TX status ring\n"); - isr &= ~BIT_TX_STATUS_IRQ; -@@ -446,21 +455,24 @@ static irqreturn_t wil6210_irq_tx_edma(int irq, void *cookie) - static irqreturn_t wil6210_irq_tx(int irq, void *cookie) - { - struct wil6210_priv *wil = cookie; -- u32 isr = wil_ioread32_and_clear(wil->csr + -- HOSTADDR(RGF_DMA_EP_TX_ICR) + -- offsetof(struct RGF_ICR, ICR)); -+ u32 isr; - bool need_unmask = true; - -+ wil6210_mask_irq_tx(wil); -+ -+ isr = wil_ioread32_and_clear(wil->csr + -+ HOSTADDR(RGF_DMA_EP_TX_ICR) + -+ offsetof(struct RGF_ICR, ICR)); -+ - trace_wil6210_irq_tx(isr); - wil_dbg_irq(wil, "ISR TX 0x%08x\n", isr); - - if (unlikely(!isr)) { - wil_err_ratelimited(wil, "spurious IRQ: TX\n"); -+ wil6210_unmask_irq_tx(wil); - return IRQ_NONE; - } - -- wil6210_mask_irq_tx(wil); -- - if (likely(isr & BIT_DMA_EP_TX_ICR_TX_DONE)) { - wil_dbg_irq(wil, "TX done\n"); - isr &= ~BIT_DMA_EP_TX_ICR_TX_DONE; -@@ -532,20 +544,23 @@ static bool wil_validate_mbox_regs(struct wil6210_priv *wil) - static irqreturn_t wil6210_irq_misc(int irq, void *cookie) - { - struct wil6210_priv *wil = cookie; -- u32 isr = wil_ioread32_and_clear(wil->csr + -- HOSTADDR(RGF_DMA_EP_MISC_ICR) + -- offsetof(struct RGF_ICR, ICR)); -+ u32 isr; -+ -+ wil6210_mask_irq_misc(wil, false); -+ -+ isr = wil_ioread32_and_clear(wil->csr + -+ HOSTADDR(RGF_DMA_EP_MISC_ICR) + -+ offsetof(struct RGF_ICR, ICR)); - - trace_wil6210_irq_misc(isr); - wil_dbg_irq(wil, "ISR MISC 0x%08x\n", isr); - - if (!isr) { - wil_err(wil, "spurious IRQ: MISC\n"); -+ wil6210_unmask_irq_misc(wil, false); - return IRQ_NONE; - } - -- wil6210_mask_irq_misc(wil, false); -- - if (isr & ISR_MISC_FW_ERROR) { - u32 fw_assert_code = wil_r(wil, wil->rgf_fw_assert_code_addr); - u32 ucode_assert_code = -@@ -580,7 +595,7 @@ static irqreturn_t wil6210_irq_misc(int irq, void *cookie) - /* no need to handle HALP ICRs until next vote */ - wil->halp.handle_icr = false; - wil_dbg_irq(wil, "irq_misc: HALP IRQ invoked\n"); -- wil6210_mask_halp(wil); -+ wil6210_mask_irq_misc(wil, true); - complete(&wil->halp.comp); - } - } -diff --git a/drivers/net/wireless/ath/wil6210/txrx.c b/drivers/net/wireless/ath/wil6210/txrx.c -index 4ccfd1404458..d74837cce67f 100644 ---- a/drivers/net/wireless/ath/wil6210/txrx.c -+++ b/drivers/net/wireless/ath/wil6210/txrx.c -@@ -750,6 +750,7 @@ void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev) - [GRO_HELD] = "GRO_HELD", - [GRO_NORMAL] = "GRO_NORMAL", - [GRO_DROP] = "GRO_DROP", -+ [GRO_CONSUMED] = "GRO_CONSUMED", - }; - - wil->txrx_ops.get_netif_rx_params(skb, &cid, &security); -diff --git a/drivers/net/wireless/ath/wil6210/wmi.c b/drivers/net/wireless/ath/wil6210/wmi.c -index d89cd41e78ac..89a75ff29410 100644 ---- a/drivers/net/wireless/ath/wil6210/wmi.c -+++ b/drivers/net/wireless/ath/wil6210/wmi.c -@@ -3220,7 +3220,18 @@ static void wmi_event_handle(struct wil6210_priv *wil, - /* check if someone waits for this event */ - if (wil->reply_id && wil->reply_id == id && - wil->reply_mid == mid) { -- WARN_ON(wil->reply_buf); -+ if (wil->reply_buf) { -+ /* event received while wmi_call is waiting -+ * with a buffer. Such event should be handled -+ * in wmi_recv_cmd function. Handling the event -+ * here means a previous wmi_call was timeout. -+ * Drop the event and do not handle it. -+ */ -+ wil_err(wil, -+ "Old event (%d, %s) while wmi_call is waiting. Drop it and Continue waiting\n", -+ id, eventid2name(id)); -+ return; -+ } - - wmi_evt_call_handler(vif, id, evt_data, - len - sizeof(*wmi)); -diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2100.c b/drivers/net/wireless/intel/ipw2x00/ipw2100.c -index 75c0c29d81f0..f2e9872e2fcc 100644 ---- a/drivers/net/wireless/intel/ipw2x00/ipw2100.c -+++ b/drivers/net/wireless/intel/ipw2x00/ipw2100.c -@@ -816,7 +816,7 @@ static int ipw2100_hw_send_command(struct ipw2100_priv *priv, - * doesn't seem to have as many firmware restart cycles... - * - * As a test, we're sticking in a 1/100s delay here */ -- schedule_timeout_uninterruptible(msecs_to_jiffies(10)); -+ schedule_msec_hrtimeout_uninterruptible((10)); - - return 0; - -@@ -1267,7 +1267,7 @@ static int ipw2100_start_adapter(struct ipw2100_priv *priv) - IPW_DEBUG_FW("Waiting for f/w initialization to complete...\n"); - i = 5000; - do { -- schedule_timeout_uninterruptible(msecs_to_jiffies(40)); -+ schedule_msec_hrtimeout_uninterruptible((40)); - /* Todo... wait for sync command ... */ - - read_register(priv->net_dev, IPW_REG_INTA, &inta); -diff --git a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c -index 405038ce98d6..7573af2d88ce 100644 ---- a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c -+++ b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c -@@ -97,7 +97,7 @@ IWL_EXPORT_SYMBOL(iwl_acpi_get_object); - - union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev, - union acpi_object *data, -- int data_size) -+ int data_size, int *tbl_rev) - { - int i; - union acpi_object *wifi_pkg; -@@ -113,16 +113,19 @@ union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev, - /* - * We need at least two packages, one for the revision and one - * for the data itself. Also check that the revision is valid -- * (i.e. it is an integer set to 0). -+ * (i.e. it is an integer smaller than 2, as we currently support only -+ * 2 revisions). - */ - if (data->type != ACPI_TYPE_PACKAGE || - data->package.count < 2 || - data->package.elements[0].type != ACPI_TYPE_INTEGER || -- data->package.elements[0].integer.value != 0) { -+ data->package.elements[0].integer.value > 1) { - IWL_DEBUG_DEV_RADIO(dev, "Unsupported packages structure\n"); - return ERR_PTR(-EINVAL); - } - -+ *tbl_rev = data->package.elements[0].integer.value; -+ - /* loop through all the packages to find the one for WiFi */ - for (i = 1; i < data->package.count; i++) { - union acpi_object *domain; -@@ -151,14 +154,15 @@ int iwl_acpi_get_mcc(struct device *dev, char *mcc) - { - union acpi_object *wifi_pkg, *data; - u32 mcc_val; -- int ret; -+ int ret, tbl_rev; - - data = iwl_acpi_get_object(dev, ACPI_WRDD_METHOD); - if (IS_ERR(data)) - return PTR_ERR(data); - -- wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_WRDD_WIFI_DATA_SIZE); -- if (IS_ERR(wifi_pkg)) { -+ wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_WRDD_WIFI_DATA_SIZE, -+ &tbl_rev); -+ if (IS_ERR(wifi_pkg) || tbl_rev != 0) { - ret = PTR_ERR(wifi_pkg); - goto out_free; - } -@@ -185,6 +189,7 @@ u64 iwl_acpi_get_pwr_limit(struct device *dev) - { - union acpi_object *data, *wifi_pkg; - u64 dflt_pwr_limit; -+ int tbl_rev; - - data = iwl_acpi_get_object(dev, ACPI_SPLC_METHOD); - if (IS_ERR(data)) { -@@ -193,8 +198,8 @@ u64 iwl_acpi_get_pwr_limit(struct device *dev) - } - - wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, -- ACPI_SPLC_WIFI_DATA_SIZE); -- if (IS_ERR(wifi_pkg) || -+ ACPI_SPLC_WIFI_DATA_SIZE, &tbl_rev); -+ if (IS_ERR(wifi_pkg) || tbl_rev != 0 || - wifi_pkg->package.elements[1].integer.value != ACPI_TYPE_INTEGER) { - dflt_pwr_limit = 0; - goto out_free; -@@ -211,14 +216,15 @@ IWL_EXPORT_SYMBOL(iwl_acpi_get_pwr_limit); - int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk) - { - union acpi_object *wifi_pkg, *data; -- int ret; -+ int ret, tbl_rev; - - data = iwl_acpi_get_object(dev, ACPI_ECKV_METHOD); - if (IS_ERR(data)) - return PTR_ERR(data); - -- wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_ECKV_WIFI_DATA_SIZE); -- if (IS_ERR(wifi_pkg)) { -+ wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_ECKV_WIFI_DATA_SIZE, -+ &tbl_rev); -+ if (IS_ERR(wifi_pkg) || tbl_rev != 0) { - ret = PTR_ERR(wifi_pkg); - goto out_free; - } -diff --git a/drivers/net/wireless/intel/iwlwifi/fw/acpi.h b/drivers/net/wireless/intel/iwlwifi/fw/acpi.h -index f5704e16643f..991a23450999 100644 ---- a/drivers/net/wireless/intel/iwlwifi/fw/acpi.h -+++ b/drivers/net/wireless/intel/iwlwifi/fw/acpi.h -@@ -97,7 +97,7 @@ - void *iwl_acpi_get_object(struct device *dev, acpi_string method); - union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev, - union acpi_object *data, -- int data_size); -+ int data_size, int *tbl_rev); - - /** - * iwl_acpi_get_mcc - read MCC from ACPI, if available -@@ -131,7 +131,8 @@ static inline void *iwl_acpi_get_object(struct device *dev, acpi_string method) - - static inline union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev, - union acpi_object *data, -- int data_size) -+ int data_size, -+ int *tbl_rev) - { - return ERR_PTR(-ENOENT); - } -diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/power.h b/drivers/net/wireless/intel/iwlwifi/fw/api/power.h -index 01f003c6cff9..f195db398bed 100644 ---- a/drivers/net/wireless/intel/iwlwifi/fw/api/power.h -+++ b/drivers/net/wireless/intel/iwlwifi/fw/api/power.h -@@ -419,14 +419,26 @@ struct iwl_per_chain_offset_group { - struct iwl_per_chain_offset hb; - } __packed; /* PER_CHAIN_LIMIT_OFFSET_GROUP_S_VER_1 */ - -+/** -+ * struct iwl_geo_tx_power_profile_cmd_v1 - struct for GEO_TX_POWER_LIMIT cmd. -+ * @ops: operations, value from &enum iwl_geo_per_chain_offset_operation -+ * @table: offset profile per band. -+ */ -+struct iwl_geo_tx_power_profiles_cmd_v1 { -+ __le32 ops; -+ struct iwl_per_chain_offset_group table[IWL_NUM_GEO_PROFILES]; -+} __packed; /* GEO_TX_POWER_LIMIT_VER_1 */ -+ - /** - * struct iwl_geo_tx_power_profile_cmd - struct for GEO_TX_POWER_LIMIT cmd. - * @ops: operations, value from &enum iwl_geo_per_chain_offset_operation - * @table: offset profile per band. -+ * @table_revision: BIOS table revision. - */ - struct iwl_geo_tx_power_profiles_cmd { - __le32 ops; - struct iwl_per_chain_offset_group table[IWL_NUM_GEO_PROFILES]; -+ __le32 table_revision; - } __packed; /* GEO_TX_POWER_LIMIT */ - - /** -diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c -index 33d7bc5500db..c875e173771c 100644 ---- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c -+++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c -@@ -2303,8 +2303,6 @@ void iwl_fw_dbg_collect_sync(struct iwl_fw_runtime *fwrt) - /* start recording again if the firmware is not crashed */ - if (!test_bit(STATUS_FW_ERROR, &fwrt->trans->status) && - fwrt->fw->dbg.dest_tlv) { -- /* wait before we collect the data till the DBGC stop */ -- udelay(500); - iwl_fw_dbg_restart_recording(fwrt, ¶ms); - } - } -diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.h b/drivers/net/wireless/intel/iwlwifi/fw/dbg.h -index fd0ad220e961..c5c015a66106 100644 ---- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.h -+++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.h -@@ -294,7 +294,10 @@ _iwl_fw_dbg_stop_recording(struct iwl_trans *trans, - } - - iwl_write_umac_prph(trans, DBGC_IN_SAMPLE, 0); -- udelay(100); -+ /* wait for the DBGC to finish writing the internal buffer to DRAM to -+ * avoid halting the HW while writing -+ */ -+ usleep_range(700, 1000); - iwl_write_umac_prph(trans, DBGC_OUT_CTRL, 0); - #ifdef CONFIG_IWLWIFI_DEBUGFS - trans->dbg_rec_on = false; -@@ -324,7 +327,6 @@ _iwl_fw_dbg_restart_recording(struct iwl_trans *trans, - iwl_set_bits_prph(trans, MON_BUFF_SAMPLE_CTL, 0x1); - } else { - iwl_write_umac_prph(trans, DBGC_IN_SAMPLE, params->in_sample); -- udelay(100); - iwl_write_umac_prph(trans, DBGC_OUT_CTRL, params->out_ctrl); - } - } -diff --git a/drivers/net/wireless/intel/iwlwifi/fw/file.h b/drivers/net/wireless/intel/iwlwifi/fw/file.h -index de9243d30135..a74f34a8dffb 100644 ---- a/drivers/net/wireless/intel/iwlwifi/fw/file.h -+++ b/drivers/net/wireless/intel/iwlwifi/fw/file.h -@@ -286,6 +286,8 @@ typedef unsigned int __bitwise iwl_ucode_tlv_api_t; - * SCAN_OFFLOAD_PROFILES_QUERY_RSP_S. - * @IWL_UCODE_TLV_API_MBSSID_HE: This ucode supports v2 of - * STA_CONTEXT_DOT11AX_API_S -+ * @IWL_UCODE_TLV_CAPA_SAR_TABLE_VER: This ucode supports different sar -+ * version tables. - * - * @NUM_IWL_UCODE_TLV_API: number of bits used - */ -@@ -318,6 +320,7 @@ enum iwl_ucode_tlv_api { - IWL_UCODE_TLV_API_MBSSID_HE = (__force iwl_ucode_tlv_api_t)52, - IWL_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE = (__force iwl_ucode_tlv_api_t)53, - IWL_UCODE_TLV_API_FTM_RTT_ACCURACY = (__force iwl_ucode_tlv_api_t)54, -+ IWL_UCODE_TLV_API_SAR_TABLE_VER = (__force iwl_ucode_tlv_api_t)55, - - NUM_IWL_UCODE_TLV_API - #ifdef __CHECKER__ -diff --git a/drivers/net/wireless/intel/iwlwifi/fw/smem.c b/drivers/net/wireless/intel/iwlwifi/fw/smem.c -index ff85d69c2a8c..557ee47bffd8 100644 ---- a/drivers/net/wireless/intel/iwlwifi/fw/smem.c -+++ b/drivers/net/wireless/intel/iwlwifi/fw/smem.c -@@ -8,7 +8,7 @@ - * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. - * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH - * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -- * Copyright(c) 2018 Intel Corporation -+ * Copyright(c) 2018 - 2019 Intel Corporation - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of version 2 of the GNU General Public License as -@@ -31,7 +31,7 @@ - * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. - * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH - * Copyright(c) 2016 - 2017 Intel Deutschland GmbH -- * Copyright(c) 2018 Intel Corporation -+ * Copyright(c) 2018 - 2019 Intel Corporation - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without -@@ -134,6 +134,7 @@ void iwl_get_shared_mem_conf(struct iwl_fw_runtime *fwrt) - .len = { 0, }, - }; - struct iwl_rx_packet *pkt; -+ int ret; - - if (fw_has_capa(&fwrt->fw->ucode_capa, - IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG)) -@@ -141,8 +142,13 @@ void iwl_get_shared_mem_conf(struct iwl_fw_runtime *fwrt) - else - cmd.id = SHARED_MEM_CFG; - -- if (WARN_ON(iwl_trans_send_cmd(fwrt->trans, &cmd))) -+ ret = iwl_trans_send_cmd(fwrt->trans, &cmd); -+ -+ if (ret) { -+ WARN(ret != -ERFKILL, -+ "Could not send the SMEM command: %d\n", ret); - return; -+ } - - pkt = cmd.resp_pkt; - if (fwrt->trans->cfg->device_family >= IWL_DEVICE_FAMILY_22000) -diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h -index 553554846009..93da96a7247c 100644 ---- a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h -+++ b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h -@@ -336,6 +336,7 @@ enum { - /* RF_ID value */ - #define CSR_HW_RF_ID_TYPE_JF (0x00105100) - #define CSR_HW_RF_ID_TYPE_HR (0x0010A000) -+#define CSR_HW_RF_ID_TYPE_HR1 (0x0010c100) - #define CSR_HW_RF_ID_TYPE_HRCDB (0x00109F00) - #define CSR_HW_RF_ID_TYPE_GF (0x0010D000) - #define CSR_HW_RF_ID_TYPE_GF4 (0x0010E000) -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c -index 153717587aeb..8a3e542c47b2 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c -@@ -419,6 +419,8 @@ static int iwl_run_unified_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm) - - lockdep_assert_held(&mvm->mutex); - -+ mvm->rfkill_safe_init_done = false; -+ - iwl_init_notification_wait(&mvm->notif_wait, - &init_wait, - init_complete, -@@ -537,8 +539,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm) - - lockdep_assert_held(&mvm->mutex); - -- if (WARN_ON_ONCE(mvm->rfkill_safe_init_done)) -- return 0; -+ mvm->rfkill_safe_init_done = false; - - iwl_init_notification_wait(&mvm->notif_wait, - &calib_wait, -@@ -681,15 +682,15 @@ static int iwl_mvm_sar_get_wrds_table(struct iwl_mvm *mvm) - { - union acpi_object *wifi_pkg, *table, *data; - bool enabled; -- int ret; -+ int ret, tbl_rev; - - data = iwl_acpi_get_object(mvm->dev, ACPI_WRDS_METHOD); - if (IS_ERR(data)) - return PTR_ERR(data); - - wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data, -- ACPI_WRDS_WIFI_DATA_SIZE); -- if (IS_ERR(wifi_pkg)) { -+ ACPI_WRDS_WIFI_DATA_SIZE, &tbl_rev); -+ if (IS_ERR(wifi_pkg) || tbl_rev != 0) { - ret = PTR_ERR(wifi_pkg); - goto out_free; - } -@@ -718,15 +719,15 @@ static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm) - { - union acpi_object *wifi_pkg, *data; - bool enabled; -- int i, n_profiles, ret; -+ int i, n_profiles, ret, tbl_rev; - - data = iwl_acpi_get_object(mvm->dev, ACPI_EWRD_METHOD); - if (IS_ERR(data)) - return PTR_ERR(data); - - wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data, -- ACPI_EWRD_WIFI_DATA_SIZE); -- if (IS_ERR(wifi_pkg)) { -+ ACPI_EWRD_WIFI_DATA_SIZE, &tbl_rev); -+ if (IS_ERR(wifi_pkg) || tbl_rev != 0) { - ret = PTR_ERR(wifi_pkg); - goto out_free; - } -@@ -777,7 +778,7 @@ static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm) - static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm) - { - union acpi_object *wifi_pkg, *data; -- int i, j, ret; -+ int i, j, ret, tbl_rev; - int idx = 1; - - data = iwl_acpi_get_object(mvm->dev, ACPI_WGDS_METHOD); -@@ -785,12 +786,13 @@ static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm) - return PTR_ERR(data); - - wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data, -- ACPI_WGDS_WIFI_DATA_SIZE); -- if (IS_ERR(wifi_pkg)) { -+ ACPI_WGDS_WIFI_DATA_SIZE, &tbl_rev); -+ if (IS_ERR(wifi_pkg) || tbl_rev > 1) { - ret = PTR_ERR(wifi_pkg); - goto out_free; - } - -+ mvm->geo_rev = tbl_rev; - for (i = 0; i < ACPI_NUM_GEO_PROFILES; i++) { - for (j = 0; j < ACPI_GEO_TABLE_SIZE; j++) { - union acpi_object *entry; -@@ -877,15 +879,29 @@ int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm) - { - struct iwl_geo_tx_power_profiles_resp *resp; - int ret; -+ u16 len; -+ void *data; -+ struct iwl_geo_tx_power_profiles_cmd geo_cmd; -+ struct iwl_geo_tx_power_profiles_cmd_v1 geo_cmd_v1; -+ struct iwl_host_cmd cmd; -+ -+ if (fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_SAR_TABLE_VER)) { -+ geo_cmd.ops = -+ cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE); -+ len = sizeof(geo_cmd); -+ data = &geo_cmd; -+ } else { -+ geo_cmd_v1.ops = -+ cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE); -+ len = sizeof(geo_cmd_v1); -+ data = &geo_cmd_v1; -+ } - -- struct iwl_geo_tx_power_profiles_cmd geo_cmd = { -- .ops = cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE), -- }; -- struct iwl_host_cmd cmd = { -+ cmd = (struct iwl_host_cmd){ - .id = WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT), -- .len = { sizeof(geo_cmd), }, -+ .len = { len, }, - .flags = CMD_WANT_SKB, -- .data = { &geo_cmd }, -+ .data = { data }, - }; - - ret = iwl_mvm_send_cmd(mvm, &cmd); -@@ -955,6 +971,16 @@ static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm) - i, j, value[1], value[2], value[0]); - } - } -+ -+ cmd.table_revision = cpu_to_le32(mvm->geo_rev); -+ -+ if (!fw_has_api(&mvm->fw->ucode_capa, -+ IWL_UCODE_TLV_API_SAR_TABLE_VER)) { -+ return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0, -+ sizeof(struct iwl_geo_tx_power_profiles_cmd_v1), -+ &cmd); -+ } -+ - return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0, sizeof(cmd), &cmd); - } - -@@ -1108,10 +1134,13 @@ static int iwl_mvm_load_rt_fw(struct iwl_mvm *mvm) - - iwl_fw_dbg_apply_point(&mvm->fwrt, IWL_FW_INI_APPLY_EARLY); - -+ mvm->rfkill_safe_init_done = false; - ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_REGULAR); - if (ret) - return ret; - -+ mvm->rfkill_safe_init_done = true; -+ - iwl_fw_dbg_apply_point(&mvm->fwrt, IWL_FW_INI_APPLY_AFTER_ALIVE); - - return iwl_init_paging(&mvm->fwrt, mvm->fwrt.cur_fw_img); -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -index fdbabca0280e..3905770b8a1f 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c -@@ -207,6 +207,12 @@ static const struct cfg80211_pmsr_capabilities iwl_mvm_pmsr_capa = { - }, - }; - -+static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, -+ enum set_key_cmd cmd, -+ struct ieee80211_vif *vif, -+ struct ieee80211_sta *sta, -+ struct ieee80211_key_conf *key); -+ - void iwl_mvm_ref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type) - { - if (!iwl_mvm_is_d0i3_supported(mvm)) -@@ -468,7 +474,19 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) - ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW); - ieee80211_hw_set(hw, BUFF_MMPDU_TXQ); - ieee80211_hw_set(hw, STA_MMPDU_TXQ); -- ieee80211_hw_set(hw, TX_AMSDU); -+ /* -+ * On older devices, enabling TX A-MSDU occasionally leads to -+ * something getting messed up, the command read from the FIFO -+ * gets out of sync and isn't a TX command, so that we have an -+ * assert EDC. -+ * -+ * It's not clear where the bug is, but since we didn't used to -+ * support A-MSDU until moving the mac80211 iTXQs, just leave it -+ * for older devices. We also don't see this issue on any newer -+ * devices. -+ */ -+ if (mvm->cfg->device_family >= IWL_DEVICE_FAMILY_9000) -+ ieee80211_hw_set(hw, TX_AMSDU); - ieee80211_hw_set(hw, TX_FRAG_LIST); - - if (iwl_mvm_has_tlc_offload(mvm)) { -@@ -2636,7 +2654,7 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw, - { - struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); - struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); -- int ret; -+ int ret, i; - - /* - * iwl_mvm_mac_ctxt_add() might read directly from the device -@@ -2710,6 +2728,20 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw, - /* must be set before quota calculations */ - mvmvif->ap_ibss_active = true; - -+ /* send all the early keys to the device now */ -+ for (i = 0; i < ARRAY_SIZE(mvmvif->ap_early_keys); i++) { -+ struct ieee80211_key_conf *key = mvmvif->ap_early_keys[i]; -+ -+ if (!key) -+ continue; -+ -+ mvmvif->ap_early_keys[i] = NULL; -+ -+ ret = iwl_mvm_mac_set_key(hw, SET_KEY, vif, NULL, key); -+ if (ret) -+ goto out_quota_failed; -+ } -+ - if (vif->type == NL80211_IFTYPE_AP && !vif->p2p) { - iwl_mvm_vif_set_low_latency(mvmvif, true, - LOW_LATENCY_VIF_TYPE); -@@ -3479,11 +3511,12 @@ static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, - struct ieee80211_sta *sta, - struct ieee80211_key_conf *key) - { -+ struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); - struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); - struct iwl_mvm_sta *mvmsta; - struct iwl_mvm_key_pn *ptk_pn; - int keyidx = key->keyidx; -- int ret; -+ int ret, i; - u8 key_offset; - - if (iwlwifi_mod_params.swcrypto) { -@@ -3556,6 +3589,22 @@ static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, - key->hw_key_idx = STA_KEY_IDX_INVALID; - break; - } -+ -+ if (!mvmvif->ap_ibss_active) { -+ for (i = 0; -+ i < ARRAY_SIZE(mvmvif->ap_early_keys); -+ i++) { -+ if (!mvmvif->ap_early_keys[i]) { -+ mvmvif->ap_early_keys[i] = key; -+ break; -+ } -+ } -+ -+ if (i >= ARRAY_SIZE(mvmvif->ap_early_keys)) -+ ret = -ENOSPC; -+ -+ break; -+ } - } - - /* During FW restart, in order to restore the state as it was, -@@ -3624,6 +3673,18 @@ static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, - - break; - case DISABLE_KEY: -+ ret = -ENOENT; -+ for (i = 0; i < ARRAY_SIZE(mvmvif->ap_early_keys); i++) { -+ if (mvmvif->ap_early_keys[i] == key) { -+ mvmvif->ap_early_keys[i] = NULL; -+ ret = 0; -+ } -+ } -+ -+ /* found in pending list - don't do anything else */ -+ if (ret == 0) -+ break; -+ - if (key->hw_key_idx == STA_KEY_IDX_INVALID) { - ret = 0; - break; -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h -index 02efcf2189c4..ed8fc9a9204c 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h -@@ -501,6 +501,9 @@ struct iwl_mvm_vif { - netdev_features_t features; - - struct iwl_probe_resp_data __rcu *probe_resp_data; -+ -+ /* we can only have 2 GTK + 2 IGTK active at a time */ -+ struct ieee80211_key_conf *ap_early_keys[4]; - }; - - static inline struct iwl_mvm_vif * -@@ -1181,6 +1184,7 @@ struct iwl_mvm { - #ifdef CONFIG_ACPI - struct iwl_mvm_sar_profile sar_profiles[ACPI_SAR_PROFILE_NUM]; - struct iwl_mvm_geo_profile geo_profiles[ACPI_NUM_GEO_PROFILES]; -+ u32 geo_rev; - #endif - }; - -diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c -index 0c2aabc842f9..96f8d38ea321 100644 ---- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c -+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c -@@ -726,6 +726,9 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb) - - memcpy(&info, skb->cb, sizeof(info)); - -+ if (WARN_ON_ONCE(skb->len > IEEE80211_MAX_DATA_LEN + hdrlen)) -+ return -1; -+ - if (WARN_ON_ONCE(info.flags & IEEE80211_TX_CTL_AMPDU)) - return -1; - -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c -index f496d1bcb643..1719a5ff77a9 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c -@@ -169,7 +169,7 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans, - - memcpy(iml_img, trans->iml, trans->iml_len); - -- iwl_enable_interrupts(trans); -+ iwl_enable_fw_load_int_ctx_info(trans); - - /* kick FW self load */ - iwl_write64(trans, CSR_CTXT_INFO_ADDR, -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c -index 8969b47bacf2..d38cefbb779e 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c -@@ -222,7 +222,7 @@ int iwl_pcie_ctxt_info_init(struct iwl_trans *trans, - - trans_pcie->ctxt_info = ctxt_info; - -- iwl_enable_interrupts(trans); -+ iwl_enable_fw_load_int_ctx_info(trans); - - /* Configure debug, if exists */ - if (iwl_pcie_dbg_on(trans)) -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h -index 85973dd57234..dcb3a3768cbd 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h -@@ -874,6 +874,33 @@ static inline void iwl_enable_fw_load_int(struct iwl_trans *trans) - } - } - -+static inline void iwl_enable_fw_load_int_ctx_info(struct iwl_trans *trans) -+{ -+ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); -+ -+ IWL_DEBUG_ISR(trans, "Enabling ALIVE interrupt only\n"); -+ -+ if (!trans_pcie->msix_enabled) { -+ /* -+ * When we'll receive the ALIVE interrupt, the ISR will call -+ * iwl_enable_fw_load_int_ctx_info again to set the ALIVE -+ * interrupt (which is not really needed anymore) but also the -+ * RX interrupt which will allow us to receive the ALIVE -+ * notification (which is Rx) and continue the flow. -+ */ -+ trans_pcie->inta_mask = CSR_INT_BIT_ALIVE | CSR_INT_BIT_FH_RX; -+ iwl_write32(trans, CSR_INT_MASK, trans_pcie->inta_mask); -+ } else { -+ iwl_enable_hw_int_msk_msix(trans, -+ MSIX_HW_INT_CAUSES_REG_ALIVE); -+ /* -+ * Leave all the FH causes enabled to get the ALIVE -+ * notification. -+ */ -+ iwl_enable_fh_int_msk_msix(trans, trans_pcie->fh_init_mask); -+ } -+} -+ - static inline u16 iwl_pcie_get_cmd_index(const struct iwl_txq *q, u32 index) - { - return index & (q->n_window - 1); -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c -index 31b3591f71d1..e5220905dff1 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c -@@ -1827,26 +1827,26 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) - goto out; - } - -- if (iwl_have_debug_level(IWL_DL_ISR)) { -- /* NIC fires this, but we don't use it, redundant with WAKEUP */ -- if (inta & CSR_INT_BIT_SCD) { -- IWL_DEBUG_ISR(trans, -- "Scheduler finished to transmit the frame/frames.\n"); -- isr_stats->sch++; -- } -+ /* NIC fires this, but we don't use it, redundant with WAKEUP */ -+ if (inta & CSR_INT_BIT_SCD) { -+ IWL_DEBUG_ISR(trans, -+ "Scheduler finished to transmit the frame/frames.\n"); -+ isr_stats->sch++; -+ } - -- /* Alive notification via Rx interrupt will do the real work */ -- if (inta & CSR_INT_BIT_ALIVE) { -- IWL_DEBUG_ISR(trans, "Alive interrupt\n"); -- isr_stats->alive++; -- if (trans->cfg->gen2) { -- /* -- * We can restock, since firmware configured -- * the RFH -- */ -- iwl_pcie_rxmq_restock(trans, trans_pcie->rxq); -- } -+ /* Alive notification via Rx interrupt will do the real work */ -+ if (inta & CSR_INT_BIT_ALIVE) { -+ IWL_DEBUG_ISR(trans, "Alive interrupt\n"); -+ isr_stats->alive++; -+ if (trans->cfg->gen2) { -+ /* -+ * We can restock, since firmware configured -+ * the RFH -+ */ -+ iwl_pcie_rxmq_restock(trans, trans_pcie->rxq); - } -+ -+ handled |= CSR_INT_BIT_ALIVE; - } - - /* Safely ignore these bits for debug checks below */ -@@ -1965,6 +1965,9 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) - /* Re-enable RF_KILL if it occurred */ - else if (handled & CSR_INT_BIT_RF_KILL) - iwl_enable_rfkill_int(trans); -+ /* Re-enable the ALIVE / Rx interrupt if it occurred */ -+ else if (handled & (CSR_INT_BIT_ALIVE | CSR_INT_BIT_FH_RX)) -+ iwl_enable_fw_load_int_ctx_info(trans); - spin_unlock(&trans_pcie->irq_lock); - - out: -@@ -2108,10 +2111,18 @@ irqreturn_t iwl_pcie_irq_msix_handler(int irq, void *dev_id) - return IRQ_NONE; - } - -- if (iwl_have_debug_level(IWL_DL_ISR)) -- IWL_DEBUG_ISR(trans, "ISR inta_fh 0x%08x, enabled 0x%08x\n", -- inta_fh, -+ if (iwl_have_debug_level(IWL_DL_ISR)) { -+ IWL_DEBUG_ISR(trans, -+ "ISR inta_fh 0x%08x, enabled (sw) 0x%08x (hw) 0x%08x\n", -+ inta_fh, trans_pcie->fh_mask, - iwl_read32(trans, CSR_MSIX_FH_INT_MASK_AD)); -+ if (inta_fh & ~trans_pcie->fh_mask) -+ IWL_DEBUG_ISR(trans, -+ "We got a masked interrupt (0x%08x)\n", -+ inta_fh & ~trans_pcie->fh_mask); -+ } -+ -+ inta_fh &= trans_pcie->fh_mask; - - if ((trans_pcie->shared_vec_mask & IWL_SHARED_IRQ_NON_RX) && - inta_fh & MSIX_FH_INT_CAUSES_Q0) { -@@ -2151,11 +2162,18 @@ irqreturn_t iwl_pcie_irq_msix_handler(int irq, void *dev_id) - } - - /* After checking FH register check HW register */ -- if (iwl_have_debug_level(IWL_DL_ISR)) -+ if (iwl_have_debug_level(IWL_DL_ISR)) { - IWL_DEBUG_ISR(trans, -- "ISR inta_hw 0x%08x, enabled 0x%08x\n", -- inta_hw, -+ "ISR inta_hw 0x%08x, enabled (sw) 0x%08x (hw) 0x%08x\n", -+ inta_hw, trans_pcie->hw_mask, - iwl_read32(trans, CSR_MSIX_HW_INT_MASK_AD)); -+ if (inta_hw & ~trans_pcie->hw_mask) -+ IWL_DEBUG_ISR(trans, -+ "We got a masked interrupt 0x%08x\n", -+ inta_hw & ~trans_pcie->hw_mask); -+ } -+ -+ inta_hw &= trans_pcie->hw_mask; - - /* Alive notification via Rx interrupt will do the real work */ - if (inta_hw & MSIX_HW_INT_CAUSES_REG_ALIVE) { -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c -index 8507a7bdcfdd..ea1d2bed502d 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c -@@ -273,6 +273,15 @@ void iwl_trans_pcie_gen2_fw_alive(struct iwl_trans *trans, u32 scd_addr) - * paging memory cannot be freed included since FW will still use it - */ - iwl_pcie_ctxt_info_free(trans); -+ -+ /* -+ * Re-enable all the interrupts, including the RF-Kill one, now that -+ * the firmware is alive. -+ */ -+ iwl_enable_interrupts(trans); -+ mutex_lock(&trans_pcie->mutex); -+ iwl_pcie_check_hw_rf_kill(trans); -+ mutex_unlock(&trans_pcie->mutex); - } - - int iwl_trans_pcie_gen2_start_fw(struct iwl_trans *trans, -diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c -index dfa1bed124aa..199eddea82a9 100644 ---- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c -+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c -@@ -3575,9 +3575,11 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, - trans->cfg = &iwlax210_2ax_cfg_so_gf4_a0; - } - } else if (cfg == &iwl_ax101_cfg_qu_hr) { -- if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) == -- CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR) && -- trans->hw_rev == CSR_HW_REV_TYPE_QNJ_B0) { -+ if ((CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) == -+ CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR) && -+ trans->hw_rev == CSR_HW_REV_TYPE_QNJ_B0) || -+ (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) == -+ CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR1))) { - trans->cfg = &iwl22000_2ax_cfg_qnj_hr_b0; - } else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) == - CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR)) { -diff --git a/drivers/net/wireless/intersil/p54/p54usb.c b/drivers/net/wireless/intersil/p54/p54usb.c -index f937815f0f2c..b94764c88750 100644 ---- a/drivers/net/wireless/intersil/p54/p54usb.c -+++ b/drivers/net/wireless/intersil/p54/p54usb.c -@@ -30,6 +30,8 @@ MODULE_ALIAS("prism54usb"); - MODULE_FIRMWARE("isl3886usb"); - MODULE_FIRMWARE("isl3887usb"); - -+static struct usb_driver p54u_driver; -+ - /* - * Note: - * -@@ -918,9 +920,9 @@ static void p54u_load_firmware_cb(const struct firmware *firmware, - { - struct p54u_priv *priv = context; - struct usb_device *udev = priv->udev; -+ struct usb_interface *intf = priv->intf; - int err; - -- complete(&priv->fw_wait_load); - if (firmware) { - priv->fw = firmware; - err = p54u_start_ops(priv); -@@ -929,26 +931,22 @@ static void p54u_load_firmware_cb(const struct firmware *firmware, - dev_err(&udev->dev, "Firmware not found.\n"); - } - -- if (err) { -- struct device *parent = priv->udev->dev.parent; -- -- dev_err(&udev->dev, "failed to initialize device (%d)\n", err); -- -- if (parent) -- device_lock(parent); -+ complete(&priv->fw_wait_load); -+ /* -+ * At this point p54u_disconnect may have already freed -+ * the "priv" context. Do not use it anymore! -+ */ -+ priv = NULL; - -- device_release_driver(&udev->dev); -- /* -- * At this point p54u_disconnect has already freed -- * the "priv" context. Do not use it anymore! -- */ -- priv = NULL; -+ if (err) { -+ dev_err(&intf->dev, "failed to initialize device (%d)\n", err); - -- if (parent) -- device_unlock(parent); -+ usb_lock_device(udev); -+ usb_driver_release_interface(&p54u_driver, intf); -+ usb_unlock_device(udev); - } - -- usb_put_dev(udev); -+ usb_put_intf(intf); - } - - static int p54u_load_firmware(struct ieee80211_hw *dev, -@@ -969,14 +967,14 @@ static int p54u_load_firmware(struct ieee80211_hw *dev, - dev_info(&priv->udev->dev, "Loading firmware file %s\n", - p54u_fwlist[i].fw); - -- usb_get_dev(udev); -+ usb_get_intf(intf); - err = request_firmware_nowait(THIS_MODULE, 1, p54u_fwlist[i].fw, - device, GFP_KERNEL, priv, - p54u_load_firmware_cb); - if (err) { - dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s " - "(%d)!\n", p54u_fwlist[i].fw, err); -- usb_put_dev(udev); -+ usb_put_intf(intf); - } - - return err; -@@ -1008,8 +1006,6 @@ static int p54u_probe(struct usb_interface *intf, - skb_queue_head_init(&priv->rx_queue); - init_usb_anchor(&priv->submitted); - -- usb_get_dev(udev); -- - /* really lazy and simple way of figuring out if we're a 3887 */ - /* TODO: should just stick the identification in the device table */ - i = intf->altsetting->desc.bNumEndpoints; -@@ -1050,10 +1046,8 @@ static int p54u_probe(struct usb_interface *intf, - priv->upload_fw = p54u_upload_firmware_net2280; - } - err = p54u_load_firmware(dev, intf); -- if (err) { -- usb_put_dev(udev); -+ if (err) - p54_free_common(dev); -- } - return err; - } - -@@ -1069,7 +1063,6 @@ static void p54u_disconnect(struct usb_interface *intf) - wait_for_completion(&priv->fw_wait_load); - p54_unregister_common(dev); - -- usb_put_dev(interface_to_usbdev(intf)); - release_firmware(priv->fw); - p54_free_common(dev); - } -diff --git a/drivers/net/wireless/intersil/p54/txrx.c b/drivers/net/wireless/intersil/p54/txrx.c -index ff9acd1563f4..5892898f8853 100644 ---- a/drivers/net/wireless/intersil/p54/txrx.c -+++ b/drivers/net/wireless/intersil/p54/txrx.c -@@ -139,7 +139,10 @@ static int p54_assign_address(struct p54_common *priv, struct sk_buff *skb) - unlikely(GET_HW_QUEUE(skb) == P54_QUEUE_BEACON)) - priv->beacon_req_id = data->req_id; - -- __skb_queue_after(&priv->tx_queue, target_skb, skb); -+ if (target_skb) -+ __skb_queue_after(&priv->tx_queue, target_skb, skb); -+ else -+ __skb_queue_head(&priv->tx_queue, skb); - spin_unlock_irqrestore(&priv->tx_queue.lock, flags); - return 0; - } -diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h b/drivers/net/wireless/marvell/mwifiex/fw.h -index b73f99dc5a72..1fb76d2f5d3f 100644 ---- a/drivers/net/wireless/marvell/mwifiex/fw.h -+++ b/drivers/net/wireless/marvell/mwifiex/fw.h -@@ -1759,9 +1759,10 @@ struct mwifiex_ie_types_wmm_queue_status { - struct ieee_types_vendor_header { - u8 element_id; - u8 len; -- u8 oui[4]; /* 0~2: oui, 3: oui_type */ -- u8 oui_subtype; -- u8 version; -+ struct { -+ u8 oui[3]; -+ u8 oui_type; -+ } __packed oui; - } __packed; - - struct ieee_types_wmm_parameter { -@@ -1775,6 +1776,9 @@ struct ieee_types_wmm_parameter { - * Version [1] - */ - struct ieee_types_vendor_header vend_hdr; -+ u8 oui_subtype; -+ u8 version; -+ - u8 qos_info_bitmap; - u8 reserved; - struct ieee_types_wmm_ac_parameters ac_params[IEEE80211_NUM_ACS]; -@@ -1792,6 +1796,8 @@ struct ieee_types_wmm_info { - * Version [1] - */ - struct ieee_types_vendor_header vend_hdr; -+ u8 oui_subtype; -+ u8 version; - - u8 qos_info_bitmap; - } __packed; -diff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c -index c269a0de9413..e2786ab612ca 100644 ---- a/drivers/net/wireless/marvell/mwifiex/scan.c -+++ b/drivers/net/wireless/marvell/mwifiex/scan.c -@@ -1361,21 +1361,25 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, - break; - - case WLAN_EID_VENDOR_SPECIFIC: -- if (element_len + 2 < sizeof(vendor_ie->vend_hdr)) -- return -EINVAL; -- - vendor_ie = (struct ieee_types_vendor_specific *) - current_ptr; - -- if (!memcmp -- (vendor_ie->vend_hdr.oui, wpa_oui, -- sizeof(wpa_oui))) { -+ /* 802.11 requires at least 3-byte OUI. */ -+ if (element_len < sizeof(vendor_ie->vend_hdr.oui.oui)) -+ return -EINVAL; -+ -+ /* Not long enough for a match? Skip it. */ -+ if (element_len < sizeof(wpa_oui)) -+ break; -+ -+ if (!memcmp(&vendor_ie->vend_hdr.oui, wpa_oui, -+ sizeof(wpa_oui))) { - bss_entry->bcn_wpa_ie = - (struct ieee_types_vendor_specific *) - current_ptr; - bss_entry->wpa_offset = (u16) - (current_ptr - bss_entry->beacon_buf); -- } else if (!memcmp(vendor_ie->vend_hdr.oui, wmm_oui, -+ } else if (!memcmp(&vendor_ie->vend_hdr.oui, wmm_oui, - sizeof(wmm_oui))) { - if (total_ie_len == - sizeof(struct ieee_types_wmm_parameter) || -diff --git a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c -index ebc0e41e5d3b..74e50566db1f 100644 ---- a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c -+++ b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c -@@ -1351,7 +1351,7 @@ mwifiex_set_gen_ie_helper(struct mwifiex_private *priv, u8 *ie_data_ptr, - /* Test to see if it is a WPA IE, if not, then - * it is a gen IE - */ -- if (!memcmp(pvendor_ie->oui, wpa_oui, -+ if (!memcmp(&pvendor_ie->oui, wpa_oui, - sizeof(wpa_oui))) { - /* IE is a WPA/WPA2 IE so call set_wpa function - */ -@@ -1361,7 +1361,7 @@ mwifiex_set_gen_ie_helper(struct mwifiex_private *priv, u8 *ie_data_ptr, - goto next_ie; - } - -- if (!memcmp(pvendor_ie->oui, wps_oui, -+ if (!memcmp(&pvendor_ie->oui, wps_oui, - sizeof(wps_oui))) { - /* Test to see if it is a WPS IE, - * if so, enable wps session flag -diff --git a/drivers/net/wireless/marvell/mwifiex/wmm.c b/drivers/net/wireless/marvell/mwifiex/wmm.c -index 407b9932ca4d..64916ba15df5 100644 ---- a/drivers/net/wireless/marvell/mwifiex/wmm.c -+++ b/drivers/net/wireless/marvell/mwifiex/wmm.c -@@ -240,7 +240,7 @@ mwifiex_wmm_setup_queue_priorities(struct mwifiex_private *priv, - mwifiex_dbg(priv->adapter, INFO, - "info: WMM Parameter IE: version=%d,\t" - "qos_info Parameter Set Count=%d, Reserved=%#x\n", -- wmm_ie->vend_hdr.version, wmm_ie->qos_info_bitmap & -+ wmm_ie->version, wmm_ie->qos_info_bitmap & - IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK, - wmm_ie->reserved); - -diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c -index b8f48d10f27a..a27bc6791aa7 100644 ---- a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c -+++ b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c -@@ -96,6 +96,9 @@ int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb) - bool unicast, remove_pad, insert_ccmp_hdr = false; - int i, idx; - -+ if (!test_bit(MT76_STATE_RUNNING, &dev->mt76.state)) -+ return -EINVAL; -+ - memset(status, 0, sizeof(*status)); - - unicast = (rxd1 & MT_RXD1_NORMAL_ADDR_TYPE) == MT_RXD1_NORMAL_U2M; -diff --git a/drivers/net/wireless/mediatek/mt7601u/dma.c b/drivers/net/wireless/mediatek/mt7601u/dma.c -index 66d60283e456..f6a0454abe04 100644 ---- a/drivers/net/wireless/mediatek/mt7601u/dma.c -+++ b/drivers/net/wireless/mediatek/mt7601u/dma.c -@@ -185,10 +185,23 @@ static void mt7601u_complete_rx(struct urb *urb) - struct mt7601u_rx_queue *q = &dev->rx_q; - unsigned long flags; - -- spin_lock_irqsave(&dev->rx_lock, flags); -+ /* do no schedule rx tasklet if urb has been unlinked -+ * or the device has been removed -+ */ -+ switch (urb->status) { -+ case -ECONNRESET: -+ case -ESHUTDOWN: -+ case -ENOENT: -+ return; -+ default: -+ dev_err_ratelimited(dev->dev, "rx urb failed: %d\n", -+ urb->status); -+ /* fall through */ -+ case 0: -+ break; -+ } - -- if (mt7601u_urb_has_error(urb)) -- dev_err(dev->dev, "Error: RX urb failed:%d\n", urb->status); -+ spin_lock_irqsave(&dev->rx_lock, flags); - if (WARN_ONCE(q->e[q->end].urb != urb, "RX urb mismatch")) - goto out; - -@@ -220,14 +233,25 @@ static void mt7601u_complete_tx(struct urb *urb) - struct sk_buff *skb; - unsigned long flags; - -- spin_lock_irqsave(&dev->tx_lock, flags); -+ switch (urb->status) { -+ case -ECONNRESET: -+ case -ESHUTDOWN: -+ case -ENOENT: -+ return; -+ default: -+ dev_err_ratelimited(dev->dev, "tx urb failed: %d\n", -+ urb->status); -+ /* fall through */ -+ case 0: -+ break; -+ } - -- if (mt7601u_urb_has_error(urb)) -- dev_err(dev->dev, "Error: TX urb failed:%d\n", urb->status); -+ spin_lock_irqsave(&dev->tx_lock, flags); - if (WARN_ONCE(q->e[q->start].urb != urb, "TX urb mismatch")) - goto out; - - skb = q->e[q->start].skb; -+ q->e[q->start].skb = NULL; - trace_mt_tx_dma_done(dev, skb); - - __skb_queue_tail(&dev->tx_skb_done, skb); -@@ -355,19 +379,9 @@ int mt7601u_dma_enqueue_tx(struct mt7601u_dev *dev, struct sk_buff *skb, - static void mt7601u_kill_rx(struct mt7601u_dev *dev) - { - int i; -- unsigned long flags; -- -- spin_lock_irqsave(&dev->rx_lock, flags); -- -- for (i = 0; i < dev->rx_q.entries; i++) { -- int next = dev->rx_q.end; - -- spin_unlock_irqrestore(&dev->rx_lock, flags); -- usb_poison_urb(dev->rx_q.e[next].urb); -- spin_lock_irqsave(&dev->rx_lock, flags); -- } -- -- spin_unlock_irqrestore(&dev->rx_lock, flags); -+ for (i = 0; i < dev->rx_q.entries; i++) -+ usb_poison_urb(dev->rx_q.e[i].urb); - } - - static int mt7601u_submit_rx_buf(struct mt7601u_dev *dev, -@@ -437,10 +451,10 @@ static void mt7601u_free_tx_queue(struct mt7601u_tx_queue *q) - { - int i; - -- WARN_ON(q->used); -- - for (i = 0; i < q->entries; i++) { - usb_poison_urb(q->e[i].urb); -+ if (q->e[i].skb) -+ mt7601u_tx_status(q->dev, q->e[i].skb); - usb_free_urb(q->e[i].urb); - } - } -diff --git a/drivers/net/wireless/mediatek/mt7601u/tx.c b/drivers/net/wireless/mediatek/mt7601u/tx.c -index 906e19c5f628..f3dff8319a4c 100644 ---- a/drivers/net/wireless/mediatek/mt7601u/tx.c -+++ b/drivers/net/wireless/mediatek/mt7601u/tx.c -@@ -109,9 +109,9 @@ void mt7601u_tx_status(struct mt7601u_dev *dev, struct sk_buff *skb) - info->status.rates[0].idx = -1; - info->flags |= IEEE80211_TX_STAT_ACK; - -- spin_lock(&dev->mac_lock); -+ spin_lock_bh(&dev->mac_lock); - ieee80211_tx_status(dev->hw, skb); -- spin_unlock(&dev->mac_lock); -+ spin_unlock_bh(&dev->mac_lock); - } - - static int mt7601u_skb_rooms(struct mt7601u_dev *dev, struct sk_buff *skb) -diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -index 67b81c7221c4..7e3a621b9c0d 100644 ---- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -+++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c -@@ -372,14 +372,9 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) - struct queue_entry *entry = (struct queue_entry *)urb->context; - struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; - -- if (!test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) -+ if (!test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) - return; - -- /* -- * Report the frame as DMA done -- */ -- rt2x00lib_dmadone(entry); -- - /* - * Check if the received data is simply too small - * to be actually valid, or if the urb is signaling -@@ -388,6 +383,11 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) - if (urb->actual_length < entry->queue->desc_size || urb->status) - set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); - -+ /* -+ * Report the frame as DMA done -+ */ -+ rt2x00lib_dmadone(entry); -+ - /* - * Schedule the delayed work for reading the RX status - * from the device. -diff --git a/drivers/net/wireless/realtek/rtlwifi/usb.c b/drivers/net/wireless/realtek/rtlwifi/usb.c -index e24fda5e9087..34d68dbf4b4c 100644 ---- a/drivers/net/wireless/realtek/rtlwifi/usb.c -+++ b/drivers/net/wireless/realtek/rtlwifi/usb.c -@@ -1064,13 +1064,13 @@ int rtl_usb_probe(struct usb_interface *intf, - rtlpriv->cfg->ops->read_eeprom_info(hw); - err = _rtl_usb_init(hw); - if (err) -- goto error_out; -+ goto error_out2; - rtl_usb_init_sw(hw); - /* Init mac80211 sw */ - err = rtl_init_core(hw); - if (err) { - pr_err("Can't allocate sw for mac80211\n"); -- goto error_out; -+ goto error_out2; - } - if (rtlpriv->cfg->ops->init_sw_vars(hw)) { - pr_err("Can't init_sw_vars\n"); -@@ -1091,6 +1091,7 @@ int rtl_usb_probe(struct usb_interface *intf, - - error_out: - rtl_deinit_core(hw); -+error_out2: - _rtl_usb_io_handler_release(hw); - usb_put_dev(udev); - complete(&rtlpriv->firmware_loading_complete); -diff --git a/drivers/nfc/nfcmrvl/main.c b/drivers/nfc/nfcmrvl/main.c -index e65d027b91fa..529be35ac178 100644 ---- a/drivers/nfc/nfcmrvl/main.c -+++ b/drivers/nfc/nfcmrvl/main.c -@@ -244,7 +244,7 @@ void nfcmrvl_chip_reset(struct nfcmrvl_private *priv) - /* Reset possible fault of previous session */ - clear_bit(NFCMRVL_PHY_ERROR, &priv->flags); - -- if (priv->config.reset_n_io) { -+ if (gpio_is_valid(priv->config.reset_n_io)) { - nfc_info(priv->dev, "reset the chip\n"); - gpio_set_value(priv->config.reset_n_io, 0); - usleep_range(5000, 10000); -@@ -255,7 +255,7 @@ void nfcmrvl_chip_reset(struct nfcmrvl_private *priv) - - void nfcmrvl_chip_halt(struct nfcmrvl_private *priv) - { -- if (priv->config.reset_n_io) -+ if (gpio_is_valid(priv->config.reset_n_io)) - gpio_set_value(priv->config.reset_n_io, 0); - } - -diff --git a/drivers/nfc/nfcmrvl/uart.c b/drivers/nfc/nfcmrvl/uart.c -index 9a22056e8d9e..e5a622ce4b95 100644 ---- a/drivers/nfc/nfcmrvl/uart.c -+++ b/drivers/nfc/nfcmrvl/uart.c -@@ -26,7 +26,7 @@ - static unsigned int hci_muxed; - static unsigned int flow_control; - static unsigned int break_control; --static unsigned int reset_n_io; -+static int reset_n_io = -EINVAL; - - /* - ** NFCMRVL NCI OPS -@@ -231,5 +231,5 @@ MODULE_PARM_DESC(break_control, "Tell if UART driver must drive break signal."); - module_param(hci_muxed, uint, 0); - MODULE_PARM_DESC(hci_muxed, "Tell if transport is muxed in HCI one."); - --module_param(reset_n_io, uint, 0); -+module_param(reset_n_io, int, 0); - MODULE_PARM_DESC(reset_n_io, "GPIO that is wired to RESET_N signal."); -diff --git a/drivers/nfc/nfcmrvl/usb.c b/drivers/nfc/nfcmrvl/usb.c -index 945cc903d8f1..888e298f610b 100644 ---- a/drivers/nfc/nfcmrvl/usb.c -+++ b/drivers/nfc/nfcmrvl/usb.c -@@ -305,6 +305,7 @@ static int nfcmrvl_probe(struct usb_interface *intf, - - /* No configuration for USB */ - memset(&config, 0, sizeof(config)); -+ config.reset_n_io = -EINVAL; - - nfc_info(&udev->dev, "intf %p id %p\n", intf, id); - -diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c -index 2dca3034fee0..df41f3571dc9 100644 ---- a/drivers/nvdimm/bus.c -+++ b/drivers/nvdimm/bus.c -@@ -73,7 +73,7 @@ static void nvdimm_bus_probe_end(struct nvdimm_bus *nvdimm_bus) - { - nvdimm_bus_lock(&nvdimm_bus->dev); - if (--nvdimm_bus->probe_active == 0) -- wake_up(&nvdimm_bus->probe_wait); -+ wake_up(&nvdimm_bus->wait); - nvdimm_bus_unlock(&nvdimm_bus->dev); - } - -@@ -341,7 +341,7 @@ struct nvdimm_bus *nvdimm_bus_register(struct device *parent, - return NULL; - INIT_LIST_HEAD(&nvdimm_bus->list); - INIT_LIST_HEAD(&nvdimm_bus->mapping_list); -- init_waitqueue_head(&nvdimm_bus->probe_wait); -+ init_waitqueue_head(&nvdimm_bus->wait); - nvdimm_bus->id = ida_simple_get(&nd_ida, 0, 0, GFP_KERNEL); - if (nvdimm_bus->id < 0) { - kfree(nvdimm_bus); -@@ -426,6 +426,9 @@ static int nd_bus_remove(struct device *dev) - list_del_init(&nvdimm_bus->list); - mutex_unlock(&nvdimm_bus_list_mutex); - -+ wait_event(nvdimm_bus->wait, -+ atomic_read(&nvdimm_bus->ioctl_active) == 0); -+ - nd_synchronize(); - device_for_each_child(&nvdimm_bus->dev, NULL, child_unregister); - -@@ -547,13 +550,38 @@ EXPORT_SYMBOL(nd_device_register); - - void nd_device_unregister(struct device *dev, enum nd_async_mode mode) - { -+ bool killed; -+ - switch (mode) { - case ND_ASYNC: -+ /* -+ * In the async case this is being triggered with the -+ * device lock held and the unregistration work needs to -+ * be moved out of line iff this is thread has won the -+ * race to schedule the deletion. -+ */ -+ if (!kill_device(dev)) -+ return; -+ - get_device(dev); - async_schedule_domain(nd_async_device_unregister, dev, - &nd_async_domain); - break; - case ND_SYNC: -+ /* -+ * In the sync case the device is being unregistered due -+ * to a state change of the parent. Claim the kill state -+ * to synchronize against other unregistration requests, -+ * or otherwise let the async path handle it if the -+ * unregistration was already queued. -+ */ -+ device_lock(dev); -+ killed = kill_device(dev); -+ device_unlock(dev); -+ -+ if (!killed) -+ return; -+ - nd_synchronize(); - device_unregister(dev); - break; -@@ -859,10 +887,12 @@ void wait_nvdimm_bus_probe_idle(struct device *dev) - do { - if (nvdimm_bus->probe_active == 0) - break; -- nvdimm_bus_unlock(&nvdimm_bus->dev); -- wait_event(nvdimm_bus->probe_wait, -+ nvdimm_bus_unlock(dev); -+ device_unlock(dev); -+ wait_event(nvdimm_bus->wait, - nvdimm_bus->probe_active == 0); -- nvdimm_bus_lock(&nvdimm_bus->dev); -+ device_lock(dev); -+ nvdimm_bus_lock(dev); - } while (true); - } - -@@ -945,20 +975,19 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, - int read_only, unsigned int ioctl_cmd, unsigned long arg) - { - struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc; -- static char out_env[ND_CMD_MAX_ENVELOPE]; -- static char in_env[ND_CMD_MAX_ENVELOPE]; - const struct nd_cmd_desc *desc = NULL; - unsigned int cmd = _IOC_NR(ioctl_cmd); - struct device *dev = &nvdimm_bus->dev; - void __user *p = (void __user *) arg; -+ char *out_env = NULL, *in_env = NULL; - const char *cmd_name, *dimm_name; - u32 in_len = 0, out_len = 0; - unsigned int func = cmd; - unsigned long cmd_mask; - struct nd_cmd_pkg pkg; - int rc, i, cmd_rc; -+ void *buf = NULL; - u64 buf_len = 0; -- void *buf; - - if (nvdimm) { - desc = nd_cmd_dimm_desc(cmd); -@@ -989,7 +1018,7 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, - case ND_CMD_ARS_START: - case ND_CMD_CLEAR_ERROR: - case ND_CMD_CALL: -- dev_dbg(&nvdimm_bus->dev, "'%s' command while read-only.\n", -+ dev_dbg(dev, "'%s' command while read-only.\n", - nvdimm ? nvdimm_cmd_name(cmd) - : nvdimm_bus_cmd_name(cmd)); - return -EPERM; -@@ -998,6 +1027,9 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, - } - - /* process an input envelope */ -+ in_env = kzalloc(ND_CMD_MAX_ENVELOPE, GFP_KERNEL); -+ if (!in_env) -+ return -ENOMEM; - for (i = 0; i < desc->in_num; i++) { - u32 in_size, copy; - -@@ -1005,14 +1037,17 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, - if (in_size == UINT_MAX) { - dev_err(dev, "%s:%s unknown input size cmd: %s field: %d\n", - __func__, dimm_name, cmd_name, i); -- return -ENXIO; -+ rc = -ENXIO; -+ goto out; - } -- if (in_len < sizeof(in_env)) -- copy = min_t(u32, sizeof(in_env) - in_len, in_size); -+ if (in_len < ND_CMD_MAX_ENVELOPE) -+ copy = min_t(u32, ND_CMD_MAX_ENVELOPE - in_len, in_size); - else - copy = 0; -- if (copy && copy_from_user(&in_env[in_len], p + in_len, copy)) -- return -EFAULT; -+ if (copy && copy_from_user(&in_env[in_len], p + in_len, copy)) { -+ rc = -EFAULT; -+ goto out; -+ } - in_len += in_size; - } - -@@ -1024,6 +1059,12 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, - } - - /* process an output envelope */ -+ out_env = kzalloc(ND_CMD_MAX_ENVELOPE, GFP_KERNEL); -+ if (!out_env) { -+ rc = -ENOMEM; -+ goto out; -+ } -+ - for (i = 0; i < desc->out_num; i++) { - u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i, - (u32 *) in_env, (u32 *) out_env, 0); -@@ -1032,15 +1073,18 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, - if (out_size == UINT_MAX) { - dev_dbg(dev, "%s unknown output size cmd: %s field: %d\n", - dimm_name, cmd_name, i); -- return -EFAULT; -+ rc = -EFAULT; -+ goto out; - } -- if (out_len < sizeof(out_env)) -- copy = min_t(u32, sizeof(out_env) - out_len, out_size); -+ if (out_len < ND_CMD_MAX_ENVELOPE) -+ copy = min_t(u32, ND_CMD_MAX_ENVELOPE - out_len, out_size); - else - copy = 0; - if (copy && copy_from_user(&out_env[out_len], -- p + in_len + out_len, copy)) -- return -EFAULT; -+ p + in_len + out_len, copy)) { -+ rc = -EFAULT; -+ goto out; -+ } - out_len += out_size; - } - -@@ -1048,19 +1092,23 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, - if (buf_len > ND_IOCTL_MAX_BUFLEN) { - dev_dbg(dev, "%s cmd: %s buf_len: %llu > %d\n", dimm_name, - cmd_name, buf_len, ND_IOCTL_MAX_BUFLEN); -- return -EINVAL; -+ rc = -EINVAL; -+ goto out; - } - - buf = vmalloc(buf_len); -- if (!buf) -- return -ENOMEM; -+ if (!buf) { -+ rc = -ENOMEM; -+ goto out; -+ } - - if (copy_from_user(buf, p, buf_len)) { - rc = -EFAULT; - goto out; - } - -- nvdimm_bus_lock(&nvdimm_bus->dev); -+ device_lock(dev); -+ nvdimm_bus_lock(dev); - rc = nd_cmd_clear_to_send(nvdimm_bus, nvdimm, func, buf); - if (rc) - goto out_unlock; -@@ -1075,39 +1123,24 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, - nvdimm_account_cleared_poison(nvdimm_bus, clear_err->address, - clear_err->cleared); - } -- nvdimm_bus_unlock(&nvdimm_bus->dev); - - if (copy_to_user(p, buf, buf_len)) - rc = -EFAULT; - -- vfree(buf); -- return rc; -- -- out_unlock: -- nvdimm_bus_unlock(&nvdimm_bus->dev); -- out: -+out_unlock: -+ nvdimm_bus_unlock(dev); -+ device_unlock(dev); -+out: -+ kfree(in_env); -+ kfree(out_env); - vfree(buf); - return rc; - } - --static long nd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) --{ -- long id = (long) file->private_data; -- int rc = -ENXIO, ro; -- struct nvdimm_bus *nvdimm_bus; -- -- ro = ((file->f_flags & O_ACCMODE) == O_RDONLY); -- mutex_lock(&nvdimm_bus_list_mutex); -- list_for_each_entry(nvdimm_bus, &nvdimm_bus_list, list) { -- if (nvdimm_bus->id == id) { -- rc = __nd_ioctl(nvdimm_bus, NULL, ro, cmd, arg); -- break; -- } -- } -- mutex_unlock(&nvdimm_bus_list_mutex); -- -- return rc; --} -+enum nd_ioctl_mode { -+ BUS_IOCTL, -+ DIMM_IOCTL, -+}; - - static int match_dimm(struct device *dev, void *data) - { -@@ -1122,31 +1155,62 @@ static int match_dimm(struct device *dev, void *data) - return 0; - } - --static long nvdimm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -+static long nd_ioctl(struct file *file, unsigned int cmd, unsigned long arg, -+ enum nd_ioctl_mode mode) -+ - { -- int rc = -ENXIO, ro; -- struct nvdimm_bus *nvdimm_bus; -+ struct nvdimm_bus *nvdimm_bus, *found = NULL; -+ long id = (long) file->private_data; -+ struct nvdimm *nvdimm = NULL; -+ int rc, ro; - - ro = ((file->f_flags & O_ACCMODE) == O_RDONLY); - mutex_lock(&nvdimm_bus_list_mutex); - list_for_each_entry(nvdimm_bus, &nvdimm_bus_list, list) { -- struct device *dev = device_find_child(&nvdimm_bus->dev, -- file->private_data, match_dimm); -- struct nvdimm *nvdimm; -- -- if (!dev) -- continue; -+ if (mode == DIMM_IOCTL) { -+ struct device *dev; -+ -+ dev = device_find_child(&nvdimm_bus->dev, -+ file->private_data, match_dimm); -+ if (!dev) -+ continue; -+ nvdimm = to_nvdimm(dev); -+ found = nvdimm_bus; -+ } else if (nvdimm_bus->id == id) { -+ found = nvdimm_bus; -+ } - -- nvdimm = to_nvdimm(dev); -- rc = __nd_ioctl(nvdimm_bus, nvdimm, ro, cmd, arg); -- put_device(dev); -- break; -+ if (found) { -+ atomic_inc(&nvdimm_bus->ioctl_active); -+ break; -+ } - } - mutex_unlock(&nvdimm_bus_list_mutex); - -+ if (!found) -+ return -ENXIO; -+ -+ nvdimm_bus = found; -+ rc = __nd_ioctl(nvdimm_bus, nvdimm, ro, cmd, arg); -+ -+ if (nvdimm) -+ put_device(&nvdimm->dev); -+ if (atomic_dec_and_test(&nvdimm_bus->ioctl_active)) -+ wake_up(&nvdimm_bus->wait); -+ - return rc; - } - -+static long bus_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ return nd_ioctl(file, cmd, arg, BUS_IOCTL); -+} -+ -+static long dimm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ return nd_ioctl(file, cmd, arg, DIMM_IOCTL); -+} -+ - static int nd_open(struct inode *inode, struct file *file) - { - long minor = iminor(inode); -@@ -1158,16 +1222,16 @@ static int nd_open(struct inode *inode, struct file *file) - static const struct file_operations nvdimm_bus_fops = { - .owner = THIS_MODULE, - .open = nd_open, -- .unlocked_ioctl = nd_ioctl, -- .compat_ioctl = nd_ioctl, -+ .unlocked_ioctl = bus_ioctl, -+ .compat_ioctl = bus_ioctl, - .llseek = noop_llseek, - }; - - static const struct file_operations nvdimm_fops = { - .owner = THIS_MODULE, - .open = nd_open, -- .unlocked_ioctl = nvdimm_ioctl, -- .compat_ioctl = nvdimm_ioctl, -+ .unlocked_ioctl = dimm_ioctl, -+ .compat_ioctl = dimm_ioctl, - .llseek = noop_llseek, - }; - -diff --git a/drivers/nvdimm/dax_devs.c b/drivers/nvdimm/dax_devs.c -index 49fc18ee0565..6d22b0f83b3b 100644 ---- a/drivers/nvdimm/dax_devs.c -+++ b/drivers/nvdimm/dax_devs.c -@@ -118,7 +118,7 @@ int nd_dax_probe(struct device *dev, struct nd_namespace_common *ndns) - nvdimm_bus_unlock(&ndns->dev); - if (!dax_dev) - return -ENOMEM; -- pfn_sb = devm_kzalloc(dev, sizeof(*pfn_sb), GFP_KERNEL); -+ pfn_sb = devm_kmalloc(dev, sizeof(*pfn_sb), GFP_KERNEL); - nd_pfn->pfn_sb = pfn_sb; - rc = nd_pfn_validate(nd_pfn, DAX_SIG); - dev_dbg(dev, "dax: %s\n", rc == 0 ? dev_name(dax_dev) : ""); -diff --git a/drivers/nvdimm/nd-core.h b/drivers/nvdimm/nd-core.h -index 391e88de3a29..6cd470547106 100644 ---- a/drivers/nvdimm/nd-core.h -+++ b/drivers/nvdimm/nd-core.h -@@ -17,10 +17,11 @@ extern struct workqueue_struct *nvdimm_wq; - - struct nvdimm_bus { - struct nvdimm_bus_descriptor *nd_desc; -- wait_queue_head_t probe_wait; -+ wait_queue_head_t wait; - struct list_head list; - struct device dev; - int id, probe_active; -+ atomic_t ioctl_active; - struct list_head mapping_list; - struct mutex reconfig_mutex; - struct badrange badrange; -diff --git a/drivers/nvdimm/pfn.h b/drivers/nvdimm/pfn.h -index f58b849e455b..dfb2bcda8f5a 100644 ---- a/drivers/nvdimm/pfn.h -+++ b/drivers/nvdimm/pfn.h -@@ -28,6 +28,7 @@ struct nd_pfn_sb { - __le32 end_trunc; - /* minor-version-2 record the base alignment of the mapping */ - __le32 align; -+ /* minor-version-3 guarantee the padding and flags are zero */ - u8 padding[4000]; - __le64 checksum; - }; -diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c -index 0f81fc56bbfd..4977424693b0 100644 ---- a/drivers/nvdimm/pfn_devs.c -+++ b/drivers/nvdimm/pfn_devs.c -@@ -412,6 +412,15 @@ static int nd_pfn_clear_memmap_errors(struct nd_pfn *nd_pfn) - return 0; - } - -+/** -+ * nd_pfn_validate - read and validate info-block -+ * @nd_pfn: fsdax namespace runtime state / properties -+ * @sig: 'devdax' or 'fsdax' signature -+ * -+ * Upon return the info-block buffer contents (->pfn_sb) are -+ * indeterminate when validation fails, and a coherent info-block -+ * otherwise. -+ */ - int nd_pfn_validate(struct nd_pfn *nd_pfn, const char *sig) - { - u64 checksum, offset; -@@ -557,7 +566,7 @@ int nd_pfn_probe(struct device *dev, struct nd_namespace_common *ndns) - nvdimm_bus_unlock(&ndns->dev); - if (!pfn_dev) - return -ENOMEM; -- pfn_sb = devm_kzalloc(dev, sizeof(*pfn_sb), GFP_KERNEL); -+ pfn_sb = devm_kmalloc(dev, sizeof(*pfn_sb), GFP_KERNEL); - nd_pfn = to_nd_pfn(pfn_dev); - nd_pfn->pfn_sb = pfn_sb; - rc = nd_pfn_validate(nd_pfn, PFN_SIG); -@@ -694,7 +703,7 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn) - u64 checksum; - int rc; - -- pfn_sb = devm_kzalloc(&nd_pfn->dev, sizeof(*pfn_sb), GFP_KERNEL); -+ pfn_sb = devm_kmalloc(&nd_pfn->dev, sizeof(*pfn_sb), GFP_KERNEL); - if (!pfn_sb) - return -ENOMEM; - -@@ -703,11 +712,14 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn) - sig = DAX_SIG; - else - sig = PFN_SIG; -+ - rc = nd_pfn_validate(nd_pfn, sig); - if (rc != -ENODEV) - return rc; - - /* no info block, do init */; -+ memset(pfn_sb, 0, sizeof(*pfn_sb)); -+ - nd_region = to_nd_region(nd_pfn->dev.parent); - if (nd_region->ro) { - dev_info(&nd_pfn->dev, -@@ -760,7 +772,7 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn) - memcpy(pfn_sb->uuid, nd_pfn->uuid, 16); - memcpy(pfn_sb->parent_uuid, nd_dev_to_uuid(&ndns->dev), 16); - pfn_sb->version_major = cpu_to_le16(1); -- pfn_sb->version_minor = cpu_to_le16(2); -+ pfn_sb->version_minor = cpu_to_le16(3); - pfn_sb->start_pad = cpu_to_le32(start_pad); - pfn_sb->end_trunc = cpu_to_le32(end_trunc); - pfn_sb->align = cpu_to_le32(nd_pfn->align); -diff --git a/drivers/nvdimm/region.c b/drivers/nvdimm/region.c -index ef46cc3a71ae..488c47ac4c4a 100644 ---- a/drivers/nvdimm/region.c -+++ b/drivers/nvdimm/region.c -@@ -34,17 +34,6 @@ static int nd_region_probe(struct device *dev) - if (rc) - return rc; - -- rc = nd_region_register_namespaces(nd_region, &err); -- if (rc < 0) -- return rc; -- -- ndrd = dev_get_drvdata(dev); -- ndrd->ns_active = rc; -- ndrd->ns_count = rc + err; -- -- if (rc && err && rc == err) -- return -ENODEV; -- - if (is_nd_pmem(&nd_region->dev)) { - struct resource ndr_res; - -@@ -60,6 +49,17 @@ static int nd_region_probe(struct device *dev) - nvdimm_badblocks_populate(nd_region, &nd_region->bb, &ndr_res); - } - -+ rc = nd_region_register_namespaces(nd_region, &err); -+ if (rc < 0) -+ return rc; -+ -+ ndrd = dev_get_drvdata(dev); -+ ndrd->ns_active = rc; -+ ndrd->ns_count = rc + err; -+ -+ if (rc && err && rc == err) -+ return -ENODEV; -+ - nd_region->btt_seed = nd_btt_create(nd_region); - nd_region->pfn_seed = nd_pfn_create(nd_region); - nd_region->dax_seed = nd_dax_create(nd_region); -diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c -index 4fed9ce9c2fe..a15276cdec7d 100644 ---- a/drivers/nvdimm/region_devs.c -+++ b/drivers/nvdimm/region_devs.c -@@ -422,10 +422,12 @@ static ssize_t available_size_show(struct device *dev, - * memory nvdimm_bus_lock() is dropped, but that's userspace's - * problem to not race itself. - */ -+ device_lock(dev); - nvdimm_bus_lock(dev); - wait_nvdimm_bus_probe_idle(dev); - available = nd_region_available_dpa(nd_region); - nvdimm_bus_unlock(dev); -+ device_unlock(dev); - - return sprintf(buf, "%llu\n", available); - } -@@ -437,10 +439,12 @@ static ssize_t max_available_extent_show(struct device *dev, - struct nd_region *nd_region = to_nd_region(dev); - unsigned long long available = 0; - -+ device_lock(dev); - nvdimm_bus_lock(dev); - wait_nvdimm_bus_probe_idle(dev); - available = nd_region_allocatable_dpa(nd_region); - nvdimm_bus_unlock(dev); -+ device_unlock(dev); - - return sprintf(buf, "%llu\n", available); - } -diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c -index 120fb593d1da..4a1d2ab4d161 100644 ---- a/drivers/nvme/host/core.c -+++ b/drivers/nvme/host/core.c -@@ -11,6 +11,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -3256,6 +3257,10 @@ static int nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid) - goto out_free_ns; - } - -+ if (ctrl->opts && ctrl->opts->data_digest) -+ ns->queue->backing_dev_info->capabilities -+ |= BDI_CAP_STABLE_WRITES; -+ - blk_queue_flag_set(QUEUE_FLAG_NONROT, ns->queue); - if (ctrl->ops->flags & NVME_F_PCI_P2PDMA) - blk_queue_flag_set(QUEUE_FLAG_PCI_P2PDMA, ns->queue); -@@ -3344,6 +3349,14 @@ static void nvme_ns_remove(struct nvme_ns *ns) - return; - - nvme_fault_inject_fini(ns); -+ -+ mutex_lock(&ns->ctrl->subsys->lock); -+ list_del_rcu(&ns->siblings); -+ mutex_unlock(&ns->ctrl->subsys->lock); -+ synchronize_rcu(); /* guarantee not available in head->list */ -+ nvme_mpath_clear_current_path(ns); -+ synchronize_srcu(&ns->head->srcu); /* wait for concurrent submissions */ -+ - if (ns->disk && ns->disk->flags & GENHD_FL_UP) { - del_gendisk(ns->disk); - blk_cleanup_queue(ns->queue); -@@ -3351,16 +3364,10 @@ static void nvme_ns_remove(struct nvme_ns *ns) - blk_integrity_unregister(ns->disk); - } - -- mutex_lock(&ns->ctrl->subsys->lock); -- list_del_rcu(&ns->siblings); -- nvme_mpath_clear_current_path(ns); -- mutex_unlock(&ns->ctrl->subsys->lock); -- - down_write(&ns->ctrl->namespaces_rwsem); - list_del_init(&ns->list); - up_write(&ns->ctrl->namespaces_rwsem); - -- synchronize_srcu(&ns->head->srcu); - nvme_mpath_check_last_path(ns); - nvme_put_ns(ns); - } -diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c -index 499acf07d61a..e942b3e84068 100644 ---- a/drivers/nvme/host/multipath.c -+++ b/drivers/nvme/host/multipath.c -@@ -12,11 +12,6 @@ module_param(multipath, bool, 0444); - MODULE_PARM_DESC(multipath, - "turn on native support for multiple controllers per subsystem"); - --inline bool nvme_ctrl_use_ana(struct nvme_ctrl *ctrl) --{ -- return multipath && ctrl->subsys && (ctrl->subsys->cmic & (1 << 3)); --} -- - /* - * If multipathing is enabled we need to always use the subsystem instance - * number for numbering our devices to avoid conflicts between subsystems that -@@ -614,7 +609,8 @@ int nvme_mpath_init(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id) - { - int error; - -- if (!nvme_ctrl_use_ana(ctrl)) -+ /* check if multipath is enabled and we have the capability */ -+ if (!multipath || !ctrl->subsys || !(ctrl->subsys->cmic & (1 << 3))) - return 0; - - ctrl->anacap = id->anacap; -diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h -index 55553d293a98..7391cd0a7739 100644 ---- a/drivers/nvme/host/nvme.h -+++ b/drivers/nvme/host/nvme.h -@@ -472,7 +472,11 @@ extern const struct attribute_group *nvme_ns_id_attr_groups[]; - extern const struct block_device_operations nvme_ns_head_ops; - - #ifdef CONFIG_NVME_MULTIPATH --bool nvme_ctrl_use_ana(struct nvme_ctrl *ctrl); -+static inline bool nvme_ctrl_use_ana(struct nvme_ctrl *ctrl) -+{ -+ return ctrl->ana_log_buf != NULL; -+} -+ - void nvme_set_disk_name(char *disk_name, struct nvme_ns *ns, - struct nvme_ctrl *ctrl, int *flags); - void nvme_failover_req(struct request *req); -diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c -index 524d6bd6d095..7fbcd72c438f 100644 ---- a/drivers/nvme/host/pci.c -+++ b/drivers/nvme/host/pci.c -@@ -1456,11 +1456,15 @@ static int nvme_alloc_sq_cmds(struct nvme_dev *dev, struct nvme_queue *nvmeq, - - if (qid && dev->cmb_use_sqes && (dev->cmbsz & NVME_CMBSZ_SQS)) { - nvmeq->sq_cmds = pci_alloc_p2pmem(pdev, SQ_SIZE(depth)); -- nvmeq->sq_dma_addr = pci_p2pmem_virt_to_bus(pdev, -- nvmeq->sq_cmds); -- if (nvmeq->sq_dma_addr) { -- set_bit(NVMEQ_SQ_CMB, &nvmeq->flags); -- return 0; -+ if (nvmeq->sq_cmds) { -+ nvmeq->sq_dma_addr = pci_p2pmem_virt_to_bus(pdev, -+ nvmeq->sq_cmds); -+ if (nvmeq->sq_dma_addr) { -+ set_bit(NVMEQ_SQ_CMB, &nvmeq->flags); -+ return 0; -+ } -+ -+ pci_free_p2pmem(pdev, nvmeq->sq_cmds, SQ_SIZE(depth)); - } - } - -@@ -2068,6 +2072,7 @@ static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) - .priv = dev, - }; - unsigned int irq_queues, this_p_queues; -+ unsigned int nr_cpus = num_possible_cpus(); - - /* - * Poll queues don't need interrupts, but we need at least one IO -@@ -2078,7 +2083,10 @@ static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) - this_p_queues = nr_io_queues - 1; - irq_queues = 1; - } else { -- irq_queues = nr_io_queues - this_p_queues + 1; -+ if (nr_cpus < nr_io_queues - this_p_queues) -+ irq_queues = nr_cpus + 1; -+ else -+ irq_queues = nr_io_queues - this_p_queues + 1; - } - dev->io_queues[HCTX_TYPE_POLL] = this_p_queues; - -@@ -2480,11 +2488,13 @@ static void nvme_reset_work(struct work_struct *work) - struct nvme_dev *dev = - container_of(work, struct nvme_dev, ctrl.reset_work); - bool was_suspend = !!(dev->ctrl.ctrl_config & NVME_CC_SHN_NORMAL); -- int result = -ENODEV; -+ int result; - enum nvme_ctrl_state new_state = NVME_CTRL_LIVE; - -- if (WARN_ON(dev->ctrl.state != NVME_CTRL_RESETTING)) -+ if (WARN_ON(dev->ctrl.state != NVME_CTRL_RESETTING)) { -+ result = -ENODEV; - goto out; -+ } - - /* - * If we're called to reset a live controller first shut it down before -@@ -2511,7 +2521,8 @@ static void nvme_reset_work(struct work_struct *work) - * Limit the max command size to prevent iod->sg allocations going - * over a single page. - */ -- dev->ctrl.max_hw_sectors = NVME_MAX_KB_SZ << 1; -+ dev->ctrl.max_hw_sectors = min_t(u32, -+ NVME_MAX_KB_SZ << 1, dma_max_mapping_size(dev->dev) >> 9); - dev->ctrl.max_segments = NVME_MAX_SEGS; - - /* -@@ -2528,6 +2539,7 @@ static void nvme_reset_work(struct work_struct *work) - if (!nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_CONNECTING)) { - dev_warn(dev->ctrl.device, - "failed to mark controller CONNECTING\n"); -+ result = -EBUSY; - goto out; - } - -@@ -2588,6 +2600,7 @@ static void nvme_reset_work(struct work_struct *work) - if (!nvme_change_ctrl_state(&dev->ctrl, new_state)) { - dev_warn(dev->ctrl.device, - "failed to mark controller state %d\n", new_state); -+ result = -ENODEV; - goto out; - } - -diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c -index 08a2501b9357..606b13d35d16 100644 ---- a/drivers/nvme/host/tcp.c -+++ b/drivers/nvme/host/tcp.c -@@ -860,7 +860,14 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req) - else - flags |= MSG_MORE; - -- ret = kernel_sendpage(queue->sock, page, offset, len, flags); -+ /* can't zcopy slab pages */ -+ if (unlikely(PageSlab(page))) { -+ ret = sock_no_sendpage(queue->sock, page, offset, len, -+ flags); -+ } else { -+ ret = kernel_sendpage(queue->sock, page, offset, len, -+ flags); -+ } - if (ret <= 0) - return ret; - -diff --git a/drivers/opp/core.c b/drivers/opp/core.c -index 3a9789388bfb..6b2f7cadec3c 100644 ---- a/drivers/opp/core.c -+++ b/drivers/opp/core.c -@@ -682,7 +682,7 @@ static int _set_opp_custom(const struct opp_table *opp_table, - - data->old_opp.rate = old_freq; - size = sizeof(*old_supply) * opp_table->regulator_count; -- if (IS_ERR(old_supply)) -+ if (!old_supply) - memset(data->old_opp.supplies, 0, size); - else - memcpy(data->old_opp.supplies, old_supply, size); -diff --git a/drivers/parport/ieee1284.c b/drivers/parport/ieee1284.c -index 90fb73575495..c94048b048a5 100644 ---- a/drivers/parport/ieee1284.c -+++ b/drivers/parport/ieee1284.c -@@ -208,7 +208,7 @@ int parport_wait_peripheral(struct parport *port, - /* parport_wait_event didn't time out, but the - * peripheral wasn't actually ready either. - * Wait for another 10ms. */ -- schedule_timeout_interruptible(msecs_to_jiffies(10)); -+ schedule_msec_hrtimeout_interruptible((10)); - } - } - -diff --git a/drivers/parport/ieee1284_ops.c b/drivers/parport/ieee1284_ops.c -index 5d41dda6da4e..34705f6b423f 100644 ---- a/drivers/parport/ieee1284_ops.c -+++ b/drivers/parport/ieee1284_ops.c -@@ -537,7 +537,7 @@ size_t parport_ieee1284_ecp_read_data (struct parport *port, - /* Yield the port for a while. */ - if (count && dev->port->irq != PARPORT_IRQ_NONE) { - parport_release (dev); -- schedule_timeout_interruptible(msecs_to_jiffies(40)); -+ schedule_msec_hrtimeout_interruptible((40)); - parport_claim_or_block (dev); - } - else -diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c b/drivers/pci/controller/dwc/pci-dra7xx.c -index 419451efd58c..4234ddb4722f 100644 ---- a/drivers/pci/controller/dwc/pci-dra7xx.c -+++ b/drivers/pci/controller/dwc/pci-dra7xx.c -@@ -26,6 +26,7 @@ - #include - #include - #include -+#include - - #include "../../pci.h" - #include "pcie-designware.h" -diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c -index 0ed235d560e3..5d1713069d14 100644 ---- a/drivers/pci/controller/dwc/pcie-qcom.c -+++ b/drivers/pci/controller/dwc/pcie-qcom.c -@@ -178,6 +178,8 @@ static void qcom_ep_reset_assert(struct qcom_pcie *pcie) - - static void qcom_ep_reset_deassert(struct qcom_pcie *pcie) - { -+ /* Ensure that PERST has been asserted for at least 100 ms */ -+ msleep(100); - gpiod_set_value_cansleep(pcie->reset, 0); - usleep_range(PERST_DELAY_US, PERST_DELAY_US + 500); - } -diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c -index 82acd6155adf..40b625458afa 100644 ---- a/drivers/pci/controller/pci-hyperv.c -+++ b/drivers/pci/controller/pci-hyperv.c -@@ -1875,6 +1875,7 @@ static void hv_pci_devices_present(struct hv_pcibus_device *hbus, - static void hv_eject_device_work(struct work_struct *work) - { - struct pci_eject_response *ejct_pkt; -+ struct hv_pcibus_device *hbus; - struct hv_pci_dev *hpdev; - struct pci_dev *pdev; - unsigned long flags; -@@ -1885,6 +1886,7 @@ static void hv_eject_device_work(struct work_struct *work) - } ctxt; - - hpdev = container_of(work, struct hv_pci_dev, wrk); -+ hbus = hpdev->hbus; - - WARN_ON(hpdev->state != hv_pcichild_ejecting); - -@@ -1895,8 +1897,7 @@ static void hv_eject_device_work(struct work_struct *work) - * because hbus->pci_bus may not exist yet. - */ - wslot = wslot_to_devfn(hpdev->desc.win_slot.slot); -- pdev = pci_get_domain_bus_and_slot(hpdev->hbus->sysdata.domain, 0, -- wslot); -+ pdev = pci_get_domain_bus_and_slot(hbus->sysdata.domain, 0, wslot); - if (pdev) { - pci_lock_rescan_remove(); - pci_stop_and_remove_bus_device(pdev); -@@ -1904,9 +1905,9 @@ static void hv_eject_device_work(struct work_struct *work) - pci_unlock_rescan_remove(); - } - -- spin_lock_irqsave(&hpdev->hbus->device_list_lock, flags); -+ spin_lock_irqsave(&hbus->device_list_lock, flags); - list_del(&hpdev->list_entry); -- spin_unlock_irqrestore(&hpdev->hbus->device_list_lock, flags); -+ spin_unlock_irqrestore(&hbus->device_list_lock, flags); - - if (hpdev->pci_slot) - pci_destroy_slot(hpdev->pci_slot); -@@ -1915,7 +1916,7 @@ static void hv_eject_device_work(struct work_struct *work) - ejct_pkt = (struct pci_eject_response *)&ctxt.pkt.message; - ejct_pkt->message_type.type = PCI_EJECTION_COMPLETE; - ejct_pkt->wslot.slot = hpdev->desc.win_slot.slot; -- vmbus_sendpacket(hpdev->hbus->hdev->channel, ejct_pkt, -+ vmbus_sendpacket(hbus->hdev->channel, ejct_pkt, - sizeof(*ejct_pkt), (unsigned long)&ctxt.pkt, - VM_PKT_DATA_INBAND, 0); - -@@ -1924,7 +1925,9 @@ static void hv_eject_device_work(struct work_struct *work) - /* For the two refs got in new_pcichild_device() */ - put_pcichild(hpdev); - put_pcichild(hpdev); -- put_hvpcibus(hpdev->hbus); -+ /* hpdev has been freed. Do not use it any more. */ -+ -+ put_hvpcibus(hbus); - } - - /** -diff --git a/drivers/pci/controller/pcie-mobiveil.c b/drivers/pci/controller/pcie-mobiveil.c -index 77052a0712d0..387a20f3c240 100644 ---- a/drivers/pci/controller/pcie-mobiveil.c -+++ b/drivers/pci/controller/pcie-mobiveil.c -@@ -501,6 +501,12 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) - return err; - } - -+ /* setup bus numbers */ -+ value = csr_readl(pcie, PCI_PRIMARY_BUS); -+ value &= 0xff000000; -+ value |= 0x00ff0100; -+ csr_writel(pcie, value, PCI_PRIMARY_BUS); -+ - /* - * program Bus Master Enable Bit in Command Register in PAB Config - * Space -@@ -540,7 +546,7 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) - resource_size(pcie->ob_io_res)); - - /* memory inbound translation window */ -- program_ib_windows(pcie, WIN_NUM_1, 0, MEM_WINDOW_TYPE, IB_WIN_SIZE); -+ program_ib_windows(pcie, WIN_NUM_0, 0, MEM_WINDOW_TYPE, IB_WIN_SIZE); - - /* Get the I/O and memory ranges from DT */ - resource_list_for_each_entry_safe(win, tmp, &pcie->resources) { -@@ -552,11 +558,18 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) - if (type) { - /* configure outbound translation window */ - program_ob_windows(pcie, pcie->ob_wins_configured, -- win->res->start, 0, type, -- resource_size(win->res)); -+ win->res->start, -+ win->res->start - win->offset, -+ type, resource_size(win->res)); - } - } - -+ /* fixup for PCIe class register */ -+ value = csr_readl(pcie, PAB_INTP_AXI_PIO_CLASS); -+ value &= 0xff; -+ value |= (PCI_CLASS_BRIDGE_PCI << 16); -+ csr_writel(pcie, value, PAB_INTP_AXI_PIO_CLASS); -+ - /* setup MSI hardware registers */ - mobiveil_pcie_enable_msi(pcie); - -@@ -797,9 +810,6 @@ static int mobiveil_pcie_probe(struct platform_device *pdev) - goto error; - } - -- /* fixup for PCIe class register */ -- csr_writel(pcie, 0x060402ab, PAB_INTP_AXI_PIO_CLASS); -- - /* initialize the IRQ domains */ - ret = mobiveil_pcie_init_irq_domain(pcie); - if (ret) { -diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c -index 3b031f00a94a..45c0f344ccd1 100644 ---- a/drivers/pci/controller/pcie-xilinx-nwl.c -+++ b/drivers/pci/controller/pcie-xilinx-nwl.c -@@ -482,15 +482,13 @@ static int nwl_irq_domain_alloc(struct irq_domain *domain, unsigned int virq, - int i; - - mutex_lock(&msi->lock); -- bit = bitmap_find_next_zero_area(msi->bitmap, INT_PCI_MSI_NR, 0, -- nr_irqs, 0); -- if (bit >= INT_PCI_MSI_NR) { -+ bit = bitmap_find_free_region(msi->bitmap, INT_PCI_MSI_NR, -+ get_count_order(nr_irqs)); -+ if (bit < 0) { - mutex_unlock(&msi->lock); - return -ENOSPC; - } - -- bitmap_set(msi->bitmap, bit, nr_irqs); -- - for (i = 0; i < nr_irqs; i++) { - irq_domain_set_info(domain, virq + i, bit + i, &nwl_irq_chip, - domain->host_data, handle_simple_irq, -@@ -508,7 +506,8 @@ static void nwl_irq_domain_free(struct irq_domain *domain, unsigned int virq, - struct nwl_msi *msi = &pcie->msi; - - mutex_lock(&msi->lock); -- bitmap_clear(msi->bitmap, data->hwirq, nr_irqs); -+ bitmap_release_region(msi->bitmap, data->hwirq, -+ get_count_order(nr_irqs)); - mutex_unlock(&msi->lock); - } - -diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c -index 27806987e93b..7d41e6684b87 100644 ---- a/drivers/pci/endpoint/functions/pci-epf-test.c -+++ b/drivers/pci/endpoint/functions/pci-epf-test.c -@@ -434,10 +434,16 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf) - int bar; - enum pci_barno test_reg_bar = epf_test->test_reg_bar; - const struct pci_epc_features *epc_features; -+ size_t test_reg_size; - - epc_features = epf_test->epc_features; - -- base = pci_epf_alloc_space(epf, sizeof(struct pci_epf_test_reg), -+ if (epc_features->bar_fixed_size[test_reg_bar]) -+ test_reg_size = bar_size[test_reg_bar]; -+ else -+ test_reg_size = sizeof(struct pci_epf_test_reg); -+ -+ base = pci_epf_alloc_space(epf, test_reg_size, - test_reg_bar, epc_features->align); - if (!base) { - dev_err(dev, "Failed to allocated register space\n"); -diff --git a/drivers/pci/of.c b/drivers/pci/of.c -index 73d5adec0a28..bc7b27a28795 100644 ---- a/drivers/pci/of.c -+++ b/drivers/pci/of.c -@@ -22,12 +22,15 @@ void pci_set_of_node(struct pci_dev *dev) - return; - dev->dev.of_node = of_pci_find_child_device(dev->bus->dev.of_node, - dev->devfn); -+ if (dev->dev.of_node) -+ dev->dev.fwnode = &dev->dev.of_node->fwnode; - } - - void pci_release_of_node(struct pci_dev *dev) - { - of_node_put(dev->dev.of_node); - dev->dev.of_node = NULL; -+ dev->dev.fwnode = NULL; - } - - void pci_set_bus_of_node(struct pci_bus *bus) -@@ -41,13 +44,18 @@ void pci_set_bus_of_node(struct pci_bus *bus) - if (node && of_property_read_bool(node, "external-facing")) - bus->self->untrusted = true; - } -+ - bus->dev.of_node = node; -+ -+ if (bus->dev.of_node) -+ bus->dev.fwnode = &bus->dev.of_node->fwnode; - } - - void pci_release_bus_of_node(struct pci_bus *bus) - { - of_node_put(bus->dev.of_node); - bus->dev.of_node = NULL; -+ bus->dev.fwnode = NULL; - } - - struct device_node * __weak pcibios_get_phb_of_node(struct pci_bus *bus) -diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c -index ca3793002e2f..74c3df250d9c 100644 ---- a/drivers/pci/pci-driver.c -+++ b/drivers/pci/pci-driver.c -@@ -414,6 +414,9 @@ static int pci_device_probe(struct device *dev) - struct pci_dev *pci_dev = to_pci_dev(dev); - struct pci_driver *drv = to_pci_driver(dev->driver); - -+ if (!pci_device_can_probe(pci_dev)) -+ return -ENODEV; -+ - pci_assign_irq(pci_dev); - - error = pcibios_alloc_irq(pci_dev); -@@ -421,12 +424,10 @@ static int pci_device_probe(struct device *dev) - return error; - - pci_dev_get(pci_dev); -- if (pci_device_can_probe(pci_dev)) { -- error = __pci_device_probe(drv, pci_dev); -- if (error) { -- pcibios_free_irq(pci_dev); -- pci_dev_put(pci_dev); -- } -+ error = __pci_device_probe(drv, pci_dev); -+ if (error) { -+ pcibios_free_irq(pci_dev); -+ pci_dev_put(pci_dev); - } - - return error; -diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c -index 6d27475e39b2..4e83c347de5d 100644 ---- a/drivers/pci/pci-sysfs.c -+++ b/drivers/pci/pci-sysfs.c -@@ -477,7 +477,7 @@ static ssize_t remove_store(struct device *dev, struct device_attribute *attr, - pci_stop_and_remove_bus_device_locked(to_pci_dev(dev)); - return count; - } --static struct device_attribute dev_remove_attr = __ATTR(remove, -+static struct device_attribute dev_remove_attr = __ATTR_IGNORE_LOCKDEP(remove, - (S_IWUSR|S_IWGRP), - NULL, remove_store); - -diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c -index 8abc843b1615..088fcdc8d2b4 100644 ---- a/drivers/pci/pci.c -+++ b/drivers/pci/pci.c -@@ -2065,6 +2065,13 @@ static void pci_pme_list_scan(struct work_struct *work) - */ - if (bridge && bridge->current_state != PCI_D0) - continue; -+ /* -+ * If the device is in D3cold it should not be -+ * polled either. -+ */ -+ if (pme_dev->dev->current_state == PCI_D3cold) -+ continue; -+ - pci_pme_wakeup(pme_dev->dev, NULL); - } else { - list_del(&pme_dev->list); -diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c -index 2d06b8095a19..df352b334ea7 100644 ---- a/drivers/perf/arm_pmu.c -+++ b/drivers/perf/arm_pmu.c -@@ -723,8 +723,8 @@ static int cpu_pm_pmu_notify(struct notifier_block *b, unsigned long cmd, - cpu_pm_pmu_setup(armpmu, cmd); - break; - case CPU_PM_EXIT: -- cpu_pm_pmu_setup(armpmu, cmd); - case CPU_PM_ENTER_FAILED: -+ cpu_pm_pmu_setup(armpmu, cmd); - armpmu->start(armpmu); - break; - default: -diff --git a/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c b/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c -index 6233a7979a93..ac322d643c7a 100644 ---- a/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c -+++ b/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c -@@ -188,7 +188,7 @@ static const struct regmap_config phy_g12a_usb3_pcie_cr_regmap_conf = { - .reg_read = phy_g12a_usb3_pcie_cr_bus_read, - .reg_write = phy_g12a_usb3_pcie_cr_bus_write, - .max_register = 0xffff, -- .fast_io = true, -+ .disable_locking = true, - }; - - static int phy_g12a_usb3_init(struct phy *phy) -diff --git a/drivers/phy/qualcomm/phy-qcom-qmp.c b/drivers/phy/qualcomm/phy-qcom-qmp.c -index cd91b4179b10..43abdfd0deed 100644 ---- a/drivers/phy/qualcomm/phy-qcom-qmp.c -+++ b/drivers/phy/qualcomm/phy-qcom-qmp.c -@@ -1074,6 +1074,7 @@ static const struct qmp_phy_cfg msm8996_pciephy_cfg = { - - .start_ctrl = PCS_START | PLL_READY_GATE_EN, - .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL, -+ .mask_pcs_ready = PHYSTATUS, - .mask_com_pcs_ready = PCS_READY, - - .has_phy_com_ctrl = true, -@@ -1253,6 +1254,7 @@ static const struct qmp_phy_cfg msm8998_pciephy_cfg = { - - .start_ctrl = SERDES_START | PCS_START, - .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL, -+ .mask_pcs_ready = PHYSTATUS, - .mask_com_pcs_ready = PCS_READY, - }; - -@@ -1547,7 +1549,7 @@ static int qcom_qmp_phy_enable(struct phy *phy) - status = pcs + cfg->regs[QPHY_PCS_READY_STATUS]; - mask = cfg->mask_pcs_ready; - -- ret = readl_poll_timeout(status, val, !(val & mask), 1, -+ ret = readl_poll_timeout(status, val, val & mask, 1, - PHY_INIT_COMPLETE_TIMEOUT); - if (ret) { - dev_err(qmp->dev, "phy initialization timed-out\n"); -diff --git a/drivers/phy/renesas/phy-rcar-gen2.c b/drivers/phy/renesas/phy-rcar-gen2.c -index 8dc5710d9c98..2926e4937301 100644 ---- a/drivers/phy/renesas/phy-rcar-gen2.c -+++ b/drivers/phy/renesas/phy-rcar-gen2.c -@@ -391,6 +391,7 @@ static int rcar_gen2_phy_probe(struct platform_device *pdev) - error = of_property_read_u32(np, "reg", &channel_num); - if (error || channel_num > 2) { - dev_err(dev, "Invalid \"reg\" property\n"); -+ of_node_put(np); - return error; - } - channel->select_mask = select_mask[channel_num]; -@@ -406,6 +407,7 @@ static int rcar_gen2_phy_probe(struct platform_device *pdev) - data->gen2_phy_ops); - if (IS_ERR(phy->phy)) { - dev_err(dev, "Failed to create PHY\n"); -+ of_node_put(np); - return PTR_ERR(phy->phy); - } - phy_set_drvdata(phy->phy, phy); -diff --git a/drivers/phy/renesas/phy-rcar-gen3-usb2.c b/drivers/phy/renesas/phy-rcar-gen3-usb2.c -index 1322185a00a2..8ffba67568ec 100644 ---- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c -+++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -106,6 +107,7 @@ struct rcar_gen3_chan { - struct rcar_gen3_phy rphys[NUM_OF_PHYS]; - struct regulator *vbus; - struct work_struct work; -+ struct mutex lock; /* protects rphys[...].powered */ - enum usb_dr_mode dr_mode; - bool extcon_host; - bool is_otg_channel; -@@ -437,15 +439,16 @@ static int rcar_gen3_phy_usb2_power_on(struct phy *p) - struct rcar_gen3_chan *channel = rphy->ch; - void __iomem *usb2_base = channel->base; - u32 val; -- int ret; -+ int ret = 0; - -+ mutex_lock(&channel->lock); - if (!rcar_gen3_are_all_rphys_power_off(channel)) -- return 0; -+ goto out; - - if (channel->vbus) { - ret = regulator_enable(channel->vbus); - if (ret) -- return ret; -+ goto out; - } - - val = readl(usb2_base + USB2_USBCTR); -@@ -454,7 +457,10 @@ static int rcar_gen3_phy_usb2_power_on(struct phy *p) - val &= ~USB2_USBCTR_PLL_RST; - writel(val, usb2_base + USB2_USBCTR); - -+out: -+ /* The powered flag should be set for any other phys anyway */ - rphy->powered = true; -+ mutex_unlock(&channel->lock); - - return 0; - } -@@ -465,14 +471,18 @@ static int rcar_gen3_phy_usb2_power_off(struct phy *p) - struct rcar_gen3_chan *channel = rphy->ch; - int ret = 0; - -+ mutex_lock(&channel->lock); - rphy->powered = false; - - if (!rcar_gen3_are_all_rphys_power_off(channel)) -- return 0; -+ goto out; - - if (channel->vbus) - ret = regulator_disable(channel->vbus); - -+out: -+ mutex_unlock(&channel->lock); -+ - return ret; - } - -@@ -639,6 +649,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev) - if (!phy_usb2_ops) - return -EINVAL; - -+ mutex_init(&channel->lock); - for (i = 0; i < NUM_OF_PHYS; i++) { - channel->rphys[i].phy = devm_phy_create(dev, NULL, - phy_usb2_ops); -diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c -index 807a3263d849..62a622159006 100644 ---- a/drivers/pinctrl/pinctrl-rockchip.c -+++ b/drivers/pinctrl/pinctrl-rockchip.c -@@ -3204,6 +3204,7 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank, - base, - &rockchip_regmap_config); - } -+ of_node_put(node); - } - - bank->irq = irq_of_parse_and_map(bank->of_node, 0); -diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig -index 5d5cc6111081..a2b36f2eb1c0 100644 ---- a/drivers/platform/x86/Kconfig -+++ b/drivers/platform/x86/Kconfig -@@ -623,9 +623,28 @@ config THINKPAD_ACPI_HOTKEY_POLL - If you are not sure, say Y here. The driver enables polling only if - it is strictly necessary to do so. - -+config THINKPAD_EC -+ tristate -+ ---help--- -+ This is a low-level driver for accessing the ThinkPad H8S embedded -+ controller over the LPC bus (not to be confused with the ACPI Embedded -+ Controller interface). -+ -+config TP_SMAPI -+ tristate "ThinkPad SMAPI Support" -+ select THINKPAD_EC -+ default n -+ help -+ This adds SMAPI support on Lenovo/IBM ThinkPads, for features such -+ as battery charging control. For more information about this driver -+ see . -+ -+ If you have a Lenovo/IBM ThinkPad laptop, say Y or M here. -+ - config SENSORS_HDAPS - tristate "Thinkpad Hard Drive Active Protection System (hdaps)" - depends on INPUT -+ select THINKPAD_EC - select INPUT_POLLDEV - help - This driver provides support for the IBM Hard Drive Active Protection -@@ -1317,7 +1336,7 @@ config HUAWEI_WMI - - config PCENGINES_APU2 - tristate "PC Engines APUv2/3 front button and LEDs driver" -- depends on INPUT && INPUT_KEYBOARD -+ depends on INPUT && INPUT_KEYBOARD && GPIOLIB - depends on LEDS_CLASS - select GPIO_AMD_FCH - select KEYBOARD_GPIO_POLLED -diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile -index 87b0069bd781..a0535f9f2aac 100644 ---- a/drivers/platform/x86/Makefile -+++ b/drivers/platform/x86/Makefile -@@ -39,6 +39,8 @@ obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o - obj-$(CONFIG_SONY_LAPTOP) += sony-laptop.o - obj-$(CONFIG_IDEAPAD_LAPTOP) += ideapad-laptop.o - obj-$(CONFIG_THINKPAD_ACPI) += thinkpad_acpi.o -+obj-$(CONFIG_THINKPAD_EC) += thinkpad_ec.o -+obj-$(CONFIG_TP_SMAPI) += tp_smapi.o - obj-$(CONFIG_SENSORS_HDAPS) += hdaps.o - obj-$(CONFIG_FUJITSU_LAPTOP) += fujitsu-laptop.o - obj-$(CONFIG_FUJITSU_TABLET) += fujitsu-tablet.o -diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c -index 9b18a184e0aa..abfa99d18fea 100644 ---- a/drivers/platform/x86/asus-wmi.c -+++ b/drivers/platform/x86/asus-wmi.c -@@ -85,6 +85,7 @@ static bool ashs_present(void) - struct bios_args { - u32 arg0; - u32 arg1; -+ u32 arg2; /* At least TUF Gaming series uses 3 dword input buffer. */ - } __packed; - - /* -@@ -211,11 +212,13 @@ static void asus_wmi_input_exit(struct asus_wmi *asus) - asus->inputdev = NULL; - } - --int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval) -+static int asus_wmi_evaluate_method3(u32 method_id, -+ u32 arg0, u32 arg1, u32 arg2, u32 *retval) - { - struct bios_args args = { - .arg0 = arg0, - .arg1 = arg1, -+ .arg2 = arg2, - }; - struct acpi_buffer input = { (acpi_size) sizeof(args), &args }; - struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; -@@ -247,6 +250,11 @@ int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval) - - return 0; - } -+ -+int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval) -+{ -+ return asus_wmi_evaluate_method3(method_id, arg0, arg1, 0, retval); -+} - EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method); - - static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args) -diff --git a/drivers/platform/x86/hdaps.c b/drivers/platform/x86/hdaps.c -index 3adcb0de0193..5e4232be23d6 100644 ---- a/drivers/platform/x86/hdaps.c -+++ b/drivers/platform/x86/hdaps.c -@@ -3,7 +3,7 @@ - * hdaps.c - driver for IBM's Hard Drive Active Protection System - * - * Copyright (C) 2005 Robert Love -- * Copyright (C) 2005 Jesper Juhl -+ * Copyright (C) 2005 Jesper Juhl - * - * The HardDisk Active Protection System (hdaps) is present in IBM ThinkPads - * starting with the R40, T41, and X40. It provides a basic two-axis -@@ -18,266 +18,384 @@ - - #include - #include --#include -+#include - #include --#include - #include - #include - #include - #include --#include -- --#define HDAPS_LOW_PORT 0x1600 /* first port used by hdaps */ --#define HDAPS_NR_PORTS 0x30 /* number of ports: 0x1600 - 0x162f */ -- --#define HDAPS_PORT_STATE 0x1611 /* device state */ --#define HDAPS_PORT_YPOS 0x1612 /* y-axis position */ --#define HDAPS_PORT_XPOS 0x1614 /* x-axis position */ --#define HDAPS_PORT_TEMP1 0x1616 /* device temperature, in Celsius */ --#define HDAPS_PORT_YVAR 0x1617 /* y-axis variance (what is this?) */ --#define HDAPS_PORT_XVAR 0x1619 /* x-axis variance (what is this?) */ --#define HDAPS_PORT_TEMP2 0x161b /* device temperature (again?) */ --#define HDAPS_PORT_UNKNOWN 0x161c /* what is this? */ --#define HDAPS_PORT_KMACT 0x161d /* keyboard or mouse activity */ -- --#define STATE_FRESH 0x50 /* accelerometer data is fresh */ -+#include -+#include -+#include -+ -+/* Embedded controller accelerometer read command and its result: */ -+static const struct thinkpad_ec_row ec_accel_args = -+ { .mask = 0x0001, .val = {0x11} }; -+#define EC_ACCEL_IDX_READOUTS 0x1 /* readouts included in this read */ -+ /* First readout, if READOUTS>=1: */ -+#define EC_ACCEL_IDX_YPOS1 0x2 /* y-axis position word */ -+#define EC_ACCEL_IDX_XPOS1 0x4 /* x-axis position word */ -+#define EC_ACCEL_IDX_TEMP1 0x6 /* device temperature in Celsius */ -+ /* Second readout, if READOUTS>=2: */ -+#define EC_ACCEL_IDX_XPOS2 0x7 /* y-axis position word */ -+#define EC_ACCEL_IDX_YPOS2 0x9 /* x-axis position word */ -+#define EC_ACCEL_IDX_TEMP2 0xb /* device temperature in Celsius */ -+#define EC_ACCEL_IDX_QUEUED 0xc /* Number of queued readouts left */ -+#define EC_ACCEL_IDX_KMACT 0xd /* keyboard or mouse activity */ -+#define EC_ACCEL_IDX_RETVAL 0xf /* command return value, good=0x00 */ - - #define KEYBD_MASK 0x20 /* set if keyboard activity */ - #define MOUSE_MASK 0x40 /* set if mouse activity */ --#define KEYBD_ISSET(n) (!! (n & KEYBD_MASK)) /* keyboard used? */ --#define MOUSE_ISSET(n) (!! (n & MOUSE_MASK)) /* mouse used? */ - --#define INIT_TIMEOUT_MSECS 4000 /* wait up to 4s for device init ... */ --#define INIT_WAIT_MSECS 200 /* ... in 200ms increments */ -+#define READ_TIMEOUT_MSECS 100 /* wait this long for device read */ -+#define RETRY_MSECS 3 /* retry delay */ - --#define HDAPS_POLL_INTERVAL 50 /* poll for input every 1/20s (50 ms)*/ - #define HDAPS_INPUT_FUZZ 4 /* input event threshold */ - #define HDAPS_INPUT_FLAT 4 -- --#define HDAPS_X_AXIS (1 << 0) --#define HDAPS_Y_AXIS (1 << 1) --#define HDAPS_BOTH_AXES (HDAPS_X_AXIS | HDAPS_Y_AXIS) -- -+#define KMACT_REMEMBER_PERIOD (HZ/10) /* keyboard/mouse persistence */ -+ -+/* Input IDs */ -+#define HDAPS_INPUT_VENDOR PCI_VENDOR_ID_IBM -+#define HDAPS_INPUT_PRODUCT 0x5054 /* "TP", shared with thinkpad_acpi */ -+#define HDAPS_INPUT_JS_VERSION 0x6801 /* Joystick emulation input device */ -+#define HDAPS_INPUT_RAW_VERSION 0x4801 /* Raw accelerometer input device */ -+ -+/* Axis orientation. */ -+/* The unnatural bit-representation of inversions is for backward -+ * compatibility with the"invert=1" module parameter. */ -+#define HDAPS_ORIENT_INVERT_XY 0x01 /* Invert both X and Y axes. */ -+#define HDAPS_ORIENT_INVERT_X 0x02 /* Invert the X axis (uninvert if -+ * already inverted by INVERT_XY). */ -+#define HDAPS_ORIENT_SWAP 0x04 /* Swap the axes. The swap occurs -+ * before inverting X or Y. */ -+#define HDAPS_ORIENT_MAX 0x07 -+#define HDAPS_ORIENT_UNDEFINED 0xFF /* Placeholder during initialization */ -+#define HDAPS_ORIENT_INVERT_Y (HDAPS_ORIENT_INVERT_XY | HDAPS_ORIENT_INVERT_X) -+ -+static struct timer_list hdaps_timer; - static struct platform_device *pdev; --static struct input_polled_dev *hdaps_idev; --static unsigned int hdaps_invert; --static u8 km_activity; --static int rest_x; --static int rest_y; -- --static DEFINE_MUTEX(hdaps_mtx); -- --/* -- * __get_latch - Get the value from a given port. Callers must hold hdaps_mtx. -- */ --static inline u8 __get_latch(u16 port) -+static struct input_dev *hdaps_idev; /* joystick-like device with fuzz */ -+static struct input_dev *hdaps_idev_raw; /* raw hdaps sensor readouts */ -+static unsigned int hdaps_invert = HDAPS_ORIENT_UNDEFINED; -+static int needs_calibration; -+ -+/* Configuration: */ -+static int sampling_rate = 50; /* Sampling rate */ -+static int oversampling_ratio = 5; /* Ratio between our sampling rate and -+ * EC accelerometer sampling rate */ -+static int running_avg_filter_order = 2; /* EC running average filter order */ -+ -+/* Latest state readout: */ -+static int pos_x, pos_y; /* position */ -+static int temperature; /* temperature */ -+static int stale_readout = 1; /* last read invalid */ -+static int rest_x, rest_y; /* calibrated rest position */ -+ -+/* Last time we saw keyboard and mouse activity: */ -+static u64 last_keyboard_jiffies = INITIAL_JIFFIES; -+static u64 last_mouse_jiffies = INITIAL_JIFFIES; -+static u64 last_update_jiffies = INITIAL_JIFFIES; -+ -+/* input device use count */ -+static int hdaps_users; -+static DEFINE_MUTEX(hdaps_users_mtx); -+ -+/* Some models require an axis transformation to the standard representation */ -+static void transform_axes(int *x, int *y) - { -- return inb(port) & 0xff; -+ if (hdaps_invert & HDAPS_ORIENT_SWAP) { -+ int z; -+ z = *x; -+ *x = *y; -+ *y = z; -+ } -+ if (hdaps_invert & HDAPS_ORIENT_INVERT_XY) { -+ *x = -*x; -+ *y = -*y; -+ } -+ if (hdaps_invert & HDAPS_ORIENT_INVERT_X) -+ *x = -*x; - } - --/* -- * __check_latch - Check a port latch for a given value. Returns zero if the -- * port contains the given value. Callers must hold hdaps_mtx. -+/** -+ * __hdaps_update - query current state, with locks already acquired -+ * @fast: if nonzero, do one quick attempt without retries. -+ * -+ * Query current accelerometer state and update global state variables. -+ * Also prefetches the next query. Caller must hold controller lock. - */ --static inline int __check_latch(u16 port, u8 val) -+static int __hdaps_update(int fast) - { -- if (__get_latch(port) == val) -- return 0; -- return -EINVAL; --} -+ /* Read data: */ -+ struct thinkpad_ec_row data; -+ int ret; - --/* -- * __wait_latch - Wait up to 100us for a port latch to get a certain value, -- * returning zero if the value is obtained. Callers must hold hdaps_mtx. -- */ --static int __wait_latch(u16 port, u8 val) --{ -- unsigned int i; -+ data.mask = (1 << EC_ACCEL_IDX_READOUTS) | (1 << EC_ACCEL_IDX_KMACT) | -+ (3 << EC_ACCEL_IDX_YPOS1) | (3 << EC_ACCEL_IDX_XPOS1) | -+ (1 << EC_ACCEL_IDX_TEMP1) | (1 << EC_ACCEL_IDX_RETVAL); -+ if (fast) -+ ret = thinkpad_ec_try_read_row(&ec_accel_args, &data); -+ else -+ ret = thinkpad_ec_read_row(&ec_accel_args, &data); -+ thinkpad_ec_prefetch_row(&ec_accel_args); /* Prefetch even if error */ -+ if (ret) -+ return ret; - -- for (i = 0; i < 20; i++) { -- if (!__check_latch(port, val)) -- return 0; -- udelay(5); -+ /* Check status: */ -+ if (data.val[EC_ACCEL_IDX_RETVAL] != 0x00) { -+ pr_warn("read RETVAL=0x%02x\n", -+ data.val[EC_ACCEL_IDX_RETVAL]); -+ return -EIO; - } - -- return -EIO; -+ if (data.val[EC_ACCEL_IDX_READOUTS] < 1) -+ return -EBUSY; /* no pending readout, try again later */ -+ -+ /* Parse position data: */ -+ pos_x = *(s16 *)(data.val+EC_ACCEL_IDX_XPOS1); -+ pos_y = *(s16 *)(data.val+EC_ACCEL_IDX_YPOS1); -+ transform_axes(&pos_x, &pos_y); -+ -+ /* Keyboard and mouse activity status is cleared as soon as it's read, -+ * so applications will eat each other's events. Thus we remember any -+ * event for KMACT_REMEMBER_PERIOD jiffies. -+ */ -+ if (data.val[EC_ACCEL_IDX_KMACT] & KEYBD_MASK) -+ last_keyboard_jiffies = get_jiffies_64(); -+ if (data.val[EC_ACCEL_IDX_KMACT] & MOUSE_MASK) -+ last_mouse_jiffies = get_jiffies_64(); -+ -+ temperature = data.val[EC_ACCEL_IDX_TEMP1]; -+ -+ last_update_jiffies = get_jiffies_64(); -+ stale_readout = 0; -+ if (needs_calibration) { -+ rest_x = pos_x; -+ rest_y = pos_y; -+ needs_calibration = 0; -+ } -+ -+ return 0; - } - --/* -- * __device_refresh - request a refresh from the accelerometer. Does not wait -- * for refresh to complete. Callers must hold hdaps_mtx. -+/** -+ * hdaps_update - acquire locks and query current state -+ * -+ * Query current accelerometer state and update global state variables. -+ * Also prefetches the next query. -+ * Retries until timeout if the accelerometer is not in ready status (common). -+ * Does its own locking. - */ --static void __device_refresh(void) -+static int hdaps_update(void) - { -- udelay(200); -- if (inb(0x1604) != STATE_FRESH) { -- outb(0x11, 0x1610); -- outb(0x01, 0x161f); -+ u64 age = get_jiffies_64() - last_update_jiffies; -+ int total, ret; -+ -+ if (!stale_readout && age < (9*HZ)/(10*sampling_rate)) -+ return 0; /* already updated recently */ -+ for (total = 0; total < READ_TIMEOUT_MSECS; total += RETRY_MSECS) { -+ ret = thinkpad_ec_lock(); -+ if (ret) -+ return ret; -+ ret = __hdaps_update(0); -+ thinkpad_ec_unlock(); -+ -+ if (!ret) -+ return 0; -+ if (ret != -EBUSY) -+ break; -+ msleep(RETRY_MSECS); - } -+ return ret; - } - --/* -- * __device_refresh_sync - request a synchronous refresh from the -- * accelerometer. We wait for the refresh to complete. Returns zero if -- * successful and nonzero on error. Callers must hold hdaps_mtx. -+/** -+ * hdaps_set_power - enable or disable power to the accelerometer. -+ * Returns zero on success and negative error code on failure. Can sleep. - */ --static int __device_refresh_sync(void) -+static int hdaps_set_power(int on) - { -- __device_refresh(); -- return __wait_latch(0x1604, STATE_FRESH); -+ struct thinkpad_ec_row args = -+ { .mask = 0x0003, .val = {0x14, on?0x01:0x00} }; -+ struct thinkpad_ec_row data = { .mask = 0x8000 }; -+ int ret = thinkpad_ec_read_row(&args, &data); -+ if (ret) -+ return ret; -+ if (data.val[0xF] != 0x00) -+ return -EIO; -+ return 0; - } - --/* -- * __device_complete - indicate to the accelerometer that we are done reading -- * data, and then initiate an async refresh. Callers must hold hdaps_mtx. -+/** -+ * hdaps_set_ec_config - set accelerometer parameters. -+ * @ec_rate: embedded controller sampling rate -+ * @order: embedded controller running average filter order -+ * (Normally we have @ec_rate = sampling_rate * oversampling_ratio.) -+ * Returns zero on success and negative error code on failure. Can sleep. - */ --static inline void __device_complete(void) -+static int hdaps_set_ec_config(int ec_rate, int order) - { -- inb(0x161f); -- inb(0x1604); -- __device_refresh(); -+ struct thinkpad_ec_row args = { .mask = 0x000F, -+ .val = {0x10, (u8)ec_rate, (u8)(ec_rate>>8), order} }; -+ struct thinkpad_ec_row data = { .mask = 0x8000 }; -+ int ret = thinkpad_ec_read_row(&args, &data); -+ pr_debug("setting ec_rate=%d, filter_order=%d\n", ec_rate, order); -+ if (ret) -+ return ret; -+ if (data.val[0xF] == 0x03) { -+ pr_warn("config param out of range\n"); -+ return -EINVAL; -+ } -+ if (data.val[0xF] == 0x06) { -+ pr_warn("config change already pending\n"); -+ return -EBUSY; -+ } -+ if (data.val[0xF] != 0x00) { -+ pr_warn("config change error, ret=%d\n", -+ data.val[0xF]); -+ return -EIO; -+ } -+ return 0; - } - --/* -- * hdaps_readb_one - reads a byte from a single I/O port, placing the value in -- * the given pointer. Returns zero on success or a negative error on failure. -- * Can sleep. -+/** -+ * hdaps_get_ec_config - get accelerometer parameters. -+ * @ec_rate: embedded controller sampling rate -+ * @order: embedded controller running average filter order -+ * Returns zero on success and negative error code on failure. Can sleep. - */ --static int hdaps_readb_one(unsigned int port, u8 *val) -+static int hdaps_get_ec_config(int *ec_rate, int *order) - { -- int ret; -- -- mutex_lock(&hdaps_mtx); -- -- /* do a sync refresh -- we need to be sure that we read fresh data */ -- ret = __device_refresh_sync(); -+ const struct thinkpad_ec_row args = -+ { .mask = 0x0003, .val = {0x17, 0x82} }; -+ struct thinkpad_ec_row data = { .mask = 0x801F }; -+ int ret = thinkpad_ec_read_row(&args, &data); - if (ret) -- goto out; -- -- *val = inb(port); -- __device_complete(); -- --out: -- mutex_unlock(&hdaps_mtx); -- return ret; -+ return ret; -+ if (data.val[0xF] != 0x00) -+ return -EIO; -+ if (!(data.val[0x1] & 0x01)) -+ return -ENXIO; /* accelerometer polling not enabled */ -+ if (data.val[0x1] & 0x02) -+ return -EBUSY; /* config change in progress, retry later */ -+ *ec_rate = data.val[0x2] | ((int)(data.val[0x3]) << 8); -+ *order = data.val[0x4]; -+ return 0; - } - --/* __hdaps_read_pair - internal lockless helper for hdaps_read_pair(). */ --static int __hdaps_read_pair(unsigned int port1, unsigned int port2, -- int *x, int *y) -+/** -+ * hdaps_get_ec_mode - get EC accelerometer mode -+ * Returns zero on success and negative error code on failure. Can sleep. -+ */ -+static int hdaps_get_ec_mode(u8 *mode) - { -- /* do a sync refresh -- we need to be sure that we read fresh data */ -- if (__device_refresh_sync()) -+ const struct thinkpad_ec_row args = -+ { .mask = 0x0001, .val = {0x13} }; -+ struct thinkpad_ec_row data = { .mask = 0x8002 }; -+ int ret = thinkpad_ec_read_row(&args, &data); -+ if (ret) -+ return ret; -+ if (data.val[0xF] != 0x00) { -+ pr_warn("accelerometer not implemented (0x%02x)\n", -+ data.val[0xF]); - return -EIO; -- -- *y = inw(port2); -- *x = inw(port1); -- km_activity = inb(HDAPS_PORT_KMACT); -- __device_complete(); -- -- /* hdaps_invert is a bitvector to negate the axes */ -- if (hdaps_invert & HDAPS_X_AXIS) -- *x = -*x; -- if (hdaps_invert & HDAPS_Y_AXIS) -- *y = -*y; -- -+ } -+ *mode = data.val[0x1]; - return 0; - } - --/* -- * hdaps_read_pair - reads the values from a pair of ports, placing the values -- * in the given pointers. Returns zero on success. Can sleep. -+/** -+ * hdaps_check_ec - checks something about the EC. -+ * Follows the clean-room spec for HDAPS; we don't know what it means. -+ * Returns zero on success and negative error code on failure. Can sleep. - */ --static int hdaps_read_pair(unsigned int port1, unsigned int port2, -- int *val1, int *val2) -+static int hdaps_check_ec(void) - { -- int ret; -- -- mutex_lock(&hdaps_mtx); -- ret = __hdaps_read_pair(port1, port2, val1, val2); -- mutex_unlock(&hdaps_mtx); -- -- return ret; -+ const struct thinkpad_ec_row args = -+ { .mask = 0x0003, .val = {0x17, 0x81} }; -+ struct thinkpad_ec_row data = { .mask = 0x800E }; -+ int ret = thinkpad_ec_read_row(&args, &data); -+ if (ret) -+ return ret; -+ if (!((data.val[0x1] == 0x00 && data.val[0x2] == 0x60) || /* cleanroom spec */ -+ (data.val[0x1] == 0x01 && data.val[0x2] == 0x00)) || /* seen on T61 */ -+ data.val[0x3] != 0x00 || data.val[0xF] != 0x00) { -+ pr_warn("hdaps_check_ec: bad response (0x%x,0x%x,0x%x,0x%x)\n", -+ data.val[0x1], data.val[0x2], -+ data.val[0x3], data.val[0xF]); -+ return -EIO; -+ } -+ return 0; - } - --/* -- * hdaps_device_init - initialize the accelerometer. Returns zero on success -- * and negative error code on failure. Can sleep. -+/** -+ * hdaps_device_init - initialize the accelerometer. -+ * -+ * Call several embedded controller functions to test and initialize the -+ * accelerometer. -+ * Returns zero on success and negative error code on failure. Can sleep. - */ -+#define FAILED_INIT(msg) pr_err("init failed at: %s\n", msg) - static int hdaps_device_init(void) - { -- int total, ret = -ENXIO; -+ int ret; -+ u8 mode; - -- mutex_lock(&hdaps_mtx); -+ ret = thinkpad_ec_lock(); -+ if (ret) -+ return ret; - -- outb(0x13, 0x1610); -- outb(0x01, 0x161f); -- if (__wait_latch(0x161f, 0x00)) -- goto out; -+ if (hdaps_get_ec_mode(&mode)) -+ { FAILED_INIT("hdaps_get_ec_mode failed"); goto bad; } - -- /* -- * Most ThinkPads return 0x01. -- * -- * Others--namely the R50p, T41p, and T42p--return 0x03. These laptops -- * have "inverted" axises. -- * -- * The 0x02 value occurs when the chip has been previously initialized. -- */ -- if (__check_latch(0x1611, 0x03) && -- __check_latch(0x1611, 0x02) && -- __check_latch(0x1611, 0x01)) -- goto out; -+ pr_debug("initial mode latch is 0x%02x\n", mode); -+ if (mode == 0x00) -+ { FAILED_INIT("accelerometer not available"); goto bad; } - -- printk(KERN_DEBUG "hdaps: initial latch check good (0x%02x)\n", -- __get_latch(0x1611)); -+ if (hdaps_check_ec()) -+ { FAILED_INIT("hdaps_check_ec failed"); goto bad; } - -- outb(0x17, 0x1610); -- outb(0x81, 0x1611); -- outb(0x01, 0x161f); -- if (__wait_latch(0x161f, 0x00)) -- goto out; -- if (__wait_latch(0x1611, 0x00)) -- goto out; -- if (__wait_latch(0x1612, 0x60)) -- goto out; -- if (__wait_latch(0x1613, 0x00)) -- goto out; -- outb(0x14, 0x1610); -- outb(0x01, 0x1611); -- outb(0x01, 0x161f); -- if (__wait_latch(0x161f, 0x00)) -- goto out; -- outb(0x10, 0x1610); -- outb(0xc8, 0x1611); -- outb(0x00, 0x1612); -- outb(0x02, 0x1613); -- outb(0x01, 0x161f); -- if (__wait_latch(0x161f, 0x00)) -- goto out; -- if (__device_refresh_sync()) -- goto out; -- if (__wait_latch(0x1611, 0x00)) -- goto out; -- -- /* we have done our dance, now let's wait for the applause */ -- for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) { -- int x, y; -+ if (hdaps_set_power(1)) -+ { FAILED_INIT("hdaps_set_power failed"); goto bad; } - -- /* a read of the device helps push it into action */ -- __hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y); -- if (!__wait_latch(0x1611, 0x02)) { -- ret = 0; -- break; -- } -+ if (hdaps_set_ec_config(sampling_rate*oversampling_ratio, -+ running_avg_filter_order)) -+ { FAILED_INIT("hdaps_set_ec_config failed"); goto bad; } - -- msleep(INIT_WAIT_MSECS); -- } -+ thinkpad_ec_invalidate(); -+ udelay(200); - --out: -- mutex_unlock(&hdaps_mtx); -+ /* Just prefetch instead of reading, to avoid ~1sec delay on load */ -+ ret = thinkpad_ec_prefetch_row(&ec_accel_args); -+ if (ret) -+ { FAILED_INIT("initial prefetch failed"); goto bad; } -+ goto good; -+bad: -+ thinkpad_ec_invalidate(); -+ ret = -ENXIO; -+good: -+ stale_readout = 1; -+ thinkpad_ec_unlock(); - return ret; - } - -+/** -+ * hdaps_device_shutdown - power off the accelerometer -+ * Returns nonzero on failure. Can sleep. -+ */ -+static int hdaps_device_shutdown(void) -+{ -+ int ret; -+ ret = hdaps_set_power(0); -+ if (ret) { -+ pr_warn("cannot power off\n"); -+ return ret; -+ } -+ ret = hdaps_set_ec_config(0, 1); -+ if (ret) -+ pr_warn("cannot stop EC sampling\n"); -+ return ret; -+} - - /* Device model stuff */ - -@@ -294,13 +412,29 @@ static int hdaps_probe(struct platform_device *dev) - } - - #ifdef CONFIG_PM_SLEEP -+static int hdaps_suspend(struct device *dev) -+{ -+ /* Don't do hdaps polls until resume re-initializes the sensor. */ -+ del_timer_sync(&hdaps_timer); -+ hdaps_device_shutdown(); /* ignore errors, effect is negligible */ -+ return 0; -+} -+ - static int hdaps_resume(struct device *dev) - { -- return hdaps_device_init(); -+ int ret = hdaps_device_init(); -+ if (ret) -+ return ret; -+ -+ mutex_lock(&hdaps_users_mtx); -+ if (hdaps_users) -+ mod_timer(&hdaps_timer, jiffies + HZ/sampling_rate); -+ mutex_unlock(&hdaps_users_mtx); -+ return 0; - } - #endif - --static SIMPLE_DEV_PM_OPS(hdaps_pm, NULL, hdaps_resume); -+static SIMPLE_DEV_PM_OPS(hdaps_pm, hdaps_suspend, hdaps_resume); - - static struct platform_driver hdaps_driver = { - .probe = hdaps_probe, -@@ -310,30 +444,51 @@ static struct platform_driver hdaps_driver = { - }, - }; - --/* -- * hdaps_calibrate - Set our "resting" values. Callers must hold hdaps_mtx. -+/** -+ * hdaps_calibrate - set our "resting" values. -+ * Does its own locking. - */ - static void hdaps_calibrate(void) - { -- __hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &rest_x, &rest_y); -+ needs_calibration = 1; -+ hdaps_update(); -+ /* If that fails, the mousedev poll will take care of things later. */ - } - --static void hdaps_mousedev_poll(struct input_polled_dev *dev) -+/* Timer handler for updating the input device. Runs in softirq context, -+ * so avoid lenghty or blocking operations. -+ */ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0) -+static void hdaps_mousedev_poll(unsigned long unused) -+#else -+static void hdaps_mousedev_poll(struct timer_list *unused) -+#endif - { -- struct input_dev *input_dev = dev->input; -- int x, y; -+ int ret; - -- mutex_lock(&hdaps_mtx); -+ stale_readout = 1; - -- if (__hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y)) -- goto out; -+ /* Cannot sleep. Try nonblockingly. If we fail, try again later. */ -+ if (thinkpad_ec_try_lock()) -+ goto keep_active; - -- input_report_abs(input_dev, ABS_X, x - rest_x); -- input_report_abs(input_dev, ABS_Y, y - rest_y); -- input_sync(input_dev); -+ ret = __hdaps_update(1); /* fast update, we're in softirq context */ -+ thinkpad_ec_unlock(); -+ /* Any of "successful", "not yet ready" and "not prefetched"? */ -+ if (ret != 0 && ret != -EBUSY && ret != -ENODATA) { -+ pr_err("poll failed, disabling updates\n"); -+ return; -+ } - --out: -- mutex_unlock(&hdaps_mtx); -+keep_active: -+ /* Even if we failed now, pos_x,y may have been updated earlier: */ -+ input_report_abs(hdaps_idev, ABS_X, pos_x - rest_x); -+ input_report_abs(hdaps_idev, ABS_Y, pos_y - rest_y); -+ input_sync(hdaps_idev); -+ input_report_abs(hdaps_idev_raw, ABS_X, pos_x); -+ input_report_abs(hdaps_idev_raw, ABS_Y, pos_y); -+ input_sync(hdaps_idev_raw); -+ mod_timer(&hdaps_timer, jiffies + HZ/sampling_rate); - } - - -@@ -342,65 +497,41 @@ static void hdaps_mousedev_poll(struct input_polled_dev *dev) - static ssize_t hdaps_position_show(struct device *dev, - struct device_attribute *attr, char *buf) - { -- int ret, x, y; -- -- ret = hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y); -+ int ret = hdaps_update(); - if (ret) - return ret; -- -- return sprintf(buf, "(%d,%d)\n", x, y); --} -- --static ssize_t hdaps_variance_show(struct device *dev, -- struct device_attribute *attr, char *buf) --{ -- int ret, x, y; -- -- ret = hdaps_read_pair(HDAPS_PORT_XVAR, HDAPS_PORT_YVAR, &x, &y); -- if (ret) -- return ret; -- -- return sprintf(buf, "(%d,%d)\n", x, y); -+ return sprintf(buf, "(%d,%d)\n", pos_x, pos_y); - } - - static ssize_t hdaps_temp1_show(struct device *dev, - struct device_attribute *attr, char *buf) - { -- u8 uninitialized_var(temp); -- int ret; -- -- ret = hdaps_readb_one(HDAPS_PORT_TEMP1, &temp); -- if (ret) -- return ret; -- -- return sprintf(buf, "%u\n", temp); --} -- --static ssize_t hdaps_temp2_show(struct device *dev, -- struct device_attribute *attr, char *buf) --{ -- u8 uninitialized_var(temp); -- int ret; -- -- ret = hdaps_readb_one(HDAPS_PORT_TEMP2, &temp); -+ int ret = hdaps_update(); - if (ret) - return ret; -- -- return sprintf(buf, "%u\n", temp); -+ return sprintf(buf, "%d\n", temperature); - } - - static ssize_t hdaps_keyboard_activity_show(struct device *dev, - struct device_attribute *attr, - char *buf) - { -- return sprintf(buf, "%u\n", KEYBD_ISSET(km_activity)); -+ int ret = hdaps_update(); -+ if (ret) -+ return ret; -+ return sprintf(buf, "%u\n", -+ get_jiffies_64() < last_keyboard_jiffies + KMACT_REMEMBER_PERIOD); - } - - static ssize_t hdaps_mouse_activity_show(struct device *dev, - struct device_attribute *attr, - char *buf) - { -- return sprintf(buf, "%u\n", MOUSE_ISSET(km_activity)); -+ int ret = hdaps_update(); -+ if (ret) -+ return ret; -+ return sprintf(buf, "%u\n", -+ get_jiffies_64() < last_mouse_jiffies + KMACT_REMEMBER_PERIOD); - } - - static ssize_t hdaps_calibrate_show(struct device *dev, -@@ -413,10 +544,7 @@ static ssize_t hdaps_calibrate_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) - { -- mutex_lock(&hdaps_mtx); - hdaps_calibrate(); -- mutex_unlock(&hdaps_mtx); -- - return count; - } - -@@ -433,7 +561,7 @@ static ssize_t hdaps_invert_store(struct device *dev, - int invert; - - if (sscanf(buf, "%d", &invert) != 1 || -- invert < 0 || invert > HDAPS_BOTH_AXES) -+ invert < 0 || invert > HDAPS_ORIENT_MAX) - return -EINVAL; - - hdaps_invert = invert; -@@ -442,24 +570,128 @@ static ssize_t hdaps_invert_store(struct device *dev, - return count; - } - -+static ssize_t hdaps_sampling_rate_show( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ return sprintf(buf, "%d\n", sampling_rate); -+} -+ -+static ssize_t hdaps_sampling_rate_store( -+ struct device *dev, struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ int rate, ret; -+ if (sscanf(buf, "%d", &rate) != 1 || rate > HZ || rate <= 0) { -+ pr_warn("must have 0ident); -- return 1; --} -- - /* hdaps_dmi_match_invert - found an inverted match. */ - static int __init hdaps_dmi_match_invert(const struct dmi_system_id *id) - { -- hdaps_invert = (unsigned long)id->driver_data; -- pr_info("inverting axis (%u) readings\n", hdaps_invert); -- return hdaps_dmi_match(id); -+ unsigned int orient = (kernel_ulong_t) id->driver_data; -+ hdaps_invert = orient; -+ pr_info("%s detected, setting orientation %u\n", id->ident, orient); -+ return 1; /* stop enumeration */ - } - --#define HDAPS_DMI_MATCH_INVERT(vendor, model, axes) { \ -+#define HDAPS_DMI_MATCH_INVERT(vendor, model, orient) { \ - .ident = vendor " " model, \ - .callback = hdaps_dmi_match_invert, \ -- .driver_data = (void *)axes, \ -+ .driver_data = (void *)(orient), \ - .matches = { \ - DMI_MATCH(DMI_BOARD_VENDOR, vendor), \ - DMI_MATCH(DMI_PRODUCT_VERSION, model) \ - } \ - } - --#define HDAPS_DMI_MATCH_NORMAL(vendor, model) \ -- HDAPS_DMI_MATCH_INVERT(vendor, model, 0) -- --/* Note that HDAPS_DMI_MATCH_NORMAL("ThinkPad T42") would match -- "ThinkPad T42p", so the order of the entries matters. -- If your ThinkPad is not recognized, please update to latest -- BIOS. This is especially the case for some R52 ThinkPads. */ --static const struct dmi_system_id hdaps_whitelist[] __initconst = { -- HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad R50p", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R50"), -- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R51"), -- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R52"), -- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61i", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T41p", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T41"), -- HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T42p", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T42"), -- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T43"), -- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T400", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61p", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X40"), -- HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad X41", HDAPS_Y_AXIS), -- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61s", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad Z60m"), -- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad Z61m", HDAPS_BOTH_AXES), -- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad Z61p", HDAPS_BOTH_AXES), -+/* List of models with abnormal axis configuration. -+ Note that HDAPS_DMI_MATCH_NORMAL("ThinkPad T42") would match -+ "ThinkPad T42p", and enumeration stops after first match, -+ so the order of the entries matters. */ -+const struct dmi_system_id hdaps_whitelist[] __initconst = { -+ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad R50p", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad R60", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T41p", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T42p", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad X40", HDAPS_ORIENT_INVERT_Y), -+ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad X41", HDAPS_ORIENT_INVERT_Y), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R60", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R400", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R500", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60 Tablet", HDAPS_ORIENT_INVERT_Y), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60s", HDAPS_ORIENT_INVERT_Y), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_X), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_X), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T400s", HDAPS_ORIENT_INVERT_X), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T400", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T410s", HDAPS_ORIENT_SWAP), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T410", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T500", HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T510", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_X | HDAPS_ORIENT_INVERT_Y), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad W510", HDAPS_ORIENT_MAX), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad W520", HDAPS_ORIENT_MAX), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X200s", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X200", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_X | HDAPS_ORIENT_INVERT_Y), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X201 Tablet", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X201s", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_XY), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X201", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_X), -+ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X220", HDAPS_ORIENT_SWAP), - { .ident = NULL } - }; - - static int __init hdaps_init(void) - { -- struct input_dev *idev; - int ret; - -- if (!dmi_check_system(hdaps_whitelist)) { -- pr_warn("supported laptop not found!\n"); -- ret = -ENODEV; -- goto out; -- } -- -- if (!request_region(HDAPS_LOW_PORT, HDAPS_NR_PORTS, "hdaps")) { -- ret = -ENXIO; -- goto out; -- } -- -+ /* Determine axis orientation orientation */ -+ if (hdaps_invert == HDAPS_ORIENT_UNDEFINED) /* set by module param? */ -+ if (dmi_check_system(hdaps_whitelist) < 1) /* in whitelist? */ -+ hdaps_invert = 0; /* default */ -+ -+ /* Init timer before platform_driver_register, in case of suspend */ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0) -+ init_timer(&hdaps_timer); -+ hdaps_timer.function = hdaps_mousedev_poll; -+#else -+ timer_setup(&hdaps_timer, hdaps_mousedev_poll, 0); -+#endif - ret = platform_driver_register(&hdaps_driver); - if (ret) -- goto out_region; -+ goto out; - - pdev = platform_device_register_simple("hdaps", -1, NULL, 0); - if (IS_ERR(pdev)) { -@@ -559,47 +789,79 @@ static int __init hdaps_init(void) - if (ret) - goto out_device; - -- hdaps_idev = input_allocate_polled_device(); -+ hdaps_idev = input_allocate_device(); - if (!hdaps_idev) { - ret = -ENOMEM; - goto out_group; - } - -- hdaps_idev->poll = hdaps_mousedev_poll; -- hdaps_idev->poll_interval = HDAPS_POLL_INTERVAL; -- -- /* initial calibrate for the input device */ -- hdaps_calibrate(); -+ hdaps_idev_raw = input_allocate_device(); -+ if (!hdaps_idev_raw) { -+ ret = -ENOMEM; -+ goto out_idev_first; -+ } - -- /* initialize the input class */ -- idev = hdaps_idev->input; -- idev->name = "hdaps"; -- idev->phys = "isa1600/input0"; -- idev->id.bustype = BUS_ISA; -- idev->dev.parent = &pdev->dev; -- idev->evbit[0] = BIT_MASK(EV_ABS); -- input_set_abs_params(idev, ABS_X, -+ /* calibration for the input device (deferred to avoid delay) */ -+ needs_calibration = 1; -+ -+ /* initialize the joystick-like fuzzed input device */ -+ hdaps_idev->name = "ThinkPad HDAPS joystick emulation"; -+ hdaps_idev->phys = "hdaps/input0"; -+ hdaps_idev->id.bustype = BUS_HOST; -+ hdaps_idev->id.vendor = HDAPS_INPUT_VENDOR; -+ hdaps_idev->id.product = HDAPS_INPUT_PRODUCT; -+ hdaps_idev->id.version = HDAPS_INPUT_JS_VERSION; -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) -+ hdaps_idev->cdev.dev = &pdev->dev; -+#endif -+ hdaps_idev->evbit[0] = BIT(EV_ABS); -+ hdaps_idev->open = hdaps_mousedev_open; -+ hdaps_idev->close = hdaps_mousedev_close; -+ input_set_abs_params(hdaps_idev, ABS_X, - -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT); -- input_set_abs_params(idev, ABS_Y, -+ input_set_abs_params(hdaps_idev, ABS_Y, - -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT); - -- ret = input_register_polled_device(hdaps_idev); -+ ret = input_register_device(hdaps_idev); - if (ret) - goto out_idev; - -- pr_info("driver successfully loaded\n"); -+ /* initialize the raw data input device */ -+ hdaps_idev_raw->name = "ThinkPad HDAPS accelerometer data"; -+ hdaps_idev_raw->phys = "hdaps/input1"; -+ hdaps_idev_raw->id.bustype = BUS_HOST; -+ hdaps_idev_raw->id.vendor = HDAPS_INPUT_VENDOR; -+ hdaps_idev_raw->id.product = HDAPS_INPUT_PRODUCT; -+ hdaps_idev_raw->id.version = HDAPS_INPUT_RAW_VERSION; -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) -+ hdaps_idev_raw->cdev.dev = &pdev->dev; -+#endif -+ hdaps_idev_raw->evbit[0] = BIT(EV_ABS); -+ hdaps_idev_raw->open = hdaps_mousedev_open; -+ hdaps_idev_raw->close = hdaps_mousedev_close; -+ input_set_abs_params(hdaps_idev_raw, ABS_X, -32768, 32767, 0, 0); -+ input_set_abs_params(hdaps_idev_raw, ABS_Y, -32768, 32767, 0, 0); -+ -+ ret = input_register_device(hdaps_idev_raw); -+ if (ret) -+ goto out_idev_reg_first; -+ -+ pr_info("driver successfully loaded.\n"); - return 0; - -+out_idev_reg_first: -+ input_unregister_device(hdaps_idev); - out_idev: -- input_free_polled_device(hdaps_idev); -+ input_free_device(hdaps_idev_raw); -+out_idev_first: -+ input_free_device(hdaps_idev); - out_group: - sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group); - out_device: - platform_device_unregister(pdev); - out_driver: - platform_driver_unregister(&hdaps_driver); --out_region: -- release_region(HDAPS_LOW_PORT, HDAPS_NR_PORTS); -+ hdaps_device_shutdown(); - out: - pr_warn("driver init failed (ret=%d)!\n", ret); - return ret; -@@ -607,12 +869,12 @@ static int __init hdaps_init(void) - - static void __exit hdaps_exit(void) - { -- input_unregister_polled_device(hdaps_idev); -- input_free_polled_device(hdaps_idev); -+ input_unregister_device(hdaps_idev_raw); -+ input_unregister_device(hdaps_idev); -+ hdaps_device_shutdown(); /* ignore errors, effect is negligible */ - sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group); - platform_device_unregister(pdev); - platform_driver_unregister(&hdaps_driver); -- release_region(HDAPS_LOW_PORT, HDAPS_NR_PORTS); - - pr_info("driver unloaded\n"); - } -@@ -620,9 +882,8 @@ static void __exit hdaps_exit(void) - module_init(hdaps_init); - module_exit(hdaps_exit); - --module_param_named(invert, hdaps_invert, int, 0); --MODULE_PARM_DESC(invert, "invert data along each axis. 1 invert x-axis, " -- "2 invert y-axis, 3 invert both axes."); -+module_param_named(invert, hdaps_invert, uint, 0); -+MODULE_PARM_DESC(invert, "axis orientation code"); - - MODULE_AUTHOR("Robert Love"); - MODULE_DESCRIPTION("IBM Hard Drive Active Protection System (HDAPS) driver"); -diff --git a/drivers/platform/x86/intel_ips.c b/drivers/platform/x86/intel_ips.c -index bffe548187ee..c2918ee3e100 100644 ---- a/drivers/platform/x86/intel_ips.c -+++ b/drivers/platform/x86/intel_ips.c -@@ -798,7 +798,7 @@ static int ips_adjust(void *data) - ips_gpu_lower(ips); - - sleep: -- schedule_timeout_interruptible(msecs_to_jiffies(IPS_ADJUST_PERIOD)); -+ schedule_msec_hrtimeout_interruptible((IPS_ADJUST_PERIOD)); - } while (!kthread_should_stop()); - - dev_dbg(ips->dev, "ips-adjust thread stopped\n"); -@@ -974,7 +974,7 @@ static int ips_monitor(void *data) - seqno_timestamp = get_jiffies_64(); - - old_cpu_power = thm_readl(THM_CEC); -- schedule_timeout_interruptible(msecs_to_jiffies(IPS_SAMPLE_PERIOD)); -+ schedule_msec_hrtimeout_interruptible((IPS_SAMPLE_PERIOD)); - - /* Collect an initial average */ - for (i = 0; i < IPS_SAMPLE_COUNT; i++) { -@@ -1001,7 +1001,7 @@ static int ips_monitor(void *data) - mchp_samples[i] = mchp; - } - -- schedule_timeout_interruptible(msecs_to_jiffies(IPS_SAMPLE_PERIOD)); -+ schedule_msec_hrtimeout_interruptible((IPS_SAMPLE_PERIOD)); - if (kthread_should_stop()) - break; - } -@@ -1028,7 +1028,7 @@ static int ips_monitor(void *data) - * us to reduce the sample frequency if the CPU and GPU are idle. - */ - old_cpu_power = thm_readl(THM_CEC); -- schedule_timeout_interruptible(msecs_to_jiffies(IPS_SAMPLE_PERIOD)); -+ schedule_msec_hrtimeout_interruptible((IPS_SAMPLE_PERIOD)); - last_sample_period = IPS_SAMPLE_PERIOD; - - timer_setup(&ips->timer, monitor_timeout, TIMER_DEFERRABLE); -diff --git a/drivers/platform/x86/thinkpad_ec.c b/drivers/platform/x86/thinkpad_ec.c -new file mode 100644 -index 000000000000..597614bc17e6 ---- /dev/null -+++ b/drivers/platform/x86/thinkpad_ec.c -@@ -0,0 +1,513 @@ -+/* -+ * thinkpad_ec.c - ThinkPad embedded controller LPC3 functions -+ * -+ * The embedded controller on ThinkPad laptops has a non-standard interface, -+ * where LPC channel 3 of the H8S EC chip is hooked up to IO ports -+ * 0x1600-0x161F and implements (a special case of) the H8S LPC protocol. -+ * The EC LPC interface provides various system management services (currently -+ * known: battery information and accelerometer readouts). This driver -+ * provides access and mutual exclusion for the EC interface. -+* -+ * The LPC protocol and terminology are documented here: -+ * "H8S/2104B Group Hardware Manual", -+ * http://documentation.renesas.com/eng/products/mpumcu/rej09b0300_2140bhm.pdf -+ * -+ * Copyright (C) 2006-2007 Shem Multinymous -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) -+ #include -+#else -+ #include -+#endif -+ -+#define TP_VERSION "0.42" -+ -+MODULE_AUTHOR("Shem Multinymous"); -+MODULE_DESCRIPTION("ThinkPad embedded controller hardware access"); -+MODULE_VERSION(TP_VERSION); -+MODULE_LICENSE("GPL"); -+ -+/* IO ports used by embedded controller LPC channel 3: */ -+#define TPC_BASE_PORT 0x1600 -+#define TPC_NUM_PORTS 0x20 -+#define TPC_STR3_PORT 0x1604 /* Reads H8S EC register STR3 */ -+#define TPC_TWR0_PORT 0x1610 /* Mapped to H8S EC register TWR0MW/SW */ -+#define TPC_TWR15_PORT 0x161F /* Mapped to H8S EC register TWR15. */ -+ /* (and port TPC_TWR0_PORT+i is mapped to H8S reg TWRi for 00x%02x", \ -+ msg, args->val[0x0], args->val[0xF], code) -+ -+/* State of request prefetching: */ -+static u8 prefetch_arg0, prefetch_argF; /* Args of last prefetch */ -+static u64 prefetch_jiffies; /* time of prefetch, or: */ -+#define TPC_PREFETCH_NONE INITIAL_JIFFIES /* No prefetch */ -+#define TPC_PREFETCH_JUNK (INITIAL_JIFFIES+1) /* Ignore prefetch */ -+ -+/* Locking: */ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) -+static DECLARE_MUTEX(thinkpad_ec_mutex); -+#else -+static DEFINE_SEMAPHORE(thinkpad_ec_mutex); -+#endif -+ -+/* Kludge in case the ACPI DSDT reserves the ports we need. */ -+static bool force_io; /* Willing to do IO to ports we couldn't reserve? */ -+static int reserved_io; /* Successfully reserved the ports? */ -+module_param_named(force_io, force_io, bool, 0600); -+MODULE_PARM_DESC(force_io, "Force IO even if region already reserved (0=off, 1=on)"); -+ -+/** -+ * thinkpad_ec_lock - get lock on the ThinkPad EC -+ * -+ * Get exclusive lock for accesing the ThinkPad embedded controller LPC3 -+ * interface. Returns 0 iff lock acquired. -+ */ -+int thinkpad_ec_lock(void) -+{ -+ int ret; -+ ret = down_interruptible(&thinkpad_ec_mutex); -+ return ret; -+} -+EXPORT_SYMBOL_GPL(thinkpad_ec_lock); -+ -+/** -+ * thinkpad_ec_try_lock - try getting lock on the ThinkPad EC -+ * -+ * Try getting an exclusive lock for accesing the ThinkPad embedded -+ * controller LPC3. Returns immediately if lock is not available; neither -+ * blocks nor sleeps. Returns 0 iff lock acquired . -+ */ -+int thinkpad_ec_try_lock(void) -+{ -+ return down_trylock(&thinkpad_ec_mutex); -+} -+EXPORT_SYMBOL_GPL(thinkpad_ec_try_lock); -+ -+/** -+ * thinkpad_ec_unlock - release lock on ThinkPad EC -+ * -+ * Release a previously acquired exclusive lock on the ThinkPad ebmedded -+ * controller LPC3 interface. -+ */ -+void thinkpad_ec_unlock(void) -+{ -+ up(&thinkpad_ec_mutex); -+} -+EXPORT_SYMBOL_GPL(thinkpad_ec_unlock); -+ -+/** -+ * thinkpad_ec_request_row - tell embedded controller to prepare a row -+ * @args Input register arguments -+ * -+ * Requests a data row by writing to H8S LPC registers TRW0 through TWR15 (or -+ * a subset thereof) following the protocol prescribed by the "H8S/2104B Group -+ * Hardware Manual". Does sanity checks via status register STR3. -+ */ -+static int thinkpad_ec_request_row(const struct thinkpad_ec_row *args) -+{ -+ u8 str3; -+ int i; -+ -+ /* EC protocol requires write to TWR0 (function code): */ -+ if (!(args->mask & 0x0001)) { -+ printk(KERN_ERR MSG_FMT("bad args->mask=0x%02x", args->mask)); -+ return -EINVAL; -+ } -+ -+ /* Check initial STR3 status: */ -+ str3 = inb(TPC_STR3_PORT) & H8S_STR3_MASK; -+ if (str3 & H8S_STR3_OBF3B) { /* data already pending */ -+ inb(TPC_TWR15_PORT); /* marks end of previous transaction */ -+ if (prefetch_jiffies == TPC_PREFETCH_NONE) -+ printk(KERN_WARNING REQ_FMT( -+ "EC has result from unrequested transaction", -+ str3)); -+ return -EBUSY; /* EC will be ready in a few usecs */ -+ } else if (str3 == H8S_STR3_SWMF) { /* busy with previous request */ -+ if (prefetch_jiffies == TPC_PREFETCH_NONE) -+ printk(KERN_WARNING REQ_FMT( -+ "EC is busy with unrequested transaction", -+ str3)); -+ return -EBUSY; /* data will be pending in a few usecs */ -+ } else if (str3 != 0x00) { /* unexpected status? */ -+ printk(KERN_WARNING REQ_FMT("unexpected initial STR3", str3)); -+ return -EIO; -+ } -+ -+ /* Send TWR0MW: */ -+ outb(args->val[0], TPC_TWR0_PORT); -+ str3 = inb(TPC_STR3_PORT) & H8S_STR3_MASK; -+ if (str3 != H8S_STR3_MWMF) { /* not accepted? */ -+ printk(KERN_WARNING REQ_FMT("arg0 rejected", str3)); -+ return -EIO; -+ } -+ -+ /* Send TWR1 through TWR14: */ -+ for (i = 1; i < TP_CONTROLLER_ROW_LEN-1; i++) -+ if ((args->mask>>i)&1) -+ outb(args->val[i], TPC_TWR0_PORT+i); -+ -+ /* Send TWR15 (default to 0x01). This marks end of command. */ -+ outb((args->mask & 0x8000) ? args->val[0xF] : 0x01, TPC_TWR15_PORT); -+ -+ /* Wait until EC starts writing its reply (~60ns on average). -+ * Releasing locks before this happens may cause an EC hang -+ * due to firmware bug! -+ */ -+ for (i = 0; i < TPC_REQUEST_RETRIES; i++) { -+ str3 = inb(TPC_STR3_PORT) & H8S_STR3_MASK; -+ if (str3 & H8S_STR3_SWMF) /* EC started replying */ -+ return 0; -+ else if (!(str3 & ~(H8S_STR3_IBF3B|H8S_STR3_MWMF))) -+ /* Normal progress (the EC hasn't seen the request -+ * yet, or is processing it). Wait it out. */ -+ ndelay(TPC_REQUEST_NDELAY); -+ else { /* weird EC status */ -+ printk(KERN_WARNING -+ REQ_FMT("bad end STR3", str3)); -+ return -EIO; -+ } -+ } -+ printk(KERN_WARNING REQ_FMT("EC is mysteriously silent", str3)); -+ return -EIO; -+} -+ -+/** -+ * thinkpad_ec_read_data - read pre-requested row-data from EC -+ * @args Input register arguments of pre-requested rows -+ * @data Output register values -+ * -+ * Reads current row data from the controller, assuming it's already -+ * requested. Follows the H8S spec for register access and status checks. -+ */ -+static int thinkpad_ec_read_data(const struct thinkpad_ec_row *args, -+ struct thinkpad_ec_row *data) -+{ -+ int i; -+ u8 str3 = inb(TPC_STR3_PORT) & H8S_STR3_MASK; -+ /* Once we make a request, STR3 assumes the sequence of values listed -+ * in the following 'if' as it reads the request and writes its data. -+ * It takes about a few dozen nanosecs total, with very high variance. -+ */ -+ if (str3 == (H8S_STR3_IBF3B|H8S_STR3_MWMF) || -+ str3 == 0x00 || /* the 0x00 is indistinguishable from idle EC! */ -+ str3 == H8S_STR3_SWMF) -+ return -EBUSY; /* not ready yet */ -+ /* Finally, the EC signals output buffer full: */ -+ if (str3 != (H8S_STR3_OBF3B|H8S_STR3_SWMF)) { -+ printk(KERN_WARNING -+ REQ_FMT("bad initial STR3", str3)); -+ return -EIO; -+ } -+ -+ /* Read first byte (signals start of read transactions): */ -+ data->val[0] = inb(TPC_TWR0_PORT); -+ /* Optionally read 14 more bytes: */ -+ for (i = 1; i < TP_CONTROLLER_ROW_LEN-1; i++) -+ if ((data->mask >> i)&1) -+ data->val[i] = inb(TPC_TWR0_PORT+i); -+ /* Read last byte from 0x161F (signals end of read transaction): */ -+ data->val[0xF] = inb(TPC_TWR15_PORT); -+ -+ /* Readout still pending? */ -+ str3 = inb(TPC_STR3_PORT) & H8S_STR3_MASK; -+ if (str3 & H8S_STR3_OBF3B) -+ printk(KERN_WARNING -+ REQ_FMT("OBF3B=1 after read", str3)); -+ /* If port 0x161F returns 0x80 too often, the EC may lock up. Warn: */ -+ if (data->val[0xF] == 0x80) -+ printk(KERN_WARNING -+ REQ_FMT("0x161F reports error", data->val[0xF])); -+ return 0; -+} -+ -+/** -+ * thinkpad_ec_is_row_fetched - is the given row currently prefetched? -+ * -+ * To keep things simple we compare only the first and last args; -+ * this suffices for all known cases. -+ */ -+static int thinkpad_ec_is_row_fetched(const struct thinkpad_ec_row *args) -+{ -+ return (prefetch_jiffies != TPC_PREFETCH_NONE) && -+ (prefetch_jiffies != TPC_PREFETCH_JUNK) && -+ (prefetch_arg0 == args->val[0]) && -+ (prefetch_argF == args->val[0xF]) && -+ (get_jiffies_64() < prefetch_jiffies + TPC_PREFETCH_TIMEOUT); -+} -+ -+/** -+ * thinkpad_ec_read_row - request and read data from ThinkPad EC -+ * @args Input register arguments -+ * @data Output register values -+ * -+ * Read a data row from the ThinkPad embedded controller LPC3 interface. -+ * Does fetching and retrying if needed. The row is specified by an -+ * array of 16 bytes, some of which may be undefined (but the first is -+ * mandatory). These bytes are given in @args->val[], where @args->val[i] is -+ * used iff (@args->mask>>i)&1). The resulting row data is stored in -+ * @data->val[], but is only guaranteed to be valid for indices corresponding -+ * to set bit in @data->mask. That is, if @data->mask&(1<val[i] is undefined. -+ * -+ * Returns -EBUSY on transient error and -EIO on abnormal condition. -+ * Caller must hold controller lock. -+ */ -+int thinkpad_ec_read_row(const struct thinkpad_ec_row *args, -+ struct thinkpad_ec_row *data) -+{ -+ int retries, ret; -+ -+ if (thinkpad_ec_is_row_fetched(args)) -+ goto read_row; /* already requested */ -+ -+ /* Request the row */ -+ for (retries = 0; retries < TPC_READ_RETRIES; ++retries) { -+ ret = thinkpad_ec_request_row(args); -+ if (!ret) -+ goto read_row; -+ if (ret != -EBUSY) -+ break; -+ ndelay(TPC_READ_NDELAY); -+ } -+ printk(KERN_ERR REQ_FMT("failed requesting row", ret)); -+ goto out; -+ -+read_row: -+ /* Read the row's data */ -+ for (retries = 0; retries < TPC_READ_RETRIES; ++retries) { -+ ret = thinkpad_ec_read_data(args, data); -+ if (!ret) -+ goto out; -+ if (ret != -EBUSY) -+ break; -+ ndelay(TPC_READ_NDELAY); -+ } -+ -+ printk(KERN_ERR REQ_FMT("failed waiting for data", ret)); -+ -+out: -+ prefetch_jiffies = TPC_PREFETCH_JUNK; -+ return ret; -+} -+EXPORT_SYMBOL_GPL(thinkpad_ec_read_row); -+ -+/** -+ * thinkpad_ec_try_read_row - try reading prefetched data from ThinkPad EC -+ * @args Input register arguments -+ * @data Output register values -+ * -+ * Try reading a data row from the ThinkPad embedded controller LPC3 -+ * interface, if this raw was recently prefetched using -+ * thinkpad_ec_prefetch_row(). Does not fetch, retry or block. -+ * The parameters have the same meaning as in thinkpad_ec_read_row(). -+ * -+ * Returns -EBUSY is data not ready and -ENODATA if row not prefetched. -+ * Caller must hold controller lock. -+ */ -+int thinkpad_ec_try_read_row(const struct thinkpad_ec_row *args, -+ struct thinkpad_ec_row *data) -+{ -+ int ret; -+ if (!thinkpad_ec_is_row_fetched(args)) { -+ ret = -ENODATA; -+ } else { -+ ret = thinkpad_ec_read_data(args, data); -+ if (!ret) -+ prefetch_jiffies = TPC_PREFETCH_NONE; /* eaten up */ -+ } -+ return ret; -+} -+EXPORT_SYMBOL_GPL(thinkpad_ec_try_read_row); -+ -+/** -+ * thinkpad_ec_prefetch_row - prefetch data from ThinkPad EC -+ * @args Input register arguments -+ * -+ * Prefetch a data row from the ThinkPad embedded controller LCP3 -+ * interface. A subsequent call to thinkpad_ec_read_row() with the -+ * same arguments will be faster, and a subsequent call to -+ * thinkpad_ec_try_read_row() stands a good chance of succeeding if -+ * done neither too soon nor too late. See -+ * thinkpad_ec_read_row() for the meaning of @args. -+ * -+ * Returns -EBUSY on transient error and -EIO on abnormal condition. -+ * Caller must hold controller lock. -+ */ -+int thinkpad_ec_prefetch_row(const struct thinkpad_ec_row *args) -+{ -+ int ret; -+ ret = thinkpad_ec_request_row(args); -+ if (ret) { -+ prefetch_jiffies = TPC_PREFETCH_JUNK; -+ } else { -+ prefetch_jiffies = get_jiffies_64(); -+ prefetch_arg0 = args->val[0x0]; -+ prefetch_argF = args->val[0xF]; -+ } -+ return ret; -+} -+EXPORT_SYMBOL_GPL(thinkpad_ec_prefetch_row); -+ -+/** -+ * thinkpad_ec_invalidate - invalidate prefetched ThinkPad EC data -+ * -+ * Invalidate the data prefetched via thinkpad_ec_prefetch_row() from the -+ * ThinkPad embedded controller LPC3 interface. -+ * Must be called before unlocking by any code that accesses the controller -+ * ports directly. -+ */ -+void thinkpad_ec_invalidate(void) -+{ -+ prefetch_jiffies = TPC_PREFETCH_JUNK; -+} -+EXPORT_SYMBOL_GPL(thinkpad_ec_invalidate); -+ -+ -+/*** Checking for EC hardware ***/ -+ -+/** -+ * thinkpad_ec_test - verify the EC is present and follows protocol -+ * -+ * Ensure the EC LPC3 channel really works on this machine by making -+ * an EC request and seeing if the EC follows the documented H8S protocol. -+ * The requested row just reads battery status, so it should be harmless to -+ * access it (on a correct EC). -+ * This test writes to IO ports, so execute only after checking DMI. -+ */ -+static int __init thinkpad_ec_test(void) -+{ -+ int ret; -+ const struct thinkpad_ec_row args = /* battery 0 basic status */ -+ { .mask = 0x8001, .val = {0x01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x00} }; -+ struct thinkpad_ec_row data = { .mask = 0x0000 }; -+ ret = thinkpad_ec_lock(); -+ if (ret) -+ return ret; -+ ret = thinkpad_ec_read_row(&args, &data); -+ thinkpad_ec_unlock(); -+ return ret; -+} -+ -+/* Search all DMI device names of a given type for a substring */ -+static int __init dmi_find_substring(int type, const char *substr) -+{ -+ const struct dmi_device *dev = NULL; -+ while ((dev = dmi_find_device(type, NULL, dev))) { -+ if (strstr(dev->name, substr)) -+ return 1; -+ } -+ return 0; -+} -+ -+#define TP_DMI_MATCH(vendor,model) { \ -+ .ident = vendor " " model, \ -+ .matches = { \ -+ DMI_MATCH(DMI_BOARD_VENDOR, vendor), \ -+ DMI_MATCH(DMI_PRODUCT_VERSION, model) \ -+ } \ -+} -+ -+/* Check DMI for existence of ThinkPad embedded controller */ -+static int __init check_dmi_for_ec(void) -+{ -+ /* A few old models that have a good EC but don't report it in DMI */ -+ struct dmi_system_id tp_whitelist[] = { -+ TP_DMI_MATCH("IBM", "ThinkPad A30"), -+ TP_DMI_MATCH("IBM", "ThinkPad T23"), -+ TP_DMI_MATCH("IBM", "ThinkPad X24"), -+ TP_DMI_MATCH("LENOVO", "ThinkPad"), -+ { .ident = NULL } -+ }; -+ return dmi_find_substring(DMI_DEV_TYPE_OEM_STRING, -+ "IBM ThinkPad Embedded Controller") || -+ dmi_check_system(tp_whitelist); -+} -+ -+/*** Init and cleanup ***/ -+ -+static int __init thinkpad_ec_init(void) -+{ -+ if (!check_dmi_for_ec()) { -+ printk(KERN_WARNING -+ "thinkpad_ec: no ThinkPad embedded controller!\n"); -+ return -ENODEV; -+ } -+ -+ if (request_region(TPC_BASE_PORT, TPC_NUM_PORTS, "thinkpad_ec")) { -+ reserved_io = 1; -+ } else { -+ printk(KERN_ERR "thinkpad_ec: cannot claim IO ports %#x-%#x... ", -+ TPC_BASE_PORT, -+ TPC_BASE_PORT + TPC_NUM_PORTS - 1); -+ if (force_io) { -+ printk("forcing use of unreserved IO ports.\n"); -+ } else { -+ printk("consider using force_io=1.\n"); -+ return -ENXIO; -+ } -+ } -+ prefetch_jiffies = TPC_PREFETCH_JUNK; -+ if (thinkpad_ec_test()) { -+ printk(KERN_ERR "thinkpad_ec: initial ec test failed\n"); -+ if (reserved_io) -+ release_region(TPC_BASE_PORT, TPC_NUM_PORTS); -+ return -ENXIO; -+ } -+ printk(KERN_INFO "thinkpad_ec: thinkpad_ec " TP_VERSION " loaded.\n"); -+ return 0; -+} -+ -+static void __exit thinkpad_ec_exit(void) -+{ -+ if (reserved_io) -+ release_region(TPC_BASE_PORT, TPC_NUM_PORTS); -+ printk(KERN_INFO "thinkpad_ec: unloaded.\n"); -+} -+ -+module_init(thinkpad_ec_init); -+module_exit(thinkpad_ec_exit); -diff --git a/drivers/platform/x86/tp_smapi.c b/drivers/platform/x86/tp_smapi.c -new file mode 100644 -index 000000000000..209cb6487e24 ---- /dev/null -+++ b/drivers/platform/x86/tp_smapi.c -@@ -0,0 +1,1493 @@ -+/* -+ * tp_smapi.c - ThinkPad SMAPI support -+ * -+ * This driver exposes some features of the System Management Application -+ * Program Interface (SMAPI) BIOS found on ThinkPad laptops. It works on -+ * models in which the SMAPI BIOS runs in SMM and is invoked by writing -+ * to the APM control port 0xB2. -+ * It also exposes battery status information, obtained from the ThinkPad -+ * embedded controller (via the thinkpad_ec module). -+ * Ancient ThinkPad models use a different interface, supported by the -+ * "thinkpad" module from "tpctl". -+ * -+ * Many of the battery status values obtained from the EC simply mirror -+ * values provided by the battery's Smart Battery System (SBS) interface, so -+ * their meaning is defined by the Smart Battery Data Specification (see -+ * http://sbs-forum.org/specs/sbdat110.pdf). References to this SBS spec -+ * are given in the code where relevant. -+ * -+ * Copyright (C) 2006 Shem Multinymous . -+ * SMAPI access code based on the mwave driver by Mike Sullivan. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include /* CMOS defines */ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define TP_VERSION "0.42" -+#define TP_DESC "ThinkPad SMAPI Support" -+#define TP_DIR "smapi" -+ -+MODULE_AUTHOR("Shem Multinymous"); -+MODULE_DESCRIPTION(TP_DESC); -+MODULE_VERSION(TP_VERSION); -+MODULE_LICENSE("GPL"); -+ -+static struct platform_device *pdev; -+ -+static int tp_debug; -+module_param_named(debug, tp_debug, int, 0600); -+MODULE_PARM_DESC(debug, "Debug level (0=off, 1=on)"); -+ -+/* A few macros for printk()ing: */ -+#define TPRINTK(level, fmt, args...) \ -+ dev_printk(level, &(pdev->dev), "%s: " fmt "\n", __func__, ## args) -+#define DPRINTK(fmt, args...) \ -+ do { if (tp_debug) TPRINTK(KERN_DEBUG, fmt, ## args); } while (0) -+ -+/********************************************************************* -+ * SMAPI interface -+ */ -+ -+/* SMAPI functions (register BX when making the SMM call). */ -+#define SMAPI_GET_INHIBIT_CHARGE 0x2114 -+#define SMAPI_SET_INHIBIT_CHARGE 0x2115 -+#define SMAPI_GET_THRESH_START 0x2116 -+#define SMAPI_SET_THRESH_START 0x2117 -+#define SMAPI_GET_FORCE_DISCHARGE 0x2118 -+#define SMAPI_SET_FORCE_DISCHARGE 0x2119 -+#define SMAPI_GET_THRESH_STOP 0x211a -+#define SMAPI_SET_THRESH_STOP 0x211b -+ -+/* SMAPI error codes (see ThinkPad 770 Technical Reference Manual p.83 at -+ http://www-307.ibm.com/pc/support/site.wss/document.do?lndocid=PFAN-3TUQQD */ -+#define SMAPI_RETCODE_EOF 0xff -+static struct { u8 rc; char *msg; int ret; } smapi_retcode[] = -+{ -+ {0x00, "OK", 0}, -+ {0x53, "SMAPI function is not available", -ENXIO}, -+ {0x81, "Invalid parameter", -EINVAL}, -+ {0x86, "Function is not supported by SMAPI BIOS", -EOPNOTSUPP}, -+ {0x90, "System error", -EIO}, -+ {0x91, "System is invalid", -EIO}, -+ {0x92, "System is busy, -EBUSY"}, -+ {0xa0, "Device error (disk read error)", -EIO}, -+ {0xa1, "Device is busy", -EBUSY}, -+ {0xa2, "Device is not attached", -ENXIO}, -+ {0xa3, "Device is disbled", -EIO}, -+ {0xa4, "Request parameter is out of range", -EINVAL}, -+ {0xa5, "Request parameter is not accepted", -EINVAL}, -+ {0xa6, "Transient error", -EBUSY}, /* ? */ -+ {SMAPI_RETCODE_EOF, "Unknown error code", -EIO} -+}; -+ -+ -+#define SMAPI_MAX_RETRIES 10 -+#define SMAPI_PORT2 0x4F /* fixed port, meaning unclear */ -+static unsigned short smapi_port; /* APM control port, normally 0xB2 */ -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) -+static DECLARE_MUTEX(smapi_mutex); -+#else -+static DEFINE_SEMAPHORE(smapi_mutex); -+#endif -+ -+/** -+ * find_smapi_port - read SMAPI port from NVRAM -+ */ -+static int __init find_smapi_port(void) -+{ -+ u16 smapi_id = 0; -+ unsigned short port = 0; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&rtc_lock, flags); -+ smapi_id = CMOS_READ(0x7C); -+ smapi_id |= (CMOS_READ(0x7D) << 8); -+ spin_unlock_irqrestore(&rtc_lock, flags); -+ -+ if (smapi_id != 0x5349) { -+ printk(KERN_ERR "SMAPI not supported (ID=0x%x)\n", smapi_id); -+ return -ENXIO; -+ } -+ spin_lock_irqsave(&rtc_lock, flags); -+ port = CMOS_READ(0x7E); -+ port |= (CMOS_READ(0x7F) << 8); -+ spin_unlock_irqrestore(&rtc_lock, flags); -+ if (port == 0) { -+ printk(KERN_ERR "unable to read SMAPI port number\n"); -+ return -ENXIO; -+ } -+ return port; -+} -+ -+/** -+ * smapi_request - make a SMAPI call -+ * @inEBX, @inECX, @inEDI, @inESI: input registers -+ * @outEBX, @outECX, @outEDX, @outEDI, @outESI: outputs registers -+ * @msg: textual error message -+ * Invokes the SMAPI SMBIOS with the given input and outpu args. -+ * All outputs are optional (can be %NULL). -+ * Returns 0 when successful, and a negative errno constant -+ * (see smapi_retcode above) upon failure. -+ */ -+static int smapi_request(u32 inEBX, u32 inECX, -+ u32 inEDI, u32 inESI, -+ u32 *outEBX, u32 *outECX, u32 *outEDX, -+ u32 *outEDI, u32 *outESI, const char **msg) -+{ -+ int ret = 0; -+ int i; -+ int retries; -+ u8 rc; -+ /* Must use local vars for output regs, due to reg pressure. */ -+ u32 tmpEAX, tmpEBX, tmpECX, tmpEDX, tmpEDI, tmpESI; -+ -+ for (retries = 0; retries < SMAPI_MAX_RETRIES; ++retries) { -+ DPRINTK("req_in: BX=%x CX=%x DI=%x SI=%x", -+ inEBX, inECX, inEDI, inESI); -+ -+ /* SMAPI's SMBIOS call and thinkpad_ec end up using use -+ * different interfaces to the same chip, so play it safe. */ -+ ret = thinkpad_ec_lock(); -+ if (ret) -+ return ret; -+ -+ __asm__ __volatile__( -+ "movl $0x00005380,%%eax\n\t" -+ "movl %6,%%ebx\n\t" -+ "movl %7,%%ecx\n\t" -+ "movl %8,%%edi\n\t" -+ "movl %9,%%esi\n\t" -+ "xorl %%edx,%%edx\n\t" -+ "movw %10,%%dx\n\t" -+ "out %%al,%%dx\n\t" /* trigger SMI to SMBIOS */ -+ "out %%al,$0x4F\n\t" -+ "movl %%eax,%0\n\t" -+ "movl %%ebx,%1\n\t" -+ "movl %%ecx,%2\n\t" -+ "movl %%edx,%3\n\t" -+ "movl %%edi,%4\n\t" -+ "movl %%esi,%5\n\t" -+ :"=m"(tmpEAX), -+ "=m"(tmpEBX), -+ "=m"(tmpECX), -+ "=m"(tmpEDX), -+ "=m"(tmpEDI), -+ "=m"(tmpESI) -+ :"m"(inEBX), "m"(inECX), "m"(inEDI), "m"(inESI), -+ "m"((u16)smapi_port) -+ :"%eax", "%ebx", "%ecx", "%edx", "%edi", -+ "%esi"); -+ -+ thinkpad_ec_invalidate(); -+ thinkpad_ec_unlock(); -+ -+ /* Don't let the next SMAPI access happen too quickly, -+ * may case problems. (We're hold smapi_mutex). */ -+ msleep(50); -+ -+ if (outEBX) *outEBX = tmpEBX; -+ if (outECX) *outECX = tmpECX; -+ if (outEDX) *outEDX = tmpEDX; -+ if (outESI) *outESI = tmpESI; -+ if (outEDI) *outEDI = tmpEDI; -+ -+ /* Look up error code */ -+ rc = (tmpEAX>>8)&0xFF; -+ for (i = 0; smapi_retcode[i].rc != SMAPI_RETCODE_EOF && -+ smapi_retcode[i].rc != rc; ++i) {} -+ ret = smapi_retcode[i].ret; -+ if (msg) -+ *msg = smapi_retcode[i].msg; -+ -+ DPRINTK("req_out: AX=%x BX=%x CX=%x DX=%x DI=%x SI=%x r=%d", -+ tmpEAX, tmpEBX, tmpECX, tmpEDX, tmpEDI, tmpESI, ret); -+ if (ret) -+ TPRINTK(KERN_NOTICE, "SMAPI error: %s (func=%x)", -+ smapi_retcode[i].msg, inEBX); -+ -+ if (ret != -EBUSY) -+ return ret; -+ } -+ return ret; -+} -+ -+/* Convenience wrapper: discard output arguments */ -+static int smapi_write(u32 inEBX, u32 inECX, -+ u32 inEDI, u32 inESI, const char **msg) -+{ -+ return smapi_request(inEBX, inECX, inEDI, inESI, -+ NULL, NULL, NULL, NULL, NULL, msg); -+} -+ -+ -+/********************************************************************* -+ * Specific SMAPI services -+ * All of these functions return 0 upon success, and a negative errno -+ * constant (see smapi_retcode) on failure. -+ */ -+ -+enum thresh_type { -+ THRESH_STOP = 0, /* the code assumes this is 0 for brevity */ -+ THRESH_START -+}; -+#define THRESH_NAME(which) ((which == THRESH_START) ? "start" : "stop") -+ -+/** -+ * __get_real_thresh - read battery charge start/stop threshold from SMAPI -+ * @bat: battery number (0 or 1) -+ * @which: THRESH_START or THRESH_STOP -+ * @thresh: 1..99, 0=default 1..99, 0=default (pass this as-is to SMAPI) -+ * @outEDI: some additional state that needs to be preserved, meaning unknown -+ * @outESI: some additional state that needs to be preserved, meaning unknown -+ */ -+static int __get_real_thresh(int bat, enum thresh_type which, int *thresh, -+ u32 *outEDI, u32 *outESI) -+{ -+ u32 ebx = (which == THRESH_START) ? SMAPI_GET_THRESH_START -+ : SMAPI_GET_THRESH_STOP; -+ u32 ecx = (bat+1)<<8; -+ const char *msg; -+ int ret = smapi_request(ebx, ecx, 0, 0, NULL, -+ &ecx, NULL, outEDI, outESI, &msg); -+ if (ret) { -+ TPRINTK(KERN_NOTICE, "cannot get %s_thresh of bat=%d: %s", -+ THRESH_NAME(which), bat, msg); -+ return ret; -+ } -+ if (!(ecx&0x00000100)) { -+ TPRINTK(KERN_NOTICE, "cannot get %s_thresh of bat=%d: ecx=0%x", -+ THRESH_NAME(which), bat, ecx); -+ return -EIO; -+ } -+ if (thresh) -+ *thresh = ecx&0xFF; -+ return 0; -+} -+ -+/** -+ * get_real_thresh - read battery charge start/stop threshold from SMAPI -+ * @bat: battery number (0 or 1) -+ * @which: THRESH_START or THRESH_STOP -+ * @thresh: 1..99, 0=default (passes as-is to SMAPI) -+ */ -+static int get_real_thresh(int bat, enum thresh_type which, int *thresh) -+{ -+ return __get_real_thresh(bat, which, thresh, NULL, NULL); -+} -+ -+/** -+ * set_real_thresh - write battery start/top charge threshold to SMAPI -+ * @bat: battery number (0 or 1) -+ * @which: THRESH_START or THRESH_STOP -+ * @thresh: 1..99, 0=default (passes as-is to SMAPI) -+ */ -+static int set_real_thresh(int bat, enum thresh_type which, int thresh) -+{ -+ u32 ebx = (which == THRESH_START) ? SMAPI_SET_THRESH_START -+ : SMAPI_SET_THRESH_STOP; -+ u32 ecx = ((bat+1)<<8) + thresh; -+ u32 getDI, getSI; -+ const char *msg; -+ int ret; -+ -+ /* verify read before writing */ -+ ret = __get_real_thresh(bat, which, NULL, &getDI, &getSI); -+ if (ret) -+ return ret; -+ -+ ret = smapi_write(ebx, ecx, getDI, getSI, &msg); -+ if (ret) -+ TPRINTK(KERN_NOTICE, "set %s to %d for bat=%d failed: %s", -+ THRESH_NAME(which), thresh, bat, msg); -+ else -+ TPRINTK(KERN_INFO, "set %s to %d for bat=%d", -+ THRESH_NAME(which), thresh, bat); -+ return ret; -+} -+ -+/** -+ * __get_inhibit_charge_minutes - get inhibit charge period from SMAPI -+ * @bat: battery number (0 or 1) -+ * @minutes: period in minutes (1..65535 minutes, 0=disabled) -+ * @outECX: some additional state that needs to be preserved, meaning unknown -+ * Note that @minutes is the originally set value, it does not count down. -+ */ -+static int __get_inhibit_charge_minutes(int bat, int *minutes, u32 *outECX) -+{ -+ u32 ecx = (bat+1)<<8; -+ u32 esi; -+ const char *msg; -+ int ret = smapi_request(SMAPI_GET_INHIBIT_CHARGE, ecx, 0, 0, -+ NULL, &ecx, NULL, NULL, &esi, &msg); -+ if (ret) { -+ TPRINTK(KERN_NOTICE, "failed for bat=%d: %s", bat, msg); -+ return ret; -+ } -+ if (!(ecx&0x0100)) { -+ TPRINTK(KERN_NOTICE, "bad ecx=0x%x for bat=%d", ecx, bat); -+ return -EIO; -+ } -+ if (minutes) -+ *minutes = (ecx&0x0001)?esi:0; -+ if (outECX) -+ *outECX = ecx; -+ return 0; -+} -+ -+/** -+ * get_inhibit_charge_minutes - get inhibit charge period from SMAPI -+ * @bat: battery number (0 or 1) -+ * @minutes: period in minutes (1..65535 minutes, 0=disabled) -+ * Note that @minutes is the originally set value, it does not count down. -+ */ -+static int get_inhibit_charge_minutes(int bat, int *minutes) -+{ -+ return __get_inhibit_charge_minutes(bat, minutes, NULL); -+} -+ -+/** -+ * set_inhibit_charge_minutes - write inhibit charge period to SMAPI -+ * @bat: battery number (0 or 1) -+ * @minutes: period in minutes (1..65535 minutes, 0=disabled) -+ */ -+static int set_inhibit_charge_minutes(int bat, int minutes) -+{ -+ u32 ecx; -+ const char *msg; -+ int ret; -+ -+ /* verify read before writing */ -+ ret = __get_inhibit_charge_minutes(bat, NULL, &ecx); -+ if (ret) -+ return ret; -+ -+ ecx = ((bat+1)<<8) | (ecx&0x00FE) | (minutes > 0 ? 0x0001 : 0x0000); -+ if (minutes > 0xFFFF) -+ minutes = 0xFFFF; -+ ret = smapi_write(SMAPI_SET_INHIBIT_CHARGE, ecx, 0, minutes, &msg); -+ if (ret) -+ TPRINTK(KERN_NOTICE, -+ "set to %d failed for bat=%d: %s", minutes, bat, msg); -+ else -+ TPRINTK(KERN_INFO, "set to %d for bat=%d\n", minutes, bat); -+ return ret; -+} -+ -+ -+/** -+ * get_force_discharge - get status of forced discharging from SMAPI -+ * @bat: battery number (0 or 1) -+ * @enabled: 1 if forced discharged is enabled, 0 if not -+ */ -+static int get_force_discharge(int bat, int *enabled) -+{ -+ u32 ecx = (bat+1)<<8; -+ const char *msg; -+ int ret = smapi_request(SMAPI_GET_FORCE_DISCHARGE, ecx, 0, 0, -+ NULL, &ecx, NULL, NULL, NULL, &msg); -+ if (ret) { -+ TPRINTK(KERN_NOTICE, "failed for bat=%d: %s", bat, msg); -+ return ret; -+ } -+ *enabled = (!(ecx&0x00000100) && (ecx&0x00000001))?1:0; -+ return 0; -+} -+ -+/** -+ * set_force_discharge - write status of forced discharging to SMAPI -+ * @bat: battery number (0 or 1) -+ * @enabled: 1 if forced discharged is enabled, 0 if not -+ */ -+static int set_force_discharge(int bat, int enabled) -+{ -+ u32 ecx = (bat+1)<<8; -+ const char *msg; -+ int ret = smapi_request(SMAPI_GET_FORCE_DISCHARGE, ecx, 0, 0, -+ NULL, &ecx, NULL, NULL, NULL, &msg); -+ if (ret) { -+ TPRINTK(KERN_NOTICE, "get failed for bat=%d: %s", bat, msg); -+ return ret; -+ } -+ if (ecx&0x00000100) { -+ TPRINTK(KERN_NOTICE, "cannot force discharge bat=%d", bat); -+ return -EIO; -+ } -+ -+ ecx = ((bat+1)<<8) | (ecx&0x000000FA) | (enabled?0x00000001:0); -+ ret = smapi_write(SMAPI_SET_FORCE_DISCHARGE, ecx, 0, 0, &msg); -+ if (ret) -+ TPRINTK(KERN_NOTICE, "set to %d failed for bat=%d: %s", -+ enabled, bat, msg); -+ else -+ TPRINTK(KERN_INFO, "set to %d for bat=%d", enabled, bat); -+ return ret; -+} -+ -+ -+/********************************************************************* -+ * Wrappers to threshold-related SMAPI functions, which handle default -+ * thresholds and related quirks. -+ */ -+ -+/* Minimum, default and minimum difference for battery charging thresholds: */ -+#define MIN_THRESH_DELTA 4 /* Min delta between start and stop thresh */ -+#define MIN_THRESH_START 2 -+#define MAX_THRESH_START (100-MIN_THRESH_DELTA) -+#define MIN_THRESH_STOP (MIN_THRESH_START + MIN_THRESH_DELTA) -+#define MAX_THRESH_STOP 100 -+#define DEFAULT_THRESH_START MAX_THRESH_START -+#define DEFAULT_THRESH_STOP MAX_THRESH_STOP -+ -+/* The GUI of IBM's Battery Maximizer seems to show a start threshold that -+ * is 1 more than the value we set/get via SMAPI. Since the threshold is -+ * maintained across reboot, this can be confusing. So we kludge our -+ * interface for interoperability: */ -+#define BATMAX_FIX 1 -+ -+/* Get charge start/stop threshold (1..100), -+ * substituting default values if needed and applying BATMAT_FIX. */ -+static int get_thresh(int bat, enum thresh_type which, int *thresh) -+{ -+ int ret = get_real_thresh(bat, which, thresh); -+ if (ret) -+ return ret; -+ if (*thresh == 0) -+ *thresh = (which == THRESH_START) ? DEFAULT_THRESH_START -+ : DEFAULT_THRESH_STOP; -+ else if (which == THRESH_START) -+ *thresh += BATMAX_FIX; -+ return 0; -+} -+ -+ -+/* Set charge start/stop threshold (1..100), -+ * substituting default values if needed and applying BATMAT_FIX. */ -+static int set_thresh(int bat, enum thresh_type which, int thresh) -+{ -+ if (which == THRESH_STOP && thresh == DEFAULT_THRESH_STOP) -+ thresh = 0; /* 100 is out of range, but default means 100 */ -+ if (which == THRESH_START) -+ thresh -= BATMAX_FIX; -+ return set_real_thresh(bat, which, thresh); -+} -+ -+/********************************************************************* -+ * ThinkPad embedded controller readout and basic functions -+ */ -+ -+/** -+ * read_tp_ec_row - read data row from the ThinkPad embedded controller -+ * @arg0: EC command code -+ * @bat: battery number, 0 or 1 -+ * @j: the byte value to be used for "junk" (unused) input/outputs -+ * @dataval: result vector -+ */ -+static int read_tp_ec_row(u8 arg0, int bat, u8 j, u8 *dataval) -+{ -+ int ret; -+ const struct thinkpad_ec_row args = { .mask = 0xFFFF, -+ .val = {arg0, j,j,j,j,j,j,j,j,j,j,j,j,j,j, (u8)bat} }; -+ struct thinkpad_ec_row data = { .mask = 0xFFFF }; -+ -+ ret = thinkpad_ec_lock(); -+ if (ret) -+ return ret; -+ ret = thinkpad_ec_read_row(&args, &data); -+ thinkpad_ec_unlock(); -+ memcpy(dataval, &data.val, TP_CONTROLLER_ROW_LEN); -+ return ret; -+} -+ -+/** -+ * power_device_present - check for presence of battery or AC power -+ * @bat: 0 for battery 0, 1 for battery 1, otherwise AC power -+ * Returns 1 if present, 0 if not present, negative if error. -+ */ -+static int power_device_present(int bat) -+{ -+ u8 row[TP_CONTROLLER_ROW_LEN]; -+ u8 test; -+ int ret = read_tp_ec_row(1, bat, 0, row); -+ if (ret) -+ return ret; -+ switch (bat) { -+ case 0: test = 0x40; break; /* battery 0 */ -+ case 1: test = 0x20; break; /* battery 1 */ -+ default: test = 0x80; /* AC power */ -+ } -+ return (row[0] & test) ? 1 : 0; -+} -+ -+/** -+ * bat_has_status - check if battery can report detailed status -+ * @bat: 0 for battery 0, 1 for battery 1 -+ * Returns 1 if yes, 0 if no, negative if error. -+ */ -+static int bat_has_status(int bat) -+{ -+ u8 row[TP_CONTROLLER_ROW_LEN]; -+ int ret = read_tp_ec_row(1, bat, 0, row); -+ if (ret) -+ return ret; -+ if ((row[0] & (bat?0x20:0x40)) == 0) /* no battery */ -+ return 0; -+ if ((row[1] & (0x60)) == 0) /* no status */ -+ return 0; -+ return 1; -+} -+ -+/** -+ * get_tp_ec_bat_16 - read a 16-bit value from EC battery status data -+ * @arg0: first argument to EC -+ * @off: offset in row returned from EC -+ * @bat: battery (0 or 1) -+ * @val: the 16-bit value obtained -+ * Returns nonzero on error. -+ */ -+static int get_tp_ec_bat_16(u8 arg0, int offset, int bat, u16 *val) -+{ -+ u8 row[TP_CONTROLLER_ROW_LEN]; -+ int ret; -+ if (bat_has_status(bat) != 1) -+ return -ENXIO; -+ ret = read_tp_ec_row(arg0, bat, 0, row); -+ if (ret) -+ return ret; -+ *val = *(u16 *)(row+offset); -+ return 0; -+} -+ -+/********************************************************************* -+ * sysfs attributes for batteries - -+ * definitions and helper functions -+ */ -+ -+/* A custom device attribute struct which holds a battery number */ -+struct bat_device_attribute { -+ struct device_attribute dev_attr; -+ int bat; -+}; -+ -+/** -+ * attr_get_bat - get the battery to which the attribute belongs -+ */ -+static int attr_get_bat(struct device_attribute *attr) -+{ -+ return container_of(attr, struct bat_device_attribute, dev_attr)->bat; -+} -+ -+/** -+ * show_tp_ec_bat_u16 - show an unsigned 16-bit battery attribute -+ * @arg0: specified 1st argument of EC raw to read -+ * @offset: byte offset in EC raw data -+ * @mul: correction factor to multiply by -+ * @na_msg: string to output is value not available (0xFFFFFFFF) -+ * @attr: battery attribute -+ * @buf: output buffer -+ * The 16-bit value is read from the EC, treated as unsigned, -+ * transformed as x->mul*x, and printed to the buffer. -+ * If the value is 0xFFFFFFFF and na_msg!=%NULL, na_msg is printed instead. -+ */ -+static ssize_t show_tp_ec_bat_u16(u8 arg0, int offset, int mul, -+ const char *na_msg, -+ struct device_attribute *attr, char *buf) -+{ -+ u16 val; -+ int ret = get_tp_ec_bat_16(arg0, offset, attr_get_bat(attr), &val); -+ if (ret) -+ return ret; -+ if (na_msg && val == 0xFFFF) -+ return sprintf(buf, "%s\n", na_msg); -+ else -+ return sprintf(buf, "%u\n", mul*(unsigned int)val); -+} -+ -+/** -+ * show_tp_ec_bat_s16 - show an signed 16-bit battery attribute -+ * @arg0: specified 1st argument of EC raw to read -+ * @offset: byte offset in EC raw data -+ * @mul: correction factor to multiply by -+ * @add: correction term to add after multiplication -+ * @attr: battery attribute -+ * @buf: output buffer -+ * The 16-bit value is read from the EC, treated as signed, -+ * transformed as x->mul*x+add, and printed to the buffer. -+ */ -+static ssize_t show_tp_ec_bat_s16(u8 arg0, int offset, int mul, int add, -+ struct device_attribute *attr, char *buf) -+{ -+ u16 val; -+ int ret = get_tp_ec_bat_16(arg0, offset, attr_get_bat(attr), &val); -+ if (ret) -+ return ret; -+ return sprintf(buf, "%d\n", mul*(s16)val+add); -+} -+ -+/** -+ * show_tp_ec_bat_str - show a string from EC battery status data -+ * @arg0: specified 1st argument of EC raw to read -+ * @offset: byte offset in EC raw data -+ * @maxlen: maximum string length -+ * @attr: battery attribute -+ * @buf: output buffer -+ */ -+static ssize_t show_tp_ec_bat_str(u8 arg0, int offset, int maxlen, -+ struct device_attribute *attr, char *buf) -+{ -+ int bat = attr_get_bat(attr); -+ u8 row[TP_CONTROLLER_ROW_LEN]; -+ int ret; -+ if (bat_has_status(bat) != 1) -+ return -ENXIO; -+ ret = read_tp_ec_row(arg0, bat, 0, row); -+ if (ret) -+ return ret; -+ strncpy(buf, (char *)row+offset, maxlen); -+ buf[maxlen] = 0; -+ strcat(buf, "\n"); -+ return strlen(buf); -+} -+ -+/** -+ * show_tp_ec_bat_power - show a power readout from EC battery status data -+ * @arg0: specified 1st argument of EC raw to read -+ * @offV: byte offset of voltage in EC raw data -+ * @offI: byte offset of current in EC raw data -+ * @attr: battery attribute -+ * @buf: output buffer -+ * Computes the power as current*voltage from the two given readout offsets. -+ */ -+static ssize_t show_tp_ec_bat_power(u8 arg0, int offV, int offI, -+ struct device_attribute *attr, char *buf) -+{ -+ u8 row[TP_CONTROLLER_ROW_LEN]; -+ int milliamp, millivolt, ret; -+ int bat = attr_get_bat(attr); -+ if (bat_has_status(bat) != 1) -+ return -ENXIO; -+ ret = read_tp_ec_row(1, bat, 0, row); -+ if (ret) -+ return ret; -+ millivolt = *(u16 *)(row+offV); -+ milliamp = *(s16 *)(row+offI); -+ return sprintf(buf, "%d\n", milliamp*millivolt/1000); /* units: mW */ -+} -+ -+/** -+ * show_tp_ec_bat_date - decode and show a date from EC battery status data -+ * @arg0: specified 1st argument of EC raw to read -+ * @offset: byte offset in EC raw data -+ * @attr: battery attribute -+ * @buf: output buffer -+ */ -+static ssize_t show_tp_ec_bat_date(u8 arg0, int offset, -+ struct device_attribute *attr, char *buf) -+{ -+ u8 row[TP_CONTROLLER_ROW_LEN]; -+ u16 v; -+ int ret; -+ int day, month, year; -+ int bat = attr_get_bat(attr); -+ if (bat_has_status(bat) != 1) -+ return -ENXIO; -+ ret = read_tp_ec_row(arg0, bat, 0, row); -+ if (ret) -+ return ret; -+ -+ /* Decode bit-packed: v = day | (month<<5) | ((year-1980)<<9) */ -+ v = *(u16 *)(row+offset); -+ day = v & 0x1F; -+ month = (v >> 5) & 0xF; -+ year = (v >> 9) + 1980; -+ -+ return sprintf(buf, "%04d-%02d-%02d\n", year, month, day); -+} -+ -+ -+/********************************************************************* -+ * sysfs attribute I/O for batteries - -+ * the actual attribute show/store functions -+ */ -+ -+static ssize_t show_battery_start_charge_thresh(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ int thresh; -+ int bat = attr_get_bat(attr); -+ int ret = get_thresh(bat, THRESH_START, &thresh); -+ if (ret) -+ return ret; -+ return sprintf(buf, "%d\n", thresh); /* units: percent */ -+} -+ -+static ssize_t show_battery_stop_charge_thresh(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ int thresh; -+ int bat = attr_get_bat(attr); -+ int ret = get_thresh(bat, THRESH_STOP, &thresh); -+ if (ret) -+ return ret; -+ return sprintf(buf, "%d\n", thresh); /* units: percent */ -+} -+ -+/** -+ * store_battery_start_charge_thresh - store battery_start_charge_thresh attr -+ * Since this is a kernel<->user interface, we ensure a valid state for -+ * the hardware. We do this by clamping the requested threshold to the -+ * valid range and, if necessary, moving the other threshold so that -+ * it's MIN_THRESH_DELTA away from this one. -+ */ -+static ssize_t store_battery_start_charge_thresh(struct device *dev, -+ struct device_attribute *attr, const char *buf, size_t count) -+{ -+ int thresh, other_thresh, ret; -+ int bat = attr_get_bat(attr); -+ -+ if (sscanf(buf, "%d", &thresh) != 1 || thresh < 1 || thresh > 100) -+ return -EINVAL; -+ -+ if (thresh < MIN_THRESH_START) /* clamp up to MIN_THRESH_START */ -+ thresh = MIN_THRESH_START; -+ if (thresh > MAX_THRESH_START) /* clamp down to MAX_THRESH_START */ -+ thresh = MAX_THRESH_START; -+ -+ down(&smapi_mutex); -+ ret = get_thresh(bat, THRESH_STOP, &other_thresh); -+ if (ret != -EOPNOTSUPP && ret != -ENXIO) { -+ if (ret) /* other threshold is set? */ -+ goto out; -+ ret = get_real_thresh(bat, THRESH_START, NULL); -+ if (ret) /* this threshold is set? */ -+ goto out; -+ if (other_thresh < thresh+MIN_THRESH_DELTA) { -+ /* move other thresh to keep it above this one */ -+ ret = set_thresh(bat, THRESH_STOP, -+ thresh+MIN_THRESH_DELTA); -+ if (ret) -+ goto out; -+ } -+ } -+ ret = set_thresh(bat, THRESH_START, thresh); -+out: -+ up(&smapi_mutex); -+ return count; -+ -+} -+ -+/** -+ * store_battery_stop_charge_thresh - store battery_stop_charge_thresh attr -+ * Since this is a kernel<->user interface, we ensure a valid state for -+ * the hardware. We do this by clamping the requested threshold to the -+ * valid range and, if necessary, moving the other threshold so that -+ * it's MIN_THRESH_DELTA away from this one. -+ */ -+static ssize_t store_battery_stop_charge_thresh(struct device *dev, -+ struct device_attribute *attr, const char *buf, size_t count) -+{ -+ int thresh, other_thresh, ret; -+ int bat = attr_get_bat(attr); -+ -+ if (sscanf(buf, "%d", &thresh) != 1 || thresh < 1 || thresh > 100) -+ return -EINVAL; -+ -+ if (thresh < MIN_THRESH_STOP) /* clamp up to MIN_THRESH_STOP */ -+ thresh = MIN_THRESH_STOP; -+ -+ down(&smapi_mutex); -+ ret = get_thresh(bat, THRESH_START, &other_thresh); -+ if (ret != -EOPNOTSUPP && ret != -ENXIO) { /* other threshold exists? */ -+ if (ret) -+ goto out; -+ /* this threshold exists? */ -+ ret = get_real_thresh(bat, THRESH_STOP, NULL); -+ if (ret) -+ goto out; -+ if (other_thresh >= thresh-MIN_THRESH_DELTA) { -+ /* move other thresh to be below this one */ -+ ret = set_thresh(bat, THRESH_START, -+ thresh-MIN_THRESH_DELTA); -+ if (ret) -+ goto out; -+ } -+ } -+ ret = set_thresh(bat, THRESH_STOP, thresh); -+out: -+ up(&smapi_mutex); -+ return count; -+} -+ -+static ssize_t show_battery_inhibit_charge_minutes(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ int minutes; -+ int bat = attr_get_bat(attr); -+ int ret = get_inhibit_charge_minutes(bat, &minutes); -+ if (ret) -+ return ret; -+ return sprintf(buf, "%d\n", minutes); /* units: minutes */ -+} -+ -+static ssize_t store_battery_inhibit_charge_minutes(struct device *dev, -+ struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ int ret; -+ int minutes; -+ int bat = attr_get_bat(attr); -+ if (sscanf(buf, "%d", &minutes) != 1 || minutes < 0) { -+ TPRINTK(KERN_ERR, "inhibit_charge_minutes: " -+ "must be a non-negative integer"); -+ return -EINVAL; -+ } -+ ret = set_inhibit_charge_minutes(bat, minutes); -+ if (ret) -+ return ret; -+ return count; -+} -+ -+static ssize_t show_battery_force_discharge(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ int enabled; -+ int bat = attr_get_bat(attr); -+ int ret = get_force_discharge(bat, &enabled); -+ if (ret) -+ return ret; -+ return sprintf(buf, "%d\n", enabled); /* type: boolean */ -+} -+ -+static ssize_t store_battery_force_discharge(struct device *dev, -+ struct device_attribute *attr, const char *buf, size_t count) -+{ -+ int ret; -+ int enabled; -+ int bat = attr_get_bat(attr); -+ if (sscanf(buf, "%d", &enabled) != 1 || enabled < 0 || enabled > 1) -+ return -EINVAL; -+ ret = set_force_discharge(bat, enabled); -+ if (ret) -+ return ret; -+ return count; -+} -+ -+static ssize_t show_battery_installed( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ int bat = attr_get_bat(attr); -+ int ret = power_device_present(bat); -+ if (ret < 0) -+ return ret; -+ return sprintf(buf, "%d\n", ret); /* type: boolean */ -+} -+ -+static ssize_t show_battery_state( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ u8 row[TP_CONTROLLER_ROW_LEN]; -+ const char *txt; -+ int ret; -+ int bat = attr_get_bat(attr); -+ if (bat_has_status(bat) != 1) -+ return sprintf(buf, "none\n"); -+ ret = read_tp_ec_row(1, bat, 0, row); -+ if (ret) -+ return ret; -+ switch (row[1] & 0xf0) { -+ case 0xc0: txt = "idle"; break; -+ case 0xd0: txt = "discharging"; break; -+ case 0xe0: txt = "charging"; break; -+ default: return sprintf(buf, "unknown (0x%x)\n", row[1]); -+ } -+ return sprintf(buf, "%s\n", txt); /* type: string from fixed set */ -+} -+ -+static ssize_t show_battery_manufacturer( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* type: string. SBS spec v1.1 p34: ManufacturerName() */ -+ return show_tp_ec_bat_str(4, 2, TP_CONTROLLER_ROW_LEN-2, attr, buf); -+} -+ -+static ssize_t show_battery_model( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* type: string. SBS spec v1.1 p34: DeviceName() */ -+ return show_tp_ec_bat_str(5, 2, TP_CONTROLLER_ROW_LEN-2, attr, buf); -+} -+ -+static ssize_t show_battery_barcoding( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* type: string */ -+ return show_tp_ec_bat_str(7, 2, TP_CONTROLLER_ROW_LEN-2, attr, buf); -+} -+ -+static ssize_t show_battery_chemistry( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* type: string. SBS spec v1.1 p34-35: DeviceChemistry() */ -+ return show_tp_ec_bat_str(6, 2, 5, attr, buf); -+} -+ -+static ssize_t show_battery_voltage( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mV. SBS spec v1.1 p24: Voltage() */ -+ return show_tp_ec_bat_u16(1, 6, 1, NULL, attr, buf); -+} -+ -+static ssize_t show_battery_design_voltage( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mV. SBS spec v1.1 p32: DesignVoltage() */ -+ return show_tp_ec_bat_u16(3, 4, 1, NULL, attr, buf); -+} -+ -+static ssize_t show_battery_charging_max_voltage( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mV. SBS spec v1.1 p37,39: ChargingVoltage() */ -+ return show_tp_ec_bat_u16(9, 8, 1, NULL, attr, buf); -+} -+ -+static ssize_t show_battery_group0_voltage( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mV */ -+ return show_tp_ec_bat_u16(0xA, 12, 1, NULL, attr, buf); -+} -+ -+static ssize_t show_battery_group1_voltage( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mV */ -+ return show_tp_ec_bat_u16(0xA, 10, 1, NULL, attr, buf); -+} -+ -+static ssize_t show_battery_group2_voltage( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mV */ -+ return show_tp_ec_bat_u16(0xA, 8, 1, NULL, attr, buf); -+} -+ -+static ssize_t show_battery_group3_voltage( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mV */ -+ return show_tp_ec_bat_u16(0xA, 6, 1, NULL, attr, buf); -+} -+ -+static ssize_t show_battery_current_now( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mA. SBS spec v1.1 p24: Current() */ -+ return show_tp_ec_bat_s16(1, 8, 1, 0, attr, buf); -+} -+ -+static ssize_t show_battery_current_avg( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mA. SBS spec v1.1 p24: AverageCurrent() */ -+ return show_tp_ec_bat_s16(1, 10, 1, 0, attr, buf); -+} -+ -+static ssize_t show_battery_charging_max_current( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mA. SBS spec v1.1 p36,38: ChargingCurrent() */ -+ return show_tp_ec_bat_s16(9, 6, 1, 0, attr, buf); -+} -+ -+static ssize_t show_battery_power_now( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mW. SBS spec v1.1: Voltage()*Current() */ -+ return show_tp_ec_bat_power(1, 6, 8, attr, buf); -+} -+ -+static ssize_t show_battery_power_avg( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mW. SBS spec v1.1: Voltage()*AverageCurrent() */ -+ return show_tp_ec_bat_power(1, 6, 10, attr, buf); -+} -+ -+static ssize_t show_battery_remaining_percent( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: percent. SBS spec v1.1 p25: RelativeStateOfCharge() */ -+ return show_tp_ec_bat_u16(1, 12, 1, NULL, attr, buf); -+} -+ -+static ssize_t show_battery_remaining_percent_error( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: percent. SBS spec v1.1 p25: MaxError() */ -+ return show_tp_ec_bat_u16(9, 4, 1, NULL, attr, buf); -+} -+ -+static ssize_t show_battery_remaining_charging_time( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: minutes. SBS spec v1.1 p27: AverageTimeToFull() */ -+ return show_tp_ec_bat_u16(2, 8, 1, "not_charging", attr, buf); -+} -+ -+static ssize_t show_battery_remaining_running_time( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: minutes. SBS spec v1.1 p27: RunTimeToEmpty() */ -+ return show_tp_ec_bat_u16(2, 6, 1, "not_discharging", attr, buf); -+} -+ -+static ssize_t show_battery_remaining_running_time_now( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: minutes. SBS spec v1.1 p27: RunTimeToEmpty() */ -+ return show_tp_ec_bat_u16(2, 4, 1, "not_discharging", attr, buf); -+} -+ -+static ssize_t show_battery_remaining_capacity( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mWh. SBS spec v1.1 p26. */ -+ return show_tp_ec_bat_u16(1, 14, 10, "", attr, buf); -+} -+ -+static ssize_t show_battery_last_full_capacity( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mWh. SBS spec v1.1 p26: FullChargeCapacity() */ -+ return show_tp_ec_bat_u16(2, 2, 10, "", attr, buf); -+} -+ -+static ssize_t show_battery_design_capacity( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: mWh. SBS spec v1.1 p32: DesignCapacity() */ -+ return show_tp_ec_bat_u16(3, 2, 10, "", attr, buf); -+} -+ -+static ssize_t show_battery_cycle_count( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: ordinal. SBS spec v1.1 p32: CycleCount() */ -+ return show_tp_ec_bat_u16(2, 12, 1, "", attr, buf); -+} -+ -+static ssize_t show_battery_temperature( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* units: millicelsius. SBS spec v1.1: Temperature()*10 */ -+ return show_tp_ec_bat_s16(1, 4, 100, -273100, attr, buf); -+} -+ -+static ssize_t show_battery_serial( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* type: int. SBS spec v1.1 p34: SerialNumber() */ -+ return show_tp_ec_bat_u16(3, 10, 1, "", attr, buf); -+} -+ -+static ssize_t show_battery_manufacture_date( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* type: YYYY-MM-DD. SBS spec v1.1 p34: ManufactureDate() */ -+ return show_tp_ec_bat_date(3, 8, attr, buf); -+} -+ -+static ssize_t show_battery_first_use_date( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ /* type: YYYY-MM-DD */ -+ return show_tp_ec_bat_date(8, 2, attr, buf); -+} -+ -+/** -+ * show_battery_dump - show the battery's dump attribute -+ * The dump attribute gives a hex dump of all EC readouts related to a -+ * battery. Some of the enumerated values don't really exist (i.e., the -+ * EC function just leaves them untouched); we use a kludge to detect and -+ * denote these. -+ */ -+#define MIN_DUMP_ARG0 0x00 -+#define MAX_DUMP_ARG0 0x0a /* 0x0b is useful too but hangs old EC firmware */ -+static ssize_t show_battery_dump( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ int i; -+ char *p = buf; -+ int bat = attr_get_bat(attr); -+ u8 arg0; /* first argument to EC */ -+ u8 rowa[TP_CONTROLLER_ROW_LEN], -+ rowb[TP_CONTROLLER_ROW_LEN]; -+ const u8 junka = 0xAA, -+ junkb = 0x55; /* junk values for testing changes */ -+ int ret; -+ -+ for (arg0 = MIN_DUMP_ARG0; arg0 <= MAX_DUMP_ARG0; ++arg0) { -+ if ((p-buf) > PAGE_SIZE-TP_CONTROLLER_ROW_LEN*5) -+ return -ENOMEM; /* don't overflow sysfs buf */ -+ /* Read raw twice with different junk values, -+ * to detect unused output bytes which are left unchaged: */ -+ ret = read_tp_ec_row(arg0, bat, junka, rowa); -+ if (ret) -+ return ret; -+ ret = read_tp_ec_row(arg0, bat, junkb, rowb); -+ if (ret) -+ return ret; -+ for (i = 0; i < TP_CONTROLLER_ROW_LEN; i++) { -+ if (rowa[i] == junka && rowb[i] == junkb) -+ p += sprintf(p, "-- "); /* unused by EC */ -+ else -+ p += sprintf(p, "%02x ", rowa[i]); -+ } -+ p += sprintf(p, "\n"); -+ } -+ return p-buf; -+} -+ -+ -+/********************************************************************* -+ * sysfs attribute I/O, other than batteries -+ */ -+ -+static ssize_t show_ac_connected( -+ struct device *dev, struct device_attribute *attr, char *buf) -+{ -+ int ret = power_device_present(0xFF); -+ if (ret < 0) -+ return ret; -+ return sprintf(buf, "%d\n", ret); /* type: boolean */ -+} -+ -+/********************************************************************* -+ * The the "smapi_request" sysfs attribute executes a raw SMAPI call. -+ * You write to make a request and read to get the result. The state -+ * is saved globally rather than per fd (sysfs limitation), so -+ * simultaenous requests may get each other's results! So this is for -+ * development and debugging only. -+ */ -+#define MAX_SMAPI_ATTR_ANSWER_LEN 128 -+static char smapi_attr_answer[MAX_SMAPI_ATTR_ANSWER_LEN] = ""; -+ -+static ssize_t show_smapi_request(struct device *dev, -+ struct device_attribute *attr, char *buf) -+{ -+ int ret = snprintf(buf, PAGE_SIZE, "%s", smapi_attr_answer); -+ smapi_attr_answer[0] = '\0'; -+ return ret; -+} -+ -+static ssize_t store_smapi_request(struct device *dev, -+ struct device_attribute *attr, -+ const char *buf, size_t count) -+{ -+ unsigned int inEBX, inECX, inEDI, inESI; -+ u32 outEBX, outECX, outEDX, outEDI, outESI; -+ const char *msg; -+ int ret; -+ if (sscanf(buf, "%x %x %x %x", &inEBX, &inECX, &inEDI, &inESI) != 4) { -+ smapi_attr_answer[0] = '\0'; -+ return -EINVAL; -+ } -+ ret = smapi_request( -+ inEBX, inECX, inEDI, inESI, -+ &outEBX, &outECX, &outEDX, &outEDI, &outESI, &msg); -+ snprintf(smapi_attr_answer, MAX_SMAPI_ATTR_ANSWER_LEN, -+ "%x %x %x %x %x %d '%s'\n", -+ (unsigned int)outEBX, (unsigned int)outECX, -+ (unsigned int)outEDX, (unsigned int)outEDI, -+ (unsigned int)outESI, ret, msg); -+ if (ret) -+ return ret; -+ else -+ return count; -+} -+ -+/********************************************************************* -+ * Power management: the embedded controller forgets the battery -+ * thresholds when the system is suspended to disk and unplugged from -+ * AC and battery, so we restore it upon resume. -+ */ -+ -+static int saved_threshs[4] = {-1, -1, -1, -1}; /* -1 = don't know */ -+ -+static int tp_suspend(struct platform_device *dev, pm_message_t state) -+{ -+ int restore = (state.event == PM_EVENT_HIBERNATE || -+ state.event == PM_EVENT_FREEZE); -+ if (!restore || get_real_thresh(0, THRESH_STOP , &saved_threshs[0])) -+ saved_threshs[0] = -1; -+ if (!restore || get_real_thresh(0, THRESH_START, &saved_threshs[1])) -+ saved_threshs[1] = -1; -+ if (!restore || get_real_thresh(1, THRESH_STOP , &saved_threshs[2])) -+ saved_threshs[2] = -1; -+ if (!restore || get_real_thresh(1, THRESH_START, &saved_threshs[3])) -+ saved_threshs[3] = -1; -+ DPRINTK("suspend saved: %d %d %d %d", saved_threshs[0], -+ saved_threshs[1], saved_threshs[2], saved_threshs[3]); -+ return 0; -+} -+ -+static int tp_resume(struct platform_device *dev) -+{ -+ DPRINTK("resume restoring: %d %d %d %d", saved_threshs[0], -+ saved_threshs[1], saved_threshs[2], saved_threshs[3]); -+ if (saved_threshs[0] >= 0) -+ set_real_thresh(0, THRESH_STOP , saved_threshs[0]); -+ if (saved_threshs[1] >= 0) -+ set_real_thresh(0, THRESH_START, saved_threshs[1]); -+ if (saved_threshs[2] >= 0) -+ set_real_thresh(1, THRESH_STOP , saved_threshs[2]); -+ if (saved_threshs[3] >= 0) -+ set_real_thresh(1, THRESH_START, saved_threshs[3]); -+ return 0; -+} -+ -+ -+/********************************************************************* -+ * Driver model -+ */ -+ -+static struct platform_driver tp_driver = { -+ .suspend = tp_suspend, -+ .resume = tp_resume, -+ .driver = { -+ .name = "smapi", -+ .owner = THIS_MODULE -+ }, -+}; -+ -+ -+/********************************************************************* -+ * Sysfs device model -+ */ -+ -+/* Attributes in /sys/devices/platform/smapi/ */ -+ -+static DEVICE_ATTR(ac_connected, 0444, show_ac_connected, NULL); -+static DEVICE_ATTR(smapi_request, 0600, show_smapi_request, -+ store_smapi_request); -+ -+static struct attribute *tp_root_attributes[] = { -+ &dev_attr_ac_connected.attr, -+ &dev_attr_smapi_request.attr, -+ NULL -+}; -+static struct attribute_group tp_root_attribute_group = { -+ .attrs = tp_root_attributes -+}; -+ -+/* Attributes under /sys/devices/platform/smapi/BAT{0,1}/ : -+ * Every attribute needs to be defined (i.e., statically allocated) for -+ * each battery, and then referenced in the attribute list of each battery. -+ * We use preprocessor voodoo to avoid duplicating the list of attributes 4 -+ * times. The preprocessor output is just normal sysfs attributes code. -+ */ -+ -+/** -+ * FOREACH_BAT_ATTR - invoke the given macros on all our battery attributes -+ * @_BAT: battery number (0 or 1) -+ * @_ATTR_RW: macro to invoke for each read/write attribute -+ * @_ATTR_R: macro to invoke for each read-only attribute -+ */ -+#define FOREACH_BAT_ATTR(_BAT, _ATTR_RW, _ATTR_R) \ -+ _ATTR_RW(_BAT, start_charge_thresh) \ -+ _ATTR_RW(_BAT, stop_charge_thresh) \ -+ _ATTR_RW(_BAT, inhibit_charge_minutes) \ -+ _ATTR_RW(_BAT, force_discharge) \ -+ _ATTR_R(_BAT, installed) \ -+ _ATTR_R(_BAT, state) \ -+ _ATTR_R(_BAT, manufacturer) \ -+ _ATTR_R(_BAT, model) \ -+ _ATTR_R(_BAT, barcoding) \ -+ _ATTR_R(_BAT, chemistry) \ -+ _ATTR_R(_BAT, voltage) \ -+ _ATTR_R(_BAT, group0_voltage) \ -+ _ATTR_R(_BAT, group1_voltage) \ -+ _ATTR_R(_BAT, group2_voltage) \ -+ _ATTR_R(_BAT, group3_voltage) \ -+ _ATTR_R(_BAT, current_now) \ -+ _ATTR_R(_BAT, current_avg) \ -+ _ATTR_R(_BAT, charging_max_current) \ -+ _ATTR_R(_BAT, power_now) \ -+ _ATTR_R(_BAT, power_avg) \ -+ _ATTR_R(_BAT, remaining_percent) \ -+ _ATTR_R(_BAT, remaining_percent_error) \ -+ _ATTR_R(_BAT, remaining_charging_time) \ -+ _ATTR_R(_BAT, remaining_running_time) \ -+ _ATTR_R(_BAT, remaining_running_time_now) \ -+ _ATTR_R(_BAT, remaining_capacity) \ -+ _ATTR_R(_BAT, last_full_capacity) \ -+ _ATTR_R(_BAT, design_voltage) \ -+ _ATTR_R(_BAT, charging_max_voltage) \ -+ _ATTR_R(_BAT, design_capacity) \ -+ _ATTR_R(_BAT, cycle_count) \ -+ _ATTR_R(_BAT, temperature) \ -+ _ATTR_R(_BAT, serial) \ -+ _ATTR_R(_BAT, manufacture_date) \ -+ _ATTR_R(_BAT, first_use_date) \ -+ _ATTR_R(_BAT, dump) -+ -+/* Define several macros we will feed into FOREACH_BAT_ATTR: */ -+ -+#define DEFINE_BAT_ATTR_RW(_BAT,_NAME) \ -+ static struct bat_device_attribute dev_attr_##_NAME##_##_BAT = { \ -+ .dev_attr = __ATTR(_NAME, 0644, show_battery_##_NAME, \ -+ store_battery_##_NAME), \ -+ .bat = _BAT \ -+ }; -+ -+#define DEFINE_BAT_ATTR_R(_BAT,_NAME) \ -+ static struct bat_device_attribute dev_attr_##_NAME##_##_BAT = { \ -+ .dev_attr = __ATTR(_NAME, 0644, show_battery_##_NAME, 0), \ -+ .bat = _BAT \ -+ }; -+ -+#define REF_BAT_ATTR(_BAT,_NAME) \ -+ &dev_attr_##_NAME##_##_BAT.dev_attr.attr, -+ -+/* This provide all attributes for one battery: */ -+ -+#define PROVIDE_BAT_ATTRS(_BAT) \ -+ FOREACH_BAT_ATTR(_BAT, DEFINE_BAT_ATTR_RW, DEFINE_BAT_ATTR_R) \ -+ static struct attribute *tp_bat##_BAT##_attributes[] = { \ -+ FOREACH_BAT_ATTR(_BAT, REF_BAT_ATTR, REF_BAT_ATTR) \ -+ NULL \ -+ }; \ -+ static struct attribute_group tp_bat##_BAT##_attribute_group = { \ -+ .name = "BAT" #_BAT, \ -+ .attrs = tp_bat##_BAT##_attributes \ -+ }; -+ -+/* Finally genereate the attributes: */ -+ -+PROVIDE_BAT_ATTRS(0) -+PROVIDE_BAT_ATTRS(1) -+ -+/* List of attribute groups */ -+ -+static struct attribute_group *attr_groups[] = { -+ &tp_root_attribute_group, -+ &tp_bat0_attribute_group, -+ &tp_bat1_attribute_group, -+ NULL -+}; -+ -+ -+/********************************************************************* -+ * Init and cleanup -+ */ -+ -+static struct attribute_group **next_attr_group; /* next to register */ -+ -+static int __init tp_init(void) -+{ -+ int ret; -+ printk(KERN_INFO "tp_smapi " TP_VERSION " loading...\n"); -+ -+ ret = find_smapi_port(); -+ if (ret < 0) -+ goto err; -+ else -+ smapi_port = ret; -+ -+ if (!request_region(smapi_port, 1, "smapi")) { -+ printk(KERN_ERR "tp_smapi cannot claim port 0x%x\n", -+ smapi_port); -+ ret = -ENXIO; -+ goto err; -+ } -+ -+ if (!request_region(SMAPI_PORT2, 1, "smapi")) { -+ printk(KERN_ERR "tp_smapi cannot claim port 0x%x\n", -+ SMAPI_PORT2); -+ ret = -ENXIO; -+ goto err_port1; -+ } -+ -+ ret = platform_driver_register(&tp_driver); -+ if (ret) -+ goto err_port2; -+ -+ pdev = platform_device_alloc("smapi", -1); -+ if (!pdev) { -+ ret = -ENOMEM; -+ goto err_driver; -+ } -+ -+ ret = platform_device_add(pdev); -+ if (ret) -+ goto err_device_free; -+ -+ for (next_attr_group = attr_groups; *next_attr_group; -+ ++next_attr_group) { -+ ret = sysfs_create_group(&pdev->dev.kobj, *next_attr_group); -+ if (ret) -+ goto err_attr; -+ } -+ -+ printk(KERN_INFO "tp_smapi successfully loaded (smapi_port=0x%x).\n", -+ smapi_port); -+ return 0; -+ -+err_attr: -+ while (--next_attr_group >= attr_groups) -+ sysfs_remove_group(&pdev->dev.kobj, *next_attr_group); -+ platform_device_unregister(pdev); -+err_device_free: -+ platform_device_put(pdev); -+err_driver: -+ platform_driver_unregister(&tp_driver); -+err_port2: -+ release_region(SMAPI_PORT2, 1); -+err_port1: -+ release_region(smapi_port, 1); -+err: -+ printk(KERN_ERR "tp_smapi init failed (ret=%d)!\n", ret); -+ return ret; -+} -+ -+static void __exit tp_exit(void) -+{ -+ while (next_attr_group && --next_attr_group >= attr_groups) -+ sysfs_remove_group(&pdev->dev.kobj, *next_attr_group); -+ platform_device_unregister(pdev); -+ platform_driver_unregister(&tp_driver); -+ release_region(SMAPI_PORT2, 1); -+ if (smapi_port) -+ release_region(smapi_port, 1); -+ -+ printk(KERN_INFO "tp_smapi unloaded.\n"); -+} -+ -+module_init(tp_init); -+module_exit(tp_exit); -diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c -index 3a546ec10d90..22a65ad4e46e 100644 ---- a/drivers/pps/pps.c -+++ b/drivers/pps/pps.c -@@ -152,6 +152,14 @@ static long pps_cdev_ioctl(struct file *file, - pps->params.mode |= PPS_CANWAIT; - pps->params.api_version = PPS_API_VERS; - -+ /* -+ * Clear unused fields of pps_kparams to avoid leaking -+ * uninitialized data of the PPS_SETPARAMS caller via -+ * PPS_GETPARAMS -+ */ -+ pps->params.assert_off_tu.flags = 0; -+ pps->params.clear_off_tu.flags = 0; -+ - spin_unlock_irq(&pps->lock); - - break; -diff --git a/drivers/rapidio/devices/rio_mport_cdev.c b/drivers/rapidio/devices/rio_mport_cdev.c -index ce7a90e68042..8155f59ece38 100644 ---- a/drivers/rapidio/devices/rio_mport_cdev.c -+++ b/drivers/rapidio/devices/rio_mport_cdev.c -@@ -1686,6 +1686,7 @@ static int rio_mport_add_riodev(struct mport_cdev_priv *priv, - - if (copy_from_user(&dev_info, arg, sizeof(dev_info))) - return -EFAULT; -+ dev_info.name[sizeof(dev_info.name) - 1] = '\0'; - - rmcd_debug(RDEV, "name:%s ct:0x%x did:0x%x hc:0x%x", dev_info.name, - dev_info.comptag, dev_info.destid, dev_info.hopcount); -@@ -1817,6 +1818,7 @@ static int rio_mport_del_riodev(struct mport_cdev_priv *priv, void __user *arg) - - if (copy_from_user(&dev_info, arg, sizeof(dev_info))) - return -EFAULT; -+ dev_info.name[sizeof(dev_info.name) - 1] = '\0'; - - mport = priv->md->mport; - -diff --git a/drivers/ras/cec.c b/drivers/ras/cec.c -index 673f8a128397..f5795adc5a6e 100644 ---- a/drivers/ras/cec.c -+++ b/drivers/ras/cec.c -@@ -369,7 +369,9 @@ static int pfn_set(void *data, u64 val) - { - *(u64 *)data = val; - -- return cec_add_elem(val); -+ cec_add_elem(val); -+ -+ return 0; - } - - DEFINE_DEBUGFS_ATTRIBUTE(pfn_ops, u64_get, pfn_set, "0x%llx\n"); -diff --git a/drivers/regulator/88pm800.c b/drivers/regulator/88pm800-regulator.c -similarity index 100% -rename from drivers/regulator/88pm800.c -rename to drivers/regulator/88pm800-regulator.c -diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile -index 93f53840e8f1..486edf784c13 100644 ---- a/drivers/regulator/Makefile -+++ b/drivers/regulator/Makefile -@@ -11,7 +11,7 @@ obj-$(CONFIG_REGULATOR_VIRTUAL_CONSUMER) += virtual.o - obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o - - obj-$(CONFIG_REGULATOR_88PG86X) += 88pg86x.o --obj-$(CONFIG_REGULATOR_88PM800) += 88pm800.o -+obj-$(CONFIG_REGULATOR_88PM800) += 88pm800-regulator.o - obj-$(CONFIG_REGULATOR_88PM8607) += 88pm8607.o - obj-$(CONFIG_REGULATOR_CPCAP) += cpcap-regulator.o - obj-$(CONFIG_REGULATOR_AAT2870) += aat2870-regulator.o -diff --git a/drivers/regulator/da9211-regulator.c b/drivers/regulator/da9211-regulator.c -index da37b4ccd834..0309823d2c72 100644 ---- a/drivers/regulator/da9211-regulator.c -+++ b/drivers/regulator/da9211-regulator.c -@@ -289,6 +289,8 @@ static struct da9211_pdata *da9211_parse_regulators_dt( - 0, - GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE, - "da9211-enable"); -+ if (IS_ERR(pdata->gpiod_ren[n])) -+ pdata->gpiod_ren[n] = NULL; - n++; - } - -diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c -index 134c62db36c5..8812c2c3cfc2 100644 ---- a/drivers/regulator/s2mps11.c -+++ b/drivers/regulator/s2mps11.c -@@ -372,8 +372,8 @@ static const struct regulator_desc s2mps11_regulators[] = { - regulator_desc_s2mps11_buck1_4(4), - regulator_desc_s2mps11_buck5, - regulator_desc_s2mps11_buck67810(6, MIN_600_MV, STEP_6_25_MV), -- regulator_desc_s2mps11_buck67810(7, MIN_600_MV, STEP_12_5_MV), -- regulator_desc_s2mps11_buck67810(8, MIN_600_MV, STEP_12_5_MV), -+ regulator_desc_s2mps11_buck67810(7, MIN_750_MV, STEP_12_5_MV), -+ regulator_desc_s2mps11_buck67810(8, MIN_750_MV, STEP_12_5_MV), - regulator_desc_s2mps11_buck9, - regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV), - }; -@@ -821,9 +821,12 @@ static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev, - 0, - GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE, - "s2mps11-regulator"); -- if (IS_ERR(gpio[reg])) { -+ if (PTR_ERR(gpio[reg]) == -ENOENT) -+ gpio[reg] = NULL; -+ else if (IS_ERR(gpio[reg])) { - dev_err(&pdev->dev, "Failed to get control GPIO for %d/%s\n", - reg, rdata[reg].name); -+ gpio[reg] = NULL; - continue; - } - if (gpio[reg]) -diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c -index bb9d1a083299..6ca27e9d5ef7 100644 ---- a/drivers/regulator/s5m8767.c -+++ b/drivers/regulator/s5m8767.c -@@ -574,7 +574,9 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, - 0, - GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE, - "s5m8767"); -- if (IS_ERR(rdata->ext_control_gpiod)) -+ if (PTR_ERR(rdata->ext_control_gpiod) == -ENOENT) -+ rdata->ext_control_gpiod = NULL; -+ else if (IS_ERR(rdata->ext_control_gpiod)) - return PTR_ERR(rdata->ext_control_gpiod); - - rdata->id = i; -diff --git a/drivers/regulator/tps65090-regulator.c b/drivers/regulator/tps65090-regulator.c -index ca39b3d55123..10ea4b5a0f55 100644 ---- a/drivers/regulator/tps65090-regulator.c -+++ b/drivers/regulator/tps65090-regulator.c -@@ -371,11 +371,12 @@ static struct tps65090_platform_data *tps65090_parse_dt_reg_data( - "dcdc-ext-control-gpios", 0, - gflags, - "tps65090"); -- if (IS_ERR(rpdata->gpiod)) -- return ERR_CAST(rpdata->gpiod); -- if (!rpdata->gpiod) -+ if (PTR_ERR(rpdata->gpiod) == -ENOENT) { - dev_err(&pdev->dev, - "could not find DCDC external control GPIO\n"); -+ rpdata->gpiod = NULL; -+ } else if (IS_ERR(rpdata->gpiod)) -+ return ERR_CAST(rpdata->gpiod); - } - - if (of_property_read_u32(tps65090_matches[idx].of_node, -diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c -index 8b5363223eaa..5031c6806908 100644 ---- a/drivers/remoteproc/remoteproc_core.c -+++ b/drivers/remoteproc/remoteproc_core.c -@@ -512,6 +512,7 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc, - /* Initialise vdev subdevice */ - snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index); - rvdev->dev.parent = rproc->dev.parent; -+ rvdev->dev.dma_pfn_offset = rproc->dev.parent->dma_pfn_offset; - rvdev->dev.release = rproc_rvdev_release; - dev_set_name(&rvdev->dev, "%s#%s", dev_name(rvdev->dev.parent), name); - dev_set_drvdata(&rvdev->dev, rvdev); -diff --git a/drivers/rtc/rtc-wm8350.c b/drivers/rtc/rtc-wm8350.c -index 2018614f258f..fc19b312c345 100644 ---- a/drivers/rtc/rtc-wm8350.c -+++ b/drivers/rtc/rtc-wm8350.c -@@ -114,7 +114,7 @@ static int wm8350_rtc_settime(struct device *dev, struct rtc_time *tm) - /* Wait until confirmation of stopping */ - do { - rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL); -- schedule_timeout_uninterruptible(msecs_to_jiffies(1)); -+ schedule_msec_hrtimeout_uninterruptible((1)); - } while (--retries && !(rtc_ctrl & WM8350_RTC_STS)); - - if (!retries) { -@@ -197,7 +197,7 @@ static int wm8350_rtc_stop_alarm(struct wm8350 *wm8350) - /* Wait until confirmation of stopping */ - do { - rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL); -- schedule_timeout_uninterruptible(msecs_to_jiffies(1)); -+ schedule_msec_hrtimeout_uninterruptible((1)); - } while (retries-- && !(rtc_ctrl & WM8350_RTC_ALMSTS)); - - if (!(rtc_ctrl & WM8350_RTC_ALMSTS)) -@@ -220,7 +220,7 @@ static int wm8350_rtc_start_alarm(struct wm8350 *wm8350) - /* Wait until confirmation */ - do { - rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL); -- schedule_timeout_uninterruptible(msecs_to_jiffies(1)); -+ schedule_msec_hrtimeout_uninterruptible((1)); - } while (retries-- && rtc_ctrl & WM8350_RTC_ALMSTS); - - if (rtc_ctrl & WM8350_RTC_ALMSTS) -diff --git a/drivers/s390/block/dasd_alias.c b/drivers/s390/block/dasd_alias.c -index b9ce93e9df89..99f86612f775 100644 ---- a/drivers/s390/block/dasd_alias.c -+++ b/drivers/s390/block/dasd_alias.c -@@ -383,6 +383,20 @@ suborder_not_supported(struct dasd_ccw_req *cqr) - char msg_format; - char msg_no; - -+ /* -+ * intrc values ENODEV, ENOLINK and EPERM -+ * will be optained from sleep_on to indicate that no -+ * IO operation can be started -+ */ -+ if (cqr->intrc == -ENODEV) -+ return 1; -+ -+ if (cqr->intrc == -ENOLINK) -+ return 1; -+ -+ if (cqr->intrc == -EPERM) -+ return 1; -+ - sense = dasd_get_sense(&cqr->irb); - if (!sense) - return 0; -@@ -447,12 +461,8 @@ static int read_unit_address_configuration(struct dasd_device *device, - lcu->flags &= ~NEED_UAC_UPDATE; - spin_unlock_irqrestore(&lcu->lock, flags); - -- do { -- rc = dasd_sleep_on(cqr); -- if (rc && suborder_not_supported(cqr)) -- return -EOPNOTSUPP; -- } while (rc && (cqr->retries > 0)); -- if (rc) { -+ rc = dasd_sleep_on(cqr); -+ if (rc && !suborder_not_supported(cqr)) { - spin_lock_irqsave(&lcu->lock, flags); - lcu->flags |= NEED_UAC_UPDATE; - spin_unlock_irqrestore(&lcu->lock, flags); -diff --git a/drivers/s390/char/sclp_early.c b/drivers/s390/char/sclp_early.c -index 6c90aa725f23..e71992a3c55f 100644 ---- a/drivers/s390/char/sclp_early.c -+++ b/drivers/s390/char/sclp_early.c -@@ -41,7 +41,6 @@ static void __init sclp_early_facilities_detect(struct read_info_sccb *sccb) - sclp.has_hvs = !!(sccb->fac119 & 0x80); - sclp.has_kss = !!(sccb->fac98 & 0x01); - sclp.has_sipl = !!(sccb->cbl & 0x02); -- sclp.has_sipl_g2 = !!(sccb->cbl & 0x04); - if (sccb->fac85 & 0x02) - S390_lowcore.machine_flags |= MACHINE_FLAG_ESOP; - if (sccb->fac91 & 0x40) -diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c -index 7b7620de2acd..730c4e68094b 100644 ---- a/drivers/s390/cio/qdio_main.c -+++ b/drivers/s390/cio/qdio_main.c -@@ -736,6 +736,7 @@ static int get_outbound_buffer_frontier(struct qdio_q *q, unsigned int start) - - switch (state) { - case SLSB_P_OUTPUT_EMPTY: -+ case SLSB_P_OUTPUT_PENDING: - /* the adapter got it */ - DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, - "out empty:%1d %02x", q->nr, count); -diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c -index 99d7d2566a3a..d4101cecdc8d 100644 ---- a/drivers/s390/cio/qdio_setup.c -+++ b/drivers/s390/cio/qdio_setup.c -@@ -150,6 +150,7 @@ static int __qdio_allocate_qs(struct qdio_q **irq_ptr_qs, int nr_queues) - return -ENOMEM; - } - irq_ptr_qs[i] = q; -+ INIT_LIST_HEAD(&q->entry); - } - return 0; - } -@@ -178,6 +179,7 @@ static void setup_queues_misc(struct qdio_q *q, struct qdio_irq *irq_ptr, - q->mask = 1 << (31 - i); - q->nr = i; - q->handler = handler; -+ INIT_LIST_HEAD(&q->entry); - } - - static void setup_storage_lists(struct qdio_q *q, struct qdio_irq *irq_ptr, -diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c -index 28d59ac2204c..d9763bbecbf9 100644 ---- a/drivers/s390/cio/qdio_thinint.c -+++ b/drivers/s390/cio/qdio_thinint.c -@@ -79,7 +79,6 @@ void tiqdio_add_input_queues(struct qdio_irq *irq_ptr) - mutex_lock(&tiq_list_lock); - list_add_rcu(&irq_ptr->input_qs[0]->entry, &tiq_list); - mutex_unlock(&tiq_list_lock); -- xchg(irq_ptr->dsci, 1 << 7); - } - - void tiqdio_remove_input_queues(struct qdio_irq *irq_ptr) -@@ -87,14 +86,14 @@ void tiqdio_remove_input_queues(struct qdio_irq *irq_ptr) - struct qdio_q *q; - - q = irq_ptr->input_qs[0]; -- /* if establish triggered an error */ -- if (!q || !q->entry.prev || !q->entry.next) -+ if (!q) - return; - - mutex_lock(&tiq_list_lock); - list_del_rcu(&q->entry); - mutex_unlock(&tiq_list_lock); - synchronize_rcu(); -+ INIT_LIST_HEAD(&q->entry); - } - - static inline int has_multiple_inq_on_dsci(struct qdio_irq *irq_ptr) -diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c -index e8fc28dba8df..96f0d34e9459 100644 ---- a/drivers/s390/scsi/zfcp_erp.c -+++ b/drivers/s390/scsi/zfcp_erp.c -@@ -11,6 +11,7 @@ - #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt - - #include -+#include - #include "zfcp_ext.h" - #include "zfcp_reqlist.h" - -@@ -217,6 +218,12 @@ static struct zfcp_erp_action *zfcp_erp_setup_act(enum zfcp_erp_act_type need, - struct zfcp_erp_action *erp_action; - struct zfcp_scsi_dev *zfcp_sdev; - -+ if (WARN_ON_ONCE(need != ZFCP_ERP_ACTION_REOPEN_LUN && -+ need != ZFCP_ERP_ACTION_REOPEN_PORT && -+ need != ZFCP_ERP_ACTION_REOPEN_PORT_FORCED && -+ need != ZFCP_ERP_ACTION_REOPEN_ADAPTER)) -+ return NULL; -+ - switch (need) { - case ZFCP_ERP_ACTION_REOPEN_LUN: - zfcp_sdev = sdev_to_zfcp(sdev); -diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c -index d94496ee6883..296bbc3c4606 100644 ---- a/drivers/s390/scsi/zfcp_fsf.c -+++ b/drivers/s390/scsi/zfcp_fsf.c -@@ -11,6 +11,7 @@ - #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt - - #include -+#include - #include - #include - #include "zfcp_ext.h" -@@ -741,6 +742,7 @@ static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio, - - static int zfcp_fsf_req_send(struct zfcp_fsf_req *req) - { -+ const bool is_srb = zfcp_fsf_req_is_status_read_buffer(req); - struct zfcp_adapter *adapter = req->adapter; - struct zfcp_qdio *qdio = adapter->qdio; - int req_id = req->req_id; -@@ -757,8 +759,20 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req) - return -EIO; - } - -+ /* -+ * NOTE: DO NOT TOUCH ASYNC req PAST THIS POINT. -+ * ONLY TOUCH SYNC req AGAIN ON req->completion. -+ * -+ * The request might complete and be freed concurrently at any point -+ * now. This is not protected by the QDIO-lock (req_q_lock). So any -+ * uncontrolled access after this might result in an use-after-free bug. -+ * Only if the request doesn't have ZFCP_STATUS_FSFREQ_CLEANUP set, and -+ * when it is completed via req->completion, is it safe to use req -+ * again. -+ */ -+ - /* Don't increase for unsolicited status */ -- if (!zfcp_fsf_req_is_status_read_buffer(req)) -+ if (!is_srb) - adapter->fsf_req_seq_no++; - adapter->req_no++; - -@@ -805,6 +819,7 @@ int zfcp_fsf_status_read(struct zfcp_qdio *qdio) - retval = zfcp_fsf_req_send(req); - if (retval) - goto failed_req_send; -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - - goto out; - -@@ -914,8 +929,10 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_cmnd(struct scsi_cmnd *scmnd) - req->qtcb->bottom.support.req_handle = (u64) old_req_id; - - zfcp_fsf_start_timer(req, ZFCP_FSF_SCSI_ER_TIMEOUT); -- if (!zfcp_fsf_req_send(req)) -+ if (!zfcp_fsf_req_send(req)) { -+ /* NOTE: DO NOT TOUCH req, UNTIL IT COMPLETES! */ - goto out; -+ } - - out_error_free: - zfcp_fsf_req_free(req); -@@ -1098,6 +1115,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, - ret = zfcp_fsf_req_send(req); - if (ret) - goto failed_send; -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - - goto out; - -@@ -1198,6 +1216,7 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, - ret = zfcp_fsf_req_send(req); - if (ret) - goto failed_send; -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - - goto out; - -@@ -1243,6 +1262,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) - zfcp_fsf_req_free(req); - erp_action->fsf_req_id = 0; - } -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - out: - spin_unlock_irq(&qdio->req_q_lock); - return retval; -@@ -1279,8 +1299,10 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio, - zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); - retval = zfcp_fsf_req_send(req); - spin_unlock_irq(&qdio->req_q_lock); -- if (!retval) -+ if (!retval) { -+ /* NOTE: ONLY TOUCH SYNC req AGAIN ON req->completion. */ - wait_for_completion(&req->completion); -+ } - - zfcp_fsf_req_free(req); - return retval; -@@ -1330,6 +1352,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action) - zfcp_fsf_req_free(req); - erp_action->fsf_req_id = 0; - } -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - out: - spin_unlock_irq(&qdio->req_q_lock); - return retval; -@@ -1372,8 +1395,10 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio, - retval = zfcp_fsf_req_send(req); - spin_unlock_irq(&qdio->req_q_lock); - -- if (!retval) -+ if (!retval) { -+ /* NOTE: ONLY TOUCH SYNC req AGAIN ON req->completion. */ - wait_for_completion(&req->completion); -+ } - - zfcp_fsf_req_free(req); - -@@ -1493,6 +1518,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) - erp_action->fsf_req_id = 0; - put_device(&port->dev); - } -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - out: - spin_unlock_irq(&qdio->req_q_lock); - return retval; -@@ -1557,6 +1583,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action) - zfcp_fsf_req_free(req); - erp_action->fsf_req_id = 0; - } -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - out: - spin_unlock_irq(&qdio->req_q_lock); - return retval; -@@ -1600,6 +1627,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) - { - struct zfcp_qdio *qdio = wka_port->adapter->qdio; - struct zfcp_fsf_req *req; -+ unsigned long req_id = 0; - int retval = -EIO; - - spin_lock_irq(&qdio->req_q_lock); -@@ -1622,14 +1650,17 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) - hton24(req->qtcb->bottom.support.d_id, wka_port->d_id); - req->data = wka_port; - -+ req_id = req->req_id; -+ - zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); - retval = zfcp_fsf_req_send(req); - if (retval) - zfcp_fsf_req_free(req); -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - out: - spin_unlock_irq(&qdio->req_q_lock); - if (!retval) -- zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id); -+ zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req_id); - return retval; - } - -@@ -1655,6 +1686,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) - { - struct zfcp_qdio *qdio = wka_port->adapter->qdio; - struct zfcp_fsf_req *req; -+ unsigned long req_id = 0; - int retval = -EIO; - - spin_lock_irq(&qdio->req_q_lock); -@@ -1677,14 +1709,17 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) - req->data = wka_port; - req->qtcb->header.port_handle = wka_port->handle; - -+ req_id = req->req_id; -+ - zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); - retval = zfcp_fsf_req_send(req); - if (retval) - zfcp_fsf_req_free(req); -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - out: - spin_unlock_irq(&qdio->req_q_lock); - if (!retval) -- zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req->req_id); -+ zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req_id); - return retval; - } - -@@ -1776,6 +1811,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action) - zfcp_fsf_req_free(req); - erp_action->fsf_req_id = 0; - } -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - out: - spin_unlock_irq(&qdio->req_q_lock); - return retval; -@@ -1899,6 +1935,7 @@ int zfcp_fsf_open_lun(struct zfcp_erp_action *erp_action) - zfcp_fsf_req_free(req); - erp_action->fsf_req_id = 0; - } -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - out: - spin_unlock_irq(&qdio->req_q_lock); - return retval; -@@ -1987,6 +2024,7 @@ int zfcp_fsf_close_lun(struct zfcp_erp_action *erp_action) - zfcp_fsf_req_free(req); - erp_action->fsf_req_id = 0; - } -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - out: - spin_unlock_irq(&qdio->req_q_lock); - return retval; -@@ -2299,6 +2337,7 @@ int zfcp_fsf_fcp_cmnd(struct scsi_cmnd *scsi_cmnd) - retval = zfcp_fsf_req_send(req); - if (unlikely(retval)) - goto failed_scsi_cmnd; -+ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ - - goto out; - -@@ -2373,8 +2412,10 @@ struct zfcp_fsf_req *zfcp_fsf_fcp_task_mgmt(struct scsi_device *sdev, - zfcp_fc_fcp_tm(fcp_cmnd, sdev, tm_flags); - - zfcp_fsf_start_timer(req, ZFCP_FSF_SCSI_ER_TIMEOUT); -- if (!zfcp_fsf_req_send(req)) -+ if (!zfcp_fsf_req_send(req)) { -+ /* NOTE: DO NOT TOUCH req, UNTIL IT COMPLETES! */ - goto out; -+ } - - zfcp_fsf_req_free(req); - req = NULL; -diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig -index 61da513fc0ed..dcb9c643e5e8 100644 ---- a/drivers/scsi/Kconfig -+++ b/drivers/scsi/Kconfig -@@ -1516,4 +1516,6 @@ source "drivers/scsi/pcmcia/Kconfig" - - source "drivers/scsi/device_handler/Kconfig" - -+source "drivers/scsi/vhba/Kconfig" -+ - endmenu -diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile -index 8826111fdf4a..35e70562b6e2 100644 ---- a/drivers/scsi/Makefile -+++ b/drivers/scsi/Makefile -@@ -151,6 +151,7 @@ obj-$(CONFIG_CHR_DEV_SCH) += ch.o - obj-$(CONFIG_SCSI_ENCLOSURE) += ses.o - - obj-$(CONFIG_SCSI_HISI_SAS) += hisi_sas/ -+obj-$(CONFIG_VHBA) += vhba/ - - # This goes last, so that "real" scsi devices probe earlier - obj-$(CONFIG_SCSI_DEBUG) += scsi_debug.o -diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c -index fe0535affc14..d9fa9cf2fd8b 100644 ---- a/drivers/scsi/NCR5380.c -+++ b/drivers/scsi/NCR5380.c -@@ -709,6 +709,8 @@ static void NCR5380_main(struct work_struct *work) - NCR5380_information_transfer(instance); - done = 0; - } -+ if (!hostdata->connected) -+ NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - spin_unlock_irq(&hostdata->lock); - if (!done) - cond_resched(); -@@ -1110,8 +1112,6 @@ static bool NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd) - spin_lock_irq(&hostdata->lock); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); - NCR5380_reselect(instance); -- if (!hostdata->connected) -- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - shost_printk(KERN_ERR, instance, "reselection after won arbitration?\n"); - goto out; - } -@@ -1119,7 +1119,6 @@ static bool NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd) - if (err < 0) { - spin_lock_irq(&hostdata->lock); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); -- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - - /* Can't touch cmd if it has been reclaimed by the scsi ML */ - if (!hostdata->selecting) -@@ -1157,7 +1156,6 @@ static bool NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd) - if (err < 0) { - shost_printk(KERN_ERR, instance, "select: REQ timeout\n"); - NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); -- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - goto out; - } - if (!hostdata->selecting) { -@@ -1763,10 +1761,8 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) - scmd_printk(KERN_INFO, cmd, - "switching to slow handshake\n"); - cmd->device->borken = 1; -- sink = 1; -- do_abort(instance); -- cmd->result = DID_ERROR << 16; -- /* XXX - need to source or sink data here, as appropriate */ -+ do_reset(instance); -+ bus_reset_cleanup(instance); - } - } else { - /* Transfer a small chunk so that the -@@ -1826,9 +1822,6 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) - */ - NCR5380_write(TARGET_COMMAND_REG, 0); - -- /* Enable reselect interrupts */ -- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); -- - maybe_release_dma_irq(instance); - return; - case MESSAGE_REJECT: -@@ -1860,8 +1853,6 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) - */ - NCR5380_write(TARGET_COMMAND_REG, 0); - -- /* Enable reselect interrupts */ -- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - #ifdef SUN3_SCSI_VME - dregs->csr |= CSR_DMA_ENABLE; - #endif -@@ -1964,7 +1955,6 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) - cmd->result = DID_ERROR << 16; - complete_cmd(instance, cmd); - maybe_release_dma_irq(instance); -- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); - return; - } - msgout = NOP; -diff --git a/drivers/scsi/NCR5380.h b/drivers/scsi/NCR5380.h -index efca509b92b0..5935fd6d1a05 100644 ---- a/drivers/scsi/NCR5380.h -+++ b/drivers/scsi/NCR5380.h -@@ -235,7 +235,7 @@ struct NCR5380_cmd { - #define NCR5380_PIO_CHUNK_SIZE 256 - - /* Time limit (ms) to poll registers when IRQs are disabled, e.g. during PDMA */ --#define NCR5380_REG_POLL_TIME 15 -+#define NCR5380_REG_POLL_TIME 10 - - static inline struct scsi_cmnd *NCR5380_to_scmd(struct NCR5380_cmd *ncmd_ptr) - { -diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c -index 590ec8009f52..9e444b1846ce 100644 ---- a/drivers/scsi/fcoe/fcoe_ctlr.c -+++ b/drivers/scsi/fcoe/fcoe_ctlr.c -@@ -2005,7 +2005,7 @@ EXPORT_SYMBOL_GPL(fcoe_wwn_from_mac); - */ - static inline struct fcoe_rport *fcoe_ctlr_rport(struct fc_rport_priv *rdata) - { -- return (struct fcoe_rport *)(rdata + 1); -+ return container_of(rdata, struct fcoe_rport, rdata); - } - - /** -@@ -2269,7 +2269,7 @@ static void fcoe_ctlr_vn_start(struct fcoe_ctlr *fip) - */ - static int fcoe_ctlr_vn_parse(struct fcoe_ctlr *fip, - struct sk_buff *skb, -- struct fc_rport_priv *rdata) -+ struct fcoe_rport *frport) - { - struct fip_header *fiph; - struct fip_desc *desc = NULL; -@@ -2277,16 +2277,12 @@ static int fcoe_ctlr_vn_parse(struct fcoe_ctlr *fip, - struct fip_wwn_desc *wwn = NULL; - struct fip_vn_desc *vn = NULL; - struct fip_size_desc *size = NULL; -- struct fcoe_rport *frport; - size_t rlen; - size_t dlen; - u32 desc_mask = 0; - u32 dtype; - u8 sub; - -- memset(rdata, 0, sizeof(*rdata) + sizeof(*frport)); -- frport = fcoe_ctlr_rport(rdata); -- - fiph = (struct fip_header *)skb->data; - frport->flags = ntohs(fiph->fip_flags); - -@@ -2349,15 +2345,17 @@ static int fcoe_ctlr_vn_parse(struct fcoe_ctlr *fip, - if (dlen != sizeof(struct fip_wwn_desc)) - goto len_err; - wwn = (struct fip_wwn_desc *)desc; -- rdata->ids.node_name = get_unaligned_be64(&wwn->fd_wwn); -+ frport->rdata.ids.node_name = -+ get_unaligned_be64(&wwn->fd_wwn); - break; - case FIP_DT_VN_ID: - if (dlen != sizeof(struct fip_vn_desc)) - goto len_err; - vn = (struct fip_vn_desc *)desc; - memcpy(frport->vn_mac, vn->fd_mac, ETH_ALEN); -- rdata->ids.port_id = ntoh24(vn->fd_fc_id); -- rdata->ids.port_name = get_unaligned_be64(&vn->fd_wwpn); -+ frport->rdata.ids.port_id = ntoh24(vn->fd_fc_id); -+ frport->rdata.ids.port_name = -+ get_unaligned_be64(&vn->fd_wwpn); - break; - case FIP_DT_FC4F: - if (dlen != sizeof(struct fip_fc4_feat)) -@@ -2738,10 +2736,7 @@ static int fcoe_ctlr_vn_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) - { - struct fip_header *fiph; - enum fip_vn2vn_subcode sub; -- struct { -- struct fc_rport_priv rdata; -- struct fcoe_rport frport; -- } buf; -+ struct fcoe_rport frport = { }; - int rc, vlan_id = 0; - - fiph = (struct fip_header *)skb->data; -@@ -2757,7 +2752,7 @@ static int fcoe_ctlr_vn_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) - goto drop; - } - -- rc = fcoe_ctlr_vn_parse(fip, skb, &buf.rdata); -+ rc = fcoe_ctlr_vn_parse(fip, skb, &frport); - if (rc) { - LIBFCOE_FIP_DBG(fip, "vn_recv vn_parse error %d\n", rc); - goto drop; -@@ -2766,19 +2761,19 @@ static int fcoe_ctlr_vn_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) - mutex_lock(&fip->ctlr_mutex); - switch (sub) { - case FIP_SC_VN_PROBE_REQ: -- fcoe_ctlr_vn_probe_req(fip, &buf.rdata); -+ fcoe_ctlr_vn_probe_req(fip, &frport.rdata); - break; - case FIP_SC_VN_PROBE_REP: -- fcoe_ctlr_vn_probe_reply(fip, &buf.rdata); -+ fcoe_ctlr_vn_probe_reply(fip, &frport.rdata); - break; - case FIP_SC_VN_CLAIM_NOTIFY: -- fcoe_ctlr_vn_claim_notify(fip, &buf.rdata); -+ fcoe_ctlr_vn_claim_notify(fip, &frport.rdata); - break; - case FIP_SC_VN_CLAIM_REP: -- fcoe_ctlr_vn_claim_resp(fip, &buf.rdata); -+ fcoe_ctlr_vn_claim_resp(fip, &frport.rdata); - break; - case FIP_SC_VN_BEACON: -- fcoe_ctlr_vn_beacon(fip, &buf.rdata); -+ fcoe_ctlr_vn_beacon(fip, &frport.rdata); - break; - default: - LIBFCOE_FIP_DBG(fip, "vn_recv unknown subcode %d\n", sub); -@@ -2802,22 +2797,18 @@ static int fcoe_ctlr_vn_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) - */ - static int fcoe_ctlr_vlan_parse(struct fcoe_ctlr *fip, - struct sk_buff *skb, -- struct fc_rport_priv *rdata) -+ struct fcoe_rport *frport) - { - struct fip_header *fiph; - struct fip_desc *desc = NULL; - struct fip_mac_desc *macd = NULL; - struct fip_wwn_desc *wwn = NULL; -- struct fcoe_rport *frport; - size_t rlen; - size_t dlen; - u32 desc_mask = 0; - u32 dtype; - u8 sub; - -- memset(rdata, 0, sizeof(*rdata) + sizeof(*frport)); -- frport = fcoe_ctlr_rport(rdata); -- - fiph = (struct fip_header *)skb->data; - frport->flags = ntohs(fiph->fip_flags); - -@@ -2871,7 +2862,8 @@ static int fcoe_ctlr_vlan_parse(struct fcoe_ctlr *fip, - if (dlen != sizeof(struct fip_wwn_desc)) - goto len_err; - wwn = (struct fip_wwn_desc *)desc; -- rdata->ids.node_name = get_unaligned_be64(&wwn->fd_wwn); -+ frport->rdata.ids.node_name = -+ get_unaligned_be64(&wwn->fd_wwn); - break; - default: - LIBFCOE_FIP_DBG(fip, "unexpected descriptor type %x " -@@ -2982,22 +2974,19 @@ static int fcoe_ctlr_vlan_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) - { - struct fip_header *fiph; - enum fip_vlan_subcode sub; -- struct { -- struct fc_rport_priv rdata; -- struct fcoe_rport frport; -- } buf; -+ struct fcoe_rport frport = { }; - int rc; - - fiph = (struct fip_header *)skb->data; - sub = fiph->fip_subcode; -- rc = fcoe_ctlr_vlan_parse(fip, skb, &buf.rdata); -+ rc = fcoe_ctlr_vlan_parse(fip, skb, &frport); - if (rc) { - LIBFCOE_FIP_DBG(fip, "vlan_recv vlan_parse error %d\n", rc); - goto drop; - } - mutex_lock(&fip->ctlr_mutex); - if (sub == FIP_SC_VL_REQ) -- fcoe_ctlr_vlan_disc_reply(fip, &buf.rdata); -+ fcoe_ctlr_vlan_disc_reply(fip, &frport.rdata); - mutex_unlock(&fip->ctlr_mutex); - - drop: -diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c -index 80608b53897b..84051b538fa8 100644 ---- a/drivers/scsi/fnic/fnic_scsi.c -+++ b/drivers/scsi/fnic/fnic_scsi.c -@@ -216,7 +216,7 @@ int fnic_fw_reset_handler(struct fnic *fnic) - - /* wait for io cmpl */ - while (atomic_read(&fnic->in_flight)) -- schedule_timeout(msecs_to_jiffies(1)); -+ schedule_msec_hrtimeout((1)); - - spin_lock_irqsave(&fnic->wq_copy_lock[0], flags); - -@@ -2273,7 +2273,7 @@ static int fnic_clean_pending_aborts(struct fnic *fnic, - } - } - -- schedule_timeout(msecs_to_jiffies(2 * fnic->config.ed_tov)); -+ schedule_msec_hrtimeout((2 * fnic->config.ed_tov)); - - /* walk again to check, if IOs are still pending in fw */ - if (fnic_is_abts_pending(fnic, lr_sc)) -diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c -index e0f3852fdad1..da6e97d8dc3b 100644 ---- a/drivers/scsi/libfc/fc_rport.c -+++ b/drivers/scsi/libfc/fc_rport.c -@@ -128,6 +128,7 @@ EXPORT_SYMBOL(fc_rport_lookup); - struct fc_rport_priv *fc_rport_create(struct fc_lport *lport, u32 port_id) - { - struct fc_rport_priv *rdata; -+ size_t rport_priv_size = sizeof(*rdata); - - lockdep_assert_held(&lport->disc.disc_mutex); - -@@ -135,7 +136,9 @@ struct fc_rport_priv *fc_rport_create(struct fc_lport *lport, u32 port_id) - if (rdata) - return rdata; - -- rdata = kzalloc(sizeof(*rdata) + lport->rport_priv_size, GFP_KERNEL); -+ if (lport->rport_priv_size > 0) -+ rport_priv_size = lport->rport_priv_size; -+ rdata = kzalloc(rport_priv_size, GFP_KERNEL); - if (!rdata) - return NULL; - -diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c -index ba996fbde89b..ba4879b50382 100644 ---- a/drivers/scsi/lpfc/lpfc_scsi.c -+++ b/drivers/scsi/lpfc/lpfc_scsi.c -@@ -5007,7 +5007,7 @@ lpfc_reset_flush_io_context(struct lpfc_vport *vport, uint16_t tgt_id, - tgt_id, lun_id, context); - later = msecs_to_jiffies(2 * vport->cfg_devloss_tmo * 1000) + jiffies; - while (time_after(later, jiffies) && cnt) { -- schedule_timeout_uninterruptible(msecs_to_jiffies(20)); -+ schedule_msec_hrtimeout_uninterruptible((20)); - cnt = lpfc_sli_sum_iocb(vport, tgt_id, lun_id, context); - } - if (cnt) { -diff --git a/drivers/scsi/mac_scsi.c b/drivers/scsi/mac_scsi.c -index dba9517d9553..c5169d31c966 100644 ---- a/drivers/scsi/mac_scsi.c -+++ b/drivers/scsi/mac_scsi.c -@@ -4,6 +4,8 @@ - * - * Copyright 1998, Michael Schmitz - * -+ * Copyright 2019 Finn Thain -+ * - * derived in part from: - */ - /* -@@ -12,6 +14,7 @@ - * Copyright 1995, Russell King - */ - -+#include - #include - #include - #include -@@ -53,7 +56,7 @@ static int setup_cmd_per_lun = -1; - module_param(setup_cmd_per_lun, int, 0); - static int setup_sg_tablesize = -1; - module_param(setup_sg_tablesize, int, 0); --static int setup_use_pdma = -1; -+static int setup_use_pdma = 512; - module_param(setup_use_pdma, int, 0); - static int setup_hostid = -1; - module_param(setup_hostid, int, 0); -@@ -90,101 +93,217 @@ static int __init mac_scsi_setup(char *str) - __setup("mac5380=", mac_scsi_setup); - #endif /* !MODULE */ - --/* Pseudo DMA asm originally by Ove Edlund */ -- --#define CP_IO_TO_MEM(s,d,n) \ --__asm__ __volatile__ \ -- (" cmp.w #4,%2\n" \ -- " bls 8f\n" \ -- " move.w %1,%%d0\n" \ -- " neg.b %%d0\n" \ -- " and.w #3,%%d0\n" \ -- " sub.w %%d0,%2\n" \ -- " bra 2f\n" \ -- " 1: move.b (%0),(%1)+\n" \ -- " 2: dbf %%d0,1b\n" \ -- " move.w %2,%%d0\n" \ -- " lsr.w #5,%%d0\n" \ -- " bra 4f\n" \ -- " 3: move.l (%0),(%1)+\n" \ -- "31: move.l (%0),(%1)+\n" \ -- "32: move.l (%0),(%1)+\n" \ -- "33: move.l (%0),(%1)+\n" \ -- "34: move.l (%0),(%1)+\n" \ -- "35: move.l (%0),(%1)+\n" \ -- "36: move.l (%0),(%1)+\n" \ -- "37: move.l (%0),(%1)+\n" \ -- " 4: dbf %%d0,3b\n" \ -- " move.w %2,%%d0\n" \ -- " lsr.w #2,%%d0\n" \ -- " and.w #7,%%d0\n" \ -- " bra 6f\n" \ -- " 5: move.l (%0),(%1)+\n" \ -- " 6: dbf %%d0,5b\n" \ -- " and.w #3,%2\n" \ -- " bra 8f\n" \ -- " 7: move.b (%0),(%1)+\n" \ -- " 8: dbf %2,7b\n" \ -- " moveq.l #0, %2\n" \ -- " 9: \n" \ -- ".section .fixup,\"ax\"\n" \ -- " .even\n" \ -- "91: moveq.l #1, %2\n" \ -- " jra 9b\n" \ -- "94: moveq.l #4, %2\n" \ -- " jra 9b\n" \ -- ".previous\n" \ -- ".section __ex_table,\"a\"\n" \ -- " .align 4\n" \ -- " .long 1b,91b\n" \ -- " .long 3b,94b\n" \ -- " .long 31b,94b\n" \ -- " .long 32b,94b\n" \ -- " .long 33b,94b\n" \ -- " .long 34b,94b\n" \ -- " .long 35b,94b\n" \ -- " .long 36b,94b\n" \ -- " .long 37b,94b\n" \ -- " .long 5b,94b\n" \ -- " .long 7b,91b\n" \ -- ".previous" \ -- : "=a"(s), "=a"(d), "=d"(n) \ -- : "0"(s), "1"(d), "2"(n) \ -- : "d0") -+/* -+ * According to "Inside Macintosh: Devices", Mac OS requires disk drivers to -+ * specify the number of bytes between the delays expected from a SCSI target. -+ * This allows the operating system to "prevent bus errors when a target fails -+ * to deliver the next byte within the processor bus error timeout period." -+ * Linux SCSI drivers lack knowledge of the timing behaviour of SCSI targets -+ * so bus errors are unavoidable. -+ * -+ * If a MOVE.B instruction faults, we assume that zero bytes were transferred -+ * and simply retry. That assumption probably depends on target behaviour but -+ * seems to hold up okay. The NOP provides synchronization: without it the -+ * fault can sometimes occur after the program counter has moved past the -+ * offending instruction. Post-increment addressing can't be used. -+ */ -+ -+#define MOVE_BYTE(operands) \ -+ asm volatile ( \ -+ "1: moveb " operands " \n" \ -+ "11: nop \n" \ -+ " addq #1,%0 \n" \ -+ " subq #1,%1 \n" \ -+ "40: \n" \ -+ " \n" \ -+ ".section .fixup,\"ax\" \n" \ -+ ".even \n" \ -+ "90: movel #1, %2 \n" \ -+ " jra 40b \n" \ -+ ".previous \n" \ -+ " \n" \ -+ ".section __ex_table,\"a\" \n" \ -+ ".align 4 \n" \ -+ ".long 1b,90b \n" \ -+ ".long 11b,90b \n" \ -+ ".previous \n" \ -+ : "+a" (addr), "+r" (n), "+r" (result) : "a" (io)) -+ -+/* -+ * If a MOVE.W (or MOVE.L) instruction faults, it cannot be retried because -+ * the residual byte count would be uncertain. In that situation the MOVE_WORD -+ * macro clears n in the fixup section to abort the transfer. -+ */ -+ -+#define MOVE_WORD(operands) \ -+ asm volatile ( \ -+ "1: movew " operands " \n" \ -+ "11: nop \n" \ -+ " subq #2,%1 \n" \ -+ "40: \n" \ -+ " \n" \ -+ ".section .fixup,\"ax\" \n" \ -+ ".even \n" \ -+ "90: movel #0, %1 \n" \ -+ " movel #2, %2 \n" \ -+ " jra 40b \n" \ -+ ".previous \n" \ -+ " \n" \ -+ ".section __ex_table,\"a\" \n" \ -+ ".align 4 \n" \ -+ ".long 1b,90b \n" \ -+ ".long 11b,90b \n" \ -+ ".previous \n" \ -+ : "+a" (addr), "+r" (n), "+r" (result) : "a" (io)) -+ -+#define MOVE_16_WORDS(operands) \ -+ asm volatile ( \ -+ "1: movew " operands " \n" \ -+ "2: movew " operands " \n" \ -+ "3: movew " operands " \n" \ -+ "4: movew " operands " \n" \ -+ "5: movew " operands " \n" \ -+ "6: movew " operands " \n" \ -+ "7: movew " operands " \n" \ -+ "8: movew " operands " \n" \ -+ "9: movew " operands " \n" \ -+ "10: movew " operands " \n" \ -+ "11: movew " operands " \n" \ -+ "12: movew " operands " \n" \ -+ "13: movew " operands " \n" \ -+ "14: movew " operands " \n" \ -+ "15: movew " operands " \n" \ -+ "16: movew " operands " \n" \ -+ "17: nop \n" \ -+ " subl #32,%1 \n" \ -+ "40: \n" \ -+ " \n" \ -+ ".section .fixup,\"ax\" \n" \ -+ ".even \n" \ -+ "90: movel #0, %1 \n" \ -+ " movel #2, %2 \n" \ -+ " jra 40b \n" \ -+ ".previous \n" \ -+ " \n" \ -+ ".section __ex_table,\"a\" \n" \ -+ ".align 4 \n" \ -+ ".long 1b,90b \n" \ -+ ".long 2b,90b \n" \ -+ ".long 3b,90b \n" \ -+ ".long 4b,90b \n" \ -+ ".long 5b,90b \n" \ -+ ".long 6b,90b \n" \ -+ ".long 7b,90b \n" \ -+ ".long 8b,90b \n" \ -+ ".long 9b,90b \n" \ -+ ".long 10b,90b \n" \ -+ ".long 11b,90b \n" \ -+ ".long 12b,90b \n" \ -+ ".long 13b,90b \n" \ -+ ".long 14b,90b \n" \ -+ ".long 15b,90b \n" \ -+ ".long 16b,90b \n" \ -+ ".long 17b,90b \n" \ -+ ".previous \n" \ -+ : "+a" (addr), "+r" (n), "+r" (result) : "a" (io)) -+ -+#define MAC_PDMA_DELAY 32 -+ -+static inline int mac_pdma_recv(void __iomem *io, unsigned char *start, int n) -+{ -+ unsigned char *addr = start; -+ int result = 0; -+ -+ if (n >= 1) { -+ MOVE_BYTE("%3@,%0@"); -+ if (result) -+ goto out; -+ } -+ if (n >= 1 && ((unsigned long)addr & 1)) { -+ MOVE_BYTE("%3@,%0@"); -+ if (result) -+ goto out; -+ } -+ while (n >= 32) -+ MOVE_16_WORDS("%3@,%0@+"); -+ while (n >= 2) -+ MOVE_WORD("%3@,%0@+"); -+ if (result) -+ return start - addr; /* Negated to indicate uncertain length */ -+ if (n == 1) -+ MOVE_BYTE("%3@,%0@"); -+out: -+ return addr - start; -+} -+ -+static inline int mac_pdma_send(unsigned char *start, void __iomem *io, int n) -+{ -+ unsigned char *addr = start; -+ int result = 0; -+ -+ if (n >= 1) { -+ MOVE_BYTE("%0@,%3@"); -+ if (result) -+ goto out; -+ } -+ if (n >= 1 && ((unsigned long)addr & 1)) { -+ MOVE_BYTE("%0@,%3@"); -+ if (result) -+ goto out; -+ } -+ while (n >= 32) -+ MOVE_16_WORDS("%0@+,%3@"); -+ while (n >= 2) -+ MOVE_WORD("%0@+,%3@"); -+ if (result) -+ return start - addr; /* Negated to indicate uncertain length */ -+ if (n == 1) -+ MOVE_BYTE("%0@,%3@"); -+out: -+ return addr - start; -+} - - static inline int macscsi_pread(struct NCR5380_hostdata *hostdata, - unsigned char *dst, int len) - { - u8 __iomem *s = hostdata->pdma_io + (INPUT_DATA_REG << 4); - unsigned char *d = dst; -- int n = len; -- int transferred; -+ -+ hostdata->pdma_residual = len; - - while (!NCR5380_poll_politely(hostdata, BUS_AND_STATUS_REG, - BASR_DRQ | BASR_PHASE_MATCH, - BASR_DRQ | BASR_PHASE_MATCH, HZ / 64)) { -- CP_IO_TO_MEM(s, d, n); -+ int bytes; - -- transferred = d - dst - n; -- hostdata->pdma_residual = len - transferred; -+ bytes = mac_pdma_recv(s, d, min(hostdata->pdma_residual, 512)); - -- /* No bus error. */ -- if (n == 0) -+ if (bytes > 0) { -+ d += bytes; -+ hostdata->pdma_residual -= bytes; -+ } -+ -+ if (hostdata->pdma_residual == 0) - return 0; - -- /* Target changed phase early? */ - if (NCR5380_poll_politely2(hostdata, STATUS_REG, SR_REQ, SR_REQ, -- BUS_AND_STATUS_REG, BASR_ACK, BASR_ACK, HZ / 64) < 0) -- scmd_printk(KERN_ERR, hostdata->connected, -+ BUS_AND_STATUS_REG, BASR_ACK, -+ BASR_ACK, HZ / 64) < 0) -+ scmd_printk(KERN_DEBUG, hostdata->connected, - "%s: !REQ and !ACK\n", __func__); - if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) - return 0; - -+ if (bytes == 0) -+ udelay(MAC_PDMA_DELAY); -+ -+ if (bytes >= 0) -+ continue; -+ - dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host, -- "%s: bus error (%d/%d)\n", __func__, transferred, len); -+ "%s: bus error (%d/%d)\n", __func__, d - dst, len); - NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host); -- d = dst + transferred; -- n = len - transferred; -+ return -1; - } - - scmd_printk(KERN_ERR, hostdata->connected, -@@ -193,93 +312,27 @@ static inline int macscsi_pread(struct NCR5380_hostdata *hostdata, - return -1; - } - -- --#define CP_MEM_TO_IO(s,d,n) \ --__asm__ __volatile__ \ -- (" cmp.w #4,%2\n" \ -- " bls 8f\n" \ -- " move.w %0,%%d0\n" \ -- " neg.b %%d0\n" \ -- " and.w #3,%%d0\n" \ -- " sub.w %%d0,%2\n" \ -- " bra 2f\n" \ -- " 1: move.b (%0)+,(%1)\n" \ -- " 2: dbf %%d0,1b\n" \ -- " move.w %2,%%d0\n" \ -- " lsr.w #5,%%d0\n" \ -- " bra 4f\n" \ -- " 3: move.l (%0)+,(%1)\n" \ -- "31: move.l (%0)+,(%1)\n" \ -- "32: move.l (%0)+,(%1)\n" \ -- "33: move.l (%0)+,(%1)\n" \ -- "34: move.l (%0)+,(%1)\n" \ -- "35: move.l (%0)+,(%1)\n" \ -- "36: move.l (%0)+,(%1)\n" \ -- "37: move.l (%0)+,(%1)\n" \ -- " 4: dbf %%d0,3b\n" \ -- " move.w %2,%%d0\n" \ -- " lsr.w #2,%%d0\n" \ -- " and.w #7,%%d0\n" \ -- " bra 6f\n" \ -- " 5: move.l (%0)+,(%1)\n" \ -- " 6: dbf %%d0,5b\n" \ -- " and.w #3,%2\n" \ -- " bra 8f\n" \ -- " 7: move.b (%0)+,(%1)\n" \ -- " 8: dbf %2,7b\n" \ -- " moveq.l #0, %2\n" \ -- " 9: \n" \ -- ".section .fixup,\"ax\"\n" \ -- " .even\n" \ -- "91: moveq.l #1, %2\n" \ -- " jra 9b\n" \ -- "94: moveq.l #4, %2\n" \ -- " jra 9b\n" \ -- ".previous\n" \ -- ".section __ex_table,\"a\"\n" \ -- " .align 4\n" \ -- " .long 1b,91b\n" \ -- " .long 3b,94b\n" \ -- " .long 31b,94b\n" \ -- " .long 32b,94b\n" \ -- " .long 33b,94b\n" \ -- " .long 34b,94b\n" \ -- " .long 35b,94b\n" \ -- " .long 36b,94b\n" \ -- " .long 37b,94b\n" \ -- " .long 5b,94b\n" \ -- " .long 7b,91b\n" \ -- ".previous" \ -- : "=a"(s), "=a"(d), "=d"(n) \ -- : "0"(s), "1"(d), "2"(n) \ -- : "d0") -- - static inline int macscsi_pwrite(struct NCR5380_hostdata *hostdata, - unsigned char *src, int len) - { - unsigned char *s = src; - u8 __iomem *d = hostdata->pdma_io + (OUTPUT_DATA_REG << 4); -- int n = len; -- int transferred; -+ -+ hostdata->pdma_residual = len; - - while (!NCR5380_poll_politely(hostdata, BUS_AND_STATUS_REG, - BASR_DRQ | BASR_PHASE_MATCH, - BASR_DRQ | BASR_PHASE_MATCH, HZ / 64)) { -- CP_MEM_TO_IO(s, d, n); -+ int bytes; - -- transferred = s - src - n; -- hostdata->pdma_residual = len - transferred; -+ bytes = mac_pdma_send(s, d, min(hostdata->pdma_residual, 512)); - -- /* Target changed phase early? */ -- if (NCR5380_poll_politely2(hostdata, STATUS_REG, SR_REQ, SR_REQ, -- BUS_AND_STATUS_REG, BASR_ACK, BASR_ACK, HZ / 64) < 0) -- scmd_printk(KERN_ERR, hostdata->connected, -- "%s: !REQ and !ACK\n", __func__); -- if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) -- return 0; -+ if (bytes > 0) { -+ s += bytes; -+ hostdata->pdma_residual -= bytes; -+ } - -- /* No bus error. */ -- if (n == 0) { -+ if (hostdata->pdma_residual == 0) { - if (NCR5380_poll_politely(hostdata, TARGET_COMMAND_REG, - TCR_LAST_BYTE_SENT, - TCR_LAST_BYTE_SENT, HZ / 64) < 0) -@@ -288,17 +341,29 @@ static inline int macscsi_pwrite(struct NCR5380_hostdata *hostdata, - return 0; - } - -+ if (NCR5380_poll_politely2(hostdata, STATUS_REG, SR_REQ, SR_REQ, -+ BUS_AND_STATUS_REG, BASR_ACK, -+ BASR_ACK, HZ / 64) < 0) -+ scmd_printk(KERN_DEBUG, hostdata->connected, -+ "%s: !REQ and !ACK\n", __func__); -+ if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) -+ return 0; -+ -+ if (bytes == 0) -+ udelay(MAC_PDMA_DELAY); -+ -+ if (bytes >= 0) -+ continue; -+ - dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host, -- "%s: bus error (%d/%d)\n", __func__, transferred, len); -+ "%s: bus error (%d/%d)\n", __func__, s - src, len); - NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host); -- s = src + transferred; -- n = len - transferred; -+ return -1; - } - - scmd_printk(KERN_ERR, hostdata->connected, - "%s: phase mismatch or !DRQ\n", __func__); - NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host); -- - return -1; - } - -@@ -306,7 +371,7 @@ static int macscsi_dma_xfer_len(struct NCR5380_hostdata *hostdata, - struct scsi_cmnd *cmd) - { - if (hostdata->flags & FLAG_NO_PSEUDO_DMA || -- cmd->SCp.this_residual < 16) -+ cmd->SCp.this_residual < setup_use_pdma) - return 0; - - return cmd->SCp.this_residual; -diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c -index 3dd1df472dc6..7237114a1d53 100644 ---- a/drivers/scsi/megaraid/megaraid_sas_base.c -+++ b/drivers/scsi/megaraid/megaraid_sas_base.c -@@ -6155,7 +6155,8 @@ megasas_get_target_prop(struct megasas_instance *instance, - int ret; - struct megasas_cmd *cmd; - struct megasas_dcmd_frame *dcmd; -- u16 targetId = (sdev->channel % 2) + sdev->id; -+ u16 targetId = ((sdev->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + -+ sdev->id; - - cmd = megasas_get_cmd(instance); - -diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c -index 8aacbd1e7db2..f2d61d023bcb 100644 ---- a/drivers/scsi/mpt3sas/mpt3sas_base.c -+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c -@@ -2683,6 +2683,8 @@ _base_config_dma_addressing(struct MPT3SAS_ADAPTER *ioc, struct pci_dev *pdev) - { - u64 required_mask, coherent_mask; - struct sysinfo s; -+ /* Set 63 bit DMA mask for all SAS3 and SAS35 controllers */ -+ int dma_mask = (ioc->hba_mpi_version_belonged > MPI2_VERSION) ? 63 : 64; - - if (ioc->is_mcpu_endpoint) - goto try_32bit; -@@ -2692,17 +2694,17 @@ _base_config_dma_addressing(struct MPT3SAS_ADAPTER *ioc, struct pci_dev *pdev) - goto try_32bit; - - if (ioc->dma_mask) -- coherent_mask = DMA_BIT_MASK(64); -+ coherent_mask = DMA_BIT_MASK(dma_mask); - else - coherent_mask = DMA_BIT_MASK(32); - -- if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) || -+ if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(dma_mask)) || - dma_set_coherent_mask(&pdev->dev, coherent_mask)) - goto try_32bit; - - ioc->base_add_sg_single = &_base_add_sg_single_64; - ioc->sge_size = sizeof(Mpi2SGESimple64_t); -- ioc->dma_mask = 64; -+ ioc->dma_mask = dma_mask; - goto out; - - try_32bit: -@@ -2724,7 +2726,7 @@ static int - _base_change_consistent_dma_mask(struct MPT3SAS_ADAPTER *ioc, - struct pci_dev *pdev) - { -- if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) { -+ if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(ioc->dma_mask))) { - if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) - return -ENODEV; - } -@@ -4631,7 +4633,7 @@ _base_allocate_memory_pools(struct MPT3SAS_ADAPTER *ioc) - total_sz += sz; - } while (ioc->rdpq_array_enable && (++i < ioc->reply_queue_count)); - -- if (ioc->dma_mask == 64) { -+ if (ioc->dma_mask > 32) { - if (_base_change_consistent_dma_mask(ioc, ioc->pdev) != 0) { - ioc_warn(ioc, "no suitable consistent DMA mask for %s\n", - pci_name(ioc->pdev)); -diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c -index 65d0a10c76ad..40f392569664 100644 ---- a/drivers/scsi/scsi_lib.c -+++ b/drivers/scsi/scsi_lib.c -@@ -72,11 +72,11 @@ int scsi_init_sense_cache(struct Scsi_Host *shost) - struct kmem_cache *cache; - int ret = 0; - -+ mutex_lock(&scsi_sense_cache_mutex); - cache = scsi_select_sense_cache(shost->unchecked_isa_dma); - if (cache) -- return 0; -+ goto exit; - -- mutex_lock(&scsi_sense_cache_mutex); - if (shost->unchecked_isa_dma) { - scsi_sense_isadma_cache = - kmem_cache_create("scsi_sense_cache(DMA)", -@@ -92,7 +92,7 @@ int scsi_init_sense_cache(struct Scsi_Host *shost) - if (!scsi_sense_cache) - ret = -ENOMEM; - } -- -+ exit: - mutex_unlock(&scsi_sense_cache_mutex); - return ret; - } -diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c -index 7334024b64f1..e73bf0193a8f 100644 ---- a/drivers/scsi/sd_zbc.c -+++ b/drivers/scsi/sd_zbc.c -@@ -9,6 +9,8 @@ - */ - - #include -+#include -+#include - - #include - -@@ -50,7 +52,7 @@ static void sd_zbc_parse_report(struct scsi_disk *sdkp, u8 *buf, - /** - * sd_zbc_do_report_zones - Issue a REPORT ZONES scsi command. - * @sdkp: The target disk -- * @buf: Buffer to use for the reply -+ * @buf: vmalloc-ed buffer to use for the reply - * @buflen: the buffer size - * @lba: Start LBA of the report - * @partial: Do partial report -@@ -79,7 +81,6 @@ static int sd_zbc_do_report_zones(struct scsi_disk *sdkp, unsigned char *buf, - put_unaligned_be32(buflen, &cmd[10]); - if (partial) - cmd[14] = ZBC_REPORT_ZONE_PARTIAL; -- memset(buf, 0, buflen); - - result = scsi_execute_req(sdp, cmd, DMA_FROM_DEVICE, - buf, buflen, &sshdr, -@@ -103,6 +104,53 @@ static int sd_zbc_do_report_zones(struct scsi_disk *sdkp, unsigned char *buf, - return 0; - } - -+/* -+ * Maximum number of zones to get with one report zones command. -+ */ -+#define SD_ZBC_REPORT_MAX_ZONES 8192U -+ -+/** -+ * Allocate a buffer for report zones reply. -+ * @sdkp: The target disk -+ * @nr_zones: Maximum number of zones to report -+ * @buflen: Size of the buffer allocated -+ * -+ * Try to allocate a reply buffer for the number of requested zones. -+ * The size of the buffer allocated may be smaller than requested to -+ * satify the device constraint (max_hw_sectors, max_segments, etc). -+ * -+ * Return the address of the allocated buffer and update @buflen with -+ * the size of the allocated buffer. -+ */ -+static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp, -+ unsigned int nr_zones, size_t *buflen) -+{ -+ struct request_queue *q = sdkp->disk->queue; -+ size_t bufsize; -+ void *buf; -+ -+ /* -+ * Report zone buffer size should be at most 64B times the number of -+ * zones requested plus the 64B reply header, but should be at least -+ * SECTOR_SIZE for ATA devices. -+ * Make sure that this size does not exceed the hardware capabilities. -+ * Furthermore, since the report zone command cannot be split, make -+ * sure that the allocated buffer can always be mapped by limiting the -+ * number of pages allocated to the HBA max segments limit. -+ */ -+ nr_zones = min(nr_zones, SD_ZBC_REPORT_MAX_ZONES); -+ bufsize = roundup((nr_zones + 1) * 64, 512); -+ bufsize = min_t(size_t, bufsize, -+ queue_max_hw_sectors(q) << SECTOR_SHIFT); -+ bufsize = min_t(size_t, bufsize, queue_max_segments(q) << PAGE_SHIFT); -+ -+ buf = vzalloc(bufsize); -+ if (buf) -+ *buflen = bufsize; -+ -+ return buf; -+} -+ - /** - * sd_zbc_report_zones - Disk report zones operation. - * @disk: The target disk -@@ -118,30 +166,23 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector, - gfp_t gfp_mask) - { - struct scsi_disk *sdkp = scsi_disk(disk); -- unsigned int i, buflen, nrz = *nr_zones; -+ unsigned int i, nrz = *nr_zones; - unsigned char *buf; -- size_t offset = 0; -+ size_t buflen = 0, offset = 0; - int ret = 0; - - if (!sd_is_zoned(sdkp)) - /* Not a zoned device */ - return -EOPNOTSUPP; - -- /* -- * Get a reply buffer for the number of requested zones plus a header, -- * without exceeding the device maximum command size. For ATA disks, -- * buffers must be aligned to 512B. -- */ -- buflen = min(queue_max_hw_sectors(disk->queue) << 9, -- roundup((nrz + 1) * 64, 512)); -- buf = kmalloc(buflen, gfp_mask); -+ buf = sd_zbc_alloc_report_buffer(sdkp, nrz, &buflen); - if (!buf) - return -ENOMEM; - - ret = sd_zbc_do_report_zones(sdkp, buf, buflen, - sectors_to_logical(sdkp->device, sector), true); - if (ret) -- goto out_free_buf; -+ goto out; - - nrz = min(nrz, get_unaligned_be32(&buf[0]) / 64); - for (i = 0; i < nrz; i++) { -@@ -152,8 +193,8 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector, - - *nr_zones = nrz; - --out_free_buf: -- kfree(buf); -+out: -+ kvfree(buf); - - return ret; - } -@@ -287,8 +328,6 @@ static int sd_zbc_check_zoned_characteristics(struct scsi_disk *sdkp, - return 0; - } - --#define SD_ZBC_BUF_SIZE 131072U -- - /** - * sd_zbc_check_zones - Check the device capacity and zone sizes - * @sdkp: Target disk -@@ -304,22 +343,28 @@ static int sd_zbc_check_zoned_characteristics(struct scsi_disk *sdkp, - */ - static int sd_zbc_check_zones(struct scsi_disk *sdkp, u32 *zblocks) - { -+ size_t bufsize, buflen; -+ unsigned int noio_flag; - u64 zone_blocks = 0; - sector_t max_lba, block = 0; - unsigned char *buf; - unsigned char *rec; -- unsigned int buf_len; -- unsigned int list_length; - int ret; - u8 same; - -+ /* Do all memory allocations as if GFP_NOIO was specified */ -+ noio_flag = memalloc_noio_save(); -+ - /* Get a buffer */ -- buf = kmalloc(SD_ZBC_BUF_SIZE, GFP_KERNEL); -- if (!buf) -- return -ENOMEM; -+ buf = sd_zbc_alloc_report_buffer(sdkp, SD_ZBC_REPORT_MAX_ZONES, -+ &bufsize); -+ if (!buf) { -+ ret = -ENOMEM; -+ goto out; -+ } - - /* Do a report zone to get max_lba and the same field */ -- ret = sd_zbc_do_report_zones(sdkp, buf, SD_ZBC_BUF_SIZE, 0, false); -+ ret = sd_zbc_do_report_zones(sdkp, buf, bufsize, 0, false); - if (ret) - goto out_free; - -@@ -355,12 +400,12 @@ static int sd_zbc_check_zones(struct scsi_disk *sdkp, u32 *zblocks) - do { - - /* Parse REPORT ZONES header */ -- list_length = get_unaligned_be32(&buf[0]) + 64; -+ buflen = min_t(size_t, get_unaligned_be32(&buf[0]) + 64, -+ bufsize); - rec = buf + 64; -- buf_len = min(list_length, SD_ZBC_BUF_SIZE); - - /* Parse zone descriptors */ -- while (rec < buf + buf_len) { -+ while (rec < buf + buflen) { - u64 this_zone_blocks = get_unaligned_be64(&rec[8]); - - if (zone_blocks == 0) { -@@ -376,8 +421,8 @@ static int sd_zbc_check_zones(struct scsi_disk *sdkp, u32 *zblocks) - } - - if (block < sdkp->capacity) { -- ret = sd_zbc_do_report_zones(sdkp, buf, SD_ZBC_BUF_SIZE, -- block, true); -+ ret = sd_zbc_do_report_zones(sdkp, buf, bufsize, block, -+ true); - if (ret) - goto out_free; - } -@@ -408,7 +453,8 @@ static int sd_zbc_check_zones(struct scsi_disk *sdkp, u32 *zblocks) - } - - out_free: -- kfree(buf); -+ memalloc_noio_restore(noio_flag); -+ kvfree(buf); - - return ret; - } -@@ -417,7 +463,7 @@ int sd_zbc_read_zones(struct scsi_disk *sdkp, unsigned char *buf) - { - struct gendisk *disk = sdkp->disk; - unsigned int nr_zones; -- u32 zone_blocks; -+ u32 zone_blocks = 0; - int ret; - - if (!sd_is_zoned(sdkp)) -diff --git a/drivers/scsi/snic/snic_scsi.c b/drivers/scsi/snic/snic_scsi.c -index b3650c989ed4..7ed1fb285754 100644 ---- a/drivers/scsi/snic/snic_scsi.c -+++ b/drivers/scsi/snic/snic_scsi.c -@@ -2353,7 +2353,7 @@ snic_reset(struct Scsi_Host *shost, struct scsi_cmnd *sc) - - /* Wait for all the IOs that are entered in Qcmd */ - while (atomic_read(&snic->ios_inflight)) -- schedule_timeout(msecs_to_jiffies(1)); -+ schedule_msec_hrtimeout((1)); - - ret = snic_issue_hba_reset(snic, sc); - if (ret) { -diff --git a/drivers/scsi/vhba/Kconfig b/drivers/scsi/vhba/Kconfig -new file mode 100644 -index 000000000000..7ccb7d8dc25c ---- /dev/null -+++ b/drivers/scsi/vhba/Kconfig -@@ -0,0 +1,9 @@ -+config VHBA -+ tristate "Virtual (SCSI) Host Bus Adapter" -+ depends on SCSI -+ ---help--- -+ This is the in-kernel part of CDEmu, a CD/DVD-ROM device -+ emulator. -+ -+ This driver can also be built as a module. If so, the module -+ will be called vhba. -diff --git a/drivers/scsi/vhba/Makefile b/drivers/scsi/vhba/Makefile -new file mode 100644 -index 000000000000..736824872fe5 ---- /dev/null -+++ b/drivers/scsi/vhba/Makefile -@@ -0,0 +1,4 @@ -+VHBA_VERSION := 20190410 -+ -+obj-$(CONFIG_VHBA) += vhba.o -+ccflags-y := -DVHBA_VERSION=\"$(VHBA_VERSION)\" -Werror -diff --git a/drivers/scsi/vhba/vhba.c b/drivers/scsi/vhba/vhba.c -new file mode 100644 -index 000000000000..0ad712138c87 ---- /dev/null -+++ b/drivers/scsi/vhba/vhba.c -@@ -0,0 +1,1083 @@ -+/* -+ * vhba.c -+ * -+ * Copyright (C) 2007-2012 Chia-I Wu -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License along -+ * with this program; if not, write to the Free Software Foundation, Inc., -+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -+ */ -+ -+#include -+ -+#include -+#include -+#include -+#include -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) -+#include -+#else -+#include -+#endif -+#include -+#include -+#include -+#include -+#ifdef CONFIG_COMPAT -+#include -+#endif -+#include -+#include -+#include -+#include -+#include -+ -+/* scatterlist.page_link and sg_page() were introduced in 2.6.24 */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) -+#define USE_SG_PAGE -+#include -+#endif -+ -+MODULE_AUTHOR("Chia-I Wu"); -+MODULE_VERSION(VHBA_VERSION); -+MODULE_DESCRIPTION("Virtual SCSI HBA"); -+MODULE_LICENSE("GPL"); -+ -+#ifdef DEBUG -+#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__, ## args) -+#else -+#define DPRINTK(fmt, args...) -+#endif -+ -+/* scmd_dbg was introduced in 3.15 */ -+#ifndef scmd_dbg -+#define scmd_dbg(scmd, fmt, a...) \ -+ dev_dbg(&(scmd)->device->sdev_gendev, fmt, ##a) -+#endif -+ -+#ifndef scmd_warn -+#define scmd_warn(scmd, fmt, a...) \ -+ dev_warn(&(scmd)->device->sdev_gendev, fmt, ##a) -+#endif -+ -+#define VHBA_MAX_SECTORS_PER_IO 256 -+#define VHBA_MAX_ID 32 -+#define VHBA_CAN_QUEUE 32 -+#define VHBA_INVALID_ID VHBA_MAX_ID -+#define VHBA_KBUF_SIZE PAGE_SIZE -+ -+#define DATA_TO_DEVICE(dir) ((dir) == DMA_TO_DEVICE || (dir) == DMA_BIDIRECTIONAL) -+#define DATA_FROM_DEVICE(dir) ((dir) == DMA_FROM_DEVICE || (dir) == DMA_BIDIRECTIONAL) -+ -+ -+/* SCSI macros were introduced in 2.6.23 */ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 23) -+#define scsi_sg_count(cmd) ((cmd)->use_sg) -+#define scsi_sglist(cmd) ((cmd)->request_buffer) -+#define scsi_bufflen(cmd) ((cmd)->request_bufflen) -+#define scsi_set_resid(cmd, to_read) {(cmd)->resid = (to_read);} -+#endif -+ -+/* 1-argument form of k[un]map_atomic was introduced in 2.6.37-rc1; -+ 2-argument form was deprecated in 3.4-rc1 */ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37) -+#define vhba_kmap_atomic kmap_atomic -+#define vhba_kunmap_atomic kunmap_atomic -+#else -+#define vhba_kmap_atomic(page) kmap_atomic(page, KM_USER0) -+#define vhba_kunmap_atomic(page) kunmap_atomic(page, KM_USER0) -+#endif -+ -+ -+enum vhba_req_state { -+ VHBA_REQ_FREE, -+ VHBA_REQ_PENDING, -+ VHBA_REQ_READING, -+ VHBA_REQ_SENT, -+ VHBA_REQ_WRITING, -+}; -+ -+struct vhba_command { -+ struct scsi_cmnd *cmd; -+ unsigned long serial_number; -+ int status; -+ struct list_head entry; -+}; -+ -+struct vhba_device { -+ uint id; -+ spinlock_t cmd_lock; -+ struct list_head cmd_list; -+ wait_queue_head_t cmd_wq; -+ atomic_t refcnt; -+ -+ unsigned char *kbuf; -+ size_t kbuf_size; -+ -+ unsigned long cmd_count; -+}; -+ -+struct vhba_host { -+ struct Scsi_Host *shost; -+ spinlock_t cmd_lock; -+ int cmd_next; -+ struct vhba_command commands[VHBA_CAN_QUEUE]; -+ spinlock_t dev_lock; -+ struct vhba_device *devices[VHBA_MAX_ID]; -+ int num_devices; -+ DECLARE_BITMAP(chgmap, VHBA_MAX_ID); -+ int chgtype[VHBA_MAX_ID]; -+ struct work_struct scan_devices; -+}; -+ -+#define MAX_COMMAND_SIZE 16 -+ -+struct vhba_request { -+ __u32 tag; -+ __u32 lun; -+ __u8 cdb[MAX_COMMAND_SIZE]; -+ __u8 cdb_len; -+ __u32 data_len; -+}; -+ -+struct vhba_response { -+ __u32 tag; -+ __u32 status; -+ __u32 data_len; -+}; -+ -+static struct vhba_command *vhba_alloc_command (void); -+static void vhba_free_command (struct vhba_command *vcmd); -+ -+static struct platform_device vhba_platform_device; -+ -+static struct vhba_device *vhba_device_alloc (void) -+{ -+ struct vhba_device *vdev; -+ -+ vdev = kzalloc(sizeof(struct vhba_device), GFP_KERNEL); -+ if (!vdev) { -+ return NULL; -+ } -+ -+ vdev->id = VHBA_INVALID_ID; -+ spin_lock_init(&vdev->cmd_lock); -+ INIT_LIST_HEAD(&vdev->cmd_list); -+ init_waitqueue_head(&vdev->cmd_wq); -+ atomic_set(&vdev->refcnt, 1); -+ -+ vdev->kbuf = NULL; -+ vdev->kbuf_size = 0; -+ -+ vdev->cmd_count = 0; -+ -+ return vdev; -+} -+ -+static void vhba_device_put (struct vhba_device *vdev) -+{ -+ if (atomic_dec_and_test(&vdev->refcnt)) { -+ kfree(vdev); -+ } -+} -+ -+static struct vhba_device *vhba_device_get (struct vhba_device *vdev) -+{ -+ atomic_inc(&vdev->refcnt); -+ -+ return vdev; -+} -+ -+static int vhba_device_queue (struct vhba_device *vdev, struct scsi_cmnd *cmd) -+{ -+ struct vhba_command *vcmd; -+ unsigned long flags; -+ -+ vcmd = vhba_alloc_command(); -+ if (!vcmd) { -+ return SCSI_MLQUEUE_HOST_BUSY; -+ } -+ -+ vcmd->cmd = cmd; -+ -+ spin_lock_irqsave(&vdev->cmd_lock, flags); -+ vcmd->serial_number = vdev->cmd_count++; -+ list_add_tail(&vcmd->entry, &vdev->cmd_list); -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ -+ wake_up_interruptible(&vdev->cmd_wq); -+ -+ return 0; -+} -+ -+static int vhba_device_dequeue (struct vhba_device *vdev, struct scsi_cmnd *cmd) -+{ -+ struct vhba_command *vcmd; -+ int retval; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&vdev->cmd_lock, flags); -+ list_for_each_entry(vcmd, &vdev->cmd_list, entry) { -+ if (vcmd->cmd == cmd) { -+ list_del_init(&vcmd->entry); -+ break; -+ } -+ } -+ -+ /* command not found */ -+ if (&vcmd->entry == &vdev->cmd_list) { -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ return SUCCESS; -+ } -+ -+ while (vcmd->status == VHBA_REQ_READING || vcmd->status == VHBA_REQ_WRITING) { -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ scmd_dbg(cmd, "wait for I/O before aborting\n"); -+ schedule_timeout(1); -+ spin_lock_irqsave(&vdev->cmd_lock, flags); -+ } -+ -+ retval = (vcmd->status == VHBA_REQ_SENT) ? FAILED : SUCCESS; -+ -+ vhba_free_command(vcmd); -+ -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ -+ return retval; -+} -+ -+static inline void vhba_scan_devices_add (struct vhba_host *vhost, int id) -+{ -+ struct scsi_device *sdev; -+ -+ sdev = scsi_device_lookup(vhost->shost, 0, id, 0); -+ if (!sdev) { -+ scsi_add_device(vhost->shost, 0, id, 0); -+ } else { -+ dev_warn(&vhost->shost->shost_gendev, "tried to add an already-existing device 0:%d:0!\n", id); -+ scsi_device_put(sdev); -+ } -+} -+ -+static inline void vhba_scan_devices_remove (struct vhba_host *vhost, int id) -+{ -+ struct scsi_device *sdev; -+ -+ sdev = scsi_device_lookup(vhost->shost, 0, id, 0); -+ if (sdev) { -+ scsi_remove_device(sdev); -+ scsi_device_put(sdev); -+ } else { -+ dev_warn(&vhost->shost->shost_gendev, "tried to remove non-existing device 0:%d:0!\n", id); -+ } -+} -+ -+static void vhba_scan_devices (struct work_struct *work) -+{ -+ struct vhba_host *vhost = container_of(work, struct vhba_host, scan_devices); -+ unsigned long flags; -+ int id, change, exists; -+ -+ while (1) { -+ spin_lock_irqsave(&vhost->dev_lock, flags); -+ -+ id = find_first_bit(vhost->chgmap, vhost->shost->max_id); -+ if (id >= vhost->shost->max_id) { -+ spin_unlock_irqrestore(&vhost->dev_lock, flags); -+ break; -+ } -+ change = vhost->chgtype[id]; -+ exists = vhost->devices[id] != NULL; -+ -+ vhost->chgtype[id] = 0; -+ clear_bit(id, vhost->chgmap); -+ -+ spin_unlock_irqrestore(&vhost->dev_lock, flags); -+ -+ if (change < 0) { -+ dev_dbg(&vhost->shost->shost_gendev, "trying to remove target 0:%d:0\n", id); -+ vhba_scan_devices_remove(vhost, id); -+ } else if (change > 0) { -+ dev_dbg(&vhost->shost->shost_gendev, "trying to add target 0:%d:0\n", id); -+ vhba_scan_devices_add(vhost, id); -+ } else { -+ /* quick sequence of add/remove or remove/add; we determine -+ which one it was by checking if device structure exists */ -+ if (exists) { -+ /* remove followed by add: remove and (re)add */ -+ dev_dbg(&vhost->shost->shost_gendev, "trying to (re)add target 0:%d:0\n", id); -+ vhba_scan_devices_remove(vhost, id); -+ vhba_scan_devices_add(vhost, id); -+ } else { -+ /* add followed by remove: no-op */ -+ dev_dbg(&vhost->shost->shost_gendev, "no-op for target 0:%d:0\n", id); -+ } -+ } -+ } -+} -+ -+static int vhba_add_device (struct vhba_device *vdev) -+{ -+ struct vhba_host *vhost; -+ int i; -+ unsigned long flags; -+ -+ vhost = platform_get_drvdata(&vhba_platform_device); -+ -+ vhba_device_get(vdev); -+ -+ spin_lock_irqsave(&vhost->dev_lock, flags); -+ if (vhost->num_devices >= vhost->shost->max_id) { -+ spin_unlock_irqrestore(&vhost->dev_lock, flags); -+ vhba_device_put(vdev); -+ return -EBUSY; -+ } -+ -+ for (i = 0; i < vhost->shost->max_id; i++) { -+ if (vhost->devices[i] == NULL) { -+ vdev->id = i; -+ vhost->devices[i] = vdev; -+ vhost->num_devices++; -+ set_bit(vdev->id, vhost->chgmap); -+ vhost->chgtype[vdev->id]++; -+ break; -+ } -+ } -+ spin_unlock_irqrestore(&vhost->dev_lock, flags); -+ -+ schedule_work(&vhost->scan_devices); -+ -+ return 0; -+} -+ -+static int vhba_remove_device (struct vhba_device *vdev) -+{ -+ struct vhba_host *vhost; -+ unsigned long flags; -+ -+ vhost = platform_get_drvdata(&vhba_platform_device); -+ -+ spin_lock_irqsave(&vhost->dev_lock, flags); -+ set_bit(vdev->id, vhost->chgmap); -+ vhost->chgtype[vdev->id]--; -+ vhost->devices[vdev->id] = NULL; -+ vhost->num_devices--; -+ vdev->id = VHBA_INVALID_ID; -+ spin_unlock_irqrestore(&vhost->dev_lock, flags); -+ -+ vhba_device_put(vdev); -+ -+ schedule_work(&vhost->scan_devices); -+ -+ return 0; -+} -+ -+static struct vhba_device *vhba_lookup_device (int id) -+{ -+ struct vhba_host *vhost; -+ struct vhba_device *vdev = NULL; -+ unsigned long flags; -+ -+ vhost = platform_get_drvdata(&vhba_platform_device); -+ -+ if (likely(id < vhost->shost->max_id)) { -+ spin_lock_irqsave(&vhost->dev_lock, flags); -+ vdev = vhost->devices[id]; -+ if (vdev) { -+ vdev = vhba_device_get(vdev); -+ } -+ -+ spin_unlock_irqrestore(&vhost->dev_lock, flags); -+ } -+ -+ return vdev; -+} -+ -+static struct vhba_command *vhba_alloc_command (void) -+{ -+ struct vhba_host *vhost; -+ struct vhba_command *vcmd; -+ unsigned long flags; -+ int i; -+ -+ vhost = platform_get_drvdata(&vhba_platform_device); -+ -+ spin_lock_irqsave(&vhost->cmd_lock, flags); -+ -+ vcmd = vhost->commands + vhost->cmd_next++; -+ if (vcmd->status != VHBA_REQ_FREE) { -+ for (i = 0; i < vhost->shost->can_queue; i++) { -+ vcmd = vhost->commands + i; -+ -+ if (vcmd->status == VHBA_REQ_FREE) { -+ vhost->cmd_next = i + 1; -+ break; -+ } -+ } -+ -+ if (i == vhost->shost->can_queue) { -+ vcmd = NULL; -+ } -+ } -+ -+ if (vcmd) { -+ vcmd->status = VHBA_REQ_PENDING; -+ } -+ -+ vhost->cmd_next %= vhost->shost->can_queue; -+ -+ spin_unlock_irqrestore(&vhost->cmd_lock, flags); -+ -+ return vcmd; -+} -+ -+static void vhba_free_command (struct vhba_command *vcmd) -+{ -+ struct vhba_host *vhost; -+ unsigned long flags; -+ -+ vhost = platform_get_drvdata(&vhba_platform_device); -+ -+ spin_lock_irqsave(&vhost->cmd_lock, flags); -+ vcmd->status = VHBA_REQ_FREE; -+ spin_unlock_irqrestore(&vhost->cmd_lock, flags); -+} -+ -+static int vhba_queuecommand_lck (struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) -+{ -+ struct vhba_device *vdev; -+ int retval; -+ -+ scmd_dbg(cmd, "queue %p\n", cmd); -+ -+ vdev = vhba_lookup_device(cmd->device->id); -+ if (!vdev) { -+ scmd_dbg(cmd, "no such device\n"); -+ -+ cmd->result = DID_NO_CONNECT << 16; -+ done(cmd); -+ -+ return 0; -+ } -+ -+ cmd->scsi_done = done; -+ retval = vhba_device_queue(vdev, cmd); -+ -+ vhba_device_put(vdev); -+ -+ return retval; -+} -+ -+#ifdef DEF_SCSI_QCMD -+DEF_SCSI_QCMD(vhba_queuecommand) -+#else -+#define vhba_queuecommand vhba_queuecommand_lck -+#endif -+ -+static int vhba_abort (struct scsi_cmnd *cmd) -+{ -+ struct vhba_device *vdev; -+ int retval = SUCCESS; -+ -+ scmd_warn(cmd, "abort %p\n", cmd); -+ -+ vdev = vhba_lookup_device(cmd->device->id); -+ if (vdev) { -+ retval = vhba_device_dequeue(vdev, cmd); -+ vhba_device_put(vdev); -+ } else { -+ cmd->result = DID_NO_CONNECT << 16; -+ } -+ -+ return retval; -+} -+ -+static struct scsi_host_template vhba_template = { -+ .module = THIS_MODULE, -+ .name = "vhba", -+ .proc_name = "vhba", -+ .queuecommand = vhba_queuecommand, -+ .eh_abort_handler = vhba_abort, -+ .can_queue = VHBA_CAN_QUEUE, -+ .this_id = -1, -+ .cmd_per_lun = 1, -+ .max_sectors = VHBA_MAX_SECTORS_PER_IO, -+ .sg_tablesize = 256, -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) -+ .max_segment_size = VHBA_KBUF_SIZE, -+#endif -+}; -+ -+static ssize_t do_request (struct vhba_device *vdev, unsigned long cmd_serial_number, struct scsi_cmnd *cmd, char __user *buf, size_t buf_len) -+{ -+ struct vhba_request vreq; -+ ssize_t ret; -+ -+ scmd_dbg(cmd, "request %lu (%p), cdb 0x%x, bufflen %d, use_sg %d\n", -+ cmd_serial_number, cmd, cmd->cmnd[0], scsi_bufflen(cmd), scsi_sg_count(cmd)); -+ -+ ret = sizeof(vreq); -+ if (DATA_TO_DEVICE(cmd->sc_data_direction)) { -+ ret += scsi_bufflen(cmd); -+ } -+ -+ if (ret > buf_len) { -+ scmd_warn(cmd, "buffer too small (%zd < %zd) for a request\n", buf_len, ret); -+ return -EIO; -+ } -+ -+ vreq.tag = cmd_serial_number; -+ vreq.lun = cmd->device->lun; -+ memcpy(vreq.cdb, cmd->cmnd, MAX_COMMAND_SIZE); -+ vreq.cdb_len = cmd->cmd_len; -+ vreq.data_len = scsi_bufflen(cmd); -+ -+ if (copy_to_user(buf, &vreq, sizeof(vreq))) { -+ return -EFAULT; -+ } -+ -+ if (DATA_TO_DEVICE(cmd->sc_data_direction) && vreq.data_len) { -+ buf += sizeof(vreq); -+ -+ if (scsi_sg_count(cmd)) { -+ unsigned char *kaddr, *uaddr; -+ struct scatterlist *sg = scsi_sglist(cmd); -+ int i; -+ -+ uaddr = (unsigned char *) buf; -+ -+ for (i = 0; i < scsi_sg_count(cmd); i++) { -+ size_t len = sg[i].length; -+ -+ if (len > vdev->kbuf_size) { -+ scmd_warn(cmd, "segment size (%zu) exceeds kbuf size (%zu)!", len, vdev->kbuf_size); -+ len = vdev->kbuf_size; -+ } -+ -+#ifdef USE_SG_PAGE -+ kaddr = vhba_kmap_atomic(sg_page(&sg[i])); -+#else -+ kaddr = vhba_kmap_atomic(sg[i].page); -+#endif -+ memcpy(vdev->kbuf, kaddr + sg[i].offset, len); -+ vhba_kunmap_atomic(kaddr); -+ -+ if (copy_to_user(uaddr, vdev->kbuf, len)) { -+ return -EFAULT; -+ } -+ uaddr += len; -+ } -+ } else { -+ if (copy_to_user(buf, scsi_sglist(cmd), vreq.data_len)) { -+ return -EFAULT; -+ } -+ } -+ } -+ -+ return ret; -+} -+ -+static ssize_t do_response (struct vhba_device *vdev, unsigned long cmd_serial_number, struct scsi_cmnd *cmd, const char __user *buf, size_t buf_len, struct vhba_response *res) -+{ -+ ssize_t ret = 0; -+ -+ scmd_dbg(cmd, "response %lu (%p), status %x, data len %d, use_sg %d\n", -+ cmd_serial_number, cmd, res->status, res->data_len, scsi_sg_count(cmd)); -+ -+ if (res->status) { -+ unsigned char sense_stack[SCSI_SENSE_BUFFERSIZE]; -+ -+ if (res->data_len > SCSI_SENSE_BUFFERSIZE) { -+ scmd_warn(cmd, "truncate sense (%d < %d)", SCSI_SENSE_BUFFERSIZE, res->data_len); -+ res->data_len = SCSI_SENSE_BUFFERSIZE; -+ } -+ -+ /* Copy via temporary buffer on stack in order to avoid problems -+ with PAX on grsecurity-enabled kernels */ -+ if (copy_from_user(sense_stack, buf, res->data_len)) { -+ return -EFAULT; -+ } -+ memcpy(cmd->sense_buffer, sense_stack, res->data_len); -+ -+ cmd->result = res->status; -+ -+ ret += res->data_len; -+ } else if (DATA_FROM_DEVICE(cmd->sc_data_direction) && scsi_bufflen(cmd)) { -+ size_t to_read; -+ -+ if (res->data_len > scsi_bufflen(cmd)) { -+ scmd_warn(cmd, "truncate data (%d < %d)\n", scsi_bufflen(cmd), res->data_len); -+ res->data_len = scsi_bufflen(cmd); -+ } -+ -+ to_read = res->data_len; -+ -+ if (scsi_sg_count(cmd)) { -+ unsigned char *kaddr, *uaddr; -+ struct scatterlist *sg = scsi_sglist(cmd); -+ int i; -+ -+ uaddr = (unsigned char *)buf; -+ -+ for (i = 0; i < scsi_sg_count(cmd); i++) { -+ size_t len = (sg[i].length < to_read) ? sg[i].length : to_read; -+ -+ if (len > vdev->kbuf_size) { -+ scmd_warn(cmd, "segment size (%zu) exceeds kbuf size (%zu)!", len, vdev->kbuf_size); -+ len = vdev->kbuf_size; -+ } -+ -+ if (copy_from_user(vdev->kbuf, uaddr, len)) { -+ return -EFAULT; -+ } -+ uaddr += len; -+ -+#ifdef USE_SG_PAGE -+ kaddr = vhba_kmap_atomic(sg_page(&sg[i])); -+#else -+ kaddr = vhba_kmap_atomic(sg[i].page); -+#endif -+ memcpy(kaddr + sg[i].offset, vdev->kbuf, len); -+ vhba_kunmap_atomic(kaddr); -+ -+ to_read -= len; -+ if (to_read == 0) { -+ break; -+ } -+ } -+ } else { -+ if (copy_from_user(scsi_sglist(cmd), buf, res->data_len)) { -+ return -EFAULT; -+ } -+ -+ to_read -= res->data_len; -+ } -+ -+ scsi_set_resid(cmd, to_read); -+ -+ ret += res->data_len - to_read; -+ } -+ -+ return ret; -+} -+ -+static inline struct vhba_command *next_command (struct vhba_device *vdev) -+{ -+ struct vhba_command *vcmd; -+ -+ list_for_each_entry(vcmd, &vdev->cmd_list, entry) { -+ if (vcmd->status == VHBA_REQ_PENDING) { -+ break; -+ } -+ } -+ -+ if (&vcmd->entry == &vdev->cmd_list) { -+ vcmd = NULL; -+ } -+ -+ return vcmd; -+} -+ -+static inline struct vhba_command *match_command (struct vhba_device *vdev, u32 tag) -+{ -+ struct vhba_command *vcmd; -+ -+ list_for_each_entry(vcmd, &vdev->cmd_list, entry) { -+ if (vcmd->serial_number == tag) { -+ break; -+ } -+ } -+ -+ if (&vcmd->entry == &vdev->cmd_list) { -+ vcmd = NULL; -+ } -+ -+ return vcmd; -+} -+ -+static struct vhba_command *wait_command (struct vhba_device *vdev, unsigned long flags) -+{ -+ struct vhba_command *vcmd; -+ DEFINE_WAIT(wait); -+ -+ while (!(vcmd = next_command(vdev))) { -+ if (signal_pending(current)) { -+ break; -+ } -+ -+ prepare_to_wait(&vdev->cmd_wq, &wait, TASK_INTERRUPTIBLE); -+ -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ -+ schedule(); -+ -+ spin_lock_irqsave(&vdev->cmd_lock, flags); -+ } -+ -+ finish_wait(&vdev->cmd_wq, &wait); -+ if (vcmd) { -+ vcmd->status = VHBA_REQ_READING; -+ } -+ -+ return vcmd; -+} -+ -+static ssize_t vhba_ctl_read (struct file *file, char __user *buf, size_t buf_len, loff_t *offset) -+{ -+ struct vhba_device *vdev; -+ struct vhba_command *vcmd; -+ ssize_t ret; -+ unsigned long flags; -+ -+ vdev = file->private_data; -+ -+ /* Get next command */ -+ if (file->f_flags & O_NONBLOCK) { -+ /* Non-blocking variant */ -+ spin_lock_irqsave(&vdev->cmd_lock, flags); -+ vcmd = next_command(vdev); -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ -+ if (!vcmd) { -+ return -EWOULDBLOCK; -+ } -+ } else { -+ /* Blocking variant */ -+ spin_lock_irqsave(&vdev->cmd_lock, flags); -+ vcmd = wait_command(vdev, flags); -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ -+ if (!vcmd) { -+ return -ERESTARTSYS; -+ } -+ } -+ -+ ret = do_request(vdev, vcmd->serial_number, vcmd->cmd, buf, buf_len); -+ -+ spin_lock_irqsave(&vdev->cmd_lock, flags); -+ if (ret >= 0) { -+ vcmd->status = VHBA_REQ_SENT; -+ *offset += ret; -+ } else { -+ vcmd->status = VHBA_REQ_PENDING; -+ } -+ -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ -+ return ret; -+} -+ -+static ssize_t vhba_ctl_write (struct file *file, const char __user *buf, size_t buf_len, loff_t *offset) -+{ -+ struct vhba_device *vdev; -+ struct vhba_command *vcmd; -+ struct vhba_response res; -+ ssize_t ret; -+ unsigned long flags; -+ -+ if (buf_len < sizeof(res)) { -+ return -EIO; -+ } -+ -+ if (copy_from_user(&res, buf, sizeof(res))) { -+ return -EFAULT; -+ } -+ -+ vdev = file->private_data; -+ -+ spin_lock_irqsave(&vdev->cmd_lock, flags); -+ vcmd = match_command(vdev, res.tag); -+ if (!vcmd || vcmd->status != VHBA_REQ_SENT) { -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ DPRINTK("not expecting response\n"); -+ return -EIO; -+ } -+ vcmd->status = VHBA_REQ_WRITING; -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ -+ ret = do_response(vdev, vcmd->serial_number, vcmd->cmd, buf + sizeof(res), buf_len - sizeof(res), &res); -+ -+ spin_lock_irqsave(&vdev->cmd_lock, flags); -+ if (ret >= 0) { -+ vcmd->cmd->scsi_done(vcmd->cmd); -+ ret += sizeof(res); -+ -+ /* don't compete with vhba_device_dequeue */ -+ if (!list_empty(&vcmd->entry)) { -+ list_del_init(&vcmd->entry); -+ vhba_free_command(vcmd); -+ } -+ } else { -+ vcmd->status = VHBA_REQ_SENT; -+ } -+ -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ -+ return ret; -+} -+ -+static long vhba_ctl_ioctl (struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ struct vhba_device *vdev = file->private_data; -+ struct vhba_host *vhost; -+ struct scsi_device *sdev; -+ -+ switch (cmd) { -+ case 0xBEEF001: { -+ vhost = platform_get_drvdata(&vhba_platform_device); -+ sdev = scsi_device_lookup(vhost->shost, 0, vdev->id, 0); -+ -+ if (sdev) { -+ int id[4] = { -+ sdev->host->host_no, -+ sdev->channel, -+ sdev->id, -+ sdev->lun -+ }; -+ -+ scsi_device_put(sdev); -+ -+ if (copy_to_user((void *)arg, id, sizeof(id))) { -+ return -EFAULT; -+ } -+ -+ return 0; -+ } else { -+ return -ENODEV; -+ } -+ } -+ } -+ -+ return -ENOTTY; -+} -+ -+#ifdef CONFIG_COMPAT -+static long vhba_ctl_compat_ioctl (struct file *file, unsigned int cmd, unsigned long arg) -+{ -+ unsigned long compat_arg = (unsigned long)compat_ptr(arg); -+ return vhba_ctl_ioctl(file, cmd, compat_arg); -+} -+#endif -+ -+static unsigned int vhba_ctl_poll (struct file *file, poll_table *wait) -+{ -+ struct vhba_device *vdev = file->private_data; -+ unsigned int mask = 0; -+ unsigned long flags; -+ -+ poll_wait(file, &vdev->cmd_wq, wait); -+ -+ spin_lock_irqsave(&vdev->cmd_lock, flags); -+ if (next_command(vdev)) { -+ mask |= POLLIN | POLLRDNORM; -+ } -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ -+ return mask; -+} -+ -+static int vhba_ctl_open (struct inode *inode, struct file *file) -+{ -+ struct vhba_device *vdev; -+ int retval; -+ -+ DPRINTK("open\n"); -+ -+ /* check if vhba is probed */ -+ if (!platform_get_drvdata(&vhba_platform_device)) { -+ return -ENODEV; -+ } -+ -+ vdev = vhba_device_alloc(); -+ if (!vdev) { -+ return -ENOMEM; -+ } -+ -+ vdev->kbuf_size = VHBA_KBUF_SIZE; -+ vdev->kbuf = kmalloc(vdev->kbuf_size, GFP_KERNEL); -+ if (!vdev->kbuf) { -+ return -ENOMEM; -+ } -+ -+ if (!(retval = vhba_add_device(vdev))) { -+ file->private_data = vdev; -+ } -+ -+ vhba_device_put(vdev); -+ -+ return retval; -+} -+ -+static int vhba_ctl_release (struct inode *inode, struct file *file) -+{ -+ struct vhba_device *vdev; -+ struct vhba_command *vcmd; -+ unsigned long flags; -+ -+ DPRINTK("release\n"); -+ -+ vdev = file->private_data; -+ -+ vhba_device_get(vdev); -+ vhba_remove_device(vdev); -+ -+ spin_lock_irqsave(&vdev->cmd_lock, flags); -+ list_for_each_entry(vcmd, &vdev->cmd_list, entry) { -+ WARN_ON(vcmd->status == VHBA_REQ_READING || vcmd->status == VHBA_REQ_WRITING); -+ -+ scmd_warn(vcmd->cmd, "device released with command %lu (%p)\n", vcmd->serial_number, vcmd->cmd); -+ vcmd->cmd->result = DID_NO_CONNECT << 16; -+ vcmd->cmd->scsi_done(vcmd->cmd); -+ -+ vhba_free_command(vcmd); -+ } -+ INIT_LIST_HEAD(&vdev->cmd_list); -+ spin_unlock_irqrestore(&vdev->cmd_lock, flags); -+ -+ kfree(vdev->kbuf); -+ vdev->kbuf = NULL; -+ -+ vhba_device_put(vdev); -+ -+ return 0; -+} -+ -+static struct file_operations vhba_ctl_fops = { -+ .owner = THIS_MODULE, -+ .open = vhba_ctl_open, -+ .release = vhba_ctl_release, -+ .read = vhba_ctl_read, -+ .write = vhba_ctl_write, -+ .poll = vhba_ctl_poll, -+ .unlocked_ioctl = vhba_ctl_ioctl, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = vhba_ctl_compat_ioctl, -+#endif -+}; -+ -+static struct miscdevice vhba_miscdev = { -+ .minor = MISC_DYNAMIC_MINOR, -+ .name = "vhba_ctl", -+ .fops = &vhba_ctl_fops, -+}; -+ -+static int vhba_probe (struct platform_device *pdev) -+{ -+ struct Scsi_Host *shost; -+ struct vhba_host *vhost; -+ int i; -+ -+ shost = scsi_host_alloc(&vhba_template, sizeof(struct vhba_host)); -+ if (!shost) { -+ return -ENOMEM; -+ } -+ -+ shost->max_id = VHBA_MAX_ID; -+ /* we don't support lun > 0 */ -+ shost->max_lun = 1; -+ shost->max_cmd_len = MAX_COMMAND_SIZE; -+ -+ vhost = (struct vhba_host *)shost->hostdata; -+ memset(vhost, 0, sizeof(*vhost)); -+ -+ vhost->shost = shost; -+ vhost->num_devices = 0; -+ spin_lock_init(&vhost->dev_lock); -+ spin_lock_init(&vhost->cmd_lock); -+ INIT_WORK(&vhost->scan_devices, vhba_scan_devices); -+ vhost->cmd_next = 0; -+ for (i = 0; i < vhost->shost->can_queue; i++) { -+ vhost->commands[i].status = VHBA_REQ_FREE; -+ } -+ -+ platform_set_drvdata(pdev, vhost); -+ -+ if (scsi_add_host(shost, &pdev->dev)) { -+ scsi_host_put(shost); -+ return -ENOMEM; -+ } -+ -+ return 0; -+} -+ -+static int vhba_remove (struct platform_device *pdev) -+{ -+ struct vhba_host *vhost; -+ struct Scsi_Host *shost; -+ -+ vhost = platform_get_drvdata(pdev); -+ shost = vhost->shost; -+ -+ scsi_remove_host(shost); -+ scsi_host_put(shost); -+ -+ return 0; -+} -+ -+static void vhba_release (struct device * dev) -+{ -+ return; -+} -+ -+static struct platform_device vhba_platform_device = { -+ .name = "vhba", -+ .id = -1, -+ .dev = { -+ .release = vhba_release, -+ }, -+}; -+ -+static struct platform_driver vhba_platform_driver = { -+ .driver = { -+ .owner = THIS_MODULE, -+ .name = "vhba", -+ }, -+ .probe = vhba_probe, -+ .remove = vhba_remove, -+}; -+ -+static int __init vhba_init (void) -+{ -+ int ret; -+ -+ ret = platform_device_register(&vhba_platform_device); -+ if (ret < 0) { -+ return ret; -+ } -+ -+ ret = platform_driver_register(&vhba_platform_driver); -+ if (ret < 0) { -+ platform_device_unregister(&vhba_platform_device); -+ return ret; -+ } -+ -+ ret = misc_register(&vhba_miscdev); -+ if (ret < 0) { -+ platform_driver_unregister(&vhba_platform_driver); -+ platform_device_unregister(&vhba_platform_device); -+ return ret; -+ } -+ -+ return 0; -+} -+ -+static void __exit vhba_exit(void) -+{ -+ misc_deregister(&vhba_miscdev); -+ platform_driver_unregister(&vhba_platform_driver); -+ platform_device_unregister(&vhba_platform_device); -+} -+ -+module_init(vhba_init); -+module_exit(vhba_exit); -+ -diff --git a/drivers/soc/imx/soc-imx8.c b/drivers/soc/imx/soc-imx8.c -index fc6429f9170a..79a3d922a4a9 100644 ---- a/drivers/soc/imx/soc-imx8.c -+++ b/drivers/soc/imx/soc-imx8.c -@@ -73,7 +73,7 @@ static int __init imx8_soc_init(void) - - soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); - if (!soc_dev_attr) -- return -ENODEV; -+ return -ENOMEM; - - soc_dev_attr->family = "Freescale i.MX"; - -@@ -83,8 +83,10 @@ static int __init imx8_soc_init(void) - goto free_soc; - - id = of_match_node(imx8_soc_match, root); -- if (!id) -+ if (!id) { -+ ret = -ENODEV; - goto free_soc; -+ } - - of_node_put(root); - -@@ -96,20 +98,25 @@ static int __init imx8_soc_init(void) - } - - soc_dev_attr->revision = imx8_revision(soc_rev); -- if (!soc_dev_attr->revision) -+ if (!soc_dev_attr->revision) { -+ ret = -ENOMEM; - goto free_soc; -+ } - - soc_dev = soc_device_register(soc_dev_attr); -- if (IS_ERR(soc_dev)) -+ if (IS_ERR(soc_dev)) { -+ ret = PTR_ERR(soc_dev); - goto free_rev; -+ } - - return 0; - - free_rev: -- kfree(soc_dev_attr->revision); -+ if (strcmp(soc_dev_attr->revision, "unknown")) -+ kfree(soc_dev_attr->revision); - free_soc: - kfree(soc_dev_attr); - of_node_put(root); -- return -ENODEV; -+ return ret; - } - device_initcall(imx8_soc_init); -diff --git a/drivers/soc/qcom/rpmpd.c b/drivers/soc/qcom/rpmpd.c -index 005326050c23..235d01870dd8 100644 ---- a/drivers/soc/qcom/rpmpd.c -+++ b/drivers/soc/qcom/rpmpd.c -@@ -226,7 +226,7 @@ static int rpmpd_set_performance(struct generic_pm_domain *domain, - struct rpmpd *pd = domain_to_rpmpd(domain); - - if (state > MAX_RPMPD_STATE) -- goto out; -+ state = MAX_RPMPD_STATE; - - mutex_lock(&rpmpd_lock); - -diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c -index 402c1efcd762..6435b8652159 100644 ---- a/drivers/spi/spi-bcm2835.c -+++ b/drivers/spi/spi-bcm2835.c -@@ -764,7 +764,8 @@ static int bcm2835_spi_transfer_one(struct spi_master *master, - bcm2835_wr(bs, BCM2835_SPI_CLK, cdiv); - - /* handle all the 3-wire mode */ -- if ((spi->mode & SPI_3WIRE) && (tfr->rx_buf)) -+ if (spi->mode & SPI_3WIRE && tfr->rx_buf && -+ tfr->rx_buf != master->dummy_rx) - cs |= BCM2835_SPI_CS_REN; - else - cs &= ~BCM2835_SPI_CS_REN; -diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c -index 9b91188a85f9..2cc6d9951b52 100644 ---- a/drivers/spi/spi-rockchip.c -+++ b/drivers/spi/spi-rockchip.c -@@ -417,7 +417,7 @@ static int rockchip_spi_prepare_dma(struct rockchip_spi *rs, - .direction = DMA_MEM_TO_DEV, - .dst_addr = rs->dma_addr_tx, - .dst_addr_width = rs->n_bytes, -- .dst_maxburst = rs->fifo_len / 2, -+ .dst_maxburst = rs->fifo_len / 4, - }; - - dmaengine_slave_config(master->dma_tx, &txconf); -@@ -518,7 +518,7 @@ static void rockchip_spi_config(struct rockchip_spi *rs, - else - writel_relaxed(rs->fifo_len / 2 - 1, rs->regs + ROCKCHIP_SPI_RXFTLR); - -- writel_relaxed(rs->fifo_len / 2 - 1, rs->regs + ROCKCHIP_SPI_DMATDLR); -+ writel_relaxed(rs->fifo_len / 2, rs->regs + ROCKCHIP_SPI_DMATDLR); - writel_relaxed(0, rs->regs + ROCKCHIP_SPI_DMARDLR); - writel_relaxed(dmacr, rs->regs + ROCKCHIP_SPI_DMACR); - -diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c -index 5e4654032bfa..29916e446143 100644 ---- a/drivers/spi/spi.c -+++ b/drivers/spi/spi.c -@@ -2286,11 +2286,6 @@ int spi_register_controller(struct spi_controller *ctlr) - if (status) - return status; - -- /* even if it's just one always-selected device, there must -- * be at least one chipselect -- */ -- if (ctlr->num_chipselect == 0) -- return -EINVAL; - if (ctlr->bus_num >= 0) { - /* devices with a fixed bus num must check-in with the num */ - mutex_lock(&board_lock); -@@ -2361,6 +2356,13 @@ int spi_register_controller(struct spi_controller *ctlr) - } - } - -+ /* -+ * Even if it's just one always-selected device, there must -+ * be at least one chipselect. -+ */ -+ if (!ctlr->num_chipselect) -+ return -EINVAL; -+ - status = device_add(&ctlr->dev); - if (status < 0) { - /* free bus id */ -diff --git a/drivers/staging/android/ion/ion_page_pool.c b/drivers/staging/android/ion/ion_page_pool.c -index fd4995fb676e..f85ec5b16b65 100644 ---- a/drivers/staging/android/ion/ion_page_pool.c -+++ b/drivers/staging/android/ion/ion_page_pool.c -@@ -8,11 +8,14 @@ - #include - #include - #include -+#include - - #include "ion.h" - - static inline struct page *ion_page_pool_alloc_pages(struct ion_page_pool *pool) - { -+ if (fatal_signal_pending(current)) -+ return NULL; - return alloc_pages(pool->gfp_mask, pool->order); - } - -diff --git a/drivers/staging/comedi/drivers/amplc_pci230.c b/drivers/staging/comedi/drivers/amplc_pci230.c -index 65f60c2b702a..f7e673121864 100644 ---- a/drivers/staging/comedi/drivers/amplc_pci230.c -+++ b/drivers/staging/comedi/drivers/amplc_pci230.c -@@ -2330,7 +2330,8 @@ static irqreturn_t pci230_interrupt(int irq, void *d) - devpriv->intr_running = false; - spin_unlock_irqrestore(&devpriv->isr_spinlock, irqflags); - -- comedi_handle_events(dev, s_ao); -+ if (s_ao) -+ comedi_handle_events(dev, s_ao); - comedi_handle_events(dev, s_ai); - - return IRQ_HANDLED; -diff --git a/drivers/staging/comedi/drivers/dt282x.c b/drivers/staging/comedi/drivers/dt282x.c -index 3be927f1d3a9..e15e33ed94ae 100644 ---- a/drivers/staging/comedi/drivers/dt282x.c -+++ b/drivers/staging/comedi/drivers/dt282x.c -@@ -557,7 +557,8 @@ static irqreturn_t dt282x_interrupt(int irq, void *d) - } - #endif - comedi_handle_events(dev, s); -- comedi_handle_events(dev, s_ao); -+ if (s_ao) -+ comedi_handle_events(dev, s_ao); - - return IRQ_RETVAL(handled); - } -diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c -index c175227009f1..a8b3611b1441 100644 ---- a/drivers/staging/comedi/drivers/ni_mio_common.c -+++ b/drivers/staging/comedi/drivers/ni_mio_common.c -@@ -4742,7 +4742,7 @@ static int cs5529_wait_for_idle(struct comedi_device *dev) - if ((status & NI67XX_CAL_STATUS_BUSY) == 0) - break; - set_current_state(TASK_INTERRUPTIBLE); -- if (schedule_timeout(1)) -+ if (schedule_min_hrtimeout()) - return -EIO; - } - if (i == timeout) { -diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c -index 9b07badf4c6c..bc750250ccd6 100644 ---- a/drivers/staging/fbtft/fbtft-core.c -+++ b/drivers/staging/fbtft/fbtft-core.c -@@ -76,21 +76,18 @@ static int fbtft_request_one_gpio(struct fbtft_par *par, - struct gpio_desc **gpiop) - { - struct device *dev = par->info->device; -- struct device_node *node = dev->of_node; - int ret = 0; - -- if (of_find_property(node, name, NULL)) { -- *gpiop = devm_gpiod_get_index(dev, dev->driver->name, index, -- GPIOD_OUT_HIGH); -- if (IS_ERR(*gpiop)) { -- ret = PTR_ERR(*gpiop); -- dev_err(dev, -- "Failed to request %s GPIO:%d\n", name, ret); -- return ret; -- } -- fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' GPIO\n", -- __func__, name); -+ *gpiop = devm_gpiod_get_index_optional(dev, name, index, -+ GPIOD_OUT_HIGH); -+ if (IS_ERR(*gpiop)) { -+ ret = PTR_ERR(*gpiop); -+ dev_err(dev, -+ "Failed to request %s GPIO: %d\n", name, ret); -+ return ret; - } -+ fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' GPIO\n", -+ __func__, name); - - return ret; - } -@@ -103,34 +100,34 @@ static int fbtft_request_gpios_dt(struct fbtft_par *par) - if (!par->info->device->of_node) - return -EINVAL; - -- ret = fbtft_request_one_gpio(par, "reset-gpios", 0, &par->gpio.reset); -+ ret = fbtft_request_one_gpio(par, "reset", 0, &par->gpio.reset); - if (ret) - return ret; -- ret = fbtft_request_one_gpio(par, "dc-gpios", 0, &par->gpio.dc); -+ ret = fbtft_request_one_gpio(par, "dc", 0, &par->gpio.dc); - if (ret) - return ret; -- ret = fbtft_request_one_gpio(par, "rd-gpios", 0, &par->gpio.rd); -+ ret = fbtft_request_one_gpio(par, "rd", 0, &par->gpio.rd); - if (ret) - return ret; -- ret = fbtft_request_one_gpio(par, "wr-gpios", 0, &par->gpio.wr); -+ ret = fbtft_request_one_gpio(par, "wr", 0, &par->gpio.wr); - if (ret) - return ret; -- ret = fbtft_request_one_gpio(par, "cs-gpios", 0, &par->gpio.cs); -+ ret = fbtft_request_one_gpio(par, "cs", 0, &par->gpio.cs); - if (ret) - return ret; -- ret = fbtft_request_one_gpio(par, "latch-gpios", 0, &par->gpio.latch); -+ ret = fbtft_request_one_gpio(par, "latch", 0, &par->gpio.latch); - if (ret) - return ret; - for (i = 0; i < 16; i++) { -- ret = fbtft_request_one_gpio(par, "db-gpios", i, -+ ret = fbtft_request_one_gpio(par, "db", i, - &par->gpio.db[i]); - if (ret) - return ret; -- ret = fbtft_request_one_gpio(par, "led-gpios", i, -+ ret = fbtft_request_one_gpio(par, "led", i, - &par->gpio.led[i]); - if (ret) - return ret; -- ret = fbtft_request_one_gpio(par, "aux-gpios", i, -+ ret = fbtft_request_one_gpio(par, "aux", i, - &par->gpio.aux[i]); - if (ret) - return ret; -@@ -234,9 +231,9 @@ static void fbtft_reset(struct fbtft_par *par) - if (!par->gpio.reset) - return; - fbtft_par_dbg(DEBUG_RESET, par, "%s()\n", __func__); -- gpiod_set_value_cansleep(par->gpio.reset, 0); -- usleep_range(20, 40); - gpiod_set_value_cansleep(par->gpio.reset, 1); -+ usleep_range(20, 40); -+ gpiod_set_value_cansleep(par->gpio.reset, 0); - msleep(120); - } - -diff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c -index e3c3e427309a..f73edaf6ce87 100644 ---- a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c -+++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c -@@ -1086,6 +1086,7 @@ static int port_switchdev_event(struct notifier_block *unused, - dev_hold(dev); - break; - default: -+ kfree(switchdev_work); - return NOTIFY_DONE; - } - -diff --git a/drivers/staging/gasket/apex_driver.c b/drivers/staging/gasket/apex_driver.c -index 2be45ee9d061..464648ee2036 100644 ---- a/drivers/staging/gasket/apex_driver.c -+++ b/drivers/staging/gasket/apex_driver.c -@@ -532,7 +532,7 @@ static ssize_t sysfs_show(struct device *device, struct device_attribute *attr, - break; - case ATTR_KERNEL_HIB_SIMPLE_PAGE_TABLE_SIZE: - ret = scnprintf(buf, PAGE_SIZE, "%u\n", -- gasket_page_table_num_entries( -+ gasket_page_table_num_simple_entries( - gasket_dev->page_table[0])); - break; - case ATTR_KERNEL_HIB_NUM_ACTIVE_PAGES: -diff --git a/drivers/staging/kpc2000/TODO b/drivers/staging/kpc2000/TODO -index 8c7af29fefae..ed951acc829a 100644 ---- a/drivers/staging/kpc2000/TODO -+++ b/drivers/staging/kpc2000/TODO -@@ -1,7 +1,6 @@ - - the kpc_spi driver doesn't seem to let multiple transactions (to different instances of the core) happen in parallel... - - The kpc_i2c driver is a hot mess, it should probably be cleaned up a ton. It functions against current hardware though. - - pcard->card_num in kp2000_pcie_probe() is a global variable and needs atomic / locking / something better. --- probe_core_uio() probably needs error handling - - the loop in kp2000_probe_cores() that uses probe_core_uio() also probably needs error handling - - would be nice if the AIO fileops in kpc_dma could be made to work - - probably want to add a CONFIG_ option to control compilation of the AIO functions -diff --git a/drivers/staging/kpc2000/kpc2000/cell_probe.c b/drivers/staging/kpc2000/kpc2000/cell_probe.c -index e0dba91e7fa8..d6b57f550876 100644 ---- a/drivers/staging/kpc2000/kpc2000/cell_probe.c -+++ b/drivers/staging/kpc2000/kpc2000/cell_probe.c -@@ -295,6 +295,7 @@ int probe_core_uio(unsigned int core_num, struct kp2000_device *pcard, char *na - kudev->dev = device_create(kpc_uio_class, &pcard->pdev->dev, MKDEV(0,0), kudev, "%s.%d.%d.%d", kudev->uioinfo.name, pcard->card_num, cte.type, kudev->core_num); - if (IS_ERR(kudev->dev)) { - dev_err(&pcard->pdev->dev, "probe_core_uio device_create failed!\n"); -+ kfree(kudev); - return -ENODEV; - } - dev_set_drvdata(kudev->dev, kudev); -@@ -302,6 +303,8 @@ int probe_core_uio(unsigned int core_num, struct kp2000_device *pcard, char *na - rv = uio_register_device(kudev->dev, &kudev->uioinfo); - if (rv){ - dev_err(&pcard->pdev->dev, "probe_core_uio failed uio_register_device: %d\n", rv); -+ put_device(kudev->dev); -+ kfree(kudev); - return rv; - } - -diff --git a/drivers/staging/kpc2000/kpc_spi/spi_driver.c b/drivers/staging/kpc2000/kpc_spi/spi_driver.c -index 86df16547a92..2f535022dc03 100644 ---- a/drivers/staging/kpc2000/kpc_spi/spi_driver.c -+++ b/drivers/staging/kpc2000/kpc_spi/spi_driver.c -@@ -333,7 +333,7 @@ kp_spi_transfer_one_message(struct spi_master *master, struct spi_message *m) - list_for_each_entry(transfer, &m->transfers, transfer_list) { - if (transfer->tx_buf == NULL && transfer->rx_buf == NULL && transfer->len) { - status = -EINVAL; -- break; -+ goto error; - } - - /* transfer */ -@@ -371,7 +371,7 @@ kp_spi_transfer_one_message(struct spi_master *master, struct spi_message *m) - - if (count != transfer->len) { - status = -EIO; -- break; -+ goto error; - } - } - -@@ -389,6 +389,10 @@ kp_spi_transfer_one_message(struct spi_master *master, struct spi_message *m) - /* done work */ - spi_finalize_current_message(master); - return 0; -+ -+ error: -+ m->status = status; -+ return status; - } - - static void -diff --git a/drivers/staging/media/davinci_vpfe/dm365_ipipe.c b/drivers/staging/media/davinci_vpfe/dm365_ipipe.c -index 30e2edc0cec5..b88855c7ffe8 100644 ---- a/drivers/staging/media/davinci_vpfe/dm365_ipipe.c -+++ b/drivers/staging/media/davinci_vpfe/dm365_ipipe.c -@@ -1251,10 +1251,10 @@ static int ipipe_s_config(struct v4l2_subdev *sd, struct vpfe_ipipe_config *cfg) - struct vpfe_ipipe_device *ipipe = v4l2_get_subdevdata(sd); - unsigned int i; - int rval = 0; -+ struct ipipe_module_params *params; - - for (i = 0; i < ARRAY_SIZE(ipipe_modules); i++) { - const struct ipipe_module_if *module_if; -- struct ipipe_module_params *params; - void *from, *to; - size_t size; - -@@ -1265,25 +1265,30 @@ static int ipipe_s_config(struct v4l2_subdev *sd, struct vpfe_ipipe_config *cfg) - from = *(void **)((void *)cfg + module_if->config_offset); - - params = kmalloc(sizeof(*params), GFP_KERNEL); -+ if (!params) -+ return -ENOMEM; - to = (void *)params + module_if->param_offset; - size = module_if->param_size; - - if (to && from && size) { - if (copy_from_user(to, (void __user *)from, size)) { - rval = -EFAULT; -- break; -+ goto error_free; - } - rval = module_if->set(ipipe, to); - if (rval) -- goto error; -+ goto error_free; - } else if (to && !from && size) { - rval = module_if->set(ipipe, NULL); - if (rval) -- goto error; -+ goto error_free; - } - kfree(params); - } --error: -+ return rval; -+ -+error_free: -+ kfree(params); - return rval; - } - -diff --git a/drivers/staging/media/davinci_vpfe/vpfe_video.c b/drivers/staging/media/davinci_vpfe/vpfe_video.c -index 510202a3b091..84cca18e3e9d 100644 ---- a/drivers/staging/media/davinci_vpfe/vpfe_video.c -+++ b/drivers/staging/media/davinci_vpfe/vpfe_video.c -@@ -419,6 +419,9 @@ static int vpfe_open(struct file *file) - /* If decoder is not initialized. initialize it */ - if (!video->initialized && vpfe_update_pipe_state(video)) { - mutex_unlock(&video->lock); -+ v4l2_fh_del(&handle->vfh); -+ v4l2_fh_exit(&handle->vfh); -+ kfree(handle); - return -ENODEV; - } - /* Increment device users counter */ -diff --git a/drivers/staging/media/imx/imx7-mipi-csis.c b/drivers/staging/media/imx/imx7-mipi-csis.c -index 19455f425416..7d7bdfdd852a 100644 ---- a/drivers/staging/media/imx/imx7-mipi-csis.c -+++ b/drivers/staging/media/imx/imx7-mipi-csis.c -@@ -456,13 +456,9 @@ static void mipi_csis_set_params(struct csi_state *state) - MIPI_CSIS_CMN_CTRL_UPDATE_SHADOW_CTRL); - } - --static void mipi_csis_clk_enable(struct csi_state *state) -+static int mipi_csis_clk_enable(struct csi_state *state) - { -- int ret; -- -- ret = clk_bulk_prepare_enable(state->num_clks, state->clks); -- if (ret < 0) -- dev_err(state->dev, "failed to enable clocks\n"); -+ return clk_bulk_prepare_enable(state->num_clks, state->clks); - } - - static void mipi_csis_clk_disable(struct csi_state *state) -@@ -973,7 +969,11 @@ static int mipi_csis_probe(struct platform_device *pdev) - if (ret < 0) - return ret; - -- mipi_csis_clk_enable(state); -+ ret = mipi_csis_clk_enable(state); -+ if (ret < 0) { -+ dev_err(state->dev, "failed to enable clocks: %d\n", ret); -+ return ret; -+ } - - ret = devm_request_irq(dev, state->irq, mipi_csis_irq_handler, - 0, dev_name(dev), state); -diff --git a/drivers/staging/mt7621-pci/pci-mt7621.c b/drivers/staging/mt7621-pci/pci-mt7621.c -index 03d919a94552..93763d40e3a1 100644 ---- a/drivers/staging/mt7621-pci/pci-mt7621.c -+++ b/drivers/staging/mt7621-pci/pci-mt7621.c -@@ -40,7 +40,7 @@ - /* MediaTek specific configuration registers */ - #define PCIE_FTS_NUM 0x70c - #define PCIE_FTS_NUM_MASK GENMASK(15, 8) --#define PCIE_FTS_NUM_L0(x) ((x) & 0xff << 8) -+#define PCIE_FTS_NUM_L0(x) (((x) & 0xff) << 8) - - /* rt_sysc_membase relative registers */ - #define RALINK_PCIE_CLK_GEN 0x7c -diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c -index a7230c0c7b23..8f5a8ac1b010 100644 ---- a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c -+++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c -@@ -124,10 +124,91 @@ static inline void handle_group_key(struct ieee_param *param, - } - } - --static noinline_for_stack char *translate_scan(struct _adapter *padapter, -- struct iw_request_info *info, -- struct wlan_network *pnetwork, -- char *start, char *stop) -+static noinline_for_stack char *translate_scan_wpa(struct iw_request_info *info, -+ struct wlan_network *pnetwork, -+ struct iw_event *iwe, -+ char *start, char *stop) -+{ -+ /* parsing WPA/WPA2 IE */ -+ u8 buf[MAX_WPA_IE_LEN]; -+ u8 wpa_ie[255], rsn_ie[255]; -+ u16 wpa_len = 0, rsn_len = 0; -+ int n, i; -+ -+ r8712_get_sec_ie(pnetwork->network.IEs, -+ pnetwork->network.IELength, rsn_ie, &rsn_len, -+ wpa_ie, &wpa_len); -+ if (wpa_len > 0) { -+ memset(buf, 0, MAX_WPA_IE_LEN); -+ n = sprintf(buf, "wpa_ie="); -+ for (i = 0; i < wpa_len; i++) { -+ n += snprintf(buf + n, MAX_WPA_IE_LEN - n, -+ "%02x", wpa_ie[i]); -+ if (n >= MAX_WPA_IE_LEN) -+ break; -+ } -+ memset(iwe, 0, sizeof(*iwe)); -+ iwe->cmd = IWEVCUSTOM; -+ iwe->u.data.length = (u16)strlen(buf); -+ start = iwe_stream_add_point(info, start, stop, -+ iwe, buf); -+ memset(iwe, 0, sizeof(*iwe)); -+ iwe->cmd = IWEVGENIE; -+ iwe->u.data.length = (u16)wpa_len; -+ start = iwe_stream_add_point(info, start, stop, -+ iwe, wpa_ie); -+ } -+ if (rsn_len > 0) { -+ memset(buf, 0, MAX_WPA_IE_LEN); -+ n = sprintf(buf, "rsn_ie="); -+ for (i = 0; i < rsn_len; i++) { -+ n += snprintf(buf + n, MAX_WPA_IE_LEN - n, -+ "%02x", rsn_ie[i]); -+ if (n >= MAX_WPA_IE_LEN) -+ break; -+ } -+ memset(iwe, 0, sizeof(*iwe)); -+ iwe->cmd = IWEVCUSTOM; -+ iwe->u.data.length = strlen(buf); -+ start = iwe_stream_add_point(info, start, stop, -+ iwe, buf); -+ memset(iwe, 0, sizeof(*iwe)); -+ iwe->cmd = IWEVGENIE; -+ iwe->u.data.length = rsn_len; -+ start = iwe_stream_add_point(info, start, stop, iwe, -+ rsn_ie); -+ } -+ -+ return start; -+} -+ -+static noinline_for_stack char *translate_scan_wps(struct iw_request_info *info, -+ struct wlan_network *pnetwork, -+ struct iw_event *iwe, -+ char *start, char *stop) -+{ -+ /* parsing WPS IE */ -+ u8 wps_ie[512]; -+ uint wps_ielen; -+ -+ if (r8712_get_wps_ie(pnetwork->network.IEs, -+ pnetwork->network.IELength, -+ wps_ie, &wps_ielen)) { -+ if (wps_ielen > 2) { -+ iwe->cmd = IWEVGENIE; -+ iwe->u.data.length = (u16)wps_ielen; -+ start = iwe_stream_add_point(info, start, stop, -+ iwe, wps_ie); -+ } -+ } -+ -+ return start; -+} -+ -+static char *translate_scan(struct _adapter *padapter, -+ struct iw_request_info *info, -+ struct wlan_network *pnetwork, -+ char *start, char *stop) - { - struct iw_event iwe; - struct ieee80211_ht_cap *pht_capie; -@@ -240,73 +321,11 @@ static noinline_for_stack char *translate_scan(struct _adapter *padapter, - /* Check if we added any event */ - if ((current_val - start) > iwe_stream_lcp_len(info)) - start = current_val; -- /* parsing WPA/WPA2 IE */ -- { -- u8 buf[MAX_WPA_IE_LEN]; -- u8 wpa_ie[255], rsn_ie[255]; -- u16 wpa_len = 0, rsn_len = 0; -- int n; -- -- r8712_get_sec_ie(pnetwork->network.IEs, -- pnetwork->network.IELength, rsn_ie, &rsn_len, -- wpa_ie, &wpa_len); -- if (wpa_len > 0) { -- memset(buf, 0, MAX_WPA_IE_LEN); -- n = sprintf(buf, "wpa_ie="); -- for (i = 0; i < wpa_len; i++) { -- n += snprintf(buf + n, MAX_WPA_IE_LEN - n, -- "%02x", wpa_ie[i]); -- if (n >= MAX_WPA_IE_LEN) -- break; -- } -- memset(&iwe, 0, sizeof(iwe)); -- iwe.cmd = IWEVCUSTOM; -- iwe.u.data.length = (u16)strlen(buf); -- start = iwe_stream_add_point(info, start, stop, -- &iwe, buf); -- memset(&iwe, 0, sizeof(iwe)); -- iwe.cmd = IWEVGENIE; -- iwe.u.data.length = (u16)wpa_len; -- start = iwe_stream_add_point(info, start, stop, -- &iwe, wpa_ie); -- } -- if (rsn_len > 0) { -- memset(buf, 0, MAX_WPA_IE_LEN); -- n = sprintf(buf, "rsn_ie="); -- for (i = 0; i < rsn_len; i++) { -- n += snprintf(buf + n, MAX_WPA_IE_LEN - n, -- "%02x", rsn_ie[i]); -- if (n >= MAX_WPA_IE_LEN) -- break; -- } -- memset(&iwe, 0, sizeof(iwe)); -- iwe.cmd = IWEVCUSTOM; -- iwe.u.data.length = strlen(buf); -- start = iwe_stream_add_point(info, start, stop, -- &iwe, buf); -- memset(&iwe, 0, sizeof(iwe)); -- iwe.cmd = IWEVGENIE; -- iwe.u.data.length = rsn_len; -- start = iwe_stream_add_point(info, start, stop, &iwe, -- rsn_ie); -- } -- } - -- { /* parsing WPS IE */ -- u8 wps_ie[512]; -- uint wps_ielen; -+ start = translate_scan_wpa(info, pnetwork, &iwe, start, stop); -+ -+ start = translate_scan_wps(info, pnetwork, &iwe, start, stop); - -- if (r8712_get_wps_ie(pnetwork->network.IEs, -- pnetwork->network.IELength, -- wps_ie, &wps_ielen)) { -- if (wps_ielen > 2) { -- iwe.cmd = IWEVGENIE; -- iwe.u.data.length = (u16)wps_ielen; -- start = iwe_stream_add_point(info, start, stop, -- &iwe, wps_ie); -- } -- } -- } - /* Add quality statistics */ - iwe.cmd = IWEVQUAL; - rssi = r8712_signal_scale_mapping(pnetwork->network.Rssi); -diff --git a/drivers/staging/rts5208/rtsx.c b/drivers/staging/rts5208/rtsx.c -index fa597953e9a0..685cf842badc 100644 ---- a/drivers/staging/rts5208/rtsx.c -+++ b/drivers/staging/rts5208/rtsx.c -@@ -490,7 +490,7 @@ static int rtsx_polling_thread(void *__dev) - - for (;;) { - set_current_state(TASK_INTERRUPTIBLE); -- schedule_timeout(msecs_to_jiffies(POLLING_INTERVAL)); -+ schedule_msec_hrtimeout((POLLING_INTERVAL)); - - /* lock the device pointers */ - mutex_lock(&dev->dev_mutex); -diff --git a/drivers/staging/speakup/speakup_acntpc.c b/drivers/staging/speakup/speakup_acntpc.c -index c94328a5bd4a..6e7d4671aa69 100644 ---- a/drivers/staging/speakup/speakup_acntpc.c -+++ b/drivers/staging/speakup/speakup_acntpc.c -@@ -198,7 +198,7 @@ static void do_catch_up(struct spk_synth *synth) - full_time_val = full_time->u.n.value; - spin_unlock_irqrestore(&speakup_info.spinlock, flags); - if (synth_full()) { -- schedule_timeout(msecs_to_jiffies(full_time_val)); -+ schedule_msec_hrtimeout((full_time_val)); - continue; - } - set_current_state(TASK_RUNNING); -@@ -226,7 +226,7 @@ static void do_catch_up(struct spk_synth *synth) - jiffy_delta_val = jiffy_delta->u.n.value; - delay_time_val = delay_time->u.n.value; - spin_unlock_irqrestore(&speakup_info.spinlock, flags); -- schedule_timeout(msecs_to_jiffies(delay_time_val)); -+ schedule_msec_hrtimeout(delay_time_val); - jiff_max = jiffies + jiffy_delta_val; - } - } -diff --git a/drivers/staging/speakup/speakup_apollo.c b/drivers/staging/speakup/speakup_apollo.c -index 0877b4044c28..627102d048c1 100644 ---- a/drivers/staging/speakup/speakup_apollo.c -+++ b/drivers/staging/speakup/speakup_apollo.c -@@ -165,7 +165,7 @@ static void do_catch_up(struct spk_synth *synth) - if (!synth->io_ops->synth_out(synth, ch)) { - synth->io_ops->tiocmset(0, UART_MCR_RTS); - synth->io_ops->tiocmset(UART_MCR_RTS, 0); -- schedule_timeout(msecs_to_jiffies(full_time_val)); -+ schedule_msec_hrtimeout(full_time_val); - continue; - } - if (time_after_eq(jiffies, jiff_max) && (ch == SPACE)) { -diff --git a/drivers/staging/speakup/speakup_decext.c b/drivers/staging/speakup/speakup_decext.c -index ddbb7e97d118..f9502addc765 100644 ---- a/drivers/staging/speakup/speakup_decext.c -+++ b/drivers/staging/speakup/speakup_decext.c -@@ -176,7 +176,7 @@ static void do_catch_up(struct spk_synth *synth) - if (ch == '\n') - ch = 0x0D; - if (synth_full() || !synth->io_ops->synth_out(synth, ch)) { -- schedule_timeout(msecs_to_jiffies(delay_time_val)); -+ schedule_msec_hrtimeout(delay_time_val); - continue; - } - set_current_state(TASK_RUNNING); -diff --git a/drivers/staging/speakup/speakup_decpc.c b/drivers/staging/speakup/speakup_decpc.c -index 798c42dfa16c..d85b41db67a3 100644 ---- a/drivers/staging/speakup/speakup_decpc.c -+++ b/drivers/staging/speakup/speakup_decpc.c -@@ -394,7 +394,7 @@ static void do_catch_up(struct spk_synth *synth) - if (ch == '\n') - ch = 0x0D; - if (dt_sendchar(ch)) { -- schedule_timeout(msecs_to_jiffies(delay_time_val)); -+ schedule_msec_hrtimeout((delay_time_val)); - continue; - } - set_current_state(TASK_RUNNING); -diff --git a/drivers/staging/speakup/speakup_dectlk.c b/drivers/staging/speakup/speakup_dectlk.c -index dccb4ea29d37..8ecead307d04 100644 ---- a/drivers/staging/speakup/speakup_dectlk.c -+++ b/drivers/staging/speakup/speakup_dectlk.c -@@ -244,7 +244,7 @@ static void do_catch_up(struct spk_synth *synth) - if (ch == '\n') - ch = 0x0D; - if (synth_full_val || !synth->io_ops->synth_out(synth, ch)) { -- schedule_timeout(msecs_to_jiffies(delay_time_val)); -+ schedule_msec_hrtimeout(delay_time_val); - continue; - } - set_current_state(TASK_RUNNING); -diff --git a/drivers/staging/speakup/speakup_dtlk.c b/drivers/staging/speakup/speakup_dtlk.c -index dbebed0eeeec..6d83c13ca4a6 100644 ---- a/drivers/staging/speakup/speakup_dtlk.c -+++ b/drivers/staging/speakup/speakup_dtlk.c -@@ -211,7 +211,7 @@ static void do_catch_up(struct spk_synth *synth) - delay_time_val = delay_time->u.n.value; - spin_unlock_irqrestore(&speakup_info.spinlock, flags); - if (synth_full()) { -- schedule_timeout(msecs_to_jiffies(delay_time_val)); -+ schedule_msec_hrtimeout((delay_time_val)); - continue; - } - set_current_state(TASK_RUNNING); -@@ -227,7 +227,7 @@ static void do_catch_up(struct spk_synth *synth) - delay_time_val = delay_time->u.n.value; - jiffy_delta_val = jiffy_delta->u.n.value; - spin_unlock_irqrestore(&speakup_info.spinlock, flags); -- schedule_timeout(msecs_to_jiffies(delay_time_val)); -+ schedule_msec_hrtimeout((delay_time_val)); - jiff_max = jiffies + jiffy_delta_val; - } - } -diff --git a/drivers/staging/speakup/speakup_keypc.c b/drivers/staging/speakup/speakup_keypc.c -index 414827e888fc..cb31c9176daa 100644 ---- a/drivers/staging/speakup/speakup_keypc.c -+++ b/drivers/staging/speakup/speakup_keypc.c -@@ -199,7 +199,7 @@ static void do_catch_up(struct spk_synth *synth) - full_time_val = full_time->u.n.value; - spin_unlock_irqrestore(&speakup_info.spinlock, flags); - if (synth_full()) { -- schedule_timeout(msecs_to_jiffies(full_time_val)); -+ schedule_msec_hrtimeout((full_time_val)); - continue; - } - set_current_state(TASK_RUNNING); -@@ -232,7 +232,7 @@ static void do_catch_up(struct spk_synth *synth) - jiffy_delta_val = jiffy_delta->u.n.value; - delay_time_val = delay_time->u.n.value; - spin_unlock_irqrestore(&speakup_info.spinlock, flags); -- schedule_timeout(msecs_to_jiffies(delay_time_val)); -+ schedule_msec_hrtimeout(delay_time_val); - jiff_max = jiffies + jiffy_delta_val; - } - } -diff --git a/drivers/staging/speakup/synth.c b/drivers/staging/speakup/synth.c -index 3568bfb89912..a5540729a9ee 100644 ---- a/drivers/staging/speakup/synth.c -+++ b/drivers/staging/speakup/synth.c -@@ -98,7 +98,7 @@ static void _spk_do_catch_up(struct spk_synth *synth, int unicode) - else - ret = synth->io_ops->synth_out(synth, ch); - if (!ret) { -- schedule_timeout(msecs_to_jiffies(full_time_val)); -+ schedule_msec_hrtimeout(full_time_val); - continue; - } - if (time_after_eq(jiffies, jiff_max) && (ch == SPACE)) { -@@ -108,11 +108,9 @@ static void _spk_do_catch_up(struct spk_synth *synth, int unicode) - full_time_val = full_time->u.n.value; - spin_unlock_irqrestore(&speakup_info.spinlock, flags); - if (synth->io_ops->synth_out(synth, synth->procspeech)) -- schedule_timeout( -- msecs_to_jiffies(delay_time_val)); -+ schedule_msec_hrtimeout(delay_time_val); - else -- schedule_timeout( -- msecs_to_jiffies(full_time_val)); -+ schedule_msec_hrtimeout(full_time_val); - jiff_max = jiffies + jiffy_delta_val; - } - set_current_state(TASK_RUNNING); -diff --git a/drivers/staging/unisys/visornic/visornic_main.c b/drivers/staging/unisys/visornic/visornic_main.c -index 1c1a470d2e50..cbac00e586b0 100644 ---- a/drivers/staging/unisys/visornic/visornic_main.c -+++ b/drivers/staging/unisys/visornic/visornic_main.c -@@ -549,7 +549,7 @@ static int visornic_disable_with_timeout(struct net_device *netdev, - } - set_current_state(TASK_INTERRUPTIBLE); - spin_unlock_irqrestore(&devdata->priv_lock, flags); -- wait += schedule_timeout(msecs_to_jiffies(10)); -+ wait += schedule_msec_hrtimeout((10)); - spin_lock_irqsave(&devdata->priv_lock, flags); - } - -@@ -560,7 +560,7 @@ static int visornic_disable_with_timeout(struct net_device *netdev, - while (1) { - set_current_state(TASK_INTERRUPTIBLE); - spin_unlock_irqrestore(&devdata->priv_lock, flags); -- schedule_timeout(msecs_to_jiffies(10)); -+ schedule_msec_hrtimeout((10)); - spin_lock_irqsave(&devdata->priv_lock, flags); - if (atomic_read(&devdata->usage)) - break; -@@ -714,7 +714,7 @@ static int visornic_enable_with_timeout(struct net_device *netdev, - } - set_current_state(TASK_INTERRUPTIBLE); - spin_unlock_irqrestore(&devdata->priv_lock, flags); -- wait += schedule_timeout(msecs_to_jiffies(10)); -+ wait += schedule_msec_hrtimeout((10)); - spin_lock_irqsave(&devdata->priv_lock, flags); - } - -diff --git a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c -index 68f08dc18da9..5e9187edeef4 100644 ---- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c -+++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c -@@ -336,16 +336,13 @@ static void buffer_cb(struct vchiq_mmal_instance *instance, - return; - } else if (length == 0) { - /* stream ended */ -- if (buf) { -- /* this should only ever happen if the port is -- * disabled and there are buffers still queued -+ if (dev->capture.frame_count) { -+ /* empty buffer whilst capturing - expected to be an -+ * EOS, so grab another frame - */ -- vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); -- pr_debug("Empty buffer"); -- } else if (dev->capture.frame_count) { -- /* grab another frame */ - if (is_capturing(dev)) { -- pr_debug("Grab another frame"); -+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, -+ "Grab another frame"); - vchiq_mmal_port_parameter_set( - instance, - dev->capture.camera_port, -@@ -353,8 +350,14 @@ static void buffer_cb(struct vchiq_mmal_instance *instance, - &dev->capture.frame_count, - sizeof(dev->capture.frame_count)); - } -+ if (vchiq_mmal_submit_buffer(instance, port, buf)) -+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, -+ "Failed to return EOS buffer"); - } else { -- /* signal frame completion */ -+ /* stopping streaming. -+ * return buffer, and signal frame completion -+ */ -+ vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); - complete(&dev->capture.frame_cmplt); - } - } else { -@@ -576,6 +579,7 @@ static void stop_streaming(struct vb2_queue *vq) - int ret; - unsigned long timeout; - struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vq); -+ struct vchiq_mmal_port *port = dev->capture.port; - - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p\n", - __func__, dev); -@@ -599,12 +603,6 @@ static void stop_streaming(struct vb2_queue *vq) - &dev->capture.frame_count, - sizeof(dev->capture.frame_count)); - -- /* wait for last frame to complete */ -- timeout = wait_for_completion_timeout(&dev->capture.frame_cmplt, HZ); -- if (timeout == 0) -- v4l2_err(&dev->v4l2_dev, -- "timed out waiting for frame completion\n"); -- - v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, - "disabling connection\n"); - -@@ -619,6 +617,21 @@ static void stop_streaming(struct vb2_queue *vq) - ret); - } - -+ /* wait for all buffers to be returned */ -+ while (atomic_read(&port->buffers_with_vpu)) { -+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, -+ "%s: Waiting for buffers to be returned - %d outstanding\n", -+ __func__, atomic_read(&port->buffers_with_vpu)); -+ timeout = wait_for_completion_timeout(&dev->capture.frame_cmplt, -+ HZ); -+ if (timeout == 0) { -+ v4l2_err(&dev->v4l2_dev, "%s: Timeout waiting for buffers to be returned - %d outstanding\n", -+ __func__, -+ atomic_read(&port->buffers_with_vpu)); -+ break; -+ } -+ } -+ - if (disable_camera(dev) < 0) - v4l2_err(&dev->v4l2_dev, "Failed to disable camera\n"); - } -diff --git a/drivers/staging/vc04_services/bcm2835-camera/controls.c b/drivers/staging/vc04_services/bcm2835-camera/controls.c -index dade79738a29..12ac3ef61fe6 100644 ---- a/drivers/staging/vc04_services/bcm2835-camera/controls.c -+++ b/drivers/staging/vc04_services/bcm2835-camera/controls.c -@@ -603,15 +603,28 @@ static int ctrl_set_bitrate(struct bm2835_mmal_dev *dev, - struct v4l2_ctrl *ctrl, - const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl) - { -+ int ret; - struct vchiq_mmal_port *encoder_out; - - dev->capture.encode_bitrate = ctrl->val; - - encoder_out = &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0]; - -- return vchiq_mmal_port_parameter_set(dev->instance, encoder_out, -- mmal_ctrl->mmal_id, &ctrl->val, -- sizeof(ctrl->val)); -+ ret = vchiq_mmal_port_parameter_set(dev->instance, encoder_out, -+ mmal_ctrl->mmal_id, &ctrl->val, -+ sizeof(ctrl->val)); -+ -+ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, -+ "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n", -+ __func__, mmal_ctrl, ctrl->id, ctrl->val, ret, -+ (ret == 0 ? 0 : -EINVAL)); -+ -+ /* -+ * Older firmware versions (pre July 2019) have a bug in handling -+ * MMAL_PARAMETER_VIDEO_BIT_RATE that result in the call -+ * returning -MMAL_MSG_STATUS_EINVAL. So ignore errors from this call. -+ */ -+ return 0; - } - - static int ctrl_set_bitrate_mode(struct bm2835_mmal_dev *dev, -diff --git a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c b/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c -index 16af735af5c3..29761f6c3b55 100644 ---- a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c -+++ b/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c -@@ -161,7 +161,8 @@ struct vchiq_mmal_instance { - void *bulk_scratch; - - struct idr context_map; -- spinlock_t context_map_lock; -+ /* protect accesses to context_map */ -+ struct mutex context_map_lock; - - /* component to use next */ - int component_idx; -@@ -184,10 +185,10 @@ get_msg_context(struct vchiq_mmal_instance *instance) - * that when we service the VCHI reply, we can look up what - * message is being replied to. - */ -- spin_lock(&instance->context_map_lock); -+ mutex_lock(&instance->context_map_lock); - handle = idr_alloc(&instance->context_map, msg_context, - 0, 0, GFP_KERNEL); -- spin_unlock(&instance->context_map_lock); -+ mutex_unlock(&instance->context_map_lock); - - if (handle < 0) { - kfree(msg_context); -@@ -211,9 +212,9 @@ release_msg_context(struct mmal_msg_context *msg_context) - { - struct vchiq_mmal_instance *instance = msg_context->instance; - -- spin_lock(&instance->context_map_lock); -+ mutex_lock(&instance->context_map_lock); - idr_remove(&instance->context_map, msg_context->handle); -- spin_unlock(&instance->context_map_lock); -+ mutex_unlock(&instance->context_map_lock); - kfree(msg_context); - } - -@@ -239,6 +240,8 @@ static void buffer_work_cb(struct work_struct *work) - struct mmal_msg_context *msg_context = - container_of(work, struct mmal_msg_context, u.bulk.work); - -+ atomic_dec(&msg_context->u.bulk.port->buffers_with_vpu); -+ - msg_context->u.bulk.port->buffer_cb(msg_context->u.bulk.instance, - msg_context->u.bulk.port, - msg_context->u.bulk.status, -@@ -287,8 +290,6 @@ static int bulk_receive(struct vchiq_mmal_instance *instance, - - /* store length */ - msg_context->u.bulk.buffer_used = rd_len; -- msg_context->u.bulk.mmal_flags = -- msg->u.buffer_from_host.buffer_header.flags; - msg_context->u.bulk.dts = msg->u.buffer_from_host.buffer_header.dts; - msg_context->u.bulk.pts = msg->u.buffer_from_host.buffer_header.pts; - -@@ -379,6 +380,8 @@ buffer_from_host(struct vchiq_mmal_instance *instance, - /* initialise work structure ready to schedule callback */ - INIT_WORK(&msg_context->u.bulk.work, buffer_work_cb); - -+ atomic_inc(&port->buffers_with_vpu); -+ - /* prep the buffer from host message */ - memset(&m, 0xbc, sizeof(m)); /* just to make debug clearer */ - -@@ -447,6 +450,9 @@ static void buffer_to_host_cb(struct vchiq_mmal_instance *instance, - return; - } - -+ msg_context->u.bulk.mmal_flags = -+ msg->u.buffer_from_host.buffer_header.flags; -+ - if (msg->h.status != MMAL_MSG_STATUS_SUCCESS) { - /* message reception had an error */ - pr_warn("error %d in reply\n", msg->h.status); -@@ -1323,16 +1329,6 @@ static int port_enable(struct vchiq_mmal_instance *instance, - if (port->enabled) - return 0; - -- /* ensure there are enough buffers queued to cover the buffer headers */ -- if (port->buffer_cb) { -- hdr_count = 0; -- list_for_each(buf_head, &port->buffers) { -- hdr_count++; -- } -- if (hdr_count < port->current_buffer.num) -- return -ENOSPC; -- } -- - ret = port_action_port(instance, port, - MMAL_MSG_PORT_ACTION_TYPE_ENABLE); - if (ret) -@@ -1849,7 +1845,7 @@ int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance) - - instance->bulk_scratch = vmalloc(PAGE_SIZE); - -- spin_lock_init(&instance->context_map_lock); -+ mutex_init(&instance->context_map_lock); - idr_init_base(&instance->context_map, 1); - - params.callback_param = instance; -diff --git a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.h b/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.h -index 22b839ecd5f0..b0ee1716525b 100644 ---- a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.h -+++ b/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.h -@@ -71,6 +71,9 @@ struct vchiq_mmal_port { - struct list_head buffers; - /* lock to serialise adding and removing buffers from list */ - spinlock_t slock; -+ -+ /* Count of buffers the VPU has yet to return */ -+ atomic_t buffers_with_vpu; - /* callback on buffer completion */ - vchiq_mmal_buffer_cb buffer_cb; - /* callback context */ -diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c -index c557c9953724..aa20fcaefa9d 100644 ---- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c -+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c -@@ -523,7 +523,7 @@ create_pagelist(char __user *buf, size_t count, unsigned short type) - (g_cache_line_size - 1)))) { - char *fragments; - -- if (down_killable(&g_free_fragments_sema)) { -+ if (down_interruptible(&g_free_fragments_sema) != 0) { - cleanup_pagelistinfo(pagelistinfo); - return NULL; - } -diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c -index ab7d6a0ce94c..62d8f599e765 100644 ---- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c -+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c -@@ -532,7 +532,8 @@ add_completion(VCHIQ_INSTANCE_T instance, VCHIQ_REASON_T reason, - vchiq_log_trace(vchiq_arm_log_level, - "%s - completion queue full", __func__); - DEBUG_COUNT(COMPLETION_QUEUE_FULL_COUNT); -- if (wait_for_completion_killable(&instance->remove_event)) { -+ if (wait_for_completion_interruptible( -+ &instance->remove_event)) { - vchiq_log_info(vchiq_arm_log_level, - "service_callback interrupted"); - return VCHIQ_RETRY; -@@ -643,7 +644,7 @@ service_callback(VCHIQ_REASON_T reason, struct vchiq_header *header, - } - - DEBUG_TRACE(SERVICE_CALLBACK_LINE); -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &user_service->remove_event) - != 0) { - vchiq_log_info(vchiq_arm_log_level, -@@ -978,7 +979,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) - has been closed until the client library calls the - CLOSE_DELIVERED ioctl, signalling close_event. */ - if (user_service->close_pending && -- wait_for_completion_killable( -+ wait_for_completion_interruptible( - &user_service->close_event)) - status = VCHIQ_RETRY; - break; -@@ -1154,7 +1155,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) - - DEBUG_TRACE(AWAIT_COMPLETION_LINE); - mutex_unlock(&instance->completion_mutex); -- rc = wait_for_completion_killable( -+ rc = wait_for_completion_interruptible( - &instance->insert_event); - mutex_lock(&instance->completion_mutex); - if (rc != 0) { -@@ -1324,7 +1325,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) - do { - spin_unlock(&msg_queue_spinlock); - DEBUG_TRACE(DEQUEUE_MESSAGE_LINE); -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &user_service->insert_event)) { - vchiq_log_info(vchiq_arm_log_level, - "DEQUEUE_MESSAGE interrupted"); -@@ -2328,7 +2329,7 @@ vchiq_keepalive_thread_func(void *v) - while (1) { - long rc = 0, uc = 0; - -- if (wait_for_completion_killable(&arm_state->ka_evt) -+ if (wait_for_completion_interruptible(&arm_state->ka_evt) - != 0) { - vchiq_log_error(vchiq_susp_log_level, - "%s interrupted", __func__); -@@ -2579,7 +2580,7 @@ block_resume(struct vchiq_arm_state *arm_state) - write_unlock_bh(&arm_state->susp_res_lock); - vchiq_log_info(vchiq_susp_log_level, "%s wait for previously " - "blocked clients", __func__); -- if (wait_for_completion_killable_timeout( -+ if (wait_for_completion_interruptible_timeout( - &arm_state->blocked_blocker, timeout_val) - <= 0) { - vchiq_log_error(vchiq_susp_log_level, "%s wait for " -@@ -2605,7 +2606,7 @@ block_resume(struct vchiq_arm_state *arm_state) - write_unlock_bh(&arm_state->susp_res_lock); - vchiq_log_info(vchiq_susp_log_level, "%s wait for resume", - __func__); -- if (wait_for_completion_killable_timeout( -+ if (wait_for_completion_interruptible_timeout( - &arm_state->vc_resume_complete, timeout_val) - <= 0) { - vchiq_log_error(vchiq_susp_log_level, "%s wait for " -@@ -2812,7 +2813,7 @@ vchiq_arm_force_suspend(struct vchiq_state *state) - do { - write_unlock_bh(&arm_state->susp_res_lock); - -- rc = wait_for_completion_killable_timeout( -+ rc = wait_for_completion_interruptible_timeout( - &arm_state->vc_suspend_complete, - msecs_to_jiffies(FORCE_SUSPEND_TIMEOUT_MS)); - -@@ -2908,7 +2909,7 @@ vchiq_arm_allow_resume(struct vchiq_state *state) - write_unlock_bh(&arm_state->susp_res_lock); - - if (resume) { -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &arm_state->vc_resume_complete) < 0) { - vchiq_log_error(vchiq_susp_log_level, - "%s interrupted", __func__); -diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c -index 0c387b6473a5..44bfa890e0e5 100644 ---- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c -+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c -@@ -395,13 +395,21 @@ remote_event_create(wait_queue_head_t *wq, struct remote_event *event) - init_waitqueue_head(wq); - } - -+/* -+ * All the event waiting routines in VCHIQ used a custom semaphore -+ * implementation that filtered most signals. This achieved a behaviour similar -+ * to the "killable" family of functions. While cleaning up this code all the -+ * routines where switched to the "interruptible" family of functions, as the -+ * former was deemed unjustified and the use "killable" set all VCHIQ's -+ * threads in D state. -+ */ - static inline int - remote_event_wait(wait_queue_head_t *wq, struct remote_event *event) - { - if (!event->fired) { - event->armed = 1; - dsb(sy); -- if (wait_event_killable(*wq, event->fired)) { -+ if (wait_event_interruptible(*wq, event->fired)) { - event->armed = 0; - return 0; - } -@@ -560,7 +568,7 @@ reserve_space(struct vchiq_state *state, size_t space, int is_blocking) - remote_event_signal(&state->remote->trigger); - - if (!is_blocking || -- (wait_for_completion_killable( -+ (wait_for_completion_interruptible( - &state->slot_available_event))) - return NULL; /* No space available */ - } -@@ -830,7 +838,7 @@ queue_message(struct vchiq_state *state, struct vchiq_service *service, - spin_unlock("a_spinlock); - mutex_unlock(&state->slot_mutex); - -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &state->data_quota_event)) - return VCHIQ_RETRY; - -@@ -861,7 +869,7 @@ queue_message(struct vchiq_state *state, struct vchiq_service *service, - service_quota->slot_use_count); - VCHIQ_SERVICE_STATS_INC(service, quota_stalls); - mutex_unlock(&state->slot_mutex); -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &service_quota->quota_event)) - return VCHIQ_RETRY; - if (service->closing) -@@ -1710,7 +1718,8 @@ parse_rx_slots(struct vchiq_state *state) - &service->bulk_rx : &service->bulk_tx; - - DEBUG_TRACE(PARSE_LINE); -- if (mutex_lock_killable(&service->bulk_mutex)) { -+ if (mutex_lock_killable( -+ &service->bulk_mutex) != 0) { - DEBUG_TRACE(PARSE_LINE); - goto bail_not_ready; - } -@@ -2428,7 +2437,7 @@ vchiq_open_service_internal(struct vchiq_service *service, int client_id) - QMFLAGS_IS_BLOCKING); - if (status == VCHIQ_SUCCESS) { - /* Wait for the ACK/NAK */ -- if (wait_for_completion_killable(&service->remove_event)) { -+ if (wait_for_completion_interruptible(&service->remove_event)) { - status = VCHIQ_RETRY; - vchiq_release_service_internal(service); - } else if ((service->srvstate != VCHIQ_SRVSTATE_OPEN) && -@@ -2795,7 +2804,7 @@ vchiq_connect_internal(struct vchiq_state *state, VCHIQ_INSTANCE_T instance) - } - - if (state->conn_state == VCHIQ_CONNSTATE_CONNECTING) { -- if (wait_for_completion_killable(&state->connect)) -+ if (wait_for_completion_interruptible(&state->connect)) - return VCHIQ_RETRY; - - vchiq_set_conn_state(state, VCHIQ_CONNSTATE_CONNECTED); -@@ -2894,7 +2903,7 @@ vchiq_close_service(VCHIQ_SERVICE_HANDLE_T handle) - } - - while (1) { -- if (wait_for_completion_killable(&service->remove_event)) { -+ if (wait_for_completion_interruptible(&service->remove_event)) { - status = VCHIQ_RETRY; - break; - } -@@ -2955,7 +2964,7 @@ vchiq_remove_service(VCHIQ_SERVICE_HANDLE_T handle) - request_poll(service->state, service, VCHIQ_POLL_REMOVE); - } - while (1) { -- if (wait_for_completion_killable(&service->remove_event)) { -+ if (wait_for_completion_interruptible(&service->remove_event)) { - status = VCHIQ_RETRY; - break; - } -@@ -3038,7 +3047,7 @@ VCHIQ_STATUS_T vchiq_bulk_transfer(VCHIQ_SERVICE_HANDLE_T handle, - VCHIQ_SERVICE_STATS_INC(service, bulk_stalls); - do { - mutex_unlock(&service->bulk_mutex); -- if (wait_for_completion_killable( -+ if (wait_for_completion_interruptible( - &service->bulk_remove_event)) { - status = VCHIQ_RETRY; - goto error_exit; -@@ -3115,7 +3124,7 @@ VCHIQ_STATUS_T vchiq_bulk_transfer(VCHIQ_SERVICE_HANDLE_T handle, - - if (bulk_waiter) { - bulk_waiter->bulk = bulk; -- if (wait_for_completion_killable(&bulk_waiter->event)) -+ if (wait_for_completion_interruptible(&bulk_waiter->event)) - status = VCHIQ_RETRY; - else if (bulk_waiter->actual == VCHIQ_BULK_ACTUAL_ABORTED) - status = VCHIQ_ERROR; -diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c -index 6c519d8e48cb..8ee85c5e6f77 100644 ---- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c -+++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c -@@ -50,7 +50,7 @@ void vchiu_queue_push(struct vchiu_queue *queue, struct vchiq_header *header) - return; - - while (queue->write == queue->read + queue->size) { -- if (wait_for_completion_killable(&queue->pop)) -+ if (wait_for_completion_interruptible(&queue->pop)) - flush_signals(current); - } - -@@ -63,7 +63,7 @@ void vchiu_queue_push(struct vchiu_queue *queue, struct vchiq_header *header) - struct vchiq_header *vchiu_queue_peek(struct vchiu_queue *queue) - { - while (queue->write == queue->read) { -- if (wait_for_completion_killable(&queue->push)) -+ if (wait_for_completion_interruptible(&queue->push)) - flush_signals(current); - } - -@@ -77,7 +77,7 @@ struct vchiq_header *vchiu_queue_pop(struct vchiu_queue *queue) - struct vchiq_header *header; - - while (queue->write == queue->read) { -- if (wait_for_completion_killable(&queue->push)) -+ if (wait_for_completion_interruptible(&queue->push)) - flush_signals(current); - } - -diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c -index ccafcc2c87ac..70433f756d8e 100644 ---- a/drivers/staging/vt6656/main_usb.c -+++ b/drivers/staging/vt6656/main_usb.c -@@ -402,16 +402,19 @@ static void vnt_free_int_bufs(struct vnt_private *priv) - kfree(priv->int_buf.data_buf); - } - --static bool vnt_alloc_bufs(struct vnt_private *priv) -+static int vnt_alloc_bufs(struct vnt_private *priv) - { -+ int ret = 0; - struct vnt_usb_send_context *tx_context; - struct vnt_rcb *rcb; - int ii; - - for (ii = 0; ii < priv->num_tx_context; ii++) { - tx_context = kmalloc(sizeof(*tx_context), GFP_KERNEL); -- if (!tx_context) -+ if (!tx_context) { -+ ret = -ENOMEM; - goto free_tx; -+ } - - priv->tx_context[ii] = tx_context; - tx_context->priv = priv; -@@ -419,16 +422,20 @@ static bool vnt_alloc_bufs(struct vnt_private *priv) - - /* allocate URBs */ - tx_context->urb = usb_alloc_urb(0, GFP_KERNEL); -- if (!tx_context->urb) -+ if (!tx_context->urb) { -+ ret = -ENOMEM; - goto free_tx; -+ } - - tx_context->in_use = false; - } - - for (ii = 0; ii < priv->num_rcb; ii++) { - priv->rcb[ii] = kzalloc(sizeof(*priv->rcb[ii]), GFP_KERNEL); -- if (!priv->rcb[ii]) -+ if (!priv->rcb[ii]) { -+ ret = -ENOMEM; - goto free_rx_tx; -+ } - - rcb = priv->rcb[ii]; - -@@ -436,39 +443,46 @@ static bool vnt_alloc_bufs(struct vnt_private *priv) - - /* allocate URBs */ - rcb->urb = usb_alloc_urb(0, GFP_KERNEL); -- if (!rcb->urb) -+ if (!rcb->urb) { -+ ret = -ENOMEM; - goto free_rx_tx; -+ } - - rcb->skb = dev_alloc_skb(priv->rx_buf_sz); -- if (!rcb->skb) -+ if (!rcb->skb) { -+ ret = -ENOMEM; - goto free_rx_tx; -+ } - - rcb->in_use = false; - - /* submit rx urb */ -- if (vnt_submit_rx_urb(priv, rcb)) -+ ret = vnt_submit_rx_urb(priv, rcb); -+ if (ret) - goto free_rx_tx; - } - - priv->interrupt_urb = usb_alloc_urb(0, GFP_KERNEL); -- if (!priv->interrupt_urb) -+ if (!priv->interrupt_urb) { -+ ret = -ENOMEM; - goto free_rx_tx; -+ } - - priv->int_buf.data_buf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL); - if (!priv->int_buf.data_buf) { -- usb_free_urb(priv->interrupt_urb); -- goto free_rx_tx; -+ ret = -ENOMEM; -+ goto free_rx_tx_urb; - } - -- return true; -+ return 0; - -+free_rx_tx_urb: -+ usb_free_urb(priv->interrupt_urb); - free_rx_tx: - vnt_free_rx_bufs(priv); -- - free_tx: - vnt_free_tx_bufs(priv); -- -- return false; -+ return ret; - } - - static void vnt_tx_80211(struct ieee80211_hw *hw, -diff --git a/drivers/staging/wilc1000/wilc_netdev.c b/drivers/staging/wilc1000/wilc_netdev.c -index ba78c08a17f1..5338d7d2b248 100644 ---- a/drivers/staging/wilc1000/wilc_netdev.c -+++ b/drivers/staging/wilc1000/wilc_netdev.c -@@ -530,17 +530,17 @@ static int wilc_wlan_initialize(struct net_device *dev, struct wilc_vif *vif) - goto fail_locks; - } - -- if (wl->gpio_irq && init_irq(dev)) { -- ret = -EIO; -- goto fail_locks; -- } -- - ret = wlan_initialize_threads(dev); - if (ret < 0) { - ret = -EIO; - goto fail_wilc_wlan; - } - -+ if (wl->gpio_irq && init_irq(dev)) { -+ ret = -EIO; -+ goto fail_threads; -+ } -+ - if (!wl->dev_irq_num && - wl->hif_func->enable_interrupt && - wl->hif_func->enable_interrupt(wl)) { -@@ -596,7 +596,7 @@ static int wilc_wlan_initialize(struct net_device *dev, struct wilc_vif *vif) - fail_irq_init: - if (wl->dev_irq_num) - deinit_irq(dev); -- -+fail_threads: - wlan_deinitialize_threads(dev); - fail_wilc_wlan: - wilc_wlan_cleanup(dev); -diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c -index f6825727bf77..3592b545246c 100644 ---- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c -+++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c -@@ -1789,6 +1789,7 @@ void wilc_deinit_host_int(struct net_device *net) - - priv->p2p_listen_state = false; - -+ flush_workqueue(vif->wilc->hif_workqueue); - mutex_destroy(&priv->scan_req_lock); - ret = wilc_deinit(vif); - -diff --git a/drivers/tty/Kconfig b/drivers/tty/Kconfig -index 3b1d312bb175..6b434c7234f0 100644 ---- a/drivers/tty/Kconfig -+++ b/drivers/tty/Kconfig -@@ -76,6 +76,19 @@ config VT_CONSOLE_SLEEP - def_bool y - depends on VT_CONSOLE && PM_SLEEP - -+config NR_TTY_DEVICES -+ int "Maximum tty device number" -+ depends on VT -+ range 12 63 -+ default 63 -+ ---help--- -+ This option is used to change the number of tty devices in /dev. -+ The default value is 63. The lowest number you can set is 12, -+ 63 is also the upper limit so we don't overrun the serial -+ consoles. -+ -+ If unsure, say 63. -+ - config HW_CONSOLE - bool - depends on VT && !UML -diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c -index d2f3310abe54..eb2e2d141c01 100644 ---- a/drivers/tty/serial/8250/8250_port.c -+++ b/drivers/tty/serial/8250/8250_port.c -@@ -1869,13 +1869,13 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir) - - status = serial_port_in(port, UART_LSR); - -- if (status & (UART_LSR_DR | UART_LSR_BI) && -- iir & UART_IIR_RDI) { -+ if (status & (UART_LSR_DR | UART_LSR_BI)) { - if (!up->dma || handle_rx_dma(up, iir)) - status = serial8250_rx_chars(up, status); - } - serial8250_modem_status(up); -- if ((!up->dma || up->dma->tx_err) && (status & UART_LSR_THRE)) -+ if ((!up->dma || up->dma->tx_err) && (status & UART_LSR_THRE) && -+ (up->ier & UART_IER_THRI)) - serial8250_tx_chars(up); - - uart_unlock_and_check_sysrq(port, flags); -diff --git a/drivers/tty/serial/cpm_uart/cpm_uart_core.c b/drivers/tty/serial/cpm_uart/cpm_uart_core.c -index b929c7ae3a27..7bab9a3eda92 100644 ---- a/drivers/tty/serial/cpm_uart/cpm_uart_core.c -+++ b/drivers/tty/serial/cpm_uart/cpm_uart_core.c -@@ -407,7 +407,16 @@ static int cpm_uart_startup(struct uart_port *port) - clrbits16(&pinfo->sccp->scc_sccm, UART_SCCM_RX); - } - cpm_uart_initbd(pinfo); -- cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX); -+ if (IS_SMC(pinfo)) { -+ out_be32(&pinfo->smcup->smc_rstate, 0); -+ out_be32(&pinfo->smcup->smc_tstate, 0); -+ out_be16(&pinfo->smcup->smc_rbptr, -+ in_be16(&pinfo->smcup->smc_rbase)); -+ out_be16(&pinfo->smcup->smc_tbptr, -+ in_be16(&pinfo->smcup->smc_tbase)); -+ } else { -+ cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX); -+ } - } - /* Install interrupt handler. */ - retval = request_irq(port->irq, cpm_uart_int, 0, "cpm_uart", port); -@@ -861,16 +870,14 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo) - (u8 __iomem *)pinfo->tx_bd_base - DPRAM_BASE); - - /* -- * In case SMC1 is being relocated... -+ * In case SMC is being relocated... - */ --#if defined (CONFIG_I2C_SPI_SMC1_UCODE_PATCH) - out_be16(&up->smc_rbptr, in_be16(&pinfo->smcup->smc_rbase)); - out_be16(&up->smc_tbptr, in_be16(&pinfo->smcup->smc_tbase)); - out_be32(&up->smc_rstate, 0); - out_be32(&up->smc_tstate, 0); - out_be16(&up->smc_brkcr, 1); /* number of break chars */ - out_be16(&up->smc_brkec, 0); --#endif - - /* Set up the uart parameters in the - * parameter ram. -@@ -884,8 +891,6 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo) - out_be16(&up->smc_brkec, 0); - out_be16(&up->smc_brkcr, 1); - -- cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX); -- - /* Set UART mode, 8 bit, no parity, one stop. - * Enable receive and transmit. - */ -diff --git a/drivers/tty/serial/digicolor-usart.c b/drivers/tty/serial/digicolor-usart.c -index f460cca139e2..13ac36e2da4f 100644 ---- a/drivers/tty/serial/digicolor-usart.c -+++ b/drivers/tty/serial/digicolor-usart.c -@@ -541,7 +541,11 @@ static int __init digicolor_uart_init(void) - if (ret) - return ret; - -- return platform_driver_register(&digicolor_uart_platform); -+ ret = platform_driver_register(&digicolor_uart_platform); -+ if (ret) -+ uart_unregister_driver(&digicolor_uart); -+ -+ return ret; - } - module_init(digicolor_uart_init); - -diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c -index 8b752e895053..10db3e54ac9e 100644 ---- a/drivers/tty/serial/imx.c -+++ b/drivers/tty/serial/imx.c -@@ -383,6 +383,7 @@ static void imx_uart_ucrs_restore(struct imx_port *sport, - } - #endif - -+/* called with port.lock taken and irqs caller dependent */ - static void imx_uart_rts_active(struct imx_port *sport, u32 *ucr2) - { - *ucr2 &= ~(UCR2_CTSC | UCR2_CTS); -@@ -391,6 +392,7 @@ static void imx_uart_rts_active(struct imx_port *sport, u32 *ucr2) - mctrl_gpio_set(sport->gpios, sport->port.mctrl); - } - -+/* called with port.lock taken and irqs caller dependent */ - static void imx_uart_rts_inactive(struct imx_port *sport, u32 *ucr2) - { - *ucr2 &= ~UCR2_CTSC; -@@ -400,6 +402,7 @@ static void imx_uart_rts_inactive(struct imx_port *sport, u32 *ucr2) - mctrl_gpio_set(sport->gpios, sport->port.mctrl); - } - -+/* called with port.lock taken and irqs caller dependent */ - static void imx_uart_rts_auto(struct imx_port *sport, u32 *ucr2) - { - *ucr2 |= UCR2_CTSC; -@@ -1549,6 +1552,16 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios, - old_csize = CS8; - } - -+ del_timer_sync(&sport->timer); -+ -+ /* -+ * Ask the core to calculate the divisor for us. -+ */ -+ baud = uart_get_baud_rate(port, termios, old, 50, port->uartclk / 16); -+ quot = uart_get_divisor(port, baud); -+ -+ spin_lock_irqsave(&sport->port.lock, flags); -+ - if ((termios->c_cflag & CSIZE) == CS8) - ucr2 = UCR2_WS | UCR2_SRST | UCR2_IRTS; - else -@@ -1592,16 +1605,6 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios, - ucr2 |= UCR2_PROE; - } - -- del_timer_sync(&sport->timer); -- -- /* -- * Ask the core to calculate the divisor for us. -- */ -- baud = uart_get_baud_rate(port, termios, old, 50, port->uartclk / 16); -- quot = uart_get_divisor(port, baud); -- -- spin_lock_irqsave(&sport->port.lock, flags); -- - sport->port.read_status_mask = 0; - if (termios->c_iflag & INPCK) - sport->port.read_status_mask |= (URXD_FRMERR | URXD_PRERR); -diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c -index e5aebbf5f302..c3afd128b8fc 100644 ---- a/drivers/tty/serial/max310x.c -+++ b/drivers/tty/serial/max310x.c -@@ -496,37 +496,48 @@ static bool max310x_reg_precious(struct device *dev, unsigned int reg) - - static int max310x_set_baud(struct uart_port *port, int baud) - { -- unsigned int mode = 0, clk = port->uartclk, div = clk / baud; -+ unsigned int mode = 0, div = 0, frac = 0, c = 0, F = 0; - -- /* Check for minimal value for divider */ -- if (div < 16) -- div = 16; -- -- if (clk % baud && (div / 16) < 0x8000) { -+ /* -+ * Calculate the integer divisor first. Select a proper mode -+ * in case if the requested baud is too high for the pre-defined -+ * clocks frequency. -+ */ -+ div = port->uartclk / baud; -+ if (div < 8) { -+ /* Mode x4 */ -+ c = 4; -+ mode = MAX310X_BRGCFG_4XMODE_BIT; -+ } else if (div < 16) { - /* Mode x2 */ -+ c = 8; - mode = MAX310X_BRGCFG_2XMODE_BIT; -- clk = port->uartclk * 2; -- div = clk / baud; -- -- if (clk % baud && (div / 16) < 0x8000) { -- /* Mode x4 */ -- mode = MAX310X_BRGCFG_4XMODE_BIT; -- clk = port->uartclk * 4; -- div = clk / baud; -- } -+ } else { -+ c = 16; - } - -- max310x_port_write(port, MAX310X_BRGDIVMSB_REG, (div / 16) >> 8); -- max310x_port_write(port, MAX310X_BRGDIVLSB_REG, div / 16); -- max310x_port_write(port, MAX310X_BRGCFG_REG, (div % 16) | mode); -+ /* Calculate the divisor in accordance with the fraction coefficient */ -+ div /= c; -+ F = c*baud; -+ -+ /* Calculate the baud rate fraction */ -+ if (div > 0) -+ frac = (16*(port->uartclk % F)) / F; -+ else -+ div = 1; -+ -+ max310x_port_write(port, MAX310X_BRGDIVMSB_REG, div >> 8); -+ max310x_port_write(port, MAX310X_BRGDIVLSB_REG, div); -+ max310x_port_write(port, MAX310X_BRGCFG_REG, frac | mode); - -- return DIV_ROUND_CLOSEST(clk, div); -+ /* Return the actual baud rate we just programmed */ -+ return (16*port->uartclk) / (c*(16*div + frac)); - } - - static int max310x_update_best_err(unsigned long f, long *besterr) - { - /* Use baudrate 115200 for calculate error */ -- long err = f % (115200 * 16); -+ long err = f % (460800 * 16); - - if ((*besterr < 0) || (*besterr > err)) { - *besterr = err; -diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c -index 23833ad952ba..3657a24913fc 100644 ---- a/drivers/tty/serial/msm_serial.c -+++ b/drivers/tty/serial/msm_serial.c -@@ -383,10 +383,14 @@ static void msm_request_rx_dma(struct msm_port *msm_port, resource_size_t base) - - static inline void msm_wait_for_xmitr(struct uart_port *port) - { -+ unsigned int timeout = 500000; -+ - while (!(msm_read(port, UART_SR) & UART_SR_TX_EMPTY)) { - if (msm_read(port, UART_ISR) & UART_ISR_TX_READY) - break; - udelay(1); -+ if (!timeout--) -+ break; - } - msm_write(port, UART_CR_CMD_RESET_TX_READY, UART_CR); - } -diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c -index 83f4dd0bfd74..4223cb496764 100644 ---- a/drivers/tty/serial/serial_core.c -+++ b/drivers/tty/serial/serial_core.c -@@ -1777,6 +1777,7 @@ static int uart_port_activate(struct tty_port *port, struct tty_struct *tty) - { - struct uart_state *state = container_of(port, struct uart_state, port); - struct uart_port *uport; -+ int ret; - - uport = uart_port_check(state); - if (!uport || uport->flags & UPF_DEAD) -@@ -1787,7 +1788,11 @@ static int uart_port_activate(struct tty_port *port, struct tty_struct *tty) - /* - * Start up the serial port. - */ -- return uart_startup(tty, state, 0); -+ ret = uart_startup(tty, state, 0); -+ if (ret > 0) -+ tty_port_set_active(port, 1); -+ -+ return ret; - } - - static const char *uart_type(struct uart_port *port) -diff --git a/drivers/tty/serial/serial_mctrl_gpio.c b/drivers/tty/serial/serial_mctrl_gpio.c -index 39ed56214cd3..2b400189be91 100644 ---- a/drivers/tty/serial/serial_mctrl_gpio.c -+++ b/drivers/tty/serial/serial_mctrl_gpio.c -@@ -12,6 +12,7 @@ - #include - #include - #include -+#include - - #include "serial_mctrl_gpio.h" - -@@ -116,6 +117,19 @@ struct mctrl_gpios *mctrl_gpio_init_noauto(struct device *dev, unsigned int idx) - - for (i = 0; i < UART_GPIO_MAX; i++) { - enum gpiod_flags flags; -+ char *gpio_str; -+ bool present; -+ -+ /* Check if GPIO property exists and continue if not */ -+ gpio_str = kasprintf(GFP_KERNEL, "%s-gpios", -+ mctrl_gpios_desc[i].name); -+ if (!gpio_str) -+ continue; -+ -+ present = device_property_present(dev, gpio_str); -+ kfree(gpio_str); -+ if (!present) -+ continue; - - if (mctrl_gpios_desc[i].dir_out) - flags = GPIOD_OUT_LOW; -diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c -index abc705716aa0..d18c680aa64b 100644 ---- a/drivers/tty/serial/sh-sci.c -+++ b/drivers/tty/serial/sh-sci.c -@@ -1398,6 +1398,7 @@ static void sci_dma_tx_work_fn(struct work_struct *work) - struct circ_buf *xmit = &port->state->xmit; - unsigned long flags; - dma_addr_t buf; -+ int head, tail; - - /* - * DMA is idle now. -@@ -1407,16 +1408,23 @@ static void sci_dma_tx_work_fn(struct work_struct *work) - * consistent xmit buffer state. - */ - spin_lock_irq(&port->lock); -- buf = s->tx_dma_addr + (xmit->tail & (UART_XMIT_SIZE - 1)); -+ head = xmit->head; -+ tail = xmit->tail; -+ buf = s->tx_dma_addr + (tail & (UART_XMIT_SIZE - 1)); - s->tx_dma_len = min_t(unsigned int, -- CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE), -- CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE)); -- spin_unlock_irq(&port->lock); -+ CIRC_CNT(head, tail, UART_XMIT_SIZE), -+ CIRC_CNT_TO_END(head, tail, UART_XMIT_SIZE)); -+ if (!s->tx_dma_len) { -+ /* Transmit buffer has been flushed */ -+ spin_unlock_irq(&port->lock); -+ return; -+ } - - desc = dmaengine_prep_slave_single(chan, buf, s->tx_dma_len, - DMA_MEM_TO_DEV, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); - if (!desc) { -+ spin_unlock_irq(&port->lock); - dev_warn(port->dev, "Failed preparing Tx DMA descriptor\n"); - goto switch_to_pio; - } -@@ -1424,18 +1432,18 @@ static void sci_dma_tx_work_fn(struct work_struct *work) - dma_sync_single_for_device(chan->device->dev, buf, s->tx_dma_len, - DMA_TO_DEVICE); - -- spin_lock_irq(&port->lock); - desc->callback = sci_dma_tx_complete; - desc->callback_param = s; -- spin_unlock_irq(&port->lock); - s->cookie_tx = dmaengine_submit(desc); - if (dma_submit_error(s->cookie_tx)) { -+ spin_unlock_irq(&port->lock); - dev_warn(port->dev, "Failed submitting Tx DMA descriptor\n"); - goto switch_to_pio; - } - -+ spin_unlock_irq(&port->lock); - dev_dbg(port->dev, "%s: %p: %d...%d, cookie %d\n", -- __func__, xmit->buf, xmit->tail, xmit->head, s->cookie_tx); -+ __func__, xmit->buf, tail, head, s->cookie_tx); - - dma_async_issue_pending(chan); - return; -@@ -1648,11 +1656,18 @@ static void sci_free_dma(struct uart_port *port) - - static void sci_flush_buffer(struct uart_port *port) - { -+ struct sci_port *s = to_sci_port(port); -+ - /* - * In uart_flush_buffer(), the xmit circular buffer has just been -- * cleared, so we have to reset tx_dma_len accordingly. -+ * cleared, so we have to reset tx_dma_len accordingly, and stop any -+ * pending transfers - */ -- to_sci_port(port)->tx_dma_len = 0; -+ s->tx_dma_len = 0; -+ if (s->chan_tx) { -+ dmaengine_terminate_async(s->chan_tx); -+ s->cookie_tx = -EINVAL; -+ } - } - #else /* !CONFIG_SERIAL_SH_SCI_DMA */ - static inline void sci_request_dma(struct uart_port *port) -diff --git a/drivers/tty/serial/sunhv.c b/drivers/tty/serial/sunhv.c -index 63e34d868de8..f8503f8fc44e 100644 ---- a/drivers/tty/serial/sunhv.c -+++ b/drivers/tty/serial/sunhv.c -@@ -397,7 +397,7 @@ static const struct uart_ops sunhv_pops = { - static struct uart_driver sunhv_reg = { - .owner = THIS_MODULE, - .driver_name = "sunhv", -- .dev_name = "ttyS", -+ .dev_name = "ttyHV", - .major = TTY_MAJOR, - }; - -diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c -index 605354fd60b1..9dcc4d855ddd 100644 ---- a/drivers/tty/serial/xilinx_uartps.c -+++ b/drivers/tty/serial/xilinx_uartps.c -@@ -29,12 +29,12 @@ - - #define CDNS_UART_TTY_NAME "ttyPS" - #define CDNS_UART_NAME "xuartps" --#define CDNS_UART_MAJOR 0 /* use dynamic node allocation */ - #define CDNS_UART_FIFO_SIZE 64 /* FIFO size */ - #define CDNS_UART_REGISTER_SPACE 0x1000 - - /* Rx Trigger level */ - static int rx_trigger_level = 56; -+static int uartps_major; - module_param(rx_trigger_level, uint, S_IRUGO); - MODULE_PARM_DESC(rx_trigger_level, "Rx trigger level, 1-63 bytes"); - -@@ -1517,7 +1517,7 @@ static int cdns_uart_probe(struct platform_device *pdev) - cdns_uart_uart_driver->owner = THIS_MODULE; - cdns_uart_uart_driver->driver_name = driver_name; - cdns_uart_uart_driver->dev_name = CDNS_UART_TTY_NAME; -- cdns_uart_uart_driver->major = CDNS_UART_MAJOR; -+ cdns_uart_uart_driver->major = uartps_major; - cdns_uart_uart_driver->minor = cdns_uart_data->id; - cdns_uart_uart_driver->nr = 1; - -@@ -1546,6 +1546,7 @@ static int cdns_uart_probe(struct platform_device *pdev) - goto err_out_id; - } - -+ uartps_major = cdns_uart_uart_driver->tty_driver->major; - cdns_uart_data->cdns_uart_driver = cdns_uart_uart_driver; - - /* -diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c -index fa783531ee88..86130e8d35f9 100644 ---- a/drivers/usb/core/devio.c -+++ b/drivers/usb/core/devio.c -@@ -63,7 +63,7 @@ struct usb_dev_state { - unsigned int discsignr; - struct pid *disc_pid; - const struct cred *cred; -- void __user *disccontext; -+ sigval_t disccontext; - unsigned long ifclaimed; - u32 disabled_bulk_eps; - bool privileges_dropped; -@@ -90,6 +90,7 @@ struct async { - unsigned int ifnum; - void __user *userbuffer; - void __user *userurb; -+ sigval_t userurb_sigval; - struct urb *urb; - struct usb_memory *usbm; - unsigned int mem_usage; -@@ -582,22 +583,19 @@ static void async_completed(struct urb *urb) - { - struct async *as = urb->context; - struct usb_dev_state *ps = as->ps; -- struct kernel_siginfo sinfo; - struct pid *pid = NULL; - const struct cred *cred = NULL; - unsigned long flags; -- int signr; -+ sigval_t addr; -+ int signr, errno; - - spin_lock_irqsave(&ps->lock, flags); - list_move_tail(&as->asynclist, &ps->async_completed); - as->status = urb->status; - signr = as->signr; - if (signr) { -- clear_siginfo(&sinfo); -- sinfo.si_signo = as->signr; -- sinfo.si_errno = as->status; -- sinfo.si_code = SI_ASYNCIO; -- sinfo.si_addr = as->userurb; -+ errno = as->status; -+ addr = as->userurb_sigval; - pid = get_pid(as->pid); - cred = get_cred(as->cred); - } -@@ -615,7 +613,7 @@ static void async_completed(struct urb *urb) - spin_unlock_irqrestore(&ps->lock, flags); - - if (signr) { -- kill_pid_info_as_cred(sinfo.si_signo, &sinfo, pid, cred); -+ kill_pid_usb_asyncio(signr, errno, addr, pid, cred); - put_pid(pid); - put_cred(cred); - } -@@ -1427,7 +1425,7 @@ find_memory_area(struct usb_dev_state *ps, const struct usbdevfs_urb *uurb) - - static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb, - struct usbdevfs_iso_packet_desc __user *iso_frame_desc, -- void __user *arg) -+ void __user *arg, sigval_t userurb_sigval) - { - struct usbdevfs_iso_packet_desc *isopkt = NULL; - struct usb_host_endpoint *ep; -@@ -1727,6 +1725,7 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb - isopkt = NULL; - as->ps = ps; - as->userurb = arg; -+ as->userurb_sigval = userurb_sigval; - if (as->usbm) { - unsigned long uurb_start = (unsigned long)uurb->buffer; - -@@ -1789,8 +1788,6 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb - return 0; - - error: -- if (as && as->usbm) -- dec_usb_memory_use_count(as->usbm, &as->usbm->urb_use_count); - kfree(isopkt); - kfree(dr); - if (as) -@@ -1801,13 +1798,17 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb - static int proc_submiturb(struct usb_dev_state *ps, void __user *arg) - { - struct usbdevfs_urb uurb; -+ sigval_t userurb_sigval; - - if (copy_from_user(&uurb, arg, sizeof(uurb))) - return -EFAULT; - -+ memset(&userurb_sigval, 0, sizeof(userurb_sigval)); -+ userurb_sigval.sival_ptr = arg; -+ - return proc_do_submiturb(ps, &uurb, - (((struct usbdevfs_urb __user *)arg)->iso_frame_desc), -- arg); -+ arg, userurb_sigval); - } - - static int proc_unlinkurb(struct usb_dev_state *ps, void __user *arg) -@@ -1977,7 +1978,7 @@ static int proc_disconnectsignal_compat(struct usb_dev_state *ps, void __user *a - if (copy_from_user(&ds, arg, sizeof(ds))) - return -EFAULT; - ps->discsignr = ds.signr; -- ps->disccontext = compat_ptr(ds.context); -+ ps->disccontext.sival_int = ds.context; - return 0; - } - -@@ -2005,13 +2006,17 @@ static int get_urb32(struct usbdevfs_urb *kurb, - static int proc_submiturb_compat(struct usb_dev_state *ps, void __user *arg) - { - struct usbdevfs_urb uurb; -+ sigval_t userurb_sigval; - - if (get_urb32(&uurb, (struct usbdevfs_urb32 __user *)arg)) - return -EFAULT; - -+ memset(&userurb_sigval, 0, sizeof(userurb_sigval)); -+ userurb_sigval.sival_int = ptr_to_compat(arg); -+ - return proc_do_submiturb(ps, &uurb, - ((struct usbdevfs_urb32 __user *)arg)->iso_frame_desc, -- arg); -+ arg, userurb_sigval); - } - - static int processcompl_compat(struct async *as, void __user * __user *arg) -@@ -2092,7 +2097,7 @@ static int proc_disconnectsignal(struct usb_dev_state *ps, void __user *arg) - if (copy_from_user(&ds, arg, sizeof(ds))) - return -EFAULT; - ps->discsignr = ds.signr; -- ps->disccontext = ds.context; -+ ps->disccontext.sival_ptr = ds.context; - return 0; - } - -@@ -2614,22 +2619,15 @@ const struct file_operations usbdev_file_operations = { - static void usbdev_remove(struct usb_device *udev) - { - struct usb_dev_state *ps; -- struct kernel_siginfo sinfo; - - while (!list_empty(&udev->filelist)) { - ps = list_entry(udev->filelist.next, struct usb_dev_state, list); - destroy_all_async(ps); - wake_up_all(&ps->wait); - list_del_init(&ps->list); -- if (ps->discsignr) { -- clear_siginfo(&sinfo); -- sinfo.si_signo = ps->discsignr; -- sinfo.si_errno = EPIPE; -- sinfo.si_code = SI_ASYNCIO; -- sinfo.si_addr = ps->disccontext; -- kill_pid_info_as_cred(ps->discsignr, &sinfo, -- ps->disc_pid, ps->cred); -- } -+ if (ps->discsignr) -+ kill_pid_usb_asyncio(ps->discsignr, EPIPE, ps->disccontext, -+ ps->disc_pid, ps->cred); - } - } - -diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c -index 2f94568ba385..2844366dc173 100644 ---- a/drivers/usb/core/hub.c -+++ b/drivers/usb/core/hub.c -@@ -3617,6 +3617,7 @@ static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port, - struct usb_device *hdev; - struct usb_device *udev; - int connect_change = 0; -+ u16 link_state; - int ret; - - hdev = hub->hdev; -@@ -3626,9 +3627,11 @@ static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port, - return 0; - usb_clear_port_feature(hdev, port, USB_PORT_FEAT_C_SUSPEND); - } else { -+ link_state = portstatus & USB_PORT_STAT_LINK_STATE; - if (!udev || udev->state != USB_STATE_SUSPENDED || -- (portstatus & USB_PORT_STAT_LINK_STATE) != -- USB_SS_PORT_LS_U0) -+ (link_state != USB_SS_PORT_LS_U0 && -+ link_state != USB_SS_PORT_LS_U1 && -+ link_state != USB_SS_PORT_LS_U2)) - return 0; - } - -@@ -3999,6 +4002,9 @@ static int usb_set_lpm_timeout(struct usb_device *udev, - * control transfers to set the hub timeout or enable device-initiated U1/U2 - * will be successful. - * -+ * If the control transfer to enable device-initiated U1/U2 entry fails, then -+ * hub-initiated U1/U2 will be disabled. -+ * - * If we cannot set the parent hub U1/U2 timeout, we attempt to let the xHCI - * driver know about it. If that call fails, it should be harmless, and just - * take up more slightly more bus bandwidth for unnecessary U1/U2 exit latency. -@@ -4053,23 +4059,24 @@ static void usb_enable_link_state(struct usb_hcd *hcd, struct usb_device *udev, - * host know that this link state won't be enabled. - */ - hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state); -- } else { -- /* Only a configured device will accept the Set Feature -- * U1/U2_ENABLE -- */ -- if (udev->actconfig) -- usb_set_device_initiated_lpm(udev, state, true); -+ return; -+ } - -- /* As soon as usb_set_lpm_timeout(timeout) returns 0, the -- * hub-initiated LPM is enabled. Thus, LPM is enabled no -- * matter the result of usb_set_device_initiated_lpm(). -- * The only difference is whether device is able to initiate -- * LPM. -- */ -+ /* Only a configured device will accept the Set Feature -+ * U1/U2_ENABLE -+ */ -+ if (udev->actconfig && -+ usb_set_device_initiated_lpm(udev, state, true) == 0) { - if (state == USB3_LPM_U1) - udev->usb3_lpm_u1_enabled = 1; - else if (state == USB3_LPM_U2) - udev->usb3_lpm_u2_enabled = 1; -+ } else { -+ /* Don't request U1/U2 entry if the device -+ * cannot transition to U1/U2. -+ */ -+ usb_set_lpm_timeout(udev, state, 0); -+ hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state); - } - } - -diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c -index 8b499d643461..8e41d70fd298 100644 ---- a/drivers/usb/dwc2/core.c -+++ b/drivers/usb/dwc2/core.c -@@ -531,7 +531,7 @@ int dwc2_core_reset(struct dwc2_hsotg *hsotg, bool skip_wait) - } - - /* Wait for AHB master IDLE state */ -- if (dwc2_hsotg_wait_bit_set(hsotg, GRSTCTL, GRSTCTL_AHBIDLE, 50)) { -+ if (dwc2_hsotg_wait_bit_set(hsotg, GRSTCTL, GRSTCTL_AHBIDLE, 10000)) { - dev_warn(hsotg->dev, "%s: HANG! AHB Idle timeout GRSTCTL GRSTCTL_AHBIDLE\n", - __func__); - return -EBUSY; -diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c -index 4aff1d8dbc4f..6e9e172010fc 100644 ---- a/drivers/usb/dwc3/core.c -+++ b/drivers/usb/dwc3/core.c -@@ -1423,11 +1423,6 @@ static int dwc3_probe(struct platform_device *pdev) - dwc->regs = regs; - dwc->regs_size = resource_size(&dwc_res); - -- if (!dwc3_core_is_valid(dwc)) { -- dev_err(dwc->dev, "this is not a DesignWare USB3 DRD Core\n"); -- return -ENODEV; -- } -- - dwc3_get_properties(dwc); - - dwc->reset = devm_reset_control_get_optional_shared(dev, NULL); -@@ -1460,6 +1455,12 @@ static int dwc3_probe(struct platform_device *pdev) - if (ret) - goto unprepare_clks; - -+ if (!dwc3_core_is_valid(dwc)) { -+ dev_err(dwc->dev, "this is not a DesignWare USB3 DRD Core\n"); -+ ret = -ENODEV; -+ goto disable_clks; -+ } -+ - platform_set_drvdata(pdev, dwc); - dwc3_cache_hwparams(dwc); - -@@ -1525,6 +1526,7 @@ static int dwc3_probe(struct platform_device *pdev) - pm_runtime_put_sync(&pdev->dev); - pm_runtime_disable(&pdev->dev); - -+disable_clks: - clk_bulk_disable(dwc->num_clks, dwc->clks); - unprepare_clks: - clk_bulk_unprepare(dwc->num_clks, dwc->clks); -diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c -index 47be961f1bf3..213ff03c8a9f 100644 ---- a/drivers/usb/gadget/function/f_fs.c -+++ b/drivers/usb/gadget/function/f_fs.c -@@ -997,7 +997,6 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) - * earlier - */ - gadget = epfile->ffs->gadget; -- io_data->use_sg = gadget->sg_supported && data_len > PAGE_SIZE; - - spin_lock_irq(&epfile->ffs->eps_lock); - /* In the meantime, endpoint got disabled or changed. */ -@@ -1012,6 +1011,8 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) - */ - if (io_data->read) - data_len = usb_ep_align_maybe(gadget, ep->ep, data_len); -+ -+ io_data->use_sg = gadget->sg_supported && data_len > PAGE_SIZE; - spin_unlock_irq(&epfile->ffs->eps_lock); - - data = ffs_alloc_buffer(io_data, data_len); -@@ -1182,11 +1183,12 @@ static ssize_t ffs_epfile_write_iter(struct kiocb *kiocb, struct iov_iter *from) - ENTER(); - - if (!is_sync_kiocb(kiocb)) { -- p = kmalloc(sizeof(io_data), GFP_KERNEL); -+ p = kzalloc(sizeof(io_data), GFP_KERNEL); - if (unlikely(!p)) - return -ENOMEM; - p->aio = true; - } else { -+ memset(p, 0, sizeof(*p)); - p->aio = false; - } - -@@ -1218,11 +1220,12 @@ static ssize_t ffs_epfile_read_iter(struct kiocb *kiocb, struct iov_iter *to) - ENTER(); - - if (!is_sync_kiocb(kiocb)) { -- p = kmalloc(sizeof(io_data), GFP_KERNEL); -+ p = kzalloc(sizeof(io_data), GFP_KERNEL); - if (unlikely(!p)) - return -ENOMEM; - p->aio = true; - } else { -+ memset(p, 0, sizeof(*p)); - p->aio = false; - } - -diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c -index 737bd77a575d..2929bb47a618 100644 ---- a/drivers/usb/gadget/function/u_ether.c -+++ b/drivers/usb/gadget/function/u_ether.c -@@ -186,11 +186,12 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags) - out = dev->port_usb->out_ep; - else - out = NULL; -- spin_unlock_irqrestore(&dev->lock, flags); - - if (!out) -+ { -+ spin_unlock_irqrestore(&dev->lock, flags); - return -ENOTCONN; -- -+ } - - /* Padding up to RX_EXTRA handles minor disagreements with host. - * Normally we use the USB "terminate on short read" convention; -@@ -214,6 +215,7 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags) - - if (dev->port_usb->is_fixed) - size = max_t(size_t, size, dev->port_usb->fixed_out_len); -+ spin_unlock_irqrestore(&dev->lock, flags); - - skb = __netdev_alloc_skb(dev->net, size + NET_IP_ALIGN, gfp_flags); - if (skb == NULL) { -diff --git a/drivers/usb/host/hwa-hc.c b/drivers/usb/host/hwa-hc.c -index 09a8ebd95588..6968b9f2b76b 100644 ---- a/drivers/usb/host/hwa-hc.c -+++ b/drivers/usb/host/hwa-hc.c -@@ -159,7 +159,7 @@ static int hwahc_op_start(struct usb_hcd *usb_hcd) - return result; - - error_set_cluster_id: -- wusb_cluster_id_put(wusbhc->cluster_id); -+ wusb_cluster_id_put(addr); - error_cluster_id_get: - goto out; - -diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c -index 3ce71cbfbb58..ad05c27b3a7b 100644 ---- a/drivers/usb/host/pci-quirks.c -+++ b/drivers/usb/host/pci-quirks.c -@@ -205,7 +205,7 @@ int usb_amd_find_chipset_info(void) - { - unsigned long flags; - struct amd_chipset_info info; -- int ret; -+ int need_pll_quirk = 0; - - spin_lock_irqsave(&amd_lock, flags); - -@@ -219,21 +219,28 @@ int usb_amd_find_chipset_info(void) - spin_unlock_irqrestore(&amd_lock, flags); - - if (!amd_chipset_sb_type_init(&info)) { -- ret = 0; - goto commit; - } - -- /* Below chipset generations needn't enable AMD PLL quirk */ -- if (info.sb_type.gen == AMD_CHIPSET_UNKNOWN || -- info.sb_type.gen == AMD_CHIPSET_SB600 || -- info.sb_type.gen == AMD_CHIPSET_YANGTZE || -- (info.sb_type.gen == AMD_CHIPSET_SB700 && -- info.sb_type.rev > 0x3b)) { -+ switch (info.sb_type.gen) { -+ case AMD_CHIPSET_SB700: -+ need_pll_quirk = info.sb_type.rev <= 0x3B; -+ break; -+ case AMD_CHIPSET_SB800: -+ case AMD_CHIPSET_HUDSON2: -+ case AMD_CHIPSET_BOLTON: -+ need_pll_quirk = 1; -+ break; -+ default: -+ need_pll_quirk = 0; -+ break; -+ } -+ -+ if (!need_pll_quirk) { - if (info.smbus_dev) { - pci_dev_put(info.smbus_dev); - info.smbus_dev = NULL; - } -- ret = 0; - goto commit; - } - -@@ -252,7 +259,7 @@ int usb_amd_find_chipset_info(void) - } - } - -- ret = info.probe_result = 1; -+ need_pll_quirk = info.probe_result = 1; - printk(KERN_DEBUG "QUIRK: Enable AMD PLL fix\n"); - - commit: -@@ -263,7 +270,7 @@ int usb_amd_find_chipset_info(void) - - /* Mark that we where here */ - amd_chipset.probe_count++; -- ret = amd_chipset.probe_result; -+ need_pll_quirk = amd_chipset.probe_result; - - spin_unlock_irqrestore(&amd_lock, flags); - -@@ -277,7 +284,7 @@ int usb_amd_find_chipset_info(void) - spin_unlock_irqrestore(&amd_lock, flags); - } - -- return ret; -+ return need_pll_quirk; - } - EXPORT_SYMBOL_GPL(usb_amd_find_chipset_info); - -diff --git a/drivers/usb/host/xhci-rcar.c b/drivers/usb/host/xhci-rcar.c -index 671bce18782c..8616c52849c6 100644 ---- a/drivers/usb/host/xhci-rcar.c -+++ b/drivers/usb/host/xhci-rcar.c -@@ -238,10 +238,15 @@ int xhci_rcar_init_quirk(struct usb_hcd *hcd) - * pointers. So, this driver clears the AC64 bit of xhci->hcc_params - * to call dma_set_coherent_mask(dev, DMA_BIT_MASK(32)) in - * xhci_gen_setup(). -+ * -+ * And, since the firmware/internal CPU control the USBSTS.STS_HALT -+ * and the process speed is down when the roothub port enters U3, -+ * long delay for the handshake of STS_HALT is neeed in xhci_suspend(). - */ - if (xhci_rcar_is_gen2(hcd->self.controller) || -- xhci_rcar_is_gen3(hcd->self.controller)) -- xhci->quirks |= XHCI_NO_64BIT_SUPPORT; -+ xhci_rcar_is_gen3(hcd->self.controller)) { -+ xhci->quirks |= XHCI_NO_64BIT_SUPPORT | XHCI_SLOW_SUSPEND; -+ } - - if (!xhci_rcar_wait_for_pll_active(hcd)) - return -ETIMEDOUT; -diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h -index 92e764c54154..fabbce1c542a 100644 ---- a/drivers/usb/host/xhci.h -+++ b/drivers/usb/host/xhci.h -@@ -2170,7 +2170,8 @@ static inline bool xhci_urb_suitable_for_idt(struct urb *urb) - if (!usb_endpoint_xfer_isoc(&urb->ep->desc) && usb_urb_dir_out(urb) && - usb_endpoint_maxp(&urb->ep->desc) >= TRB_IDT_MAX_SIZE && - urb->transfer_buffer_length <= TRB_IDT_MAX_SIZE && -- !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) -+ !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP) && -+ !urb->num_sgs) - return true; - - return false; -diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c -index ba05dd80a020..f5bed9f29e56 100644 ---- a/drivers/usb/misc/iowarrior.c -+++ b/drivers/usb/misc/iowarrior.c -@@ -866,19 +866,20 @@ static void iowarrior_disconnect(struct usb_interface *interface) - dev = usb_get_intfdata(interface); - mutex_lock(&iowarrior_open_disc_lock); - usb_set_intfdata(interface, NULL); -+ /* prevent device read, write and ioctl */ -+ dev->present = 0; - - minor = dev->minor; -+ mutex_unlock(&iowarrior_open_disc_lock); -+ /* give back our minor - this will call close() locks need to be dropped at this point*/ - -- /* give back our minor */ - usb_deregister_dev(interface, &iowarrior_class); - - mutex_lock(&dev->mutex); - - /* prevent device read, write and ioctl */ -- dev->present = 0; - - mutex_unlock(&dev->mutex); -- mutex_unlock(&iowarrior_open_disc_lock); - - if (dev->opened) { - /* There is a process that holds a filedescriptor to the device , -diff --git a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c -index 27e9c78a791e..a32d61a79ab8 100644 ---- a/drivers/usb/misc/rio500.c -+++ b/drivers/usb/misc/rio500.c -@@ -51,6 +51,7 @@ struct rio_usb_data { - char *obuf, *ibuf; /* transfer buffers */ - char bulk_in_ep, bulk_out_ep; /* Endpoint assignments */ - wait_queue_head_t wait_q; /* for timeouts */ -+ struct mutex lock; /* general race avoidance */ - }; - - static DEFINE_MUTEX(rio500_mutex); -@@ -62,8 +63,10 @@ static int open_rio(struct inode *inode, struct file *file) - - /* against disconnect() */ - mutex_lock(&rio500_mutex); -+ mutex_lock(&(rio->lock)); - - if (rio->isopen || !rio->present) { -+ mutex_unlock(&(rio->lock)); - mutex_unlock(&rio500_mutex); - return -EBUSY; - } -@@ -71,6 +74,7 @@ static int open_rio(struct inode *inode, struct file *file) - - init_waitqueue_head(&rio->wait_q); - -+ mutex_unlock(&(rio->lock)); - - dev_info(&rio->rio_dev->dev, "Rio opened.\n"); - mutex_unlock(&rio500_mutex); -@@ -84,6 +88,7 @@ static int close_rio(struct inode *inode, struct file *file) - - /* against disconnect() */ - mutex_lock(&rio500_mutex); -+ mutex_lock(&(rio->lock)); - - rio->isopen = 0; - if (!rio->present) { -@@ -95,6 +100,7 @@ static int close_rio(struct inode *inode, struct file *file) - } else { - dev_info(&rio->rio_dev->dev, "Rio closed.\n"); - } -+ mutex_unlock(&(rio->lock)); - mutex_unlock(&rio500_mutex); - return 0; - } -@@ -109,7 +115,7 @@ static long ioctl_rio(struct file *file, unsigned int cmd, unsigned long arg) - int retries; - int retval=0; - -- mutex_lock(&rio500_mutex); -+ mutex_lock(&(rio->lock)); - /* Sanity check to make sure rio is connected, powered, etc */ - if (rio->present == 0 || rio->rio_dev == NULL) { - retval = -ENODEV; -@@ -253,7 +259,7 @@ static long ioctl_rio(struct file *file, unsigned int cmd, unsigned long arg) - - - err_out: -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - return retval; - } - -@@ -273,12 +279,12 @@ write_rio(struct file *file, const char __user *buffer, - int errn = 0; - int intr; - -- intr = mutex_lock_interruptible(&rio500_mutex); -+ intr = mutex_lock_interruptible(&(rio->lock)); - if (intr) - return -EINTR; - /* Sanity check to make sure rio is connected, powered, etc */ - if (rio->present == 0 || rio->rio_dev == NULL) { -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - return -ENODEV; - } - -@@ -301,7 +307,7 @@ write_rio(struct file *file, const char __user *buffer, - goto error; - } - if (signal_pending(current)) { -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - return bytes_written ? bytes_written : -EINTR; - } - -@@ -339,12 +345,12 @@ write_rio(struct file *file, const char __user *buffer, - buffer += copy_size; - } while (count > 0); - -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - - return bytes_written ? bytes_written : -EIO; - - error: -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - return errn; - } - -@@ -361,12 +367,12 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos) - char *ibuf; - int intr; - -- intr = mutex_lock_interruptible(&rio500_mutex); -+ intr = mutex_lock_interruptible(&(rio->lock)); - if (intr) - return -EINTR; - /* Sanity check to make sure rio is connected, powered, etc */ - if (rio->present == 0 || rio->rio_dev == NULL) { -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - return -ENODEV; - } - -@@ -377,11 +383,11 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos) - - while (count > 0) { - if (signal_pending(current)) { -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - return read_count ? read_count : -EINTR; - } - if (!rio->rio_dev) { -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - return -ENODEV; - } - this_read = (count >= IBUF_SIZE) ? IBUF_SIZE : count; -@@ -399,7 +405,7 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos) - count = this_read = partial; - } else if (result == -ETIMEDOUT || result == 15) { /* FIXME: 15 ??? */ - if (!maxretry--) { -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - dev_err(&rio->rio_dev->dev, - "read_rio: maxretry timeout\n"); - return -ETIME; -@@ -409,19 +415,19 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos) - finish_wait(&rio->wait_q, &wait); - continue; - } else if (result != -EREMOTEIO) { -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - dev_err(&rio->rio_dev->dev, - "Read Whoops - result:%d partial:%u this_read:%u\n", - result, partial, this_read); - return -EIO; - } else { -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - return (0); - } - - if (this_read) { - if (copy_to_user(buffer, ibuf, this_read)) { -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - return -EFAULT; - } - count -= this_read; -@@ -429,7 +435,7 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos) - buffer += this_read; - } - } -- mutex_unlock(&rio500_mutex); -+ mutex_unlock(&(rio->lock)); - return read_count; - } - -@@ -494,6 +500,8 @@ static int probe_rio(struct usb_interface *intf, - } - dev_dbg(&intf->dev, "ibuf address:%p\n", rio->ibuf); - -+ mutex_init(&(rio->lock)); -+ - usb_set_intfdata (intf, rio); - rio->present = 1; - bail_out: -@@ -511,10 +519,12 @@ static void disconnect_rio(struct usb_interface *intf) - if (rio) { - usb_deregister_dev(intf, &usb_rio_class); - -+ mutex_lock(&(rio->lock)); - if (rio->isopen) { - rio->isopen = 0; - /* better let it finish - the release will do whats needed */ - rio->rio_dev = NULL; -+ mutex_unlock(&(rio->lock)); - mutex_unlock(&rio500_mutex); - return; - } -@@ -524,6 +534,7 @@ static void disconnect_rio(struct usb_interface *intf) - dev_info(&intf->dev, "USB Rio disconnected.\n"); - - rio->present = 0; -+ mutex_unlock(&(rio->lock)); - } - mutex_unlock(&rio500_mutex); - } -diff --git a/drivers/usb/misc/usb251xb.c b/drivers/usb/misc/usb251xb.c -index 4d6ae3795a88..6ca9111d150a 100644 ---- a/drivers/usb/misc/usb251xb.c -+++ b/drivers/usb/misc/usb251xb.c -@@ -375,7 +375,8 @@ static int usb251xb_connect(struct usb251xb *hub) - - #ifdef CONFIG_OF - static void usb251xb_get_ports_field(struct usb251xb *hub, -- const char *prop_name, u8 port_cnt, u8 *fld) -+ const char *prop_name, u8 port_cnt, -+ bool ds_only, u8 *fld) - { - struct device *dev = hub->dev; - struct property *prop; -@@ -383,7 +384,7 @@ static void usb251xb_get_ports_field(struct usb251xb *hub, - u32 port; - - of_property_for_each_u32(dev->of_node, prop_name, prop, p, port) { -- if ((port >= 1) && (port <= port_cnt)) -+ if ((port >= ds_only ? 1 : 0) && (port <= port_cnt)) - *fld |= BIT(port); - else - dev_warn(dev, "port %u doesn't exist\n", port); -@@ -501,15 +502,15 @@ static int usb251xb_get_ofdata(struct usb251xb *hub, - - hub->non_rem_dev = USB251XB_DEF_NON_REMOVABLE_DEVICES; - usb251xb_get_ports_field(hub, "non-removable-ports", data->port_cnt, -- &hub->non_rem_dev); -+ true, &hub->non_rem_dev); - - hub->port_disable_sp = USB251XB_DEF_PORT_DISABLE_SELF; - usb251xb_get_ports_field(hub, "sp-disabled-ports", data->port_cnt, -- &hub->port_disable_sp); -+ true, &hub->port_disable_sp); - - hub->port_disable_bp = USB251XB_DEF_PORT_DISABLE_BUS; - usb251xb_get_ports_field(hub, "bp-disabled-ports", data->port_cnt, -- &hub->port_disable_bp); -+ true, &hub->port_disable_bp); - - hub->max_power_sp = USB251XB_DEF_MAX_POWER_SELF; - if (!of_property_read_u32(np, "sp-max-total-current-microamp", -@@ -573,9 +574,7 @@ static int usb251xb_get_ofdata(struct usb251xb *hub, - */ - hub->port_swap = USB251XB_DEF_PORT_SWAP; - usb251xb_get_ports_field(hub, "swap-dx-lanes", data->port_cnt, -- &hub->port_swap); -- if (of_get_property(np, "swap-us-lanes", NULL)) -- hub->port_swap |= BIT(0); -+ false, &hub->port_swap); - - /* The following parameters are currently not exposed to devicetree, but - * may be as soon as needed. -diff --git a/drivers/usb/misc/yurex.c b/drivers/usb/misc/yurex.c -index 7b306aa22d25..6715a128e6c8 100644 ---- a/drivers/usb/misc/yurex.c -+++ b/drivers/usb/misc/yurex.c -@@ -92,7 +92,6 @@ static void yurex_delete(struct kref *kref) - - dev_dbg(&dev->interface->dev, "%s\n", __func__); - -- usb_put_dev(dev->udev); - if (dev->cntl_urb) { - usb_kill_urb(dev->cntl_urb); - kfree(dev->cntl_req); -@@ -108,6 +107,7 @@ static void yurex_delete(struct kref *kref) - dev->int_buffer, dev->urb->transfer_dma); - usb_free_urb(dev->urb); - } -+ usb_put_dev(dev->udev); - kfree(dev); - } - -diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c -index 39fa2fc1b8b7..6036cbae8c78 100644 ---- a/drivers/usb/renesas_usbhs/fifo.c -+++ b/drivers/usb/renesas_usbhs/fifo.c -@@ -802,9 +802,8 @@ static int __usbhsf_dma_map_ctrl(struct usbhs_pkt *pkt, int map) - } - - static void usbhsf_dma_complete(void *arg); --static void xfer_work(struct work_struct *work) -+static void usbhsf_dma_xfer_preparing(struct usbhs_pkt *pkt) - { -- struct usbhs_pkt *pkt = container_of(work, struct usbhs_pkt, work); - struct usbhs_pipe *pipe = pkt->pipe; - struct usbhs_fifo *fifo; - struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); -@@ -812,12 +811,10 @@ static void xfer_work(struct work_struct *work) - struct dma_chan *chan; - struct device *dev = usbhs_priv_to_dev(priv); - enum dma_transfer_direction dir; -- unsigned long flags; - -- usbhs_lock(priv, flags); - fifo = usbhs_pipe_to_fifo(pipe); - if (!fifo) -- goto xfer_work_end; -+ return; - - chan = usbhsf_dma_chan_get(fifo, pkt); - dir = usbhs_pipe_is_dir_in(pipe) ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV; -@@ -826,7 +823,7 @@ static void xfer_work(struct work_struct *work) - pkt->trans, dir, - DMA_PREP_INTERRUPT | DMA_CTRL_ACK); - if (!desc) -- goto xfer_work_end; -+ return; - - desc->callback = usbhsf_dma_complete; - desc->callback_param = pipe; -@@ -834,7 +831,7 @@ static void xfer_work(struct work_struct *work) - pkt->cookie = dmaengine_submit(desc); - if (pkt->cookie < 0) { - dev_err(dev, "Failed to submit dma descriptor\n"); -- goto xfer_work_end; -+ return; - } - - dev_dbg(dev, " %s %d (%d/ %d)\n", -@@ -845,8 +842,17 @@ static void xfer_work(struct work_struct *work) - dma_async_issue_pending(chan); - usbhsf_dma_start(pipe, fifo); - usbhs_pipe_enable(pipe); -+} -+ -+static void xfer_work(struct work_struct *work) -+{ -+ struct usbhs_pkt *pkt = container_of(work, struct usbhs_pkt, work); -+ struct usbhs_pipe *pipe = pkt->pipe; -+ struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); -+ unsigned long flags; - --xfer_work_end: -+ usbhs_lock(priv, flags); -+ usbhsf_dma_xfer_preparing(pkt); - usbhs_unlock(priv, flags); - } - -@@ -899,8 +905,13 @@ static int usbhsf_dma_prepare_push(struct usbhs_pkt *pkt, int *is_done) - pkt->trans = len; - - usbhsf_tx_irq_ctrl(pipe, 0); -- INIT_WORK(&pkt->work, xfer_work); -- schedule_work(&pkt->work); -+ /* FIXME: Workaound for usb dmac that driver can be used in atomic */ -+ if (usbhs_get_dparam(priv, has_usb_dmac)) { -+ usbhsf_dma_xfer_preparing(pkt); -+ } else { -+ INIT_WORK(&pkt->work, xfer_work); -+ schedule_work(&pkt->work); -+ } - - return 0; - -@@ -1006,8 +1017,7 @@ static int usbhsf_dma_prepare_pop_with_usb_dmac(struct usbhs_pkt *pkt, - - pkt->trans = pkt->length; - -- INIT_WORK(&pkt->work, xfer_work); -- schedule_work(&pkt->work); -+ usbhsf_dma_xfer_preparing(pkt); - - return 0; - -diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c -index 1d8461ae2c34..23669a584bae 100644 ---- a/drivers/usb/serial/ftdi_sio.c -+++ b/drivers/usb/serial/ftdi_sio.c -@@ -1029,6 +1029,7 @@ static const struct usb_device_id id_table_combined[] = { - { USB_DEVICE(AIRBUS_DS_VID, AIRBUS_DS_P8GR) }, - /* EZPrototypes devices */ - { USB_DEVICE(EZPROTOTYPES_VID, HJELMSLUND_USB485_ISO_PID) }, -+ { USB_DEVICE_INTERFACE_NUMBER(UNJO_VID, UNJO_ISODEBUG_V1_PID, 1) }, - { } /* Terminating entry */ - }; - -diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h -index 5755f0df0025..f12d806220b4 100644 ---- a/drivers/usb/serial/ftdi_sio_ids.h -+++ b/drivers/usb/serial/ftdi_sio_ids.h -@@ -1543,3 +1543,9 @@ - #define CHETCO_SEASMART_DISPLAY_PID 0xA5AD /* SeaSmart NMEA2000 Display */ - #define CHETCO_SEASMART_LITE_PID 0xA5AE /* SeaSmart Lite USB Adapter */ - #define CHETCO_SEASMART_ANALOG_PID 0xA5AF /* SeaSmart Analog Adapter */ -+ -+/* -+ * Unjo AB -+ */ -+#define UNJO_VID 0x22B7 -+#define UNJO_ISODEBUG_V1_PID 0x150D -diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c -index a0aaf0635359..c1582fbd1150 100644 ---- a/drivers/usb/serial/option.c -+++ b/drivers/usb/serial/option.c -@@ -1343,6 +1343,7 @@ static const struct usb_device_id option_ids[] = { - .driver_info = RSVD(4) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0414, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0417, 0xff, 0xff, 0xff) }, -+ { USB_DEVICE_INTERFACE_CLASS(ZTE_VENDOR_ID, 0x0601, 0xff) }, /* GosunCn ZTE WeLink ME3630 (RNDIS mode) */ - { USB_DEVICE_INTERFACE_CLASS(ZTE_VENDOR_ID, 0x0602, 0xff) }, /* GosunCn ZTE WeLink ME3630 (MBIM mode) */ - { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), - .driver_info = RSVD(4) }, -diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c -index 59190d88fa9f..556bb4fa0bee 100644 ---- a/drivers/usb/storage/scsiglue.c -+++ b/drivers/usb/storage/scsiglue.c -@@ -28,6 +28,8 @@ - * status of a command. - */ - -+#include -+#include - #include - #include - -@@ -99,6 +101,7 @@ static int slave_alloc (struct scsi_device *sdev) - static int slave_configure(struct scsi_device *sdev) - { - struct us_data *us = host_to_us(sdev->host); -+ struct device *dev = us->pusb_dev->bus->sysdev; - - /* - * Many devices have trouble transferring more than 32KB at a time, -@@ -128,6 +131,14 @@ static int slave_configure(struct scsi_device *sdev) - blk_queue_max_hw_sectors(sdev->request_queue, 2048); - } - -+ /* -+ * The max_hw_sectors should be up to maximum size of a mapping for -+ * the device. Otherwise, a DMA API might fail on swiotlb environment. -+ */ -+ blk_queue_max_hw_sectors(sdev->request_queue, -+ min_t(size_t, queue_max_hw_sectors(sdev->request_queue), -+ dma_max_mapping_size(dev) >> SECTOR_SHIFT)); -+ - /* - * Some USB host controllers can't do DMA; they have to use PIO. - * They indicate this by setting their dma_mask to NULL. For -diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c -index fba32d84e578..15abe1d9958f 100644 ---- a/drivers/usb/typec/tcpm/tcpm.c -+++ b/drivers/usb/typec/tcpm/tcpm.c -@@ -379,7 +379,8 @@ static enum tcpm_state tcpm_default_state(struct tcpm_port *port) - return SNK_UNATTACHED; - else if (port->try_role == TYPEC_SOURCE) - return SRC_UNATTACHED; -- else if (port->tcpc->config->default_role == TYPEC_SINK) -+ else if (port->tcpc->config && -+ port->tcpc->config->default_role == TYPEC_SINK) - return SNK_UNATTACHED; - /* Fall through to return SRC_UNATTACHED */ - } else if (port->port_type == TYPEC_PORT_SNK) { -@@ -586,7 +587,20 @@ static void tcpm_debugfs_init(struct tcpm_port *port) - - static void tcpm_debugfs_exit(struct tcpm_port *port) - { -+ int i; -+ -+ mutex_lock(&port->logbuffer_lock); -+ for (i = 0; i < LOG_BUFFER_ENTRIES; i++) { -+ kfree(port->logbuffer[i]); -+ port->logbuffer[i] = NULL; -+ } -+ mutex_unlock(&port->logbuffer_lock); -+ - debugfs_remove(port->dentry); -+ if (list_empty(&rootdir->d_subdirs)) { -+ debugfs_remove(rootdir); -+ rootdir = NULL; -+ } - } - - #else -@@ -1095,7 +1109,8 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt, - break; - case CMD_ATTENTION: - /* Attention command does not have response */ -- typec_altmode_attention(adev, p[1]); -+ if (adev) -+ typec_altmode_attention(adev, p[1]); - return 0; - default: - break; -@@ -1147,20 +1162,26 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt, - } - break; - case CMD_ENTER_MODE: -- typec_altmode_update_active(pdev, true); -- -- if (typec_altmode_vdm(adev, p[0], &p[1], cnt)) { -- response[0] = VDO(adev->svid, 1, CMD_EXIT_MODE); -- response[0] |= VDO_OPOS(adev->mode); -- return 1; -+ if (adev && pdev) { -+ typec_altmode_update_active(pdev, true); -+ -+ if (typec_altmode_vdm(adev, p[0], &p[1], cnt)) { -+ response[0] = VDO(adev->svid, 1, -+ CMD_EXIT_MODE); -+ response[0] |= VDO_OPOS(adev->mode); -+ return 1; -+ } - } - return 0; - case CMD_EXIT_MODE: -- typec_altmode_update_active(pdev, false); -+ if (adev && pdev) { -+ typec_altmode_update_active(pdev, false); - -- /* Back to USB Operation */ -- WARN_ON(typec_altmode_notify(adev, TYPEC_STATE_USB, -- NULL)); -+ /* Back to USB Operation */ -+ WARN_ON(typec_altmode_notify(adev, -+ TYPEC_STATE_USB, -+ NULL)); -+ } - break; - default: - break; -@@ -1170,8 +1191,10 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt, - switch (cmd) { - case CMD_ENTER_MODE: - /* Back to USB Operation */ -- WARN_ON(typec_altmode_notify(adev, TYPEC_STATE_USB, -- NULL)); -+ if (adev) -+ WARN_ON(typec_altmode_notify(adev, -+ TYPEC_STATE_USB, -+ NULL)); - break; - default: - break; -@@ -1182,7 +1205,8 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt, - } - - /* Informing the alternate mode drivers about everything */ -- typec_altmode_vdm(adev, p[0], &p[1], cnt); -+ if (adev) -+ typec_altmode_vdm(adev, p[0], &p[1], cnt); - - return rlen; - } -@@ -4114,7 +4138,7 @@ static int tcpm_try_role(const struct typec_capability *cap, int role) - mutex_lock(&port->lock); - if (tcpc->try_role) - ret = tcpc->try_role(tcpc, role); -- if (!ret && !tcpc->config->try_role_hw) -+ if (!ret && (!tcpc->config || !tcpc->config->try_role_hw)) - port->try_role = role; - port->try_src_count = 0; - port->try_snk_count = 0; -@@ -4701,7 +4725,7 @@ static int tcpm_copy_caps(struct tcpm_port *port, - port->typec_caps.prefer_role = tcfg->default_role; - port->typec_caps.type = tcfg->type; - port->typec_caps.data = tcfg->data; -- port->self_powered = port->tcpc->config->self_powered; -+ port->self_powered = tcfg->self_powered; - - return 0; - } -diff --git a/drivers/usb/typec/tps6598x.c b/drivers/usb/typec/tps6598x.c -index c674abe3cf99..a38d1409f15b 100644 ---- a/drivers/usb/typec/tps6598x.c -+++ b/drivers/usb/typec/tps6598x.c -@@ -41,7 +41,7 @@ - #define TPS_STATUS_VCONN(s) (!!((s) & BIT(7))) - - /* TPS_REG_SYSTEM_CONF bits */ --#define TPS_SYSCONF_PORTINFO(c) ((c) & 3) -+#define TPS_SYSCONF_PORTINFO(c) ((c) & 7) - - enum { - TPS_PORTINFO_SINK, -@@ -127,7 +127,7 @@ tps6598x_block_read(struct tps6598x *tps, u8 reg, void *val, size_t len) - } - - static int tps6598x_block_write(struct tps6598x *tps, u8 reg, -- void *val, size_t len) -+ const void *val, size_t len) - { - u8 data[TPS_MAX_LEN + 1]; - -@@ -173,7 +173,7 @@ static inline int tps6598x_write64(struct tps6598x *tps, u8 reg, u64 val) - static inline int - tps6598x_write_4cc(struct tps6598x *tps, u8 reg, const char *val) - { -- return tps6598x_block_write(tps, reg, &val, sizeof(u32)); -+ return tps6598x_block_write(tps, reg, val, 4); - } - - static int tps6598x_read_partner_identity(struct tps6598x *tps) -diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c b/drivers/usb/typec/ucsi/ucsi_ccg.c -index bf63074675fc..c274a36c2fe4 100644 ---- a/drivers/usb/typec/ucsi/ucsi_ccg.c -+++ b/drivers/usb/typec/ucsi/ucsi_ccg.c -@@ -963,7 +963,7 @@ static int do_flash(struct ucsi_ccg *uc, enum enum_flash_mode mode) - ******************************************************************************/ - static int ccg_fw_update(struct ucsi_ccg *uc, enum enum_flash_mode flash_mode) - { -- int err; -+ int err = 0; - - while (flash_mode != FLASH_NOT_NEEDED) { - err = do_flash(uc, flash_mode); -diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c -index d57ebdd616d9..247e5585af5d 100644 ---- a/drivers/vhost/net.c -+++ b/drivers/vhost/net.c -@@ -35,7 +35,7 @@ - - #include "vhost.h" - --static int experimental_zcopytx = 1; -+static int experimental_zcopytx = 0; - module_param(experimental_zcopytx, int, 0444); - MODULE_PARM_DESC(experimental_zcopytx, "Enable Zero Copy TX;" - " 1 -Enable; 0 - Disable"); -diff --git a/drivers/video/fbdev/omap/hwa742.c b/drivers/video/fbdev/omap/hwa742.c -index cfe63932f825..71c00ef772a3 100644 ---- a/drivers/video/fbdev/omap/hwa742.c -+++ b/drivers/video/fbdev/omap/hwa742.c -@@ -913,7 +913,7 @@ static void hwa742_resume(void) - if (hwa742_read_reg(HWA742_PLL_DIV_REG) & (1 << 7)) - break; - set_current_state(TASK_UNINTERRUPTIBLE); -- schedule_timeout(msecs_to_jiffies(5)); -+ schedule_msec_hrtimeout((5)); - } - hwa742_set_update_mode(hwa742.update_mode_before_suspend); - } -diff --git a/drivers/video/fbdev/pxafb.c b/drivers/video/fbdev/pxafb.c -index d59c8a59f582..e103cce28de7 100644 ---- a/drivers/video/fbdev/pxafb.c -+++ b/drivers/video/fbdev/pxafb.c -@@ -1287,7 +1287,7 @@ static int pxafb_smart_thread(void *arg) - mutex_unlock(&fbi->ctrlr_lock); - - set_current_state(TASK_INTERRUPTIBLE); -- schedule_timeout(msecs_to_jiffies(30)); -+ schedule_msec_hrtimeout((30)); - } - - pr_debug("%s(): task ending\n", __func__); -diff --git a/drivers/video/logo/Kconfig b/drivers/video/logo/Kconfig -index 6d6f8c08792d..8cf2481b6a4a 100644 ---- a/drivers/video/logo/Kconfig -+++ b/drivers/video/logo/Kconfig -@@ -16,56 +16,117 @@ config FB_LOGO_EXTRA - depends on FB=y - default y if SPU_BASE - -+comment "Available logos" -+ -+config LOGO_ZEN_CLUT224 -+ bool "224-color Zen Kernel/Meditating Tux logo" -+ default y -+ - config LOGO_LINUX_MONO - bool "Standard black and white Linux logo" -- default y -+ default n - - config LOGO_LINUX_VGA16 - bool "Standard 16-color Linux logo" -- default y -+ default n - - config LOGO_LINUX_CLUT224 - bool "Standard 224-color Linux logo" -- default y -+ default n -+ -+config LOGO_OLDZEN_CLUT224 -+ bool "224-color Old Zen Kernel logo" -+ depends on LOGO -+ default n -+ -+config LOGO_ARCH_CLUT224 -+ bool "224-color Arch Linux logo" -+ depends on LOGO -+ default n -+ -+config LOGO_GENTOO_CLUT224 -+ bool "224-color Gentoo Linux logo" -+ depends on LOGO -+ default n -+ -+config LOGO_EXHERBO_CLUT224 -+ bool "224-color Exherbo Linux logo" -+ depends on LOGO -+ default n -+ -+config LOGO_SLACKWARE_CLUT224 -+ bool "224-color Slackware Linux logo" -+ depends on LOGO -+ default n -+ -+config LOGO_DEBIAN_CLUT224 -+ bool "224-color Debian Linux logo" -+ depends on LOGO -+ default n -+ -+config LOGO_FEDORASIMPLE_CLUT224 -+ bool "224-color Fedora Simple Linux logo" -+ depends on LOGO -+ default n -+ -+config LOGO_FEDORAGLOSSY_CLUT224 -+ bool "224-color Fedora Glossy Linux logo" -+ depends on LOGO -+ default n -+ -+config LOGO_TITS_CLUT224 -+ bool "224-color Tits logo" -+ depends on LOGO -+ default n -+ -+config LOGO_BSD_CLUT224 -+ bool "224-color BSD Devil logo" -+ depends on LOGO -+ default n -+ -+config LOGO_FBSD_CLUT224 -+ bool "224-color FreeBSD logo" -+ depends on LOGO -+ default n - - config LOGO_DEC_CLUT224 - bool "224-color Digital Equipment Corporation Linux logo" - depends on MACH_DECSTATION || ALPHA -- default y -+ default n - - config LOGO_MAC_CLUT224 - bool "224-color Macintosh Linux logo" - depends on MAC -- default y -+ default n - - config LOGO_PARISC_CLUT224 - bool "224-color PA-RISC Linux logo" - depends on PARISC -- default y -+ default n - - config LOGO_SGI_CLUT224 - bool "224-color SGI Linux logo" - depends on SGI_IP22 || SGI_IP27 || SGI_IP32 -- default y -+ default n - - config LOGO_SUN_CLUT224 - bool "224-color Sun Linux logo" - depends on SPARC -- default y -+ default n - - config LOGO_SUPERH_MONO - bool "Black and white SuperH Linux logo" - depends on SUPERH -- default y -+ default n - - config LOGO_SUPERH_VGA16 - bool "16-color SuperH Linux logo" - depends on SUPERH -- default y -+ default n - - config LOGO_SUPERH_CLUT224 - bool "224-color SuperH Linux logo" - depends on SUPERH -- default y -+ default n - - endif # LOGO -diff --git a/drivers/video/logo/Makefile b/drivers/video/logo/Makefile -index 228a89b9bdd1..679f1cbbf2af 100644 ---- a/drivers/video/logo/Makefile -+++ b/drivers/video/logo/Makefile -@@ -5,6 +5,18 @@ obj-$(CONFIG_LOGO) += logo.o - obj-$(CONFIG_LOGO_LINUX_MONO) += logo_linux_mono.o - obj-$(CONFIG_LOGO_LINUX_VGA16) += logo_linux_vga16.o - obj-$(CONFIG_LOGO_LINUX_CLUT224) += logo_linux_clut224.o -+obj-$(CONFIG_LOGO_ZEN_CLUT224) += logo_zen_clut224.o -+obj-$(CONFIG_LOGO_OLDZEN_CLUT224) += logo_oldzen_clut224.o -+obj-$(CONFIG_LOGO_ARCH_CLUT224) += logo_arch_clut224.o -+obj-$(CONFIG_LOGO_GENTOO_CLUT224) += logo_gentoo_clut224.o -+obj-$(CONFIG_LOGO_EXHERBO_CLUT224) += logo_exherbo_clut224.o -+obj-$(CONFIG_LOGO_SLACKWARE_CLUT224) += logo_slackware_clut224.o -+obj-$(CONFIG_LOGO_DEBIAN_CLUT224) += logo_debian_clut224.o -+obj-$(CONFIG_LOGO_FEDORASIMPLE_CLUT224) += logo_fedorasimple_clut224.o -+obj-$(CONFIG_LOGO_FEDORAGLOSSY_CLUT224) += logo_fedoraglossy_clut224.o -+obj-$(CONFIG_LOGO_TITS_CLUT224) += logo_tits_clut224.o -+obj-$(CONFIG_LOGO_BSD_CLUT224) += logo_bsd_clut224.o -+obj-$(CONFIG_LOGO_FBSD_CLUT224) += logo_fbsd_clut224.o - obj-$(CONFIG_LOGO_DEC_CLUT224) += logo_dec_clut224.o - obj-$(CONFIG_LOGO_MAC_CLUT224) += logo_mac_clut224.o - obj-$(CONFIG_LOGO_PARISC_CLUT224) += logo_parisc_clut224.o -diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c -index 141f15a9a459..8a04b9cfb5b3 100644 ---- a/drivers/video/logo/logo.c -+++ b/drivers/video/logo/logo.c -@@ -99,6 +99,54 @@ const struct linux_logo * __ref fb_find_logo(int depth) - #ifdef CONFIG_LOGO_SUPERH_CLUT224 - /* SuperH Linux logo */ - logo = &logo_superh_clut224; -+#endif -+#ifdef CONFIG_LOGO_ZEN_CLUT224 -+ /* Zen-Kernel logo */ -+ logo = &logo_zen_clut224; -+#endif -+#ifdef CONFIG_LOGO_OLDZEN_CLUT224 -+ /* Old Zen-Kernel logo */ -+ logo = &logo_oldzen_clut224; -+#endif -+#ifdef CONFIG_LOGO_ARCH_CLUT224 -+ /* Arch Linux logo */ -+ logo = &logo_arch_clut224; -+#endif -+#ifdef CONFIG_LOGO_GENTOO_CLUT224 -+ /* Gentoo Linux logo */ -+ logo = &logo_gentoo_clut224; -+#endif -+#ifdef CONFIG_LOGO_EXHERBO_CLUT224 -+ /* Exherbo Linux logo */ -+ logo = &logo_exherbo_clut224; -+#endif -+#ifdef CONFIG_LOGO_SLACKWARE_CLUT224 -+ /* Slackware Linux logo */ -+ logo = &logo_slackware_clut224; -+#endif -+#ifdef CONFIG_LOGO_DEBIAN_CLUT224 -+ /* Debian Linux logo */ -+ logo = &logo_debian_clut224; -+#endif -+#ifdef CONFIG_LOGO_FEDORASIMPLE_CLUT224 -+ /* Fedora Simple logo */ -+ logo = &logo_fedorasimple_clut224; -+#endif -+#ifdef CONFIG_LOGO_FEDORAGLOSSY_CLUT224 -+ /* Fedora Glossy logo */ -+ logo = &logo_fedoraglossy_clut224; -+#endif -+#ifdef CONFIG_LOGO_TITS_CLUT224 -+ /* Tits logo */ -+ logo = &logo_tits_clut224; -+#endif -+#ifdef CONFIG_LOGO_BSD_CLUT224 -+ /* BSD logo */ -+ logo = &logo_bsd_clut224; -+#endif -+#ifdef CONFIG_LOGO_FBSD_CLUT224 -+ /* Free BSD logo */ -+ logo = &logo_fbsd_clut224; - #endif - } - return logo; -diff --git a/drivers/video/logo/logo_arch_clut224.ppm b/drivers/video/logo/logo_arch_clut224.ppm -new file mode 100644 -index 000000000000..e4d8daa69d28 ---- /dev/null -+++ b/drivers/video/logo/logo_arch_clut224.ppm -@@ -0,0 +1,43204 @@ -+P3 -+# CREATOR: GIMP PNM Filter Version 1.1 -+120 120 -+255 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+10 -+110 -+160 -+33 -+122 -+166 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+27 -+151 -+213 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+4 -+45 -+68 -+13 -+147 -+209 -+13 -+147 -+209 -+17 -+73 -+101 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+24 -+137 -+199 -+13 -+147 -+209 -+13 -+147 -+209 -+54 -+155 -+212 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+7 -+10 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+48 -+164 -+219 -+3 -+23 -+31 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+33 -+133 -+182 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+24 -+150 -+212 -+40 -+160 -+215 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+65 -+166 -+216 -+5 -+11 -+14 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+3 -+76 -+109 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+65 -+166 -+216 -+54 -+136 -+181 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+42 -+161 -+216 -+48 -+164 -+219 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+9 -+18 -+24 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+17 -+148 -+210 -+48 -+164 -+219 -+40 -+90 -+118 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+37 -+132 -+189 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+65 -+166 -+216 -+48 -+164 -+219 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+48 -+164 -+219 -+48 -+164 -+219 -+11 -+35 -+49 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+25 -+87 -+120 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+27 -+151 -+213 -+62 -+163 -+214 -+62 -+163 -+214 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+65 -+166 -+216 -+48 -+164 -+219 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+17 -+148 -+210 -+17 -+148 -+210 -+17 -+148 -+210 -+17 -+148 -+210 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+62 -+163 -+214 -+48 -+164 -+219 -+36 -+86 -+115 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+10 -+110 -+160 -+21 -+149 -+211 -+21 -+149 -+211 -+17 -+148 -+210 -+17 -+148 -+210 -+17 -+148 -+210 -+17 -+148 -+210 -+17 -+148 -+210 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+49 -+151 -+208 -+48 -+164 -+219 -+65 -+166 -+216 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+17 -+148 -+210 -+24 -+150 -+212 -+21 -+149 -+211 -+13 -+147 -+209 -+13 -+147 -+209 -+21 -+149 -+211 -+17 -+148 -+210 -+17 -+148 -+210 -+17 -+148 -+210 -+17 -+148 -+210 -+17 -+148 -+210 -+13 -+147 -+209 -+65 -+166 -+216 -+65 -+166 -+216 -+11 -+35 -+49 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+74 -+106 -+31 -+155 -+211 -+24 -+150 -+212 -+24 -+150 -+212 -+27 -+151 -+213 -+17 -+148 -+210 -+21 -+149 -+211 -+13 -+147 -+209 -+13 -+147 -+209 -+49 -+151 -+208 -+21 -+149 -+211 -+17 -+148 -+210 -+17 -+148 -+210 -+48 -+164 -+219 -+65 -+166 -+216 -+62 -+163 -+214 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+24 -+150 -+212 -+17 -+148 -+210 -+31 -+155 -+211 -+17 -+148 -+210 -+17 -+148 -+210 -+2 -+145 -+206 -+31 -+155 -+211 -+31 -+155 -+211 -+27 -+151 -+213 -+21 -+149 -+211 -+49 -+151 -+208 -+21 -+149 -+211 -+21 -+149 -+211 -+49 -+151 -+208 -+65 -+166 -+216 -+65 -+166 -+216 -+5 -+18 -+28 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+27 -+39 -+27 -+151 -+213 -+27 -+151 -+213 -+49 -+151 -+208 -+24 -+150 -+212 -+24 -+150 -+212 -+31 -+155 -+211 -+24 -+150 -+212 -+21 -+149 -+211 -+24 -+150 -+212 -+27 -+151 -+213 -+27 -+151 -+213 -+2 -+145 -+206 -+21 -+149 -+211 -+21 -+149 -+211 -+72 -+171 -+221 -+62 -+163 -+214 -+48 -+154 -+203 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+143 -+204 -+31 -+155 -+211 -+31 -+155 -+211 -+24 -+150 -+212 -+31 -+155 -+211 -+27 -+151 -+213 -+24 -+150 -+212 -+24 -+150 -+212 -+31 -+155 -+211 -+31 -+155 -+211 -+21 -+149 -+211 -+31 -+155 -+211 -+31 -+155 -+211 -+21 -+149 -+211 -+27 -+151 -+213 -+62 -+163 -+214 -+67 -+167 -+217 -+67 -+167 -+217 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+31 -+155 -+211 -+31 -+155 -+211 -+31 -+155 -+211 -+31 -+155 -+211 -+24 -+150 -+212 -+24 -+150 -+212 -+24 -+150 -+212 -+21 -+149 -+211 -+31 -+155 -+211 -+29 -+152 -+214 -+21 -+149 -+211 -+17 -+148 -+210 -+31 -+155 -+211 -+17 -+148 -+210 -+24 -+150 -+212 -+49 -+151 -+208 -+67 -+167 -+217 -+67 -+167 -+217 -+49 -+132 -+177 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+29 -+108 -+153 -+51 -+153 -+210 -+51 -+153 -+210 -+31 -+155 -+211 -+31 -+155 -+211 -+24 -+150 -+212 -+24 -+150 -+212 -+31 -+155 -+211 -+31 -+155 -+211 -+24 -+150 -+212 -+24 -+150 -+212 -+27 -+151 -+213 -+27 -+151 -+213 -+49 -+151 -+208 -+21 -+149 -+211 -+21 -+149 -+211 -+27 -+151 -+213 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+49 -+151 -+208 -+31 -+155 -+211 -+51 -+153 -+210 -+29 -+152 -+214 -+32 -+153 -+215 -+32 -+153 -+215 -+29 -+152 -+214 -+31 -+155 -+211 -+24 -+150 -+212 -+24 -+150 -+212 -+24 -+150 -+212 -+31 -+155 -+211 -+24 -+150 -+212 -+31 -+155 -+211 -+31 -+155 -+211 -+27 -+151 -+213 -+24 -+150 -+212 -+62 -+163 -+214 -+68 -+168 -+218 -+68 -+168 -+218 -+40 -+90 -+118 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+71 -+103 -+33 -+156 -+212 -+31 -+155 -+211 -+31 -+155 -+211 -+31 -+155 -+211 -+49 -+151 -+208 -+29 -+152 -+214 -+31 -+155 -+211 -+31 -+155 -+211 -+32 -+153 -+215 -+24 -+150 -+212 -+24 -+150 -+212 -+31 -+155 -+211 -+31 -+155 -+211 -+24 -+150 -+212 -+31 -+155 -+211 -+31 -+155 -+211 -+24 -+150 -+212 -+29 -+152 -+214 -+78 -+167 -+212 -+68 -+168 -+218 -+65 -+166 -+216 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+31 -+155 -+211 -+31 -+155 -+211 -+33 -+156 -+212 -+32 -+153 -+215 -+32 -+153 -+215 -+51 -+153 -+210 -+51 -+153 -+210 -+31 -+155 -+211 -+49 -+151 -+208 -+29 -+152 -+214 -+29 -+152 -+214 -+31 -+155 -+211 -+32 -+153 -+215 -+31 -+155 -+211 -+31 -+155 -+211 -+24 -+150 -+212 -+24 -+150 -+212 -+24 -+150 -+212 -+31 -+155 -+211 -+68 -+168 -+218 -+69 -+169 -+219 -+71 -+170 -+220 -+16 -+56 -+73 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+11 -+35 -+49 -+33 -+156 -+212 -+33 -+156 -+212 -+53 -+154 -+211 -+53 -+154 -+211 -+31 -+155 -+211 -+31 -+155 -+211 -+31 -+155 -+211 -+51 -+153 -+210 -+31 -+155 -+211 -+31 -+155 -+211 -+31 -+155 -+211 -+51 -+153 -+210 -+51 -+153 -+210 -+29 -+152 -+214 -+51 -+153 -+210 -+31 -+155 -+211 -+31 -+155 -+211 -+24 -+150 -+212 -+31 -+155 -+211 -+31 -+155 -+211 -+69 -+169 -+219 -+69 -+169 -+219 -+65 -+166 -+216 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+49 -+151 -+208 -+32 -+153 -+215 -+33 -+156 -+212 -+32 -+153 -+215 -+54 -+155 -+212 -+31 -+155 -+211 -+32 -+153 -+215 -+32 -+153 -+215 -+33 -+156 -+212 -+31 -+155 -+211 -+32 -+153 -+215 -+29 -+152 -+214 -+51 -+153 -+210 -+32 -+153 -+215 -+31 -+155 -+211 -+31 -+155 -+211 -+29 -+152 -+214 -+31 -+155 -+211 -+51 -+153 -+210 -+31 -+155 -+211 -+31 -+155 -+211 -+68 -+168 -+218 -+82 -+170 -+215 -+69 -+169 -+219 -+12 -+30 -+39 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+18 -+23 -+54 -+155 -+212 -+54 -+155 -+212 -+33 -+156 -+212 -+33 -+156 -+212 -+33 -+156 -+212 -+33 -+156 -+212 -+38 -+159 -+214 -+53 -+154 -+211 -+53 -+154 -+211 -+33 -+156 -+212 -+31 -+155 -+211 -+31 -+155 -+211 -+33 -+156 -+212 -+32 -+153 -+215 -+32 -+153 -+215 -+31 -+155 -+211 -+31 -+155 -+211 -+51 -+153 -+210 -+31 -+155 -+211 -+31 -+155 -+211 -+31 -+155 -+211 -+44 -+162 -+217 -+82 -+170 -+215 -+71 -+170 -+220 -+62 -+163 -+214 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+41 -+147 -+203 -+42 -+161 -+216 -+38 -+159 -+214 -+54 -+155 -+212 -+38 -+159 -+214 -+38 -+159 -+214 -+32 -+153 -+215 -+33 -+156 -+212 -+32 -+153 -+215 -+32 -+153 -+215 -+54 -+155 -+212 -+54 -+155 -+212 -+32 -+153 -+215 -+31 -+155 -+211 -+31 -+155 -+211 -+32 -+153 -+215 -+32 -+153 -+215 -+33 -+156 -+212 -+31 -+155 -+211 -+49 -+151 -+208 -+31 -+155 -+211 -+49 -+151 -+208 -+32 -+153 -+215 -+72 -+171 -+221 -+71 -+170 -+220 -+71 -+170 -+220 -+8 -+27 -+35 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+9 -+12 -+42 -+161 -+216 -+42 -+161 -+216 -+54 -+155 -+212 -+54 -+155 -+212 -+42 -+161 -+216 -+54 -+155 -+212 -+54 -+155 -+212 -+38 -+159 -+214 -+38 -+159 -+214 -+38 -+159 -+214 -+54 -+155 -+212 -+38 -+159 -+214 -+33 -+156 -+212 -+33 -+156 -+212 -+33 -+156 -+212 -+53 -+154 -+211 -+32 -+153 -+215 -+32 -+153 -+215 -+31 -+155 -+211 -+33 -+156 -+212 -+32 -+153 -+215 -+32 -+153 -+215 -+32 -+153 -+215 -+62 -+163 -+214 -+82 -+170 -+215 -+72 -+171 -+221 -+55 -+159 -+209 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+42 -+139 -+189 -+44 -+162 -+217 -+44 -+162 -+217 -+54 -+155 -+212 -+42 -+161 -+216 -+42 -+161 -+216 -+54 -+155 -+212 -+54 -+155 -+212 -+42 -+161 -+216 -+38 -+159 -+214 -+54 -+155 -+212 -+54 -+155 -+212 -+40 -+160 -+215 -+54 -+155 -+212 -+33 -+156 -+212 -+38 -+159 -+214 -+54 -+155 -+212 -+54 -+155 -+212 -+33 -+156 -+212 -+33 -+156 -+212 -+53 -+154 -+211 -+33 -+156 -+212 -+31 -+155 -+211 -+31 -+155 -+211 -+54 -+155 -+212 -+72 -+171 -+221 -+72 -+171 -+221 -+71 -+170 -+220 -+5 -+11 -+14 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+44 -+162 -+217 -+55 -+159 -+209 -+54 -+155 -+212 -+54 -+155 -+212 -+54 -+155 -+212 -+54 -+155 -+212 -+54 -+155 -+212 -+42 -+161 -+216 -+42 -+161 -+216 -+42 -+161 -+216 -+42 -+161 -+216 -+42 -+161 -+216 -+54 -+155 -+212 -+38 -+159 -+214 -+38 -+159 -+214 -+38 -+159 -+214 -+38 -+159 -+214 -+38 -+159 -+214 -+33 -+156 -+212 -+54 -+155 -+212 -+54 -+155 -+212 -+33 -+156 -+212 -+53 -+154 -+211 -+32 -+153 -+215 -+33 -+156 -+212 -+68 -+168 -+218 -+74 -+172 -+223 -+72 -+171 -+221 -+48 -+154 -+203 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+13 -+51 -+74 -+40 -+160 -+215 -+55 -+159 -+209 -+42 -+161 -+216 -+42 -+161 -+216 -+54 -+155 -+212 -+40 -+160 -+215 -+62 -+163 -+214 -+44 -+162 -+217 -+42 -+161 -+216 -+54 -+155 -+212 -+54 -+155 -+212 -+42 -+161 -+216 -+54 -+155 -+212 -+54 -+155 -+212 -+54 -+155 -+212 -+54 -+155 -+212 -+54 -+155 -+212 -+38 -+159 -+214 -+54 -+155 -+212 -+40 -+160 -+215 -+32 -+153 -+215 -+54 -+155 -+212 -+33 -+156 -+212 -+38 -+159 -+214 -+33 -+156 -+212 -+31 -+155 -+211 -+83 -+172 -+217 -+74 -+172 -+223 -+82 -+170 -+215 -+0 -+7 -+10 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+24 -+70 -+92 -+48 -+164 -+219 -+62 -+163 -+214 -+54 -+155 -+212 -+54 -+155 -+212 -+55 -+159 -+209 -+46 -+163 -+218 -+54 -+155 -+212 -+46 -+163 -+218 -+55 -+159 -+209 -+54 -+155 -+212 -+54 -+155 -+212 -+42 -+161 -+216 -+42 -+161 -+216 -+42 -+161 -+216 -+42 -+161 -+216 -+42 -+161 -+216 -+54 -+155 -+212 -+38 -+159 -+214 -+54 -+155 -+212 -+38 -+159 -+214 -+40 -+160 -+215 -+32 -+153 -+215 -+54 -+155 -+212 -+54 -+155 -+212 -+33 -+156 -+212 -+72 -+171 -+221 -+74 -+172 -+223 -+74 -+172 -+223 -+53 -+145 -+195 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+23 -+77 -+105 -+44 -+162 -+217 -+48 -+164 -+219 -+44 -+162 -+217 -+54 -+155 -+212 -+42 -+161 -+216 -+46 -+163 -+218 -+62 -+163 -+214 -+40 -+160 -+215 -+55 -+159 -+209 -+44 -+162 -+217 -+40 -+160 -+215 -+33 -+156 -+212 -+54 -+155 -+212 -+54 -+155 -+212 -+42 -+161 -+216 -+54 -+155 -+212 -+42 -+161 -+216 -+42 -+161 -+216 -+42 -+161 -+216 -+54 -+155 -+212 -+38 -+159 -+214 -+38 -+159 -+214 -+40 -+160 -+215 -+40 -+160 -+215 -+33 -+156 -+212 -+74 -+172 -+223 -+83 -+172 -+217 -+74 -+172 -+223 -+0 -+7 -+10 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+36 -+86 -+115 -+48 -+164 -+219 -+44 -+162 -+217 -+44 -+162 -+217 -+54 -+155 -+212 -+62 -+163 -+214 -+46 -+163 -+218 -+40 -+160 -+215 -+42 -+161 -+216 -+44 -+162 -+217 -+46 -+163 -+218 -+55 -+159 -+209 -+44 -+162 -+217 -+33 -+156 -+212 -+55 -+159 -+209 -+42 -+161 -+216 -+54 -+155 -+212 -+42 -+161 -+216 -+42 -+161 -+216 -+54 -+155 -+212 -+42 -+161 -+216 -+42 -+161 -+216 -+38 -+159 -+214 -+54 -+155 -+212 -+38 -+159 -+214 -+74 -+172 -+223 -+74 -+172 -+223 -+86 -+174 -+219 -+54 -+136 -+181 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+23 -+88 -+115 -+5 -+18 -+28 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+24 -+70 -+92 -+62 -+163 -+214 -+54 -+155 -+212 -+62 -+163 -+214 -+44 -+162 -+217 -+54 -+155 -+212 -+48 -+164 -+219 -+48 -+164 -+219 -+54 -+155 -+212 -+42 -+161 -+216 -+48 -+164 -+219 -+42 -+161 -+216 -+54 -+155 -+212 -+40 -+160 -+215 -+54 -+155 -+212 -+40 -+160 -+215 -+40 -+160 -+215 -+54 -+155 -+212 -+42 -+161 -+216 -+42 -+161 -+216 -+42 -+161 -+216 -+42 -+161 -+216 -+42 -+161 -+216 -+54 -+155 -+212 -+42 -+161 -+216 -+74 -+172 -+223 -+86 -+174 -+219 -+83 -+172 -+217 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+62 -+163 -+214 -+67 -+167 -+217 -+36 -+86 -+115 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+16 -+56 -+73 -+62 -+163 -+214 -+46 -+163 -+218 -+62 -+163 -+214 -+44 -+162 -+217 -+46 -+163 -+218 -+44 -+162 -+217 -+62 -+163 -+214 -+44 -+162 -+217 -+46 -+163 -+218 -+54 -+155 -+212 -+54 -+155 -+212 -+42 -+161 -+216 -+55 -+159 -+209 -+54 -+155 -+212 -+55 -+159 -+209 -+54 -+155 -+212 -+55 -+159 -+209 -+54 -+155 -+212 -+42 -+161 -+216 -+54 -+155 -+212 -+42 -+161 -+216 -+54 -+155 -+212 -+42 -+161 -+216 -+74 -+172 -+223 -+86 -+174 -+219 -+86 -+174 -+219 -+57 -+132 -+172 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+23 -+88 -+115 -+62 -+163 -+214 -+48 -+164 -+219 -+48 -+164 -+219 -+42 -+151 -+200 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+18 -+42 -+55 -+44 -+162 -+217 -+62 -+163 -+214 -+48 -+164 -+219 -+62 -+163 -+214 -+54 -+155 -+212 -+44 -+162 -+217 -+65 -+166 -+216 -+46 -+163 -+218 -+48 -+164 -+219 -+44 -+162 -+217 -+62 -+163 -+214 -+42 -+161 -+216 -+62 -+163 -+214 -+46 -+163 -+218 -+44 -+162 -+217 -+54 -+155 -+212 -+55 -+159 -+209 -+54 -+155 -+212 -+40 -+160 -+215 -+40 -+160 -+215 -+54 -+155 -+212 -+42 -+161 -+216 -+55 -+159 -+209 -+86 -+174 -+219 -+86 -+174 -+219 -+85 -+173 -+218 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+62 -+163 -+214 -+62 -+163 -+214 -+62 -+163 -+214 -+48 -+164 -+219 -+60 -+162 -+212 -+62 -+163 -+214 -+16 -+56 -+73 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+16 -+23 -+62 -+163 -+214 -+44 -+162 -+217 -+62 -+163 -+214 -+46 -+163 -+218 -+48 -+164 -+219 -+62 -+163 -+214 -+46 -+163 -+218 -+62 -+163 -+214 -+62 -+163 -+214 -+44 -+162 -+217 -+67 -+167 -+217 -+44 -+162 -+217 -+54 -+155 -+212 -+54 -+155 -+212 -+42 -+161 -+216 -+48 -+164 -+219 -+54 -+155 -+212 -+54 -+155 -+212 -+40 -+160 -+215 -+42 -+161 -+216 -+62 -+163 -+214 -+40 -+160 -+215 -+74 -+172 -+223 -+90 -+177 -+222 -+87 -+175 -+220 -+28 -+73 -+96 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+19 -+48 -+67 -+48 -+164 -+219 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+48 -+164 -+219 -+60 -+162 -+212 -+62 -+163 -+214 -+8 -+27 -+35 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+1 -+4 -+54 -+155 -+212 -+67 -+167 -+217 -+68 -+168 -+218 -+65 -+166 -+216 -+62 -+163 -+214 -+62 -+163 -+214 -+65 -+166 -+216 -+62 -+163 -+214 -+62 -+163 -+214 -+44 -+162 -+217 -+48 -+164 -+219 -+54 -+155 -+212 -+62 -+163 -+214 -+48 -+164 -+219 -+62 -+163 -+214 -+54 -+155 -+212 -+42 -+161 -+216 -+54 -+155 -+212 -+46 -+163 -+218 -+42 -+161 -+216 -+42 -+161 -+216 -+54 -+155 -+212 -+87 -+175 -+220 -+87 -+175 -+220 -+85 -+173 -+218 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+67 -+167 -+217 -+65 -+166 -+216 -+67 -+167 -+217 -+65 -+166 -+216 -+62 -+163 -+214 -+65 -+166 -+216 -+48 -+164 -+219 -+65 -+166 -+216 -+62 -+163 -+214 -+65 -+166 -+216 -+53 -+145 -+195 -+0 -+7 -+10 -+0 -+2 -+0 -+0 -+4 -+7 -+58 -+151 -+195 -+54 -+155 -+212 -+48 -+164 -+219 -+69 -+169 -+219 -+48 -+164 -+219 -+46 -+163 -+218 -+48 -+164 -+219 -+46 -+163 -+218 -+54 -+155 -+212 -+62 -+163 -+214 -+54 -+155 -+212 -+44 -+162 -+217 -+42 -+161 -+216 -+62 -+163 -+214 -+48 -+164 -+219 -+44 -+162 -+217 -+54 -+155 -+212 -+44 -+162 -+217 -+54 -+155 -+212 -+38 -+159 -+214 -+48 -+164 -+219 -+83 -+172 -+217 -+90 -+177 -+222 -+90 -+177 -+222 -+30 -+93 -+120 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+22 -+45 -+59 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+72 -+171 -+221 -+65 -+166 -+216 -+48 -+164 -+219 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+33 -+133 -+182 -+0 -+4 -+7 -+0 -+1 -+4 -+34 -+104 -+137 -+62 -+163 -+214 -+62 -+163 -+214 -+62 -+163 -+214 -+62 -+163 -+214 -+67 -+167 -+217 -+69 -+169 -+219 -+62 -+163 -+214 -+62 -+163 -+214 -+48 -+164 -+219 -+62 -+163 -+214 -+62 -+163 -+214 -+62 -+163 -+214 -+48 -+164 -+219 -+65 -+166 -+216 -+42 -+161 -+216 -+48 -+164 -+219 -+48 -+164 -+219 -+44 -+162 -+217 -+55 -+159 -+209 -+38 -+159 -+214 -+88 -+176 -+221 -+88 -+176 -+221 -+85 -+173 -+218 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+65 -+166 -+216 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+67 -+167 -+217 -+62 -+163 -+214 -+65 -+166 -+216 -+62 -+163 -+214 -+48 -+164 -+219 -+68 -+168 -+218 -+36 -+115 -+153 -+0 -+4 -+7 -+17 -+35 -+44 -+62 -+163 -+214 -+65 -+166 -+216 -+62 -+163 -+214 -+48 -+164 -+219 -+48 -+164 -+219 -+62 -+163 -+214 -+67 -+167 -+217 -+68 -+168 -+218 -+62 -+163 -+214 -+65 -+166 -+216 -+62 -+163 -+214 -+44 -+162 -+217 -+65 -+166 -+216 -+62 -+163 -+214 -+62 -+163 -+214 -+48 -+164 -+219 -+62 -+163 -+214 -+44 -+162 -+217 -+54 -+155 -+212 -+72 -+171 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+40 -+90 -+118 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+26 -+49 -+63 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+67 -+167 -+217 -+48 -+164 -+219 -+48 -+164 -+219 -+65 -+166 -+216 -+62 -+163 -+214 -+31 -+134 -+178 -+5 -+11 -+14 -+48 -+154 -+203 -+60 -+162 -+212 -+48 -+164 -+219 -+62 -+163 -+214 -+48 -+164 -+219 -+68 -+168 -+218 -+48 -+164 -+219 -+62 -+163 -+214 -+62 -+163 -+214 -+68 -+168 -+218 -+62 -+163 -+214 -+48 -+164 -+219 -+65 -+166 -+216 -+54 -+155 -+212 -+62 -+163 -+214 -+44 -+162 -+217 -+48 -+164 -+219 -+62 -+163 -+214 -+42 -+161 -+216 -+90 -+177 -+222 -+88 -+176 -+221 -+85 -+173 -+218 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+62 -+163 -+214 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+67 -+167 -+217 -+65 -+166 -+216 -+62 -+163 -+214 -+62 -+163 -+214 -+48 -+154 -+203 -+53 -+127 -+166 -+48 -+164 -+219 -+65 -+166 -+216 -+62 -+163 -+214 -+48 -+164 -+219 -+62 -+163 -+214 -+54 -+155 -+212 -+69 -+169 -+219 -+48 -+164 -+219 -+67 -+167 -+217 -+48 -+164 -+219 -+62 -+163 -+214 -+46 -+163 -+218 -+62 -+163 -+214 -+62 -+163 -+214 -+46 -+163 -+218 -+46 -+163 -+218 -+46 -+163 -+218 -+74 -+172 -+223 -+90 -+177 -+222 -+90 -+177 -+222 -+25 -+99 -+131 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+22 -+45 -+59 -+78 -+167 -+212 -+78 -+167 -+212 -+69 -+169 -+219 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+48 -+164 -+219 -+48 -+164 -+219 -+62 -+163 -+214 -+48 -+164 -+219 -+62 -+163 -+214 -+65 -+166 -+216 -+48 -+164 -+219 -+48 -+164 -+219 -+60 -+162 -+212 -+48 -+164 -+219 -+64 -+165 -+215 -+62 -+163 -+214 -+71 -+170 -+220 -+48 -+164 -+219 -+62 -+163 -+214 -+48 -+164 -+219 -+62 -+163 -+214 -+62 -+163 -+214 -+44 -+162 -+217 -+62 -+163 -+214 -+62 -+163 -+214 -+90 -+177 -+222 -+90 -+177 -+222 -+74 -+172 -+223 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+78 -+167 -+212 -+71 -+170 -+220 -+69 -+169 -+219 -+69 -+169 -+219 -+69 -+169 -+219 -+69 -+169 -+219 -+69 -+169 -+219 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+68 -+168 -+218 -+65 -+166 -+216 -+62 -+163 -+214 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+48 -+164 -+219 -+65 -+166 -+216 -+48 -+164 -+219 -+48 -+164 -+219 -+62 -+163 -+214 -+48 -+164 -+219 -+62 -+163 -+214 -+48 -+164 -+219 -+54 -+155 -+212 -+48 -+164 -+219 -+69 -+169 -+219 -+62 -+163 -+214 -+78 -+167 -+212 -+102 -+181 -+221 -+90 -+177 -+222 -+34 -+104 -+137 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+19 -+48 -+67 -+71 -+170 -+220 -+71 -+170 -+220 -+69 -+169 -+219 -+78 -+167 -+212 -+71 -+170 -+220 -+78 -+167 -+212 -+71 -+170 -+220 -+69 -+169 -+219 -+69 -+169 -+219 -+71 -+170 -+220 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+68 -+168 -+218 -+65 -+166 -+216 -+62 -+163 -+214 -+65 -+166 -+216 -+48 -+164 -+219 -+48 -+164 -+219 -+48 -+164 -+219 -+48 -+164 -+219 -+62 -+163 -+214 -+48 -+164 -+219 -+62 -+163 -+214 -+62 -+163 -+214 -+62 -+163 -+214 -+65 -+166 -+216 -+48 -+164 -+219 -+62 -+163 -+214 -+90 -+177 -+222 -+88 -+176 -+221 -+87 -+175 -+220 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+69 -+169 -+219 -+82 -+170 -+215 -+82 -+170 -+215 -+69 -+169 -+219 -+71 -+170 -+220 -+82 -+170 -+215 -+71 -+170 -+220 -+78 -+167 -+212 -+78 -+167 -+212 -+71 -+170 -+220 -+69 -+169 -+219 -+71 -+170 -+220 -+78 -+167 -+212 -+69 -+169 -+219 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+68 -+168 -+218 -+62 -+163 -+214 -+62 -+163 -+214 -+65 -+166 -+216 -+62 -+163 -+214 -+65 -+166 -+216 -+48 -+164 -+219 -+64 -+165 -+215 -+62 -+163 -+214 -+48 -+164 -+219 -+48 -+164 -+219 -+62 -+163 -+214 -+62 -+163 -+214 -+65 -+166 -+216 -+91 -+178 -+224 -+91 -+178 -+224 -+21 -+105 -+143 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+22 -+61 -+78 -+74 -+172 -+223 -+82 -+170 -+215 -+82 -+170 -+215 -+72 -+171 -+221 -+72 -+171 -+221 -+71 -+170 -+220 -+71 -+170 -+220 -+82 -+170 -+215 -+69 -+169 -+219 -+71 -+170 -+220 -+69 -+169 -+219 -+69 -+169 -+219 -+69 -+169 -+219 -+69 -+169 -+219 -+69 -+169 -+219 -+69 -+169 -+219 -+69 -+169 -+219 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+62 -+163 -+214 -+65 -+166 -+216 -+62 -+163 -+214 -+65 -+166 -+216 -+48 -+164 -+219 -+48 -+164 -+219 -+65 -+166 -+216 -+65 -+166 -+216 -+60 -+162 -+212 -+60 -+162 -+212 -+48 -+164 -+219 -+91 -+178 -+224 -+91 -+178 -+224 -+88 -+176 -+221 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+1 -+4 -+82 -+170 -+215 -+74 -+172 -+223 -+83 -+172 -+217 -+83 -+172 -+217 -+83 -+172 -+217 -+82 -+170 -+215 -+72 -+171 -+221 -+72 -+171 -+221 -+82 -+170 -+215 -+71 -+170 -+220 -+69 -+169 -+219 -+71 -+170 -+220 -+71 -+170 -+220 -+82 -+170 -+215 -+69 -+169 -+219 -+71 -+170 -+220 -+69 -+169 -+219 -+71 -+170 -+220 -+69 -+169 -+219 -+78 -+167 -+212 -+69 -+169 -+219 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+67 -+167 -+217 -+65 -+166 -+216 -+62 -+163 -+214 -+62 -+163 -+214 -+65 -+166 -+216 -+48 -+164 -+219 -+67 -+167 -+217 -+65 -+166 -+216 -+62 -+163 -+214 -+90 -+177 -+222 -+91 -+178 -+224 -+48 -+115 -+149 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+45 -+104 -+131 -+74 -+172 -+223 -+83 -+172 -+217 -+74 -+172 -+223 -+83 -+172 -+217 -+74 -+172 -+223 -+83 -+172 -+217 -+83 -+172 -+217 -+83 -+172 -+217 -+82 -+170 -+215 -+82 -+170 -+215 -+82 -+170 -+215 -+82 -+170 -+215 -+82 -+170 -+215 -+71 -+170 -+220 -+69 -+169 -+219 -+71 -+170 -+220 -+71 -+170 -+220 -+71 -+170 -+220 -+69 -+169 -+219 -+69 -+169 -+219 -+71 -+170 -+220 -+69 -+169 -+219 -+78 -+167 -+212 -+69 -+169 -+219 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+68 -+168 -+218 -+62 -+163 -+214 -+48 -+164 -+219 -+48 -+164 -+219 -+48 -+164 -+219 -+67 -+167 -+217 -+71 -+170 -+220 -+91 -+178 -+224 -+91 -+178 -+224 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+85 -+173 -+218 -+74 -+172 -+223 -+85 -+173 -+218 -+85 -+173 -+218 -+74 -+172 -+223 -+74 -+172 -+223 -+74 -+172 -+223 -+83 -+172 -+217 -+74 -+172 -+223 -+83 -+172 -+217 -+83 -+172 -+217 -+83 -+172 -+217 -+72 -+171 -+221 -+72 -+171 -+221 -+72 -+171 -+221 -+72 -+171 -+221 -+71 -+170 -+220 -+82 -+170 -+215 -+82 -+170 -+215 -+71 -+170 -+220 -+82 -+170 -+215 -+69 -+169 -+219 -+78 -+167 -+212 -+69 -+169 -+219 -+69 -+169 -+219 -+78 -+167 -+212 -+69 -+169 -+219 -+69 -+169 -+219 -+69 -+169 -+219 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+68 -+168 -+218 -+48 -+164 -+219 -+62 -+163 -+214 -+62 -+163 -+214 -+90 -+177 -+222 -+91 -+178 -+224 -+50 -+145 -+189 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+48 -+115 -+149 -+86 -+174 -+219 -+88 -+176 -+221 -+88 -+176 -+221 -+86 -+174 -+219 -+86 -+174 -+219 -+85 -+173 -+218 -+86 -+174 -+219 -+85 -+173 -+218 -+83 -+172 -+217 -+83 -+172 -+217 -+83 -+172 -+217 -+74 -+172 -+223 -+83 -+172 -+217 -+83 -+172 -+217 -+74 -+172 -+223 -+72 -+171 -+221 -+82 -+170 -+215 -+82 -+170 -+215 -+72 -+171 -+221 -+71 -+170 -+220 -+71 -+170 -+220 -+82 -+170 -+215 -+71 -+170 -+220 -+82 -+170 -+215 -+69 -+169 -+219 -+69 -+169 -+219 -+69 -+169 -+219 -+68 -+168 -+218 -+69 -+169 -+219 -+68 -+168 -+218 -+68 -+168 -+218 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+68 -+168 -+218 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+62 -+163 -+214 -+102 -+181 -+221 -+91 -+178 -+224 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+88 -+176 -+221 -+87 -+175 -+220 -+88 -+176 -+221 -+74 -+172 -+223 -+86 -+174 -+219 -+86 -+174 -+219 -+88 -+176 -+221 -+85 -+173 -+218 -+86 -+174 -+219 -+74 -+172 -+223 -+85 -+173 -+218 -+74 -+172 -+223 -+74 -+172 -+223 -+83 -+172 -+217 -+83 -+172 -+217 -+83 -+172 -+217 -+74 -+172 -+223 -+74 -+172 -+223 -+74 -+172 -+223 -+82 -+170 -+215 -+82 -+170 -+215 -+82 -+170 -+215 -+78 -+167 -+212 -+48 -+164 -+219 -+29 -+152 -+214 -+17 -+148 -+210 -+7 -+146 -+208 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+49 -+151 -+208 -+33 -+156 -+212 -+48 -+164 -+219 -+65 -+166 -+216 -+62 -+163 -+214 -+67 -+167 -+217 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+88 -+176 -+221 -+95 -+181 -+227 -+50 -+145 -+189 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+64 -+129 -+163 -+87 -+175 -+220 -+87 -+175 -+220 -+87 -+175 -+220 -+87 -+175 -+220 -+87 -+175 -+220 -+74 -+172 -+223 -+86 -+174 -+219 -+86 -+174 -+219 -+88 -+176 -+221 -+86 -+174 -+219 -+86 -+174 -+219 -+85 -+173 -+218 -+86 -+174 -+219 -+85 -+173 -+218 -+74 -+172 -+223 -+74 -+172 -+223 -+83 -+172 -+217 -+83 -+172 -+217 -+82 -+170 -+215 -+55 -+159 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+51 -+153 -+210 -+62 -+163 -+214 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+65 -+166 -+216 -+93 -+180 -+226 -+91 -+178 -+224 -+2 -+9 -+12 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+88 -+176 -+221 -+88 -+176 -+221 -+87 -+175 -+220 -+87 -+175 -+220 -+87 -+175 -+220 -+90 -+177 -+222 -+88 -+176 -+221 -+74 -+172 -+223 -+74 -+172 -+223 -+86 -+174 -+219 -+74 -+172 -+223 -+86 -+174 -+219 -+86 -+174 -+219 -+74 -+172 -+223 -+85 -+173 -+218 -+74 -+172 -+223 -+71 -+170 -+220 -+24 -+150 -+212 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+31 -+155 -+211 -+62 -+163 -+214 -+69 -+169 -+219 -+102 -+181 -+221 -+66 -+157 -+202 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+68 -+139 -+173 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+87 -+175 -+220 -+87 -+175 -+220 -+87 -+175 -+220 -+87 -+175 -+220 -+91 -+178 -+224 -+87 -+175 -+220 -+74 -+172 -+223 -+86 -+174 -+219 -+86 -+174 -+219 -+29 -+152 -+214 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+65 -+166 -+216 -+93 -+180 -+226 -+5 -+11 -+14 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+87 -+175 -+220 -+87 -+175 -+220 -+74 -+172 -+223 -+82 -+170 -+215 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+62 -+163 -+214 -+55 -+159 -+209 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+76 -+157 -+196 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+87 -+175 -+220 -+62 -+163 -+214 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+24 -+150 -+212 -+48 -+164 -+219 -+5 -+18 -+28 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+5 -+11 -+14 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+68 -+168 -+218 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+48 -+164 -+219 -+62 -+163 -+214 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+73 -+163 -+208 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+78 -+167 -+212 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+67 -+167 -+217 -+0 -+7 -+10 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+1 -+0 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+83 -+172 -+217 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+17 -+148 -+210 -+42 -+151 -+200 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+73 -+163 -+208 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+83 -+172 -+217 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+54 -+155 -+212 -+2 -+27 -+39 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+13 -+16 -+88 -+176 -+221 -+88 -+176 -+221 -+88 -+176 -+221 -+86 -+174 -+219 -+21 -+149 -+211 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+55 -+159 -+209 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+78 -+167 -+212 -+88 -+176 -+221 -+87 -+175 -+220 -+33 -+156 -+212 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+17 -+148 -+210 -+14 -+38 -+51 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+12 -+30 -+39 -+88 -+176 -+221 -+71 -+170 -+220 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+31 -+155 -+211 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+102 -+181 -+221 -+17 -+148 -+210 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+8 -+135 -+190 -+3 -+28 -+41 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+5 -+18 -+28 -+7 -+123 -+172 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+19 -+48 -+67 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+10 -+42 -+60 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+143 -+204 -+1 -+4 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+1 -+4 -+16 -+137 -+192 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+139 -+199 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+23 -+115 -+165 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+60 -+88 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+65 -+92 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+8 -+135 -+190 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+10 -+110 -+160 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+33 -+120 -+170 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+85 -+122 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+6 -+88 -+126 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+7 -+10 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+17 -+148 -+210 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+90 -+129 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+5 -+18 -+28 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+17 -+102 -+146 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+10 -+110 -+160 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+129 -+183 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+17 -+148 -+210 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+1 -+11 -+20 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+8 -+33 -+46 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+139 -+199 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+16 -+137 -+192 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+24 -+126 -+182 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+17 -+148 -+210 -+4 -+14 -+21 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+22 -+30 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+90 -+129 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+5 -+11 -+14 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+28 -+141 -+196 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+24 -+37 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+4 -+45 -+68 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+26 -+97 -+136 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+19 -+113 -+163 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+4 -+14 -+21 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+10 -+42 -+60 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+71 -+103 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+6 -+31 -+44 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+17 -+148 -+210 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+34 -+143 -+199 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+60 -+88 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+9 -+99 -+143 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+27 -+117 -+167 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+10 -+69 -+97 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+6 -+39 -+56 -+23 -+115 -+165 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+6 -+39 -+56 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+85 -+122 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+28 -+141 -+196 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+27 -+39 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+24 -+126 -+182 -+0 -+4 -+7 -+0 -+4 -+7 -+18 -+92 -+131 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+31 -+129 -+185 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+9 -+12 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+17 -+102 -+146 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+9 -+12 -+19 -+113 -+163 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+11 -+61 -+83 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+33 -+133 -+182 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+27 -+117 -+167 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+85 -+122 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+5 -+11 -+14 -+33 -+133 -+182 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+5 -+11 -+14 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+2 -+111 -+154 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+1 -+4 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+24 -+137 -+199 -+5 -+11 -+14 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+3 -+6 -+20 -+127 -+176 -+13 -+147 -+209 -+2 -+111 -+154 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+139 -+199 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+118 -+167 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+9 -+99 -+143 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+9 -+12 -+37 -+132 -+189 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+27 -+39 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+27 -+117 -+167 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+1 -+4 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+1 -+0 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+139 -+199 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+57 -+84 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+60 -+87 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+24 -+137 -+199 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+9 -+12 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+17 -+102 -+146 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+3 -+36 -+54 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+37 -+132 -+189 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+96 -+140 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+3 -+76 -+109 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+143 -+204 -+5 -+11 -+14 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+129 -+183 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+51 -+74 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+123 -+172 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+4 -+45 -+68 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+2 -+111 -+154 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+7 -+10 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+17 -+102 -+146 -+0 -+24 -+37 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+5 -+18 -+28 -+22 -+104 -+148 -+0 -+143 -+204 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+139 -+199 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+28 -+141 -+196 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+24 -+126 -+182 -+6 -+39 -+56 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+1 -+0 -+0 -+2 -+0 -+6 -+39 -+56 -+24 -+126 -+182 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+6 -+39 -+56 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+28 -+141 -+196 -+5 -+67 -+94 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+1 -+4 -+0 -+4 -+7 -+0 -+63 -+90 -+34 -+143 -+199 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+17 -+102 -+146 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+3 -+76 -+109 -+0 -+4 -+7 -+0 -+1 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+3 -+76 -+109 -+24 -+137 -+199 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+21 -+149 -+211 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+3 -+76 -+109 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+123 -+172 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+7 -+10 -+33 -+120 -+170 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+16 -+123 -+179 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+13 -+90 -+129 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+13 -+90 -+129 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+29 -+108 -+153 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+139 -+199 -+8 -+27 -+35 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+27 -+39 -+34 -+143 -+199 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+37 -+132 -+189 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+31 -+129 -+185 -+5 -+11 -+14 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+9 -+12 -+37 -+132 -+189 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+20 -+28 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+31 -+129 -+185 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+23 -+115 -+165 -+0 -+1 -+4 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+1 -+4 -+2 -+111 -+154 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+28 -+141 -+196 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+13 -+90 -+129 -+0 -+1 -+4 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+1 -+0 -+0 -+85 -+122 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+2 -+9 -+12 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+127 -+181 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+118 -+167 -+0 -+1 -+4 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+29 -+108 -+153 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+24 -+137 -+199 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+2 -+9 -+12 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+19 -+113 -+163 -+0 -+1 -+4 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+10 -+110 -+160 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+24 -+37 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+139 -+199 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+118 -+167 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+29 -+108 -+153 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+3 -+23 -+31 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+129 -+183 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+33 -+120 -+170 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+10 -+42 -+60 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+118 -+167 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+0 -+118 -+167 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+7 -+146 -+208 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+85 -+122 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+24 -+126 -+182 -+0 -+7 -+10 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+33 -+120 -+170 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+96 -+140 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+7 -+146 -+208 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+143 -+204 -+0 -+7 -+10 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+5 -+11 -+14 -+0 -+143 -+204 -+13 -+147 -+209 -+13 -+147 -+209 -+13 -+147 -+209 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+29 -+108 -+153 -+13 -+147 -+209 -+7 -+146 -+208 -+17 -+54 -+77 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+17 -+54 -+77 -+7 -+146 -+208 -+13 -+147 -+209 -+0 -+118 -+167 -+0 -+2 -+0 -+0 -+4 -+7 -+7 -+146 -+208 -+17 -+102 -+146 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+4 -+7 -+17 -+102 -+146 -+7 -+146 -+208 -+0 -+4 -+7 -+27 -+117 -+167 -+0 -+4 -+7 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+0 -+2 -+0 -+27 -+117 -+167 -diff --git a/drivers/video/logo/logo_bsd_clut224.ppm b/drivers/video/logo/logo_bsd_clut224.ppm -new file mode 100644 -index 000000000000..408f0282aa9e ---- /dev/null -+++ b/drivers/video/logo/logo_bsd_clut224.ppm -@@ -0,0 +1,2403 @@ -+P3 -+120 120 -+255 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 0 1 7 1 3 1 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 28 8 14 -+51 24 39 16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 9 3 6 39 15 26 61 26 49 58 26 51 -+18 7 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 57 17 29 89 29 45 73 26 48 61 26 49 22 7 12 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 6 10 -+102 29 42 132 43 63 76 28 47 52 25 42 22 7 12 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 4 0 1 16 5 9 3 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 69 20 33 154 39 54 -+159 46 62 89 29 45 49 25 40 18 7 11 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 16 5 9 102 29 42 41 13 21 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 97 28 42 185 38 47 145 39 54 -+89 29 45 58 26 51 16 5 9 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 4 0 1 132 30 39 148 30 39 -+28 8 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 41 13 21 132 30 39 185 38 47 152 40 56 105 35 55 -+76 28 47 22 7 12 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 41 13 21 185 38 47 -+124 30 42 36 11 20 1 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 -+117 31 42 185 38 47 185 38 47 152 40 56 105 35 55 76 28 47 -+59 25 44 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 4 0 1 121 30 42 -+185 38 47 102 29 42 48 19 31 9 3 6 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 123 33 45 -+185 38 47 185 38 47 159 38 55 105 35 55 76 28 47 73 26 48 -+49 25 40 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 13 21 -+185 38 47 132 30 39 71 23 37 41 14 25 4 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 4 0 1 117 31 42 185 38 47 -+185 38 47 171 39 51 118 34 52 88 29 45 76 28 47 62 26 49 -+52 24 38 18 7 11 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 10 4 6 16 5 9 16 5 9 -+18 7 11 18 7 11 16 5 9 10 4 6 16 5 9 7 2 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 1 3 -+148 30 39 152 32 42 67 22 35 54 21 35 35 12 21 4 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 69 20 33 185 38 47 185 38 47 -+185 38 47 159 35 49 105 35 55 89 29 45 76 28 47 62 26 49 -+60 25 40 42 17 30 3 1 1 0 0 0 0 0 0 0 0 0 -+1 0 0 41 13 21 79 27 44 118 34 52 124 30 42 121 30 42 -+142 34 47 121 30 42 86 29 44 68 23 35 60 22 36 52 24 38 -+42 17 30 30 10 18 16 5 9 9 3 6 9 3 6 3 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+148 30 39 185 38 47 71 23 37 50 18 33 49 25 40 35 12 21 -+7 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 10 4 6 185 38 47 185 38 47 185 38 47 -+185 38 47 140 36 52 105 35 55 89 29 45 76 28 47 67 27 47 -+56 25 45 52 24 38 48 19 31 39 15 26 30 10 18 31 10 18 -+89 29 45 129 39 59 159 38 55 171 39 51 171 39 51 171 39 51 -+159 38 55 138 37 53 119 34 51 105 35 55 88 29 45 76 28 47 -+76 28 47 62 26 49 57 25 43 49 25 40 48 19 31 31 10 18 -+10 4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -+132 30 39 185 38 47 121 30 42 64 24 39 49 25 40 48 19 31 -+10 4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 102 29 42 185 38 47 185 38 47 185 38 47 -+185 38 47 131 38 56 105 35 55 89 29 45 67 27 47 64 25 43 -+64 25 43 105 35 55 121 37 56 79 28 45 65 27 44 105 35 55 -+159 46 62 159 46 62 159 38 55 171 39 51 171 39 51 144 40 57 -+135 40 58 121 37 56 105 35 55 105 35 55 105 35 55 89 29 45 -+88 29 45 67 27 47 61 26 49 58 26 51 52 25 42 49 25 40 -+48 19 31 35 12 21 7 2 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+97 28 42 185 38 47 148 30 39 71 23 37 52 24 38 42 17 30 -+35 12 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 36 11 20 171 39 51 185 38 47 185 38 47 185 38 47 -+185 38 47 140 40 59 105 35 55 76 28 47 58 20 33 102 29 42 -+140 36 52 171 39 51 159 38 55 119 40 62 105 35 55 143 45 64 -+166 48 64 159 46 62 159 46 62 144 40 57 100 28 46 89 29 45 -+86 29 44 73 26 42 76 28 47 88 29 45 89 29 45 105 35 55 -+105 35 55 88 29 45 67 27 47 61 26 49 56 25 45 52 25 42 -+52 25 42 52 25 42 49 25 40 30 10 18 7 2 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 1 -+97 28 42 185 38 47 142 31 41 69 20 33 57 25 43 50 18 33 -+42 17 30 10 4 6 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 31 10 18 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 139 38 56 79 27 44 71 23 37 124 30 42 185 38 47 -+185 38 47 185 38 47 185 38 47 166 48 64 152 49 69 166 48 64 -+185 38 47 166 48 64 143 45 64 112 32 46 117 31 42 141 31 41 -+144 31 43 123 33 48 79 27 44 60 26 44 76 28 47 76 28 47 -+105 35 55 105 35 55 89 29 45 88 29 45 73 26 42 60 26 44 -+56 25 45 52 25 42 49 25 40 49 25 40 40 15 29 16 5 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 12 21 -+132 30 39 185 38 47 132 30 39 71 23 37 50 18 33 49 25 40 -+42 17 30 30 10 18 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 36 11 20 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 110 32 46 71 23 37 142 31 41 185 38 47 185 38 47 -+185 38 47 171 39 51 166 48 64 166 48 64 185 38 47 185 38 47 -+185 38 47 185 38 47 171 39 51 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 140 36 52 86 29 44 59 25 44 67 27 47 -+89 29 45 113 41 62 113 41 62 97 28 42 100 28 46 88 29 45 -+65 27 44 58 26 51 56 25 45 49 25 40 52 25 42 42 17 30 -+28 8 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 41 14 25 97 28 42 -+148 30 39 162 38 49 117 31 42 67 23 37 49 25 40 42 17 30 -+42 17 30 35 12 21 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 41 13 21 185 38 47 185 38 47 185 38 47 185 38 47 -+159 35 49 71 23 37 141 31 41 185 38 47 185 38 47 141 31 41 -+117 31 42 113 41 62 118 50 79 113 41 62 166 48 64 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 129 39 59 67 27 47 56 25 45 -+76 28 47 105 35 55 133 35 50 112 32 46 110 32 46 100 28 46 -+89 29 45 86 29 44 73 26 48 62 26 49 58 26 51 52 25 42 -+49 25 40 39 15 26 9 3 6 0 0 0 0 0 0 3 1 1 -+10 4 6 20 6 10 47 16 28 69 20 33 135 30 41 185 38 47 -+185 38 47 152 32 42 97 28 42 63 22 36 50 18 33 48 19 31 -+50 18 33 39 15 26 4 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 41 13 21 185 38 47 185 38 47 185 38 47 171 39 51 -+97 28 42 132 31 43 185 38 47 171 39 51 102 29 42 118 50 79 -+167 135 158 210 187 199 171 141 162 108 54 86 152 40 56 185 38 47 -+185 38 47 185 38 47 171 39 51 121 30 42 132 30 39 152 32 42 -+185 38 47 185 38 47 185 38 47 185 38 47 118 34 52 61 26 49 -+67 27 47 89 29 45 128 33 49 128 33 49 123 33 48 120 32 46 -+120 32 46 120 32 46 100 28 46 76 28 47 73 26 48 65 27 44 -+68 23 35 66 24 37 65 27 44 47 16 28 28 8 14 69 20 33 -+102 29 42 132 30 39 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 124 30 42 79 27 44 60 22 36 51 24 39 50 18 33 -+48 19 31 40 15 29 9 3 6 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 36 11 20 185 38 47 185 38 47 185 38 47 102 29 42 -+117 31 42 185 38 47 171 39 51 112 32 46 148 114 145 233 215 221 -+253 249 249 238 222 225 148 114 145 113 41 62 185 38 47 185 38 47 -+171 39 51 125 35 52 134 49 77 148 114 145 148 114 145 131 80 105 -+113 41 62 154 38 52 185 38 47 185 38 47 171 39 51 88 29 45 -+76 28 47 105 35 55 119 34 51 133 35 50 135 32 45 128 33 49 -+128 33 49 133 35 50 118 34 52 100 28 46 89 29 45 86 29 44 -+100 28 46 121 30 42 135 30 41 135 30 41 148 30 39 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+132 30 39 73 26 42 65 27 44 65 27 44 57 25 43 49 25 40 -+42 17 30 50 18 33 18 7 11 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 7 1 3 141 31 41 185 38 47 145 31 41 97 28 42 -+185 38 47 162 38 49 110 32 46 191 162 183 248 240 240 253 249 249 -+243 232 234 210 187 199 131 80 105 119 40 62 185 38 47 185 38 47 -+128 41 59 159 124 153 226 205 215 231 213 218 226 205 215 228 209 216 -+171 141 162 118 50 79 138 32 45 185 38 47 185 38 47 119 34 51 -+88 29 45 119 40 62 119 40 62 125 41 61 124 34 50 128 33 49 -+128 33 49 128 33 49 124 34 50 118 34 52 110 32 46 119 34 51 -+136 33 46 142 31 41 152 32 42 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 132 30 39 -+97 28 42 71 23 37 66 25 40 57 25 43 49 25 40 42 17 30 -+42 17 30 50 18 33 18 7 11 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 57 17 29 171 39 51 97 28 42 148 30 39 -+185 38 47 97 28 42 167 135 158 253 249 249 253 249 249 243 232 234 -+241 229 231 202 176 194 113 41 62 171 39 51 185 38 47 133 35 50 -+167 135 158 253 249 249 245 236 237 234 219 224 231 213 218 228 209 216 -+219 198 209 148 114 145 86 29 44 171 39 51 185 38 47 159 38 55 -+119 34 51 122 42 63 132 43 63 122 42 63 121 37 56 128 33 49 -+123 33 48 119 34 51 123 32 47 110 32 46 118 34 52 140 36 52 -+145 31 41 152 32 42 162 38 49 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 152 32 42 132 30 39 97 28 42 -+71 23 37 71 23 37 65 27 44 56 25 45 49 25 40 42 17 30 -+42 17 30 42 17 30 18 6 10 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 22 7 12 113 41 62 102 29 42 185 38 47 -+116 30 44 148 114 145 245 236 237 253 249 249 248 240 240 238 224 228 -+243 232 234 167 135 158 141 31 41 185 38 47 162 38 49 141 92 121 -+245 236 237 253 249 249 248 240 240 243 232 234 238 224 228 233 215 221 -+226 205 215 171 141 162 108 54 86 135 30 41 185 38 47 185 38 47 -+152 40 56 135 40 58 141 42 59 135 40 58 128 33 49 133 35 50 -+133 35 50 128 33 49 123 32 47 105 35 55 105 35 55 131 38 56 -+138 32 45 136 31 43 148 30 39 152 32 42 185 38 47 185 38 47 -+185 38 47 171 39 51 142 31 41 117 31 42 97 28 42 86 29 44 -+68 23 35 66 24 37 58 24 38 49 25 40 48 19 31 42 17 30 -+49 25 40 42 17 30 10 4 6 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 7 1 3 73 26 42 145 39 54 144 31 43 -+120 71 102 238 222 225 253 249 249 253 249 249 241 229 231 241 229 231 -+228 209 216 131 80 105 171 39 51 185 38 47 131 80 105 238 224 228 -+253 249 249 248 240 240 238 222 225 238 222 225 238 224 228 238 222 225 -+228 209 216 180 150 172 108 66 98 102 29 42 185 38 47 185 38 47 -+185 38 47 159 38 55 171 39 51 150 36 50 133 35 50 133 31 44 -+129 33 45 120 32 46 128 33 49 128 33 49 121 37 56 128 33 49 -+128 33 49 125 31 44 141 31 41 148 30 39 152 32 42 148 30 39 -+135 30 41 132 30 39 124 30 42 102 29 42 86 29 44 71 23 37 -+65 27 44 56 25 45 51 24 39 49 25 40 50 18 33 48 19 31 -+42 17 30 39 15 26 7 2 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 97 28 42 162 38 49 126 41 60 -+210 187 199 253 249 249 253 249 249 248 240 240 238 224 228 245 236 237 -+196 169 185 136 33 46 185 38 47 143 45 64 196 169 185 253 249 249 -+253 249 249 243 232 234 238 224 228 238 224 228 238 224 228 238 222 225 -+231 213 218 180 150 172 138 88 121 89 29 45 171 39 51 185 38 47 -+185 38 47 185 38 47 171 39 51 150 36 50 142 33 47 135 31 44 -+125 31 44 117 31 44 112 32 46 138 34 49 117 31 44 120 32 46 -+120 32 46 117 31 44 136 31 43 144 31 43 148 30 39 121 30 42 -+117 31 42 102 29 42 97 28 42 73 26 42 65 27 44 60 26 44 -+52 25 42 49 25 40 50 18 33 50 18 33 49 25 40 42 17 30 -+38 12 21 28 8 14 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 18 7 11 117 31 42 132 30 39 167 135 158 -+248 240 240 253 249 249 253 249 249 245 236 237 245 236 237 245 236 237 -+148 114 145 159 38 55 159 38 55 171 141 162 253 249 249 253 249 249 -+248 240 240 243 232 234 233 215 221 234 219 224 241 229 231 231 213 218 -+238 222 225 191 162 183 137 96 131 105 35 55 162 38 49 185 38 47 -+185 38 47 171 39 51 171 39 51 159 35 49 142 33 47 133 32 44 -+123 33 45 117 31 42 132 30 39 123 32 47 118 34 52 118 34 52 -+112 32 46 117 31 44 117 31 44 117 31 42 117 31 42 97 28 42 -+97 28 42 86 29 44 71 23 37 60 25 40 52 25 42 56 25 45 -+49 25 40 49 25 40 49 25 40 49 25 40 48 19 31 42 17 30 -+47 16 28 7 2 4 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 41 13 21 140 36 52 110 32 46 226 205 215 -+233 215 221 233 215 221 241 229 231 241 229 231 243 232 234 233 215 221 -+152 49 69 159 35 49 131 80 105 241 229 231 253 249 249 248 240 240 -+241 229 231 241 229 231 238 222 225 238 224 228 241 229 231 238 222 225 -+233 215 221 202 176 194 148 114 145 108 54 86 152 32 42 185 38 47 -+185 38 47 185 38 47 171 39 51 153 36 50 139 38 56 128 33 49 -+117 31 44 125 31 44 131 32 43 117 31 44 113 41 62 110 32 46 -+117 31 44 133 32 44 117 31 42 89 29 45 89 29 45 86 29 44 -+71 23 37 64 25 43 60 26 44 49 25 40 49 25 40 49 25 40 -+49 25 40 49 25 40 49 25 40 50 18 33 42 17 30 35 12 21 -+16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 57 17 29 135 30 41 159 124 153 196 169 185 -+191 162 183 140 102 127 108 66 98 210 187 199 248 240 240 196 169 185 -+143 45 64 159 46 63 180 150 172 245 236 237 253 249 249 248 240 240 -+241 229 231 231 213 218 241 229 231 241 229 231 238 222 225 238 222 225 -+228 209 216 191 162 183 159 124 153 108 54 86 141 31 41 185 38 47 -+185 38 47 185 38 47 185 38 47 150 36 50 140 36 52 125 31 44 -+123 33 45 121 30 42 116 30 44 102 29 42 110 32 46 112 32 46 -+110 32 46 102 29 42 86 29 44 73 26 42 67 27 47 56 25 45 -+52 25 42 52 25 42 52 25 42 49 25 40 49 25 40 49 25 40 -+49 25 40 49 25 40 42 17 30 40 15 29 35 12 21 10 4 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 97 28 42 152 49 69 191 162 183 141 92 121 -+228 209 216 108 66 98 50 18 33 140 102 127 243 232 234 131 80 105 -+148 37 53 134 49 77 180 150 172 191 162 183 196 169 185 210 187 199 -+241 229 231 233 215 221 231 213 218 238 224 228 238 222 225 238 222 225 -+233 215 221 202 176 194 159 124 153 93 57 98 124 30 42 185 38 47 -+185 38 47 185 38 47 185 38 47 146 36 50 133 35 50 124 30 42 -+125 31 44 124 30 42 110 32 46 102 29 42 97 28 42 97 28 42 -+97 28 42 71 23 37 57 25 43 56 25 45 56 25 45 52 25 42 -+49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 -+49 25 40 49 25 40 49 25 40 31 10 18 7 2 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 4 0 1 102 29 42 141 92 121 131 80 105 180 150 172 -+196 169 185 58 26 51 52 25 42 120 71 102 202 176 194 121 37 56 -+135 40 58 71 23 37 108 54 86 210 187 199 108 54 86 89 29 45 -+202 176 194 243 232 234 238 224 228 234 219 224 241 229 231 238 222 225 -+233 215 221 202 176 194 159 124 153 108 54 86 124 30 42 185 38 47 -+185 38 47 185 38 47 185 38 47 162 38 49 159 35 49 135 31 44 -+125 31 44 121 30 42 117 31 42 97 28 42 86 29 44 67 23 37 -+52 24 38 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 -+49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 -+49 25 40 49 25 40 35 12 21 7 2 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 10 4 6 97 28 42 131 80 105 76 28 47 137 96 131 -+93 57 98 54 21 35 50 18 33 108 54 86 159 124 153 125 35 52 -+89 29 45 48 19 31 159 124 153 191 162 183 51 24 39 54 19 32 -+131 80 105 243 232 234 245 236 237 243 232 234 241 229 231 238 224 228 -+228 209 216 202 176 194 167 135 158 93 57 98 121 30 42 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 152 32 42 129 33 45 -+121 30 42 117 31 42 97 28 42 71 23 37 67 22 35 54 21 35 -+52 24 38 56 25 45 52 25 42 49 25 40 52 25 42 49 25 40 -+49 25 40 49 25 40 49 25 40 48 19 31 50 18 33 42 17 30 -+50 18 33 22 7 12 1 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 10 4 6 86 29 44 79 27 44 60 25 40 49 25 40 -+57 25 43 56 25 45 52 20 33 108 54 86 134 49 77 129 39 59 -+71 23 37 60 25 40 196 169 185 167 135 158 50 18 33 52 25 42 -+76 28 47 219 198 209 248 240 240 241 229 231 245 236 237 238 224 228 -+231 213 218 202 176 194 159 124 153 93 57 98 132 30 39 185 38 47 -+185 38 47 185 38 47 185 38 47 171 39 51 152 32 42 132 30 39 -+124 30 42 102 29 42 86 29 44 71 23 37 67 22 35 52 24 38 -+52 25 42 49 25 40 52 25 42 49 25 40 49 25 40 49 25 40 -+49 25 40 49 25 40 49 25 40 42 17 30 42 17 30 28 8 14 -+22 7 12 3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 57 17 29 138 37 53 65 27 44 61 26 49 56 25 45 -+51 24 39 49 25 40 58 24 38 88 29 45 144 40 57 135 40 58 -+63 22 36 52 25 42 167 135 158 120 71 102 49 25 40 56 25 45 -+67 27 47 196 169 185 248 240 240 243 232 234 245 236 237 238 224 228 -+219 198 209 196 169 185 137 96 131 76 28 47 159 35 49 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 152 32 42 142 31 41 -+135 30 41 121 30 42 97 28 42 71 23 37 61 21 34 50 18 33 -+52 25 42 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 -+49 25 40 49 25 40 48 19 31 35 12 21 16 5 9 1 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+22 7 12 152 32 42 148 37 50 66 25 40 67 27 47 61 26 49 -+52 25 42 52 25 42 54 21 35 79 27 44 154 39 54 113 41 62 -+60 25 40 61 26 49 58 26 51 62 26 49 56 25 45 56 25 45 -+61 21 34 167 135 158 248 240 240 238 222 225 243 232 234 238 222 225 -+228 209 216 180 150 172 137 96 131 79 28 45 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 171 39 51 159 35 49 135 30 41 -+132 30 39 124 30 42 102 29 42 71 23 37 67 22 35 48 16 29 -+49 25 40 52 25 42 49 25 40 49 25 40 49 25 40 50 18 33 -+42 17 30 41 14 25 22 7 12 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 57 17 29 -+162 38 49 185 38 47 171 39 51 97 28 42 60 23 38 65 27 44 -+60 26 44 60 26 44 57 17 29 131 32 43 159 38 55 89 29 45 -+57 25 43 61 26 49 56 25 45 61 26 49 61 26 49 61 26 49 -+65 27 44 171 141 162 243 232 234 243 232 234 245 236 237 233 215 221 -+219 198 209 171 141 162 120 71 102 100 28 46 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 171 39 51 150 36 50 135 31 44 -+121 30 42 121 30 42 102 29 42 86 29 44 61 21 34 56 22 36 -+49 25 40 52 25 42 52 25 42 49 25 40 49 25 40 42 17 30 -+48 19 31 22 7 12 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 10 4 6 97 28 42 185 38 47 -+185 38 47 185 38 47 185 38 47 159 35 49 117 31 42 71 23 37 -+71 23 37 71 23 37 124 30 42 185 38 47 171 39 51 97 28 42 -+60 26 44 62 26 49 52 25 42 61 26 49 61 26 49 67 27 47 -+73 26 48 171 141 162 243 232 234 245 236 237 243 232 234 231 213 218 -+202 176 194 159 124 153 93 57 98 131 38 56 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 171 39 51 159 35 49 135 32 45 -+124 30 42 117 31 42 102 29 42 71 23 37 61 21 34 52 24 38 -+49 25 40 49 25 40 52 25 42 52 25 42 49 25 40 40 15 29 -+36 11 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 7 2 4 102 29 42 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 133 32 44 71 23 37 -+73 26 42 110 32 46 153 36 50 171 39 51 171 39 51 112 32 46 -+67 27 47 61 26 49 61 26 49 61 26 49 56 25 45 57 25 43 -+105 35 55 210 187 199 245 236 237 241 229 231 231 213 218 233 215 221 -+210 187 199 146 108 143 76 28 47 159 35 49 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 152 32 42 138 32 45 -+117 31 42 110 32 46 97 28 42 71 23 37 60 23 38 51 24 39 -+51 24 39 49 25 40 52 25 42 52 25 42 49 25 40 49 25 40 -+16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 38 12 21 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 135 30 41 124 30 42 152 32 42 -+171 39 51 171 39 51 153 36 50 136 31 43 171 39 51 171 39 51 -+89 29 45 67 27 47 56 25 45 60 26 44 60 22 36 67 22 35 -+159 124 153 243 232 234 243 232 234 233 215 221 231 213 218 226 205 215 -+180 150 172 108 66 98 97 28 42 185 38 47 185 38 47 185 38 47 -+185 38 47 171 39 51 171 39 51 171 39 51 153 36 50 135 32 45 -+123 32 47 102 29 42 97 28 42 71 23 37 60 25 40 57 25 43 -+49 25 40 49 25 40 52 25 42 52 25 42 49 25 40 49 25 40 -+16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 10 4 6 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 7 2 4 110 32 46 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 148 30 39 148 30 39 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 171 39 51 162 38 49 185 38 47 -+120 32 46 71 23 37 56 25 45 57 25 43 61 21 34 108 54 86 -+219 198 209 241 229 231 233 215 221 238 222 225 226 205 215 191 162 183 -+137 96 131 105 35 55 171 39 51 185 38 47 185 38 47 185 38 47 -+185 38 47 159 38 55 159 38 55 162 38 49 144 40 57 136 33 46 -+112 32 46 110 32 46 86 29 44 73 26 42 64 24 39 57 25 43 -+56 25 45 58 26 51 58 26 51 58 26 51 49 25 40 49 25 40 -+9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 1 1 108 66 98 120 71 102 140 102 127 -+93 57 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 10 4 6 153 36 50 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 135 30 41 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 159 38 55 159 38 55 -+150 39 55 105 35 55 66 25 40 60 23 38 76 28 47 167 135 158 -+248 240 240 253 249 249 243 232 234 233 215 221 202 176 194 148 114 145 -+108 66 98 121 37 56 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 171 39 51 171 39 51 171 39 51 150 39 55 138 34 49 -+112 32 46 102 29 42 97 28 42 71 23 37 67 23 37 60 26 44 -+61 26 49 58 26 51 58 26 51 52 25 42 49 25 40 49 25 40 -+9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 1 0 0 93 57 98 202 176 194 -+167 135 158 108 66 98 42 17 30 0 0 0 0 0 0 0 0 0 -+0 0 0 7 2 4 152 32 42 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 132 30 39 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 152 40 56 128 41 59 -+121 37 56 119 40 62 105 35 55 79 27 44 105 35 55 148 114 145 -+180 150 172 191 162 183 148 114 145 141 92 121 108 54 86 108 54 86 -+86 29 44 124 37 57 159 35 49 171 39 51 185 38 47 185 38 47 -+153 36 50 159 46 62 171 39 51 171 39 51 152 32 42 135 32 45 -+110 32 46 102 29 42 86 29 44 71 23 37 52 24 38 60 26 44 -+58 26 51 58 26 51 58 26 51 52 25 42 49 25 40 49 25 40 -+9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 88 121 -+146 108 143 58 26 51 58 26 51 10 4 6 0 0 0 0 0 0 -+0 0 0 7 2 4 141 31 41 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 135 30 41 148 30 39 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 171 39 51 143 45 64 123 43 68 -+113 41 62 105 35 55 105 35 55 136 44 65 131 38 56 105 35 55 -+105 35 55 116 30 44 116 30 44 102 29 42 117 31 42 124 30 42 -+132 30 39 153 36 50 159 35 49 171 39 51 171 39 51 159 35 49 -+153 36 50 144 40 57 150 39 55 154 39 54 159 38 55 123 33 45 -+102 29 42 97 28 42 86 29 44 73 26 42 51 24 39 58 26 51 -+58 26 51 58 26 51 52 25 42 52 25 42 49 25 40 39 15 26 -+4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 58 26 51 -+196 169 185 93 57 98 58 26 51 42 17 30 3 1 1 0 0 0 -+0 0 0 7 2 4 97 28 42 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 171 39 51 116 30 44 132 30 39 185 38 47 -+185 38 47 171 39 51 159 46 63 143 45 66 134 49 77 108 54 86 -+108 54 86 108 54 86 76 28 47 119 34 51 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+171 39 51 154 39 54 144 40 57 140 36 52 142 33 47 120 32 46 -+102 29 42 89 29 45 86 29 44 65 27 44 56 25 45 58 26 51 -+58 26 51 58 26 51 52 25 42 52 25 42 52 25 42 35 12 21 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 25 40 -+171 141 162 120 71 102 93 57 98 93 57 98 18 7 11 0 0 0 -+0 0 0 0 0 0 36 11 20 171 39 51 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 159 38 55 112 32 46 110 32 46 -+117 31 44 119 40 62 113 41 62 89 29 45 88 29 45 76 28 47 -+76 28 47 105 35 55 76 28 47 110 32 46 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 171 39 51 159 35 49 159 35 49 136 33 46 110 32 46 -+102 29 42 86 29 44 73 26 42 59 25 44 61 26 49 58 26 51 -+58 26 51 58 26 51 58 26 51 49 25 40 49 25 40 30 10 18 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+49 25 40 22 7 12 7 2 4 93 57 98 93 57 98 0 0 0 -+0 0 0 0 0 0 18 7 11 133 35 50 185 38 47 185 38 47 -+185 38 47 154 39 54 141 40 57 159 46 63 166 48 64 138 34 49 -+116 30 44 105 35 55 113 41 62 105 35 55 105 35 55 121 37 56 -+105 35 55 113 41 62 113 41 62 135 40 58 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 171 39 51 154 38 52 128 33 49 101 29 42 -+86 29 44 79 28 45 67 27 47 61 26 49 56 25 45 52 25 42 -+58 26 51 58 26 51 52 25 42 49 25 40 49 25 40 16 5 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 25 40 -+138 88 121 148 114 145 140 102 127 148 114 145 30 10 18 0 0 0 -+0 0 0 0 0 0 0 0 0 18 7 11 137 96 131 40 15 29 -+0 0 0 0 0 0 0 0 0 58 24 38 159 46 62 185 38 47 -+185 38 47 141 43 61 89 29 45 86 29 44 140 36 52 185 38 47 -+171 39 51 171 39 51 159 38 55 159 38 55 166 48 64 166 48 64 -+166 48 64 159 46 63 152 49 69 166 48 64 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 159 35 49 124 34 50 118 34 52 100 28 46 -+86 29 44 67 27 47 67 27 47 58 26 51 58 26 51 58 26 51 -+58 26 51 58 26 51 58 26 51 52 25 42 40 15 29 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 15 26 -+171 141 162 146 108 143 146 108 143 120 71 102 30 10 18 0 0 0 -+0 0 0 0 0 0 0 0 0 1 0 0 108 66 98 95 59 101 -+0 0 0 0 0 0 0 0 0 0 0 0 35 12 21 117 31 44 -+171 39 51 171 39 51 135 40 58 79 28 45 77 27 45 141 40 57 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 -+171 39 51 159 38 55 133 35 50 121 37 56 105 35 55 105 35 55 -+88 29 45 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 -+58 26 51 58 26 51 49 25 40 39 15 26 7 2 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 -+140 102 127 76 28 47 58 26 51 93 57 98 39 15 26 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 30 10 18 137 96 131 -+39 15 26 0 0 0 0 0 0 0 0 0 0 0 0 4 0 1 -+79 27 44 144 45 67 159 46 63 134 49 77 88 29 45 89 29 45 -+152 40 56 171 39 51 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 166 48 64 159 46 63 159 38 55 159 38 55 150 39 55 -+140 40 59 119 40 62 113 41 62 105 35 55 105 35 55 88 29 45 -+67 27 47 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 -+58 26 51 52 25 42 40 15 29 7 2 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+140 102 127 93 57 98 76 28 47 58 26 51 93 57 98 30 10 18 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 148 114 145 -+58 26 51 3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 28 8 14 61 21 34 105 35 55 118 50 79 88 29 45 -+102 29 42 152 40 56 166 48 64 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 166 48 64 159 46 63 -+141 43 61 125 41 61 105 35 55 105 35 55 105 35 55 105 35 55 -+105 35 55 122 42 63 113 41 62 105 35 55 88 29 45 73 26 48 -+67 27 47 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 -+52 25 42 35 12 21 1 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+140 102 127 49 25 40 35 12 21 58 26 51 93 57 98 58 26 51 -+49 25 40 30 10 18 16 5 9 0 0 0 52 25 42 138 88 121 -+40 15 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 16 5 9 51 24 39 105 35 55 -+76 28 47 105 35 55 143 45 64 166 48 64 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 171 39 51 166 48 64 159 46 63 134 49 77 118 50 79 -+113 41 62 66 24 37 61 21 34 79 27 44 76 28 47 76 28 47 -+88 29 45 105 35 55 105 35 55 76 28 47 58 26 51 58 26 51 -+58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 -+40 15 29 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 42 17 30 93 57 98 -+58 26 51 58 26 51 58 26 51 93 57 98 108 66 98 58 26 51 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 5 9 -+42 17 30 77 27 45 105 35 55 128 41 59 166 48 64 166 48 64 -+166 48 64 185 38 47 171 39 51 171 39 51 166 48 64 159 46 62 -+159 38 55 159 46 62 139 44 66 118 50 79 108 54 86 76 28 47 -+73 26 42 73 26 42 89 29 45 113 41 62 118 50 79 123 42 67 -+122 42 63 113 41 62 105 35 55 73 26 48 58 26 51 58 26 51 -+58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 39 15 26 -+3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 10 4 6 140 102 127 159 124 153 120 71 102 -+140 102 127 140 102 127 131 80 105 131 80 105 108 66 98 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 15 26 -+58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 42 17 30 -+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 18 7 11 47 16 28 79 27 44 119 40 62 145 47 69 -+152 49 69 152 49 69 152 49 69 145 47 69 145 47 69 136 44 65 -+125 41 61 113 41 62 105 35 55 76 28 47 76 28 47 97 28 42 -+117 31 44 128 41 59 128 42 60 128 42 60 124 42 65 113 41 62 -+105 35 55 105 35 55 105 35 55 88 29 45 76 28 47 58 26 51 -+58 26 51 58 26 51 58 26 51 49 25 40 30 10 18 4 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 39 15 26 202 176 194 226 205 215 -+202 176 194 191 162 183 159 124 153 131 80 105 35 12 21 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+52 25 42 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 -+22 7 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 9 3 6 1 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 18 6 10 73 26 42 105 35 55 -+105 35 55 113 41 62 113 41 62 113 41 62 113 41 62 105 35 55 -+105 35 55 76 28 47 79 27 44 101 29 42 129 33 45 150 39 55 -+144 40 57 136 33 46 125 35 52 113 41 62 105 35 55 105 35 55 -+105 35 55 105 35 55 88 29 45 76 28 47 58 26 51 58 26 51 -+58 26 51 52 25 42 49 25 40 22 7 12 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 18 7 11 159 124 153 -+146 108 143 146 108 143 148 114 145 108 66 98 10 4 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 -+93 57 98 93 63 110 58 26 51 58 26 51 58 26 51 58 26 51 -+56 25 45 18 7 11 7 2 4 3 1 1 39 15 26 124 30 42 -+152 32 42 159 38 55 171 39 51 97 28 42 7 1 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 4 0 1 57 17 29 -+121 37 56 105 35 55 100 28 46 97 28 42 86 29 44 86 29 44 -+97 28 42 117 31 42 141 33 45 153 36 50 153 36 50 140 36 52 -+128 33 49 105 35 55 105 35 55 105 35 55 89 29 45 105 35 55 -+105 35 55 76 28 47 67 27 47 58 26 51 58 26 51 58 26 51 -+52 25 42 49 25 40 16 5 9 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 -+93 57 98 93 63 110 93 57 98 108 66 98 131 80 105 42 17 30 -+49 25 40 76 28 47 67 27 47 42 17 30 76 28 47 140 102 127 -+171 141 162 93 63 110 58 26 51 42 17 30 58 26 51 58 26 51 -+58 26 51 58 26 51 76 28 47 65 27 44 152 32 42 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 112 32 46 39 15 26 -+3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+20 6 10 69 20 33 139 37 53 159 38 55 159 35 49 162 38 49 -+159 38 55 162 38 49 150 36 50 142 32 45 124 34 50 105 35 55 -+105 35 55 88 29 45 105 35 55 105 35 55 89 29 45 89 29 45 -+105 35 55 88 29 45 76 28 47 58 26 51 58 26 51 52 25 42 -+52 25 42 39 15 26 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 10 4 6 58 26 51 58 26 51 58 26 51 93 57 98 -+108 66 98 131 80 105 137 96 131 159 124 153 167 135 158 137 96 131 -+58 26 51 22 7 12 7 2 4 0 0 0 9 3 6 35 12 21 -+49 25 40 58 26 51 58 26 51 112 32 46 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 153 36 50 105 35 55 58 26 51 -+18 7 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 1 1 42 17 30 97 28 42 119 34 51 128 33 49 -+131 38 56 122 40 63 105 35 55 105 35 55 88 29 45 76 28 47 -+76 28 47 73 26 42 105 35 55 105 35 55 105 35 55 105 35 55 -+105 35 55 105 35 55 89 29 45 76 28 47 58 26 51 52 25 42 -+49 25 40 18 7 11 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 1 1 22 7 12 18 7 11 22 7 12 -+30 10 18 30 10 18 40 15 29 42 17 30 30 10 18 9 3 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+28 8 14 58 26 51 58 26 51 118 34 52 185 38 47 185 38 47 -+185 38 47 185 38 47 171 39 51 118 34 52 58 26 51 58 26 51 -+49 25 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 1 1 57 17 29 79 27 44 71 23 37 -+73 26 42 71 23 37 79 27 44 67 23 37 68 23 35 79 27 44 -+86 29 44 105 35 55 124 35 54 128 33 49 135 32 45 138 32 45 -+128 33 49 119 34 51 100 28 46 86 29 44 58 26 51 58 26 51 -+48 19 31 16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 0 0 39 15 26 58 26 51 76 28 47 152 32 42 185 38 47 -+185 38 47 185 38 47 135 40 58 76 28 47 58 26 51 58 26 51 -+30 10 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 57 17 29 139 44 68 139 38 56 -+135 30 41 117 31 42 116 30 44 123 32 47 125 35 52 135 40 58 -+135 40 58 140 36 52 152 32 42 162 38 49 162 38 49 185 38 47 -+162 38 49 152 32 42 128 33 49 100 28 46 62 26 49 58 26 51 -+52 25 42 22 7 12 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 30 10 18 76 28 47 119 40 62 102 29 42 142 34 47 -+150 36 50 128 41 59 105 35 55 76 28 47 58 26 51 48 19 31 -+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 7 2 4 118 34 52 159 46 63 171 39 51 -+185 38 47 171 39 51 171 39 51 171 39 51 171 39 51 171 39 51 -+171 39 51 162 38 49 171 39 51 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 171 39 51 118 34 52 76 28 47 56 25 45 -+58 26 51 30 10 18 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 31 10 18 154 39 54 185 38 47 150 36 50 123 33 45 -+112 32 46 105 35 55 105 35 55 76 28 47 61 26 49 67 27 47 -+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 1 0 0 61 21 34 166 48 64 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 138 32 45 76 28 47 56 25 45 -+49 25 40 42 17 30 1 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 0 0 117 31 42 185 38 47 185 38 47 185 38 47 185 38 47 -+162 38 49 125 41 61 105 35 55 67 27 47 61 21 34 61 26 49 -+39 15 26 22 7 12 18 7 11 7 2 4 3 1 1 3 1 1 -+30 10 18 66 25 40 139 38 56 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 100 28 46 61 26 49 -+49 25 40 49 25 40 20 6 10 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+28 8 14 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 139 44 68 108 54 86 73 26 48 57 25 43 58 26 51 -+58 26 51 58 26 51 58 26 51 56 25 45 52 25 42 56 25 45 -+73 26 48 113 41 62 152 49 69 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 171 39 51 162 38 49 162 38 49 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 132 30 39 76 28 47 -+58 26 51 49 25 40 35 12 21 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+41 13 21 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+166 48 64 134 49 77 108 54 86 76 28 47 67 27 47 73 26 48 -+58 26 51 58 26 51 58 26 51 58 26 51 61 26 49 61 26 49 -+108 54 86 105 35 55 105 35 55 119 34 51 133 32 44 148 30 39 -+152 32 42 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 159 35 49 159 35 49 159 35 49 159 35 49 171 39 51 -+185 38 47 185 38 47 185 38 47 171 39 51 125 31 44 79 27 44 -+58 26 51 49 25 40 40 15 29 10 4 6 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+36 11 20 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+152 40 56 118 50 79 108 54 86 76 28 47 66 25 40 76 28 47 -+58 26 51 58 26 51 58 26 51 58 26 51 61 26 49 76 28 47 -+113 41 62 133 35 50 150 39 55 162 38 49 162 38 49 148 30 39 -+132 30 39 132 30 39 132 30 39 154 39 54 159 46 62 154 39 54 -+146 36 50 138 34 49 138 37 53 135 40 58 141 40 57 150 36 50 -+159 35 49 171 39 51 185 38 47 150 36 50 105 35 55 79 28 45 -+58 26 51 52 25 42 49 25 40 30 10 18 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+7 2 4 117 31 44 171 39 51 185 38 47 166 48 64 145 47 69 -+118 50 79 108 54 86 105 35 55 73 26 42 76 28 47 105 35 55 -+76 28 47 58 26 51 58 26 51 58 26 51 52 24 38 64 24 39 -+121 37 56 171 39 51 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 152 32 42 121 30 42 102 29 42 124 34 50 -+124 35 54 113 41 62 113 41 62 113 41 62 113 41 62 118 34 52 -+133 35 50 159 35 49 159 35 49 133 35 50 88 29 45 79 28 45 -+58 26 51 52 25 42 49 25 40 42 17 30 10 4 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 16 5 9 105 35 55 113 41 62 100 28 46 89 29 45 -+76 28 47 76 28 47 73 26 42 76 28 47 105 35 55 105 35 55 -+58 26 51 58 26 51 58 26 51 58 26 51 56 25 45 60 22 36 -+101 29 42 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 124 30 42 86 29 44 -+105 35 55 105 35 55 105 35 55 76 28 47 76 28 47 105 35 55 -+100 28 46 116 30 44 152 32 42 138 34 49 79 28 45 62 26 49 -+52 25 42 52 25 42 49 25 40 49 25 40 28 8 14 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 7 2 4 60 26 44 110 32 46 102 29 42 -+97 28 42 118 34 52 121 37 56 113 41 62 113 41 62 73 26 48 -+58 26 51 58 26 51 58 26 51 61 26 49 62 26 49 52 25 42 -+71 23 37 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 133 35 50 -+97 28 42 86 29 44 76 28 47 73 26 48 76 28 47 88 29 45 -+69 20 33 79 27 44 139 38 56 125 35 52 76 28 47 58 26 51 -+58 26 51 52 25 42 49 25 40 49 25 40 30 10 18 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 1 0 0 57 17 29 152 32 42 -+185 38 47 166 48 64 123 43 68 108 54 86 105 35 55 58 26 51 -+58 26 51 58 24 38 58 26 51 58 26 51 56 25 45 54 19 32 -+105 35 55 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+159 35 49 117 31 42 86 29 44 71 23 37 71 23 37 67 23 37 -+71 23 37 116 30 44 138 37 53 105 35 55 76 28 47 58 26 51 -+58 26 51 52 25 42 49 25 40 49 25 40 35 12 21 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 8 14 -+102 29 42 110 32 46 105 35 55 76 28 47 65 27 44 61 26 49 -+49 25 40 56 25 45 58 26 51 58 26 51 58 20 33 71 23 37 -+159 38 55 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 171 39 51 150 36 50 128 33 49 118 34 52 89 29 45 -+89 29 45 105 35 55 89 29 45 73 26 48 61 26 49 58 26 51 -+52 25 42 52 25 42 49 25 40 49 25 40 39 15 26 1 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 1 1 10 4 6 35 12 21 58 26 51 -+58 26 51 58 26 51 58 26 51 49 25 40 69 20 33 171 39 51 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 -+171 39 51 151 38 54 133 35 50 121 37 56 105 35 55 105 35 55 -+76 28 47 62 26 49 73 26 48 58 26 51 58 26 51 58 26 51 -+52 25 42 52 25 42 49 25 40 49 25 40 40 15 29 9 3 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 4 6 -+51 24 39 56 25 45 66 25 40 110 32 46 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 139 37 53 -+125 35 52 118 34 52 105 35 55 105 35 55 88 29 45 76 28 47 -+62 26 49 61 26 49 62 26 49 58 26 51 56 25 45 49 25 40 -+52 25 42 52 25 42 49 25 40 42 17 30 42 17 30 22 7 12 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+10 4 6 71 23 37 119 34 51 159 38 55 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 171 39 51 152 32 42 138 34 46 118 34 52 -+105 35 55 89 29 45 76 28 47 76 28 47 73 26 48 73 26 48 -+62 26 49 58 26 51 61 26 49 52 25 42 52 25 42 58 26 51 -+58 26 51 49 25 40 49 25 40 48 19 31 50 18 33 28 8 14 -+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 48 16 29 125 41 61 128 42 60 145 39 54 171 39 51 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 159 38 55 141 40 57 124 34 50 100 28 46 89 29 45 -+86 29 44 76 28 47 73 26 48 67 27 47 58 26 51 62 26 49 -+58 26 51 56 25 45 56 25 45 58 26 51 58 26 51 58 26 51 -+52 25 42 49 25 40 49 25 40 42 17 30 35 12 21 16 5 9 -+1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 22 7 12 89 29 45 113 41 62 118 50 79 122 42 63 -+132 43 63 144 40 57 159 38 55 153 36 50 171 39 51 150 39 55 -+135 40 58 128 41 59 113 41 62 105 35 55 105 35 55 76 28 47 -+73 26 48 73 26 48 73 26 48 58 26 51 58 26 51 58 26 51 -+58 26 51 58 26 51 58 26 51 58 26 51 52 25 42 49 25 40 -+49 25 40 49 25 40 49 25 40 50 18 33 20 6 10 1 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 7 2 4 56 22 36 76 28 47 105 35 55 113 41 62 -+118 50 79 113 41 62 123 43 68 113 41 62 122 40 63 119 40 62 -+113 41 62 105 35 55 105 35 55 89 29 45 76 28 47 73 26 48 -+73 26 48 73 26 48 58 26 51 58 26 51 58 26 51 58 26 51 -+58 26 51 58 26 51 58 26 51 52 25 42 52 25 42 49 25 40 -+49 25 40 48 19 31 42 17 30 42 17 30 22 7 12 1 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 31 10 18 69 20 33 86 29 44 89 29 45 -+105 35 55 105 35 55 118 50 79 113 41 62 113 41 62 105 35 55 -+105 35 55 105 35 55 105 35 55 76 28 47 73 26 48 67 27 47 -+58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 -+58 26 51 58 26 51 52 25 42 49 25 40 49 25 40 49 25 40 -+49 25 40 50 18 33 40 15 29 48 16 29 16 5 9 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 86 29 44 97 28 42 105 35 55 88 29 45 -+88 29 45 105 35 55 113 41 62 113 41 62 108 54 86 108 54 86 -+105 35 55 105 35 55 76 28 47 76 28 47 73 26 48 58 26 51 -+58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 52 25 42 -+49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 50 18 33 -+42 17 30 39 15 26 38 12 21 28 8 14 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 28 8 14 185 38 47 162 38 49 86 29 44 79 28 45 -+76 28 47 113 41 62 118 50 79 108 54 86 108 54 86 108 54 86 -+105 35 55 76 28 47 76 28 47 62 26 49 62 26 49 58 26 51 -+58 26 51 56 25 45 52 25 42 52 25 42 49 25 40 49 25 40 -+49 25 40 49 25 40 49 25 40 48 19 31 42 17 30 39 15 26 -+39 15 26 38 12 21 42 17 30 28 8 14 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 57 17 29 185 38 47 185 38 47 171 39 51 119 34 51 -+89 29 45 105 35 55 108 54 86 108 54 86 108 54 86 108 54 86 -+73 26 48 73 26 48 62 26 49 73 26 48 58 26 51 58 26 51 -+58 26 51 58 26 51 52 25 42 49 25 40 49 25 40 49 25 40 -+49 25 40 48 19 31 42 17 30 39 15 26 39 15 26 42 17 30 -+42 17 30 49 25 40 52 25 42 35 12 21 4 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 69 20 33 185 38 47 185 38 47 185 38 47 185 38 47 -+154 39 54 119 40 62 105 35 55 105 35 55 105 35 55 105 35 55 -+76 28 47 73 26 48 62 26 49 58 26 51 58 26 51 56 25 45 -+61 26 49 49 25 40 42 17 30 50 18 33 48 19 31 42 17 30 -+42 17 30 42 17 30 42 17 30 49 25 40 49 25 40 58 26 51 -+58 26 51 49 25 40 48 19 31 42 17 30 7 1 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 69 20 33 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 166 48 64 135 40 58 105 35 55 88 29 45 88 29 45 -+76 28 47 62 26 49 60 26 44 52 24 38 49 25 40 49 25 40 -+57 25 43 58 24 38 52 24 38 49 25 40 49 25 40 50 18 33 -+49 25 40 50 18 33 48 19 31 52 25 42 58 26 51 58 26 51 -+58 26 51 52 25 42 48 19 31 42 17 30 4 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 41 13 21 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 152 40 56 119 34 51 105 35 55 -+88 29 45 76 28 47 65 27 44 64 25 43 65 27 44 73 26 48 -+76 28 47 76 28 47 76 28 47 60 26 44 48 19 31 42 17 30 -+48 19 31 49 25 40 49 25 40 42 17 30 52 25 42 52 25 42 -+52 25 42 52 25 42 49 25 40 48 19 31 10 4 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 16 5 9 152 32 42 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 166 48 64 134 49 77 -+119 40 62 113 41 62 105 35 55 105 35 55 105 35 55 105 35 55 -+105 35 55 88 29 45 105 35 55 76 28 47 73 26 48 58 24 38 -+42 17 30 42 17 30 42 17 30 42 17 30 42 17 30 42 17 30 -+52 25 42 56 25 45 49 25 40 49 25 40 30 10 18 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 9 3 6 102 29 42 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 -+152 49 69 152 40 56 141 42 59 131 42 64 126 41 60 105 35 55 -+105 35 55 113 41 62 105 35 55 88 29 45 105 35 55 105 35 55 -+61 26 49 48 19 31 49 25 40 42 17 30 42 17 30 42 17 30 -+48 19 31 49 25 40 49 25 40 49 25 40 40 15 29 3 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 16 5 9 159 35 49 185 38 47 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+166 48 64 166 48 64 159 46 63 144 40 57 136 44 65 125 41 61 -+113 41 62 113 41 62 105 35 55 105 35 55 105 35 55 105 35 55 -+76 28 47 61 26 49 48 19 31 48 19 31 48 19 31 42 17 30 -+49 25 40 49 25 40 50 18 33 49 25 40 42 17 30 22 7 12 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 36 11 20 171 39 51 185 38 47 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 185 38 47 171 39 51 154 39 54 144 40 57 128 42 60 -+113 41 62 105 35 55 105 35 55 105 35 55 105 35 55 76 28 47 -+73 26 48 58 26 51 58 26 51 49 25 40 42 17 30 42 17 30 -+42 17 30 49 25 40 42 17 30 48 19 31 49 25 40 42 17 30 -+7 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 28 8 14 152 32 42 -+185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 -+185 38 47 171 39 51 159 46 62 144 40 57 144 40 57 129 39 59 -+113 41 62 105 35 55 105 35 55 105 35 55 76 28 47 73 26 48 -+58 26 51 58 26 51 58 26 51 58 26 51 52 25 42 42 17 30 -+42 17 30 42 17 30 48 19 31 49 25 40 49 25 40 49 25 40 -+35 12 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 11 20 -+144 40 57 152 40 56 152 40 56 159 38 55 159 38 55 166 48 64 -+166 48 64 159 46 63 145 47 69 130 43 63 119 40 62 105 35 55 -+105 35 55 105 35 55 105 35 55 93 57 98 76 28 47 58 26 51 -+58 26 51 58 26 51 58 26 51 58 26 51 52 25 42 49 25 40 -+49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 -+48 19 31 16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 -+86 29 44 118 50 79 118 50 79 118 50 79 129 39 59 136 44 65 -+126 41 60 123 42 67 118 50 79 108 54 86 108 54 86 105 35 55 -+105 35 55 105 35 55 76 28 47 73 26 48 58 26 51 58 26 51 -+58 26 51 58 26 51 58 26 51 49 25 40 49 25 40 52 25 42 -+49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 -+48 19 31 36 11 20 9 3 6 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 10 18 -+108 54 86 76 28 47 105 35 55 113 41 62 118 50 79 113 41 62 -+113 41 62 108 54 86 105 35 55 105 35 55 105 35 55 105 35 55 -+76 28 47 76 28 47 73 26 48 58 26 51 58 26 51 58 26 51 -+58 26 51 58 26 51 52 25 42 52 25 42 52 25 42 49 25 40 -+52 25 42 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 -+42 17 30 50 18 33 35 12 21 4 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 15 26 -+105 35 55 105 35 55 113 41 62 105 35 55 76 28 47 76 28 47 -+76 28 47 88 29 45 76 28 47 73 26 48 67 27 47 65 27 44 -+62 26 49 62 26 49 67 27 47 60 26 44 52 25 42 52 25 42 -+49 25 40 56 25 45 52 25 42 50 18 33 49 25 40 49 25 40 -+52 25 42 56 25 45 52 25 42 49 25 40 49 25 40 49 25 40 -+49 25 40 49 25 40 42 17 30 28 8 14 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 13 21 -+129 39 59 152 40 56 159 46 63 133 43 64 105 35 55 66 25 40 -+67 27 47 61 25 44 65 27 44 76 28 47 79 28 45 86 29 44 -+89 29 45 88 29 45 67 27 47 49 25 40 52 24 38 52 24 38 -+51 24 39 49 25 40 49 25 40 52 25 42 56 25 45 58 26 51 -+62 26 49 56 25 45 42 17 30 35 12 21 42 17 30 49 25 40 -+49 25 40 42 17 30 48 19 31 42 17 30 28 8 14 4 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 67 23 37 -+134 49 77 152 49 69 166 48 64 166 48 64 145 39 54 102 29 42 -+100 28 46 77 27 45 60 26 44 73 26 48 113 41 62 138 37 53 -+133 35 50 131 38 56 105 35 55 76 28 47 66 25 40 76 28 47 -+88 29 45 105 35 55 76 28 47 73 26 48 73 26 48 73 26 48 -+73 26 48 48 19 31 10 4 6 0 0 0 18 7 11 49 25 40 -+52 25 42 49 25 40 49 25 40 49 25 40 49 25 40 35 12 21 -+10 4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 42 17 30 76 28 47 -+141 92 121 167 135 158 167 135 158 141 92 121 141 92 121 131 80 105 -+116 30 44 105 35 55 67 23 37 76 28 47 118 50 79 152 49 69 -+159 46 62 148 37 53 124 35 54 110 32 46 79 27 44 105 35 55 -+136 44 65 134 49 77 118 50 79 108 54 86 76 28 47 58 26 51 -+76 28 47 30 10 18 0 0 0 0 0 0 0 0 0 28 8 14 -+52 25 42 52 25 42 52 25 42 52 25 42 52 25 42 49 25 40 -+49 25 40 31 10 18 10 4 6 1 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 1 0 0 18 7 11 108 54 86 89 29 45 -+133 43 64 142 34 47 137 33 45 128 41 59 134 49 77 141 92 121 -+143 45 64 121 37 56 73 26 42 118 50 79 131 80 105 141 92 121 -+141 92 121 141 92 121 152 49 69 152 49 69 110 32 46 120 32 46 -+138 37 53 139 44 68 119 40 62 88 29 45 93 57 98 93 57 98 -+58 26 51 49 25 40 0 0 0 0 0 0 0 0 0 0 0 0 -+22 7 12 50 18 33 49 25 40 58 26 51 58 26 51 58 26 51 -+52 25 42 49 25 40 49 25 40 40 15 29 31 10 18 28 8 14 -+18 7 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 25 40 -+93 57 98 49 25 40 73 26 42 79 28 45 118 50 79 146 108 143 -+167 135 158 159 124 153 141 92 121 166 48 64 152 49 69 135 40 58 -+124 37 57 121 37 56 86 29 44 105 35 55 139 44 66 124 35 54 -+110 32 46 116 30 44 123 34 49 128 42 60 121 37 56 117 31 44 -+133 35 50 139 38 56 105 35 55 93 57 98 137 96 131 146 108 143 -+93 57 98 56 25 45 16 5 9 0 0 0 0 0 0 0 0 0 -+1 0 0 30 10 18 41 14 25 39 15 26 49 25 40 52 25 42 -+52 25 42 58 26 51 58 26 51 52 25 42 52 25 42 42 17 30 -+50 18 33 35 12 21 18 7 11 7 2 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 4 6 -+18 7 11 18 7 11 10 4 6 10 4 6 30 10 18 39 15 26 -+30 10 18 22 7 12 30 10 18 60 26 44 76 28 47 105 35 55 -+134 49 77 141 92 121 141 92 121 141 92 121 166 48 64 131 80 105 -+145 47 69 145 47 69 152 49 69 141 92 121 141 92 121 139 44 68 -+105 35 55 86 29 44 86 29 44 131 80 105 141 92 121 148 114 145 -+148 114 145 141 92 121 166 48 64 152 49 69 105 35 55 112 32 46 -+133 35 50 128 41 59 105 35 55 88 61 125 146 108 143 146 108 143 -+88 61 125 58 26 51 49 25 40 22 7 12 0 0 0 0 0 0 -+0 0 0 0 0 0 3 1 1 10 4 6 31 10 18 42 17 30 -+48 19 31 52 25 42 58 26 51 58 26 51 52 25 42 52 25 42 -+58 26 51 56 25 45 48 19 31 42 17 30 30 10 18 22 7 12 -+16 5 9 7 1 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -+10 4 6 35 12 21 58 26 51 108 66 98 140 102 127 171 141 162 -+180 150 172 171 141 162 131 80 105 76 28 47 76 28 47 105 35 55 -+113 41 62 125 35 52 166 48 64 141 92 121 141 92 121 166 48 64 -+166 48 64 166 48 64 152 49 69 136 44 65 152 49 69 141 92 121 -+141 92 121 152 49 69 123 34 49 113 41 62 119 40 62 89 29 45 -+118 50 79 120 71 102 118 50 79 123 43 68 121 37 56 105 35 55 -+113 41 62 123 43 68 134 49 77 152 49 69 128 42 60 118 34 52 -+129 39 59 130 43 63 105 35 55 93 63 110 146 108 143 146 108 143 -+93 57 98 58 26 51 58 26 51 48 19 31 1 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 7 2 4 -+22 7 12 30 10 18 35 12 21 42 17 30 52 25 42 58 26 51 -+58 26 51 58 26 51 56 25 45 52 25 42 52 25 42 49 25 40 -+48 19 31 42 17 30 31 10 18 20 6 10 7 2 4 7 1 3 -+7 2 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 10 4 6 35 12 21 49 25 40 120 71 102 167 135 158 -+191 162 183 210 187 199 234 219 224 243 232 234 241 229 231 226 205 215 -+233 215 221 233 215 221 219 198 209 159 124 153 108 66 98 105 35 55 -+123 43 68 152 49 69 166 48 64 162 38 49 142 34 47 123 33 48 -+119 34 51 126 41 60 136 44 65 116 30 44 102 29 42 110 32 46 -+123 43 68 134 49 77 131 80 105 134 49 77 134 49 77 118 50 79 -+118 50 79 134 49 77 134 49 77 134 49 77 134 49 77 118 34 52 -+97 28 42 69 20 33 79 27 44 97 28 42 112 32 46 128 41 59 -+132 43 63 123 43 68 118 50 79 76 28 47 93 57 98 93 57 98 -+62 26 49 58 26 51 58 26 51 49 25 40 4 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 1 1 1 0 0 9 3 6 39 15 26 31 10 18 -+30 10 18 48 19 31 60 25 40 52 25 42 52 25 42 52 25 42 -+52 25 42 52 25 42 58 24 38 52 25 42 54 21 35 50 18 33 -+40 15 29 31 10 18 22 7 12 10 4 6 10 4 6 7 2 4 -+3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+49 25 40 140 102 127 171 141 162 210 187 199 238 224 228 248 240 240 -+243 232 234 245 236 237 245 236 237 243 232 234 234 219 224 231 213 218 -+238 224 228 228 209 216 202 176 194 167 135 158 148 114 145 137 96 131 -+108 54 86 113 41 62 121 37 56 130 43 63 134 49 77 138 88 121 -+140 102 127 159 124 153 180 150 172 148 114 145 131 80 105 113 41 62 -+105 35 55 113 41 62 134 49 77 130 43 63 145 47 69 141 92 121 -+131 80 105 143 45 66 110 32 46 97 28 42 102 29 42 102 29 42 -+110 32 46 119 34 51 125 35 52 128 41 59 126 41 60 128 42 60 -+132 43 63 123 43 68 118 50 79 113 41 62 76 28 47 58 26 51 -+58 26 51 58 26 51 58 26 51 73 26 48 30 10 18 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 0 0 7 2 4 16 5 9 22 7 12 35 12 21 42 17 30 -+50 18 33 48 19 31 54 19 32 60 22 36 63 22 36 63 22 36 -+58 24 38 52 24 38 58 20 33 48 16 29 47 16 28 36 11 20 -+31 10 18 22 7 12 7 1 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 10 4 6 120 71 102 -+191 162 183 210 187 199 226 205 215 238 224 228 233 215 221 234 219 224 -+238 224 228 241 229 231 243 232 234 238 224 228 234 219 224 228 209 216 -+233 215 221 219 198 209 191 162 183 167 135 158 148 114 145 108 66 98 -+108 54 86 131 80 105 171 141 162 202 176 194 228 209 216 238 224 228 -+241 229 231 245 236 237 248 240 240 248 240 240 238 224 228 219 198 209 -+191 162 183 131 80 105 105 35 55 105 35 55 128 41 59 140 40 59 -+144 40 57 152 40 56 139 38 56 141 40 57 141 43 61 141 42 59 -+141 43 61 131 38 56 135 40 58 135 40 58 128 41 59 131 42 64 -+134 49 77 118 50 79 108 54 86 108 54 86 93 57 98 93 57 98 -+73 26 48 58 26 51 58 26 51 58 26 51 58 26 51 18 7 11 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 -+7 1 3 7 1 3 10 4 6 16 5 9 20 6 10 41 14 25 -+57 17 29 57 17 29 57 17 29 69 20 33 60 21 35 54 19 32 -+57 17 29 48 19 31 41 14 25 28 8 14 16 5 9 3 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 62 26 49 167 135 158 -+226 205 215 202 176 194 180 150 172 191 162 183 202 176 194 226 205 215 -+231 213 218 231 213 218 231 213 218 219 198 209 210 187 199 202 176 194 -+202 176 194 202 176 194 171 141 162 137 96 131 131 80 105 140 102 127 -+210 187 199 238 222 225 243 232 234 248 240 240 248 240 240 248 240 240 -+245 236 237 243 232 234 238 224 228 241 229 231 238 222 225 238 222 225 -+233 215 221 210 187 199 171 141 162 131 80 105 105 35 55 131 42 64 -+145 47 69 152 40 56 159 46 62 144 40 57 141 43 61 143 45 64 -+140 40 59 135 40 58 130 43 63 131 42 64 131 42 64 123 43 68 -+118 50 79 108 54 86 108 54 86 93 57 98 76 28 47 76 28 47 -+76 28 47 58 26 51 58 26 51 58 26 51 58 26 51 30 10 18 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 -+7 1 3 20 6 10 31 10 18 41 13 21 57 17 29 57 17 29 -+69 20 33 69 20 33 79 27 44 71 23 37 71 23 37 57 17 29 -+36 11 20 38 12 21 16 5 9 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 140 102 127 -+210 187 199 226 205 215 210 187 199 210 187 199 210 187 199 210 187 199 -+210 187 199 210 187 199 202 176 194 202 176 194 180 150 172 191 162 183 -+180 150 172 171 141 162 146 108 143 95 59 101 196 169 185 245 236 237 -+238 224 228 234 219 224 238 224 228 238 224 228 243 232 234 243 232 234 -+245 236 237 245 236 237 238 224 228 231 213 218 238 224 228 226 205 215 -+219 198 209 202 176 194 196 169 185 167 135 158 120 71 102 105 35 55 -+134 49 77 152 49 69 159 46 62 159 46 63 152 40 56 152 40 56 -+139 44 66 134 49 77 134 49 77 134 49 77 118 50 79 118 50 79 -+108 54 86 93 57 98 73 26 48 93 57 98 58 26 51 58 26 51 -+58 26 51 58 26 51 58 26 51 58 26 51 93 57 98 49 25 40 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 1 1 10 4 6 7 2 4 -+10 4 6 28 8 14 57 17 29 97 28 42 102 29 42 97 28 42 -+86 29 44 69 20 33 69 20 33 41 13 21 20 6 10 16 5 9 -+9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 25 40 -+196 169 185 228 209 216 226 205 215 233 215 221 234 219 224 238 224 228 -+238 224 228 234 219 224 233 215 221 231 213 218 202 176 194 180 150 172 -+171 141 162 146 108 143 137 96 131 196 169 185 238 224 228 243 232 234 -+241 229 231 234 219 224 233 215 221 234 219 224 241 229 231 234 219 224 -+238 224 228 234 219 224 228 209 216 219 198 209 191 162 183 191 162 183 -+202 176 194 191 162 183 159 124 153 148 114 145 137 96 131 93 57 98 -+113 41 62 134 49 77 145 47 69 145 47 69 134 49 77 134 49 77 -+134 49 77 118 50 79 108 54 86 108 54 86 108 54 86 76 28 47 -+73 26 48 73 26 48 73 26 48 58 26 51 58 26 51 58 26 51 -+58 26 51 93 57 98 93 57 98 93 57 98 88 61 125 58 26 51 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 4 0 1 36 11 20 69 20 33 -+102 29 42 117 31 42 102 29 42 71 23 37 71 23 37 61 21 34 -+41 13 21 9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 -+67 27 47 167 135 158 210 187 199 219 198 209 226 205 215 234 219 224 -+226 205 215 233 215 221 234 219 224 226 205 215 219 198 209 180 150 172 -+167 135 158 137 96 131 137 96 131 226 205 215 210 187 199 202 176 194 -+219 198 209 226 205 215 226 205 215 219 198 209 228 209 216 226 205 215 -+210 187 199 202 176 194 202 176 194 191 162 183 171 141 162 167 135 158 -+159 124 153 159 124 153 137 96 131 137 96 131 88 61 125 93 63 110 -+76 28 47 118 50 79 118 50 79 118 50 79 108 54 86 108 54 86 -+108 54 86 108 54 86 76 28 47 73 26 48 76 28 47 73 26 48 -+58 26 51 58 26 51 58 26 51 58 26 51 93 57 98 88 61 125 -+88 61 125 88 61 125 88 61 125 93 57 98 58 26 51 49 25 40 -+3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 0 0 41 13 21 102 29 42 132 30 39 97 28 42 69 20 33 -+71 23 37 47 16 28 1 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 18 7 11 93 57 98 108 54 86 140 102 127 167 135 158 -+171 141 162 167 135 158 159 124 153 159 124 153 159 124 153 146 108 143 -+137 96 131 93 63 110 93 57 98 219 198 209 231 213 218 219 198 209 -+202 176 194 191 162 183 171 141 162 167 135 158 171 141 162 167 135 158 -+159 124 153 159 124 153 148 114 145 146 108 143 146 108 143 146 108 143 -+137 96 131 137 96 131 88 61 125 88 61 125 88 61 125 93 57 98 -+73 26 48 105 35 55 105 35 55 76 28 47 73 26 48 73 26 48 -+76 28 47 58 26 51 58 26 51 93 57 98 93 57 98 93 57 98 -+88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 -+88 61 125 93 57 98 93 57 98 40 15 29 16 5 9 1 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 4 0 1 69 20 33 132 30 39 117 31 42 -+86 29 44 69 20 33 9 3 6 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 4 6 -+58 26 51 140 102 127 140 102 127 219 198 209 238 224 228 234 219 224 -+226 205 215 226 205 215 219 198 209 202 176 194 196 169 185 171 141 162 -+159 124 153 146 108 143 138 88 121 108 66 98 93 63 110 93 63 110 -+93 63 110 93 63 110 88 61 125 88 61 125 88 61 125 88 61 125 -+93 57 98 93 57 98 93 57 98 93 57 98 93 57 98 93 57 98 -+93 57 98 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 -+88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 -+58 26 51 40 15 29 7 2 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 102 29 42 102 29 42 -+71 23 37 79 27 44 38 12 21 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 1 1 167 135 158 202 176 194 210 187 199 -+228 209 216 228 209 216 228 209 216 228 209 216 226 205 215 219 198 209 -+210 187 199 191 162 183 180 150 172 148 114 145 137 96 131 137 96 131 -+88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 -+88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 -+88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 -+88 61 125 88 61 125 58 26 51 40 15 29 16 5 9 3 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 57 17 29 97 28 42 -+97 28 42 86 29 44 41 14 25 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 7 2 4 52 25 42 131 80 105 -+148 114 145 196 169 185 219 198 209 226 205 215 233 215 221 219 198 209 -+202 176 194 202 176 194 191 162 183 171 141 162 148 114 145 146 108 143 -+137 96 131 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 -+88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 -+88 61 125 88 61 125 93 57 98 58 26 51 58 26 51 49 25 40 -+18 7 11 9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 16 5 9 69 20 33 28 8 14 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 7 1 3 97 28 42 97 28 42 -+71 23 37 61 21 34 36 11 20 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 22 7 12 52 25 42 67 27 47 93 57 98 93 57 98 -+93 57 98 93 57 98 58 26 51 93 57 98 58 26 51 58 26 51 -+58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 -+49 25 40 40 15 29 40 15 29 16 5 9 9 3 6 3 1 1 -+1 0 0 4 0 1 1 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 41 13 21 148 30 39 185 38 47 152 32 42 28 8 14 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 20 6 10 86 29 44 97 28 42 69 20 33 -+47 16 28 40 15 29 30 10 18 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 8 14 -+97 28 42 185 38 47 185 38 47 159 35 49 152 32 42 102 29 42 -+28 8 14 7 2 4 0 0 0 1 0 0 7 1 3 28 8 14 -+31 10 18 57 17 29 97 28 42 69 20 33 54 19 32 48 19 31 -+28 8 14 9 3 6 1 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 16 5 9 69 20 33 121 30 42 152 32 42 -+185 38 47 152 32 42 152 32 42 152 32 42 141 31 41 132 30 39 -+97 28 42 69 20 33 57 17 29 69 20 33 69 20 33 71 23 37 -+71 23 37 71 23 37 51 18 32 58 20 33 48 19 31 18 7 11 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 10 4 6 39 15 26 -+54 19 32 97 28 42 148 30 39 185 38 47 185 38 47 185 38 47 -+159 35 49 152 32 42 152 32 42 148 30 39 142 31 41 141 31 41 -+132 30 39 117 31 42 97 28 42 73 26 42 67 22 35 58 20 33 -+47 16 28 47 16 28 40 15 29 40 15 29 22 7 12 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 10 4 6 47 16 28 69 20 33 131 32 43 -+152 32 42 185 38 47 185 38 47 185 38 47 185 38 47 159 35 49 -+148 30 39 148 30 39 152 32 42 141 31 41 148 30 39 152 32 42 -+138 32 45 102 29 42 71 23 37 52 24 38 48 19 31 47 16 28 -+41 14 25 41 14 25 41 14 25 41 13 21 4 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+7 1 3 102 29 42 148 30 39 185 38 47 185 38 47 185 38 47 -+162 38 49 152 32 42 152 32 42 148 30 39 148 30 39 132 30 39 -+124 30 42 117 31 42 117 31 42 97 28 42 97 28 42 86 29 44 -+71 23 37 47 16 28 36 11 20 41 13 21 28 8 14 28 8 14 -+28 8 14 22 7 12 16 5 9 16 5 9 4 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+22 7 12 117 31 42 102 29 42 97 28 42 69 20 33 69 20 33 -+57 17 29 47 16 28 47 16 28 41 13 21 41 13 21 41 13 21 -+41 13 21 41 13 21 36 11 20 41 13 21 30 10 18 7 2 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -diff --git a/drivers/video/logo/logo_debian_clut224.ppm b/drivers/video/logo/logo_debian_clut224.ppm -new file mode 100644 -index 000000000000..0daf7736ab58 ---- /dev/null -+++ b/drivers/video/logo/logo_debian_clut224.ppm -@@ -0,0 +1,883 @@ -+P3 -+64 80 -+255 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 36 1 13 99 3 37 93 2 34 135 4 50 95 3 36 -+41 1 15 21 0 7 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 64 2 24 -+154 4 57 213 6 80 228 7 85 227 7 85 226 7 85 209 6 78 -+217 7 81 194 6 73 98 3 37 95 3 36 126 4 47 159 4 59 -+147 4 55 150 4 56 175 4 65 106 3 39 43 1 16 2 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 9 0 3 87 2 32 177 5 66 224 7 84 -+225 7 85 218 7 82 215 7 81 215 7 81 214 6 80 217 7 82 -+217 7 82 219 7 82 226 7 85 227 7 85 226 7 85 225 7 84 -+225 7 85 224 7 84 223 7 84 227 7 85 219 7 82 182 5 68 -+106 3 39 24 0 9 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 0 1 90 2 33 191 6 71 227 7 85 223 7 84 216 7 81 -+214 7 80 214 7 81 215 7 81 215 7 81 215 7 81 215 7 81 -+214 7 80 215 7 81 215 7 81 215 7 81 215 7 81 214 7 81 -+215 7 81 215 7 81 214 7 80 215 7 81 217 7 81 222 7 83 -+228 7 86 206 6 77 120 3 45 41 1 15 63 1 23 104 3 39 -+49 1 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 62 1 23 -+182 5 68 228 7 85 221 7 83 215 7 81 214 7 80 215 7 81 -+215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 -+215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 -+215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 214 7 80 -+215 7 81 219 7 82 226 7 85 219 7 82 223 7 84 231 7 86 -+215 7 80 40 1 15 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 9 0 3 133 4 50 225 7 84 -+223 7 84 215 7 81 214 7 80 215 7 81 215 7 81 215 7 81 -+215 7 81 215 7 81 215 7 81 214 7 80 215 7 81 216 7 81 -+216 7 81 216 7 81 217 7 81 218 7 82 218 7 82 218 7 82 -+217 7 82 216 7 81 215 7 81 214 7 81 214 7 81 215 7 81 -+215 7 81 214 7 80 215 7 81 217 7 81 216 7 81 214 7 80 -+221 7 83 204 6 76 81 2 30 57 1 21 2 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 1 0 0 99 3 37 171 4 64 229 7 86 216 7 81 -+214 7 80 214 7 81 215 7 81 215 7 81 215 7 81 215 7 81 -+214 7 81 214 7 80 217 7 81 224 7 84 227 7 85 222 7 83 -+219 7 82 222 7 83 210 5 78 205 6 77 202 5 76 205 6 77 -+209 6 78 219 7 82 225 7 84 227 7 85 224 7 84 219 7 82 -+215 7 81 214 7 80 215 7 81 215 7 81 215 7 81 214 7 81 -+214 7 80 220 7 82 221 7 83 217 7 81 166 5 62 26 0 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+6 0 2 148 4 55 232 7 87 222 7 83 214 7 80 214 7 80 -+215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 214 7 80 -+215 7 81 225 7 84 214 6 80 153 4 56 95 3 36 54 1 20 -+42 1 16 51 1 19 26 0 10 16 0 6 14 0 5 16 0 6 -+24 0 9 41 1 15 68 1 25 105 2 39 155 4 58 199 6 74 -+225 7 84 225 7 84 217 7 81 214 7 80 214 7 81 215 7 81 -+215 7 81 214 7 80 216 7 81 217 7 81 227 7 85 201 6 75 -+54 1 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 0 5 -+166 5 62 229 7 86 215 7 81 214 7 81 214 7 80 215 7 81 -+215 7 81 215 7 81 215 7 81 214 7 80 217 7 82 225 7 85 -+225 7 84 160 4 59 42 1 15 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 0 4 -+68 1 25 151 4 56 215 7 80 225 7 84 215 7 81 214 7 80 -+215 7 81 215 7 81 215 7 81 214 7 80 214 7 80 222 7 83 -+215 6 81 71 2 26 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 22 0 8 180 5 67 -+228 7 85 214 7 80 214 7 80 215 7 81 215 7 81 215 7 81 -+214 7 80 215 7 81 219 7 82 227 7 85 207 6 77 147 4 55 -+64 2 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 43 1 16 159 5 60 227 7 85 218 7 82 -+214 7 80 215 7 81 215 7 81 215 7 81 214 7 81 214 7 80 -+220 7 82 222 7 83 74 2 28 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 22 0 8 183 5 68 227 7 85 -+214 7 80 214 7 80 215 7 81 215 7 81 215 7 81 214 7 80 -+217 7 81 225 7 85 195 5 73 163 5 61 90 2 33 10 0 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 97 3 36 215 5 80 -+221 7 83 214 7 80 214 7 81 215 7 81 215 7 81 215 7 81 -+214 7 80 220 7 82 216 7 80 55 1 20 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 10 0 3 175 4 65 227 7 85 214 7 80 -+214 7 80 215 7 81 215 7 81 215 7 81 214 7 80 220 7 82 -+214 5 80 105 3 39 13 0 5 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 1 21 -+204 6 76 222 7 83 214 7 80 214 7 81 215 7 81 215 7 81 -+215 7 81 214 7 80 222 7 83 201 6 75 29 0 10 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 124 4 46 230 7 86 214 7 80 214 7 80 -+215 7 81 215 7 81 214 7 80 215 7 81 222 7 83 206 5 76 -+58 1 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+41 1 15 201 6 75 222 7 83 214 7 80 215 7 81 215 7 81 -+215 7 81 214 7 81 214 7 80 226 7 85 170 5 63 3 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 43 1 16 211 6 79 218 7 81 214 7 80 215 7 81 -+214 7 81 214 7 80 217 7 81 226 7 85 206 6 77 105 3 39 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 42 1 15 206 6 77 220 7 82 214 7 80 215 7 81 -+215 7 81 215 7 81 214 7 80 215 7 80 229 7 86 105 3 39 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+5 0 1 183 5 68 224 7 84 214 7 80 215 7 81 214 7 80 -+214 7 80 222 7 83 214 5 80 115 3 43 19 0 7 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 62 1 23 219 6 82 217 7 81 214 7 80 -+215 7 81 215 7 81 215 7 81 214 7 80 219 7 82 211 6 79 -+30 1 11 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+69 1 26 226 7 85 215 7 81 214 7 81 214 7 80 214 7 80 -+226 7 85 191 6 71 49 1 18 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 104 3 39 228 7 85 214 7 80 -+214 7 81 215 7 81 215 7 81 215 7 81 214 7 80 227 7 85 -+138 3 51 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 51 1 19 0 0 0 0 0 0 0 0 0 -+162 4 60 224 7 84 214 7 80 214 7 80 214 7 80 227 7 85 -+170 5 64 20 0 7 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 166 5 62 224 7 84 -+214 7 80 215 7 81 215 7 81 214 7 80 215 7 81 220 7 82 -+214 6 80 32 1 12 0 0 0 0 0 0 -+0 0 0 5 0 2 49 1 18 0 0 0 0 0 0 40 1 15 -+218 6 81 216 7 81 214 7 80 214 7 80 228 7 85 163 5 61 -+8 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 37 1 14 214 6 80 -+216 7 81 214 7 81 214 7 81 214 7 80 222 7 83 215 7 81 -+228 7 85 106 3 39 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 32 1 12 174 5 65 -+222 7 83 214 7 80 214 7 80 227 7 85 163 5 61 8 0 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 129 4 48 -+226 7 85 214 7 80 215 7 81 222 7 83 115 3 43 44 1 16 -+140 3 52 85 2 31 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 15 0 5 201 6 75 225 7 84 -+214 7 80 214 7 80 225 7 84 178 4 66 12 0 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 0 9 -+210 5 78 217 7 81 215 7 81 227 7 85 79 2 30 0 0 0 -+36 1 13 82 2 31 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 97 3 36 229 7 86 215 7 80 -+214 7 80 221 7 83 199 5 74 25 0 9 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+145 4 54 224 7 84 214 7 80 222 7 83 168 5 62 40 1 15 -+0 0 0 20 0 7 0 0 0 0 0 0 -+0 0 0 0 0 0 4 0 1 185 6 69 221 7 83 214 7 80 -+216 7 81 213 6 80 54 1 20 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 40 1 15 110 3 41 163 5 61 188 6 70 -+194 6 73 182 5 68 145 4 54 80 2 30 13 0 5 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+64 2 24 224 7 84 215 7 80 214 7 80 226 7 84 188 6 70 -+3 0 1 0 0 0 0 0 0 0 0 0 -+6 0 2 0 0 0 62 1 23 225 7 84 215 7 81 215 7 81 -+223 7 83 126 4 47 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+43 1 16 160 4 59 230 7 86 233 7 87 193 6 72 147 4 55 -+117 3 44 106 3 39 120 3 45 150 4 56 159 4 59 90 2 33 -+9 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+12 0 4 201 6 75 218 7 81 214 7 80 218 7 81 213 6 80 -+25 0 9 0 0 0 0 0 0 0 0 0 -+33 1 12 0 0 0 145 4 54 226 7 84 214 7 80 214 7 80 -+224 7 84 154 4 57 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 95 3 36 -+225 7 84 226 7 85 140 3 52 50 1 18 4 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 8 0 3 56 1 21 -+76 2 28 17 0 6 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 163 5 61 222 7 83 215 7 81 219 7 82 183 5 68 -+51 1 19 0 0 0 0 0 0 0 0 0 -+1 0 0 17 0 6 204 6 76 219 7 82 215 7 81 215 7 80 -+224 7 84 71 2 26 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 102 2 37 239 7 89 -+175 4 65 44 1 16 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 14 0 5 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 131 4 49 225 7 84 215 7 81 224 7 84 142 4 53 -+8 0 3 0 0 0 0 0 0 0 0 0 -+0 0 0 80 2 30 226 7 85 215 7 80 214 7 80 222 7 83 -+172 4 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 50 1 19 235 7 88 148 4 55 -+7 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 97 3 36 224 7 84 215 7 81 219 7 82 202 6 75 -+20 0 7 0 0 0 0 0 0 0 0 0 -+0 0 0 151 4 56 225 7 84 214 7 80 215 7 80 222 7 83 -+62 1 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 25 0 9 195 5 73 162 4 60 2 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 53 1 20 220 7 82 215 7 81 215 7 80 227 7 85 -+87 2 32 0 0 0 0 0 0 0 0 0 -+15 0 6 202 5 76 219 7 82 214 7 81 222 7 83 166 5 62 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 0 1 175 4 65 207 6 77 15 0 5 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 56 1 21 221 7 83 214 7 81 216 7 80 223 7 83 -+58 1 21 0 0 0 0 0 0 0 0 0 -+64 2 24 224 7 84 215 7 80 215 7 81 223 7 84 77 2 29 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 71 1 26 239 7 89 80 2 30 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 50 1 18 219 7 82 215 7 81 215 7 81 225 7 84 -+76 2 28 0 0 0 0 0 0 0 0 0 -+52 1 19 221 7 82 216 7 80 215 7 80 212 6 80 32 1 12 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 160 4 59 193 6 72 1 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 43 1 16 216 7 81 216 7 81 214 7 81 220 7 82 -+182 5 68 22 0 8 0 0 0 0 0 0 -+33 1 12 212 6 80 217 7 81 217 7 81 204 6 76 19 0 7 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+20 0 7 220 5 82 111 3 41 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 43 1 16 216 7 81 216 7 81 214 7 81 221 7 83 -+186 5 70 6 0 2 0 0 0 0 0 0 -+32 1 12 212 6 80 217 7 81 218 7 82 194 6 73 7 0 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+117 3 44 232 7 87 47 1 17 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 41 1 15 36 1 13 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 48 1 18 218 7 82 215 7 81 214 7 80 231 7 86 -+111 3 41 0 0 0 0 0 0 0 0 0 -+41 1 15 218 7 82 216 7 80 221 7 83 177 5 66 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+180 5 67 211 6 79 16 0 6 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 15 0 5 16 0 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 69 1 26 223 7 83 214 6 80 220 7 82 188 6 70 -+47 1 17 0 0 0 0 0 0 0 0 0 -+41 1 15 217 7 81 217 7 81 223 7 83 157 5 59 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 -+193 5 72 195 5 73 4 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 56 1 21 215 6 81 216 6 81 224 7 84 104 3 39 -+0 0 0 0 0 0 0 0 0 0 0 0 -+51 1 19 221 7 82 216 7 81 224 7 83 135 4 50 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 2 -+199 5 74 193 6 72 1 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 33 0 12 212 6 80 218 7 82 217 7 81 36 1 13 -+0 0 0 0 0 0 0 0 0 0 0 0 -+53 1 20 222 7 83 215 7 81 225 7 84 115 3 43 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 2 -+193 5 72 221 7 82 62 1 23 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 71 1 26 223 7 83 219 7 82 205 6 76 17 0 6 -+0 0 0 0 0 0 0 0 0 0 0 0 -+53 1 20 222 7 83 215 7 81 225 7 84 97 3 36 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+182 5 68 233 7 87 97 3 36 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 142 4 53 224 7 84 224 7 84 160 4 59 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+42 1 16 218 7 82 216 7 81 224 7 83 82 2 31 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+157 5 59 233 7 88 133 4 50 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+13 0 5 206 6 77 218 7 82 226 7 85 71 2 26 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+44 1 16 219 7 82 216 7 81 223 7 84 79 2 30 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+112 3 42 233 7 87 185 6 69 2 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 26 0 10 7 0 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 0 8 -+140 3 52 222 7 83 222 7 83 177 5 66 3 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+54 1 20 222 7 83 215 7 81 223 7 83 79 2 30 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+48 1 18 223 7 84 223 7 83 53 1 20 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 159 5 60 -+231 7 86 218 7 82 234 7 87 80 2 30 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+50 1 18 221 7 82 216 7 80 224 7 84 82 2 31 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 0 0 174 5 65 233 7 87 150 4 56 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 10 0 3 18 0 6 19 0 7 9 0 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 180 5 67 -+225 7 84 199 6 74 110 3 41 20 0 7 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+41 1 15 217 7 81 217 7 81 225 7 84 106 3 39 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 68 1 25 228 7 85 222 7 83 56 1 21 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 21 0 8 87 2 32 117 3 44 19 0 7 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 43 1 16 207 6 77 -+229 7 86 98 2 36 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+30 1 11 211 6 79 217 7 81 223 7 83 151 4 56 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 148 4 55 235 7 88 188 6 70 13 0 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 60 1 22 207 6 77 225 7 84 -+221 7 83 34 0 12 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+15 0 6 201 6 75 219 7 82 216 7 81 209 6 78 36 1 13 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 1 20 -+10 0 3 0 0 0 15 0 5 188 6 70 236 7 88 158 4 59 -+4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 80 2 30 215 7 80 226 7 84 215 5 80 -+76 2 28 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+1 0 0 186 5 70 221 7 83 214 7 80 225 7 84 77 2 29 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 0 8 -+55 1 20 7 0 2 0 0 0 33 0 12 202 6 75 237 7 89 -+151 4 56 7 0 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 111 3 41 225 7 84 225 7 84 215 5 80 67 2 25 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 159 5 60 224 7 84 214 7 81 221 7 83 53 1 20 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+36 1 13 26 0 9 39 1 14 0 0 0 36 1 13 193 5 72 -+238 7 89 174 5 65 36 1 13 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 16 0 6 75 2 28 -+154 4 57 228 7 85 228 7 85 204 6 76 57 1 21 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 120 3 45 227 7 85 214 7 80 223 7 83 104 3 39 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 5 0 2 15 0 5 37 1 14 0 0 0 22 0 8 -+172 4 64 238 7 89 211 6 79 106 3 39 14 0 5 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 50 1 18 182 5 68 230 7 86 -+228 7 86 229 7 86 170 5 63 30 1 11 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 74 2 28 225 7 84 215 7 80 223 7 83 159 4 59 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 9 0 3 29 0 10 34 0 12 -+3 0 1 135 4 50 230 7 86 232 7 87 199 6 74 126 4 47 -+56 1 21 19 0 7 3 0 1 0 0 0 3 0 1 21 0 8 -+67 2 25 131 4 49 170 5 63 221 7 83 228 7 86 228 7 86 -+204 6 76 99 3 37 1 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 29 0 10 211 6 79 217 7 81 220 7 82 182 5 68 -+2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 2 28 -+126 4 47 22 0 8 98 2 36 205 6 77 230 7 86 238 7 89 -+232 7 87 209 6 78 191 6 71 188 6 70 192 6 72 209 6 78 -+230 7 86 235 7 88 235 7 88 226 7 85 193 6 72 112 3 42 -+21 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 177 5 66 222 7 83 215 7 80 221 7 83 -+57 1 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+54 1 20 140 3 52 133 3 49 47 1 17 68 1 25 126 4 47 -+171 4 64 201 6 75 216 7 81 221 7 83 221 7 83 212 6 80 -+199 6 74 172 4 64 126 4 47 64 2 24 10 0 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 117 3 44 227 7 85 214 7 80 221 7 83 -+170 5 63 8 0 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 1 0 0 71 2 26 117 3 44 53 1 20 9 0 3 -+0 0 0 6 0 2 19 0 7 26 0 10 27 0 10 24 0 9 -+12 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 49 1 18 222 7 83 216 7 81 214 7 80 -+220 7 82 189 6 71 133 4 50 12 0 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 34 0 12 64 2 24 -+76 2 28 71 1 26 60 1 22 47 1 17 40 1 15 8 0 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 0 0 181 5 67 222 7 83 214 7 80 -+214 7 81 221 7 83 233 7 88 140 3 52 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 12 0 4 21 0 8 22 0 8 16 0 6 2 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 102 2 37 227 7 85 214 7 80 -+215 7 81 214 7 80 216 7 81 199 6 74 47 1 17 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 22 0 8 207 6 77 218 7 82 -+214 7 81 215 7 81 223 7 84 120 3 45 42 1 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 133 4 50 227 7 85 -+214 7 80 215 7 81 219 7 82 188 6 70 3 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 36 1 13 216 6 81 -+217 7 81 214 7 81 214 7 80 227 7 85 110 3 41 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 3 51 -+227 7 85 214 7 80 214 7 80 217 7 81 210 5 78 26 0 10 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 0 10 -+211 6 79 218 7 82 214 7 80 217 7 81 207 6 77 25 0 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+111 3 41 229 7 86 214 7 80 214 7 80 223 7 83 155 4 58 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+8 0 3 185 6 69 223 7 83 214 7 80 217 7 81 207 6 77 -+14 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 56 1 21 223 7 84 217 7 81 214 7 80 225 7 84 -+127 3 47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 120 3 45 229 7 86 214 7 80 216 7 81 -+223 7 83 62 1 23 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 4 0 1 171 4 64 226 7 84 214 7 80 -+220 7 82 199 6 74 20 0 7 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 26 0 10 200 5 74 222 7 83 -+214 7 80 226 7 85 157 5 59 12 0 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 54 1 20 216 5 80 -+219 7 82 214 7 80 227 7 85 154 4 57 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 2 29 -+224 7 84 218 7 82 216 7 81 223 7 84 60 1 22 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+87 2 32 224 7 84 218 7 82 220 7 82 193 6 72 17 0 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 87 2 32 224 7 84 219 7 82 221 7 83 188 5 69 -+145 4 54 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 76 2 28 214 7 81 222 7 83 221 7 83 -+231 7 86 145 4 54 3 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 53 1 20 199 6 74 226 7 85 -+215 7 81 227 7 85 170 5 63 39 1 14 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 24 0 9 165 5 61 -+229 7 86 218 7 82 230 7 86 95 3 36 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 -+109 3 40 216 7 80 226 7 85 211 6 79 151 4 56 23 0 8 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 44 1 16 170 5 63 229 7 86 233 7 88 201 6 75 -+99 3 37 51 1 19 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 81 2 30 185 6 69 232 7 87 -+233 7 88 229 7 86 126 4 47 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 7 0 2 85 2 31 -+177 5 66 224 7 84 238 7 89 143 4 53 12 0 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 0 0 54 1 20 131 4 49 201 6 75 191 6 71 104 3 39 -+40 1 15 9 0 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 6 0 2 53 1 20 110 3 41 -+131 4 49 119 3 44 97 3 36 71 1 26 32 1 12 1 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -diff --git a/drivers/video/logo/logo_exherbo_clut224.ppm b/drivers/video/logo/logo_exherbo_clut224.ppm -new file mode 100644 -index 000000000000..e9cedd26756f ---- /dev/null -+++ b/drivers/video/logo/logo_exherbo_clut224.ppm -@@ -0,0 +1,963 @@ -+P3 -+71 80 -+255 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 117 117 117 104 104 104 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 143 143 143 255 255 255 -+179 179 179 19 19 19 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 34 34 34 104 104 104 16 16 16 -+0 0 0 0 0 0 0 0 0 0 0 0 60 60 60 161 161 161 -+98 98 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 112 106 107 255 255 255 -+255 255 255 197 197 197 21 21 21 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 60 60 60 236 236 236 255 255 255 57 57 57 -+0 0 0 0 0 0 1 1 1 117 117 117 251 251 251 255 255 255 -+250 250 250 33 33 33 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 33 33 33 245 245 245 -+255 255 255 255 255 255 141 140 140 0 0 0 0 0 0 0 0 0 -+0 0 0 25 25 25 230 230 230 255 255 255 255 255 255 54 54 54 -+0 0 0 0 0 0 34 34 34 254 254 254 255 255 255 255 255 255 -+255 255 255 93 92 92 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 93 92 92 -+255 255 255 222 222 222 30 30 30 10 10 10 45 45 45 0 0 0 -+0 0 0 152 152 152 255 255 255 255 255 255 244 244 244 25 25 25 -+0 0 0 0 0 0 45 45 45 254 254 254 255 255 255 255 255 255 -+255 255 255 117 117 117 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 49 49 49 202 202 202 15 15 15 0 0 0 3 3 3 -+54 54 54 61 61 61 18 17 17 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+88 88 88 54 51 52 0 0 0 168 168 168 156 156 156 0 0 0 -+23 23 23 243 243 243 255 255 255 255 255 255 229 229 229 16 16 16 -+0 0 0 0 0 0 38 38 38 250 250 250 255 255 255 255 255 255 -+255 255 255 93 92 92 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 152 152 152 255 255 255 33 33 33 0 0 0 7 7 7 -+164 164 164 255 255 255 229 229 229 82 82 82 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 112 106 107 255 255 255 191 191 191 0 0 0 -+93 92 92 255 255 255 255 255 255 255 255 255 254 254 254 207 207 207 -+57 57 57 0 0 0 18 17 17 236 236 236 255 255 255 255 255 255 -+249 248 248 38 38 38 0 0 0 0 0 0 0 0 0 0 0 0 -+49 47 48 246 246 246 251 251 251 30 30 30 0 0 0 0 0 0 -+3 3 3 147 147 147 255 255 255 249 249 249 61 61 61 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 39 39 39 244 244 244 255 255 255 225 225 225 1 1 1 -+161 161 161 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+249 248 248 117 117 117 1 1 1 205 205 205 255 255 255 255 255 255 -+209 209 209 4 4 4 0 0 0 0 0 0 7 7 7 67 68 68 -+227 227 227 255 255 255 253 253 253 88 88 88 0 0 0 0 0 0 -+0 0 0 0 0 0 150 150 150 255 255 255 183 183 183 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 187 187 187 255 255 255 255 255 255 247 247 247 36 37 36 -+201 201 201 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 181 181 181 141 140 140 251 251 251 255 255 255 -+249 249 249 215 215 215 163 163 163 77 77 77 57 57 57 147 147 147 -+245 245 245 255 255 255 255 255 255 247 247 247 182 182 182 36 37 36 -+0 0 0 0 0 0 3 3 3 184 184 184 127 127 127 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+70 69 69 255 255 255 255 255 255 255 255 255 255 255 255 82 82 82 -+221 221 221 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 249 249 249 253 253 253 255 255 255 -+255 255 255 238 238 238 88 88 88 10 9 9 0 0 0 0 0 0 -+39 39 39 216 216 216 255 255 255 255 255 255 176 176 176 12 12 12 -+0 0 0 0 0 0 0 0 0 5 5 5 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+182 182 182 255 255 255 255 255 255 255 255 255 255 255 255 134 134 134 -+234 234 234 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+244 244 244 54 54 54 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 54 54 54 249 248 248 143 143 143 1 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 26 26 -+246 246 246 255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 -+252 252 252 255 255 255 255 255 255 184 184 184 98 98 98 67 68 68 -+61 61 61 98 98 98 221 221 221 255 255 255 255 255 255 255 255 255 -+156 156 156 0 0 0 0 0 0 20 20 22 97 100 116 26 27 30 -+0 0 0 0 0 0 127 127 127 0 0 0 0 0 0 0 0 0 -+22 22 22 30 27 28 12 13 12 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 88 88 88 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 161 161 161 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 42 42 42 243 243 243 255 255 255 255 255 255 -+98 98 98 0 0 0 0 0 0 130 132 147 154 161 185 97 100 116 -+0 0 0 0 0 0 67 68 68 30 31 31 8 8 8 184 184 184 -+241 241 241 247 247 247 230 230 230 138 137 137 4 4 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 143 143 143 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 61 61 61 0 0 0 0 0 0 14 11 13 -+4 5 9 0 0 0 0 0 0 204 204 204 255 255 255 255 255 255 -+104 104 104 0 0 0 0 0 0 130 132 147 154 161 185 146 153 179 -+4 5 9 0 0 0 70 69 69 238 238 238 225 225 225 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 150 150 150 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 179 179 179 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 82 82 82 0 0 0 0 0 0 76 72 85 -+48 49 56 0 0 0 3 3 3 216 216 216 255 255 255 255 255 255 -+159 159 159 0 0 0 0 0 0 48 49 56 154 161 185 130 132 147 -+4 5 9 0 0 0 61 61 61 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 54 51 52 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 204 204 204 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 188 188 188 0 0 0 0 0 0 1 1 1 -+0 0 0 0 0 0 49 47 48 250 250 250 255 255 255 255 255 255 -+238 237 237 22 22 22 0 0 0 0 0 0 26 27 30 4 5 9 -+0 0 0 0 0 0 127 127 127 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 156 156 156 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 216 216 216 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 117 117 117 3 3 3 0 0 0 -+0 0 0 12 12 12 189 189 189 255 255 255 255 255 255 255 255 255 -+255 255 255 174 174 174 2 2 2 0 0 0 0 0 0 0 0 0 -+0 0 0 49 49 49 238 237 237 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 223 223 223 -+8 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 219 219 219 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 212 212 212 49 49 49 0 0 0 -+0 0 0 25 25 25 98 98 98 117 117 117 134 134 134 168 168 168 -+201 201 201 238 238 238 179 179 179 70 69 69 39 39 39 60 60 60 -+134 134 134 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 251 251 251 -+36 37 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 211 211 211 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 194 194 194 67 68 68 0 0 0 0 0 0 0 0 0 -+6 4 5 4 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 10 10 10 57 57 57 104 104 104 159 159 159 232 231 231 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+67 68 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 205 205 205 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+134 134 134 0 0 0 0 0 0 50 41 43 111 86 92 143 103 113 -+156 121 129 163 123 133 152 115 124 143 103 113 122 96 102 111 86 92 -+76 63 66 38 29 31 9 5 8 0 0 0 0 0 0 10 10 10 -+75 75 75 166 165 165 238 237 237 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+117 117 117 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 187 187 187 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 134 134 134 -+0 0 0 19 14 15 143 103 113 193 131 146 195 132 148 192 130 145 -+191 129 144 191 129 144 191 129 145 192 130 145 193 131 146 195 132 148 -+195 132 148 191 129 145 185 125 140 143 103 113 86 80 81 38 29 31 -+0 0 0 0 0 0 19 19 19 117 117 117 244 244 244 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+164 164 164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 125 125 125 -+255 255 255 255 255 255 255 255 255 255 255 255 192 192 192 0 0 0 -+19 19 19 163 123 133 195 132 148 186 126 141 189 128 143 192 130 145 -+188 127 142 185 125 140 185 125 140 186 126 141 186 126 141 185 125 140 -+185 125 140 186 126 141 188 127 143 192 130 145 195 132 148 191 129 144 -+152 115 124 79 66 70 19 14 15 0 0 0 54 54 54 227 227 227 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+196 196 196 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 51 52 -+253 253 253 255 255 255 255 255 255 251 251 251 54 54 54 0 0 0 -+143 103 113 195 132 148 185 125 140 192 130 145 163 123 133 143 103 113 -+185 125 140 189 128 143 185 125 140 186 126 141 186 126 141 186 126 141 -+186 126 141 186 126 141 186 126 141 185 125 140 185 125 140 186 126 141 -+191 129 145 196 133 148 185 125 140 65 56 58 0 0 0 39 39 39 -+222 222 222 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+207 207 207 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -+205 205 205 255 255 255 255 255 255 188 188 188 0 0 0 60 53 55 -+195 132 148 186 126 141 191 129 145 122 96 102 14 11 13 0 0 0 -+38 29 31 163 123 133 189 128 143 186 126 141 186 126 141 186 126 141 -+186 126 141 186 126 141 186 126 141 185 125 140 185 126 140 192 130 145 -+192 130 145 191 129 144 196 133 148 193 131 146 79 66 70 0 0 0 -+45 45 45 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 -+206 206 206 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+98 98 98 255 255 255 255 255 255 98 98 98 0 0 0 143 103 113 -+193 131 146 186 125 140 192 130 145 38 29 31 0 0 0 0 0 0 -+0 0 0 111 86 92 195 132 148 186 126 141 186 126 141 186 126 141 -+186 126 141 186 126 141 186 126 141 185 125 140 191 129 145 143 103 113 -+50 41 43 38 35 39 122 96 102 193 131 146 196 133 148 79 66 70 -+0 0 0 93 92 92 255 255 255 255 255 255 255 255 255 255 255 255 -+187 187 187 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+7 7 7 217 217 217 255 255 255 42 42 42 10 7 8 185 125 140 -+188 127 143 186 126 141 193 131 146 76 63 66 0 0 0 0 0 0 -+0 0 0 143 103 113 192 130 145 186 126 141 186 126 141 186 126 141 -+186 126 141 186 126 141 186 126 141 191 129 144 143 103 113 5 3 4 -+0 0 0 0 0 0 4 2 2 143 103 113 193 131 146 188 127 142 -+38 29 31 0 0 0 203 203 203 255 255 255 255 255 255 255 255 255 -+147 147 147 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 82 82 82 255 255 255 42 42 42 10 7 8 185 125 140 -+188 127 143 186 126 141 189 128 143 163 123 133 60 53 55 31 25 27 -+79 66 70 188 127 142 186 126 141 186 126 141 186 126 141 186 126 141 -+186 126 141 186 126 141 186 126 141 195 132 147 79 66 70 0 0 0 -+0 0 0 0 0 0 0 0 0 86 80 81 193 131 146 193 131 146 -+122 96 102 0 0 0 112 106 107 255 255 255 255 255 255 255 255 255 -+82 82 82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 187 187 187 104 104 104 0 0 0 143 103 113 -+193 131 146 185 125 140 185 125 140 189 128 143 192 130 145 188 127 142 -+193 131 146 186 126 141 185 125 140 186 126 141 186 126 141 186 126 141 -+186 126 141 186 126 141 186 126 141 195 132 147 76 63 66 0 0 0 -+0 0 0 0 0 0 0 0 0 79 66 70 195 132 148 189 128 143 -+163 123 133 0 0 0 75 75 75 255 255 255 255 255 255 234 234 234 -+16 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 34 34 34 163 163 163 0 0 0 60 53 55 -+196 133 148 186 126 141 185 125 140 185 125 140 186 126 141 188 127 142 -+186 126 141 185 125 140 186 126 141 186 126 141 186 126 141 186 126 141 -+186 126 141 186 126 141 186 126 141 193 131 146 122 96 102 0 0 0 -+0 0 0 0 0 0 0 0 0 122 96 102 193 131 146 192 130 145 -+143 103 113 0 0 0 98 98 98 255 255 255 255 255 255 141 140 140 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 79 79 79 60 60 60 0 0 0 -+122 96 102 196 133 148 188 127 142 185 125 140 185 125 140 186 126 141 -+186 126 141 186 126 141 186 126 141 186 126 141 186 126 141 186 126 141 -+186 126 141 186 126 141 186 126 141 186 126 141 189 128 143 76 63 66 -+10 7 8 6 4 5 50 41 43 185 125 140 186 126 141 196 133 148 -+76 63 66 0 0 0 168 168 168 255 255 255 238 238 238 23 23 23 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 79 79 79 19 19 19 -+6 6 6 122 96 102 191 129 145 195 132 148 193 131 146 189 128 143 -+188 127 142 186 126 141 186 126 141 185 125 140 186 126 141 186 126 141 -+186 126 141 186 126 141 186 126 141 185 125 140 186 126 141 191 129 145 -+163 123 133 152 115 124 186 126 141 189 128 143 196 133 148 143 103 113 -+1 0 0 36 37 36 244 244 244 255 255 255 112 106 107 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 49 49 49 -+12 13 12 0 0 0 31 25 27 79 66 70 143 103 113 163 123 133 -+185 125 140 191 129 144 193 131 146 195 132 148 193 131 146 193 131 146 -+192 130 145 191 129 144 189 128 143 188 127 143 188 127 142 188 127 142 -+192 130 145 195 132 147 195 132 148 192 130 145 114 88 95 4 2 2 -+4 4 4 192 192 192 255 255 255 187 187 187 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -+30 31 31 49 49 49 23 23 23 0 0 0 0 0 0 0 0 0 -+14 11 13 38 29 31 60 53 55 79 66 70 114 88 95 143 103 113 -+143 103 113 163 123 133 163 123 133 185 125 140 186 126 141 188 127 142 -+186 126 141 163 123 133 122 96 102 50 41 43 0 0 0 12 13 12 -+173 172 172 255 255 255 225 225 225 25 25 25 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 30 27 28 127 127 127 175 175 175 134 134 134 77 77 77 -+42 42 42 15 15 15 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 5 3 4 19 14 15 27 23 24 31 25 27 -+19 14 15 1 0 0 0 0 0 0 0 0 75 75 75 210 210 210 -+255 255 255 236 236 236 54 54 54 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 61 61 61 187 187 187 255 255 255 -+255 255 255 241 241 241 214 214 214 183 183 183 152 152 152 127 127 127 -+104 104 104 79 79 79 57 57 57 39 39 39 30 31 31 25 25 25 -+30 31 31 61 61 61 117 117 117 203 203 203 255 255 255 255 255 255 -+227 227 227 57 57 57 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 67 68 68 -+179 179 179 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 249 249 249 246 246 246 -+250 250 250 255 255 255 255 255 255 255 255 255 255 255 255 185 185 185 -+33 33 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 2 2 2 30 30 30 0 0 0 0 0 0 0 0 0 -+0 0 0 36 37 36 117 117 117 188 188 188 236 236 236 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 199 199 199 88 88 88 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 19 19 19 232 231 231 136 136 136 19 19 19 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 18 17 17 54 54 54 -+98 98 98 127 127 127 156 156 156 173 172 172 174 174 174 176 176 176 -+163 163 163 117 117 117 49 47 48 0 0 0 0 0 0 0 0 0 -+0 0 0 22 22 22 117 117 117 19 19 19 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 86 86 86 255 255 255 255 255 255 229 229 229 125 125 125 -+25 25 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 9 9 -+98 98 98 227 227 227 255 255 255 199 199 199 19 19 19 0 0 0 -+3 3 3 28 26 26 8 8 8 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 -+22 22 22 30 27 28 18 17 17 2 2 2 0 0 0 0 0 0 -+0 0 0 197 197 197 255 255 255 255 255 255 255 255 255 255 255 255 -+241 241 241 181 181 181 125 125 125 75 75 75 33 33 33 6 6 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 42 42 42 127 127 127 232 231 231 -+255 255 255 255 255 255 255 255 255 255 255 255 204 204 204 22 22 22 -+0 0 0 141 140 140 234 232 232 191 191 191 70 69 69 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 30 30 30 138 137 137 214 209 209 -+236 236 236 241 239 239 232 231 231 216 216 216 98 98 98 0 0 0 -+75 75 75 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 229 229 229 -+188 188 188 147 147 147 112 106 107 86 86 86 77 77 77 77 77 77 -+104 104 104 156 156 156 215 215 215 255 255 255 241 239 239 159 159 159 -+75 75 75 104 104 104 255 255 255 255 255 255 255 255 255 205 205 205 -+23 23 23 4 4 4 176 176 176 255 255 255 253 253 253 57 57 57 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 67 68 68 241 239 239 255 255 255 254 254 254 -+255 250 250 255 250 250 255 255 255 243 243 243 38 38 38 8 8 8 -+219 219 219 255 255 255 250 250 250 195 195 195 127 127 127 88 88 88 -+82 82 82 117 117 117 134 134 134 152 152 152 176 176 176 202 202 202 -+227 227 227 246 246 246 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 225 225 225 164 164 164 86 86 86 16 16 16 0 0 0 -+0 0 0 125 125 125 255 255 255 255 255 255 255 255 255 255 255 255 -+189 189 189 6 6 6 8 7 7 166 165 165 183 183 183 93 92 92 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 49 47 48 173 172 172 234 232 232 255 255 255 -+255 255 255 255 255 255 255 255 255 90 84 86 0 0 0 138 137 137 -+255 255 255 152 152 152 49 47 48 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 3 3 16 16 16 30 31 31 54 54 54 70 69 69 54 54 54 -+30 27 28 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -+79 79 79 250 250 250 255 255 255 255 255 255 255 255 255 255 255 255 -+230 230 230 141 140 140 2 2 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 22 22 22 82 82 82 -+138 137 137 192 192 192 134 134 134 0 0 0 77 77 77 241 241 241 -+79 79 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 51 52 -+243 243 243 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+205 205 205 210 210 210 117 117 117 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 38 38 38 212 212 212 57 57 57 -+0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 3 3 3 -+1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 217 217 217 -+255 255 255 255 255 255 255 255 255 255 255 255 234 234 234 82 82 82 -+104 104 104 206 206 206 208 208 208 79 79 79 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 10 10 10 159 159 159 45 45 45 0 0 0 -+23 23 23 82 82 82 143 143 143 188 188 188 214 214 214 217 217 217 -+213 213 213 205 205 205 189 189 189 174 174 174 152 152 152 127 127 127 -+98 98 98 77 77 77 54 54 54 39 39 39 28 26 26 16 16 16 -+10 10 10 15 15 15 33 33 33 98 98 98 217 217 217 255 255 255 -+255 255 255 255 255 255 255 255 255 238 238 238 54 54 54 0 0 0 -+30 30 30 199 199 199 203 203 203 195 195 195 34 34 34 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 82 82 82 49 49 49 60 60 60 168 168 168 -+238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 251 251 251 243 243 243 234 234 234 -+225 225 225 234 234 234 247 247 247 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 232 231 231 61 61 61 0 0 0 0 0 0 -+45 45 45 202 202 202 199 199 199 209 209 209 134 134 134 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 42 42 42 227 227 227 216 216 216 255 255 255 255 255 255 -+255 255 255 249 248 248 205 205 205 171 170 170 176 176 176 219 219 219 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 175 175 175 30 30 30 0 0 0 0 0 0 0 0 0 -+112 106 107 208 208 208 198 198 198 202 202 202 189 189 189 18 17 17 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 150 150 150 255 255 255 255 255 255 255 255 255 238 238 238 -+134 134 134 36 37 36 0 0 0 0 0 0 0 0 0 7 7 7 -+67 68 68 150 150 150 213 213 213 247 247 247 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 219 219 219 -+93 92 92 0 0 0 0 0 0 0 0 0 0 0 0 30 30 30 -+191 191 191 202 202 202 199 199 199 198 198 198 207 207 207 67 68 68 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+6 6 6 221 221 221 255 255 255 255 255 255 174 174 174 33 33 33 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 3 3 3 34 34 34 70 69 69 104 104 104 -+134 134 134 152 152 152 164 164 164 177 177 177 187 187 187 192 192 192 -+198 198 198 204 204 204 200 200 200 168 168 168 93 92 92 12 13 12 -+0 0 0 0 0 0 0 0 0 0 0 0 16 16 16 163 163 163 -+206 206 206 198 198 198 199 199 199 198 198 198 208 208 208 127 127 127 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+33 33 33 251 251 251 255 255 255 255 255 255 42 42 42 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 34 34 34 166 165 165 207 207 207 -+198 198 198 198 198 198 199 199 199 199 199 199 203 203 203 179 179 179 -+10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 39 39 250 250 250 255 255 255 255 255 255 112 106 107 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 8 -+15 15 15 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 12 12 12 93 92 92 192 192 192 206 206 206 198 198 198 -+198 198 198 199 199 199 199 199 199 199 199 199 200 200 200 203 203 203 -+49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+2 2 2 39 39 39 117 117 117 213 213 213 255 255 255 195 195 195 -+176 176 176 168 168 168 168 168 168 176 176 176 201 201 201 225 225 225 -+234 234 234 216 216 216 168 168 168 93 92 92 30 27 28 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 15 -+88 88 88 177 177 177 209 209 209 202 202 202 198 198 198 198 198 198 -+199 199 199 199 199 199 199 199 199 198 198 198 199 199 199 215 215 215 -+112 106 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 7 7 7 112 106 107 245 245 245 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 243 243 243 189 189 189 -+127 127 127 79 79 79 60 60 60 45 45 45 33 33 33 28 26 26 -+28 26 26 33 33 33 54 51 52 82 82 82 125 125 125 182 182 182 -+209 209 209 204 204 204 199 199 199 198 198 198 198 198 198 199 199 199 -+199 199 199 198 198 198 198 198 198 202 202 202 208 208 208 166 165 165 -+61 61 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 36 37 36 86 86 86 138 137 137 141 140 140 117 117 117 -+70 69 69 15 15 15 0 0 0 0 0 0 0 0 0 34 34 34 -+182 182 182 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 247 247 247 244 244 244 -+244 244 244 249 249 249 238 238 238 212 212 212 206 206 206 203 203 203 -+199 199 199 198 198 198 199 199 199 198 198 198 200 200 200 208 208 208 -+207 207 207 198 198 198 206 206 206 192 192 192 88 88 88 4 4 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 -+2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 98 98 98 -+196 196 196 249 249 249 255 255 255 125 125 125 241 239 239 255 255 255 -+255 255 255 229 229 229 134 134 134 18 17 17 0 0 0 0 0 0 -+0 0 0 104 104 104 238 238 238 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 227 227 227 199 199 199 197 197 197 199 199 199 199 199 199 -+199 199 199 198 198 198 198 198 198 203 203 203 201 201 201 117 117 117 -+112 106 107 212 212 212 161 161 161 30 31 31 0 0 0 0 0 0 -+0 0 0 30 31 31 112 106 107 174 174 174 211 211 211 223 223 223 -+217 217 217 187 187 187 127 127 127 49 49 49 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 49 47 48 210 210 210 255 255 255 -+255 255 255 255 255 255 188 188 188 0 0 0 147 147 147 255 255 255 -+255 255 255 255 255 255 255 255 255 221 221 221 75 75 75 0 0 0 -+0 0 0 0 0 0 39 39 39 191 191 191 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 241 241 241 -+208 208 208 195 195 195 198 198 198 199 199 199 199 199 199 198 198 198 -+198 198 198 199 199 199 208 208 208 194 194 194 67 68 68 0 0 0 -+61 61 61 147 147 147 12 12 12 0 0 0 0 0 0 0 0 0 -+0 0 0 86 86 86 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 253 253 253 183 183 183 61 61 61 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 4 4 4 163 163 163 247 247 247 255 255 255 -+255 255 255 255 255 255 98 98 98 0 0 0 88 88 88 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 152 152 152 -+16 16 16 0 0 0 0 0 0 5 5 5 141 140 140 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 249 249 249 222 222 222 198 198 198 -+196 196 196 198 198 198 199 199 199 198 198 198 199 199 199 201 201 201 -+207 207 207 206 206 206 159 159 159 45 45 45 0 0 0 23 23 23 -+112 106 107 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 104 104 104 249 249 249 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 253 -+134 134 134 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 30 31 31 196 196 196 205 205 205 249 248 248 -+255 255 255 225 225 225 12 12 12 0 0 0 30 30 30 246 246 246 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+216 216 216 70 69 69 0 0 0 0 0 0 0 0 0 104 104 104 -+252 252 252 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 252 252 252 230 230 230 203 203 203 195 195 195 198 198 198 -+200 200 200 201 201 201 204 204 204 208 208 208 208 208 208 192 192 192 -+141 140 140 60 60 60 2 2 2 0 0 0 15 15 15 125 125 125 -+19 19 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 61 61 61 206 206 206 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 112 106 107 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 45 45 45 203 203 203 197 197 197 214 214 214 -+255 255 255 117 117 117 0 0 0 0 0 0 0 0 0 209 209 209 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 253 253 253 127 127 127 0 0 0 0 0 0 0 0 0 -+98 98 98 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+241 241 241 215 215 215 205 205 205 207 207 207 209 209 209 209 209 209 -+205 205 205 195 195 195 171 170 170 134 134 134 75 75 75 23 23 23 -+0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 60 60 60 -+0 0 0 0 0 0 98 98 98 192 192 192 34 34 34 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 112 106 107 -+232 231 231 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 222 222 222 8 8 8 0 0 0 0 0 0 -+0 0 0 0 0 0 34 34 34 199 199 199 201 201 201 203 203 203 -+202 202 202 15 15 15 0 0 0 0 0 0 0 0 0 173 172 172 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 164 164 164 6 6 6 0 0 0 -+0 0 0 117 117 117 206 206 206 206 206 206 189 189 189 159 159 159 -+143 143 143 141 140 140 136 136 136 125 125 125 104 104 104 79 79 79 -+54 51 52 25 25 25 2 2 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 77 77 77 143 143 143 0 0 0 -+0 0 0 42 42 42 245 245 245 255 255 255 234 234 234 104 104 104 -+7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+23 23 23 147 147 147 250 250 250 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 45 45 45 0 0 0 0 0 0 -+0 0 0 0 0 0 8 8 8 177 177 177 205 205 205 209 209 209 -+75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 159 159 159 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 143 143 143 -+179 179 179 255 255 255 255 255 255 255 255 255 168 168 168 2 2 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 25 25 25 189 189 189 54 54 54 0 0 0 -+0 0 0 182 182 182 255 255 255 255 255 255 255 255 255 255 255 255 -+211 211 211 98 98 98 8 8 8 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 49 49 49 161 161 161 232 231 231 255 255 255 -+255 255 255 252 252 252 54 51 52 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 117 117 117 225 225 225 141 140 140 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 179 179 179 -+255 255 255 255 255 255 255 255 255 255 255 255 179 179 179 0 0 0 -+93 92 92 255 255 255 255 255 255 255 255 255 255 255 255 127 127 127 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 5 5 5 156 156 156 184 184 184 5 5 5 0 0 0 -+45 45 45 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 211 211 211 88 88 88 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 18 17 17 93 92 92 -+211 211 211 215 215 215 36 37 36 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 30 31 31 138 137 137 16 16 16 -+0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 227 227 227 -+255 255 255 255 255 255 255 255 255 253 253 253 49 47 48 0 0 0 -+104 104 104 255 255 255 255 255 255 255 255 255 255 255 255 251 251 251 -+49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+6 6 6 136 136 136 217 217 217 127 127 127 0 0 0 0 0 0 -+127 127 127 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 197 197 197 75 75 75 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+12 12 12 147 147 147 23 23 23 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 134 134 134 255 255 255 -+255 255 255 255 255 255 255 255 255 187 187 187 0 0 0 0 0 0 -+134 134 134 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+181 181 181 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 5 5 5 23 23 23 54 54 54 -+156 156 156 208 208 208 209 209 209 86 86 86 0 0 0 0 0 0 -+75 75 75 252 252 252 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+188 188 188 75 75 75 8 8 8 0 0 0 0 0 0 0 0 0 -+25 25 25 98 98 98 6 6 6 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 33 33 33 136 136 136 234 234 234 255 255 255 -+255 255 255 255 255 255 252 252 252 57 57 57 0 0 0 0 0 0 -+147 147 147 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+253 253 253 54 51 52 0 0 0 0 0 0 2 2 2 4 4 4 -+12 13 12 22 22 22 33 33 33 45 45 45 60 60 60 82 82 82 -+98 98 98 117 117 117 147 147 147 173 172 172 191 191 191 203 203 203 -+205 205 205 199 199 199 205 205 205 57 57 57 0 0 0 0 0 0 -+0 0 0 61 61 61 156 156 156 217 217 217 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 196 196 196 125 125 125 112 106 107 138 137 137 -+199 199 199 112 106 107 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 61 61 61 196 196 196 209 209 209 197 197 197 230 230 230 -+255 255 255 255 255 255 125 125 125 0 0 0 0 0 0 0 0 0 -+161 161 161 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 156 156 156 0 0 0 0 0 0 70 69 69 179 179 179 -+182 182 182 191 191 191 197 197 197 202 202 202 206 206 206 208 208 208 -+209 209 209 208 208 208 206 206 206 204 204 204 201 201 201 199 199 199 -+198 198 198 199 199 199 200 200 200 39 39 39 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 6 6 6 57 57 57 136 136 136 -+217 217 217 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+244 244 244 215 215 215 202 202 202 206 206 206 207 207 207 207 207 207 -+203 203 203 39 39 39 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 82 82 82 205 205 205 208 208 208 198 198 198 202 202 202 -+244 244 244 152 152 152 0 0 0 0 0 0 0 0 0 0 0 0 -+192 192 192 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 227 227 227 12 12 12 0 0 0 49 47 48 208 208 208 -+203 203 203 201 201 201 200 200 200 200 200 200 199 199 199 199 199 199 -+198 198 198 199 199 199 199 199 199 199 199 199 198 198 198 199 199 199 -+202 202 202 207 207 207 208 208 208 36 37 36 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+8 8 8 77 77 77 210 210 210 255 255 255 246 246 246 219 219 219 -+197 197 197 194 194 194 197 197 197 198 198 198 197 197 197 205 205 205 -+156 156 156 1 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 45 45 45 166 165 165 212 212 212 192 192 192 -+88 88 88 0 0 0 0 0 0 0 0 0 0 0 0 21 21 21 -+241 241 241 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 253 253 253 42 42 42 0 0 0 19 19 19 196 196 196 -+211 211 211 204 204 204 201 201 201 199 199 199 199 199 199 198 198 198 -+199 199 199 200 200 200 202 202 202 205 205 205 209 209 209 207 207 207 -+191 191 191 159 159 159 112 106 107 12 13 12 0 0 0 19 19 19 -+86 86 86 19 19 19 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 16 16 16 150 150 150 207 207 207 205 205 205 -+202 202 202 197 197 197 197 197 197 197 197 197 198 198 198 208 208 208 -+67 68 68 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 5 5 5 67 68 68 30 27 28 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 112 106 107 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 54 54 54 0 0 0 1 1 1 60 60 60 -+127 127 127 174 174 174 196 196 196 205 205 205 207 207 207 208 208 208 -+207 207 207 203 203 203 191 191 191 161 161 161 117 117 117 61 61 61 -+22 22 22 0 0 0 0 0 0 0 0 0 0 0 0 18 17 17 -+249 248 248 238 237 237 173 172 172 88 88 88 16 16 16 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 57 57 57 127 127 127 -+168 168 168 199 199 199 198 198 198 197 197 197 209 209 209 136 136 136 -+1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 38 38 38 238 237 237 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 249 249 249 30 31 31 0 0 0 0 0 0 0 0 0 -+0 0 0 6 6 6 30 30 30 57 57 57 70 69 69 77 77 77 -+70 69 69 49 49 49 22 22 22 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -+181 181 181 227 227 227 221 221 221 214 214 214 183 183 183 112 106 107 -+36 37 36 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 -+49 47 48 199 199 199 198 198 198 208 208 208 161 161 161 12 13 12 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 33 33 33 189 189 189 251 251 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 183 183 183 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+57 57 57 198 198 198 202 202 202 196 196 196 202 202 202 208 208 208 -+197 197 197 175 175 175 159 159 159 156 156 156 152 152 152 147 147 147 -+176 176 176 200 200 200 209 209 209 161 161 161 19 19 19 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 18 17 17 82 82 82 156 156 156 -+225 225 225 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+234 234 234 39 39 39 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 60 60 60 185 185 185 208 208 208 199 199 199 197 197 197 -+199 199 199 202 202 202 204 204 204 205 205 205 205 205 205 205 205 205 -+205 205 205 208 208 208 141 140 140 15 15 15 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+42 42 42 104 104 104 184 184 184 232 231 231 247 247 247 216 216 216 -+57 57 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 25 25 25 134 134 134 202 202 202 207 207 207 -+201 201 201 198 198 198 198 198 198 200 200 200 203 203 203 209 209 209 -+188 188 188 93 92 92 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 15 15 15 30 30 30 10 9 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 49 49 49 134 134 134 -+187 187 187 201 201 201 202 202 202 194 194 194 168 168 168 104 104 104 -+23 23 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+16 16 16 42 42 42 45 45 45 28 26 26 2 2 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -diff --git a/drivers/video/logo/logo_fbsd_clut224.ppm b/drivers/video/logo/logo_fbsd_clut224.ppm -new file mode 100644 -index 000000000000..4387aa0456f4 ---- /dev/null -+++ b/drivers/video/logo/logo_fbsd_clut224.ppm -@@ -0,0 +1,2403 @@ -+P3 -+120 120 -+255 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -+1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 -+1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 -+1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 -+1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 -+1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 38 6 5 -+38 6 5 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 -+44 12 10 44 12 10 44 12 10 44 12 10 38 6 5 38 6 5 -+38 6 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 3 2 -+39 3 2 39 3 2 39 3 2 39 3 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 38 6 5 -+44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 -+44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 -+44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 -+44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 38 6 5 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 39 3 2 39 3 2 39 3 2 39 3 2 2 2 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 39 3 2 97 5 3 131 20 10 -+153 32 16 176 59 34 176 59 34 174 34 14 166 21 8 124 2 0 -+86 4 2 39 3 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 38 6 5 44 12 10 44 12 10 44 12 10 44 12 10 -+44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 -+44 12 10 177 84 68 183 106 85 183 106 85 183 106 85 183 106 85 -+183 106 85 183 106 85 183 106 85 177 84 68 44 12 10 44 12 10 -+44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 -+44 12 10 44 12 10 44 12 10 38 6 5 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 39 3 2 86 4 2 141 11 5 -+166 21 8 168 26 11 168 26 11 156 16 7 147 19 9 141 11 5 -+97 5 3 39 3 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 39 3 2 124 2 0 147 19 9 176 59 34 -+176 59 34 192 80 59 203 102 83 214 127 110 214 127 110 214 127 110 -+203 99 81 209 61 24 153 32 16 86 4 2 39 3 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 1 1 1 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 38 6 5 44 12 10 -+44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 -+177 84 68 183 106 85 213 149 125 222 184 158 237 212 203 246 228 219 -+253 252 251 253 253 252 253 253 252 254 254 253 254 254 253 255 255 255 -+255 255 255 254 254 253 253 253 252 253 253 252 253 252 251 246 228 219 -+237 212 203 222 184 158 213 149 125 183 106 85 177 84 68 44 12 10 -+44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 -+38 6 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 3 2 86 4 2 153 32 16 209 61 24 213 78 31 203 99 81 -+203 99 81 203 99 81 192 80 59 193 53 28 164 15 5 149 3 1 -+140 1 0 117 1 0 39 3 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 97 5 3 140 1 0 131 20 10 153 32 16 -+174 34 14 176 59 34 191 90 72 214 127 110 236 173 149 236 173 149 -+236 173 149 221 154 132 214 127 110 203 99 81 204 76 38 147 19 9 -+39 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+2 2 2 2 2 2 44 12 10 44 12 10 44 12 10 44 12 10 -+44 12 10 44 12 10 44 12 10 183 106 85 222 184 158 237 212 203 -+249 237 229 253 253 252 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 253 253 253 252 253 253 252 253 253 252 254 254 253 254 254 253 -+253 253 252 253 253 252 253 253 252 253 253 252 253 253 252 253 253 252 -+255 255 255 255 255 255 255 255 255 254 254 253 249 237 229 237 212 203 -+222 184 158 183 106 85 90 10 7 44 12 10 44 12 10 44 12 10 -+44 12 10 44 12 10 44 12 10 38 6 5 2 2 2 2 2 2 -+2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 39 3 2 136 24 13 -+204 76 38 214 127 110 221 143 118 221 143 118 221 143 118 221 154 132 -+221 143 118 214 127 110 192 80 59 168 26 11 153 0 0 142 1 0 -+131 0 0 140 1 0 86 4 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 2 2 2 147 0 0 141 0 0 131 0 0 147 19 9 -+153 32 16 174 34 14 184 62 32 203 102 83 221 154 132 236 194 173 -+241 196 185 241 196 185 236 173 149 239 175 143 231 168 130 221 143 118 -+203 99 81 153 32 16 44 12 10 1 1 1 0 0 0 1 1 1 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 -+44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 90 10 7 -+183 106 85 222 184 158 249 237 229 253 253 252 255 255 255 255 255 255 -+255 255 255 254 254 253 253 253 252 253 253 252 253 253 252 254 254 253 -+254 254 253 254 254 253 254 254 253 254 254 253 254 255 253 255 255 255 -+254 254 253 254 254 253 255 255 255 255 255 255 255 255 255 254 254 253 -+254 254 253 253 253 252 253 253 252 253 253 252 255 255 255 255 255 255 -+255 255 255 253 253 252 251 245 237 222 184 158 183 106 85 177 84 68 -+44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 38 6 5 -+2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 -+0 0 0 1 1 1 86 4 2 176 59 34 203 102 83 239 175 143 -+236 173 149 236 173 149 237 187 164 237 187 164 236 194 173 237 187 164 -+236 173 149 206 120 99 193 53 28 168 14 5 153 2 0 140 1 0 -+131 0 0 140 1 0 131 0 0 2 2 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 39 3 2 157 0 0 145 0 0 124 2 0 140 1 0 -+156 16 7 168 26 11 186 41 14 192 80 59 206 120 99 233 177 153 -+245 214 205 249 237 229 245 214 205 241 196 185 237 187 164 239 175 143 -+239 175 143 231 168 130 214 127 110 176 59 34 86 4 2 0 0 0 -+2 2 2 2 2 2 2 2 2 2 2 2 44 12 10 44 12 10 -+44 12 10 44 12 10 44 12 10 177 84 68 222 184 158 243 220 211 -+255 255 255 255 255 255 254 254 253 253 253 252 253 253 252 253 253 252 -+254 254 253 254 254 253 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 253 255 254 253 253 252 -+253 252 251 253 252 251 253 253 252 255 255 255 255 255 255 243 220 211 -+222 184 158 183 106 85 44 12 10 44 12 10 44 12 10 44 12 10 -+44 12 10 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 -+86 4 2 184 62 32 221 143 118 237 187 164 243 208 194 241 196 185 -+241 196 185 241 205 194 243 210 197 245 214 205 243 210 197 237 187 164 -+221 143 118 192 80 59 174 34 14 164 15 5 149 3 1 140 1 0 -+124 2 0 142 0 0 150 0 0 39 3 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 39 3 2 166 0 0 150 0 0 131 0 0 131 0 0 -+149 3 1 156 16 7 174 34 14 185 36 13 204 76 38 214 127 110 -+237 187 164 251 245 237 254 254 253 250 233 221 243 208 194 241 196 185 -+237 187 164 236 173 149 239 175 143 239 175 143 214 127 110 176 59 34 -+90 10 7 2 2 2 2 2 2 44 12 10 44 12 10 44 12 10 -+44 12 10 183 106 85 222 184 158 251 245 237 255 255 255 255 255 255 -+253 253 252 253 253 252 254 254 253 254 254 253 254 254 253 254 254 253 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 253 252 251 251 245 237 249 237 229 249 237 229 -+249 237 229 249 237 229 252 243 235 251 245 237 253 249 244 253 252 250 -+253 253 252 253 255 254 254 254 253 253 253 252 253 252 251 254 254 253 -+254 254 253 251 245 237 238 198 189 183 106 85 44 12 10 44 12 10 -+44 12 10 44 12 10 2 2 2 2 2 2 90 10 7 192 80 59 -+231 168 130 245 214 205 248 226 214 245 214 205 245 214 205 245 214 205 -+248 226 214 250 233 221 252 242 234 249 237 229 241 205 194 221 154 132 -+203 99 81 193 53 28 174 34 14 156 16 7 146 0 0 131 0 0 -+124 2 0 150 0 0 157 0 0 39 3 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 39 3 2 167 0 0 159 0 0 131 0 0 131 0 0 -+141 0 0 153 2 0 168 14 5 179 30 10 196 46 20 204 76 38 -+206 120 99 237 187 164 251 240 231 255 255 255 252 243 235 245 214 205 -+241 196 185 241 196 185 241 196 185 241 190 156 241 190 156 241 190 156 -+221 143 118 176 59 34 44 12 10 44 12 10 44 12 10 177 84 68 -+222 184 158 253 252 250 255 255 255 254 254 253 253 253 252 253 253 252 -+254 254 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 253 249 237 229 243 220 211 243 220 211 243 220 211 -+243 220 211 243 220 211 243 220 211 243 220 211 248 226 214 246 228 219 -+250 233 221 249 237 229 253 249 244 253 252 251 253 255 254 253 255 254 -+253 253 252 253 253 252 254 254 253 253 249 244 222 184 158 183 106 85 -+44 12 10 44 12 10 90 10 7 184 62 32 231 168 130 248 226 214 -+252 240 230 249 231 218 248 226 214 248 226 214 250 233 221 250 233 221 -+252 243 235 253 253 252 253 252 251 245 214 205 236 173 149 203 99 81 -+193 53 28 193 53 28 174 34 14 157 8 2 142 0 0 131 0 0 -+131 0 0 157 0 0 163 0 0 39 3 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 2 2 2 170 0 0 167 0 0 140 1 0 124 2 0 -+140 1 0 147 0 0 159 3 1 173 17 6 193 28 10 196 46 20 -+209 61 24 203 99 81 221 154 132 245 214 205 251 240 231 246 228 219 -+245 214 205 242 201 184 242 201 184 243 208 194 242 201 184 242 201 184 -+242 201 184 242 201 184 227 164 124 183 106 85 222 184 158 251 245 237 -+255 255 255 254 254 253 253 253 252 253 253 252 254 254 253 254 254 253 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 255 253 255 255 255 255 255 255 255 255 255 254 254 253 254 254 253 -+254 254 253 254 254 253 254 254 253 254 254 253 254 254 253 255 255 255 -+255 255 255 254 254 253 249 237 229 243 220 211 243 220 211 243 220 211 -+243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 -+243 220 211 243 220 211 243 220 211 248 226 214 250 233 221 252 242 234 -+253 249 244 253 252 251 253 253 252 253 253 252 255 255 255 253 252 250 -+213 149 125 177 84 68 227 164 124 248 226 214 253 249 240 252 240 230 -+251 236 222 251 238 227 251 238 227 252 240 230 252 242 234 254 252 249 -+255 255 255 251 245 237 243 210 197 221 154 132 203 102 83 204 76 38 -+193 53 28 193 53 28 164 15 5 150 0 0 140 1 0 124 2 0 -+140 1 0 165 0 0 150 0 0 39 3 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 158 0 0 176 0 0 146 0 0 124 2 0 -+131 0 0 145 0 0 155 2 1 172 5 1 180 20 5 193 28 10 -+196 46 20 209 61 24 204 76 38 214 127 110 236 173 149 241 196 185 -+243 208 194 243 210 197 243 208 194 243 208 194 245 214 205 245 214 205 -+242 201 184 243 208 194 249 231 218 252 242 234 255 255 255 255 255 255 -+253 253 252 253 253 252 254 254 253 254 255 253 254 255 253 255 255 255 -+254 255 253 254 255 253 254 255 253 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 253 254 254 253 253 253 252 -+254 254 253 254 254 253 254 254 253 254 253 250 254 254 253 255 255 255 -+255 255 255 255 255 255 253 252 251 249 237 229 243 220 211 243 220 211 -+243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 -+243 220 211 248 226 214 248 226 214 248 226 214 248 226 214 243 220 211 -+246 228 219 249 237 229 252 243 235 253 252 251 253 249 240 241 190 156 -+231 168 130 243 210 197 253 251 245 253 249 244 252 240 230 252 240 230 -+252 243 235 252 242 234 252 242 234 251 245 237 254 252 249 253 249 244 -+250 233 221 241 196 185 221 154 132 203 102 83 192 80 59 192 80 59 -+193 53 28 168 26 11 157 0 0 146 0 0 131 0 0 124 2 0 -+145 0 0 177 0 0 140 1 0 2 2 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 117 1 0 186 0 0 155 0 0 131 0 0 -+131 0 0 141 0 0 153 2 0 163 1 0 176 6 2 191 24 6 -+193 28 10 205 44 13 209 61 24 213 78 31 203 99 81 221 143 118 -+239 175 143 237 187 164 242 201 184 243 208 194 243 210 197 247 223 207 -+249 231 218 249 237 229 253 252 250 253 255 254 253 253 252 253 253 252 -+254 254 253 254 254 253 254 255 253 254 255 253 254 255 253 254 255 253 -+254 255 253 254 255 253 254 255 253 254 255 253 254 255 253 254 255 253 -+254 255 253 254 254 253 254 254 253 254 253 250 254 253 250 254 254 253 -+254 253 250 254 253 250 253 253 252 253 253 252 254 254 253 253 253 252 -+253 253 252 253 253 252 254 254 253 253 253 252 252 243 235 243 220 211 -+243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 -+243 220 211 238 198 189 206 120 99 176 59 34 176 59 34 176 59 34 -+191 90 72 214 127 110 237 187 164 236 194 173 227 164 124 242 201 184 -+253 248 237 253 252 251 253 249 240 251 245 237 253 249 240 253 249 240 -+251 245 237 252 243 235 251 245 237 252 243 235 250 233 221 245 214 205 -+237 187 164 221 154 132 214 127 110 203 99 81 192 80 59 192 80 59 -+179 30 10 163 1 0 153 2 0 142 1 0 131 0 0 131 0 0 -+153 0 0 191 24 6 111 7 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 86 4 2 196 0 0 163 0 0 140 1 0 -+124 2 0 140 1 0 149 3 1 159 3 1 172 5 1 179 7 2 -+191 24 6 210 31 6 213 49 12 209 61 24 213 78 31 213 78 31 -+203 102 83 221 143 118 231 168 130 237 187 164 243 210 197 246 228 219 -+251 245 237 253 252 251 253 253 252 253 253 252 254 254 253 254 254 253 -+254 254 253 255 255 255 255 255 255 254 255 253 254 254 251 254 254 251 -+254 255 253 254 255 253 254 255 253 254 254 251 254 254 251 254 255 253 -+254 254 253 254 253 250 254 252 249 254 253 250 254 253 250 254 253 250 -+254 253 250 253 252 251 253 253 252 253 253 252 253 253 252 253 253 252 -+253 253 252 253 253 252 253 253 252 254 254 253 254 254 253 253 249 244 -+246 228 219 243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 -+241 205 194 192 80 59 169 0 0 172 5 1 168 14 5 173 17 6 -+173 17 6 173 17 6 204 67 22 231 168 130 251 238 227 255 255 255 -+254 252 249 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 -+253 249 240 251 245 237 252 240 230 248 226 214 241 205 194 236 173 149 -+221 154 132 214 127 110 206 120 99 203 99 81 192 80 59 185 36 13 -+172 5 1 159 3 1 149 3 1 140 1 0 124 2 0 140 1 0 -+168 14 5 185 36 13 86 4 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 39 3 2 184 9 3 174 0 0 147 0 0 -+131 0 0 131 0 0 145 0 0 155 2 1 167 2 1 176 6 2 -+184 9 3 195 25 6 210 31 6 213 49 12 209 61 24 213 78 31 -+203 99 81 203 102 83 214 127 110 231 168 130 245 214 205 253 249 244 -+253 253 252 253 253 252 253 253 252 254 254 253 254 254 253 254 254 253 -+254 254 253 254 254 253 254 254 253 254 254 251 254 254 251 254 255 253 -+254 255 253 254 255 253 254 255 253 254 254 251 254 254 251 254 253 250 -+254 252 249 254 252 249 254 252 249 254 252 249 254 252 249 254 252 249 -+253 252 251 253 252 251 253 253 252 253 253 252 253 253 252 253 253 252 -+253 253 252 253 253 252 253 253 252 253 253 252 253 253 252 254 254 253 -+253 249 244 246 228 219 243 220 211 243 220 211 243 220 211 243 220 211 -+213 149 125 165 0 0 167 2 1 168 14 5 168 14 5 168 14 5 -+180 23 7 203 99 81 243 208 194 254 254 253 254 254 253 253 251 245 -+253 251 245 254 252 249 254 252 249 253 249 244 253 249 244 253 249 244 -+251 245 237 250 233 221 245 214 205 241 196 185 237 187 164 236 173 149 -+221 143 118 214 127 110 203 102 83 203 99 81 196 46 20 176 6 2 -+167 2 1 159 3 1 145 0 0 131 0 0 124 2 0 149 3 1 -+193 53 28 174 34 14 2 2 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 147 19 9 191 24 6 157 0 0 -+131 0 0 124 2 0 140 1 0 149 3 1 159 3 1 172 5 1 -+184 9 3 184 9 3 210 31 6 210 31 6 209 61 24 213 78 31 -+213 78 31 203 99 81 221 143 118 243 208 194 253 252 250 253 253 252 -+253 253 252 254 254 253 254 254 253 253 253 252 254 254 253 253 253 252 -+253 252 251 253 252 250 254 252 249 254 253 250 254 254 251 254 254 253 -+254 254 251 254 255 253 254 255 253 254 253 250 254 252 249 253 251 245 -+253 251 245 254 252 249 254 252 249 253 251 245 253 251 245 254 252 249 -+254 252 249 254 252 249 254 252 249 254 252 249 254 252 249 254 252 249 -+254 252 249 254 252 249 254 252 249 253 252 250 253 252 250 253 252 250 -+253 252 251 253 252 250 249 237 229 243 220 211 237 212 203 243 220 211 -+191 90 72 163 0 0 167 2 1 168 14 5 168 14 5 185 36 13 -+227 164 124 253 248 237 255 255 255 254 254 253 254 252 249 254 252 249 -+254 253 250 254 253 250 254 252 249 253 249 244 253 249 244 252 243 235 -+249 231 218 245 214 205 241 196 185 237 187 164 236 173 149 239 175 143 -+221 143 118 214 127 110 203 99 81 196 46 20 183 2 0 172 5 1 -+163 1 0 153 2 0 140 1 0 131 0 0 131 0 0 168 26 11 -+192 80 59 147 19 9 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 90 10 7 193 53 28 167 2 1 -+141 0 0 124 2 0 131 0 0 146 0 0 159 3 1 167 2 1 -+179 7 2 184 9 3 195 25 6 210 31 6 213 49 12 213 78 31 -+213 78 31 214 127 110 245 214 205 253 255 254 253 253 252 253 253 252 -+253 253 252 253 253 252 253 252 251 253 253 252 254 253 250 254 252 249 -+253 251 245 254 252 249 254 252 249 254 253 250 254 253 250 254 253 250 -+254 254 253 254 254 251 254 254 251 253 251 245 253 250 244 253 250 244 -+253 250 244 253 250 244 253 251 245 253 250 244 253 249 244 253 249 244 -+254 252 249 254 252 249 254 252 249 254 252 249 253 252 250 254 252 249 -+254 252 249 254 252 249 254 252 249 253 252 250 253 252 250 253 252 250 -+253 252 250 254 252 249 253 252 250 249 237 229 243 220 211 243 220 211 -+192 80 59 164 0 0 167 2 1 167 2 1 189 46 14 234 180 140 -+254 254 251 254 254 253 254 253 250 254 253 250 254 253 250 254 254 253 -+253 253 252 254 252 249 254 252 249 253 249 244 252 243 235 249 231 218 -+245 214 205 243 208 194 241 196 185 237 187 164 236 173 149 221 154 132 -+221 143 118 203 102 83 196 46 20 189 0 0 179 7 2 167 2 1 -+159 3 1 147 0 0 140 1 0 124 2 0 141 11 5 176 59 34 -+204 76 38 86 4 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 39 3 2 193 53 28 185 36 13 -+150 0 0 131 0 0 131 0 0 142 1 0 149 3 1 167 2 1 -+174 10 3 184 9 3 195 25 6 210 31 6 213 49 12 209 61 24 -+206 120 99 243 220 211 253 255 254 253 253 252 253 253 252 254 254 253 -+253 252 251 253 252 251 253 252 251 254 252 249 253 249 244 253 249 244 -+253 249 244 253 251 245 254 252 249 254 252 249 254 252 249 254 253 250 -+254 253 250 254 253 250 254 252 249 253 249 240 253 249 240 253 249 244 -+253 249 240 253 249 240 253 249 240 253 249 244 253 249 244 253 249 244 -+253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 -+253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 -+253 249 244 253 249 244 253 249 244 253 249 244 252 243 235 246 228 219 -+191 90 72 163 1 0 168 14 5 174 10 3 206 120 99 255 255 255 -+254 254 253 253 253 252 254 254 253 254 254 253 254 254 253 254 254 253 -+253 253 252 254 252 249 254 252 249 251 245 237 250 233 221 248 226 214 -+245 214 205 243 208 194 241 196 185 236 173 149 236 173 149 221 154 132 -+206 120 99 203 40 12 196 0 0 184 9 3 176 6 2 163 1 0 -+153 2 0 142 1 0 131 0 0 131 0 0 153 32 16 191 90 72 -+176 59 34 39 3 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 153 32 16 192 80 59 -+159 13 5 140 1 0 124 2 0 140 1 0 149 3 1 157 8 2 -+174 10 3 180 20 5 193 28 10 203 40 12 205 44 13 203 99 81 -+243 220 211 253 255 254 253 253 252 253 253 252 253 253 252 253 252 251 -+253 252 251 253 252 251 253 249 244 253 249 244 253 249 244 253 249 244 -+253 249 244 253 249 244 253 251 245 254 252 249 253 251 245 254 252 249 -+254 252 249 253 251 245 253 249 244 253 248 237 253 248 237 253 248 237 -+253 248 237 253 248 237 253 248 237 253 249 240 253 249 244 253 249 244 -+253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 -+253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 -+253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 -+214 127 110 159 3 1 159 13 5 187 29 9 234 180 140 255 255 255 -+254 253 250 254 254 253 254 254 253 255 255 255 254 254 253 254 254 253 -+253 253 252 254 252 249 253 249 244 251 238 227 249 231 218 247 223 207 -+245 214 205 241 196 185 237 187 164 236 173 149 236 173 149 203 102 83 -+210 31 6 196 0 0 192 0 0 179 7 2 172 5 1 159 3 1 -+149 3 1 140 1 0 124 2 0 142 30 13 192 80 59 203 102 83 -+111 7 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 203 99 81 -+193 53 28 150 0 0 131 0 0 131 0 0 142 1 0 157 8 2 -+168 14 5 180 23 7 193 28 10 196 46 20 203 99 81 237 212 203 -+253 255 254 253 253 252 253 253 252 253 253 252 253 252 250 253 253 252 -+253 252 250 253 249 244 251 245 237 251 245 237 253 249 244 253 249 244 -+253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 251 245 -+253 249 244 253 249 244 251 245 237 252 244 235 252 244 235 252 246 236 -+252 246 236 252 244 235 252 244 235 251 245 237 251 245 237 253 249 244 -+253 249 244 251 245 237 253 249 244 253 249 244 253 249 244 251 245 237 -+253 249 244 251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 -+251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 253 252 250 -+238 198 189 176 59 34 176 59 34 196 60 25 241 190 156 255 255 255 -+254 254 253 255 255 255 254 255 253 255 255 255 254 254 253 254 254 253 -+254 253 250 253 249 244 252 242 234 250 233 221 248 226 214 245 214 205 -+243 208 194 241 196 185 237 187 164 236 173 149 203 99 81 210 31 6 -+196 0 0 196 0 0 184 9 3 176 6 2 163 1 0 153 2 0 -+142 1 0 131 0 0 131 20 10 176 59 34 198 112 92 192 80 59 -+39 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 176 59 34 -+203 99 81 166 21 8 140 1 0 131 0 0 140 1 0 144 9 4 -+166 21 8 174 34 14 185 36 13 192 80 59 238 198 189 253 252 251 -+253 252 250 253 253 252 253 253 252 254 253 250 253 252 251 254 252 249 -+251 245 237 252 243 235 251 245 237 251 245 237 253 249 244 253 249 244 -+253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 -+251 245 237 252 243 235 252 243 235 252 240 230 252 240 230 252 240 230 -+252 240 230 252 240 230 252 240 230 252 243 235 252 243 235 252 243 235 -+251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 -+251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 -+251 245 237 251 245 237 252 243 235 252 243 235 252 243 235 251 245 237 -+246 228 219 210 136 114 214 127 110 206 120 99 237 182 145 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 253 254 254 253 -+253 249 244 252 243 235 252 240 230 250 233 221 248 226 214 245 214 205 -+243 208 194 241 196 185 236 173 149 213 78 31 210 31 6 196 0 0 -+196 0 0 192 0 0 179 7 2 172 5 1 159 3 1 150 0 0 -+140 1 0 131 0 0 153 32 16 188 95 83 214 127 110 153 32 16 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 90 10 7 -+203 102 83 184 62 32 149 3 1 131 0 0 141 11 5 147 19 9 -+166 21 8 174 34 14 176 59 34 236 194 173 253 249 244 253 249 244 -+253 253 252 254 253 250 254 253 250 253 253 252 254 252 249 252 243 235 -+252 242 234 252 243 235 251 245 237 251 245 237 253 249 244 253 249 244 -+253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 252 243 235 -+252 242 234 252 242 234 251 240 231 251 238 227 251 238 227 251 238 227 -+251 238 227 251 238 227 251 238 227 252 242 234 252 242 234 252 242 234 -+252 242 234 252 242 234 252 242 234 252 242 234 252 242 234 252 242 234 -+252 242 234 252 242 234 252 242 234 251 240 231 251 240 231 250 239 228 -+250 239 228 251 238 227 251 238 227 251 238 227 251 238 227 251 238 227 -+250 239 228 237 187 164 210 136 114 221 143 118 227 164 124 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 253 254 252 249 -+253 249 240 252 242 234 251 238 227 249 231 218 247 223 207 245 214 205 -+241 196 185 221 154 132 213 78 31 210 31 6 196 0 0 196 0 0 -+196 0 0 184 9 3 172 5 1 163 1 0 153 2 0 142 1 0 -+131 0 0 136 24 13 177 84 68 214 127 110 203 99 81 86 4 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 -+177 84 68 203 102 83 174 34 14 140 1 0 141 11 5 147 19 9 -+153 32 16 174 34 14 221 154 132 253 249 244 251 245 237 253 252 251 -+254 254 253 254 253 250 254 254 253 253 249 244 252 242 234 251 240 231 -+252 243 235 251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 -+252 246 236 253 249 244 251 245 237 251 245 237 252 243 235 252 242 234 -+252 242 234 249 237 229 251 238 227 251 236 222 251 236 222 251 236 222 -+251 236 222 251 236 222 251 238 227 249 237 229 249 237 229 249 237 229 -+249 237 229 249 237 229 249 237 229 249 237 229 249 237 229 249 237 229 -+249 237 229 251 238 227 251 236 222 251 236 222 251 236 222 251 236 222 -+251 236 222 251 236 222 251 236 222 251 236 222 251 236 222 251 236 222 -+251 238 227 243 220 211 221 154 132 221 154 132 221 143 118 251 238 227 -+255 255 255 255 255 255 255 255 255 254 254 253 254 252 249 253 249 244 -+251 245 237 252 240 230 250 233 221 248 226 214 247 223 207 241 196 185 -+221 143 118 209 61 24 210 31 6 210 31 6 196 0 0 196 0 0 -+184 9 3 179 7 2 167 2 1 159 3 1 149 3 1 131 0 0 -+131 20 10 176 59 34 198 112 92 221 154 132 174 34 14 2 2 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+111 7 4 214 127 110 192 80 59 156 16 7 141 11 5 136 24 13 -+153 32 16 198 112 92 249 237 229 251 242 233 253 249 244 254 254 253 -+254 253 250 254 253 250 253 249 244 251 240 231 251 240 231 252 242 234 -+252 243 235 251 245 237 251 245 237 251 245 237 251 245 237 253 248 237 -+252 246 236 251 245 237 251 245 237 252 243 235 252 242 234 251 240 231 -+249 237 229 249 237 229 250 233 221 250 235 219 250 235 219 250 235 219 -+250 235 219 250 235 219 250 233 221 249 237 229 249 237 229 249 237 229 -+249 237 229 249 237 229 249 237 229 249 237 229 250 233 221 249 231 218 -+250 235 219 250 235 219 250 235 219 250 235 219 250 235 219 250 235 219 -+250 235 219 250 235 219 250 235 219 250 235 219 250 235 219 250 233 221 -+249 237 229 249 237 229 238 198 189 237 187 164 231 168 130 241 190 156 -+255 255 255 255 255 255 255 255 255 254 252 249 253 249 244 253 249 244 -+252 243 235 252 240 230 250 233 221 243 208 194 236 173 149 203 99 81 -+213 49 12 210 31 6 210 31 6 196 0 0 196 0 0 192 0 0 -+183 2 0 172 5 1 163 1 0 153 2 0 141 0 0 131 0 0 -+153 32 16 188 95 83 213 149 125 206 120 99 86 4 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+39 3 2 203 99 81 214 127 110 176 59 34 147 19 9 136 24 13 -+177 84 68 243 220 211 249 237 229 251 245 237 253 253 252 254 253 250 -+254 253 250 253 251 245 249 237 229 249 237 229 251 240 231 252 242 234 -+252 243 235 251 245 237 251 245 237 251 245 237 253 249 244 253 248 237 -+252 244 235 252 246 236 252 243 235 252 242 234 249 237 229 249 237 229 -+249 237 229 249 237 229 249 231 218 248 226 214 248 226 214 248 226 214 -+248 226 214 248 226 214 250 233 221 250 233 221 250 233 221 250 233 221 -+246 228 219 250 233 221 249 231 218 248 226 214 248 226 214 248 226 214 -+248 226 214 248 226 214 248 226 214 248 226 214 248 226 214 248 226 214 -+248 226 214 248 226 214 248 226 214 246 228 219 246 228 219 246 228 219 -+246 228 219 246 228 219 246 228 219 238 198 189 238 198 189 231 168 130 -+252 240 230 253 249 244 253 249 240 253 251 245 253 249 244 252 242 234 -+248 226 214 242 201 184 239 175 143 214 127 110 213 78 31 209 61 24 -+213 43 8 210 31 6 210 31 6 196 0 0 196 0 0 184 9 3 -+176 6 2 167 2 1 159 3 1 145 0 0 131 0 0 136 24 13 -+177 84 68 202 130 106 236 173 149 176 59 34 2 2 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 131 20 10 221 143 118 203 99 81 153 32 16 153 32 16 -+222 184 158 252 242 234 249 237 229 253 252 250 254 254 253 254 253 250 -+254 252 249 249 237 229 250 233 221 249 237 229 251 240 231 252 242 234 -+252 243 235 251 245 237 253 249 244 253 249 244 253 249 240 253 248 237 -+252 246 236 252 244 235 252 242 234 251 240 231 249 237 229 249 237 229 -+249 237 229 246 228 219 246 228 219 248 226 214 247 223 207 247 223 207 -+247 223 207 247 223 207 246 228 219 246 228 219 246 228 219 246 228 219 -+248 226 214 247 223 207 247 223 207 247 223 207 247 223 207 247 223 207 -+247 223 207 247 223 207 247 223 207 247 223 207 247 223 207 247 223 207 -+247 223 207 248 226 214 246 228 219 246 228 219 246 228 219 246 228 219 -+246 228 219 246 228 219 246 228 219 237 212 203 222 184 158 206 120 99 -+239 175 143 248 226 214 243 208 194 242 201 184 237 187 164 236 173 149 -+231 168 130 221 143 118 203 102 83 213 78 31 213 78 31 213 49 12 -+210 31 6 210 31 6 196 0 0 196 0 0 184 9 3 179 7 2 -+172 5 1 163 1 0 150 0 0 140 1 0 131 20 10 176 59 34 -+198 112 92 218 160 133 214 127 110 97 5 3 1 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 1 1 2 2 2 198 112 92 221 143 118 192 80 59 213 149 125 -+251 242 233 246 228 219 251 245 237 254 254 253 253 253 252 253 253 252 -+251 240 231 249 231 218 251 236 222 252 240 230 252 242 234 252 243 235 -+251 245 237 253 249 244 253 249 244 253 249 244 253 249 240 253 248 237 -+252 246 236 251 242 233 251 240 231 249 237 229 249 237 229 250 233 221 -+246 228 219 246 228 219 248 226 214 248 226 214 247 223 207 247 223 207 -+247 223 207 247 223 207 248 226 214 248 226 214 247 223 207 247 223 207 -+247 223 207 247 223 207 247 223 207 247 223 207 247 223 207 247 223 207 -+247 223 207 247 223 207 247 223 207 247 223 207 243 210 197 247 223 207 -+243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 -+243 220 211 243 220 211 243 220 211 237 212 203 188 95 83 174 34 14 -+213 78 31 242 201 184 242 201 184 241 190 156 239 175 143 231 168 130 -+221 143 118 214 127 110 203 99 81 213 78 31 213 49 12 210 31 6 -+210 31 6 196 0 0 196 0 0 192 0 0 183 2 0 172 5 1 -+167 2 1 153 2 0 141 0 0 141 11 5 153 32 16 188 95 83 -+213 149 125 237 187 164 176 59 34 2 2 2 2 2 2 1 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -+2 2 2 2 2 2 136 24 13 221 154 132 213 149 125 246 228 219 -+246 228 219 246 228 219 253 252 250 254 254 253 254 254 253 252 243 235 -+248 226 214 250 233 221 251 238 227 251 240 231 252 242 234 252 243 235 -+251 245 237 253 249 244 254 252 249 254 252 249 253 250 244 253 249 240 -+252 246 236 252 240 230 251 240 231 249 237 229 249 237 229 246 228 219 -+246 228 219 248 226 214 243 220 211 243 220 211 245 214 205 243 210 197 -+243 210 197 244 218 207 243 220 211 245 214 205 243 210 197 243 208 194 -+243 210 197 243 208 194 243 208 194 243 208 194 243 208 194 243 208 194 -+243 208 194 243 208 194 243 208 194 243 208 194 243 210 197 245 214 205 -+243 220 211 245 214 205 245 214 205 245 214 205 243 216 205 243 216 205 -+243 216 205 243 220 211 243 216 205 243 220 211 222 184 158 177 84 68 -+193 53 28 206 120 99 237 187 164 239 175 143 231 168 130 221 143 118 -+214 127 110 203 99 81 213 78 31 209 61 24 213 43 8 210 31 6 -+196 0 0 196 0 0 196 0 0 184 9 3 179 7 2 167 2 1 -+159 3 1 145 0 0 131 0 0 142 30 13 177 84 68 202 130 106 -+222 184 158 214 127 110 86 4 2 2 2 2 2 2 2 1 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -+2 2 2 2 2 2 38 6 5 188 95 83 237 212 203 249 237 229 -+243 220 211 252 243 235 254 254 253 254 254 253 253 249 244 248 226 214 -+248 226 214 250 233 221 249 237 229 251 240 231 252 243 235 251 245 237 -+253 249 244 253 252 251 254 254 253 255 255 255 254 254 253 253 250 244 -+252 244 235 251 238 227 249 237 229 249 237 229 246 228 219 246 228 219 -+248 226 214 245 214 205 245 214 205 245 214 205 245 214 205 245 214 205 -+245 214 205 243 210 197 243 208 194 242 201 184 242 201 184 242 201 184 -+242 201 184 242 201 184 242 201 184 242 201 184 242 201 184 242 201 184 -+242 201 184 242 201 184 242 201 184 243 208 194 237 212 203 237 212 203 -+237 212 203 237 212 203 237 212 203 237 212 203 237 212 203 237 212 203 -+237 212 203 237 212 203 237 212 203 237 212 203 237 212 203 213 149 125 -+176 59 34 196 46 20 221 143 118 239 175 143 221 143 118 214 127 110 -+203 102 83 213 78 31 213 78 31 213 49 12 210 31 6 210 31 6 -+196 0 0 196 0 0 184 9 3 179 7 2 172 5 1 159 3 1 -+147 0 0 140 1 0 136 24 13 176 59 34 183 106 85 221 154 132 -+237 187 164 174 34 14 38 6 5 2 2 2 2 2 2 2 2 2 -+1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 -+2 2 2 2 2 2 2 2 2 177 84 68 251 245 237 243 220 211 -+246 228 219 253 253 252 254 254 253 254 252 249 248 226 214 247 223 207 -+249 231 218 250 233 221 249 237 229 251 240 231 252 243 235 253 249 244 -+253 253 252 255 255 255 255 255 255 255 255 255 255 255 255 253 251 245 -+252 244 235 251 236 222 250 233 221 250 233 221 246 228 219 243 220 211 -+245 214 205 245 214 205 245 214 205 245 214 205 245 214 205 243 210 197 -+242 201 184 242 201 184 242 201 184 242 201 184 242 201 184 242 201 184 -+242 201 184 242 201 184 242 201 184 242 201 184 236 194 173 236 194 173 -+236 194 173 236 194 173 241 196 185 238 198 189 238 198 189 238 198 189 -+238 198 189 238 198 189 238 198 189 238 198 189 238 198 189 238 198 189 -+238 198 189 241 205 194 238 198 189 238 198 189 238 198 189 238 198 189 -+198 112 92 176 59 34 209 61 24 221 143 118 221 143 118 214 127 110 -+203 99 81 213 78 31 213 49 12 210 31 6 210 31 6 196 0 0 -+196 0 0 192 0 0 184 9 3 172 5 1 163 1 0 150 0 0 -+141 0 0 141 11 5 153 32 16 188 95 83 213 149 125 241 196 185 -+214 127 110 142 30 13 2 2 2 2 2 2 2 2 2 2 2 2 -+1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 -+2 2 2 2 2 2 44 12 10 222 184 158 249 237 229 237 212 203 -+252 242 234 255 255 255 254 254 253 251 238 227 245 214 205 247 223 207 -+249 231 218 250 233 221 252 240 230 252 242 234 253 249 244 253 252 251 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 253 253 249 244 -+252 240 230 250 235 219 249 231 218 246 228 219 248 226 214 245 214 205 -+245 214 205 241 205 194 241 205 194 241 205 194 242 201 184 242 201 184 -+236 194 173 236 194 173 236 194 173 241 190 156 241 190 156 241 190 156 -+241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 -+241 190 156 241 196 185 241 196 185 241 196 185 241 196 185 241 196 185 -+241 196 185 241 196 185 241 196 185 241 196 185 241 196 185 238 198 189 -+238 198 189 238 198 189 238 198 189 238 198 189 238 198 189 238 198 189 -+222 184 158 183 106 85 176 59 34 213 49 12 203 99 81 203 99 81 -+213 78 31 209 61 24 210 31 6 210 31 6 196 0 0 196 0 0 -+196 0 0 183 2 0 172 5 1 163 1 0 150 0 0 142 0 0 -+131 0 0 142 30 13 177 84 68 202 130 106 222 184 158 233 177 153 -+203 99 81 222 184 158 44 12 10 2 2 2 2 2 2 2 2 2 -+1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 -+2 2 2 2 2 2 183 106 85 253 249 244 243 220 211 243 216 205 -+253 252 250 255 255 255 253 249 244 243 210 197 245 214 205 248 226 214 -+249 231 218 250 233 221 251 238 227 252 243 235 253 251 245 254 254 253 -+255 255 255 255 255 255 255 255 255 255 255 255 253 255 254 253 248 237 -+251 236 222 249 231 218 248 226 214 243 220 211 245 214 205 245 214 205 -+241 205 194 241 196 185 241 196 185 241 196 185 241 190 156 241 190 156 -+241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 -+241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 -+237 187 164 237 187 164 237 187 164 237 187 164 237 187 164 237 187 164 -+237 187 164 237 187 164 237 187 164 237 187 164 237 187 164 236 194 173 -+236 194 173 236 194 173 236 194 173 236 194 173 236 194 173 222 184 158 -+222 184 158 222 184 158 177 84 68 176 59 34 213 49 12 213 78 31 -+213 78 31 213 43 8 210 31 6 196 0 0 196 0 0 192 0 0 -+183 2 0 172 5 1 163 1 0 153 0 0 145 0 0 140 1 0 -+136 24 13 176 59 34 198 112 92 221 154 132 238 198 189 203 99 81 -+222 184 158 237 212 203 183 106 85 2 2 2 2 2 2 2 2 2 -+2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 -+2 2 2 44 12 10 238 198 189 252 242 234 241 205 194 246 228 219 -+254 254 253 254 254 253 247 223 207 243 208 194 245 214 205 247 223 207 -+248 226 214 250 233 221 251 238 227 251 245 237 253 252 251 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 252 249 252 240 230 -+249 231 218 247 223 207 247 223 207 245 214 205 243 210 197 241 205 194 -+241 196 185 241 196 185 237 187 164 241 190 156 241 190 156 241 190 156 -+241 190 156 239 175 143 239 175 143 239 175 143 239 175 143 239 175 143 -+239 175 143 239 175 143 239 175 143 227 164 124 221 143 118 221 143 118 -+214 127 110 214 127 110 206 120 99 203 99 81 203 99 81 203 99 81 -+203 99 81 203 99 81 203 99 81 198 112 92 206 120 99 214 127 110 -+213 149 125 221 154 132 218 160 133 222 184 158 222 184 158 222 184 158 -+222 184 158 222 184 158 218 160 133 177 84 68 176 59 34 210 31 6 -+213 43 8 210 31 6 196 0 0 196 0 0 189 0 0 181 0 0 -+172 0 0 163 1 0 155 0 0 146 0 0 140 1 0 141 11 5 -+153 32 16 188 95 83 213 149 125 238 198 189 221 154 132 198 112 92 -+240 219 206 240 219 206 222 184 158 44 12 10 2 2 2 2 2 2 -+2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 -+2 2 2 177 84 68 251 242 233 243 220 211 241 205 194 251 245 237 -+255 255 255 251 240 231 242 201 184 243 208 194 245 214 205 247 223 207 -+248 226 214 250 233 221 251 238 227 251 245 237 253 253 252 255 255 255 -+255 255 255 255 255 255 255 255 255 254 253 250 252 244 235 250 235 219 -+247 223 207 247 223 207 243 210 197 243 210 197 241 196 185 241 196 185 -+241 196 185 241 190 156 237 182 145 239 175 143 239 175 143 239 175 143 -+239 175 143 239 175 143 239 175 143 239 175 143 239 175 143 221 143 118 -+214 127 110 203 99 81 213 78 31 213 78 31 209 61 24 204 76 38 -+204 76 38 204 76 38 204 76 38 204 76 38 204 76 38 204 76 38 -+193 53 28 193 53 28 193 53 28 184 62 32 192 80 59 184 62 32 -+192 80 59 192 80 59 191 90 72 188 95 83 206 120 99 213 149 125 -+218 160 133 218 160 133 218 160 133 213 149 125 177 84 68 176 59 34 -+195 25 6 196 0 0 196 0 0 189 0 0 183 2 0 174 0 0 -+165 0 0 157 0 0 147 0 0 140 1 0 131 0 0 142 30 13 -+177 84 68 202 130 106 222 184 158 241 196 185 192 80 59 218 160 133 -+237 212 203 240 219 206 237 212 203 177 84 68 2 2 2 2 2 2 -+2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 2 2 2 -+38 6 5 222 184 158 251 245 237 238 198 189 237 212 203 254 254 253 -+253 252 251 243 208 194 236 194 173 243 208 194 243 210 197 247 223 207 -+248 226 214 250 233 221 252 240 230 251 245 237 254 252 249 254 254 253 -+255 255 255 254 254 253 254 252 249 252 246 236 250 235 219 247 223 207 -+247 223 207 243 208 194 242 201 184 241 196 185 241 196 185 237 187 164 -+239 175 143 239 175 143 239 175 143 239 175 143 239 175 143 239 175 143 -+239 175 143 227 164 124 221 143 118 203 102 83 213 78 31 213 49 12 -+213 49 12 213 43 8 213 43 8 213 49 12 209 61 24 209 61 24 -+209 61 24 193 53 28 193 53 28 193 53 28 193 53 28 193 53 28 -+193 53 28 193 53 28 193 53 28 193 53 28 193 53 28 193 53 28 -+176 59 34 176 59 34 176 59 34 176 59 34 176 59 34 177 84 68 -+177 84 68 198 112 92 210 136 114 213 149 125 210 136 114 177 84 68 -+176 59 34 180 23 7 192 0 0 183 2 0 174 0 0 167 2 1 -+158 0 0 150 0 0 141 0 0 131 0 0 136 24 13 177 84 68 -+198 112 92 218 160 133 237 212 203 203 102 83 176 59 34 218 160 133 -+238 198 189 237 212 203 240 219 206 222 184 158 44 12 10 2 2 2 -+2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 0 0 0 -+44 12 10 249 237 229 246 228 219 238 198 189 246 228 219 255 255 255 -+249 237 229 237 187 164 236 194 173 242 201 184 243 210 197 247 223 207 -+248 226 214 250 233 221 252 240 230 252 243 235 253 249 244 254 252 249 -+254 252 249 253 249 244 252 240 230 250 235 219 247 223 207 243 210 197 -+243 208 194 242 201 184 241 196 185 241 196 185 237 187 164 239 175 143 -+231 168 130 231 168 130 231 168 130 231 168 130 231 168 130 221 143 118 -+203 99 81 213 78 31 213 49 12 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 205 44 13 203 40 12 -+203 40 12 203 40 12 202 38 11 202 38 11 193 28 10 193 28 10 -+193 28 10 193 28 10 185 36 13 185 36 13 185 36 13 185 36 13 -+174 34 14 174 34 14 174 34 14 176 59 34 176 59 34 176 59 34 -+176 59 34 176 59 34 176 59 34 177 84 68 183 106 85 202 130 106 -+177 84 68 176 59 34 153 32 16 172 5 1 169 0 0 158 0 0 -+150 0 0 142 0 0 131 0 0 131 20 10 176 59 34 188 95 83 -+213 149 125 238 198 189 221 154 132 174 34 14 177 84 68 202 130 106 -+222 184 158 237 212 203 243 220 211 237 212 203 90 10 7 0 0 0 -+2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 0 0 0 -+202 130 106 253 253 252 241 205 194 238 198 189 251 245 237 254 254 253 -+242 201 184 233 177 153 236 194 173 242 201 184 243 208 194 247 223 207 -+249 231 218 251 238 227 252 240 230 252 242 234 252 244 235 253 248 237 -+252 244 235 251 238 227 250 235 219 247 223 207 243 208 194 242 201 184 -+242 201 184 241 190 156 237 187 164 236 173 149 239 175 143 231 168 130 -+231 168 130 231 168 130 221 143 118 214 127 110 213 78 31 213 49 12 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 195 25 6 195 25 6 195 25 6 193 28 10 -+193 28 10 191 24 6 191 24 6 180 23 7 182 27 9 182 27 9 -+182 27 9 174 34 14 174 34 14 174 34 14 174 34 14 174 34 14 -+174 34 14 176 59 34 176 59 34 176 59 34 176 59 34 177 84 68 -+183 106 85 183 106 85 177 84 68 153 32 16 147 19 9 150 0 0 -+143 0 0 131 0 0 124 2 0 153 32 16 177 84 68 210 136 114 -+237 187 164 221 154 132 196 46 20 177 84 68 177 84 68 183 106 85 -+218 160 133 222 184 158 240 219 206 240 219 206 202 130 106 2 2 2 -+2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 38 6 5 -+237 212 203 252 243 235 238 198 189 241 205 194 253 253 252 249 237 229 -+236 173 149 236 173 149 237 187 164 242 201 184 243 208 194 247 223 207 -+249 231 218 251 238 227 252 240 230 252 240 230 252 240 230 252 240 230 -+251 236 222 250 235 219 247 223 207 243 208 194 242 201 184 241 190 156 -+241 190 156 239 175 143 236 173 149 231 168 130 227 164 124 227 164 124 -+221 143 118 203 102 83 213 78 31 213 49 12 213 43 8 213 43 8 -+213 43 8 213 43 8 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+196 0 0 196 0 0 196 0 0 196 0 0 184 9 3 184 9 3 -+184 9 3 184 9 3 184 9 3 184 9 3 184 9 3 175 12 4 -+173 17 6 173 17 6 173 17 6 166 21 8 168 26 11 168 26 11 -+153 32 16 153 32 16 153 32 16 153 32 16 153 32 16 153 32 16 -+153 32 16 177 84 68 177 84 68 177 84 68 176 59 34 142 30 13 -+131 20 10 124 2 0 124 2 0 153 32 16 176 59 34 203 99 81 -+203 99 81 195 25 6 153 32 16 177 84 68 177 84 68 183 106 85 -+213 149 125 222 184 158 237 212 203 240 219 206 222 184 158 44 12 10 -+0 0 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 44 12 10 -+249 237 229 243 220 211 237 187 164 243 220 211 254 255 253 242 201 184 -+231 168 130 236 173 149 237 187 164 241 196 185 243 210 197 247 223 207 -+249 231 218 251 238 227 252 240 230 252 240 230 252 240 230 251 238 227 -+250 235 219 247 223 207 247 223 207 242 201 184 241 190 156 237 182 145 -+239 175 143 231 168 130 227 164 124 221 143 118 221 143 118 203 102 83 -+213 78 31 213 49 12 213 43 8 213 43 8 213 43 8 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 -+184 9 3 184 9 3 184 9 3 179 7 2 179 7 2 176 6 2 -+174 10 3 174 10 3 168 14 5 168 14 5 164 15 5 164 15 5 -+156 16 7 156 16 7 153 32 16 153 32 16 153 32 16 153 32 16 -+153 32 16 153 32 16 153 32 16 177 84 68 177 84 68 177 84 68 -+142 30 13 136 24 13 131 20 10 144 9 4 159 3 1 176 6 2 -+175 12 4 142 30 13 177 84 68 177 84 68 177 84 68 177 84 68 -+202 130 106 218 160 133 238 198 189 243 220 211 237 212 203 177 84 68 -+0 0 0 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 183 106 85 -+254 254 253 238 198 189 236 194 173 246 228 219 253 249 244 239 175 143 -+231 168 130 239 175 143 233 177 153 242 201 184 243 210 197 248 226 214 -+250 235 219 251 238 227 252 244 235 252 246 236 252 240 230 251 236 222 -+249 231 218 247 223 207 243 208 194 241 190 156 239 175 143 231 168 130 -+227 164 124 221 143 118 221 143 118 214 127 110 213 78 31 213 49 12 -+213 43 8 213 43 8 213 43 8 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 -+188 0 0 183 2 0 183 2 0 179 0 0 176 6 2 172 5 1 -+172 5 1 167 2 1 167 2 1 167 2 1 159 3 1 159 13 5 -+159 13 5 156 16 7 156 16 7 147 19 9 147 19 9 142 30 13 -+142 30 13 142 30 13 142 30 13 142 30 13 142 30 13 177 84 68 -+177 84 68 177 84 68 142 30 13 142 30 13 142 30 13 136 24 13 -+136 24 13 142 30 13 142 30 13 177 84 68 177 84 68 183 106 85 -+183 106 85 213 149 125 222 184 158 237 212 203 237 212 203 202 130 106 -+0 0 0 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 38 6 5 222 184 158 -+253 249 244 236 194 173 236 194 173 251 245 237 244 218 207 221 143 118 -+227 164 124 231 168 130 233 177 153 241 196 185 243 210 197 247 223 207 -+251 236 222 253 249 240 253 252 251 254 252 249 251 242 233 250 235 219 -+247 223 207 243 208 194 241 190 156 239 175 143 231 168 130 221 143 118 -+221 143 118 214 127 110 213 78 31 213 49 12 213 43 8 213 43 8 -+213 43 8 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 189 0 0 -+186 0 0 184 0 0 181 0 0 178 0 0 175 0 0 173 0 0 -+170 0 0 167 2 1 167 2 1 163 1 0 159 3 1 159 3 1 -+157 8 2 157 8 2 144 9 4 144 9 4 147 19 9 147 19 9 -+136 24 13 136 24 13 136 24 13 136 24 13 136 24 13 136 24 13 -+176 59 34 177 84 68 177 84 68 142 30 13 142 30 13 136 24 13 -+136 24 13 136 24 13 142 30 13 177 84 68 177 84 68 177 84 68 -+183 106 85 202 130 106 218 160 133 237 212 203 240 219 206 222 184 158 -+44 12 10 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 249 237 229 -+249 237 229 222 184 158 236 194 173 253 253 252 236 173 149 221 143 118 -+221 143 118 231 168 130 233 177 153 242 201 184 243 208 194 247 223 207 -+252 244 235 254 254 253 255 255 255 255 255 255 252 244 235 248 226 214 -+243 210 197 242 201 184 241 190 156 227 164 124 221 143 118 214 127 110 -+203 102 83 213 78 31 213 43 8 213 43 8 213 43 8 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 189 0 0 -+186 0 0 184 0 0 179 0 0 177 0 0 174 0 0 172 0 0 -+169 0 0 166 0 0 164 0 0 160 0 0 159 0 0 157 0 0 -+155 2 1 149 3 1 149 3 1 144 9 4 144 9 4 141 11 5 -+141 11 5 136 24 13 136 24 13 136 24 13 136 24 13 136 24 13 -+136 24 13 142 30 13 177 84 68 177 84 68 177 84 68 177 84 68 -+142 30 13 142 30 13 177 84 68 177 84 68 177 84 68 177 84 68 -+177 84 68 183 106 85 213 149 125 238 198 189 243 220 211 238 198 189 -+44 12 10 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 177 84 68 253 252 251 -+243 220 211 233 177 153 238 198 189 251 240 231 221 143 118 221 143 118 -+221 143 118 227 164 124 237 182 145 241 190 156 243 208 194 250 235 219 -+254 252 249 255 255 255 255 255 255 254 254 253 252 240 230 247 223 207 -+242 201 184 241 190 156 231 168 130 214 127 110 206 120 99 213 78 31 -+213 49 12 213 43 8 213 43 8 213 43 8 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 192 0 0 192 0 0 188 0 0 -+186 0 0 181 0 0 179 0 0 176 0 0 174 0 0 171 0 0 -+169 0 0 165 0 0 163 0 0 160 0 0 158 0 0 155 0 0 -+153 0 0 150 0 0 149 3 1 145 0 0 144 9 4 144 9 4 -+141 11 5 141 11 5 131 20 10 131 20 10 131 20 10 131 20 10 -+136 24 13 131 20 10 136 24 13 177 84 68 177 84 68 177 84 68 -+177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 -+177 84 68 177 84 68 213 149 125 222 184 158 240 219 206 237 212 203 -+183 106 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 202 130 106 255 255 255 -+238 198 189 233 177 153 237 212 203 241 196 185 206 120 99 214 127 110 -+221 143 118 227 164 124 234 180 140 241 190 156 243 208 194 251 238 227 -+254 254 253 255 255 255 255 255 255 254 253 250 249 231 218 243 208 194 -+241 190 156 234 180 140 227 164 124 203 99 81 213 78 31 213 43 8 -+213 43 8 213 43 8 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 192 0 0 189 0 0 186 0 0 -+184 0 0 181 0 0 179 0 0 176 0 0 173 0 0 170 0 0 -+167 0 0 165 0 0 162 0 0 160 0 0 157 0 0 153 0 0 -+152 0 0 150 0 0 147 0 0 145 0 0 142 1 0 140 1 0 -+140 1 0 141 11 5 141 11 5 131 20 10 131 20 10 131 20 10 -+131 20 10 131 20 10 131 20 10 131 20 10 136 24 13 177 84 68 -+177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 -+177 84 68 176 59 34 202 130 106 218 160 133 243 220 211 243 220 211 -+202 130 106 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 2 2 2 222 184 158 255 255 255 -+236 194 173 218 160 133 243 220 211 221 154 132 203 99 81 214 127 110 -+221 143 118 227 164 124 234 180 140 241 190 156 243 208 194 251 238 227 -+255 255 255 255 255 255 255 255 255 252 242 234 243 210 197 241 190 156 -+237 182 145 227 164 124 203 102 83 213 49 12 213 43 8 213 43 8 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 192 0 0 189 0 0 186 0 0 -+184 0 0 179 0 0 178 0 0 175 0 0 172 0 0 169 0 0 -+166 0 0 164 0 0 160 0 0 159 0 0 157 0 0 153 0 0 -+150 0 0 147 0 0 145 0 0 143 0 0 141 0 0 140 1 0 -+131 0 0 131 0 0 131 0 0 124 2 0 124 2 0 131 20 10 -+131 20 10 131 20 10 131 20 10 111 7 4 90 10 7 136 24 13 -+177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 -+177 84 68 176 59 34 198 112 92 218 160 133 237 212 203 246 228 219 -+222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 12 10 237 212 203 253 253 252 -+222 184 158 218 160 133 237 212 203 206 120 99 203 99 81 206 120 99 -+221 143 118 227 164 124 234 180 140 241 190 156 242 201 184 249 231 218 -+253 251 245 253 253 252 251 245 237 247 223 207 242 201 184 237 182 145 -+227 164 124 203 102 83 213 78 31 213 43 8 213 43 8 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 192 0 0 189 0 0 186 0 0 186 0 0 -+181 0 0 179 0 0 176 0 0 174 0 0 171 0 0 169 0 0 -+166 0 0 163 0 0 160 0 0 158 0 0 157 0 0 153 0 0 -+150 0 0 147 0 0 145 0 0 142 0 0 140 1 0 140 1 0 -+131 0 0 131 0 0 131 0 0 124 2 0 124 2 0 124 2 0 -+111 7 4 111 7 4 111 7 4 111 7 4 90 10 7 90 10 7 -+90 10 7 142 30 13 142 30 13 142 30 13 142 30 13 142 30 13 -+176 59 34 153 32 16 183 106 85 213 149 125 238 198 189 249 237 229 -+238 198 189 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 12 10 246 228 219 251 245 237 -+222 184 158 218 160 133 241 205 194 213 78 31 203 99 81 206 120 99 -+206 120 99 227 164 124 231 168 130 241 190 156 242 201 184 243 210 197 -+249 231 218 249 231 218 243 210 197 242 201 184 241 190 156 227 164 124 -+206 120 99 213 78 31 213 78 31 213 43 8 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 192 0 0 189 0 0 186 0 0 184 0 0 -+181 0 0 178 0 0 175 0 0 173 0 0 170 0 0 167 0 0 -+165 0 0 162 0 0 159 0 0 158 0 0 155 0 0 152 0 0 -+150 0 0 146 0 0 145 0 0 142 0 0 140 1 0 140 1 0 -+131 0 0 131 0 0 131 0 0 124 2 0 124 2 0 124 2 0 -+111 7 4 111 7 4 111 7 4 111 7 4 90 10 7 90 10 7 -+90 10 7 90 10 7 136 24 13 142 30 13 142 30 13 142 30 13 -+142 30 13 142 30 13 192 80 59 213 149 125 236 194 173 251 245 237 -+237 212 203 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 177 84 68 253 249 244 249 237 229 -+218 160 133 218 160 133 236 194 173 204 51 17 213 78 31 203 102 83 -+206 120 99 227 164 124 231 168 130 237 182 145 241 190 156 242 201 184 -+242 201 184 242 201 184 241 190 156 237 182 145 227 164 124 206 120 99 -+213 78 31 213 78 31 213 78 31 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 192 0 0 189 0 0 186 0 0 184 0 0 181 0 0 -+179 0 0 177 0 0 174 0 0 171 0 0 169 0 0 166 0 0 -+164 0 0 160 0 0 159 0 0 157 0 0 153 0 0 150 0 0 -+147 0 0 146 0 0 143 0 0 141 0 0 140 1 0 131 0 0 -+131 0 0 131 0 0 131 0 0 124 2 0 124 2 0 117 1 0 -+117 1 0 111 7 4 111 7 4 111 7 4 97 5 3 90 10 7 -+90 10 7 90 10 7 90 10 7 136 24 13 136 24 13 142 30 13 -+136 24 13 131 20 10 184 62 32 213 149 125 222 184 158 253 249 244 -+237 212 203 177 84 68 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 183 106 85 255 255 255 246 228 219 -+218 160 133 218 160 133 221 154 132 205 44 13 213 78 31 213 78 31 -+203 102 83 221 143 118 227 164 124 231 168 130 237 182 145 241 190 156 -+241 190 156 241 190 156 239 175 143 227 164 124 206 120 99 213 78 31 -+213 78 31 213 78 31 213 78 31 210 31 6 210 31 6 210 31 6 -+210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+192 0 0 192 0 0 188 0 0 186 0 0 184 0 0 181 0 0 -+178 0 0 176 0 0 173 0 0 170 0 0 169 0 0 165 0 0 -+163 0 0 160 0 0 157 0 0 155 0 0 153 0 0 150 0 0 -+147 0 0 145 0 0 142 0 0 140 1 0 140 1 0 131 0 0 -+131 0 0 131 0 0 124 2 0 124 2 0 124 2 0 117 1 0 -+117 1 0 111 7 4 111 7 4 111 7 4 111 7 4 97 5 3 -+90 10 7 90 10 7 90 10 7 90 10 7 111 7 4 131 20 10 -+111 7 4 124 2 0 176 59 34 202 130 106 222 184 158 253 249 244 -+237 212 203 183 106 85 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 1 1 1 183 106 85 255 255 255 237 212 203 -+213 149 125 222 184 158 206 120 99 206 42 10 213 78 31 213 78 31 -+213 78 31 206 120 99 221 143 118 227 164 124 231 168 130 239 175 143 -+239 175 143 227 164 124 221 143 118 203 102 83 213 78 31 213 78 31 -+213 78 31 213 49 12 213 49 12 210 31 6 210 31 6 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+192 0 0 189 0 0 186 0 0 184 0 0 181 0 0 179 0 0 -+177 0 0 175 0 0 172 0 0 170 0 0 167 0 0 164 0 0 -+162 0 0 159 0 0 157 0 0 155 0 0 150 0 0 150 0 0 -+147 0 0 145 0 0 141 0 0 140 1 0 140 1 0 131 0 0 -+131 0 0 131 0 0 124 2 0 124 2 0 124 2 0 117 1 0 -+117 1 0 111 7 4 117 1 0 140 1 0 124 2 0 97 5 3 -+97 5 3 97 5 3 97 5 3 97 5 3 97 5 3 111 7 4 -+111 7 4 124 2 0 176 59 34 202 130 106 238 198 189 253 251 245 -+237 212 203 202 130 106 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 202 130 106 255 255 255 237 212 203 -+213 149 125 218 160 133 192 80 59 213 43 8 213 49 12 213 78 31 -+213 78 31 203 99 81 206 120 99 221 143 118 221 143 118 221 143 118 -+221 143 118 206 120 99 203 102 83 213 78 31 213 78 31 213 49 12 -+213 49 12 213 49 12 213 49 12 210 31 6 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 192 0 0 -+189 0 0 186 0 0 186 0 0 181 0 0 179 0 0 178 0 0 -+175 0 0 173 0 0 170 0 0 169 0 0 165 0 0 163 0 0 -+160 0 0 158 0 0 157 0 0 153 0 0 150 0 0 147 0 0 -+145 0 0 143 0 0 141 0 0 140 1 0 140 1 0 131 0 0 -+131 0 0 131 0 0 124 2 0 124 2 0 117 1 0 117 1 0 -+131 0 0 145 0 0 163 1 0 149 3 1 111 7 4 97 5 3 -+97 5 3 111 7 4 97 5 3 111 7 4 111 7 4 111 7 4 -+111 7 4 124 2 0 174 34 14 202 130 106 242 201 184 253 251 245 -+243 220 211 218 160 133 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 218 160 133 255 255 255 237 212 203 -+213 149 125 218 160 133 196 57 25 213 43 8 213 49 12 213 49 12 -+213 78 31 213 78 31 213 78 31 203 99 81 203 99 81 203 99 81 -+213 78 31 213 78 31 213 78 31 213 78 31 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 210 31 6 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 192 0 0 192 0 0 189 0 0 -+186 0 0 186 0 0 184 0 0 181 0 0 179 0 0 176 0 0 -+174 0 0 172 0 0 169 0 0 167 0 0 164 0 0 162 0 0 -+159 0 0 157 0 0 153 0 0 152 0 0 150 0 0 147 0 0 -+145 0 0 142 0 0 140 1 0 140 1 0 131 0 0 131 0 0 -+131 0 0 124 2 0 124 2 0 124 2 0 140 1 0 157 0 0 -+167 0 0 171 0 0 163 1 0 117 1 0 97 5 3 97 5 3 -+111 7 4 111 7 4 111 7 4 111 7 4 111 7 4 111 7 4 -+117 1 0 131 0 0 174 34 14 202 130 106 243 208 194 253 249 244 -+246 228 219 218 160 133 1 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 218 160 133 255 255 255 237 212 203 -+213 149 125 202 130 106 196 46 20 213 43 8 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 78 31 213 78 31 213 78 31 -+213 78 31 213 78 31 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 43 8 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 192 0 0 192 0 0 189 0 0 186 0 0 -+186 0 0 184 0 0 181 0 0 179 0 0 176 0 0 174 0 0 -+172 0 0 170 0 0 167 0 0 165 0 0 162 0 0 160 0 0 -+158 0 0 155 0 0 153 0 0 150 0 0 147 0 0 146 0 0 -+143 0 0 141 0 0 140 1 0 140 1 0 131 0 0 131 0 0 -+124 2 0 131 0 0 146 0 0 164 0 0 174 0 0 173 0 0 -+171 0 0 167 0 0 131 0 0 97 5 3 97 5 3 111 7 4 -+111 7 4 111 7 4 111 7 4 111 7 4 117 1 0 117 1 0 -+117 1 0 131 0 0 173 17 6 202 130 106 247 223 207 253 248 237 -+246 228 219 222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 222 184 158 255 255 255 237 212 203 -+210 136 114 202 130 106 196 46 20 210 31 6 213 43 8 213 43 8 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 43 8 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+192 0 0 192 0 0 189 0 0 189 0 0 186 0 0 186 0 0 -+184 0 0 181 0 0 179 0 0 177 0 0 175 0 0 173 0 0 -+170 0 0 169 0 0 166 0 0 164 0 0 160 0 0 159 0 0 -+157 0 0 153 0 0 152 0 0 150 0 0 147 0 0 145 0 0 -+142 0 0 141 0 0 140 1 0 131 0 0 131 0 0 131 0 0 -+153 0 0 170 0 0 178 0 0 176 0 0 173 0 0 171 0 0 -+171 0 0 150 0 0 111 7 4 97 5 3 97 5 3 111 7 4 -+117 1 0 117 1 0 117 1 0 117 1 0 117 1 0 117 1 0 -+124 2 0 131 0 0 173 17 6 221 143 118 250 235 219 252 244 235 -+246 228 219 222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 222 184 158 255 255 255 237 212 203 -+210 136 114 198 112 92 185 36 13 210 31 6 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 213 43 8 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 43 8 210 31 6 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 192 0 0 -+192 0 0 189 0 0 188 0 0 186 0 0 184 0 0 184 0 0 -+181 0 0 179 0 0 177 0 0 175 0 0 172 0 0 171 0 0 -+169 0 0 166 0 0 164 0 0 160 0 0 159 0 0 157 0 0 -+155 0 0 152 0 0 150 0 0 147 0 0 145 0 0 143 0 0 -+141 0 0 140 1 0 131 0 0 141 0 0 158 0 0 177 0 0 -+179 0 0 179 0 0 176 0 0 174 0 0 172 0 0 171 0 0 -+165 0 0 117 1 0 111 7 4 97 5 3 111 7 4 117 1 0 -+117 1 0 117 1 0 117 1 0 117 1 0 124 2 0 124 2 0 -+124 2 0 140 1 0 180 20 5 227 164 124 250 235 219 252 240 230 -+246 228 219 222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 222 184 158 255 255 255 237 212 203 -+210 136 114 188 95 83 187 29 9 201 33 6 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 49 12 213 49 12 213 49 12 213 49 12 210 31 6 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 189 0 0 189 0 0 -+188 0 0 186 0 0 186 0 0 184 0 0 181 0 0 181 0 0 -+179 0 0 177 0 0 175 0 0 173 0 0 171 0 0 169 0 0 -+167 0 0 165 0 0 163 0 0 160 0 0 158 0 0 157 0 0 -+153 0 0 150 0 0 150 0 0 147 0 0 145 0 0 141 0 0 -+140 1 0 145 0 0 164 0 0 178 0 0 184 0 0 179 0 0 -+179 0 0 176 0 0 175 0 0 173 0 0 171 0 0 172 0 0 -+140 1 0 111 7 4 111 7 4 111 7 4 117 1 0 117 1 0 -+117 1 0 117 1 0 124 2 0 124 2 0 124 2 0 131 0 0 -+131 0 0 147 0 0 185 36 13 241 190 156 250 235 219 252 240 230 -+249 237 229 218 160 133 44 12 10 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 218 160 133 255 255 255 243 220 211 -+210 136 114 188 95 83 182 27 9 195 25 6 210 31 6 210 31 6 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 49 12 213 49 12 210 31 6 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 186 0 0 186 0 0 -+186 0 0 184 0 0 184 0 0 181 0 0 179 0 0 178 0 0 -+176 0 0 175 0 0 172 0 0 171 0 0 169 0 0 167 0 0 -+164 0 0 162 0 0 160 0 0 158 0 0 157 0 0 153 0 0 -+150 0 0 150 0 0 147 0 0 145 0 0 142 0 0 150 0 0 -+166 0 0 184 0 0 186 0 0 184 0 0 181 0 0 179 0 0 -+178 0 0 175 0 0 174 0 0 172 0 0 172 0 0 159 0 0 -+117 1 0 111 7 4 111 7 4 117 1 0 117 1 0 117 1 0 -+117 1 0 124 2 0 124 2 0 131 0 0 131 0 0 131 0 0 -+140 1 0 157 0 0 196 46 20 242 201 184 250 235 219 252 240 230 -+246 228 219 218 160 133 44 12 10 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 213 149 125 255 255 255 246 228 219 -+210 136 114 188 95 83 180 23 7 195 25 6 210 31 6 210 31 6 -+210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 49 12 213 43 8 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 184 0 0 184 0 0 -+184 0 0 181 0 0 179 0 0 179 0 0 177 0 0 176 0 0 -+174 0 0 173 0 0 170 0 0 169 0 0 167 0 0 165 0 0 -+163 0 0 160 0 0 158 0 0 157 0 0 155 0 0 152 0 0 -+150 0 0 147 0 0 145 0 0 147 0 0 167 0 0 184 0 0 -+188 0 0 186 0 0 184 0 0 181 0 0 179 0 0 178 0 0 -+177 0 0 174 0 0 173 0 0 172 0 0 170 0 0 131 0 0 -+111 7 4 111 7 4 111 7 4 117 1 0 117 1 0 117 1 0 -+124 2 0 124 2 0 131 0 0 131 0 0 140 1 0 140 1 0 -+142 0 0 167 0 0 204 76 38 243 208 194 247 223 207 251 238 227 -+246 228 219 218 160 133 44 12 10 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 213 149 125 255 255 255 251 245 237 -+210 136 114 188 95 83 172 22 7 191 24 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 210 31 6 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 181 0 0 181 0 0 -+179 0 0 179 0 0 177 0 0 176 0 0 174 0 0 173 0 0 -+172 0 0 170 0 0 169 0 0 167 0 0 165 0 0 163 0 0 -+160 0 0 159 0 0 157 0 0 153 0 0 152 0 0 150 0 0 -+147 0 0 150 0 0 164 0 0 184 0 0 189 0 0 186 0 0 -+186 0 0 184 0 0 181 0 0 179 0 0 179 0 0 177 0 0 -+176 0 0 174 0 0 172 0 0 172 0 0 160 0 0 117 1 0 -+111 7 4 111 7 4 111 7 4 117 1 0 117 1 0 124 2 0 -+124 2 0 131 0 0 131 0 0 140 1 0 141 0 0 145 0 0 -+147 0 0 183 2 0 221 143 118 247 223 207 247 223 207 252 240 230 -+246 228 219 213 149 125 2 2 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 202 130 106 254 254 253 253 253 252 -+210 136 114 188 95 83 166 21 8 191 24 6 195 25 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 213 43 8 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 179 0 0 179 0 0 -+177 0 0 176 0 0 175 0 0 174 0 0 172 0 0 171 0 0 -+169 0 0 169 0 0 166 0 0 164 0 0 162 0 0 160 0 0 -+158 0 0 157 0 0 155 0 0 153 0 0 150 0 0 147 0 0 -+160 0 0 181 0 0 192 0 0 189 0 0 188 0 0 186 0 0 -+184 0 0 181 0 0 181 0 0 179 0 0 178 0 0 176 0 0 -+175 0 0 173 0 0 171 0 0 171 0 0 140 1 0 111 7 4 -+111 7 4 111 7 4 117 1 0 117 1 0 117 1 0 124 2 0 -+124 2 0 131 0 0 140 1 0 141 0 0 145 0 0 147 0 0 -+153 0 0 193 28 10 237 182 145 247 223 207 247 223 207 252 240 230 -+243 220 211 213 149 125 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 183 106 85 253 253 252 255 255 255 -+213 149 125 188 95 83 166 21 8 180 20 5 191 24 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 192 0 0 177 0 0 177 0 0 -+175 0 0 174 0 0 173 0 0 172 0 0 170 0 0 169 0 0 -+167 0 0 166 0 0 164 0 0 162 0 0 160 0 0 159 0 0 -+157 0 0 155 0 0 153 0 0 150 0 0 153 0 0 172 0 0 -+189 0 0 192 0 0 189 0 0 188 0 0 186 0 0 184 0 0 -+184 0 0 181 0 0 179 0 0 178 0 0 177 0 0 175 0 0 -+174 0 0 172 0 0 172 0 0 163 0 0 117 1 0 111 7 4 -+111 7 4 111 7 4 117 1 0 117 1 0 124 2 0 124 2 0 -+131 0 0 131 0 0 140 1 0 143 0 0 147 0 0 150 0 0 -+167 0 0 213 78 31 241 190 156 247 223 207 247 223 207 252 240 230 -+237 212 203 202 130 106 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 177 84 68 253 253 252 255 255 255 -+222 184 158 188 95 83 156 18 6 175 12 4 180 20 5 195 25 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 189 0 0 174 0 0 174 0 0 -+173 0 0 172 0 0 171 0 0 170 0 0 169 0 0 167 0 0 -+165 0 0 164 0 0 162 0 0 160 0 0 158 0 0 157 0 0 -+155 0 0 153 0 0 150 0 0 157 0 0 184 0 0 196 0 0 -+189 0 0 189 0 0 186 0 0 186 0 0 186 0 0 184 0 0 -+181 0 0 179 0 0 179 0 0 178 0 0 176 0 0 174 0 0 -+173 0 0 171 0 0 171 0 0 147 0 0 111 7 4 111 7 4 -+111 7 4 117 1 0 117 1 0 117 1 0 124 2 0 131 0 0 -+131 0 0 140 1 0 141 0 0 145 0 0 150 0 0 153 0 0 -+184 9 3 227 164 124 241 190 156 247 223 207 247 223 207 252 240 230 -+237 212 203 183 106 85 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 12 10 249 237 229 255 255 255 -+238 198 189 188 95 83 156 16 7 168 14 5 180 20 5 191 24 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 186 0 0 171 0 0 171 0 0 -+170 0 0 169 0 0 169 0 0 167 0 0 165 0 0 164 0 0 -+162 0 0 160 0 0 159 0 0 158 0 0 157 0 0 153 0 0 -+152 0 0 150 0 0 165 0 0 189 0 0 192 0 0 192 0 0 -+189 0 0 188 0 0 186 0 0 186 0 0 184 0 0 184 0 0 -+181 0 0 179 0 0 178 0 0 177 0 0 175 0 0 173 0 0 -+172 0 0 171 0 0 169 0 0 131 0 0 111 7 4 111 7 4 -+111 7 4 117 1 0 117 1 0 124 2 0 124 2 0 131 0 0 -+131 0 0 141 0 0 143 0 0 147 0 0 150 0 0 159 0 0 -+213 78 31 234 180 140 242 201 184 247 223 207 247 223 207 252 240 230 -+237 212 203 177 84 68 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 12 10 237 212 203 255 255 255 -+246 228 219 183 106 85 153 32 16 157 8 2 180 20 5 180 20 5 -+195 25 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 186 0 0 169 0 0 169 0 0 -+167 0 0 166 0 0 165 0 0 164 0 0 163 0 0 162 0 0 -+160 0 0 159 0 0 157 0 0 157 0 0 153 0 0 150 0 0 -+150 0 0 171 0 0 192 0 0 192 0 0 189 0 0 189 0 0 -+188 0 0 186 0 0 186 0 0 184 0 0 184 0 0 181 0 0 -+179 0 0 178 0 0 177 0 0 175 0 0 174 0 0 172 0 0 -+171 0 0 170 0 0 164 0 0 117 1 0 111 7 4 111 7 4 -+117 1 0 117 1 0 117 1 0 124 2 0 131 0 0 131 0 0 -+140 1 0 142 0 0 146 0 0 150 0 0 153 0 0 182 27 9 -+231 168 130 241 190 156 243 208 194 247 223 207 248 226 214 250 239 228 -+238 198 189 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 12 10 222 184 158 255 255 255 -+251 242 233 202 130 106 153 32 16 149 3 1 175 12 4 180 20 5 -+180 20 5 195 25 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 184 0 0 165 0 0 166 0 0 -+165 0 0 164 0 0 163 0 0 162 0 0 160 0 0 159 0 0 -+158 0 0 157 0 0 155 0 0 153 0 0 150 0 0 150 0 0 -+174 0 0 192 0 0 192 0 0 192 0 0 189 0 0 188 0 0 -+186 0 0 186 0 0 184 0 0 184 0 0 181 0 0 179 0 0 -+179 0 0 177 0 0 176 0 0 174 0 0 173 0 0 171 0 0 -+170 0 0 169 0 0 150 0 0 111 7 4 97 5 3 111 7 4 -+117 1 0 117 1 0 124 2 0 124 2 0 131 0 0 131 0 0 -+140 1 0 145 0 0 147 0 0 152 0 0 159 0 0 203 102 83 -+241 190 156 241 190 156 247 223 207 247 223 207 250 235 219 246 228 219 -+222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 2 2 2 213 149 125 255 255 255 -+253 252 250 213 149 125 176 59 34 142 1 0 168 14 5 180 20 5 -+180 20 5 180 20 5 195 25 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 179 0 0 162 0 0 163 0 0 -+162 0 0 160 0 0 160 0 0 159 0 0 158 0 0 157 0 0 -+155 0 0 153 0 0 152 0 0 150 0 0 150 0 0 175 0 0 -+192 0 0 192 0 0 189 0 0 189 0 0 188 0 0 186 0 0 -+186 0 0 184 0 0 181 0 0 181 0 0 179 0 0 179 0 0 -+178 0 0 176 0 0 175 0 0 173 0 0 172 0 0 170 0 0 -+169 0 0 170 0 0 131 0 0 97 5 3 111 7 4 117 1 0 -+117 1 0 117 1 0 124 2 0 131 0 0 131 0 0 140 1 0 -+142 0 0 147 0 0 150 0 0 153 0 0 193 53 28 234 180 140 -+241 190 156 241 190 156 247 223 207 247 223 207 250 235 219 246 228 219 -+213 149 125 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 183 106 85 253 249 244 -+255 255 255 222 184 158 177 84 68 140 1 0 157 8 2 175 12 4 -+180 20 5 180 20 5 180 20 5 195 25 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 210 31 6 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 178 0 0 160 0 0 160 0 0 -+159 0 0 158 0 0 157 0 0 157 0 0 155 0 0 153 0 0 -+153 0 0 152 0 0 150 0 0 150 0 0 177 0 0 196 0 0 -+192 0 0 189 0 0 189 0 0 188 0 0 186 0 0 186 0 0 -+184 0 0 184 0 0 181 0 0 179 0 0 179 0 0 178 0 0 -+177 0 0 175 0 0 174 0 0 172 0 0 171 0 0 169 0 0 -+169 0 0 166 0 0 124 2 0 97 5 3 117 1 0 117 1 0 -+117 1 0 124 2 0 124 2 0 131 0 0 131 0 0 141 0 0 -+145 0 0 150 0 0 150 0 0 173 17 6 227 164 124 241 190 156 -+241 190 156 242 201 184 247 223 207 247 223 207 251 236 222 240 219 206 -+183 106 85 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 90 10 7 246 228 219 -+255 255 255 246 228 219 177 84 68 141 11 5 142 1 0 175 12 4 -+175 12 4 180 20 5 180 20 5 180 20 5 191 24 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 176 0 0 157 0 0 157 0 0 -+157 0 0 157 0 0 155 0 0 153 0 0 152 0 0 150 0 0 -+150 0 0 150 0 0 147 0 0 173 0 0 192 0 0 192 0 0 -+189 0 0 188 0 0 186 0 0 186 0 0 186 0 0 184 0 0 -+181 0 0 181 0 0 179 0 0 179 0 0 178 0 0 176 0 0 -+175 0 0 173 0 0 172 0 0 170 0 0 169 0 0 169 0 0 -+167 0 0 159 0 0 117 1 0 111 7 4 117 1 0 117 1 0 -+124 2 0 124 2 0 131 0 0 131 0 0 140 1 0 143 0 0 -+147 0 0 150 0 0 163 1 0 206 120 99 241 190 156 241 190 156 -+241 190 156 247 223 207 247 223 207 250 235 219 250 239 228 237 212 203 -+177 84 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 237 212 203 -+255 255 255 254 254 253 202 130 106 136 24 13 140 1 0 157 8 2 -+175 12 4 175 12 4 180 20 5 180 20 5 180 20 5 195 25 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 173 0 0 153 0 0 155 0 0 -+153 0 0 153 0 0 152 0 0 150 0 0 150 0 0 150 0 0 -+147 0 0 146 0 0 169 0 0 192 0 0 189 0 0 189 0 0 -+188 0 0 186 0 0 186 0 0 186 0 0 184 0 0 184 0 0 -+181 0 0 179 0 0 179 0 0 178 0 0 177 0 0 175 0 0 -+174 0 0 172 0 0 171 0 0 169 0 0 169 0 0 167 0 0 -+167 0 0 150 0 0 117 1 0 117 1 0 117 1 0 117 1 0 -+124 2 0 131 0 0 131 0 0 140 1 0 141 0 0 145 0 0 -+147 0 0 160 0 0 204 76 38 241 190 156 241 190 156 241 190 156 -+241 190 156 247 223 207 250 235 219 250 235 219 250 239 228 222 184 158 -+44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 213 149 125 -+253 253 252 255 255 255 222 184 158 142 30 13 131 0 0 149 3 1 -+174 10 3 175 12 4 175 12 4 180 20 5 180 20 5 191 24 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 210 31 6 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 170 0 0 150 0 0 152 0 0 -+150 0 0 150 0 0 150 0 0 147 0 0 147 0 0 146 0 0 -+145 0 0 164 0 0 192 0 0 189 0 0 188 0 0 186 0 0 -+186 0 0 186 0 0 184 0 0 184 0 0 181 0 0 181 0 0 -+179 0 0 178 0 0 178 0 0 176 0 0 175 0 0 173 0 0 -+172 0 0 171 0 0 170 0 0 169 0 0 167 0 0 165 0 0 -+167 0 0 146 0 0 117 1 0 117 1 0 117 1 0 124 2 0 -+131 0 0 131 0 0 140 1 0 141 0 0 145 0 0 147 0 0 -+160 0 0 209 61 24 234 180 140 241 190 156 241 190 156 241 190 156 -+247 223 207 250 235 219 250 235 219 250 235 219 246 228 219 213 149 125 -+38 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 177 84 68 -+251 245 237 255 255 255 246 228 219 176 59 34 131 0 0 140 1 0 -+168 14 5 174 10 3 175 12 4 175 12 4 180 20 5 195 25 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 169 0 0 147 0 0 150 0 0 -+150 0 0 147 0 0 147 0 0 146 0 0 145 0 0 142 0 0 -+153 0 0 186 0 0 189 0 0 188 0 0 186 0 0 186 0 0 -+186 0 0 184 0 0 184 0 0 181 0 0 181 0 0 179 0 0 -+179 0 0 178 0 0 176 0 0 175 0 0 174 0 0 172 0 0 -+171 0 0 170 0 0 169 0 0 167 0 0 166 0 0 164 0 0 -+167 0 0 145 0 0 117 1 0 117 1 0 124 2 0 124 2 0 -+131 0 0 131 0 0 140 1 0 142 0 0 145 0 0 167 0 0 -+203 40 12 227 164 124 234 180 140 241 190 156 241 190 156 241 190 156 -+247 223 207 250 235 219 250 235 219 250 239 228 237 212 203 183 106 85 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 -+237 212 203 255 255 255 253 252 251 202 130 106 124 2 0 124 2 0 -+149 3 1 168 14 5 174 10 3 175 12 4 175 12 4 191 24 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 173 0 0 146 0 0 146 0 0 -+146 0 0 145 0 0 145 0 0 143 0 0 142 0 0 143 0 0 -+177 0 0 189 0 0 186 0 0 186 0 0 186 0 0 184 0 0 -+184 0 0 181 0 0 181 0 0 179 0 0 179 0 0 178 0 0 -+177 0 0 176 0 0 175 0 0 173 0 0 172 0 0 171 0 0 -+170 0 0 169 0 0 167 0 0 166 0 0 165 0 0 165 0 0 -+169 0 0 141 0 0 117 1 0 124 2 0 124 2 0 131 0 0 -+131 0 0 140 1 0 141 0 0 146 0 0 173 0 0 210 31 6 -+206 120 99 227 164 124 227 164 124 234 180 140 234 180 140 242 201 184 -+250 235 219 250 235 219 250 235 219 250 239 228 222 184 158 44 12 10 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 -+213 149 125 253 253 252 255 255 255 238 198 189 136 24 13 124 2 0 -+131 0 0 157 8 2 168 14 5 168 14 5 175 12 4 191 24 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 210 31 6 196 0 0 192 0 0 192 0 0 -+192 0 0 192 0 0 196 0 0 172 0 0 145 0 0 145 0 0 -+143 0 0 142 0 0 142 0 0 141 0 0 140 1 0 159 0 0 -+188 0 0 186 0 0 186 0 0 186 0 0 184 0 0 184 0 0 -+181 0 0 181 0 0 179 0 0 179 0 0 178 0 0 177 0 0 -+175 0 0 174 0 0 174 0 0 172 0 0 170 0 0 170 0 0 -+169 0 0 167 0 0 166 0 0 165 0 0 164 0 0 166 0 0 -+170 0 0 143 0 0 117 1 0 124 2 0 131 0 0 131 0 0 -+140 1 0 141 0 0 143 0 0 165 0 0 195 25 6 213 78 31 -+206 120 99 221 143 118 227 164 124 227 164 124 234 180 140 247 223 207 -+250 235 219 250 235 219 251 236 222 246 228 219 213 149 125 44 12 10 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+177 84 68 246 228 219 255 255 255 253 252 250 177 84 68 124 2 0 -+124 2 0 149 3 1 168 14 5 168 14 5 168 14 5 184 9 3 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 210 31 6 192 0 0 189 0 0 -+192 0 0 192 0 0 192 0 0 176 0 0 142 0 0 142 0 0 -+141 0 0 141 0 0 141 0 0 140 1 0 142 0 0 178 0 0 -+186 0 0 186 0 0 184 0 0 184 0 0 181 0 0 181 0 0 -+181 0 0 179 0 0 179 0 0 178 0 0 177 0 0 176 0 0 -+174 0 0 173 0 0 172 0 0 171 0 0 169 0 0 169 0 0 -+169 0 0 166 0 0 165 0 0 165 0 0 166 0 0 169 0 0 -+171 0 0 142 0 0 124 2 0 131 0 0 131 0 0 131 0 0 -+140 1 0 143 0 0 146 0 0 184 9 3 213 78 31 213 78 31 -+203 102 83 206 120 99 221 143 118 227 164 124 241 190 156 247 223 207 -+250 235 219 250 235 219 252 240 230 237 212 203 183 106 85 2 2 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+44 12 10 222 184 158 254 254 253 255 255 255 222 184 158 124 2 0 -+124 2 0 131 0 0 157 8 2 168 14 5 168 14 5 184 9 3 -+196 0 0 195 25 6 195 25 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 210 31 6 196 0 0 -+188 0 0 189 0 0 189 0 0 179 0 0 140 1 0 140 1 0 -+140 1 0 140 1 0 140 1 0 131 0 0 155 0 0 186 0 0 -+184 0 0 184 0 0 181 0 0 181 0 0 179 0 0 179 0 0 -+179 0 0 178 0 0 177 0 0 176 0 0 175 0 0 174 0 0 -+172 0 0 171 0 0 171 0 0 169 0 0 169 0 0 167 0 0 -+166 0 0 165 0 0 164 0 0 166 0 0 169 0 0 172 0 0 -+173 0 0 141 0 0 124 2 0 131 0 0 131 0 0 140 1 0 -+142 0 0 146 0 0 166 21 8 209 61 24 213 78 31 213 78 31 -+213 78 31 203 102 83 206 120 99 227 164 124 242 201 184 247 223 207 -+247 223 207 250 235 219 249 237 229 222 184 158 44 12 10 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+2 2 2 183 106 85 251 245 237 255 255 255 251 245 237 177 84 68 -+117 1 0 117 1 0 142 1 0 157 8 2 164 15 5 184 9 3 -+196 0 0 195 25 6 195 25 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+195 25 6 186 0 0 186 0 0 181 0 0 140 1 0 140 1 0 -+140 1 0 131 0 0 131 0 0 131 0 0 171 0 0 184 0 0 -+181 0 0 181 0 0 181 0 0 179 0 0 179 0 0 178 0 0 -+178 0 0 177 0 0 176 0 0 175 0 0 173 0 0 173 0 0 -+171 0 0 170 0 0 169 0 0 169 0 0 167 0 0 166 0 0 -+165 0 0 164 0 0 166 0 0 169 0 0 171 0 0 174 0 0 -+175 0 0 145 0 0 131 0 0 131 0 0 140 1 0 141 0 0 -+149 3 1 174 34 14 196 57 25 209 61 24 209 61 24 209 61 24 -+213 78 31 213 78 31 203 99 81 227 164 124 243 210 197 243 210 197 -+247 223 207 250 235 219 237 212 203 183 106 85 2 2 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 44 12 10 238 198 189 255 255 255 255 255 255 222 184 158 -+111 7 4 117 1 0 124 2 0 153 2 0 157 8 2 179 7 2 -+196 0 0 196 0 0 196 0 0 195 25 6 195 25 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 210 31 6 189 0 0 179 0 0 141 0 0 131 0 0 -+131 0 0 131 0 0 131 0 0 142 0 0 181 0 0 181 0 0 -+179 0 0 179 0 0 179 0 0 178 0 0 177 0 0 176 0 0 -+175 0 0 174 0 0 174 0 0 173 0 0 172 0 0 171 0 0 -+169 0 0 169 0 0 169 0 0 167 0 0 166 0 0 164 0 0 -+164 0 0 166 0 0 169 0 0 171 0 0 174 0 0 177 0 0 -+178 0 0 147 0 0 131 0 0 140 1 0 141 0 0 159 13 5 -+189 46 14 196 60 25 196 60 25 196 57 25 209 61 24 209 61 24 -+209 61 24 213 78 31 203 99 81 237 187 164 243 208 194 243 208 194 -+247 223 207 246 228 219 222 184 158 44 12 10 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 2 2 2 183 106 85 253 249 244 255 255 255 253 252 250 -+177 84 68 117 1 0 117 1 0 131 0 0 157 8 2 172 5 1 -+196 0 0 196 0 0 196 0 0 195 25 6 195 25 6 195 25 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 195 25 6 146 0 0 131 0 0 -+131 0 0 131 0 0 124 2 0 155 0 0 181 0 0 179 0 0 -+179 0 0 178 0 0 178 0 0 177 0 0 176 0 0 175 0 0 -+174 0 0 173 0 0 172 0 0 171 0 0 170 0 0 170 0 0 -+169 0 0 167 0 0 166 0 0 165 0 0 165 0 0 164 0 0 -+167 0 0 169 0 0 172 0 0 174 0 0 177 0 0 179 0 0 -+181 0 0 152 0 0 131 0 0 149 3 1 174 34 14 196 60 25 -+204 67 22 209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 -+209 61 24 209 61 24 214 127 110 241 196 185 242 201 184 242 201 184 -+247 223 207 237 212 203 202 130 106 38 6 5 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 44 12 10 238 198 189 254 254 253 255 255 255 -+238 198 189 111 7 4 117 1 0 117 1 0 142 1 0 172 5 1 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 -+195 25 6 195 25 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 187 29 9 156 18 6 -+131 0 0 124 2 0 124 2 0 166 0 0 179 0 0 177 0 0 -+177 0 0 176 0 0 175 0 0 174 0 0 174 0 0 173 0 0 -+172 0 0 171 0 0 170 0 0 170 0 0 169 0 0 169 0 0 -+167 0 0 166 0 0 165 0 0 164 0 0 165 0 0 167 0 0 -+170 0 0 172 0 0 175 0 0 177 0 0 179 0 0 181 0 0 -+184 0 0 172 5 1 168 26 11 194 55 23 204 67 22 204 67 22 -+204 67 22 209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 -+209 61 24 204 76 38 236 173 149 236 194 173 236 194 173 242 201 184 -+240 219 206 222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 183 106 85 249 237 229 255 255 255 -+253 252 250 183 106 85 111 7 4 117 1 0 117 1 0 149 3 1 -+184 9 3 196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 -+195 25 6 195 25 6 195 25 6 195 25 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 200 41 9 -+179 30 10 156 18 6 140 1 0 170 0 0 177 0 0 175 0 0 -+176 0 0 175 0 0 174 0 0 173 0 0 173 0 0 172 0 0 -+171 0 0 170 0 0 169 0 0 169 0 0 167 0 0 166 0 0 -+166 0 0 165 0 0 164 0 0 166 0 0 169 0 0 170 0 0 -+173 0 0 175 0 0 177 0 0 178 0 0 181 0 0 184 9 3 -+204 37 8 213 49 12 204 67 22 204 67 22 204 67 22 204 67 22 -+204 67 22 209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 -+209 61 24 221 143 118 237 187 164 237 187 164 237 187 164 238 198 189 -+237 212 203 183 106 85 2 2 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 44 12 10 222 184 158 255 255 255 -+255 255 255 237 212 203 136 24 13 117 1 0 117 1 0 124 2 0 -+176 6 2 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 195 25 6 195 25 6 195 25 6 195 25 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 200 41 9 -+200 41 9 189 46 14 200 41 9 195 25 6 184 9 3 179 7 2 -+172 0 0 170 0 0 171 0 0 171 0 0 171 0 0 170 0 0 -+169 0 0 169 0 0 167 0 0 166 0 0 166 0 0 164 0 0 -+164 0 0 165 0 0 167 0 0 169 0 0 170 0 0 171 0 0 -+174 0 0 178 0 0 184 9 3 195 25 6 213 49 12 213 49 12 -+213 78 31 204 67 22 204 67 22 204 67 22 204 67 22 204 67 22 -+209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 -+203 102 83 237 187 164 237 187 164 237 187 164 237 187 164 237 212 203 -+222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 2 2 2 177 84 68 246 228 219 -+255 255 255 255 255 255 198 112 92 117 1 0 117 1 0 117 1 0 -+142 1 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 195 25 6 195 25 6 195 25 6 195 25 6 -+195 25 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 200 41 9 -+189 46 14 189 46 14 200 41 9 213 43 8 213 43 8 213 43 8 -+201 33 6 191 24 6 184 9 3 172 0 0 169 0 0 167 0 0 -+167 0 0 166 0 0 164 0 0 163 0 0 163 0 0 163 0 0 -+164 0 0 167 0 0 169 0 0 171 0 0 179 7 2 191 24 6 -+204 37 8 213 49 12 213 49 12 213 78 31 213 78 31 213 78 31 -+213 78 31 209 61 24 204 67 22 204 67 22 204 67 22 204 67 22 -+209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 213 78 31 -+236 173 149 237 187 164 237 187 164 237 187 164 238 198 189 238 198 189 -+183 106 85 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 213 149 125 -+253 249 244 255 255 255 246 228 219 153 32 16 117 1 0 117 1 0 -+117 1 0 167 2 1 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 195 25 6 195 25 6 195 25 6 -+195 25 6 195 25 6 195 25 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 200 41 9 -+186 41 14 189 46 14 200 41 9 213 43 8 213 43 8 213 49 12 -+213 49 12 213 49 12 213 49 12 213 43 8 213 43 8 201 33 6 -+201 33 6 191 24 6 191 24 6 191 24 6 191 24 6 191 24 6 -+201 33 6 204 37 8 213 43 8 213 49 12 213 49 12 213 49 12 -+213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 -+213 78 31 209 61 24 204 67 22 204 67 22 204 67 22 209 61 24 -+209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 221 143 118 -+237 187 164 237 187 164 237 187 164 237 187 164 237 212 203 213 149 125 -+44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 -+222 184 158 255 255 255 254 254 253 218 160 133 131 0 0 117 1 0 -+117 1 0 124 2 0 172 5 1 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 195 25 6 -+195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 200 41 9 -+186 41 14 186 41 14 206 42 10 213 43 8 213 43 8 213 43 8 -+213 43 8 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 -+213 78 31 213 78 31 204 67 22 204 67 22 204 67 22 209 61 24 -+209 61 24 209 61 24 209 61 24 209 61 24 214 127 110 237 187 164 -+237 187 164 237 187 164 237 187 164 238 198 189 222 184 158 90 10 7 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 -+177 84 68 240 219 206 254 254 253 251 245 237 188 95 83 124 2 0 -+124 2 0 124 2 0 131 0 0 179 7 2 196 0 0 192 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 -+195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 201 33 6 -+185 36 13 185 36 13 200 41 9 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 78 31 213 78 31 213 78 31 213 78 31 -+213 78 31 213 78 31 204 67 22 204 67 22 204 67 22 209 61 24 -+209 61 24 209 61 24 213 49 12 203 102 83 236 173 149 233 177 153 -+233 177 153 237 187 164 236 194 173 238 198 189 183 106 85 2 2 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+44 12 10 183 106 85 249 237 229 253 253 252 243 220 211 153 32 16 -+131 0 0 124 2 0 124 2 0 140 1 0 179 7 2 196 0 0 -+192 0 0 192 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 -+195 25 6 195 25 6 210 31 6 201 33 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 201 33 6 -+179 30 10 185 36 13 200 41 9 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 78 31 213 78 31 213 78 31 -+213 78 31 213 78 31 213 78 31 209 61 24 209 61 24 209 61 24 -+209 61 24 213 49 12 213 78 31 236 173 149 233 177 153 233 177 153 -+233 177 153 237 187 164 237 212 203 202 130 106 44 12 10 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 44 12 10 218 160 133 253 249 244 254 252 249 222 184 158 -+156 16 7 131 0 0 131 0 0 131 0 0 142 1 0 179 7 2 -+196 0 0 192 0 0 192 0 0 184 9 3 184 9 3 184 9 3 -+184 9 3 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 -+195 25 6 195 25 6 195 25 6 195 25 6 201 33 6 201 33 6 -+201 33 6 201 33 6 210 31 6 210 31 6 210 31 6 201 33 6 -+179 30 10 179 30 10 204 37 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 78 31 213 78 31 213 78 31 -+213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 209 61 24 -+213 49 12 213 78 31 239 175 143 236 173 149 236 173 149 236 173 149 -+237 187 164 238 198 189 222 184 158 44 12 10 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 44 12 10 222 184 158 253 249 244 253 249 244 -+213 149 125 150 0 0 140 1 0 131 0 0 140 1 0 142 1 0 -+179 7 2 196 0 0 192 0 0 192 0 0 192 0 0 184 9 3 -+184 9 3 184 9 3 195 25 6 195 25 6 195 25 6 195 25 6 -+195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 201 33 6 -+201 33 6 201 33 6 201 33 6 201 33 6 201 33 6 201 33 6 -+179 30 10 179 30 10 204 37 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 78 31 -+213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 213 49 12 -+213 78 31 239 175 143 236 173 149 236 173 149 236 173 149 241 190 156 -+236 194 173 222 184 158 177 84 68 2 2 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 177 84 68 222 184 158 253 249 244 -+249 237 229 198 112 92 152 0 0 141 0 0 141 0 0 142 0 0 -+147 0 0 176 6 2 196 0 0 196 0 0 192 0 0 192 0 0 -+184 9 3 184 9 3 184 9 3 191 24 6 195 25 6 195 25 6 -+195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 -+201 33 6 201 33 6 201 33 6 201 33 6 201 33 6 201 33 6 -+187 29 9 179 30 10 201 33 6 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 78 31 -+213 78 31 213 78 31 213 78 31 213 78 31 213 49 12 213 78 31 -+231 168 130 239 175 143 239 175 143 236 173 149 239 175 143 236 194 173 -+222 184 158 177 84 68 2 2 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 2 2 2 177 84 68 238 198 189 -+253 249 244 246 228 219 191 90 72 155 0 0 146 0 0 146 0 0 -+147 0 0 147 0 0 172 5 1 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 -+195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 -+195 25 6 201 33 6 201 33 6 201 33 6 201 33 6 210 31 6 -+187 29 9 179 30 10 201 33 6 210 31 6 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 78 31 213 49 12 213 49 12 213 78 31 231 168 130 -+239 175 143 239 175 143 239 175 143 239 175 143 237 187 164 222 184 158 -+183 106 85 38 6 5 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 38 6 5 183 106 85 -+237 212 203 253 249 244 243 220 211 192 80 59 159 0 0 150 0 0 -+150 0 0 152 0 0 150 0 0 167 2 1 192 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 -+195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 -+195 25 6 195 25 6 210 31 6 210 31 6 210 31 6 210 31 6 -+201 33 6 179 30 10 201 33 6 210 31 6 210 31 6 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 203 99 81 231 168 130 239 175 143 -+239 175 143 239 175 143 239 175 143 237 187 164 222 184 158 183 106 85 -+44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 6 5 -+177 84 68 222 184 158 251 245 237 243 220 211 191 90 72 163 0 0 -+159 3 1 157 0 0 158 0 0 157 0 0 163 1 0 183 2 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+201 33 6 182 27 9 201 33 6 210 31 6 210 31 6 210 31 6 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 78 31 206 120 99 239 175 143 239 175 143 239 175 143 -+239 175 143 239 175 143 237 187 164 222 184 158 183 106 85 38 6 5 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+38 6 5 177 84 68 222 184 158 252 243 235 243 220 211 191 90 72 -+167 2 1 163 1 0 163 1 0 163 1 0 160 1 0 163 1 0 -+176 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+201 33 6 182 27 9 195 25 6 210 31 6 210 31 6 210 31 6 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 78 31 221 143 118 239 175 143 239 175 143 239 175 143 239 175 143 -+239 175 143 237 187 164 222 184 158 183 106 85 44 12 10 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 2 2 2 44 12 10 222 184 158 249 237 229 243 220 211 -+198 112 92 173 17 6 172 5 1 169 0 0 167 0 0 166 0 0 -+166 0 0 170 0 0 183 2 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 195 25 6 195 25 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 191 24 6 187 29 9 210 31 6 210 31 6 210 31 6 -+210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 78 31 -+227 164 124 231 168 130 239 175 143 239 175 143 239 175 143 239 175 143 -+222 184 158 222 184 158 177 84 68 38 6 5 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 44 12 10 213 149 125 246 228 219 -+246 228 219 210 136 114 179 30 10 176 6 2 179 0 0 174 0 0 -+171 0 0 171 0 0 171 0 0 178 0 0 192 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 191 24 6 187 29 9 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 -+213 49 12 213 49 12 213 49 12 213 78 31 206 120 99 227 164 124 -+227 164 124 231 168 130 239 175 143 239 175 143 239 175 143 222 184 158 -+213 149 125 177 84 68 2 2 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 2 2 2 44 12 10 183 106 85 -+238 198 189 246 228 219 236 173 149 184 62 32 180 23 7 184 9 3 -+183 2 0 179 0 0 176 0 0 177 0 0 178 0 0 183 2 0 -+196 0 0 196 0 0 196 0 0 196 0 0 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 191 24 6 191 24 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 49 12 213 49 12 213 49 12 213 49 12 -+213 43 8 213 78 31 213 78 31 227 164 124 227 164 124 227 164 124 -+227 164 124 231 168 130 239 175 143 239 175 143 222 184 158 202 130 106 -+44 12 10 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 -+177 84 68 222 184 158 246 228 219 241 196 185 203 99 81 185 36 13 -+193 28 10 196 0 0 192 0 0 183 2 0 183 2 0 183 2 0 -+183 2 0 186 0 0 196 0 0 196 0 0 196 0 0 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 191 24 6 191 24 6 195 25 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 -+213 78 31 227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 -+231 168 130 231 168 130 236 173 149 218 160 133 183 106 85 44 12 10 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+2 2 2 44 12 10 183 106 85 238 198 189 237 212 203 221 143 118 -+192 80 59 196 46 20 193 28 10 196 0 0 196 0 0 189 0 0 -+186 0 0 188 0 0 189 0 0 192 0 0 196 0 0 196 0 0 -+196 0 0 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 191 24 6 195 25 6 195 25 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 49 12 213 78 31 206 120 99 -+227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 -+231 168 130 218 160 133 202 130 106 44 12 10 2 2 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 1 1 1 44 12 10 90 10 7 213 149 125 237 212 203 -+241 196 185 203 102 83 193 53 28 193 53 28 203 40 12 210 31 6 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 210 31 6 210 31 6 -+195 25 6 191 24 6 195 25 6 195 25 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 -+213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 210 31 6 -+213 43 8 213 78 31 213 78 31 206 120 99 227 164 124 227 164 124 -+227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 218 160 133 -+213 149 125 183 106 85 44 12 10 2 2 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 2 2 2 44 12 10 177 84 68 -+213 149 125 238 198 189 233 177 153 203 99 81 193 53 28 193 53 28 -+209 61 24 204 51 17 210 31 6 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+184 9 3 184 9 3 195 25 6 195 25 6 195 25 6 210 31 6 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 -+210 31 6 210 31 6 210 31 6 213 43 8 213 49 12 213 78 31 -+213 78 31 221 143 118 227 164 124 227 164 124 227 164 124 227 164 124 -+227 164 124 227 164 124 227 164 124 227 164 124 213 149 125 183 106 85 -+44 12 10 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 -+44 12 10 177 84 68 213 149 125 238 198 189 221 154 132 203 99 81 -+204 76 38 204 76 38 204 76 38 204 76 38 209 61 24 205 44 13 -+210 31 6 195 25 6 195 25 6 196 0 0 196 0 0 196 0 0 -+196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 -+210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 213 49 12 -+213 49 12 213 78 31 213 78 31 213 78 31 206 120 99 227 164 124 -+227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 -+227 164 124 227 164 124 202 130 106 183 106 85 44 12 10 38 6 5 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 1 1 2 2 2 44 12 10 177 84 68 202 130 106 222 184 158 -+221 154 132 206 120 99 192 80 59 204 76 38 204 76 38 192 80 59 -+192 80 59 192 80 59 204 76 38 204 76 38 204 76 38 209 61 24 -+209 61 24 209 61 24 196 46 20 204 51 17 204 51 17 209 61 24 -+204 76 38 213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 -+206 120 99 206 120 99 206 120 99 221 143 118 221 143 118 227 164 124 -+227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 -+202 130 106 183 106 85 44 12 10 44 12 10 2 2 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 2 2 2 44 12 10 44 12 10 -+183 106 85 213 149 125 218 160 133 214 127 110 203 102 83 192 80 59 -+204 76 38 192 80 59 192 80 59 192 80 59 203 99 81 203 99 81 -+203 99 81 203 99 81 203 99 81 203 99 81 203 99 81 203 99 81 -+203 102 83 203 102 83 203 102 83 206 120 99 206 120 99 206 120 99 -+206 120 99 206 120 99 206 120 99 206 120 99 227 164 124 227 164 124 -+227 164 124 227 164 124 227 164 124 202 130 106 183 106 85 177 84 68 -+44 12 10 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 -+2 2 2 44 12 10 44 12 10 183 106 85 183 106 85 202 130 106 -+214 127 110 206 120 99 203 99 81 203 99 81 203 99 81 203 99 81 -+203 99 81 203 99 81 203 99 81 203 99 81 203 99 81 203 99 81 -+203 102 83 203 102 83 203 102 83 203 102 83 206 120 99 206 120 99 -+206 120 99 206 120 99 206 120 99 221 143 118 206 120 99 202 130 106 -+202 130 106 183 106 85 177 84 68 44 12 10 44 12 10 2 2 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 2 2 2 2 2 44 12 10 44 12 10 -+44 12 10 177 84 68 183 106 85 183 106 85 183 106 85 188 95 83 -+191 90 72 203 99 81 203 99 81 203 99 81 203 99 81 203 99 81 -+203 102 83 203 102 83 203 102 83 203 102 83 198 112 92 198 112 92 -+198 112 92 183 106 85 183 106 85 177 84 68 177 84 68 44 12 10 -+44 12 10 38 6 5 2 2 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -+2 2 2 2 2 2 2 2 2 44 12 10 44 12 10 44 12 10 -+44 12 10 44 12 10 90 10 7 90 10 7 90 10 7 136 24 13 -+90 10 7 90 10 7 90 10 7 90 10 7 44 12 10 44 12 10 -+44 12 10 44 12 10 44 12 10 2 2 2 2 2 2 1 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 -+1 1 1 2 2 2 2 2 2 2 2 2 1 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -diff --git a/drivers/video/logo/logo_fedoraglossy_clut224.ppm b/drivers/video/logo/logo_fedoraglossy_clut224.ppm -new file mode 100644 -index 000000000000..276afb7eda07 ---- /dev/null -+++ b/drivers/video/logo/logo_fedoraglossy_clut224.ppm -@@ -0,0 +1,1123 @@ -+P3 -+80 80 -+255 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 4 9 0 12 24 0 16 33 0 26 50 0 31 59 -+0 33 61 0 31 59 0 30 56 0 28 53 0 22 43 0 16 33 -+0 12 24 0 5 11 0 2 5 0 1 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 5 11 0 9 19 0 12 24 0 16 33 -+0 25 48 2 43 79 36 91 133 66 107 134 66 107 134 66 107 134 -+66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 -+9 67 112 2 43 79 0 31 57 0 22 43 0 20 39 0 14 29 -+0 5 11 0 2 5 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -+0 9 19 0 22 43 0 38 70 9 67 112 66 107 134 105 133 154 -+123 144 162 127 149 166 126 153 173 126 153 173 126 153 173 126 153 173 -+126 153 173 126 153 173 126 153 173 126 153 173 126 153 173 126 153 173 -+127 149 166 127 149 166 121 141 158 105 133 154 66 107 134 3 53 95 -+1 36 66 0 25 48 0 14 29 0 5 11 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 2 5 0 9 19 0 28 53 -+9 67 112 66 107 134 121 141 158 126 153 173 126 153 173 126 153 173 -+126 153 173 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 -+127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 -+127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 -+110 135 155 66 107 134 3 53 95 0 28 53 0 16 33 0 4 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 5 11 0 20 39 0 34 63 36 91 133 105 133 154 -+127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 -+127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 -+127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 -+127 149 166 127 149 166 127 149 166 123 144 162 123 144 162 123 144 162 -+127 149 166 127 149 166 121 141 158 105 133 154 9 67 112 0 24 47 -+0 9 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 16 33 0 34 63 9 67 112 105 133 154 127 149 166 127 149 166 -+127 149 166 123 144 162 123 144 162 127 149 166 123 144 162 123 144 162 -+123 144 162 123 144 162 123 144 162 123 144 162 123 144 162 123 144 162 -+123 144 162 123 144 162 123 144 162 123 144 162 123 144 162 123 144 162 -+121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 -+121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 86 123 154 -+3 53 95 0 22 43 0 7 15 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 29 -+2 43 79 66 107 134 115 143 164 120 146 166 123 144 162 123 144 162 -+123 144 162 123 144 162 123 144 162 120 146 166 121 141 158 121 141 158 -+121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 -+121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 -+121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 -+121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 -+110 135 155 66 107 134 0 27 51 0 14 29 0 0 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 2 5 0 22 43 3 53 95 -+86 123 154 115 143 164 114 140 160 114 140 160 114 140 160 114 140 160 -+114 140 160 114 140 160 114 140 160 114 140 160 114 140 160 114 140 160 -+114 140 160 114 140 160 114 140 160 114 140 160 114 140 160 110 135 155 -+110 135 155 114 140 160 110 135 155 110 135 155 110 135 155 110 135 155 -+110 135 155 110 135 155 110 135 155 110 135 155 110 135 155 110 135 155 -+110 135 155 110 135 155 110 135 155 110 135 155 110 135 155 110 135 155 -+110 135 155 121 141 158 66 107 134 0 31 57 0 20 39 0 4 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 12 24 0 33 63 3 53 95 86 123 154 -+114 140 160 109 137 159 109 137 159 109 137 159 109 137 159 109 137 159 -+109 137 159 110 135 155 110 135 155 109 137 159 110 135 155 110 135 155 -+110 135 155 110 135 155 109 137 159 110 135 155 110 135 155 110 135 155 -+110 135 155 110 135 155 110 135 155 110 135 155 105 133 154 105 133 154 -+105 133 154 105 133 154 110 135 155 121 141 158 127 149 166 127 149 166 -+121 141 158 110 135 155 105 133 154 105 133 154 105 133 154 105 133 154 -+105 133 154 105 133 154 110 135 155 66 107 134 0 33 61 0 20 39 -+0 7 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 14 29 0 40 76 3 53 95 86 123 154 109 137 159 -+104 134 157 104 134 157 104 134 157 104 134 157 104 134 157 104 134 157 -+104 134 157 104 134 157 104 134 157 104 134 157 105 133 154 105 133 154 -+105 133 154 105 133 154 105 133 154 105 133 154 105 133 154 105 133 154 -+105 133 154 105 133 154 105 133 154 105 133 154 105 133 154 126 153 173 -+158 185 204 198 215 225 227 236 241 240 245 247 240 245 247 240 245 247 -+240 245 247 227 236 241 188 208 220 126 153 173 105 133 154 105 133 154 -+105 133 154 105 133 154 105 133 154 105 133 154 66 107 134 0 29 54 -+0 20 39 0 2 5 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 9 19 0 38 72 0 47 87 66 107 134 100 132 157 95 130 157 -+95 130 157 95 130 157 100 132 157 100 132 157 100 132 157 100 132 157 -+100 132 157 100 132 157 100 132 157 100 132 157 100 132 157 100 132 157 -+100 132 157 100 132 157 100 132 157 100 132 157 100 132 157 95 130 157 -+95 130 157 95 130 157 95 130 157 125 160 184 198 215 225 240 245 247 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 249 251 252 175 199 215 105 133 154 -+105 133 154 86 123 154 86 123 154 86 123 154 105 133 154 36 91 133 -+0 22 43 0 20 39 0 4 9 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 11 -+0 38 71 0 45 86 9 67 112 86 123 154 95 130 157 95 130 157 -+95 130 157 95 130 157 95 130 157 95 130 157 95 130 157 95 130 157 -+95 130 157 95 130 157 95 130 157 95 130 157 95 130 157 95 130 157 -+95 130 157 95 130 157 95 130 157 86 123 154 86 123 154 86 123 154 -+86 123 154 114 140 160 188 208 220 249 251 252 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 151 182 203 -+86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 66 107 134 -+1 36 66 0 22 43 0 16 33 0 2 5 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 5 11 0 37 70 -+0 49 91 0 51 95 54 103 137 95 130 157 86 123 154 86 123 154 -+86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 -+86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 -+86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 -+126 153 173 227 236 241 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 198 215 225 -+86 123 154 86 123 154 86 123 154 86 123 154 66 107 134 86 123 154 -+36 91 133 0 25 48 0 22 43 0 12 24 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 4 9 0 38 72 0 50 94 -+0 51 95 1 56 100 70 116 150 86 123 154 86 123 154 86 123 154 -+86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 -+86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 -+86 123 154 86 123 154 86 123 154 86 123 154 70 116 150 126 153 173 -+240 245 247 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 198 215 225 -+86 123 154 78 123 153 86 123 154 66 107 134 66 107 134 66 107 134 -+66 107 134 0 31 57 0 24 47 0 22 43 0 12 24 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 2 0 39 73 0 51 95 0 53 98 -+0 53 98 9 67 112 70 116 150 78 123 153 70 116 150 70 116 150 -+70 116 150 70 116 150 78 123 153 78 123 153 78 123 153 78 123 153 -+78 123 153 78 123 153 78 123 153 78 123 153 78 123 153 78 123 153 -+78 123 153 70 116 150 78 123 153 65 110 142 115 143 164 227 236 241 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 158 185 204 -+66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 -+66 107 134 1 36 66 0 26 50 0 25 48 0 22 43 0 9 19 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 22 43 0 53 98 0 54 101 0 54 98 -+0 53 98 12 74 126 70 116 150 70 116 150 70 116 150 70 116 150 -+70 116 150 70 116 150 70 116 150 70 116 150 70 116 150 70 116 150 -+70 116 150 70 116 150 70 116 150 70 116 150 70 116 150 70 116 150 -+70 116 150 70 116 150 70 116 150 86 123 154 213 228 238 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 188 208 220 78 123 153 -+66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 -+66 107 134 1 36 66 0 27 51 0 27 51 0 24 47 0 20 39 -+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 2 5 0 42 78 0 54 101 0 55 102 0 55 102 -+0 55 102 9 67 112 65 110 142 70 116 150 65 110 142 70 116 150 -+70 116 150 65 110 142 65 110 142 70 116 150 70 116 150 65 110 142 -+70 116 150 65 110 142 65 110 142 70 116 150 65 110 142 65 110 142 -+65 110 142 65 110 142 65 110 142 163 190 208 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 249 251 252 205 221 232 163 190 208 139 173 197 139 173 197 -+151 182 203 163 190 208 163 190 208 125 160 184 70 116 150 66 107 134 -+66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 -+66 107 134 1 36 66 0 28 53 0 28 53 0 27 51 0 22 43 -+0 4 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 32 60 0 54 101 0 57 102 2 58 106 2 58 106 -+2 58 106 9 67 112 65 110 142 65 110 142 65 110 142 65 110 142 -+65 110 142 65 110 142 65 110 142 65 110 142 58 111 150 65 110 142 -+65 110 142 65 110 142 65 110 142 65 110 142 65 110 142 65 110 142 -+65 110 142 58 105 140 100 132 157 240 245 247 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+198 215 225 108 139 162 65 110 142 54 103 137 54 103 137 54 103 137 -+54 103 137 54 103 137 54 103 137 66 107 134 66 107 134 66 107 134 -+66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 -+66 107 134 1 36 66 0 29 55 0 29 54 0 28 53 0 26 50 -+0 14 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 9 19 0 53 98 0 57 102 2 58 106 2 58 106 0 60 110 -+0 60 110 1 61 111 44 99 139 56 105 142 56 105 142 56 105 142 -+56 105 142 56 105 142 56 105 142 56 105 142 56 105 142 56 105 142 -+56 105 142 56 105 142 56 105 142 56 105 142 56 105 142 56 105 142 -+56 105 142 50 102 142 175 199 215 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 151 182 203 -+54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 -+54 103 137 54 103 137 54 103 137 54 103 137 66 107 134 66 107 134 -+66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 -+36 91 133 0 38 70 0 30 56 0 29 55 0 28 53 0 27 51 -+0 24 47 0 14 29 0 0 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 35 67 2 58 106 2 58 106 2 58 106 0 60 110 0 60 110 -+0 61 112 0 61 112 23 84 135 56 105 142 50 104 143 50 104 143 -+50 104 143 50 104 143 50 104 143 50 104 143 50 104 143 50 104 143 -+50 104 143 50 104 143 50 104 143 50 104 143 50 102 142 50 102 142 -+50 102 142 70 116 150 227 236 241 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 158 185 204 44 99 139 -+54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 -+54 103 137 54 103 137 36 91 133 36 91 133 36 91 133 54 103 137 -+54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 -+9 67 112 0 41 75 0 32 60 0 30 56 0 29 54 0 28 53 -+0 27 51 0 20 39 0 4 9 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 11 -+0 50 95 2 58 106 0 60 110 0 60 110 0 61 112 0 61 112 -+1 62 114 1 62 114 5 67 116 42 97 140 50 102 142 50 102 142 -+50 102 142 50 102 142 50 102 142 50 102 142 50 102 142 50 102 142 -+50 102 142 50 102 142 50 102 142 50 102 142 50 102 142 50 102 142 -+38 94 135 117 151 174 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 205 221 232 54 103 137 36 91 133 -+38 94 135 38 94 135 38 94 135 36 91 133 36 91 133 36 91 133 -+36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 -+38 94 135 54 103 137 38 94 135 38 94 135 54 103 137 36 91 133 -+0 47 84 0 44 81 1 36 66 0 30 57 0 29 55 0 28 53 -+0 27 51 0 22 43 0 9 19 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 39 -+0 57 102 0 60 110 0 60 110 0 61 112 0 63 115 0 63 115 -+0 63 115 0 63 115 0 63 115 12 74 126 42 97 140 42 97 140 -+42 97 140 42 97 140 42 97 140 42 97 140 42 97 140 42 97 140 -+42 97 140 42 97 140 42 97 140 42 97 140 42 97 140 42 97 140 -+37 92 135 151 182 203 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 117 151 174 33 89 133 36 91 133 -+36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 -+36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 -+36 91 133 38 94 135 36 91 133 36 91 133 36 91 133 2 60 104 -+0 47 84 0 47 84 0 38 70 0 31 58 0 30 56 0 29 54 -+0 28 53 0 25 48 0 16 33 0 2 5 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 76 -+0 60 110 0 61 112 0 63 115 0 63 115 0 64 119 0 64 119 -+0 64 119 0 66 119 0 66 119 0 67 125 23 84 135 42 97 140 -+42 97 140 39 95 138 42 97 140 37 101 144 37 101 144 42 97 140 -+42 97 140 42 97 140 42 97 140 42 97 140 39 95 138 39 95 138 -+42 97 140 188 208 220 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 227 236 241 58 105 140 33 89 133 36 91 133 -+36 91 133 36 91 133 36 91 133 33 89 133 33 89 133 33 89 133 -+33 89 133 33 89 133 33 89 133 33 89 133 33 89 133 33 89 133 -+33 89 133 36 91 133 36 91 133 36 91 133 9 67 112 0 50 89 -+0 50 89 0 47 84 0 41 75 0 32 60 0 31 58 0 30 56 -+0 29 54 0 27 51 0 24 47 0 9 19 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 16 33 2 58 106 -+0 61 112 0 63 115 0 63 115 0 64 119 0 64 119 0 66 119 -+0 66 119 0 66 119 0 67 125 0 67 125 0 67 125 16 83 138 -+39 95 138 39 95 138 37 101 144 37 101 144 37 101 144 39 95 138 -+39 95 138 39 95 138 39 95 138 39 95 138 37 92 135 33 89 133 -+37 101 144 205 221 232 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 188 208 220 36 91 133 33 89 133 33 89 133 -+33 89 133 33 89 133 33 89 133 33 89 133 33 89 133 33 89 133 -+33 89 133 33 89 133 33 89 133 9 67 112 9 67 112 9 67 112 -+9 67 112 33 89 133 33 89 133 9 67 112 0 50 89 0 50 89 -+0 50 89 0 47 84 0 43 79 0 33 61 0 31 59 0 30 56 -+0 29 54 0 28 53 0 26 50 0 14 29 0 0 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 45 84 0 63 115 -+0 63 115 0 64 119 0 64 119 0 66 119 0 67 125 0 67 125 -+0 67 125 0 68 127 0 68 127 0 68 127 0 68 127 0 68 127 -+13 81 137 23 87 136 23 87 136 23 87 136 23 87 136 23 87 136 -+23 87 136 23 87 136 23 87 136 23 87 136 23 87 136 23 87 136 -+37 101 144 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 175 199 215 33 89 133 23 84 135 33 89 133 -+23 84 135 23 84 135 33 89 133 33 89 133 12 74 126 12 74 126 -+12 74 126 9 67 112 9 67 112 9 67 112 9 67 112 9 67 112 -+9 67 112 9 67 112 9 67 112 0 55 96 0 55 96 0 50 89 -+0 50 89 0 50 89 0 44 81 0 34 63 0 32 60 0 31 58 -+0 30 56 0 29 54 0 26 50 0 20 39 0 4 9 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 5 11 0 61 112 0 63 115 -+0 63 115 0 64 119 0 66 119 1 68 121 0 67 125 0 67 125 -+0 68 127 0 68 127 0 68 127 0 68 127 0 68 127 1 73 132 -+1 73 132 6 78 137 16 83 138 19 86 138 19 86 138 19 86 138 -+19 86 138 19 86 138 19 86 138 19 86 138 23 87 136 19 86 138 -+37 101 144 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 163 190 208 12 74 126 12 74 126 12 74 126 -+12 74 126 12 74 126 12 74 126 12 74 126 9 67 112 9 67 112 -+9 67 112 9 67 112 9 67 112 9 67 112 9 67 112 9 67 112 -+3 53 95 1 56 100 0 59 102 0 55 96 0 55 96 0 55 96 -+0 50 89 0 50 89 0 44 81 0 34 63 0 32 60 0 31 58 -+0 31 57 0 29 54 0 27 51 0 20 39 0 7 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 12 24 0 64 119 0 64 119 -+0 64 119 0 66 119 0 67 125 0 67 125 0 68 127 0 68 127 -+0 68 127 0 68 127 1 73 132 1 73 132 1 73 132 1 73 132 -+1 75 135 1 73 132 0 74 137 8 80 139 16 83 138 19 86 138 -+19 86 138 19 86 138 19 86 138 19 86 138 16 83 138 16 83 138 -+37 101 144 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 158 185 204 12 74 126 12 74 126 12 74 126 -+12 74 126 12 74 126 12 74 126 9 67 112 9 67 112 9 67 112 -+9 67 112 9 67 112 9 67 112 9 67 112 4 62 107 3 53 95 -+0 46 85 0 55 96 0 59 102 0 59 102 0 55 96 0 55 96 -+0 50 89 0 50 89 0 44 81 0 35 64 0 33 61 0 31 59 -+0 30 57 0 29 54 0 28 53 0 24 47 0 12 24 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 31 59 0 64 119 0 66 119 -+0 66 119 0 67 125 0 67 125 0 68 127 0 68 127 0 68 127 -+0 68 127 1 73 132 1 73 132 0 74 137 0 74 137 0 74 137 -+0 74 137 0 74 137 1 75 137 0 74 137 1 75 137 6 79 140 -+8 80 139 8 80 139 16 83 138 16 83 138 13 81 137 8 80 139 -+23 87 136 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 158 185 204 12 74 126 9 72 124 9 72 124 -+7 70 121 9 67 112 9 67 112 9 67 112 9 67 112 9 67 112 -+9 67 112 4 62 107 2 60 104 3 53 95 0 49 89 0 45 86 -+0 48 88 2 60 104 0 59 102 0 59 102 0 55 96 0 55 96 -+0 50 89 0 50 89 0 43 79 0 35 64 0 34 63 0 32 60 -+0 31 58 0 30 56 0 28 53 0 26 50 0 14 29 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 0 49 92 0 66 119 0 66 119 -+0 67 125 0 67 125 0 68 127 0 68 127 1 73 132 1 73 132 -+1 73 132 1 73 132 1 75 135 0 74 137 0 74 137 1 75 137 -+1 75 137 1 75 137 1 75 137 1 75 137 1 75 137 1 75 137 -+1 75 137 4 77 138 4 78 138 7 79 141 8 80 139 4 77 138 -+19 86 138 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 158 185 204 6 69 123 4 69 121 5 67 116 -+9 67 112 9 67 112 9 67 112 9 67 112 9 67 112 4 62 107 -+2 60 104 0 54 98 0 50 94 0 49 92 0 48 90 0 46 85 -+0 55 96 5 66 110 2 60 104 0 59 102 0 55 96 0 55 96 -+0 55 96 0 50 89 0 41 75 0 34 65 0 33 63 0 33 61 -+0 31 59 0 29 55 0 29 54 0 27 51 0 20 39 0 5 11 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 2 5 2 58 106 1 68 121 0 67 125 -+0 67 125 0 68 127 0 68 127 1 73 132 1 73 132 1 75 135 -+0 74 137 0 74 137 1 75 137 1 75 137 4 77 138 4 77 138 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 -+6 78 141 1 75 137 1 75 137 1 75 137 1 75 137 0 74 137 -+16 83 138 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 158 185 204 1 68 121 1 65 118 1 65 118 -+4 65 114 1 62 114 1 61 111 0 60 110 2 58 106 0 55 102 -+0 54 101 0 53 98 0 51 95 0 50 93 0 48 90 0 52 94 -+0 64 112 5 66 110 2 60 104 0 59 102 0 59 102 0 55 96 -+0 55 96 0 50 89 0 39 73 0 35 64 0 34 63 0 33 63 -+0 32 60 0 30 57 0 29 54 0 28 53 0 22 43 0 9 19 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 5 11 0 64 119 0 66 119 0 67 125 -+0 68 127 0 68 127 0 68 127 1 73 132 1 75 135 0 74 137 -+0 74 137 1 75 137 1 75 137 4 77 138 4 77 138 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 -+6 78 141 6 78 141 4 77 138 4 77 138 1 75 137 0 74 137 -+16 83 138 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 151 182 203 0 66 119 0 63 115 0 63 115 -+1 62 114 0 60 110 0 60 110 2 58 106 0 57 102 0 55 102 -+0 54 101 0 54 98 0 51 95 0 49 93 0 52 94 0 64 112 -+0 64 112 5 66 110 2 60 104 0 59 102 0 59 102 0 55 96 -+0 55 96 0 50 89 0 37 69 0 35 67 0 35 64 0 33 63 -+0 32 60 0 30 56 0 29 54 0 28 53 0 24 47 0 12 24 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 7 15 0 67 125 0 67 125 0 68 127 -+0 68 127 0 68 127 1 73 132 1 73 132 0 74 137 0 74 137 -+1 75 137 1 75 137 4 77 138 6 78 141 6 78 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 1 75 137 0 74 137 -+7 79 141 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 151 182 203 0 64 119 0 63 115 1 62 114 -+0 61 112 0 60 110 0 60 110 2 58 106 0 55 102 0 55 102 -+0 54 101 0 53 98 0 51 95 0 57 102 0 64 112 5 67 116 -+0 64 112 5 66 110 2 60 104 2 60 104 0 59 102 0 55 96 -+0 55 96 0 43 79 0 36 67 0 36 67 0 35 64 0 34 63 -+0 33 61 0 31 57 0 29 55 0 28 53 0 24 47 0 7 15 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 7 15 0 67 125 0 67 125 0 68 127 -+0 68 127 1 73 132 1 73 132 1 75 135 1 75 137 1 75 137 -+1 75 137 1 75 137 6 78 141 6 78 141 6 78 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 7 79 141 -+7 79 141 7 79 141 7 79 141 7 79 141 7 79 141 7 79 141 -+37 101 144 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 198 215 225 23 87 136 12 74 126 12 74 126 -+12 74 126 9 72 124 9 72 124 9 67 112 2 58 106 0 53 101 -+0 57 102 0 60 110 0 64 112 1 68 121 1 68 121 5 67 116 -+0 64 112 5 66 110 4 62 107 2 60 104 0 59 102 0 59 102 -+0 50 89 0 40 74 0 37 69 0 35 67 0 34 65 0 34 63 -+0 33 61 0 31 58 0 30 56 0 29 54 0 25 48 0 4 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 4 9 0 67 125 0 67 125 0 68 127 -+0 68 127 1 73 132 1 73 132 0 74 137 1 75 137 1 75 137 -+4 77 138 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 -+7 79 141 7 79 141 39 124 175 39 124 175 118 157 183 175 199 215 -+205 221 232 209 226 237 209 226 237 209 226 237 209 226 237 209 226 237 -+209 226 237 249 251 252 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 227 236 241 205 221 232 205 221 232 -+205 221 232 205 221 232 205 221 232 198 215 225 151 182 203 49 111 152 -+2 73 127 7 77 127 2 73 127 2 73 127 1 68 121 5 67 116 -+0 64 112 5 66 110 4 62 107 2 60 104 0 59 102 0 59 102 -+0 43 79 0 38 72 0 38 70 0 36 67 0 35 64 0 34 63 -+0 33 61 0 31 58 0 30 56 0 29 54 0 25 48 0 5 11 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 0 68 127 -+1 73 132 1 73 132 1 75 135 0 74 137 1 75 137 1 75 137 -+6 78 141 6 78 141 6 78 141 7 79 141 7 79 141 39 124 175 -+39 124 175 39 124 175 39 124 175 132 167 191 249 251 252 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 227 236 241 -+59 119 159 2 73 127 2 73 127 2 73 127 1 68 121 1 68 121 -+5 67 116 5 66 110 5 66 110 2 60 104 0 59 102 0 50 89 -+0 40 74 0 39 73 0 38 70 0 37 69 1 36 66 0 34 63 -+0 32 60 0 31 59 0 30 56 0 29 54 0 25 48 0 7 15 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 0 68 127 -+1 73 132 1 73 132 0 74 137 0 74 137 1 75 137 4 77 138 -+6 78 141 6 78 141 7 79 141 39 124 175 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 227 236 241 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+175 199 215 13 81 137 2 73 127 2 73 127 1 68 121 1 68 121 -+5 67 116 5 66 110 5 66 110 2 60 104 0 52 94 0 42 78 -+0 40 74 0 40 74 0 38 71 0 37 69 0 36 67 0 33 63 -+0 33 61 0 31 59 0 30 56 0 29 54 0 27 51 0 12 24 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 1 73 132 -+1 73 132 1 75 135 0 74 137 1 75 137 1 75 137 1 75 137 -+7 79 141 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 -+39 124 175 39 124 175 66 128 168 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+227 236 241 37 101 144 2 73 127 2 73 127 1 68 121 1 68 121 -+5 67 116 0 64 112 5 66 110 0 55 96 0 43 79 0 42 78 -+0 40 76 0 40 74 0 38 71 0 37 69 0 36 67 0 34 63 -+0 34 63 0 31 59 0 30 56 0 29 54 0 28 53 0 12 24 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 1 73 132 -+1 73 132 1 75 135 0 74 137 1 75 137 1 75 137 7 79 141 -+39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+213 228 238 37 101 144 2 73 127 2 73 127 1 68 121 1 68 121 -+5 67 116 0 64 112 0 52 94 0 44 82 0 42 78 0 42 78 -+0 40 76 0 40 74 0 38 71 0 37 69 0 36 67 0 34 63 -+0 34 63 0 31 59 0 30 56 0 29 54 0 27 51 0 12 24 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 1 73 132 -+1 73 132 1 75 135 0 74 137 0 74 137 7 79 141 39 124 175 -+39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 209 226 237 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+151 182 203 7 77 127 2 73 127 2 73 127 1 68 121 1 68 121 -+2 60 104 0 50 89 0 45 84 0 44 82 0 43 79 0 42 78 -+0 40 76 0 40 74 0 38 71 0 37 69 0 36 67 0 34 63 -+0 34 63 0 31 59 0 30 56 0 29 54 0 28 53 0 14 29 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 1 73 132 -+1 73 132 0 74 137 0 74 137 6 78 141 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 39 124 175 213 228 238 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 188 208 220 -+37 101 144 2 73 127 2 73 127 1 68 121 0 64 112 0 54 98 -+0 49 91 0 47 87 0 46 85 0 45 83 0 43 79 0 42 78 -+0 40 76 0 40 74 0 38 71 0 37 69 0 36 67 0 34 63 -+0 34 63 0 31 59 0 30 56 0 29 54 0 28 53 0 12 24 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 2 0 67 125 0 68 127 1 73 132 -+1 73 132 1 73 132 0 74 137 7 79 141 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 118 157 183 -+142 177 202 142 177 202 142 177 202 142 177 202 142 177 202 142 177 202 -+188 208 220 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 205 221 232 139 173 197 139 173 197 139 173 197 -+132 167 191 132 167 191 132 167 191 125 160 184 83 131 163 7 77 127 -+0 64 112 0 64 112 0 57 102 0 53 98 0 49 93 0 48 90 -+0 48 88 0 47 87 0 46 85 0 45 83 0 43 79 0 42 78 -+0 40 74 0 40 74 0 38 70 0 37 69 0 35 64 0 34 63 -+0 32 60 0 31 59 0 30 56 0 29 54 0 27 51 0 12 24 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 67 125 0 68 127 8 76 132 -+16 83 138 13 81 137 7 79 141 39 124 175 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 -+39 124 175 7 79 141 7 79 141 7 79 141 6 78 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 0 74 137 -+19 86 138 227 236 241 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 151 182 203 0 64 119 0 64 119 0 63 115 -+0 61 112 0 60 110 0 60 110 0 55 102 0 53 101 0 55 102 -+0 55 102 0 54 98 0 53 98 0 51 95 0 50 94 0 49 91 -+0 48 88 0 46 85 0 45 84 0 44 82 0 43 79 0 42 78 -+0 40 74 0 40 74 0 37 69 0 36 67 0 35 67 0 34 63 -+0 33 61 0 31 58 0 30 56 0 29 54 0 25 48 0 7 15 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 67 125 6 74 130 23 87 136 -+37 101 144 37 101 144 39 124 175 39 124 175 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 7 79 141 -+6 78 141 6 78 141 6 78 141 7 79 141 7 79 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 1 75 137 -+7 79 141 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 151 182 203 0 67 125 0 64 119 0 64 119 -+0 63 115 0 61 112 0 61 112 0 60 110 2 58 106 0 57 102 -+0 55 102 0 56 101 0 53 98 0 50 95 0 49 93 0 49 91 -+0 48 88 0 45 86 0 44 83 0 44 81 0 42 78 0 42 78 -+0 40 74 0 38 72 0 38 70 0 35 67 0 34 65 0 34 63 -+0 33 61 0 31 57 0 30 56 0 28 53 0 24 47 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 64 119 15 82 136 37 101 144 -+49 111 152 48 117 162 39 124 175 39 124 175 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 39 124 175 7 79 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 1 75 137 -+16 83 138 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 151 182 203 0 67 125 0 64 119 0 64 119 -+0 63 115 1 62 114 0 60 110 0 60 110 2 58 106 0 57 102 -+0 55 102 0 54 101 0 53 98 0 51 95 0 50 93 0 48 90 -+0 48 88 0 46 85 0 45 83 0 44 81 0 42 78 0 40 76 -+0 40 74 0 38 72 0 37 69 0 36 67 0 35 64 0 34 63 -+0 33 61 0 31 57 0 29 55 0 27 51 0 24 47 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 2 1 65 118 33 89 133 54 113 152 -+72 126 163 66 128 168 66 128 168 39 124 175 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 7 79 141 6 78 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 0 74 137 -+16 83 138 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 158 185 204 0 67 125 0 64 119 0 64 119 -+0 63 115 0 61 112 0 60 110 0 60 110 2 58 106 0 57 102 -+0 55 102 0 54 101 0 53 98 0 51 95 0 50 93 0 48 90 -+0 47 87 0 46 85 0 44 83 0 44 81 0 42 78 0 40 76 -+0 40 74 0 38 72 0 37 69 0 36 67 0 35 64 0 33 63 -+0 33 61 0 31 57 0 29 55 0 29 54 0 12 24 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 2 5 5 67 116 42 97 140 72 126 163 -+83 131 163 118 157 183 83 131 163 66 128 168 39 124 175 39 124 175 -+39 124 175 39 124 175 39 124 175 7 79 141 6 78 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 1 75 137 0 74 137 -+16 83 138 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 151 182 203 0 64 119 0 63 115 0 63 115 -+1 62 114 0 60 110 0 60 110 2 58 106 0 57 102 0 55 102 -+0 54 101 0 53 98 0 51 95 0 50 93 0 49 91 0 48 88 -+0 47 87 0 45 84 0 44 82 0 42 78 0 42 78 0 41 75 -+0 38 72 0 38 71 0 37 69 0 35 67 0 34 63 0 33 61 -+0 31 59 0 30 57 0 29 54 0 29 54 0 5 11 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 2 5 9 72 124 50 109 150 83 131 163 -+117 151 174 118 157 183 118 157 183 66 128 168 39 124 175 39 124 175 -+39 124 175 39 124 175 7 79 141 6 78 141 6 78 141 6 78 141 -+6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 -+6 78 141 4 77 138 4 77 138 4 77 138 1 75 137 0 74 137 -+16 83 138 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 151 182 203 0 64 119 0 63 115 0 63 115 -+0 61 112 0 60 110 0 60 110 2 58 106 0 57 102 0 55 102 -+0 54 101 0 53 98 0 51 95 0 50 93 0 49 91 0 48 88 -+0 47 87 0 45 84 0 44 82 0 43 79 0 42 78 0 41 75 -+0 39 73 0 38 71 0 36 67 0 35 67 0 34 63 0 33 61 -+0 31 59 0 30 56 0 28 53 0 22 43 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 2 9 67 112 58 111 150 107 142 167 -+118 157 183 142 177 202 132 167 191 118 157 183 66 128 168 39 124 175 -+7 79 141 39 124 175 7 79 141 0 74 137 1 75 137 1 75 137 -+1 75 137 1 75 137 1 75 137 1 75 137 4 77 138 1 75 137 -+1 75 137 1 75 137 1 75 137 1 75 137 0 74 137 1 73 132 -+13 81 137 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 151 182 203 0 64 119 1 62 114 0 61 112 -+0 60 110 0 60 110 2 58 106 0 57 102 0 55 102 0 54 101 -+0 53 98 0 53 98 0 50 93 0 49 91 0 48 88 0 47 87 -+0 46 85 0 44 82 0 43 79 0 42 78 0 40 76 0 40 74 -+0 38 71 0 37 69 0 35 67 0 35 64 0 34 63 0 32 60 -+0 31 58 0 30 56 0 26 50 0 12 24 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 53 95 68 118 153 107 142 167 -+132 167 191 151 182 203 142 177 202 132 167 191 66 128 168 39 124 175 -+7 79 141 7 79 141 7 79 141 0 74 137 0 74 137 1 75 137 -+1 75 137 1 75 137 1 75 137 1 75 137 1 75 137 1 75 137 -+1 75 137 0 74 137 0 74 137 0 74 137 1 73 132 1 73 132 -+13 81 137 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 151 182 203 0 63 115 0 61 112 0 60 110 -+0 60 110 2 58 106 2 58 106 0 55 102 0 54 101 0 53 98 -+0 53 98 0 51 95 0 49 92 0 48 90 0 47 87 0 46 85 -+0 45 84 0 44 81 0 42 78 0 42 78 0 40 74 0 40 74 -+0 38 70 0 37 69 1 36 66 0 34 63 0 33 61 0 31 59 -+0 30 57 0 29 54 0 22 43 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 3 53 95 68 118 153 117 151 174 -+151 182 203 175 199 215 163 190 208 142 177 202 118 157 183 39 124 175 -+39 124 175 7 79 141 7 79 141 1 73 132 0 74 137 0 74 137 -+0 74 137 0 74 137 1 75 137 1 75 137 0 74 137 0 74 137 -+0 74 137 1 75 135 1 75 135 0 74 137 1 73 132 0 68 127 -+16 83 138 227 236 241 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 142 177 202 1 62 114 0 61 112 0 60 110 -+0 60 110 2 58 106 2 58 106 0 55 102 0 54 101 0 53 98 -+0 53 98 0 51 95 0 50 93 0 48 90 0 47 87 0 46 85 -+0 45 84 0 44 81 0 42 78 0 42 78 0 40 74 0 38 72 -+0 38 70 0 37 69 0 35 64 0 34 63 0 33 61 0 31 59 -+0 31 57 0 29 55 0 14 29 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 9 67 112 68 118 153 118 157 183 -+158 185 204 188 208 220 188 208 220 151 182 203 118 157 183 66 128 168 -+39 124 175 7 79 141 6 79 140 0 68 127 1 73 132 1 73 132 -+1 73 132 1 73 132 1 75 135 1 75 135 0 74 137 1 73 132 -+1 73 132 1 73 132 1 73 132 1 73 132 0 68 127 0 67 125 -+19 86 138 240 245 247 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 132 167 191 2 58 106 0 60 110 0 60 110 -+2 58 106 2 58 106 0 57 102 0 54 101 0 53 98 0 53 98 -+0 51 95 0 50 93 0 48 90 0 47 87 0 46 85 0 45 84 -+0 44 82 0 43 79 0 42 78 0 41 75 0 39 73 0 38 71 -+0 37 69 0 36 67 0 34 63 0 33 61 0 32 60 0 31 58 -+0 30 56 0 27 51 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 12 74 126 68 118 153 118 157 183 -+163 190 208 205 221 232 205 221 232 175 199 215 139 173 197 66 128 168 -+39 124 175 7 79 141 7 79 141 1 73 132 0 68 127 1 73 132 -+1 73 132 1 73 132 1 73 132 1 73 132 1 73 132 1 73 132 -+1 73 132 1 73 132 0 68 127 0 68 127 0 68 127 0 64 119 -+77 129 164 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 107 142 167 0 53 101 0 60 110 2 58 106 -+2 58 106 0 57 102 0 55 102 0 54 101 0 53 98 0 51 95 -+0 51 95 0 50 93 0 48 90 0 47 87 0 46 85 0 45 83 -+0 44 81 0 42 78 0 42 78 0 40 74 0 38 72 0 38 70 -+0 37 69 0 36 67 0 34 63 0 33 61 0 31 59 0 30 56 -+0 29 54 0 16 33 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 12 74 126 70 116 150 120 155 180 -+163 190 208 209 226 237 213 228 238 188 208 220 142 177 202 83 131 163 -+39 124 175 7 79 141 7 79 141 1 75 135 0 68 127 0 68 127 -+0 68 127 0 68 127 0 68 127 0 68 127 0 68 127 0 68 127 -+0 68 127 0 68 127 0 68 127 0 68 127 0 67 125 0 64 119 -+175 199 215 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 249 251 252 68 118 153 0 55 102 2 58 106 2 58 106 -+0 55 102 0 55 102 0 54 101 0 53 98 0 51 95 0 50 94 -+0 49 92 0 48 90 0 47 87 0 46 85 0 45 83 0 44 81 -+0 43 79 0 42 78 0 40 74 0 39 73 0 38 70 0 37 69 -+0 36 67 0 35 64 0 33 63 0 32 60 0 31 58 0 29 54 -+0 22 43 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 12 74 126 70 116 150 120 155 180 -+163 190 208 213 228 238 240 245 247 198 215 225 142 177 202 118 157 183 -+39 124 175 7 79 141 7 79 141 6 79 140 0 67 125 0 67 125 -+0 67 125 0 67 125 0 68 127 0 68 127 0 68 127 0 67 125 -+0 67 125 0 67 125 0 67 125 0 67 125 1 62 114 69 126 163 -+240 245 247 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 227 236 241 12 74 126 2 58 106 2 58 106 0 57 102 -+0 56 101 0 54 101 0 53 98 0 51 95 0 51 95 0 50 93 -+0 48 90 0 48 88 0 46 85 0 45 84 0 44 82 0 43 79 -+0 42 78 0 40 76 0 40 74 0 38 71 0 37 69 0 36 67 -+0 35 67 0 35 64 0 33 61 0 31 59 0 30 56 0 27 51 -+0 9 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 9 67 112 56 105 142 117 151 174 -+158 185 204 209 226 237 240 245 247 198 215 225 151 182 203 118 157 183 -+49 121 167 7 79 141 7 79 141 7 79 141 4 78 138 0 66 119 -+0 66 119 1 68 121 0 67 125 0 67 125 0 67 125 0 67 125 -+0 67 125 0 66 119 0 66 119 0 63 115 39 95 138 213 228 238 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 158 185 204 0 53 101 2 58 106 0 55 102 0 55 102 -+0 54 101 0 53 98 0 53 98 0 50 94 0 50 93 0 49 91 -+0 48 88 0 47 87 0 46 85 0 44 83 0 44 81 0 42 78 -+0 42 78 0 40 74 0 39 73 0 38 70 0 36 67 0 35 67 -+0 34 65 0 34 63 0 32 60 0 30 57 0 29 54 0 16 33 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 4 62 107 54 103 137 107 142 167 -+151 182 203 198 215 225 227 236 241 198 215 225 158 185 204 118 157 183 -+49 121 167 7 79 141 7 79 141 7 79 141 7 79 141 4 78 138 -+0 66 119 0 63 115 0 64 119 0 64 119 0 64 119 0 64 119 -+0 63 115 1 62 114 0 60 110 58 111 150 205 221 232 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+249 251 252 65 110 142 0 53 101 0 55 102 0 54 101 0 54 101 -+0 53 98 0 53 98 0 51 95 0 50 93 0 48 90 0 48 88 -+0 47 87 0 46 85 0 45 83 0 44 81 0 43 79 0 42 78 -+0 41 75 0 39 73 0 38 70 0 37 69 0 36 67 0 35 64 -+0 34 63 0 33 61 0 31 58 0 30 56 0 24 47 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 0 57 102 36 91 133 95 130 157 -+132 167 191 175 199 215 205 221 232 198 215 225 158 185 204 118 157 183 -+58 122 163 19 86 138 6 79 140 6 79 140 6 79 140 6 79 140 -+4 78 138 13 81 137 7 73 126 1 65 118 0 63 115 0 66 119 -+12 74 126 44 99 139 139 173 197 240 245 247 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+175 199 215 4 62 107 0 53 101 0 54 101 0 53 98 0 53 98 -+0 51 95 0 50 94 0 50 93 0 48 90 0 47 87 0 47 87 -+0 46 85 0 45 84 0 44 81 0 42 78 0 42 78 0 40 74 -+0 40 74 0 38 71 0 37 69 0 36 67 0 35 64 0 34 63 -+0 33 63 0 31 59 0 29 55 0 26 50 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 53 98 33 89 133 78 123 153 -+120 155 180 158 185 204 188 208 220 175 199 215 151 182 203 118 157 183 -+58 122 163 19 86 138 6 79 140 6 79 140 6 79 140 66 128 168 -+163 190 208 198 215 225 188 208 220 175 199 215 163 190 208 175 199 215 -+198 215 225 249 251 252 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 240 245 247 -+44 99 139 0 53 98 0 54 101 0 53 98 0 53 98 0 51 95 -+0 50 94 0 50 93 0 49 91 0 48 88 0 47 87 0 45 86 -+0 45 84 0 44 82 0 43 79 0 42 78 0 40 76 0 40 74 -+0 38 72 0 38 70 0 36 67 0 35 67 0 34 63 0 33 63 -+0 32 60 0 31 58 0 27 51 0 7 15 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 2 0 51 95 9 67 112 65 110 142 -+107 142 167 139 173 197 163 190 208 163 190 208 142 177 202 118 157 183 -+53 120 163 19 86 138 4 78 138 4 78 138 77 129 164 240 245 247 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 107 142 167 -+0 50 95 0 54 101 0 53 98 0 51 95 0 51 95 0 50 93 -+0 49 92 0 48 90 0 48 88 0 47 87 0 46 85 0 45 83 -+0 44 82 0 43 79 0 42 78 0 40 76 0 40 74 0 38 72 -+0 38 70 0 36 67 1 36 66 0 35 64 0 34 63 0 33 61 -+0 30 57 0 25 48 0 7 15 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 50 94 4 62 107 54 103 137 -+95 130 157 126 153 173 139 173 197 139 173 197 125 160 184 107 142 167 -+53 120 163 8 80 139 2 76 135 19 86 138 198 215 225 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 139 173 197 1 56 100 -+0 51 95 0 53 98 0 51 95 0 51 95 0 50 93 0 49 91 -+0 48 90 0 48 88 0 47 87 0 46 85 0 45 83 0 44 82 -+0 43 79 0 42 78 0 40 76 0 40 74 0 39 73 0 38 71 -+0 37 69 0 35 67 0 35 64 0 34 63 0 33 61 0 31 59 -+0 25 48 0 5 11 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 2 0 47 87 2 54 96 33 89 133 -+70 116 150 107 142 167 126 153 173 125 160 184 117 151 174 86 123 154 -+49 111 152 8 80 139 2 73 127 37 101 144 227 236 241 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 151 182 203 4 62 107 0 50 95 -+0 51 95 0 51 95 0 50 93 0 49 92 0 49 91 0 48 88 -+0 47 87 0 46 85 0 46 85 0 44 83 0 44 81 0 43 79 -+0 42 78 0 42 78 0 40 74 0 38 72 0 38 71 0 37 69 -+0 37 69 0 35 64 0 34 63 0 33 63 0 31 58 0 26 50 -+0 4 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 0 42 78 0 49 93 9 67 112 -+54 103 137 86 123 154 107 142 167 115 143 164 104 134 157 70 116 150 -+36 91 133 7 77 127 2 73 127 19 86 138 209 226 237 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 240 245 247 120 155 180 1 56 100 0 50 94 0 51 95 -+0 51 95 0 50 94 0 49 91 0 48 90 0 48 88 0 47 87 -+0 46 85 0 46 85 0 45 84 0 44 81 0 43 79 0 42 78 -+0 42 78 0 41 75 0 39 73 0 38 71 0 38 70 0 37 69 -+0 36 67 0 34 63 0 33 63 0 31 59 0 28 53 0 5 11 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 40 74 0 48 90 3 53 95 -+36 91 133 66 107 134 86 123 154 95 130 157 86 123 154 66 107 134 -+12 74 126 0 57 102 0 64 112 2 73 127 118 157 183 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+188 208 220 58 105 140 0 49 93 0 49 92 0 50 93 0 49 92 -+0 49 91 0 48 90 0 47 87 0 47 87 0 46 85 0 45 84 -+0 44 83 0 44 82 0 44 81 0 42 78 0 42 78 0 40 76 -+0 40 74 0 38 72 0 38 70 0 37 69 0 36 67 0 35 67 -+0 34 63 0 33 61 0 31 59 0 20 39 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 37 70 0 47 87 0 48 90 -+9 67 112 38 94 135 66 107 134 70 116 150 65 110 142 54 103 137 -+9 67 112 0 51 95 0 51 95 0 56 101 5 66 110 125 160 184 -+227 236 241 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 240 245 247 188 208 220 86 123 154 -+2 60 104 0 45 86 0 50 93 0 49 92 0 49 91 0 48 90 -+0 48 88 0 47 87 0 46 85 0 46 85 0 45 84 0 44 82 -+0 44 81 0 43 79 0 42 78 0 40 76 0 40 74 0 40 74 -+0 38 72 0 38 70 0 36 67 1 36 66 0 35 64 0 34 63 -+0 33 63 0 29 55 0 9 19 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 28 53 0 46 85 0 47 87 -+3 53 95 9 67 112 36 91 133 54 103 137 54 103 137 33 89 133 -+2 60 104 0 49 93 0 50 93 0 50 94 0 49 92 0 50 94 -+36 91 133 108 139 162 151 182 203 188 208 220 198 215 225 198 215 225 -+175 199 215 139 173 197 95 130 157 36 91 133 0 50 94 0 45 86 -+0 48 90 0 49 91 0 49 91 0 48 90 0 48 88 0 47 87 -+0 46 85 0 46 85 0 45 84 0 45 83 0 44 81 0 43 79 -+0 42 78 0 42 78 0 42 78 0 40 74 0 39 73 0 38 72 -+0 38 70 0 37 69 0 35 67 0 35 64 0 33 63 0 24 47 -+0 9 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 4 9 0 34 65 0 44 83 -+0 46 85 3 53 95 9 67 112 33 89 133 33 89 133 9 67 112 -+0 49 91 0 48 90 0 49 91 0 49 92 0 50 93 0 49 92 -+0 47 87 0 45 86 0 49 92 3 53 95 3 53 95 2 54 96 -+0 52 94 0 48 90 0 44 83 0 45 86 0 48 90 0 48 90 -+0 48 88 0 48 88 0 47 87 0 46 85 0 46 85 0 46 85 -+0 45 83 0 45 83 0 44 81 0 43 79 0 42 78 0 42 78 -+0 40 76 0 40 74 0 40 74 0 38 72 0 38 70 0 37 69 -+0 36 67 0 36 67 0 35 67 0 31 59 0 14 29 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 5 11 0 33 61 -+0 42 78 0 46 85 3 53 95 4 62 107 4 62 107 3 53 95 -+0 47 87 0 48 88 0 48 88 0 48 90 0 48 90 0 48 90 -+0 48 90 0 48 90 0 49 91 0 48 90 0 48 90 0 48 88 -+0 48 90 0 48 90 0 48 88 0 48 90 0 47 87 0 47 87 -+0 47 87 0 47 87 0 46 85 0 46 85 0 45 84 0 44 83 -+0 44 81 0 44 81 0 43 79 0 42 78 0 42 78 0 40 76 -+0 40 74 0 39 73 0 38 72 0 38 70 0 37 69 0 35 67 -+0 34 65 0 29 55 0 14 29 0 2 5 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 -+0 27 51 0 40 76 0 44 82 0 47 84 0 47 87 0 45 84 -+0 46 85 0 46 85 0 46 85 0 47 87 0 47 87 0 47 87 -+0 47 87 0 47 87 0 47 87 0 47 87 0 47 87 0 47 87 -+0 46 85 0 45 86 0 45 86 0 46 85 0 46 85 0 45 84 -+0 45 83 0 44 82 0 45 83 0 44 81 0 44 81 0 42 78 -+0 42 78 0 42 78 0 40 76 0 40 74 0 40 74 0 39 73 -+0 39 73 0 39 73 0 38 72 0 35 67 0 29 54 0 12 24 -+0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 5 11 0 14 29 0 22 43 0 27 51 0 26 50 -+0 24 47 0 29 54 0 31 58 0 36 67 0 36 67 0 40 74 -+0 40 74 0 40 74 0 44 81 0 46 85 0 47 87 0 47 87 -+0 47 87 0 47 87 0 47 87 0 47 87 0 45 86 0 46 85 -+0 45 84 0 45 84 0 45 84 0 44 83 0 44 81 0 43 79 -+0 43 79 0 42 78 0 41 75 0 38 71 0 36 67 0 34 63 -+0 16 33 0 7 15 0 5 11 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -diff --git a/drivers/video/logo/logo_fedorasimple_clut224.ppm b/drivers/video/logo/logo_fedorasimple_clut224.ppm -new file mode 100644 -index 000000000000..b9ba699fc9d8 ---- /dev/null -+++ b/drivers/video/logo/logo_fedorasimple_clut224.ppm -@@ -0,0 +1,1123 @@ -+P3 -+80 80 -+255 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 2 0 6 11 0 11 21 0 16 30 -+0 21 39 0 25 46 0 27 49 0 27 50 0 27 49 0 25 46 -+0 21 39 0 16 30 0 11 21 0 6 11 0 1 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 9 18 -+0 22 40 0 32 61 0 41 77 0 46 87 0 50 92 0 51 95 -+0 52 95 0 52 95 0 52 95 0 52 95 0 52 95 0 52 95 -+0 52 95 0 51 95 0 50 92 0 46 87 0 41 77 0 32 61 -+0 22 40 0 9 18 0 1 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 10 18 0 26 49 0 41 77 0 49 90 -+0 52 96 0 52 95 0 51 94 0 50 93 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 93 0 51 94 0 52 95 -+0 52 96 0 49 90 0 41 75 0 26 49 0 10 18 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 -+0 17 32 0 37 70 0 49 90 0 52 96 0 51 94 0 50 92 -+0 50 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 91 0 50 92 0 51 94 0 52 96 0 49 90 0 37 70 -+0 17 32 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 1 2 0 19 35 0 41 77 -+0 51 94 0 51 95 0 50 92 0 49 91 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 50 92 0 51 95 -+0 50 93 0 41 75 0 18 34 0 1 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 13 24 0 37 71 0 51 95 0 51 94 -+0 50 92 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 50 92 0 51 94 0 51 95 0 37 71 0 13 24 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 3 6 0 29 53 0 49 91 0 51 95 0 50 92 0 49 91 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 49 91 0 50 92 0 51 95 0 49 91 0 29 53 -+0 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 22 -+0 41 77 0 51 96 0 50 92 0 49 91 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 47 90 0 47 89 0 46 89 0 47 89 0 48 90 0 49 91 -+0 50 92 0 50 92 0 50 92 0 49 91 0 50 92 0 52 96 -+0 41 77 0 12 22 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 20 37 0 47 89 -+0 51 94 0 50 91 0 50 91 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 49 91 0 46 88 0 41 85 0 40 84 0 47 90 -+7 56 98 13 61 101 13 61 101 11 59 100 0 50 93 0 41 85 -+0 41 85 0 47 89 0 49 91 0 50 92 0 50 92 0 49 91 -+0 51 95 0 47 89 0 20 37 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 0 26 50 0 50 93 0 50 93 -+0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 43 86 0 43 86 17 64 103 62 116 154 144 169 189 190 205 217 -+217 226 233 227 235 240 232 238 242 221 230 237 194 209 220 144 169 189 -+62 116 154 1 57 102 0 45 88 0 47 88 0 49 91 0 50 92 -+0 49 91 0 50 93 0 50 93 0 27 49 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 2 0 30 57 0 51 96 0 50 92 0 49 91 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 45 88 0 43 86 -+48 88 122 156 179 196 232 238 242 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 189 213 227 24 107 158 0 65 113 0 50 92 0 47 89 -+0 49 91 0 50 92 0 50 92 0 51 95 0 30 57 0 1 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 30 57 0 51 95 0 50 92 0 50 91 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 49 91 0 41 84 17 64 103 156 179 196 -+247 250 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 196 216 229 0 110 172 0 93 151 0 63 110 -+0 46 88 0 49 90 0 50 92 0 50 92 0 51 96 0 31 59 -+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 29 53 0 51 95 0 50 92 0 50 91 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 49 91 0 40 84 59 105 139 221 230 237 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 81 154 196 0 104 168 0 107 168 -+0 78 129 0 49 91 0 48 89 0 50 92 0 50 92 0 52 95 -+0 29 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 43 -+0 51 94 0 50 92 0 50 91 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 48 91 0 40 84 89 138 172 247 250 251 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 132 174 200 0 102 165 0 108 169 -+0 110 172 0 88 143 0 50 93 0 48 90 0 50 92 0 50 92 -+0 51 94 0 23 43 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 14 27 0 49 91 -+0 50 92 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 40 84 79 130 164 252 253 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 81 154 196 0 102 165 0 107 168 -+0 108 169 0 110 172 0 89 144 0 49 92 0 48 90 0 50 92 -+0 50 92 0 49 91 0 14 27 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 6 11 0 44 82 0 50 93 -+0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 0 40 84 -+59 105 139 247 250 251 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 207 222 232 11 106 162 0 105 167 0 108 169 -+0 108 168 0 108 169 0 110 172 0 86 140 0 47 88 0 49 91 -+0 50 91 0 50 93 0 45 83 0 6 11 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 35 66 0 51 95 0 49 91 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 44 87 17 64 103 -+221 230 237 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 246 249 251 241 246 248 247 250 251 255 255 255 255 255 255 -+249 251 253 189 213 227 27 123 177 0 103 165 0 108 168 0 108 169 -+0 108 169 0 107 168 0 108 169 0 108 170 0 70 118 0 46 88 -+0 49 92 0 49 91 0 51 95 0 34 64 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 19 35 0 51 94 0 49 91 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 41 85 144 169 189 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 202 218 229 133 160 181 -+59 105 139 42 85 121 22 79 121 42 85 121 59 105 139 73 134 171 -+51 128 174 0 109 171 0 105 166 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 107 168 0 109 170 0 100 158 0 53 96 -+0 48 90 0 50 92 0 49 92 0 51 94 0 19 35 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 4 9 0 43 81 0 50 93 0 50 91 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 43 86 42 85 121 246 249 251 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 232 238 242 79 130 164 4 52 93 0 40 84 -+0 42 85 0 44 87 0 45 88 0 44 87 0 42 85 0 41 85 -+1 57 102 0 92 148 0 110 171 0 108 169 0 108 168 0 108 169 -+0 108 169 0 108 169 0 108 169 0 107 168 0 110 171 0 78 129 -+0 46 87 0 49 91 0 50 91 0 50 93 0 43 81 0 4 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 27 50 0 51 95 0 49 91 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 49 91 0 41 85 144 169 189 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 217 227 234 45 87 122 0 39 81 0 47 89 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 47 88 0 49 91 0 86 140 0 109 171 0 107 169 0 108 169 -+0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 101 162 -+0 52 96 0 48 90 0 50 92 0 49 91 0 51 95 0 27 50 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 6 11 0 47 86 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 45 88 17 64 103 227 235 240 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+236 240 243 45 87 122 0 40 84 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 48 89 0 48 90 0 88 143 0 109 171 0 107 168 -+0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 0 109 171 -+0 70 118 0 47 88 0 50 92 0 50 92 0 50 93 0 47 86 -+0 6 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 27 50 0 52 95 0 49 91 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 41 84 59 105 139 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+98 145 177 0 39 81 0 49 91 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 49 91 0 47 89 0 53 98 0 101 162 0 108 170 -+0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 110 171 -+0 86 140 0 47 88 0 49 91 0 50 92 0 49 91 0 51 95 -+0 26 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 7 -+0 44 84 0 50 93 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 49 91 0 40 84 133 160 181 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 217 226 233 -+7 56 98 0 46 88 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 49 91 0 46 87 0 78 129 0 110 171 -+0 107 168 0 108 169 0 108 169 0 108 169 0 108 169 0 108 170 -+0 98 155 0 50 93 0 49 90 0 50 92 0 50 92 0 50 93 -+0 44 82 0 3 7 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 37 -+0 51 95 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 48 90 0 44 87 174 198 214 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 133 160 181 -+0 40 84 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 47 89 1 57 102 0 105 166 -+0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 107 169 -+0 103 163 0 56 101 0 48 90 0 50 92 0 50 92 0 49 91 -+0 52 95 0 20 37 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 70 -+0 51 94 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 48 90 0 48 91 202 218 229 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 62 116 154 -+0 40 84 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 48 90 0 51 93 0 98 155 -+0 108 170 0 108 169 0 108 169 0 108 169 0 108 169 0 108 168 -+0 107 168 0 62 109 0 48 89 0 50 92 0 50 92 0 50 92 -+0 51 94 0 37 70 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 8 14 0 48 89 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 89 4 52 93 217 226 233 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 42 85 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 48 90 0 92 148 -+0 109 171 0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 -+0 108 169 0 64 111 0 47 88 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 89 0 8 14 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 21 39 0 52 95 -+0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 46 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 48 90 0 92 148 -+0 109 171 0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 -+0 108 169 0 64 111 0 47 88 0 50 92 0 50 92 0 50 92 -+0 49 91 0 52 95 0 21 39 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 34 64 0 51 94 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 48 90 0 51 93 0 98 155 -+0 108 170 0 108 169 0 108 169 0 108 169 0 108 169 0 108 168 -+0 107 168 0 62 109 0 48 89 0 50 92 0 50 92 0 50 92 -+0 50 92 0 51 94 0 34 62 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 2 4 0 43 81 0 50 93 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 47 89 1 57 102 0 105 166 -+0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 107 169 -+0 103 165 0 57 101 0 48 90 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 93 0 43 81 0 2 4 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 10 19 0 48 90 0 49 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 49 91 0 46 87 0 76 127 0 109 171 -+0 107 168 0 108 169 0 108 169 0 108 169 0 108 169 0 108 170 -+0 99 157 0 51 93 0 49 90 0 50 92 0 50 92 0 50 92 -+0 50 92 0 49 92 0 48 90 0 9 18 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 17 32 0 51 95 0 50 91 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 49 91 0 48 89 0 53 96 0 100 158 0 108 170 -+0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 109 171 -+0 86 140 0 47 88 0 49 91 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 91 0 51 95 0 17 32 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 25 47 0 52 95 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 48 90 0 48 89 0 86 140 0 109 171 0 107 168 -+0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 0 109 171 -+0 70 118 0 47 88 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 52 95 0 25 46 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 31 59 0 51 95 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 47 89 0 48 89 0 78 129 0 109 170 0 108 169 0 108 169 -+0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 101 162 -+0 53 96 0 48 90 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 51 95 0 31 59 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 35 66 0 51 94 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 49 91 0 49 91 -+0 48 90 0 47 89 0 47 89 0 47 89 0 47 89 0 47 89 -+0 47 89 0 44 87 4 54 96 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 42 85 121 -+0 40 84 0 47 89 0 47 89 0 47 89 0 47 89 0 47 89 -+0 47 89 0 48 90 0 49 90 0 48 90 0 47 88 0 46 87 -+0 57 101 0 89 144 0 109 171 0 108 169 0 107 168 0 108 169 -+0 108 169 0 108 169 0 108 169 0 107 168 0 110 171 0 78 129 -+0 47 88 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 51 94 0 35 66 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 41 75 0 50 93 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 48 90 0 47 88 0 47 88 0 49 90 0 51 94 0 48 92 -+0 49 93 10 58 99 13 61 101 13 61 101 13 61 101 13 61 101 -+13 61 101 11 59 100 17 64 103 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 133 160 181 -+13 56 97 13 61 101 13 61 101 13 61 101 13 61 101 13 61 101 -+13 61 101 0 52 95 0 48 92 1 55 99 0 65 113 0 86 140 -+0 103 163 0 110 171 0 108 169 0 107 168 0 108 169 0 108 169 -+0 108 169 0 108 169 0 107 168 0 109 170 0 101 162 0 53 96 -+0 48 89 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 93 0 41 75 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 42 79 0 49 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 48 89 0 47 89 -+1 55 99 0 70 118 0 86 140 0 92 148 0 93 151 51 128 174 -+174 198 214 221 230 237 229 236 240 229 235 240 229 235 240 229 235 240 -+229 235 240 229 235 240 229 236 240 250 252 253 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+232 238 242 229 235 240 229 235 240 229 235 240 229 235 240 229 236 240 -+227 235 240 189 213 227 81 154 196 0 101 162 0 108 169 0 110 172 -+0 108 170 0 107 168 0 108 169 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 168 0 108 169 0 108 170 0 70 118 0 46 87 -+0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 49 92 0 42 79 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 43 81 0 50 93 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 48 89 0 48 89 0 62 109 0 86 140 -+0 103 163 0 110 171 0 110 172 0 105 167 51 128 174 239 246 249 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 132 174 200 0 102 165 0 107 168 -+0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 -+0 108 168 0 107 169 0 110 172 0 86 140 0 47 89 0 49 91 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 93 0 43 81 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 49 91 0 46 88 0 56 101 0 86 140 0 107 168 0 110 172 -+0 108 170 0 108 169 0 105 167 0 107 168 196 216 229 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 239 246 249 27 123 177 0 105 167 -+0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 -+0 108 169 0 110 172 0 89 144 0 50 92 0 48 90 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 49 92 0 42 81 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 47 88 0 70 118 0 103 163 0 110 172 0 108 169 0 107 168 -+0 108 169 0 108 169 0 105 167 27 123 177 241 246 248 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 81 154 196 0 102 165 -+0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 0 108 169 -+0 110 172 0 88 143 0 50 93 0 48 90 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 93 0 41 77 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 0 47 88 -+0 76 127 0 108 169 0 109 170 0 107 168 0 108 169 0 108 169 -+0 108 169 0 108 169 0 105 167 27 123 177 241 246 248 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 81 154 196 0 102 165 -+0 108 169 0 108 169 0 107 168 0 108 169 0 109 171 0 107 168 -+0 78 129 0 49 91 0 48 89 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 51 94 0 37 70 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 47 88 0 76 127 -+0 109 171 0 108 169 0 107 168 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 107 168 0 107 168 196 216 229 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 239 246 249 27 123 177 0 105 167 -+0 108 169 0 108 169 0 110 171 0 109 171 0 94 151 0 63 110 -+0 46 88 0 49 90 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 51 94 0 34 62 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 50 92 0 49 91 0 46 88 0 70 118 0 108 170 -+0 108 169 0 107 168 0 108 169 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 107 168 0 103 165 51 128 174 239 246 249 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 132 174 200 0 104 168 0 109 172 -+0 110 172 0 105 167 0 92 148 0 70 118 0 49 92 0 47 89 -+0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 52 95 0 28 52 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 50 92 0 47 89 0 57 101 0 103 163 0 108 170 -+0 107 168 0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 -+0 107 168 0 108 169 0 110 171 0 109 171 0 101 162 51 128 174 -+174 198 214 221 230 237 229 236 240 229 235 240 229 235 240 229 235 240 -+229 235 240 229 235 240 250 252 253 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 232 238 242 -+229 235 240 229 235 240 229 235 240 229 235 240 229 235 240 229 236 240 -+227 235 240 189 213 227 81 154 196 0 98 155 0 93 151 0 86 140 -+0 72 121 1 57 102 0 48 90 0 47 88 0 49 91 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 52 95 0 20 37 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 49 91 0 48 89 0 88 143 0 110 171 0 107 168 -+0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 -+0 109 171 0 108 169 0 89 144 0 70 118 1 57 102 0 49 93 -+0 49 93 10 58 99 13 61 101 13 61 101 13 61 101 13 61 101 -+13 61 101 13 56 97 59 105 139 243 247 249 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 59 105 139 -+13 56 97 13 61 101 13 61 101 13 61 101 13 61 101 13 61 101 -+13 61 101 0 52 95 0 48 92 0 51 94 0 49 91 0 47 88 -+0 47 88 0 48 90 0 49 91 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 49 91 0 49 92 0 12 22 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 47 88 0 64 111 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 0 109 172 -+0 98 155 0 64 111 0 47 89 0 47 88 0 48 89 0 49 90 -+0 48 90 0 47 89 0 47 89 0 47 89 0 47 89 0 47 89 -+0 47 89 0 44 87 0 51 94 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 45 87 122 -+0 40 84 0 47 89 0 47 89 0 47 89 0 47 89 0 47 89 -+0 47 89 0 48 90 0 49 91 0 49 91 0 49 91 0 49 91 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 45 85 0 4 9 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 49 91 0 48 89 0 88 143 0 110 171 0 107 168 0 108 169 -+0 108 169 0 108 169 0 108 169 0 107 168 0 109 171 0 93 151 -+0 53 96 0 46 87 0 49 91 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 6 55 97 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 51 94 0 37 70 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 48 90 0 57 101 0 103 163 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 107 168 0 109 170 0 99 157 0 53 96 -+0 47 88 0 49 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 91 0 52 95 0 26 49 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 46 88 0 72 121 0 109 171 0 107 168 0 108 169 0 108 169 -+0 108 169 0 108 169 0 108 168 0 108 169 0 65 113 0 46 87 -+0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 49 92 0 50 93 0 12 22 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 -+0 47 88 0 86 140 0 110 172 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 109 171 0 92 148 0 48 90 0 48 90 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 93 0 41 77 0 1 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 48 90 -+0 49 91 0 94 151 0 109 171 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 109 171 0 72 121 0 46 88 0 49 91 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 52 95 0 26 49 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 -+0 51 94 0 100 158 0 109 170 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 168 0 107 168 0 62 109 0 47 89 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 48 89 0 8 14 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 -+0 53 96 0 101 162 0 108 169 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 105 166 1 55 99 0 48 90 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 47 90 6 55 97 220 228 234 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 -+0 42 85 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 0 51 95 -+0 34 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 -+0 52 96 0 101 162 0 108 169 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 103 165 1 55 99 0 48 90 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 46 89 10 58 99 221 230 237 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 252 253 254 42 85 121 -+0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 12 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 -+0 51 94 0 100 158 0 109 170 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 168 0 105 167 0 62 109 0 47 89 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 44 87 17 74 116 238 243 246 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 243 247 249 42 85 121 -+0 44 87 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 51 95 0 35 66 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 48 90 -+0 49 91 0 94 151 0 109 171 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 109 171 0 72 121 0 46 88 0 49 91 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 41 85 59 105 139 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 227 235 240 17 64 103 -+0 45 88 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 47 89 0 10 19 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 -+0 47 88 0 86 140 0 110 172 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 109 171 0 92 148 0 48 90 0 48 90 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 49 91 0 41 85 156 179 196 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 194 209 220 0 48 90 -+0 47 90 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 49 91 0 51 95 0 28 52 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 46 88 0 72 121 0 109 171 0 107 168 0 108 169 0 108 169 -+0 108 169 0 108 169 0 108 168 0 108 169 0 65 113 0 46 87 -+0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 41 84 45 87 122 243 247 249 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 133 160 181 0 40 84 -+0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 49 91 0 50 93 0 42 79 0 3 7 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 48 90 0 57 101 0 103 165 0 108 169 0 108 169 0 108 169 -+0 108 169 0 108 169 0 107 168 0 109 170 0 99 157 0 53 96 -+0 47 88 0 49 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 44 87 -+6 55 97 190 205 217 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 59 105 139 0 41 85 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 91 0 50 92 0 49 91 0 14 27 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 49 91 0 48 89 0 89 144 0 110 171 0 107 168 0 108 169 -+0 108 169 0 108 169 0 108 169 0 107 168 0 109 171 0 94 151 -+0 53 96 0 46 87 0 49 91 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 41 84 13 56 97 -+155 189 209 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 207 222 232 6 55 97 0 46 89 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 49 92 0 52 95 0 25 47 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 47 88 0 64 111 0 108 169 0 108 168 0 108 169 -+0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 0 110 171 -+0 99 157 0 64 111 0 43 86 0 42 85 0 44 87 0 46 88 -+0 46 88 0 44 87 0 40 84 0 43 86 59 105 139 194 209 220 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 89 138 172 0 40 84 0 49 91 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 51 95 0 34 64 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 49 91 0 48 90 0 89 144 0 110 171 0 107 168 -+0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 105 167 -+0 104 168 27 123 177 58 125 166 56 105 141 42 85 121 17 64 103 -+17 64 103 45 87 122 79 130 164 174 198 214 250 252 253 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 207 222 232 10 58 99 0 47 89 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 0 51 95 -+0 39 74 0 3 7 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 50 92 0 47 89 1 57 102 0 103 163 0 108 170 -+0 107 168 0 108 169 0 108 169 0 108 169 0 105 167 0 110 171 -+156 192 214 239 246 249 255 255 255 255 255 255 247 250 251 238 243 246 -+238 243 246 249 251 253 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 252 253 254 59 105 139 0 41 84 0 49 91 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 51 95 0 42 79 -+0 6 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 50 92 0 49 91 0 46 88 0 70 118 0 109 170 -+0 108 169 0 107 168 0 108 169 0 107 168 0 103 165 156 192 214 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 133 160 181 0 41 85 0 49 91 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 49 91 0 51 95 0 41 77 0 7 14 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 47 88 0 78 129 -+0 109 171 0 108 169 0 107 168 0 105 166 27 123 177 241 246 248 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+156 179 196 0 48 91 0 47 89 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 49 91 0 50 92 0 51 95 0 38 73 0 6 11 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 44 82 0 49 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 0 47 89 -+0 78 129 0 109 170 0 109 170 0 102 165 51 128 174 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 156 179 196 -+4 52 93 0 46 88 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 50 92 0 51 96 0 34 62 0 3 6 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 41 77 0 50 93 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 47 88 0 70 118 0 103 163 0 107 169 27 123 177 243 247 249 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 247 250 251 133 160 181 0 47 90 -+0 46 88 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 91 0 50 91 0 51 94 -+0 49 91 0 25 47 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 34 62 0 51 94 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 49 91 0 46 88 1 57 102 0 88 143 0 105 167 156 192 214 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 190 205 217 59 105 139 0 41 84 0 47 90 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 49 91 0 50 93 0 51 96 0 41 77 -+0 13 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 19 35 0 52 95 0 49 91 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 48 89 0 48 89 0 62 109 12 92 143 -+156 192 214 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 251 253 -+190 205 217 79 130 164 0 51 93 0 42 85 0 49 91 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 49 91 0 50 92 0 51 95 0 48 89 0 27 50 0 3 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 3 6 0 42 79 0 50 93 -+0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 49 91 0 48 89 0 45 88 -+0 53 98 56 105 141 144 169 189 194 209 220 225 233 238 236 240 243 -+236 240 243 227 235 240 202 218 229 155 189 209 98 145 177 42 85 121 -+0 47 90 0 41 85 0 48 90 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 91 0 50 93 -+0 51 95 0 49 90 0 34 62 0 9 18 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 16 30 0 49 92 -+0 50 93 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 -+0 48 90 0 42 85 0 41 85 0 50 92 11 59 100 17 64 103 -+17 64 103 11 59 100 0 53 95 0 43 86 0 40 84 0 44 87 -+0 48 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 49 91 0 50 92 0 51 94 0 52 96 0 47 88 -+0 32 61 0 11 21 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 40 -+0 49 92 0 51 94 0 50 92 0 50 91 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 49 91 0 48 90 0 47 89 0 46 89 -+0 46 89 0 47 89 0 48 90 0 49 91 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 -+0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 93 -+0 51 95 0 52 96 0 49 91 0 41 75 0 25 46 0 8 14 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 16 30 0 42 79 0 51 95 0 51 95 0 51 93 0 50 93 -+0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 -+0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 -+0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 -+0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 -+0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 0 51 93 -+0 51 94 0 52 95 0 52 95 0 52 95 0 50 92 0 45 85 -+0 37 70 0 25 46 0 10 19 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 3 6 0 18 34 0 32 61 0 41 77 0 44 82 -+0 44 82 0 45 82 0 45 82 0 45 82 0 45 82 0 45 82 -+0 45 82 0 45 82 0 45 82 0 45 82 0 45 82 0 45 82 -+0 45 82 0 45 82 0 45 82 0 45 82 0 45 82 0 45 82 -+0 45 82 0 45 82 0 45 82 0 45 83 0 45 83 0 45 83 -+0 45 82 0 45 82 0 45 82 0 44 82 0 42 81 0 41 77 -+0 37 70 0 32 61 0 27 50 0 19 35 0 11 21 0 3 7 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 -diff --git a/drivers/video/logo/logo_gentoo_clut224.ppm b/drivers/video/logo/logo_gentoo_clut224.ppm -new file mode 100644 -index 000000000000..6163d9fcc4c8 ---- /dev/null -+++ b/drivers/video/logo/logo_gentoo_clut224.ppm -@@ -0,0 +1,803 @@ -+P3 -+76 80 -+255 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+152 135 250 152 139 239 151 142 225 151 143 219 154 147 213 154 147 213 154 147 213 154 147 213 -+154 147 213 154 147 213 151 143 219 157 148 227 157 148 227 152 139 239 158 154 250 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 145 246 151 142 225 154 147 213 -+156 149 204 156 149 199 156 149 199 156 149 199 156 149 199 156 149 199 156 149 204 156 149 204 -+156 149 204 156 149 204 156 149 204 154 147 213 154 147 213 154 147 213 151 142 225 152 139 239 -+152 139 239 158 154 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 157 148 227 151 143 219 156 149 204 156 149 199 165 162 202 -+186 183 208 199 194 238 219 217 229 221 219 238 245 245 249 252 252 253 255 255 255 255 255 255 -+248 248 253 235 234 251 212 211 246 199 194 238 162 161 213 151 142 225 151 143 219 151 143 219 -+151 142 225 152 139 239 152 139 239 152 135 250 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 159 151 238 151 143 219 156 149 204 165 162 202 186 181 225 231 231 244 253 253 255 -+254 254 255 253 253 254 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+253 253 254 249 249 254 245 245 249 242 242 252 241 240 252 223 222 249 185 182 243 151 142 225 -+151 142 225 149 138 231 146 136 235 152 139 239 152 135 250 152 135 250 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 145 246 -+151 142 225 156 149 204 156 149 204 206 201 229 244 244 253 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 251 251 254 248 248 253 244 244 253 241 240 252 237 237 251 233 232 250 225 225 249 -+190 187 243 159 151 238 146 135 237 146 135 237 146 135 237 146 133 248 146 133 248 136 134 248 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 138 231 154 147 213 -+156 149 204 171 166 233 239 238 247 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 252 252 254 249 249 254 245 245 253 242 242 252 238 238 252 235 234 251 231 231 250 -+228 227 250 223 222 249 185 182 243 146 133 243 146 133 248 144 131 244 146 133 248 146 133 248 -+146 133 248 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 152 139 239 157 148 227 154 147 213 154 147 213 -+206 201 229 253 253 254 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 253 253 254 250 250 254 246 246 253 243 243 252 239 239 252 236 236 251 233 232 250 -+229 228 250 225 225 249 222 222 249 213 212 247 176 171 244 146 133 248 146 133 248 146 133 248 -+146 133 248 146 133 248 136 134 248 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 155 145 246 151 142 225 154 147 213 157 148 227 227 227 249 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 251 251 254 248 248 253 244 244 253 240 240 252 237 236 251 234 233 251 -+230 229 251 226 225 249 223 222 249 219 218 248 216 216 248 203 200 248 167 159 246 152 135 250 -+152 135 250 152 135 250 152 135 250 146 133 248 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 152 139 239 151 142 225 151 142 225 180 177 239 245 245 249 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 252 252 254 248 248 253 245 244 253 241 241 252 237 237 251 234 234 251 -+231 230 250 227 227 249 224 224 249 219 218 248 216 216 248 213 212 247 210 209 246 189 186 247 -+158 154 250 155 145 246 155 145 246 152 135 250 146 133 248 146 133 248 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 152 139 239 151 142 225 151 142 225 199 194 238 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 253 253 254 249 249 254 246 245 253 242 242 252 238 238 252 235 234 251 -+231 231 250 228 227 250 224 224 249 221 220 248 218 217 247 213 213 247 210 209 246 206 205 245 -+201 199 246 171 166 245 155 145 246 158 149 246 155 145 246 146 133 248 146 133 248 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+146 133 243 149 138 231 149 138 231 213 212 247 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 253 253 254 250 250 254 246 246 253 243 243 252 239 239 252 236 236 251 -+233 232 250 229 228 250 225 224 250 221 221 248 218 217 247 214 214 247 210 209 246 207 206 246 -+203 203 245 200 199 244 185 183 243 163 156 246 160 152 246 160 152 246 155 145 246 146 133 248 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 152 139 239 -+146 135 237 146 136 235 215 214 247 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 251 251 254 248 248 253 243 243 252 240 240 252 236 236 251 -+233 232 250 229 229 250 226 225 249 222 222 249 218 218 248 215 214 247 210 209 246 208 208 246 -+204 203 245 200 199 244 197 196 244 189 187 243 169 163 245 164 155 247 163 156 246 158 149 246 -+146 133 248 146 133 243 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 146 133 248 146 133 243 -+146 135 237 203 200 248 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 251 251 254 248 248 253 244 244 253 241 240 252 237 237 251 -+234 233 251 230 229 251 226 225 249 223 222 249 219 218 248 215 215 247 212 211 246 208 208 246 -+204 203 245 201 200 245 197 196 244 194 193 243 190 188 243 176 171 244 167 159 246 168 162 245 -+165 158 245 146 133 243 144 131 244 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 158 154 250 146 133 248 146 133 243 -+184 179 247 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 252 252 254 248 248 253 245 244 253 241 241 252 237 237 251 -+234 234 251 230 230 250 227 227 249 223 223 249 219 218 248 215 215 247 212 211 246 208 208 246 -+204 204 245 201 200 245 197 196 244 194 193 243 190 188 243 188 186 243 181 177 244 171 166 245 -+171 166 245 171 166 245 155 145 246 144 131 244 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 146 133 248 144 131 244 164 155 247 -+253 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 244 244 253 230 230 250 221 220 248 220 219 250 234 233 251 238 238 252 -+234 234 251 231 230 250 227 227 249 223 223 249 219 218 248 216 216 248 213 212 247 209 208 246 -+204 204 245 201 201 245 198 197 244 194 193 243 191 190 243 188 187 243 186 184 243 182 180 243 -+175 170 244 174 170 244 175 170 244 160 152 246 146 133 243 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 146 133 248 146 133 248 146 133 248 234 233 253 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 251 251 254 228 227 250 204 204 245 185 183 243 189 186 247 -+212 210 249 231 231 250 227 227 249 224 224 249 219 218 248 216 216 248 213 212 247 209 208 246 -+206 205 245 201 201 245 198 197 244 195 194 243 191 190 243 188 187 243 186 184 243 184 182 243 -+181 177 244 178 174 244 178 174 244 178 175 244 168 162 245 146 135 237 145 140 230 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 146 133 248 146 133 248 189 186 247 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 244 244 253 218 217 247 191 190 243 176 171 244 -+160 152 246 171 164 246 217 216 247 224 224 249 221 220 248 216 216 248 213 212 247 209 208 246 -+206 205 245 201 201 245 199 198 244 195 194 243 191 190 243 188 187 243 186 185 243 184 182 243 -+182 180 243 180 177 244 180 177 244 181 177 244 182 180 243 176 171 244 152 139 239 146 135 230 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 146 133 248 152 135 250 155 145 246 242 241 253 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 251 251 254 224 224 249 196 195 244 178 175 244 -+163 156 246 152 135 250 149 138 231 206 201 229 221 220 248 216 216 248 213 213 247 210 209 246 -+206 205 245 201 201 245 199 198 244 195 194 243 191 190 243 188 187 243 186 185 243 184 182 243 -+183 180 243 181 177 244 178 175 244 182 180 243 185 183 243 185 183 243 180 177 244 152 139 239 -+146 136 235 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 146 133 248 155 145 246 184 179 247 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 246 246 253 217 214 250 212 208 248 220 219 250 218 217 247 195 194 243 178 174 244 -+163 156 246 146 133 248 151 142 225 156 149 199 165 162 202 220 219 250 213 213 247 210 209 246 -+206 205 245 201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 182 243 -+183 180 243 181 177 244 178 175 244 177 172 244 183 180 243 188 187 243 189 187 243 185 183 243 -+159 151 238 146 135 237 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 146 133 248 152 135 250 155 145 246 220 219 250 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+243 243 253 155 145 246 146 133 243 146 133 243 146 133 243 146 135 237 158 149 246 166 159 245 -+159 150 246 146 133 248 151 143 219 151 143 191 105 99 142 186 183 208 213 213 247 210 209 246 -+207 206 246 201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 182 243 -+183 180 243 181 177 244 178 175 244 176 172 244 174 170 244 185 183 243 193 191 243 194 193 243 -+193 191 243 159 151 238 146 136 235 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 146 133 248 155 145 246 158 149 246 248 247 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 255 248 248 253 255 255 255 255 255 255 255 255 255 -+189 186 247 146 133 243 146 135 237 146 133 243 146 135 237 146 133 243 146 135 237 146 135 237 -+146 133 243 146 135 237 154 147 213 134 128 170 88 84 126 88 84 126 199 194 238 210 209 246 -+207 206 246 201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 182 243 -+183 180 243 181 177 244 178 175 244 176 172 244 174 170 244 173 167 245 189 187 243 199 198 244 -+201 200 245 199 198 244 159 151 238 145 140 230 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 146 133 248 160 152 246 165 158 245 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 246 246 253 219 218 248 234 233 251 243 243 252 248 248 253 -+152 139 239 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 -+146 135 237 146 136 235 156 149 199 114 106 151 82 76 118 82 76 118 142 137 174 210 209 246 -+207 206 246 201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 182 243 -+183 180 243 181 177 244 178 175 244 176 172 244 174 170 244 172 167 245 171 166 245 193 191 243 -+206 205 245 207 206 246 209 209 245 159 151 238 146 135 230 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 146 133 248 144 131 244 163 156 246 165 158 245 254 253 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 244 244 253 190 188 243 201 200 245 208 208 246 207 206 246 -+146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 -+146 135 237 146 136 235 136 128 204 95 88 132 82 76 118 82 76 118 100 95 138 210 209 246 -+207 206 246 201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 182 243 -+183 180 243 181 177 244 178 175 244 176 172 244 174 170 244 172 167 245 171 166 245 169 163 245 -+199 198 244 212 211 246 213 212 247 209 209 245 157 148 227 151 137 225 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 144 131 244 146 133 248 167 159 246 167 159 246 234 233 253 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 184 179 247 177 172 244 181 177 244 182 180 243 -+152 139 239 146 135 237 146 135 237 146 136 235 146 136 235 146 136 235 146 136 235 146 136 235 -+146 136 235 146 136 235 146 136 235 82 76 118 82 76 118 82 76 118 88 84 126 210 209 246 -+206 205 245 201 201 245 199 198 244 195 194 243 191 190 243 189 187 243 187 185 243 185 182 243 -+183 180 243 181 177 244 178 175 244 176 172 244 174 170 244 172 167 245 171 166 245 168 162 245 -+169 163 245 207 206 246 218 218 248 221 220 248 212 211 246 157 148 227 161 137 216 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 144 131 244 144 131 244 163 156 246 169 163 245 189 186 247 253 253 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 217 214 250 159 150 246 160 152 246 163 156 246 -+158 149 246 146 135 230 146 136 235 146 136 235 146 136 235 149 138 231 146 136 235 149 138 231 -+149 138 231 149 138 231 146 135 230 82 76 118 82 76 118 82 76 118 110 102 146 210 209 246 -+206 205 245 201 201 245 199 198 244 195 194 243 191 190 243 188 187 243 186 185 243 184 182 243 -+182 180 243 180 177 244 178 174 244 176 172 244 174 170 244 172 167 245 169 163 245 168 162 245 -+166 159 245 171 164 246 216 216 248 224 224 249 226 225 249 215 214 247 157 148 227 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 146 133 243 146 133 243 155 145 246 172 167 245 173 167 245 199 196 246 251 251 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 255 195 192 247 144 131 244 146 133 248 -+144 131 244 146 133 243 146 136 235 151 137 225 145 140 230 146 135 230 149 138 231 149 138 231 -+149 138 231 146 135 230 113 109 162 82 76 118 82 76 118 82 76 118 165 162 202 209 208 246 -+206 205 245 201 201 245 199 198 244 195 194 243 191 190 243 188 187 243 186 185 243 184 182 243 -+182 180 243 180 177 244 178 174 244 176 172 244 174 170 244 172 167 245 169 163 245 168 162 245 -+166 159 245 163 156 246 175 170 244 226 225 249 231 230 250 233 232 250 209 209 245 151 142 225 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 146 133 243 146 135 237 146 135 237 166 159 245 176 171 244 176 172 244 189 186 247 -+242 241 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 255 206 201 229 154 147 213 -+154 147 213 156 149 204 156 149 199 151 143 191 126 124 174 0 0 0 0 0 0 146 135 230 -+149 138 231 126 124 174 82 76 118 82 76 118 82 76 118 131 126 164 212 211 246 209 208 246 -+204 204 245 201 201 245 198 197 244 194 193 243 191 190 243 188 187 243 186 184 243 184 182 243 -+182 180 243 180 177 244 178 174 244 176 172 244 174 170 244 172 167 245 169 163 245 168 162 245 -+167 159 246 163 156 246 164 155 247 184 179 247 237 236 251 237 236 251 237 237 251 199 194 238 -+151 143 219 0 0 0 0 0 0 0 0 0 -+0 0 0 146 135 237 146 133 243 146 135 237 152 139 239 174 170 244 179 175 244 180 177 244 -+182 180 243 220 219 250 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 219 217 229 -+142 137 174 114 108 147 102 97 140 95 88 132 82 76 118 82 76 118 82 76 118 82 76 118 -+95 88 132 82 76 118 82 76 118 82 76 118 142 137 174 212 211 246 213 212 247 209 208 246 -+204 204 245 201 201 245 198 197 244 194 193 243 191 190 243 188 187 243 186 184 243 184 182 243 -+182 180 243 180 177 244 178 174 244 176 171 244 174 170 244 171 166 245 169 163 245 168 162 245 -+167 159 246 164 155 247 163 156 246 160 152 246 212 208 248 242 242 252 242 242 252 241 240 252 -+171 166 233 151 143 219 0 0 0 0 0 0 -+0 0 0 0 0 0 146 135 237 146 135 237 146 135 237 152 139 239 176 172 244 183 180 243 -+183 180 243 184 182 243 196 194 246 234 234 251 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+252 252 253 186 183 208 122 118 142 82 76 118 82 76 118 82 76 118 82 76 118 82 76 118 -+82 76 118 82 76 118 114 106 151 186 181 225 223 223 249 215 215 247 212 211 246 208 208 246 -+204 204 245 201 200 245 197 196 244 194 193 243 190 188 243 188 186 243 186 184 243 184 182 243 -+182 180 243 180 177 244 178 174 244 176 171 244 174 170 244 171 166 245 169 163 245 168 162 245 -+167 159 246 163 156 246 163 156 246 159 150 246 164 155 247 242 241 253 248 248 253 251 250 252 -+231 231 244 154 147 213 0 0 0 0 0 0 -+0 0 0 0 0 0 146 135 237 146 136 235 146 136 235 146 136 235 149 138 231 174 170 244 -+186 184 243 187 185 243 187 186 243 188 186 243 204 204 246 242 241 253 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 219 217 229 165 162 202 131 126 164 114 108 147 114 108 147 -+142 137 174 206 201 229 227 227 249 224 224 249 219 218 248 215 214 247 212 211 246 208 208 246 -+204 203 245 201 200 245 197 196 244 193 191 243 190 188 243 187 186 243 186 184 243 184 182 243 -+181 177 244 180 177 244 178 174 244 176 171 244 173 167 245 171 166 245 169 163 245 168 162 245 -+165 158 245 163 156 246 160 152 246 160 152 246 158 149 246 195 192 247 253 253 254 254 254 254 -+254 253 255 199 194 238 154 147 213 0 0 0 -+0 0 0 0 0 0 0 0 0 146 136 235 146 136 235 149 138 231 149 138 231 149 138 231 -+171 166 233 187 185 243 190 188 243 192 191 243 193 191 243 194 193 243 215 215 247 246 246 253 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 254 254 254 252 252 253 251 250 252 245 245 249 240 240 252 236 236 251 -+231 231 250 227 227 249 224 224 249 221 221 248 218 218 248 214 214 247 210 209 246 207 206 246 -+204 203 245 200 199 244 196 195 244 193 191 243 189 187 243 187 186 243 185 183 243 183 181 243 -+181 177 244 179 175 244 177 172 244 175 170 244 173 167 245 171 166 245 169 163 245 168 162 245 -+165 158 245 163 156 246 160 152 246 159 150 246 158 149 246 159 150 246 248 247 254 255 255 255 -+255 255 255 239 238 247 154 147 213 0 0 0 -+0 0 0 0 0 0 0 0 0 146 135 230 149 138 231 146 136 235 149 138 231 149 138 231 -+146 136 235 157 148 227 185 182 243 197 196 244 198 197 244 199 198 244 200 199 244 201 200 245 -+219 218 248 245 245 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 253 253 254 250 250 254 246 246 253 243 243 252 239 239 252 235 234 251 -+233 232 250 228 227 250 225 224 250 221 220 248 218 217 247 213 213 247 210 209 246 207 206 246 -+203 203 245 199 198 244 196 195 244 192 191 243 189 187 243 187 186 243 185 183 243 183 180 243 -+181 177 244 179 175 244 178 174 244 175 170 244 173 167 245 171 166 245 169 163 245 167 159 246 -+165 158 245 163 156 246 160 152 246 159 150 246 158 149 246 155 145 246 220 219 250 255 255 255 -+255 255 255 253 253 255 186 181 225 154 147 213 -+0 0 0 0 0 0 0 0 0 0 0 0 149 138 231 149 138 231 149 138 231 149 138 231 -+149 138 231 149 138 231 149 138 231 171 166 233 197 196 244 204 203 245 204 204 245 207 206 246 -+207 206 246 209 208 246 223 222 249 244 244 253 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 252 252 254 249 249 254 245 245 253 242 242 252 238 238 252 235 234 251 -+231 231 250 228 227 250 224 224 249 221 220 248 216 216 248 213 212 247 210 209 246 206 205 245 -+201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 183 243 183 180 243 -+181 177 244 179 175 244 177 172 244 175 170 244 173 167 245 171 166 245 168 162 245 167 159 246 -+165 158 245 163 156 246 160 152 246 159 150 246 158 149 246 155 145 246 203 200 248 254 254 255 -+255 255 255 255 255 255 199 194 238 156 149 204 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 151 142 225 149 138 231 151 137 225 -+149 138 231 151 137 225 151 137 225 151 142 225 151 142 225 180 177 239 207 206 246 212 211 246 -+213 212 247 213 213 247 215 214 247 215 215 247 226 225 249 244 244 253 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 251 251 254 248 248 253 244 244 253 241 241 252 237 237 251 234 234 251 -+230 230 250 227 227 249 223 223 249 219 218 248 216 216 248 213 212 247 209 208 246 204 204 245 -+201 201 245 198 197 244 195 194 243 191 190 243 188 187 243 186 185 243 184 182 243 182 180 243 -+181 177 244 178 175 244 176 172 244 174 170 244 172 167 245 171 166 245 168 162 245 167 159 246 -+165 158 245 163 156 246 160 152 246 159 150 246 155 145 246 155 145 246 207 205 248 255 255 255 -+255 255 255 255 255 255 206 201 229 156 149 204 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 151 137 225 151 142 225 -+151 142 225 151 142 225 151 142 225 151 137 225 151 142 225 151 142 225 157 148 227 185 182 243 -+214 214 247 219 218 248 219 218 248 221 220 248 222 222 249 223 223 249 230 230 250 245 245 253 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 250 250 254 248 248 253 243 243 252 240 240 252 236 236 251 234 233 251 -+229 229 250 226 225 249 222 222 249 219 218 248 215 215 247 212 211 246 208 208 246 204 204 245 -+201 200 245 197 196 244 194 193 243 190 188 243 188 187 243 186 184 243 184 182 243 182 180 243 -+180 177 244 178 174 244 176 172 244 174 170 244 172 167 245 169 163 245 168 162 245 166 159 245 -+163 156 246 163 156 246 160 152 246 158 149 246 155 145 246 155 145 246 224 222 251 255 255 255 -+255 255 255 255 255 255 186 181 225 156 149 204 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 136 134 248 -+151 142 225 151 142 225 151 142 225 151 142 225 151 142 225 151 137 225 151 143 219 151 143 219 -+157 148 227 186 184 243 218 217 247 226 225 249 227 227 249 228 227 250 229 229 250 230 230 250 -+235 234 251 251 250 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 253 253 254 249 249 254 246 246 253 242 242 252 239 239 252 235 234 251 233 232 250 -+229 228 250 225 225 249 221 221 248 218 217 247 214 214 247 210 209 246 207 206 246 204 203 245 -+200 199 244 197 196 244 193 191 243 190 188 243 188 186 243 186 184 243 184 182 243 182 180 243 -+180 177 244 178 174 244 176 171 244 174 170 244 171 166 245 169 163 245 168 162 245 167 159 246 -+164 155 247 160 152 246 160 152 246 158 149 246 155 145 246 171 164 246 253 253 255 255 255 255 -+255 255 255 253 252 254 162 161 213 156 149 204 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 151 142 225 151 143 219 151 142 225 151 143 219 151 143 219 151 142 225 151 143 219 -+151 143 219 151 143 219 151 143 219 186 181 225 220 219 250 234 233 251 234 234 251 235 234 251 -+237 236 251 245 245 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 252 252 254 248 248 253 245 245 253 241 241 252 238 238 252 234 234 251 231 231 250 -+228 227 250 224 224 249 221 220 248 218 217 247 213 213 247 210 209 246 207 206 246 203 203 245 -+199 198 244 196 195 244 192 191 243 189 187 243 187 186 243 185 183 243 183 181 243 181 177 244 -+179 175 244 177 172 244 175 170 244 173 167 245 171 166 245 169 163 245 168 162 245 167 159 246 -+163 156 246 164 155 247 160 152 246 158 149 246 160 152 246 240 238 254 255 255 255 255 255 255 -+255 255 255 221 219 238 156 149 204 156 149 204 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 151 143 219 151 143 219 151 143 219 151 143 219 151 143 219 -+151 143 219 151 143 219 151 143 219 151 143 219 154 147 213 180 177 239 231 230 250 241 240 252 -+243 243 252 253 253 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 250 250 254 248 248 253 243 243 252 240 240 252 237 237 251 234 233 251 230 229 251 -+227 227 249 223 223 249 219 218 248 216 216 248 213 212 247 209 208 246 206 205 245 201 201 245 -+199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 183 243 183 180 243 181 177 244 -+179 175 244 178 174 244 175 170 244 173 167 245 171 166 245 169 163 245 167 159 246 165 158 245 -+163 156 246 160 152 246 159 150 246 159 150 246 230 229 251 255 255 255 255 255 255 255 255 255 -+253 252 254 162 161 213 156 149 199 156 149 204 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 151 143 219 151 143 219 151 143 219 -+151 143 219 151 143 219 154 147 213 151 143 219 151 143 219 199 194 238 245 245 249 246 245 253 -+252 252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+252 252 254 249 249 254 246 246 253 242 242 252 239 239 252 236 236 251 233 232 250 229 228 250 -+226 225 249 222 222 249 218 218 248 215 215 247 212 211 246 208 208 246 204 204 245 201 200 245 -+198 197 244 194 193 243 191 190 243 188 187 243 186 184 243 184 182 243 182 180 243 181 177 244 -+178 175 244 176 172 244 175 170 244 173 167 245 171 166 245 168 162 245 167 159 246 165 158 245 -+163 156 246 160 152 246 160 152 246 224 222 251 255 255 255 255 255 255 255 255 255 255 255 255 -+206 201 229 156 149 199 156 149 199 156 149 199 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 136 134 248 154 147 213 -+154 147 213 151 143 219 154 147 213 154 147 213 209 209 245 251 250 252 250 250 254 254 254 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+251 251 254 248 248 253 245 244 253 241 241 252 237 237 251 234 234 251 231 231 250 228 227 250 -+224 224 249 221 220 248 218 217 247 214 214 247 210 209 246 207 206 246 204 203 245 200 199 244 -+197 196 244 193 191 243 190 188 243 188 186 243 186 184 243 184 182 243 182 180 243 180 177 244 -+178 174 244 176 172 244 174 170 244 172 167 245 169 163 245 168 162 245 166 159 245 163 156 246 -+163 156 246 160 152 246 217 214 250 255 255 255 255 255 255 255 255 255 255 255 255 239 238 247 -+165 162 202 156 149 199 165 162 202 156 149 199 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+161 137 216 161 137 216 162 161 213 226 225 249 252 252 253 254 254 254 254 254 254 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 254 -+250 250 254 246 246 253 243 243 252 240 240 252 236 236 251 234 233 251 230 229 251 227 227 249 -+223 223 249 219 218 248 216 216 248 213 212 247 210 209 246 206 205 245 203 203 245 199 198 244 -+196 195 244 192 191 243 189 187 243 187 186 243 185 183 243 183 181 243 181 177 244 179 175 244 -+178 174 244 176 171 244 174 170 244 171 166 245 169 163 245 168 162 245 167 159 246 163 156 246 -+163 156 246 212 210 249 255 255 255 255 255 255 255 255 255 255 255 255 251 251 254 186 183 208 -+156 149 199 156 149 199 156 149 199 156 149 199 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 186 181 225 241 240 252 254 254 254 254 254 254 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 251 251 254 -+248 248 253 245 245 253 242 242 252 238 238 252 235 234 251 233 232 250 229 228 250 225 225 249 -+222 222 249 218 218 248 215 215 247 212 211 246 208 208 246 204 204 245 201 201 245 198 197 244 -+195 194 243 191 190 243 189 187 243 187 185 243 185 183 243 183 180 243 181 177 244 179 175 244 -+177 172 244 175 170 244 173 167 245 171 166 245 169 163 245 168 162 245 165 158 245 163 156 246 -+212 208 248 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 186 181 225 151 143 191 -+156 149 199 156 149 199 156 149 199 151 143 191 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+186 181 225 251 250 252 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 254 250 250 254 -+248 248 253 243 243 252 240 240 252 237 237 251 234 233 251 230 230 250 227 227 249 224 224 249 -+221 220 248 218 217 247 213 213 247 210 209 246 207 206 246 204 203 245 201 200 245 197 196 244 -+194 193 243 190 188 243 188 187 243 186 184 243 184 182 243 182 180 243 180 177 244 178 175 244 -+176 172 244 175 170 244 173 167 245 171 166 245 168 162 245 167 159 246 165 158 245 217 214 250 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 219 217 229 156 149 199 156 149 199 -+151 143 191 151 143 191 151 143 191 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 161 160 183 199 194 238 -+253 252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 251 251 254 248 248 253 -+245 245 253 242 242 252 239 239 252 235 234 251 233 232 250 229 229 250 226 225 249 223 222 249 -+219 218 248 215 215 247 213 212 247 209 208 246 206 205 245 201 201 245 199 198 244 196 195 244 -+192 191 243 189 187 243 187 186 243 185 183 243 184 182 243 182 180 243 180 177 244 178 174 244 -+176 171 244 174 170 244 172 167 245 169 163 245 168 162 245 167 159 246 220 219 250 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 221 219 238 151 143 191 151 143 191 151 143 191 -+156 149 199 151 143 191 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 154 147 213 206 201 229 252 252 253 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 252 252 254 249 249 254 246 246 253 -+243 243 252 240 240 252 237 237 251 234 234 251 231 231 250 228 227 250 224 224 249 221 220 248 -+218 217 247 215 214 247 212 211 246 208 208 246 204 204 245 201 200 245 198 197 244 195 194 243 -+191 190 243 189 187 243 187 185 243 185 183 243 183 180 243 181 177 244 179 175 244 177 172 244 -+175 170 244 173 167 245 171 166 245 169 163 245 169 163 245 225 224 250 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 231 231 244 151 143 191 151 143 191 151 143 191 151 143 191 -+151 143 191 151 143 191 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 154 147 213 206 201 229 254 254 254 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 251 251 254 248 248 253 245 245 253 -+242 242 252 238 238 252 235 234 251 233 232 250 229 229 250 226 225 249 223 222 249 219 218 248 -+216 216 248 213 212 247 210 209 246 207 206 246 203 203 245 200 199 244 197 196 244 193 191 243 -+190 188 243 188 186 243 186 184 243 184 182 243 182 180 243 181 177 244 178 175 244 177 172 244 -+175 170 244 173 167 245 171 166 245 172 167 245 230 229 251 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 231 231 244 151 143 191 151 143 191 151 143 191 143 137 181 151 143 191 -+143 137 181 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 162 161 213 221 219 238 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 252 252 254 249 249 254 246 246 253 243 243 252 -+240 240 252 237 237 251 234 234 251 231 230 250 228 227 250 225 224 250 221 221 248 218 218 248 -+215 214 247 212 211 246 209 208 246 204 204 245 201 201 245 199 198 244 195 194 243 192 191 243 -+189 187 243 187 186 243 185 183 243 183 181 243 182 180 243 180 177 244 178 174 244 176 172 244 -+174 170 244 172 167 245 176 171 244 234 233 253 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 231 231 244 151 143 191 151 143 191 143 137 181 151 143 191 143 137 181 151 143 191 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 165 162 202 221 219 238 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 253 253 254 250 250 254 248 248 253 244 244 253 241 241 252 -+238 238 252 235 234 251 233 232 250 229 229 250 226 225 249 223 222 249 219 218 248 216 216 248 -+213 213 247 210 209 246 207 206 246 204 203 245 201 200 245 197 196 244 194 193 243 191 190 243 -+188 187 243 187 185 243 185 183 243 183 180 243 181 177 244 179 175 244 177 172 244 175 170 244 -+173 167 245 184 179 247 243 243 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+221 219 238 151 143 191 143 137 181 143 137 181 143 137 181 143 137 181 143 137 181 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 162 161 213 231 231 244 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 253 253 254 250 250 254 248 248 253 245 245 253 242 242 252 239 239 252 -+236 236 251 234 233 251 230 230 250 227 227 249 224 224 249 221 221 248 218 218 248 215 214 247 -+212 211 246 209 208 246 206 205 245 201 201 245 199 198 244 196 195 244 193 191 243 189 187 243 -+187 186 243 186 184 243 184 182 243 182 180 243 180 177 244 178 175 244 177 172 244 175 170 244 -+195 192 247 249 249 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 221 219 238 -+151 143 191 143 137 181 143 137 181 143 137 181 143 137 181 143 137 181 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+186 183 208 231 231 244 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 251 251 254 248 248 253 246 245 253 243 243 252 240 240 252 237 237 251 -+234 234 251 231 231 250 229 228 250 226 225 249 223 222 249 219 218 248 216 216 248 213 213 247 -+210 209 246 207 206 246 204 203 245 201 200 245 197 196 244 194 193 243 191 190 243 189 187 243 -+187 185 243 185 183 243 183 181 243 181 177 244 180 177 244 178 174 244 176 171 244 207 205 248 -+254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 206 201 229 143 137 181 -+142 137 174 143 137 181 143 137 181 143 137 181 143 137 181 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 165 162 202 -+231 231 244 254 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 251 251 254 249 249 254 246 246 253 243 243 252 241 241 252 238 238 252 235 234 251 -+233 232 250 230 229 251 227 227 249 224 224 249 221 220 248 218 217 247 215 214 247 212 211 246 -+209 208 246 206 205 245 201 201 245 199 198 244 196 195 244 193 191 243 190 188 243 188 186 243 -+186 184 243 184 182 243 182 180 243 181 177 244 179 175 244 178 174 244 220 219 250 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 202 200 215 137 131 176 143 137 181 -+137 131 176 137 131 176 137 131 176 137 131 176 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 165 162 202 231 231 244 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+252 252 254 249 249 254 248 248 253 244 244 253 242 241 253 239 239 252 236 236 251 234 233 251 -+230 230 250 228 227 250 225 224 250 221 221 248 219 218 248 215 215 247 213 212 247 210 209 246 -+207 206 246 204 203 245 201 200 245 198 197 244 194 193 243 191 190 243 189 187 243 187 185 243 -+185 183 243 183 181 243 182 180 243 180 177 244 183 180 243 233 232 252 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 248 248 253 186 183 208 137 131 176 137 131 176 137 131 176 -+137 131 176 137 131 176 137 131 176 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 156 149 199 221 219 238 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 252 252 254 -+249 249 254 248 248 253 245 244 253 242 242 252 239 239 252 237 236 251 234 234 251 231 231 250 -+229 228 250 226 225 249 223 222 249 219 218 248 216 216 248 214 214 247 210 209 246 208 208 246 -+204 204 245 201 201 245 199 198 244 196 195 244 193 191 243 190 188 243 188 186 243 186 184 243 -+184 182 243 183 180 243 181 177 244 196 194 246 246 245 253 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 239 238 247 161 160 183 137 131 176 137 131 176 137 131 176 137 131 176 -+137 131 176 134 128 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 156 149 204 219 217 229 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 252 252 254 249 249 254 -+248 248 253 245 244 253 242 242 252 240 240 252 237 237 251 234 234 251 233 232 250 229 229 250 -+226 225 249 224 224 249 221 220 248 218 217 247 215 215 247 212 211 246 209 208 246 207 206 246 -+203 203 245 200 199 244 197 196 244 194 193 243 191 190 243 189 187 243 187 185 243 185 183 243 -+183 181 243 183 180 243 217 214 250 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 221 219 238 143 137 181 137 131 176 137 131 176 134 128 170 134 128 170 134 128 170 -+134 128 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 136 134 248 186 181 225 255 255 255 254 254 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 253 253 254 251 251 254 249 249 254 248 248 253 -+245 244 253 242 242 252 240 240 252 237 237 251 235 234 251 233 232 250 230 229 251 227 227 249 -+224 224 249 221 221 248 219 218 248 215 215 247 213 212 247 210 209 246 207 206 246 204 204 245 -+201 201 245 199 198 244 196 195 244 193 191 243 190 188 243 188 186 243 186 184 243 184 182 243 -+190 188 243 236 236 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+202 200 215 137 131 176 134 128 170 134 128 170 126 124 174 134 128 170 130 124 168 134 128 170 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 165 162 202 245 245 249 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 253 253 254 251 251 254 249 249 254 248 248 253 245 244 253 -+242 242 252 240 240 252 237 237 251 235 234 251 233 232 250 230 230 250 228 227 250 225 224 250 -+222 222 249 219 218 248 216 216 248 214 214 247 210 209 246 208 208 246 206 205 245 201 201 245 -+200 199 244 197 196 244 194 193 243 191 190 243 188 187 243 187 185 243 185 183 243 204 203 245 -+249 249 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 251 250 252 165 162 202 -+134 128 170 130 124 168 130 124 168 130 124 168 130 124 168 130 124 168 130 124 168 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 151 143 191 231 231 244 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 252 252 254 250 250 254 248 248 253 246 246 253 244 244 253 242 242 252 -+240 240 252 237 237 251 235 234 251 234 233 251 230 230 250 228 227 250 225 225 249 223 222 249 -+219 218 248 218 217 247 215 214 247 212 211 246 209 208 246 207 206 246 203 203 245 201 200 245 -+198 197 244 195 194 243 192 191 243 189 187 243 187 186 243 188 187 243 225 224 250 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 221 219 238 143 137 181 134 128 170 -+130 124 168 130 124 168 130 124 168 130 124 168 130 124 168 125 119 163 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 122 118 142 186 183 208 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+253 253 254 251 251 254 249 249 254 248 248 253 246 245 253 243 243 252 242 241 253 239 239 252 -+237 237 251 235 234 251 233 232 250 230 230 250 228 227 250 226 225 249 223 223 249 221 220 248 -+218 217 247 215 215 247 213 212 247 210 209 246 207 206 246 204 204 245 201 201 245 199 198 244 -+196 195 244 193 191 243 190 188 243 188 187 243 204 204 246 245 245 253 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 251 251 254 202 200 215 131 126 164 130 124 168 130 124 168 -+125 119 163 130 124 168 125 119 163 125 119 163 126 124 174 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 143 137 181 221 219 238 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 254 252 252 254 -+250 250 254 248 248 253 248 248 253 245 245 253 243 243 252 241 241 252 239 239 252 237 237 251 -+235 234 251 233 232 250 230 230 250 228 227 250 226 225 249 223 223 249 221 220 248 218 218 248 -+215 215 247 213 212 247 210 209 246 208 208 246 204 204 245 201 201 245 199 198 244 197 196 244 -+194 193 243 191 190 243 193 191 243 228 227 250 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 239 238 247 161 160 183 125 119 163 125 119 163 125 119 163 125 119 163 -+125 119 163 125 119 163 125 119 163 107 101 144 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+122 118 142 156 149 199 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 254 253 253 254 251 251 254 250 250 254 249 249 254 -+248 248 253 246 245 253 244 244 253 242 242 252 240 240 252 238 238 252 236 236 251 234 234 251 -+233 232 250 230 230 250 228 227 250 226 225 249 223 223 249 221 220 248 218 218 248 215 215 247 -+213 213 247 210 209 246 208 208 246 206 205 245 203 203 245 200 199 244 197 196 244 195 194 243 -+192 191 243 208 208 246 248 247 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 253 255 202 200 215 130 124 168 125 119 163 125 119 163 125 119 163 125 119 163 125 119 163 -+125 119 163 121 115 159 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+143 137 181 186 183 208 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 253 253 254 252 252 254 251 251 254 250 250 254 249 249 254 248 248 253 246 246 253 -+244 244 253 243 243 252 241 241 252 239 239 252 237 237 251 236 236 251 234 234 251 233 232 250 -+230 229 251 228 227 250 225 225 249 223 223 249 221 220 248 218 218 248 216 216 248 213 213 247 -+210 209 246 209 208 246 206 205 245 203 203 245 201 200 245 198 197 244 195 194 243 198 197 244 -+233 232 250 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 239 238 247 -+161 160 183 121 115 159 125 119 163 121 115 159 125 119 163 121 115 159 121 115 159 121 115 159 -+121 115 159 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+143 137 181 202 200 215 255 255 255 255 255 255 254 254 254 253 253 254 252 252 254 251 251 254 -+251 251 254 250 250 254 249 249 254 248 248 253 248 248 253 246 245 253 244 244 253 243 243 252 -+242 241 253 240 240 252 238 238 252 237 236 251 235 234 251 234 233 251 231 231 250 229 229 250 -+227 227 249 225 225 249 223 223 249 221 220 248 218 218 248 216 216 248 213 213 247 212 211 246 -+209 208 246 207 206 246 204 203 245 201 200 245 199 198 244 196 195 244 219 218 248 250 250 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 250 250 254 202 200 215 125 119 163 -+121 115 159 121 115 159 121 115 159 121 115 159 120 114 157 120 114 157 121 115 159 116 112 152 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+137 131 176 206 201 229 254 254 254 255 255 255 252 252 254 250 250 254 249 249 254 248 248 253 -+248 248 253 248 248 253 246 246 253 245 245 253 244 244 253 243 243 252 242 241 253 240 240 252 -+239 239 252 237 237 251 236 236 251 234 234 251 233 232 250 230 230 250 229 228 250 227 227 249 -+225 224 250 223 222 249 221 220 248 218 218 248 215 215 247 213 213 247 212 211 246 209 208 246 -+207 206 246 204 203 245 201 201 245 199 198 244 210 209 246 243 243 253 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 221 219 238 142 137 174 121 115 159 120 114 157 -+121 115 159 120 114 157 120 114 157 120 114 157 120 114 157 120 114 157 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+137 131 176 202 200 215 255 255 255 255 255 255 252 252 254 246 246 253 246 246 253 245 245 253 -+245 244 253 244 244 253 243 243 252 242 242 252 241 241 252 240 240 252 238 238 252 237 237 251 -+236 236 251 234 234 251 234 233 251 231 231 250 229 229 250 228 227 250 226 225 249 224 224 249 -+222 222 249 219 218 248 218 217 247 215 215 247 213 213 247 212 211 246 209 208 246 207 206 246 -+204 203 245 201 201 245 208 208 246 236 236 251 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 254 254 254 245 245 249 165 162 202 120 114 157 120 114 157 120 114 157 116 112 152 -+120 114 157 116 112 152 116 112 152 116 112 152 113 109 162 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+137 131 176 186 183 208 254 254 255 255 255 255 253 253 255 243 243 252 243 243 252 242 242 252 -+242 241 253 241 241 252 240 240 252 239 239 252 238 238 252 237 237 251 236 236 251 234 234 251 -+234 233 251 231 231 250 230 230 250 228 227 250 227 227 249 225 225 249 223 223 249 221 221 248 -+219 218 248 218 217 247 215 215 247 213 212 247 210 209 246 209 208 246 207 206 246 204 203 245 -+207 206 246 234 233 251 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+252 252 253 186 183 208 131 126 164 116 112 152 120 114 157 116 112 152 116 112 152 116 112 152 -+114 106 151 114 106 151 116 112 152 114 108 147 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+134 128 170 151 143 191 255 255 255 255 255 255 255 255 255 243 243 253 240 240 252 239 239 252 -+238 238 252 237 237 251 237 237 251 236 236 251 235 234 251 234 234 251 233 232 250 231 231 250 -+230 230 250 229 228 250 227 227 249 226 225 249 224 224 249 222 222 249 221 220 248 219 218 248 -+216 216 248 215 214 247 213 212 247 210 209 246 209 208 246 207 206 246 210 209 246 233 232 250 -+253 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 202 200 215 -+134 128 170 116 112 152 116 112 152 116 112 152 114 106 151 116 112 152 114 106 151 114 106 151 -+114 106 151 114 106 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+130 124 168 131 126 164 239 238 247 255 255 255 255 255 255 251 251 254 237 236 251 236 236 251 -+235 234 251 235 234 251 234 234 251 234 233 251 233 232 250 231 231 250 230 229 251 229 228 250 -+227 227 249 226 225 249 224 224 249 223 222 249 221 221 248 219 218 248 218 217 247 215 215 247 -+214 214 247 212 211 246 210 209 246 208 208 246 215 214 247 236 236 251 254 254 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 219 217 229 142 137 174 116 112 152 -+116 112 152 114 106 151 114 106 151 114 106 151 114 106 151 114 106 151 114 106 151 114 106 151 -+114 106 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+130 124 168 130 124 168 186 183 208 255 255 255 255 255 255 255 255 255 245 245 253 234 233 251 -+233 232 250 231 231 250 231 231 250 230 230 250 229 229 250 228 227 250 227 227 249 226 225 249 -+224 224 249 223 223 249 221 221 248 219 218 248 218 218 248 216 216 248 215 214 247 213 212 247 -+212 211 246 212 211 246 225 225 249 244 244 253 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 219 217 229 142 137 174 114 106 151 114 106 151 114 106 151 -+114 106 151 114 106 151 114 106 151 114 106 151 110 102 146 110 102 146 110 102 146 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+125 119 163 125 119 163 134 128 170 245 245 249 255 255 255 255 255 255 255 255 255 245 245 253 -+230 230 250 229 228 250 228 227 250 227 227 249 226 225 249 225 225 249 224 224 249 223 222 249 -+221 221 248 219 218 248 219 218 248 218 217 247 215 215 247 213 213 247 216 216 248 229 228 250 -+242 241 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 219 217 229 142 137 174 114 108 147 114 106 151 114 106 151 110 102 146 110 102 146 -+110 102 146 110 102 146 107 101 144 107 101 144 110 102 146 110 102 146 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+125 119 163 125 119 163 121 115 159 186 183 208 255 255 255 255 255 255 255 255 255 255 255 255 -+252 252 254 240 240 252 230 230 250 225 225 249 223 223 249 222 222 249 221 220 248 219 218 248 -+218 218 248 219 218 248 224 224 249 229 229 250 238 238 252 246 246 253 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 251 250 252 186 183 208 -+131 126 164 110 102 146 110 102 146 110 102 146 107 101 144 110 102 146 110 102 146 110 102 146 -+107 101 144 107 101 144 107 101 144 107 101 144 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+114 108 147 120 114 157 121 115 159 121 115 159 219 217 229 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 254 254 255 250 250 254 249 249 254 248 247 254 250 250 254 -+253 252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 231 231 244 161 160 183 120 114 157 114 108 147 -+110 102 146 110 102 146 107 101 144 110 102 146 107 101 144 107 101 144 107 101 144 105 100 143 -+107 101 144 105 99 142 88 84 126 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 120 114 157 120 114 157 120 114 157 121 115 159 219 217 229 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 231 231 244 186 183 208 131 126 164 107 101 144 110 102 146 107 101 144 107 101 144 -+107 101 144 107 101 144 107 101 144 105 100 143 105 99 142 105 99 142 105 99 142 104 98 141 -+104 97 144 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 113 109 162 116 112 152 116 112 152 116 112 152 120 114 157 186 183 208 251 250 252 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 245 245 249 206 201 229 165 162 202 -+142 137 174 105 99 142 105 99 142 105 99 142 107 101 144 105 100 143 105 99 142 105 99 142 -+104 98 141 104 98 141 104 98 141 102 97 140 102 97 140 102 97 140 100 95 138 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 114 106 151 114 106 151 114 106 151 114 106 151 114 108 147 121 115 159 -+165 162 202 219 217 229 245 245 249 255 255 255 255 255 255 255 255 255 255 255 255 252 252 253 -+231 231 244 219 217 229 186 183 208 161 160 183 134 128 170 114 108 147 107 101 144 107 101 144 -+104 98 141 105 99 142 105 99 142 104 98 141 104 98 141 102 97 140 102 97 140 102 97 140 -+102 97 140 102 97 140 100 95 138 100 95 138 102 95 138 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 114 106 151 114 106 151 110 102 146 114 108 147 110 102 146 -+114 108 147 110 102 146 110 102 146 116 112 152 125 119 163 120 114 157 116 112 152 107 101 144 -+107 101 144 105 99 142 107 101 144 107 101 144 105 99 142 104 98 141 104 98 141 104 98 141 -+104 98 141 102 95 138 102 97 140 102 97 140 102 97 140 100 95 138 102 95 138 100 95 138 -+100 95 138 100 95 138 100 95 138 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 110 102 146 110 102 146 110 102 146 107 101 144 -+107 101 144 107 101 144 107 101 144 107 101 144 105 99 142 107 101 144 105 99 142 105 99 142 -+104 98 141 104 98 141 104 98 141 102 97 140 102 97 140 102 95 138 102 95 138 102 95 138 -+102 95 138 100 95 138 100 95 138 100 95 138 100 95 138 100 95 138 100 95 138 97 91 133 -+100 95 138 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 104 97 144 104 97 144 104 97 144 -+105 100 143 105 99 142 105 99 142 104 98 141 104 98 141 102 97 140 102 97 140 102 97 140 -+102 97 140 102 97 140 100 95 138 102 95 138 100 95 138 100 95 138 100 95 138 97 94 132 -+97 91 133 100 95 138 97 91 133 97 91 133 97 91 133 97 91 133 97 91 133 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 104 97 144 102 97 140 -+102 97 140 102 97 140 102 97 140 102 97 140 102 97 140 100 95 138 100 95 138 100 95 138 -+100 95 138 100 95 138 97 91 133 100 95 138 97 91 133 97 91 133 97 91 133 97 91 133 -+97 91 133 97 91 133 97 91 133 95 88 132 100 85 132 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 88 84 126 -+102 97 140 100 95 138 100 95 138 100 95 138 97 91 133 100 95 138 97 91 133 97 91 133 -+97 91 133 97 91 133 97 91 133 97 91 133 97 91 133 97 91 133 95 88 132 95 88 132 -+95 88 132 97 94 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 95 88 132 97 91 133 97 91 133 97 91 133 97 91 133 97 91 133 -+95 88 132 95 88 132 95 88 132 95 88 132 95 88 132 95 88 132 72 70 123 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 -diff --git a/drivers/video/logo/logo_oldzen_clut224.ppm b/drivers/video/logo/logo_oldzen_clut224.ppm -new file mode 100644 -index 000000000000..d16b347e3297 ---- /dev/null -+++ b/drivers/video/logo/logo_oldzen_clut224.ppm -@@ -0,0 +1,882 @@ -+P3 -+80 80 -+255 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 43 56 0 47 62 0 2 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 28 37 105 174 196 105 174 196 0 61 80 0 2 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 20 27 61 146 173 167 209 223 167 209 223 124 186 205 0 96 126 -+0 5 6 0 2 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 31 41 79 158 183 152 201 217 174 213 226 167 209 223 159 205 220 157 204 219 -+27 122 151 0 19 25 0 9 11 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 31 41 65 149 175 152 201 217 162 207 221 167 209 223 164 208 222 167 209 223 172 212 225 -+145 197 214 11 108 138 0 17 22 0 11 14 0 4 5 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 2 0 19 25 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 8 10 -+70 152 178 159 205 220 164 208 222 164 208 222 169 211 224 164 208 222 164 208 222 169 211 224 -+162 207 221 118 182 202 0 61 80 0 23 31 0 18 24 0 4 5 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 2 0 47 62 0 16 21 0 2 3 0 4 6 0 3 4 0 0 0 0 3 4 -+33 126 155 169 211 224 172 212 225 179 216 228 167 209 223 172 212 225 164 208 222 179 216 228 -+162 207 221 50 138 166 0 45 59 0 84 111 0 51 67 0 16 21 0 2 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 67 88 14 111 141 0 10 13 0 11 14 0 13 17 0 2 3 0 0 0 -+0 5 7 16 112 142 135 192 210 164 208 222 157 204 219 162 207 221 167 209 223 159 205 220 -+89 164 188 0 57 75 19 115 145 85 162 186 14 111 141 0 41 54 0 11 15 0 0 0 -+0 8 11 0 83 109 0 31 40 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 40 52 75 156 181 5 103 133 0 15 20 0 16 22 0 10 13 0 0 0 -+0 0 0 0 9 12 13 110 140 133 191 209 167 209 223 169 211 224 172 212 225 103 173 195 -+0 62 81 0 96 126 145 197 214 140 195 212 27 122 151 0 48 63 0 7 10 0 9 11 -+5 103 133 140 195 212 61 146 173 0 21 28 0 1 1 0 1 2 0 1 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 10 13 51 139 167 131 189 208 0 90 118 0 22 29 0 13 17 0 5 6 -+0 0 0 0 0 1 0 11 15 0 95 124 140 195 212 169 211 224 97 169 192 0 69 91 -+0 84 111 159 205 220 179 216 228 95 168 191 0 75 98 0 21 28 0 26 34 19 115 145 -+138 193 211 164 208 222 154 203 218 39 130 159 0 10 13 0 8 10 0 6 8 0 2 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 2 0 87 114 140 195 212 131 189 208 25 119 149 0 29 38 0 7 10 -+0 1 2 0 0 1 0 2 3 0 7 9 0 98 128 53 141 168 0 64 84 0 69 91 -+152 201 217 177 215 227 56 143 170 0 69 91 0 23 30 0 62 81 68 151 177 149 200 216 -+164 208 222 164 208 222 169 211 224 147 199 215 7 105 135 0 19 25 0 20 26 0 7 10 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 13 18 81 159 184 167 209 223 172 212 225 107 175 197 0 89 116 -+0 18 23 0 4 5 0 1 2 0 2 3 0 4 6 0 14 19 0 40 52 26 120 150 -+16 112 142 0 63 83 0 40 52 0 67 88 68 151 177 149 200 216 167 209 223 164 208 222 -+177 215 227 174 213 226 167 209 223 172 212 225 145 197 214 10 107 137 0 26 35 0 21 28 -+0 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 2 -+0 2 3 0 4 5 0 5 6 0 3 4 0 1 2 0 1 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 1 0 55 72 138 193 211 159 205 220 167 209 223 182 218 229 -+58 144 171 0 86 112 0 35 46 0 14 19 0 10 13 0 14 19 0 24 32 0 39 51 -+0 52 69 0 92 120 61 146 173 129 188 207 167 209 223 167 209 223 169 211 224 167 209 223 -+177 215 227 167 209 223 164 208 222 172 212 225 164 208 222 133 191 209 0 77 101 0 25 33 -+0 20 26 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 1 2 0 8 11 0 26 35 0 56 73 0 82 107 -+3 101 131 26 120 150 32 125 154 7 105 135 0 92 120 0 75 98 0 40 52 0 13 18 -+0 1 1 0 0 0 0 0 0 0 3 4 17 113 143 159 205 220 167 209 223 174 213 226 -+167 209 223 147 199 215 99 170 193 61 146 173 58 144 171 56 143 170 63 147 174 68 151 177 -+99 170 193 140 195 212 162 207 221 164 208 222 169 211 224 167 209 223 174 213 226 167 209 223 -+172 212 225 167 209 223 169 211 224 164 208 222 164 208 222 113 179 200 0 72 94 0 46 60 -+0 52 69 0 15 20 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 2 0 21 28 0 86 112 66 150 176 120 183 203 129 188 207 140 195 212 -+152 201 217 162 207 221 164 208 222 152 201 217 142 196 213 135 192 210 122 184 204 105 174 196 -+0 83 109 0 12 15 0 0 0 0 1 1 0 14 18 46 136 164 177 215 227 157 204 219 -+167 209 223 169 211 224 169 211 224 164 208 222 167 209 223 169 211 224 174 213 226 174 213 226 -+174 213 226 172 212 225 164 208 222 167 209 223 172 212 225 174 213 226 172 212 225 164 208 222 -+174 213 226 169 211 224 169 211 224 162 207 221 91 165 189 0 79 103 0 64 84 36 128 157 -+9 106 136 0 42 55 0 10 13 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 -+0 48 63 40 131 160 142 196 213 172 212 225 172 212 225 164 208 222 169 211 224 177 215 227 -+169 211 224 169 211 224 169 211 224 167 209 223 167 209 223 167 209 223 162 207 221 157 204 219 -+164 208 222 89 164 188 0 51 67 0 4 6 0 5 7 0 18 23 23 118 148 135 192 210 -+167 209 223 162 207 221 169 211 224 174 213 226 167 209 223 174 213 226 164 208 222 167 209 223 -+164 208 222 162 207 221 169 211 224 172 212 225 162 207 221 169 211 224 174 213 226 169 211 224 -+162 207 221 167 209 223 140 195 212 27 122 151 0 49 64 0 87 114 120 183 203 149 200 216 -+42 133 161 0 66 86 0 19 25 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 0 37 48 27 122 151 -+129 188 207 172 212 225 164 208 222 169 211 224 172 212 225 167 209 223 169 211 224 172 212 225 -+167 209 223 172 212 225 174 213 226 177 215 227 172 212 225 169 211 224 167 209 223 169 211 224 -+167 209 223 164 208 222 105 174 196 0 51 67 0 11 14 0 10 13 0 17 22 0 93 122 -+118 182 202 169 211 224 174 213 226 164 208 222 174 213 226 164 208 222 169 211 224 167 209 223 -+169 211 224 169 211 224 167 209 223 167 209 223 169 211 224 169 211 224 162 207 221 174 213 226 -+118 182 202 55 142 169 0 80 105 0 49 64 51 139 167 140 195 212 154 203 218 91 165 189 -+16 112 142 0 49 64 0 13 18 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 8 10 0 95 124 103 173 195 154 203 218 -+172 212 225 162 207 221 172 212 225 172 212 225 169 211 224 164 208 222 174 213 226 177 215 227 -+172 212 225 172 212 225 174 213 226 174 213 226 172 212 225 174 213 226 172 212 225 169 211 224 -+172 212 225 169 211 224 174 213 226 77 157 182 0 24 32 0 23 31 0 18 24 0 16 21 -+0 69 91 61 146 173 149 200 216 169 211 224 164 208 222 169 211 224 164 208 222 164 208 222 -+169 211 224 169 211 224 164 208 222 169 211 224 169 211 224 152 201 217 91 165 189 37 129 158 -+0 73 96 0 57 75 2 100 130 75 156 181 184 219 230 124 186 205 66 150 176 13 110 140 -+0 54 70 0 20 26 0 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 52 69 145 197 214 164 208 222 169 211 224 -+174 213 226 164 208 222 172 212 225 172 212 225 174 213 226 169 211 224 172 212 225 167 209 223 -+174 213 226 174 213 226 172 212 225 174 213 226 167 209 223 169 211 224 172 212 225 174 213 226 -+177 215 227 174 213 226 174 213 226 164 208 222 0 89 116 0 30 39 0 41 54 0 22 29 -+0 16 21 0 26 35 0 64 84 25 119 149 91 165 189 140 195 212 169 211 224 169 211 224 -+172 212 225 159 205 220 124 186 205 70 152 178 21 116 146 0 75 98 0 50 66 0 50 66 -+4 102 132 85 162 186 147 199 215 131 189 208 83 161 185 37 129 158 0 86 112 0 45 59 -+0 14 18 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 14 18 60 145 172 167 209 223 167 209 223 -+174 213 226 174 213 226 172 212 225 164 208 222 162 207 221 169 211 224 172 212 225 169 211 224 -+172 212 225 162 207 221 169 211 224 169 211 224 174 213 226 174 213 226 172 212 225 157 204 219 -+162 207 221 172 212 225 157 204 219 169 211 224 103 173 195 0 45 59 0 54 70 0 41 54 -+0 20 26 0 14 19 0 14 19 0 19 25 0 28 37 0 47 62 0 58 76 0 63 83 -+0 64 84 0 55 72 0 41 54 0 37 48 0 38 50 0 58 76 0 76 100 5 103 133 -+58 144 171 70 152 178 48 137 165 27 122 151 0 86 112 0 44 58 0 25 33 0 9 12 -+0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 72 94 140 195 212 177 215 227 -+164 208 222 174 213 226 172 212 225 169 211 224 169 211 224 169 211 224 172 212 225 167 209 223 -+142 196 213 113 179 200 103 173 195 91 165 189 103 173 195 131 189 208 162 207 221 172 212 225 -+164 208 222 167 209 223 164 208 222 162 207 221 131 189 208 0 63 83 0 66 86 0 68 89 -+0 20 27 0 11 14 0 12 15 0 22 29 0 38 50 0 50 66 0 55 72 0 57 75 -+0 73 96 0 69 91 0 54 70 0 44 58 0 50 66 0 56 73 0 57 75 0 59 78 -+0 49 64 0 40 52 0 39 51 0 37 48 0 23 30 0 10 13 0 4 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 23 74 155 180 172 212 225 -+169 211 224 164 208 222 172 212 225 174 213 226 157 204 219 174 213 226 138 193 211 63 147 174 -+5 103 133 0 64 84 0 57 75 0 57 75 0 66 86 0 86 112 32 125 154 120 183 203 -+169 211 224 162 207 221 167 209 223 169 211 224 126 187 206 0 76 100 0 77 101 5 103 133 -+0 31 41 0 8 11 0 3 4 0 5 7 0 16 21 0 31 40 0 54 70 0 75 98 -+0 64 84 0 49 64 0 67 88 17 113 143 66 150 176 87 163 187 103 173 195 109 177 198 -+77 157 182 51 139 167 0 87 114 0 28 37 0 5 7 0 1 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 75 98 129 188 207 -+169 211 224 164 208 222 167 209 223 164 208 222 159 205 220 46 136 164 0 72 94 0 44 58 -+0 64 84 6 104 134 36 128 157 42 133 161 11 108 138 0 84 111 0 49 64 0 62 81 -+93 167 190 174 213 226 167 209 223 167 209 223 138 193 211 0 77 101 0 87 114 39 130 159 -+0 57 75 0 14 19 0 2 2 0 0 0 0 2 2 0 6 9 0 11 14 0 10 13 -+0 20 27 4 102 132 109 177 198 154 203 218 159 205 220 169 211 224 167 209 223 172 212 225 -+174 213 226 159 205 220 138 193 211 89 164 188 0 57 75 0 5 7 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 13 53 141 168 -+164 208 222 162 207 221 135 192 210 45 135 163 0 56 73 0 54 70 9 106 136 81 159 184 -+169 211 224 133 191 209 83 161 185 53 141 168 29 123 152 9 106 136 1 99 129 0 48 63 -+0 48 63 87 163 187 167 209 223 169 211 224 138 193 211 0 89 116 0 95 124 66 150 176 -+0 77 101 0 20 26 0 2 3 0 0 0 0 0 0 0 0 0 0 1 2 0 21 28 -+63 147 174 145 197 214 167 209 223 167 209 223 164 208 222 174 213 226 169 211 224 169 211 224 -+177 215 227 177 215 227 169 211 224 177 215 227 147 199 215 40 131 160 0 26 34 0 4 6 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 60 -+147 199 215 66 150 176 0 83 109 0 49 64 4 102 132 103 173 195 162 207 221 120 183 203 -+75 156 181 29 123 152 0 98 128 0 67 88 0 47 62 0 38 50 0 34 45 0 31 41 -+0 12 16 16 112 142 164 208 222 172 212 225 133 191 209 0 80 105 0 95 124 89 164 188 -+0 93 122 0 26 34 0 4 5 0 0 0 0 0 0 0 0 0 0 23 31 51 139 167 -+164 208 222 167 209 223 167 209 223 169 211 224 169 211 224 169 211 224 167 209 223 172 212 225 -+159 205 220 164 208 222 167 209 223 174 213 226 159 205 220 157 204 219 65 149 175 0 34 45 -+0 5 6 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 6 -+0 84 111 0 35 46 0 43 56 23 118 148 145 197 214 135 192 210 83 161 185 32 125 154 -+0 87 114 0 52 69 0 32 42 0 18 24 0 10 13 0 6 8 0 6 9 0 5 7 -+0 4 6 0 80 105 152 201 217 159 205 220 129 188 207 0 68 89 14 111 141 99 170 193 -+0 95 124 0 29 38 0 5 7 0 0 0 0 0 0 0 16 21 39 130 159 154 203 218 -+172 212 225 169 211 224 169 211 224 174 213 226 167 209 223 167 209 223 167 209 223 172 212 225 -+164 208 222 107 175 197 81 159 184 83 161 185 122 184 204 164 208 222 169 211 224 66 150 176 -+0 23 31 0 10 13 0 5 7 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 3 4 0 11 14 0 58 76 36 128 157 85 162 186 43 134 162 3 101 131 0 58 76 -+0 28 37 0 14 19 0 5 7 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 82 107 154 203 218 167 209 223 91 165 189 0 47 62 61 146 173 113 179 200 -+0 90 118 0 27 36 0 4 5 0 0 0 0 3 4 9 106 136 149 200 216 164 208 222 -+164 208 222 172 212 225 174 213 226 169 211 224 169 211 224 177 215 227 169 211 224 97 169 192 -+0 89 116 0 46 60 0 46 60 0 43 56 0 62 81 27 122 151 133 191 209 159 205 220 -+22 117 147 0 22 29 0 17 22 0 6 8 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 7 9 0 30 39 0 69 91 0 93 122 0 57 75 0 26 35 0 10 13 -+0 2 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 5 7 27 122 151 164 208 222 164 208 222 7 105 135 0 51 67 97 169 192 93 167 190 -+0 87 114 0 23 30 0 3 4 0 0 0 0 72 94 140 195 212 162 207 221 172 212 225 -+164 208 222 167 209 223 169 211 224 169 211 224 172 212 225 154 203 218 45 135 163 0 55 72 -+0 80 105 29 123 152 61 146 173 48 137 165 0 98 128 0 43 56 0 84 111 113 179 200 -+135 192 210 0 87 114 0 25 33 0 26 34 0 5 7 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 1 0 10 13 0 23 31 0 28 37 0 15 20 0 4 6 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 -+0 62 81 115 180 201 159 205 220 118 182 202 0 39 51 0 83 109 115 180 201 79 158 183 -+0 69 91 0 18 24 0 1 2 0 12 16 87 163 187 167 209 223 169 211 224 167 209 223 -+172 212 225 167 209 223 167 209 223 167 209 223 167 209 223 55 142 169 0 64 84 22 117 147 -+157 204 219 157 204 219 101 172 194 53 141 168 19 115 145 0 75 98 0 29 38 14 111 141 -+162 207 221 65 149 175 0 44 58 0 44 58 0 20 27 0 3 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 2 3 0 5 6 0 4 5 0 1 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 18 23 0 83 109 -+109 177 198 167 209 223 145 197 214 13 110 140 0 24 32 29 123 152 115 180 201 56 143 170 -+0 45 59 0 11 14 0 3 4 0 75 98 159 205 220 167 209 223 169 211 224 172 212 225 -+169 211 224 169 211 224 172 212 225 174 213 226 85 162 186 0 64 84 19 115 145 164 208 222 -+140 195 212 75 156 181 21 116 146 0 73 96 0 43 56 0 32 42 0 12 16 0 28 37 -+124 186 205 131 189 208 0 87 114 0 38 50 0 51 67 0 14 18 0 2 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 14 19 0 26 34 0 8 10 0 1 2 -+0 1 1 0 1 1 0 2 3 0 9 11 0 31 41 1 99 129 74 155 180 142 196 213 -+164 208 222 169 211 224 63 147 174 0 28 37 0 57 75 66 150 176 95 168 191 19 115 145 -+0 30 39 0 5 7 0 17 22 74 155 180 162 207 221 167 209 223 174 213 226 172 212 225 -+172 212 225 167 209 223 169 211 224 169 211 224 0 87 114 0 86 112 140 195 212 159 205 220 -+66 150 176 4 102 132 0 55 72 0 23 31 0 9 12 0 5 7 0 3 4 0 4 5 -+26 120 150 164 208 222 43 134 162 0 28 37 0 76 100 0 32 42 0 7 9 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 21 28 87 163 187 111 178 199 61 146 173 -+46 136 164 46 136 164 70 152 178 118 182 202 174 213 226 167 209 223 167 209 223 167 209 223 -+159 205 220 74 155 180 0 40 52 0 37 48 33 126 155 85 162 186 43 134 162 0 69 91 -+0 13 18 0 6 8 0 95 124 138 193 211 164 208 222 162 207 221 172 212 225 162 207 221 -+169 211 224 169 211 224 162 207 221 51 139 167 0 46 60 91 165 189 162 207 221 95 168 191 -+1 99 129 0 42 55 0 13 17 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 47 62 126 187 206 111 178 199 0 51 67 0 63 83 0 71 93 0 20 26 0 2 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 4 6 25 119 149 159 205 220 169 211 224 -+172 212 225 172 212 225 164 208 222 167 209 223 172 212 225 172 212 225 167 209 223 162 207 221 -+63 147 174 0 54 70 0 47 62 19 115 145 81 159 184 61 146 173 0 95 124 0 34 45 -+0 4 5 0 29 38 77 157 182 157 204 219 172 212 225 167 209 223 164 208 222 162 207 221 -+174 213 226 164 208 222 113 179 200 0 61 80 18 114 144 184 219 230 122 184 204 29 123 152 -+0 49 64 0 14 19 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 15 20 77 157 182 145 197 214 0 93 122 0 47 62 4 102 132 0 38 50 0 6 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 68 89 138 193 211 169 211 224 -+179 216 228 172 212 225 164 208 222 174 213 226 169 211 224 174 213 226 124 186 205 39 130 159 -+0 48 63 0 67 88 53 141 168 103 173 195 83 161 185 16 112 142 0 48 63 0 10 13 -+0 5 7 12 109 139 149 200 216 169 211 224 174 213 226 169 211 224 172 212 225 174 213 226 -+167 209 223 149 200 216 18 114 144 0 55 72 159 205 220 147 199 215 68 151 177 0 80 105 -+0 21 28 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 6 8 46 136 164 162 207 221 39 130 159 0 33 44 11 108 138 0 61 80 0 14 18 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 33 95 168 191 164 208 222 -+172 212 225 162 207 221 169 211 224 167 209 223 162 207 221 172 212 225 55 142 169 0 29 38 -+0 44 58 46 136 164 129 188 207 93 167 190 16 112 142 0 55 72 0 14 19 0 2 2 -+0 64 84 118 182 202 172 212 225 174 213 226 169 211 224 172 212 225 167 209 223 167 209 223 -+159 205 220 85 162 186 0 57 75 42 133 161 190 222 232 111 178 199 19 115 145 0 43 56 -+0 10 13 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 4 5 33 126 155 162 207 221 83 161 185 0 32 42 2 100 130 0 84 111 0 23 31 -+0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 5 7 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 8 43 134 162 167 209 223 -+174 213 226 169 211 224 164 208 222 169 211 224 177 215 227 164 208 222 126 187 206 48 137 165 -+0 82 107 0 42 55 0 59 78 0 76 100 0 39 51 0 13 18 0 7 10 0 69 91 -+138 193 211 167 209 223 164 208 222 169 211 224 179 216 228 167 209 223 177 215 227 167 209 223 -+131 189 208 0 75 98 0 92 120 152 201 217 122 184 204 39 130 159 0 63 83 0 18 24 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 2 3 34 127 156 167 209 223 131 189 208 0 42 55 0 80 105 13 110 140 0 38 50 -+0 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 8 0 18 24 0 0 0 -+0 1 2 0 3 4 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 86 112 145 197 214 -+167 209 223 167 209 223 169 211 224 169 211 224 167 209 223 164 208 222 164 208 222 164 208 222 -+152 201 217 61 146 173 0 86 112 0 43 56 0 25 33 0 40 52 12 109 139 122 184 204 -+167 209 223 167 209 223 174 213 226 162 207 221 174 213 226 169 211 224 167 209 223 149 200 216 -+12 109 139 0 58 76 83 161 185 157 204 219 75 156 181 0 90 118 0 33 44 0 7 9 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 3 4 33 126 155 172 212 225 162 207 221 0 50 66 0 73 96 30 124 153 0 55 72 -+0 9 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 14 0 40 52 0 1 2 -+0 6 8 0 9 12 0 7 10 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 47 126 187 206 -+169 211 224 174 213 226 169 211 224 172 212 225 174 213 226 169 211 224 169 211 224 164 208 222 -+174 213 226 169 211 224 135 192 210 83 161 185 75 156 181 101 172 194 142 196 213 172 212 225 -+167 209 223 174 213 226 167 209 223 169 211 224 169 211 224 172 212 225 133 191 209 21 116 146 -+0 52 69 56 143 170 164 208 222 120 183 203 19 115 145 0 48 63 0 13 18 0 2 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 4 5 37 129 158 167 209 223 162 207 221 0 61 80 0 79 103 46 136 164 0 71 93 -+0 13 18 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 11 0 61 80 0 6 8 -+0 10 13 0 20 26 0 14 19 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 11 65 149 175 -+174 213 226 157 204 219 167 209 223 177 215 227 172 212 225 164 208 222 164 208 222 167 209 223 -+162 207 221 169 211 224 159 205 220 179 216 228 159 205 220 157 204 219 149 200 216 164 208 222 -+169 211 224 159 205 220 167 209 223 174 213 226 157 204 219 66 150 176 0 82 107 0 50 66 -+66 150 176 164 208 222 142 196 213 60 145 172 0 75 98 0 22 29 0 5 6 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 6 9 51 139 167 167 209 223 172 212 225 0 84 111 0 64 84 51 139 167 0 84 111 -+0 18 23 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 6 0 95 124 0 23 31 -+0 10 13 0 29 38 0 24 32 0 6 8 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 84 -+21 116 146 0 76 100 0 61 80 0 54 70 0 56 73 0 77 101 23 118 148 113 179 200 -+157 204 219 172 212 225 169 211 224 167 209 223 167 209 223 91 165 189 0 61 80 0 55 72 -+0 82 107 0 95 124 0 89 116 0 62 81 0 45 59 0 43 56 0 95 124 131 189 208 -+167 209 223 118 182 202 45 135 163 0 83 109 0 27 36 0 5 7 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 23 30 95 168 191 167 209 223 174 213 226 3 101 131 0 45 59 46 136 164 2 100 130 -+0 23 30 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 23 118 148 0 61 80 -+0 9 11 0 36 47 0 32 42 0 6 9 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 -+0 6 8 0 11 14 0 39 51 0 82 107 3 101 131 0 80 105 0 55 72 0 55 72 -+34 127 156 131 189 208 169 211 224 169 211 224 167 209 223 105 174 196 0 61 80 0 33 44 -+0 63 83 0 54 70 0 66 86 0 95 124 0 84 111 29 123 152 109 177 198 118 182 202 -+70 152 178 25 119 149 0 76 100 0 33 44 0 7 10 0 1 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 61 80 152 201 217 169 211 224 164 208 222 3 101 131 0 48 63 53 141 168 10 107 137 -+0 27 36 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 21 116 146 25 119 149 -+0 9 12 0 37 48 0 41 54 0 13 18 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 16 21 0 62 81 23 118 148 45 135 163 36 128 157 0 98 128 0 58 76 -+0 38 50 3 101 131 129 188 207 172 212 225 167 209 223 154 203 218 29 123 152 0 48 63 -+74 155 180 46 136 164 36 128 157 30 124 153 0 48 63 0 55 72 12 109 139 13 110 140 -+0 84 111 0 51 67 0 23 30 0 7 10 0 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 -+32 125 154 169 211 224 169 211 224 169 211 224 9 106 136 0 48 63 60 145 172 16 112 142 -+0 31 40 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 82 107 85 162 186 -+0 24 32 0 28 37 0 50 66 0 25 33 0 2 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 6 8 0 26 34 0 52 69 0 66 86 0 56 73 0 45 59 0 41 54 -+0 34 45 0 23 31 5 103 133 152 201 217 174 213 226 172 212 225 111 178 199 0 50 66 -+18 114 144 33 126 155 0 98 128 0 52 69 0 19 25 0 23 31 0 33 44 0 41 54 -+0 25 33 0 14 18 0 5 6 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 27 -+120 183 203 172 212 225 169 211 224 167 209 223 4 102 132 0 56 73 72 153 179 21 116 146 -+0 34 45 0 6 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 63 126 187 206 -+0 89 116 0 23 31 0 59 78 0 34 45 0 5 7 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 2 0 6 8 0 12 16 0 12 16 0 7 9 0 6 8 0 6 8 -+0 6 8 0 7 9 0 20 27 93 167 190 172 212 225 172 212 225 167 209 223 7 105 135 -+0 56 73 16 112 142 0 59 78 0 12 15 0 29 38 0 29 38 0 8 10 0 12 15 -+0 9 12 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 8 19 115 145 -+167 209 223 172 212 225 172 212 225 167 209 223 0 82 107 0 92 120 107 175 197 29 123 152 -+0 38 50 0 7 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 31 105 174 196 -+72 153 179 0 36 47 0 54 70 0 54 70 0 11 15 0 1 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 1 0 3 4 16 112 142 162 207 221 172 212 225 169 211 224 53 141 168 -+0 40 52 6 104 134 0 55 72 0 8 11 0 36 47 0 66 86 0 3 4 0 7 10 -+0 9 11 0 5 6 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 0 63 83 131 189 208 -+167 209 223 172 212 225 172 212 225 164 208 222 0 63 83 7 105 135 131 189 208 26 120 150 -+0 37 48 0 7 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 13 77 157 182 -+135 192 210 0 90 118 0 40 52 0 75 98 0 21 28 0 4 5 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 1 0 90 118 157 204 219 172 212 225 169 211 224 97 169 192 -+0 41 54 3 101 131 0 73 96 0 11 15 0 46 60 45 135 163 0 15 20 0 10 13 -+0 16 22 0 11 15 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 55 72 93 167 190 167 209 223 -+172 212 225 164 208 222 167 209 223 135 192 210 0 48 63 32 125 154 126 187 206 17 113 143 -+0 32 42 0 6 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 17 113 143 -+154 203 218 79 158 183 0 47 62 0 59 78 0 39 51 0 7 10 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 86 112 162 207 221 167 209 223 169 211 224 149 200 216 -+0 52 69 0 90 118 5 103 133 0 17 22 0 52 69 118 182 202 0 90 118 0 13 18 -+0 31 41 0 20 26 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 1 0 62 81 97 169 192 167 209 223 174 213 226 -+172 212 225 179 216 228 164 208 222 77 157 182 0 41 54 65 149 175 109 177 198 7 105 135 -+0 27 36 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43 56 -+159 205 220 147 199 215 40 131 160 0 36 47 0 59 78 0 23 31 0 2 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 1 4 102 132 167 209 223 164 208 222 172 212 225 174 213 226 -+0 68 89 0 75 98 26 120 150 0 26 35 0 49 64 135 192 210 126 187 206 10 107 137 -+0 23 30 0 14 18 0 6 9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 1 0 13 17 7 105 135 149 200 216 164 208 222 167 209 223 177 215 227 -+167 209 223 164 208 222 162 207 221 17 113 143 0 61 80 138 193 211 87 163 187 0 89 116 -+0 19 25 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 13 -+95 168 191 172 212 225 135 192 210 0 98 128 0 31 40 0 35 46 0 11 15 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 7 9 58 144 171 167 209 223 174 213 226 169 211 224 172 212 225 -+0 79 103 0 69 91 43 134 162 0 43 56 0 32 42 99 170 193 167 209 223 162 207 221 -+45 135 163 0 69 91 0 21 28 0 7 10 0 3 4 0 4 5 0 6 8 0 8 11 -+0 31 40 0 83 109 68 151 177 154 203 218 162 207 221 167 209 223 172 212 225 172 212 225 -+172 212 225 167 209 223 142 196 213 0 72 94 9 106 136 179 216 228 65 149 175 0 72 94 -+0 13 18 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+19 115 145 167 209 223 167 209 223 120 183 203 0 50 66 0 28 37 0 23 30 0 5 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 1 0 40 52 120 183 203 164 208 222 169 211 224 174 213 226 169 211 224 -+0 82 107 0 77 101 61 146 173 0 67 88 0 18 24 58 144 171 167 209 223 167 209 223 -+157 204 219 122 184 204 72 153 179 48 137 165 36 128 157 37 129 158 42 133 161 56 143 170 -+99 170 193 147 199 215 174 213 226 172 212 225 169 211 224 169 211 224 172 212 225 164 208 222 -+167 209 223 167 209 223 61 146 173 0 39 51 81 159 184 140 195 212 39 130 159 0 54 70 -+0 8 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 47 62 133 191 209 172 212 225 169 211 224 91 165 189 0 44 58 0 23 31 0 12 16 -+0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 9 11 25 119 149 154 203 218 159 205 220 162 207 221 174 213 226 177 215 227 -+0 76 100 0 77 101 75 156 181 1 99 129 0 13 17 19 115 145 174 213 226 162 207 221 -+162 207 221 169 211 224 172 212 225 167 209 223 167 209 223 167 209 223 167 209 223 169 211 224 -+167 209 223 167 209 223 169 211 224 167 209 223 172 212 225 167 209 223 167 209 223 172 212 225 -+174 213 226 145 197 214 2 100 130 0 64 84 198 226 235 109 177 198 14 111 141 0 40 52 -+0 4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 6 8 37 129 158 167 209 223 164 208 222 172 212 225 99 170 193 0 55 72 0 20 26 -+0 6 8 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 6 9 7 105 135 140 195 212 164 208 222 177 215 227 172 212 225 159 205 220 174 213 226 -+0 72 94 3 101 131 105 174 196 6 104 134 0 15 20 0 55 72 113 179 200 172 212 225 -+172 212 225 169 211 224 169 211 224 169 211 224 172 212 225 174 213 226 174 213 226 174 213 226 -+174 213 226 174 213 226 164 208 222 169 211 224 172 212 225 174 213 226 164 208 222 169 211 224 -+162 207 221 65 149 175 0 48 63 75 156 181 164 208 222 68 151 177 0 79 103 0 23 30 -+0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 47 62 107 175 197 169 211 224 164 208 222 177 215 227 99 170 193 0 76 100 -+0 14 18 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 9 -+5 103 133 120 183 203 174 213 226 167 209 223 164 208 222 167 209 223 172 212 225 157 204 219 -+0 54 70 27 122 151 124 186 205 6 104 134 0 23 30 0 15 20 48 137 165 152 201 217 -+172 212 225 172 212 225 172 212 225 169 211 224 172 212 225 177 215 227 174 213 226 174 213 226 -+174 213 226 172 212 225 169 211 224 169 211 224 164 208 222 169 211 224 169 211 224 174 213 226 -+113 179 200 0 75 98 9 106 136 179 216 228 113 179 200 30 124 153 0 48 63 0 11 15 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 6 9 22 117 147 162 207 221 157 204 219 169 211 224 172 212 225 122 184 204 -+37 129 158 0 34 45 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 0 31 41 21 116 146 -+142 196 213 172 212 225 172 212 225 177 215 227 164 208 222 169 211 224 164 208 222 115 180 201 -+0 45 59 48 137 165 113 179 200 6 104 134 0 23 30 0 5 6 0 55 72 133 191 209 -+162 207 221 159 205 220 169 211 224 169 211 224 172 212 225 174 213 226 172 212 225 172 212 225 -+174 213 226 172 212 225 167 209 223 174 213 226 157 204 219 174 213 226 169 211 224 147 199 215 -+0 93 122 0 75 98 118 182 202 169 211 224 66 150 176 0 87 114 0 27 36 0 5 7 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 32 42 99 170 193 174 213 226 169 211 224 164 208 222 164 208 222 -+152 201 217 95 168 191 14 111 141 0 41 54 0 11 14 0 3 4 0 1 1 0 0 0 -+0 0 0 0 0 1 0 2 3 0 8 11 0 47 62 29 123 152 103 173 195 152 201 217 -+164 208 222 162 207 221 172 212 225 172 212 225 164 208 222 167 209 223 172 212 225 60 145 172 -+0 46 60 97 169 192 99 170 193 0 96 126 0 21 28 0 2 3 0 7 10 21 116 146 -+169 211 224 169 211 224 164 208 222 174 213 226 174 213 226 172 212 225 169 211 224 169 211 224 -+169 211 224 169 211 224 164 208 222 164 208 222 179 216 228 164 208 222 145 197 214 18 114 144 -+0 52 69 79 158 183 167 209 223 109 177 198 18 114 144 0 44 58 0 12 16 0 1 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 1 0 64 84 131 189 208 159 205 220 167 209 223 167 209 223 -+172 212 225 169 211 224 174 213 226 177 215 227 111 178 199 68 151 177 40 131 160 14 111 141 -+12 109 139 34 127 156 77 157 182 126 187 206 167 209 223 169 211 224 167 209 223 174 213 226 -+172 212 225 164 208 222 174 213 226 169 211 224 172 212 225 172 212 225 157 204 219 0 84 111 -+0 95 124 164 208 222 75 156 181 0 75 98 0 17 22 0 2 3 0 0 0 0 5 7 -+32 125 154 145 197 214 164 208 222 169 211 224 172 212 225 174 213 226 172 212 225 169 211 224 -+172 212 225 172 212 225 172 212 225 174 213 226 152 201 217 97 169 192 0 87 114 0 50 66 -+77 157 182 174 213 226 111 178 199 36 128 157 0 54 70 0 16 21 0 2 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 4 5 4 102 132 135 192 210 169 211 224 169 211 224 -+172 212 225 172 212 225 172 212 225 167 209 223 169 211 224 169 211 224 167 209 223 167 209 223 -+174 213 226 167 209 223 164 208 222 169 211 224 174 213 226 174 213 226 172 212 225 167 209 223 -+169 211 224 167 209 223 174 213 226 169 211 224 174 213 226 162 207 221 81 159 184 0 49 64 -+79 158 183 167 209 223 48 137 165 0 61 80 0 10 13 0 1 1 0 0 0 0 0 0 -+0 11 15 4 102 132 120 183 203 164 208 222 169 211 224 169 211 224 169 211 224 172 212 225 -+169 211 224 169 211 224 172 212 225 118 182 202 53 141 168 0 67 88 0 79 103 79 158 183 -+174 213 226 124 186 205 45 135 163 0 77 101 0 23 31 0 5 6 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 12 16 11 108 138 142 196 213 162 207 221 -+167 209 223 167 209 223 169 211 224 172 212 225 164 208 222 162 207 221 172 212 225 174 213 226 -+169 211 224 172 212 225 174 213 226 174 213 226 174 213 226 172 212 225 174 213 226 172 212 225 -+172 212 225 169 211 224 169 211 224 167 209 223 169 211 224 131 189 208 0 92 120 0 76 100 -+167 209 223 113 179 200 17 113 143 0 44 58 0 7 9 0 0 0 0 0 0 0 0 0 -+0 0 1 0 11 14 0 61 80 34 127 156 95 168 191 129 188 207 133 191 209 135 192 210 -+118 182 202 83 161 185 39 130 159 0 76 100 0 49 64 22 117 147 135 192 210 164 208 222 -+101 172 194 39 130 159 0 80 105 0 31 41 0 6 8 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 15 3 101 131 142 196 213 -+172 212 225 177 215 227 167 209 223 162 207 221 164 208 222 169 211 224 172 212 225 174 213 226 -+174 213 226 172 212 225 169 211 224 174 213 226 174 213 226 169 211 224 164 208 222 164 208 222 -+169 211 224 167 209 223 174 213 226 167 209 223 157 204 219 27 122 151 0 58 76 83 161 185 -+177 215 227 70 152 178 0 84 111 0 26 35 0 3 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 1 0 6 8 0 16 21 0 39 51 0 52 69 0 58 76 0 63 83 -+0 51 67 0 43 56 0 43 56 0 86 112 97 169 192 164 208 222 142 196 213 95 168 191 -+22 117 147 0 71 93 0 29 38 0 8 10 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 0 69 91 -+115 180 201 145 197 214 164 208 222 169 211 224 172 212 225 164 208 222 154 203 218 167 209 223 -+174 213 226 172 212 225 172 212 225 169 211 224 172 212 225 174 213 226 172 212 225 172 212 225 -+174 213 226 167 209 223 167 209 223 154 203 218 26 120 150 0 54 70 68 151 177 187 220 231 -+105 174 196 17 113 143 0 48 63 0 11 14 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 2 3 0 11 15 0 23 31 0 39 51 0 62 81 0 72 94 -+1 99 129 46 136 164 111 178 199 124 186 205 97 169 192 58 144 171 29 123 152 0 87 114 -+0 43 56 0 17 22 0 5 7 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 4 5 -+0 42 55 40 131 160 133 191 209 162 207 221 162 207 221 167 209 223 169 211 224 169 211 224 -+172 212 225 172 212 225 169 211 224 172 212 225 169 211 224 169 211 224 169 211 224 169 211 224 -+172 212 225 172 212 225 124 186 205 22 117 147 0 56 73 29 123 152 162 207 221 135 192 210 -+40 131 160 0 68 89 0 21 28 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 1 2 0 11 14 0 26 35 0 52 69 0 83 109 -+4 102 132 17 113 143 19 115 145 10 107 137 0 98 128 0 73 96 0 48 63 0 25 33 -+0 9 12 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -+0 5 7 0 22 29 0 75 98 46 136 164 124 186 205 169 211 224 167 209 223 167 209 223 -+172 212 225 169 211 224 169 211 224 167 209 223 169 211 224 169 211 224 167 209 223 167 209 223 -+147 199 215 55 142 169 0 86 112 0 59 78 79 158 183 147 199 215 138 193 211 70 152 178 -+0 86 112 0 33 44 0 7 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 5 6 0 13 17 0 22 29 -+0 33 44 0 39 51 0 40 52 0 33 44 0 28 37 0 19 25 0 10 13 0 4 6 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 2 0 8 10 0 16 21 0 23 30 0 57 75 13 110 140 75 156 181 147 199 215 -+177 215 227 167 209 223 164 208 222 167 209 223 174 213 226 147 199 215 85 162 186 30 124 153 -+0 69 91 0 42 55 0 84 111 131 189 208 177 215 227 124 186 205 60 145 172 0 96 126 -+0 38 50 0 9 11 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 3 4 -+0 6 8 0 6 9 0 8 10 0 7 9 0 4 5 0 2 3 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 1 0 6 9 0 18 24 0 24 32 0 25 33 0 29 38 0 36 47 -+0 56 73 0 72 94 0 77 101 0 72 94 0 57 75 0 44 58 0 44 58 0 57 75 -+4 102 132 83 161 185 149 200 216 133 191 209 75 156 181 21 116 146 0 71 93 0 32 42 -+0 7 9 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 0 3 4 0 13 18 0 27 36 0 42 55 0 49 64 -+0 54 70 0 61 80 0 64 84 0 80 105 4 102 132 17 113 143 43 134 162 85 162 186 -+118 182 202 95 168 191 61 146 173 26 120 150 0 87 114 0 49 64 0 23 30 0 8 10 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 5 7 0 14 18 0 29 38 -+0 50 66 0 69 91 0 95 124 14 111 141 26 120 150 33 126 155 34 127 156 25 119 149 -+9 106 136 0 93 122 0 73 96 0 49 64 0 25 33 0 11 15 0 4 6 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 5 6 -+0 12 15 0 19 25 0 26 34 0 36 47 0 45 59 0 46 60 0 43 56 0 41 54 -+0 33 44 0 24 32 0 16 22 0 10 13 0 5 6 0 1 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 1 0 2 3 0 4 5 0 5 7 0 7 9 0 7 10 0 6 9 -+0 3 4 0 3 4 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+ -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -diff --git a/drivers/video/logo/logo_slackware_clut224.ppm b/drivers/video/logo/logo_slackware_clut224.ppm -new file mode 100644 -index 000000000000..fbf39203bdd0 ---- /dev/null -+++ b/drivers/video/logo/logo_slackware_clut224.ppm -@@ -0,0 +1,1123 @@ -+P3 -+79 80 -+255 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 3 6 8 10 17 12 16 26 12 16 26 -+21 23 31 23 26 35 23 26 35 19 21 29 19 21 29 12 16 26 -+8 10 17 2 3 6 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 2 3 6 23 26 35 -+43 50 70 53 65 105 53 65 105 68 84 132 72 90 145 72 90 145 -+69 93 168 72 96 170 69 93 168 69 93 168 72 90 145 72 90 145 -+68 84 132 53 65 105 53 65 105 43 50 70 23 26 35 4 5 10 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 8 10 17 31 38 62 53 65 105 72 90 145 72 95 165 -+69 93 168 71 96 171 71 96 171 74 98 173 75 99 174 79 102 174 -+87 109 178 87 109 178 87 109 178 87 109 178 79 102 174 77 101 175 -+74 99 174 71 96 171 71 96 171 69 93 168 72 95 165 72 90 145 -+53 65 105 31 38 62 8 10 17 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 27 32 46 -+46 54 81 72 90 145 73 97 172 71 96 171 69 93 168 77 101 175 -+108 128 187 132 148 198 144 158 201 159 170 206 166 177 212 176 187 218 -+189 198 224 201 208 230 201 208 230 192 201 226 180 190 220 168 179 211 -+160 171 208 147 161 203 132 148 198 108 128 187 79 102 174 69 93 168 -+71 96 171 72 96 171 72 90 145 53 65 105 27 32 46 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 19 21 29 53 65 105 69 93 168 -+73 97 172 74 98 173 90 112 180 124 141 194 164 175 209 191 199 224 -+209 215 232 229 232 239 232 235 242 232 235 242 232 235 242 232 235 242 -+232 235 242 229 232 239 229 232 239 232 235 242 232 235 242 232 235 242 -+232 235 242 232 235 242 232 235 242 214 219 236 192 201 226 166 177 212 -+126 145 198 91 113 180 75 99 174 73 97 172 69 93 168 53 65 105 -+19 21 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 12 16 26 46 54 81 69 93 168 69 93 168 79 102 174 -+117 135 190 176 187 218 214 219 236 221 226 239 221 226 239 229 232 239 -+221 226 239 221 226 239 221 226 239 221 226 239 221 226 239 221 226 239 -+221 226 239 221 226 239 221 226 239 221 226 239 221 226 239 221 226 239 -+221 226 239 221 226 239 221 226 239 221 226 239 229 232 239 229 232 239 -+221 226 239 218 222 237 184 193 222 124 141 194 87 109 178 71 96 171 -+72 90 145 46 54 81 12 16 26 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 10 -+43 50 70 68 84 132 71 96 171 79 102 174 126 145 198 180 190 220 -+218 222 237 221 226 239 218 222 237 218 222 237 218 222 237 218 222 237 -+218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 -+218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 -+218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 -+218 222 237 221 226 239 221 226 239 221 226 239 185 195 223 136 152 200 -+87 109 178 71 96 171 68 84 132 46 54 81 8 10 17 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 27 32 46 68 84 132 -+69 93 168 77 101 175 132 148 198 191 199 224 213 218 233 218 222 237 -+214 219 236 213 218 233 214 219 236 214 219 236 213 218 233 213 218 233 -+214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 -+214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 -+214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 -+214 219 236 214 219 236 214 219 236 214 219 236 218 222 237 214 219 236 -+192 201 226 141 156 201 79 102 174 69 93 168 68 84 132 23 26 35 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 31 38 62 72 90 145 71 96 171 -+96 117 181 168 179 211 213 218 233 213 218 233 209 215 234 209 215 232 -+209 215 232 209 215 232 209 215 232 209 215 232 209 215 232 209 215 232 -+209 215 232 209 215 232 209 215 232 209 215 232 209 215 232 209 215 234 -+209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 -+209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 -+209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 -+214 219 236 214 219 236 176 187 218 108 128 187 71 96 171 72 90 145 -+31 38 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 1 2 3 43 50 70 72 90 145 74 98 172 124 141 194 -+191 199 224 209 215 232 205 212 231 205 212 231 205 212 231 205 212 231 -+205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 -+205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 -+205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 -+205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 -+205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 -+205 212 231 205 212 231 209 215 234 197 204 227 136 152 200 75 99 174 -+72 90 145 43 50 70 1 2 3 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+5 7 12 53 65 105 69 93 168 87 109 178 160 171 208 201 208 230 -+201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 -+201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 -+201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 -+201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 -+201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 -+201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 -+201 208 230 201 208 230 201 208 230 205 211 230 205 212 231 166 177 212 -+96 117 181 69 93 168 53 65 105 7 8 13 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 13 21 -+53 65 105 69 93 168 87 109 178 166 177 212 201 208 230 197 204 227 -+197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 -+197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 -+197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 -+197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 -+198 205 228 198 205 228 198 205 228 198 205 228 198 205 228 198 205 228 -+198 205 228 198 205 228 198 205 228 198 205 228 198 205 228 198 205 228 -+198 205 228 198 205 228 198 205 228 198 205 228 198 205 228 205 211 230 -+176 187 218 91 113 180 69 93 168 53 65 105 11 13 21 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 8 10 17 53 65 105 -+69 93 168 87 109 178 160 171 208 197 204 227 192 201 226 192 201 226 -+192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 -+192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 -+192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 -+192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 -+192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 -+192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 -+192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 194 201 224 -+198 205 228 169 180 211 91 113 180 71 96 169 53 65 105 5 7 12 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 1 2 3 46 54 81 69 93 168 -+87 109 178 160 171 208 192 201 226 189 197 224 189 197 224 189 197 224 -+189 197 224 189 197 224 189 197 224 189 197 224 189 197 224 189 197 224 -+189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 -+189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 -+188 198 224 188 198 224 189 198 224 189 197 224 189 198 224 189 198 224 -+189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 -+189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 -+189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 -+189 198 224 194 201 224 166 177 212 91 113 180 69 93 168 46 54 81 -+1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 31 38 62 72 95 165 79 102 174 -+153 166 206 189 197 224 184 193 222 184 193 222 184 193 222 184 193 222 -+184 193 222 184 193 222 184 193 222 184 193 222 184 193 222 184 193 222 -+184 193 220 184 193 222 185 195 223 185 195 223 185 195 223 184 193 222 -+185 195 222 185 195 223 185 195 223 185 195 223 185 195 223 185 195 223 -+185 195 223 185 195 223 185 195 223 185 195 223 185 195 223 185 195 223 -+185 195 222 184 193 222 185 195 223 185 195 223 185 195 223 185 195 223 -+185 195 222 185 195 223 185 195 223 185 195 223 185 195 222 185 195 223 -+185 195 223 185 195 223 185 195 223 185 195 223 185 195 223 185 195 223 -+185 195 223 185 195 223 189 198 224 160 171 208 84 105 171 69 93 168 -+31 38 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 27 32 46 72 90 145 72 96 171 126 145 198 -+184 193 220 180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 -+180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 -+180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 184 193 222 -+185 195 222 185 195 223 189 198 224 191 199 224 192 201 226 192 201 226 -+192 201 226 194 201 224 192 201 226 191 199 224 189 198 224 189 197 224 -+185 195 222 184 193 222 184 193 220 180 190 220 180 190 220 184 193 220 -+185 195 222 189 197 224 189 198 224 189 197 224 185 195 223 184 193 222 -+180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 -+180 190 220 180 190 220 180 190 220 185 195 223 137 153 200 74 98 173 -+72 90 145 27 32 46 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 12 16 26 68 84 132 71 96 169 96 117 181 169 180 211 -+176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 -+176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 -+176 187 218 176 187 218 180 190 220 180 190 220 185 195 223 189 198 224 -+197 204 227 201 208 230 205 212 231 209 215 232 213 218 233 214 219 236 -+218 222 237 214 219 236 213 218 233 209 215 232 205 212 231 201 208 230 -+197 204 227 192 201 226 189 197 224 185 195 223 184 193 222 189 197 224 -+192 201 226 201 208 230 205 212 231 205 211 230 197 204 227 185 195 223 -+180 190 220 176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 -+176 187 218 176 187 218 176 187 218 180 190 220 176 187 218 108 128 187 -+69 93 168 68 84 132 12 16 26 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 5 10 53 65 105 71 96 169 75 99 174 147 161 203 176 187 218 -+175 184 213 175 184 213 175 184 213 175 184 213 175 184 213 175 184 213 -+175 184 213 175 184 213 175 184 213 175 184 213 175 184 213 175 184 213 -+176 187 218 180 190 220 185 195 222 194 201 224 205 211 230 218 222 237 -+229 232 239 229 232 239 228 230 236 228 230 236 229 232 239 228 230 236 -+225 227 235 228 230 236 229 232 239 228 230 236 228 230 236 232 235 242 -+232 235 242 221 226 239 209 215 234 201 208 228 198 205 228 205 211 230 -+218 222 237 232 235 242 228 230 236 229 232 239 221 226 239 199 206 227 -+184 193 222 176 187 218 176 187 218 175 184 213 176 187 218 176 187 218 -+176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 160 171 208 -+79 102 174 71 96 169 53 65 105 2 3 6 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+31 38 62 72 95 165 72 96 171 117 135 190 169 180 211 166 177 212 -+166 177 212 166 177 212 166 177 212 166 177 212 166 177 212 168 179 211 -+168 179 211 168 179 211 168 179 211 166 177 212 168 179 211 175 184 213 -+180 190 220 191 199 224 205 212 231 229 232 239 232 235 242 209 213 223 -+185 191 210 156 164 188 156 164 188 129 135 150 128 134 148 122 122 122 -+122 122 122 122 122 122 128 134 148 129 135 150 129 135 150 156 164 188 -+183 190 208 204 208 221 225 227 235 232 235 242 232 235 242 232 235 242 -+219 222 229 168 177 206 129 135 150 156 164 188 219 222 229 221 226 239 -+189 198 224 176 187 218 169 180 211 168 179 211 169 180 211 169 180 211 -+169 180 211 169 180 211 169 180 211 169 180 211 169 180 211 175 184 213 -+127 144 195 72 96 171 72 95 165 31 38 62 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 8 13 -+53 65 105 72 96 170 87 109 178 152 165 205 166 177 212 166 177 212 -+166 177 212 166 177 212 166 177 212 166 177 212 166 177 212 166 177 212 -+166 177 212 164 175 209 166 177 212 166 177 212 169 180 211 180 190 220 -+194 201 224 218 222 237 232 235 242 194 200 218 156 164 188 128 134 148 -+122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 -+122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 -+122 122 122 122 122 122 129 135 150 156 164 188 183 190 208 156 164 188 -+128 134 148 122 122 122 122 122 122 122 122 122 156 164 188 229 232 239 -+197 204 227 176 187 218 166 177 212 166 177 212 166 177 212 166 177 212 -+166 177 212 166 177 212 166 177 212 166 177 212 166 177 212 166 177 212 -+160 171 208 90 112 180 71 96 171 53 65 105 8 10 17 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 38 62 -+72 95 165 71 96 171 108 128 187 160 171 208 160 171 208 160 171 208 -+160 171 208 160 171 208 160 171 208 160 171 208 160 171 208 160 171 208 -+160 171 208 160 171 208 160 171 208 166 177 212 176 187 218 197 204 224 -+232 235 242 209 213 223 129 135 150 122 122 122 122 122 122 122 122 122 -+122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 -+122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 -+122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 -+122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 228 230 236 -+201 208 230 176 187 218 164 175 209 160 171 208 160 171 208 160 171 208 -+164 175 209 164 175 209 164 175 209 164 175 209 164 175 209 164 175 209 -+166 177 212 117 135 190 71 96 171 72 95 165 31 38 62 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 7 8 13 68 84 132 -+73 97 171 74 98 172 132 148 198 160 171 208 159 170 206 159 170 206 -+159 170 206 159 170 206 159 170 206 159 170 206 159 170 206 159 170 206 -+153 166 206 153 166 206 160 171 208 169 180 211 190 198 223 229 232 239 -+204 208 221 122 122 122 113 116 128 122 122 122 122 122 122 122 122 122 -+122 122 122 113 116 128 113 116 128 113 116 128 113 116 128 122 122 122 -+122 122 122 113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 -+122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 -+122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 225 227 235 -+205 211 230 175 184 213 160 171 208 159 170 206 160 171 208 160 171 208 -+160 171 208 160 171 208 160 171 208 160 171 208 160 171 208 160 171 208 -+160 171 208 137 153 200 79 102 174 72 96 170 68 84 132 8 10 17 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 31 38 62 72 95 165 -+73 97 172 87 109 178 152 165 205 153 166 206 153 166 206 153 166 206 -+153 166 206 153 166 206 153 166 206 153 166 206 153 166 206 153 166 206 -+152 165 205 153 166 206 160 171 208 180 190 220 221 226 239 204 208 221 -+122 122 122 113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 -+113 116 128 129 135 150 168 177 206 194 200 218 219 222 229 228 230 236 -+225 227 235 219 222 229 209 213 223 183 190 208 129 135 150 122 122 122 -+113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 -+113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 219 222 229 -+205 211 230 169 180 211 153 166 206 153 166 206 153 166 206 153 166 206 -+153 166 206 153 166 206 153 166 206 153 166 206 153 166 206 153 166 206 -+153 166 206 153 166 206 91 113 180 72 96 171 72 95 165 43 50 70 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 11 13 21 53 65 105 74 98 173 -+72 96 170 111 130 189 149 162 202 147 161 203 147 161 203 147 161 203 -+147 161 203 147 161 203 147 161 203 147 161 203 147 161 203 147 161 203 -+147 161 203 152 165 205 166 177 212 199 206 227 228 230 236 122 122 122 -+78 87 115 113 116 128 113 116 128 78 87 115 78 87 115 129 135 150 -+194 200 218 232 235 242 221 226 239 213 217 231 205 211 230 197 204 227 -+197 204 227 201 208 228 209 215 232 218 222 235 232 235 242 225 227 235 -+183 190 208 122 122 122 78 87 115 113 116 128 113 116 128 113 116 128 -+113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 219 222 229 -+201 208 230 166 177 212 152 165 205 147 161 203 147 161 203 152 165 205 -+152 165 205 152 165 205 152 165 205 152 165 205 152 165 205 147 161 203 -+152 165 205 152 165 205 117 135 190 72 96 170 74 98 173 68 84 132 -+12 16 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 31 38 62 72 95 165 74 98 173 -+72 96 170 127 144 195 144 158 201 144 158 201 144 158 201 144 158 201 -+144 158 201 144 158 201 144 158 201 144 158 201 144 158 201 144 158 201 -+144 158 201 153 166 206 175 184 213 221 226 239 156 164 188 78 87 115 -+78 87 115 78 87 115 78 87 115 78 87 115 129 135 150 229 232 239 -+218 222 235 190 198 223 176 187 218 169 180 211 166 177 212 166 177 212 -+164 175 209 166 177 212 166 177 212 175 184 213 180 190 220 197 204 227 -+221 226 239 219 222 229 156 164 188 78 87 115 78 87 115 78 87 115 -+78 87 115 78 87 115 78 87 115 78 87 115 78 87 115 219 222 229 -+201 208 228 166 177 212 147 161 203 144 158 201 147 161 203 147 161 203 -+147 161 203 147 161 203 147 161 203 147 161 203 147 161 203 147 161 203 -+147 161 203 147 161 203 132 148 198 73 97 171 73 98 172 72 95 165 -+31 38 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 2 3 6 53 65 105 73 96 167 73 97 172 -+73 97 171 127 144 195 141 156 201 137 153 200 137 153 200 137 153 200 -+137 153 200 137 153 200 137 153 200 137 153 200 141 156 201 137 153 200 -+141 156 201 153 166 206 185 195 222 228 230 236 122 122 122 69 78 104 -+78 87 115 78 87 115 69 78 104 122 122 122 228 230 236 205 211 230 -+175 184 213 160 171 208 152 165 205 147 161 203 144 158 201 144 158 201 -+141 156 201 144 158 201 147 161 203 147 161 203 153 166 206 164 175 209 -+175 184 213 198 205 228 232 235 242 183 190 208 113 116 128 78 87 115 -+78 87 115 78 87 115 78 87 115 78 87 115 78 87 115 219 222 229 -+197 204 227 160 171 208 144 158 201 141 156 201 141 156 201 141 156 201 -+141 156 201 141 156 201 141 156 201 141 156 201 141 156 201 141 156 201 -+141 156 201 141 156 201 136 152 200 74 98 172 73 97 172 73 97 170 -+53 65 105 4 5 10 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 12 16 26 68 84 132 74 98 173 72 96 171 -+79 102 174 127 144 195 136 152 200 136 152 200 136 152 200 136 152 200 -+136 152 200 136 152 200 136 152 200 136 152 200 136 152 200 136 152 200 -+137 153 200 153 166 206 197 204 227 204 208 221 78 87 115 69 78 104 -+69 78 104 69 78 104 69 78 104 183 190 208 221 225 235 176 187 218 -+152 165 205 141 156 201 136 152 200 136 152 200 136 152 200 136 152 200 -+136 152 200 136 152 200 136 152 200 136 152 200 137 153 200 141 156 201 -+152 165 205 166 177 212 184 193 220 225 227 235 185 191 210 78 87 115 -+69 78 104 69 78 104 69 78 104 69 78 104 69 78 104 219 222 229 -+194 201 224 160 171 208 141 156 201 136 152 200 137 153 200 137 153 200 -+137 153 200 137 153 200 137 153 200 137 153 200 137 153 200 137 153 200 -+137 153 200 137 153 200 132 148 198 79 102 174 72 96 171 74 98 173 -+72 89 141 19 21 29 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 31 38 62 72 95 165 74 98 173 72 96 170 -+87 109 178 127 144 195 132 148 198 132 148 198 132 148 198 132 148 198 -+132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 -+136 152 200 153 166 206 201 208 230 183 190 208 69 78 104 69 78 104 -+69 78 104 69 78 104 69 78 104 209 213 223 199 206 227 160 171 208 -+137 153 200 132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 -+132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 -+132 148 198 141 156 201 153 166 206 176 187 218 221 225 235 183 190 208 -+69 78 104 56 62 79 69 78 104 69 78 104 69 78 104 219 222 229 -+185 195 222 152 165 205 136 152 200 132 148 198 132 148 198 132 148 198 -+132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 -+132 148 198 132 148 198 132 148 198 87 109 178 72 96 170 74 98 173 -+72 95 165 31 38 62 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 1 53 65 105 74 98 172 73 97 171 71 96 171 -+90 112 180 124 141 194 127 144 195 127 144 195 127 144 195 127 144 195 -+127 144 195 127 144 195 127 144 195 127 144 195 127 144 195 127 144 195 -+132 148 198 153 166 206 205 212 231 183 190 208 56 60 74 56 62 79 -+56 62 79 56 60 74 78 87 115 209 213 223 191 199 224 153 166 206 -+132 148 198 127 144 195 127 144 195 127 144 195 127 144 195 127 144 195 -+127 144 195 126 145 198 126 145 198 126 145 198 126 145 198 126 145 198 -+127 144 195 132 148 198 136 152 200 152 165 205 176 187 218 225 227 235 -+183 190 208 69 78 104 56 60 74 56 59 67 122 122 122 220 224 234 -+175 184 213 144 158 201 126 145 198 127 144 195 126 145 198 126 145 198 -+126 145 198 126 145 198 126 145 198 126 145 198 126 145 198 126 145 198 -+126 145 198 126 145 198 127 144 195 91 113 180 71 96 171 73 97 172 -+72 96 170 53 65 105 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 8 10 17 53 65 105 75 99 174 74 98 172 71 96 171 -+90 112 180 120 138 192 124 141 194 124 141 194 124 141 194 124 141 194 -+124 141 194 124 141 194 124 141 194 124 141 194 120 138 192 120 138 192 -+126 145 198 147 161 203 198 205 228 183 190 208 56 60 74 56 59 67 -+56 60 74 56 59 67 69 78 104 204 208 221 199 206 227 160 171 208 -+137 153 200 126 145 198 127 144 195 127 144 195 124 141 194 124 141 194 -+124 141 194 124 141 194 124 141 194 124 141 194 124 141 194 124 141 194 -+124 141 194 124 141 194 124 141 194 132 148 198 149 162 202 175 184 213 -+220 224 234 183 190 208 122 122 122 122 122 122 204 208 221 205 211 230 -+159 170 206 132 148 198 124 141 194 124 141 194 124 141 194 124 141 194 -+124 141 194 124 141 194 124 141 194 124 141 194 124 141 194 124 141 194 -+124 141 194 124 141 194 124 141 194 96 117 181 71 96 171 74 98 171 -+74 98 173 53 65 105 8 10 17 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 23 26 35 68 84 132 74 98 173 74 98 172 72 96 171 -+87 109 178 117 135 190 120 138 192 120 138 192 120 138 192 120 138 192 -+120 138 192 120 138 192 120 138 192 120 138 192 117 135 190 117 135 190 -+124 141 194 141 156 201 189 198 224 183 190 208 56 62 79 56 59 67 -+56 59 67 56 59 67 56 59 67 129 135 150 232 235 242 184 193 220 -+160 171 208 147 161 203 141 156 201 136 152 200 132 148 198 132 148 198 -+132 148 198 127 144 195 127 144 195 127 144 195 127 144 195 124 141 194 -+124 141 194 124 141 194 124 141 194 124 141 194 132 148 198 144 158 201 -+168 179 211 205 211 230 221 225 235 220 224 234 199 206 227 164 175 209 -+136 152 200 124 141 194 120 138 192 120 138 192 120 138 192 120 138 192 -+120 138 192 120 138 192 120 138 192 120 138 192 120 138 192 120 138 192 -+120 138 192 120 138 192 120 138 192 87 109 178 72 96 171 74 98 172 -+74 98 173 72 89 141 23 26 35 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 27 32 46 72 95 165 73 97 172 74 98 172 73 97 171 -+79 102 174 111 130 189 117 135 190 117 135 190 117 135 190 117 135 190 -+117 135 190 117 135 190 117 135 190 117 135 190 117 135 190 115 133 187 -+117 135 190 132 148 198 176 187 218 219 222 229 69 78 104 56 59 67 -+56 59 67 56 59 67 56 59 67 56 59 67 156 164 188 232 235 242 -+209 215 232 185 195 222 176 187 218 168 179 211 164 175 209 159 170 206 -+153 166 206 153 166 206 152 165 205 149 162 202 144 158 201 141 156 201 -+141 156 201 136 152 200 132 148 198 132 148 198 132 148 198 132 148 198 -+141 156 201 153 166 206 160 171 208 160 171 208 147 161 203 132 148 198 -+120 138 192 117 135 190 117 135 190 117 135 190 117 135 190 117 135 190 -+117 135 190 117 135 190 117 135 190 117 135 190 117 135 190 117 135 190 -+117 135 190 117 135 190 117 135 190 79 102 174 73 97 171 74 98 172 -+73 98 172 72 95 165 31 38 62 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 1 31 38 62 73 96 167 74 98 173 74 98 172 72 96 170 -+74 98 173 108 128 187 111 130 189 111 130 189 111 130 189 111 130 189 -+111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 -+111 130 189 124 141 194 153 166 206 221 225 235 122 122 122 38 41 51 -+56 59 67 56 59 67 56 59 67 38 41 51 56 59 67 113 116 128 -+156 164 188 209 213 223 209 213 223 209 213 223 213 217 231 213 217 231 -+213 217 231 209 215 232 209 215 232 209 215 232 201 208 230 192 201 226 -+185 195 222 180 190 220 175 184 213 164 175 209 153 166 206 147 161 203 -+144 158 201 141 156 201 136 152 200 132 148 198 124 141 194 117 135 190 -+111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 -+111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 -+111 130 189 111 130 189 111 130 189 75 99 174 73 97 171 74 98 172 -+74 98 172 72 96 170 31 38 62 0 0 0 0 0 0 0 0 0 -+0 0 0 -+2 3 6 46 54 81 71 96 169 74 98 173 74 98 172 73 97 171 -+72 96 171 96 117 181 108 128 187 108 128 187 108 128 187 108 128 187 -+108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 -+108 128 187 111 130 189 136 152 200 184 193 220 204 208 221 56 59 67 -+38 41 51 38 41 51 38 41 51 38 41 51 38 41 51 38 41 51 -+38 41 51 38 41 51 56 59 67 78 87 115 122 122 122 128 134 148 -+128 134 148 129 135 150 129 135 150 156 164 188 156 164 188 156 164 188 -+183 190 208 194 200 218 209 213 223 220 224 234 221 226 239 209 215 232 -+189 196 219 164 175 209 147 161 203 132 148 198 120 138 192 111 130 189 -+108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 -+108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 -+108 128 187 108 128 187 108 128 187 73 97 171 73 97 171 74 98 172 -+74 98 171 74 98 172 46 54 81 2 3 6 0 0 0 0 0 0 -+0 0 0 -+5 7 12 53 65 105 72 96 170 74 98 172 74 98 172 74 98 172 -+73 97 170 91 113 180 108 128 187 108 128 187 108 128 187 108 128 187 -+108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 -+108 128 187 108 128 187 120 138 192 152 165 205 213 218 233 156 164 188 -+34 36 42 34 36 42 38 41 51 34 36 42 34 36 42 34 36 42 -+34 36 42 34 36 42 34 36 42 34 36 42 34 36 42 29 31 36 -+29 31 36 29 31 36 29 31 36 29 31 36 29 31 36 38 41 51 -+56 59 67 56 59 67 69 78 104 78 87 115 113 116 128 129 135 150 -+204 208 221 225 227 235 199 206 227 166 177 212 141 156 201 120 138 192 -+111 130 189 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 -+108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 -+108 128 187 108 128 187 96 117 181 73 97 171 73 97 171 74 98 172 -+74 98 172 74 98 172 53 65 105 5 7 12 0 0 0 0 0 0 -+0 0 0 -+7 8 13 53 65 105 73 97 170 74 98 171 74 98 172 74 98 172 -+73 97 171 79 102 174 96 117 181 96 117 181 96 117 181 96 117 181 -+96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 -+96 117 181 96 117 181 108 128 187 127 144 195 160 171 208 218 222 235 -+156 164 188 38 41 51 27 29 36 34 36 42 34 36 42 34 36 42 -+34 36 42 34 36 42 34 36 42 34 36 42 34 36 42 34 36 42 -+34 36 42 34 36 42 34 36 42 34 36 42 34 36 42 34 36 42 -+29 31 36 29 31 36 29 31 36 29 31 36 27 29 36 29 31 36 -+34 36 42 69 78 104 156 164 188 210 214 227 190 198 223 147 161 203 -+120 138 192 108 128 187 96 117 181 96 117 181 96 117 181 96 117 181 -+96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 -+96 117 181 96 117 181 87 109 178 72 96 170 72 96 170 74 98 172 -+74 98 172 74 98 173 53 65 105 7 8 13 0 0 0 0 0 0 -+0 0 0 -+7 8 13 53 65 105 73 97 171 74 98 172 74 98 172 74 98 172 -+72 96 170 74 98 172 91 113 180 96 117 181 96 117 181 96 117 181 -+96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 -+96 117 181 96 117 181 96 117 181 108 128 187 127 144 195 160 171 208 -+218 222 237 183 190 208 69 78 104 21 23 31 19 21 29 21 23 31 -+27 29 36 29 31 36 29 31 36 29 31 36 29 31 36 29 31 36 -+29 31 36 29 31 36 27 29 36 29 31 36 29 31 36 29 31 36 -+29 31 36 29 31 36 29 31 36 29 31 36 29 31 36 29 31 36 -+27 29 36 21 23 31 19 21 29 78 87 115 204 208 221 199 206 227 -+144 158 201 117 135 190 96 117 181 96 117 181 96 117 181 96 117 181 -+96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 -+96 117 181 96 117 181 75 99 174 72 96 170 73 97 171 74 98 172 -+74 98 172 74 98 172 53 65 105 8 10 17 0 0 0 0 0 0 -+0 0 0 -+8 10 17 53 65 105 74 98 172 74 98 172 74 98 172 74 98 172 -+73 97 171 73 97 171 79 102 174 91 113 180 91 113 180 91 113 180 -+91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 -+91 113 180 90 112 180 90 112 180 91 113 180 96 117 181 120 138 192 -+147 161 203 194 201 224 219 222 229 156 164 188 69 78 104 38 41 51 -+19 21 29 8 10 17 11 13 21 17 19 24 17 19 24 17 19 24 -+17 19 24 17 19 24 17 19 24 17 19 24 17 19 24 21 23 31 -+21 23 31 21 23 31 21 23 31 21 23 31 21 23 31 21 23 31 -+21 23 31 21 23 31 19 21 29 17 19 24 56 59 67 194 200 218 -+189 197 224 132 148 198 108 128 187 91 113 180 91 113 180 91 113 180 -+91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 -+91 113 180 87 109 178 73 97 171 73 97 171 74 98 172 74 98 172 -+74 98 172 74 98 173 53 65 105 8 10 17 0 0 0 0 0 0 -+0 0 0 -+8 10 17 68 84 132 74 98 173 74 98 172 74 98 172 74 98 172 -+74 98 172 72 96 170 77 101 175 87 109 178 87 109 178 87 109 178 -+87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 -+87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 96 117 181 -+108 128 187 131 146 194 159 170 206 194 201 224 225 227 235 194 200 218 -+129 135 150 122 122 122 78 87 115 56 59 67 38 41 51 34 36 42 -+27 29 36 17 19 24 17 19 24 17 19 24 11 13 21 5 7 12 -+4 5 10 7 8 13 7 8 13 11 13 21 17 19 24 17 19 24 -+17 19 24 17 19 24 17 19 24 17 19 24 7 8 13 56 60 74 -+219 222 229 160 171 208 117 135 190 91 113 180 87 109 178 87 109 178 -+87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 -+87 109 178 79 102 174 72 96 170 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 173 53 65 105 8 10 17 0 0 0 0 0 0 -+0 0 0 -+7 8 13 53 65 105 74 98 173 74 98 172 74 98 172 74 98 172 -+74 98 172 73 97 171 74 98 172 79 102 174 84 105 171 84 105 171 -+84 105 171 84 105 171 84 105 171 84 105 171 84 105 171 84 105 171 -+84 105 171 79 102 174 84 105 171 87 109 178 87 109 178 91 113 180 -+96 117 181 96 117 181 111 130 189 124 141 194 144 158 201 168 179 211 -+192 201 226 209 215 232 209 213 223 194 200 218 183 190 208 183 190 208 -+183 190 208 183 190 208 183 190 208 183 190 208 183 190 208 183 190 208 -+156 164 188 156 164 188 122 122 122 56 59 67 17 19 24 7 8 13 -+8 10 17 11 13 21 11 13 21 11 13 21 8 10 17 5 7 12 -+129 135 150 201 208 230 127 144 195 96 117 181 87 109 178 84 105 171 -+87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 -+79 102 174 74 98 172 73 97 171 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 53 65 105 8 10 17 0 0 0 0 0 0 -+0 0 0 -+5 7 12 53 65 105 73 97 171 74 98 172 74 98 172 74 98 172 -+74 98 172 73 97 171 72 96 170 74 98 172 79 102 174 79 102 174 -+79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 -+79 102 174 79 102 174 87 109 178 96 117 181 111 130 189 117 135 190 -+117 135 190 108 128 187 96 117 181 96 117 181 96 117 181 108 128 187 -+117 135 190 127 144 195 137 153 200 152 165 205 160 171 208 160 171 208 -+166 177 212 168 179 211 169 180 211 169 180 211 175 184 213 176 187 218 -+184 193 220 189 196 219 202 207 223 219 222 229 204 208 221 113 116 128 -+2 3 6 4 5 10 5 7 12 5 7 12 7 8 13 0 0 0 -+56 59 67 204 208 221 147 161 203 96 117 181 84 105 171 79 102 174 -+79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 -+74 98 172 72 96 170 73 97 171 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 173 53 65 105 7 8 13 0 0 0 0 0 0 -+0 0 0 -+4 5 10 53 65 105 72 96 170 74 98 171 74 98 172 74 98 172 -+74 98 172 74 98 172 73 97 171 73 97 171 74 98 171 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 -+74 98 172 79 102 174 108 128 187 132 148 198 175 184 213 194 201 224 -+189 197 224 153 166 206 117 135 190 96 117 181 79 102 174 79 102 174 -+87 108 173 87 109 178 91 113 180 96 117 181 96 117 181 108 128 187 -+108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 111 130 189 -+111 130 189 120 137 191 127 144 195 144 158 201 178 186 211 220 224 234 -+122 122 122 0 0 0 1 2 3 1 2 3 1 2 3 0 0 0 -+7 8 13 183 190 208 166 177 212 108 128 187 79 102 174 74 98 172 -+75 99 174 75 99 174 75 99 174 75 99 174 75 99 174 74 98 172 -+73 97 171 73 97 171 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 53 65 105 5 7 12 0 0 0 0 0 0 -+0 0 0 -+2 3 6 46 54 81 73 96 167 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 73 97 172 73 97 171 -+73 97 171 73 97 171 73 97 171 73 97 171 72 96 171 72 96 170 -+75 99 174 91 113 180 132 148 198 198 204 221 183 190 208 122 122 122 -+129 135 150 210 214 227 164 175 209 111 130 189 87 109 178 74 98 172 -+73 97 171 74 98 171 74 98 172 75 99 174 79 102 174 79 102 174 -+79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 -+79 102 174 87 109 178 87 109 178 96 117 181 124 141 194 168 179 211 -+209 213 223 38 41 51 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 156 164 188 176 187 218 108 128 187 79 102 174 73 97 171 -+73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 171 -+73 97 171 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 171 73 97 171 46 54 81 2 3 6 0 0 0 0 0 0 -+0 0 0 -+1 2 3 31 38 62 72 95 165 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 73 97 170 72 96 171 -+79 102 174 108 128 187 175 184 213 183 190 208 17 19 24 0 0 0 -+0 0 0 69 78 104 220 224 234 144 157 197 96 117 181 79 102 174 -+73 97 171 72 96 170 73 97 171 73 97 171 74 98 171 74 98 171 -+74 98 171 74 98 171 74 98 171 74 98 171 74 98 171 74 98 171 -+73 97 172 73 97 171 74 98 171 79 102 174 96 117 181 136 152 200 -+206 211 226 113 116 128 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 156 164 188 185 195 222 111 130 189 79 102 174 74 98 171 -+72 96 171 73 97 171 73 97 171 73 97 171 73 97 171 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 73 97 170 31 38 62 0 0 1 0 0 0 0 0 0 -+0 0 0 -+0 0 0 27 32 46 72 95 165 74 98 173 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 73 97 171 -+84 105 171 115 133 187 197 204 227 128 134 148 0 0 0 0 0 0 -+0 0 0 2 3 6 156 164 188 189 198 224 120 137 191 90 112 180 -+75 99 174 73 97 170 73 97 171 73 97 171 73 97 172 73 97 172 -+73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 -+74 98 171 73 97 172 73 97 170 74 98 172 87 109 178 124 141 194 -+201 208 228 128 134 148 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 129 135 150 190 198 223 115 133 187 79 102 174 74 98 171 -+73 97 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 173 73 96 167 27 32 46 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 19 21 29 72 90 145 74 99 174 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 74 98 171 -+87 109 178 120 137 191 199 206 227 122 122 122 0 0 0 0 0 0 -+0 0 0 0 0 0 56 59 67 219 222 229 159 170 206 111 130 189 -+87 109 178 77 101 175 73 98 172 73 97 170 73 97 171 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 73 97 171 73 97 171 74 98 172 91 113 180 131 146 194 -+205 211 230 122 122 122 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 156 164 188 180 190 220 111 130 189 79 102 174 74 98 171 -+72 96 171 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 173 72 90 145 23 26 35 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 11 13 21 68 84 132 75 99 174 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 74 98 171 -+87 109 178 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 -+0 0 0 0 0 0 1 2 3 128 134 148 216 220 231 149 162 202 -+115 133 187 91 113 180 79 102 174 74 98 172 73 97 171 73 97 171 -+73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 -+73 97 171 73 97 171 74 98 172 79 102 174 108 128 187 149 162 202 -+209 213 223 56 59 67 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 183 190 208 169 180 211 108 128 187 79 102 174 73 97 171 -+73 97 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+75 99 174 53 65 105 11 13 21 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 2 3 6 46 54 81 75 99 174 74 98 171 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 74 98 171 -+87 109 178 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 5 7 12 129 135 150 218 222 235 -+164 175 209 125 141 190 108 128 187 91 113 180 84 105 171 79 102 174 -+75 99 174 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+75 99 174 79 102 174 87 109 178 108 128 187 135 149 193 198 205 228 -+183 190 208 7 8 13 0 0 0 0 0 0 0 0 0 0 0 0 -+38 41 51 194 200 218 152 165 205 96 117 181 77 101 175 72 96 171 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 -+75 99 174 46 54 81 2 3 6 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 31 38 62 72 95 165 73 97 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 74 98 171 -+87 109 178 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 2 3 6 122 122 122 -+204 208 221 201 208 228 157 168 202 131 146 194 117 135 190 108 128 187 -+96 117 181 91 113 180 87 109 178 87 109 178 87 109 178 91 113 180 -+96 117 181 108 128 187 120 138 192 144 158 201 199 206 227 194 200 218 -+34 36 42 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+113 116 128 205 212 231 127 144 195 90 112 180 74 98 172 73 97 171 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 73 98 172 -+72 95 165 31 38 62 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 23 26 35 68 84 132 74 98 173 74 98 171 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 73 97 172 73 97 171 72 96 170 73 97 170 -+87 109 178 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+38 41 51 129 135 150 219 222 229 205 209 224 184 193 220 160 171 208 -+144 158 201 136 152 200 127 144 195 125 141 190 129 144 192 136 152 200 -+147 161 203 160 171 208 190 198 223 219 222 229 183 190 208 38 41 51 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 19 24 -+185 191 210 175 184 213 108 128 187 79 102 174 73 97 171 73 97 170 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 171 74 99 174 -+68 84 132 23 26 35 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 4 5 10 53 65 105 75 99 174 73 97 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 73 97 171 73 97 171 72 97 171 72 96 170 73 97 170 -+87 108 173 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 29 31 36 113 116 128 156 164 188 183 190 208 -+194 200 218 204 208 221 206 211 226 209 215 232 209 215 232 204 208 221 -+194 200 218 183 190 208 156 164 188 56 59 67 1 2 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 134 148 -+205 212 231 131 146 194 91 113 180 77 100 169 73 97 171 72 96 171 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 73 97 172 74 98 173 -+53 65 105 4 5 10 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 31 38 62 72 95 165 74 98 173 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+73 97 171 73 97 171 84 105 171 96 117 181 108 128 187 96 117 181 -+91 113 180 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 23 31 -+56 59 67 56 62 79 78 87 115 113 116 128 78 87 115 56 62 79 -+56 59 67 27 29 36 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 113 116 128 220 224 234 -+149 162 202 108 128 187 79 102 174 73 97 171 73 97 170 73 97 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 173 72 95 165 -+31 38 62 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 11 13 21 68 84 132 75 99 174 -+74 98 171 74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 -+73 97 170 77 101 175 127 144 195 164 173 204 156 164 188 168 177 206 -+124 141 194 120 137 191 199 206 227 122 122 122 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 11 13 21 122 122 122 216 220 231 159 170 206 -+111 130 189 87 109 178 74 98 172 73 97 171 73 97 171 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 75 99 174 68 84 132 -+12 16 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 2 3 6 43 50 70 73 97 171 -+73 97 172 74 98 172 74 98 172 74 98 172 74 98 172 72 96 170 -+71 96 171 79 102 174 147 159 196 69 78 104 0 0 0 122 122 122 -+144 158 201 117 135 190 191 199 224 129 135 150 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 2 3 6 19 21 29 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 56 62 79 183 190 208 213 218 233 152 165 205 111 130 189 -+87 109 178 75 99 174 73 97 171 72 96 170 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 73 97 171 73 97 171 31 38 62 -+2 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 12 16 26 68 84 132 -+75 99 174 73 97 171 74 98 172 74 98 172 74 98 172 73 97 171 -+72 96 171 79 102 174 144 157 197 69 78 104 0 0 0 113 116 128 -+141 156 201 108 128 187 166 177 212 183 190 208 17 19 24 0 0 0 -+0 0 0 0 0 0 56 59 67 156 164 188 185 191 210 183 190 208 -+129 135 150 69 78 104 34 36 42 7 8 13 1 2 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 4 5 10 17 19 24 78 87 115 -+172 181 208 209 213 223 184 193 220 132 148 198 108 128 187 87 109 178 -+75 99 174 73 97 171 73 97 172 73 97 171 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 73 97 171 74 99 174 68 84 132 12 16 26 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 31 38 62 -+72 95 165 74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 -+72 96 171 79 102 174 144 157 197 56 62 79 0 0 0 122 122 122 -+136 152 200 96 117 181 131 146 194 205 211 230 156 164 188 56 60 74 -+69 78 104 129 135 150 219 222 229 189 196 219 168 179 211 176 187 218 -+194 201 221 205 209 224 219 222 229 204 208 221 156 164 188 129 135 150 -+122 122 122 113 116 128 69 78 104 56 62 79 56 60 74 69 78 104 -+78 87 115 113 116 128 129 135 150 183 190 208 219 222 229 205 209 224 -+176 187 218 141 156 201 117 135 190 96 117 181 79 102 174 74 98 172 -+73 97 170 73 97 171 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 72 95 165 31 38 62 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 10 17 -+53 65 105 75 99 174 73 97 171 74 98 172 74 98 172 73 97 171 -+72 97 171 79 102 174 147 159 196 56 60 74 0 0 0 122 122 122 -+132 148 198 87 109 178 108 128 187 137 153 200 191 199 224 221 226 239 -+218 222 237 191 199 224 152 165 205 124 141 194 111 130 189 111 130 189 -+120 137 191 131 146 194 141 156 201 160 171 208 180 190 220 185 195 222 -+194 201 224 201 208 228 214 219 236 221 226 239 221 226 239 221 226 239 -+213 218 233 201 208 230 190 198 223 169 180 211 144 158 201 127 144 195 -+111 130 189 96 117 181 87 109 178 77 101 175 74 98 172 73 97 171 -+73 97 171 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 73 97 171 74 99 174 68 84 132 11 13 21 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+27 32 46 72 95 165 74 98 173 74 98 172 74 98 172 73 97 171 -+72 96 171 84 105 171 147 159 196 56 59 67 0 0 0 122 122 122 -+132 148 198 79 102 174 84 105 171 96 117 181 115 133 187 127 144 195 -+127 144 195 115 133 187 96 117 181 90 112 180 79 102 174 79 102 174 -+87 109 178 90 112 180 96 117 181 96 117 181 108 128 187 111 130 189 -+117 135 190 120 138 192 125 141 190 129 144 192 131 146 194 127 144 195 -+125 141 190 120 137 191 115 133 187 108 128 187 96 117 181 90 112 180 -+79 102 174 77 101 175 74 98 172 73 97 171 73 97 171 73 97 171 -+74 98 172 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 -+73 97 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 173 72 95 165 31 38 62 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 5 10 53 65 105 77 101 175 73 98 172 74 98 171 73 97 171 -+72 96 171 79 102 174 147 159 196 56 59 67 0 0 0 122 122 122 -+126 145 198 75 99 174 72 96 171 75 99 174 79 102 174 87 109 178 -+87 109 178 79 102 174 77 101 175 74 98 172 72 97 171 71 96 171 -+72 96 171 73 97 171 74 98 172 75 99 174 79 102 174 79 102 174 -+84 105 171 87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 -+87 109 178 87 108 173 79 102 174 79 102 174 74 98 172 74 98 172 -+72 96 171 72 96 170 72 96 171 72 97 171 72 97 171 72 97 171 -+72 97 171 72 97 171 72 97 171 72 97 171 72 97 171 72 97 171 -+72 97 171 73 97 171 73 97 171 74 98 172 74 98 172 73 97 171 -+73 97 171 75 99 174 53 65 105 7 8 13 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 23 26 35 72 90 145 75 99 174 73 97 171 72 96 170 -+72 96 171 87 109 178 147 159 196 56 59 67 0 0 0 122 122 122 -+144 158 201 96 117 181 90 112 180 91 113 180 91 113 180 91 113 180 -+91 113 180 91 113 180 90 112 180 91 113 180 91 113 180 90 112 180 -+90 112 180 90 112 180 91 113 180 91 113 180 90 112 180 91 113 180 -+91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 -+91 113 180 91 113 180 91 113 180 90 112 180 91 113 180 90 112 180 -+90 112 180 90 112 180 90 112 180 90 112 180 90 112 180 90 112 180 -+90 112 180 90 112 180 90 112 180 90 112 180 90 112 180 90 112 180 -+90 112 180 79 102 174 74 98 171 73 97 171 73 97 172 73 97 171 -+75 99 174 72 89 141 23 26 35 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 1 31 38 62 72 90 145 74 98 173 73 97 171 -+72 96 171 87 109 178 147 159 196 56 59 67 0 0 0 122 122 122 -+180 188 209 156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 -+156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 -+156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 -+156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 -+156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 -+156 166 198 156 166 198 157 168 202 157 168 202 157 168 202 157 168 202 -+157 168 202 157 168 202 157 168 202 157 168 202 157 168 202 157 168 202 -+159 169 202 132 148 198 79 102 174 73 97 170 72 97 171 74 99 174 -+72 90 145 27 32 46 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 3 6 31 38 62 73 96 167 74 98 173 -+72 96 170 87 109 178 147 159 196 38 41 51 0 0 0 29 31 36 -+56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 -+56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 -+56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 -+56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 -+56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 -+56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 -+56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 -+69 78 104 172 181 208 90 112 180 72 96 170 74 98 173 73 97 171 -+43 50 70 1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 4 5 10 46 54 81 73 97 172 -+72 96 171 87 109 178 156 164 188 56 59 67 4 5 10 1 2 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+29 31 36 168 177 206 90 112 180 72 96 171 74 98 173 53 65 105 -+4 5 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 8 10 17 53 65 105 -+74 98 173 79 102 174 142 153 189 142 153 189 128 134 148 128 134 148 -+128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 -+128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 -+128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 -+128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 -+128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 -+128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 -+128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 -+129 135 150 155 167 201 87 109 178 74 99 174 53 65 105 8 10 17 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 16 26 -+68 84 132 77 101 175 96 117 181 126 144 198 126 145 198 126 144 198 -+126 145 198 126 145 198 126 145 198 126 145 198 126 145 198 126 145 198 -+126 145 198 126 145 198 126 145 198 126 144 198 126 144 198 126 144 198 -+126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 -+126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 -+126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 -+126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 -+126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 -+124 141 194 96 117 181 77 101 175 68 84 132 12 16 26 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+11 13 21 53 65 105 73 97 171 74 98 173 73 97 171 73 97 172 -+73 97 171 73 97 171 73 97 171 73 97 172 73 97 172 73 97 172 -+73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 -+73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 -+73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 -+73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 -+73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 -+73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 -+74 98 173 73 98 172 53 65 105 11 13 21 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 5 7 12 46 54 81 73 96 167 74 99 174 73 97 171 -+73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 -+73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 -+73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 -+73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 -+73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 -+73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 -+73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 74 98 173 -+72 96 170 46 54 81 5 7 12 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 3 6 31 38 62 72 90 145 75 99 174 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 73 97 171 75 99 174 72 95 165 -+31 38 62 2 3 6 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 23 26 35 68 84 132 -+77 101 175 74 98 173 74 98 172 73 97 171 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+73 97 171 74 98 172 74 98 173 77 101 175 72 90 145 27 32 46 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 16 26 -+53 65 105 72 95 165 75 99 174 75 99 174 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 -+74 99 174 75 99 174 72 95 165 53 65 105 12 16 26 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 19 21 29 53 65 105 72 95 165 77 101 175 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 75 99 174 -+72 95 165 53 65 105 19 21 29 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 27 32 46 53 65 105 74 98 173 -+75 99 174 75 99 174 74 98 172 74 98 171 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 171 74 98 172 75 99 174 75 99 174 75 99 174 68 84 132 -+27 32 46 1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 2 3 6 27 32 46 -+53 65 105 72 95 165 74 99 174 77 101 175 75 99 174 74 98 172 -+74 98 171 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 -+74 98 172 74 98 172 74 98 172 74 98 171 74 98 172 75 99 174 -+77 101 175 75 99 174 72 95 165 53 65 105 31 38 62 5 7 12 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 12 16 26 46 54 81 53 65 105 72 90 145 77 101 175 -+77 101 175 75 99 174 75 99 174 74 98 173 74 98 173 74 98 173 -+74 98 173 74 98 173 74 98 173 74 98 173 74 98 173 74 98 173 -+74 98 173 75 99 174 75 99 174 77 101 175 77 101 175 72 90 145 -+53 65 105 46 54 81 19 21 29 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 2 3 6 12 16 26 27 32 46 -+46 54 81 68 84 132 72 90 145 72 95 165 73 96 167 73 97 170 -+73 97 170 73 97 171 73 97 171 73 97 170 72 96 170 73 96 167 -+72 95 165 72 90 145 53 65 105 46 54 81 31 38 62 12 16 26 -+2 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 1 2 3 6 7 8 13 19 21 29 27 32 46 -+27 32 46 31 38 62 31 38 62 27 32 46 23 26 35 19 21 29 -+8 10 17 2 3 6 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 -diff --git a/drivers/video/logo/logo_tits_clut224.ppm b/drivers/video/logo/logo_tits_clut224.ppm -new file mode 100644 -index 000000000000..7504a3a2c216 ---- /dev/null -+++ b/drivers/video/logo/logo_tits_clut224.ppm -@@ -0,0 +1,1443 @@ -+P3 -+72 120 -+255 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 32 15 7 99 70 33 83 51 28 -+83 51 28 99 70 33 65 48 15 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 40 20 7 99 70 33 83 51 28 99 70 33 -+9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 116 86 23 200 156 55 255 234 0 255 232 0 -+255 232 0 255 234 0 255 221 0 156 123 43 36 17 7 0 0 0 -+4 0 2 123 94 35 255 221 0 255 234 0 255 232 0 255 232 0 -+156 123 43 116 86 23 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 156 123 43 255 234 0 255 221 0 123 94 35 73 49 22 -+99 70 33 73 49 22 116 86 23 255 221 0 200 156 55 22 13 4 -+123 94 35 255 221 0 255 221 0 255 221 0 253 230 2 255 255 40 -+255 255 40 253 230 2 116 86 23 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+156 123 43 255 234 0 156 123 43 111 90 31 200 156 55 255 255 42 -+255 255 41 255 255 42 248 233 31 111 90 31 116 86 23 65 48 15 -+123 94 35 116 86 23 116 86 23 156 123 43 249 230 10 255 255 42 -+255 255 42 255 255 40 253 230 2 116 86 23 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 123 94 35 -+255 234 0 156 123 43 156 123 43 255 255 42 255 255 41 255 255 40 -+255 255 40 255 255 41 255 255 42 255 255 42 156 123 43 65 48 15 -+255 221 0 255 234 0 255 234 0 73 49 22 249 230 10 255 255 42 -+255 255 40 255 255 42 255 255 40 253 230 2 116 86 23 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 22 13 4 255 221 0 -+200 156 55 123 94 35 255 255 42 255 255 41 255 255 41 255 255 40 -+255 255 42 248 233 31 200 156 55 200 156 55 248 233 31 116 86 23 -+255 234 0 255 221 0 255 222 0 255 221 0 111 90 31 255 255 42 -+255 255 41 255 255 40 255 255 42 255 255 40 253 230 2 65 48 15 -+4 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 32 15 7 200 156 55 253 230 2 -+116 86 23 200 156 55 255 255 41 255 255 41 255 255 41 255 255 41 -+200 156 55 116 86 23 116 86 23 116 86 23 111 90 31 116 86 23 -+255 232 0 255 222 0 255 222 0 255 221 0 99 70 33 255 255 42 -+255 255 40 255 255 41 255 255 40 255 255 42 255 255 40 156 123 43 -+58 38 16 156 123 43 22 13 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 65 48 15 255 232 0 116 86 23 -+200 156 55 255 255 42 255 255 40 255 255 41 255 255 41 248 233 31 -+116 86 23 255 221 0 255 234 0 255 234 0 156 123 43 116 86 23 -+255 234 0 255 232 0 255 232 0 255 221 0 111 90 31 255 255 40 -+255 255 41 255 255 41 255 255 41 255 255 40 255 255 42 255 255 42 -+116 86 23 255 234 0 200 156 55 20 10 4 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 4 0 2 255 221 0 116 86 23 200 156 55 -+255 255 42 255 255 40 255 255 41 255 255 41 255 255 41 156 123 43 -+156 123 43 255 234 0 255 232 0 255 234 0 255 221 0 116 86 23 -+255 221 0 156 123 43 156 123 43 255 221 0 200 156 55 156 123 43 -+255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 255 255 42 -+200 156 55 156 123 43 255 234 0 200 156 55 22 13 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 116 86 23 116 86 23 200 156 55 255 255 41 -+255 255 40 255 255 41 255 255 41 255 255 40 255 255 41 73 49 22 -+255 234 0 156 123 43 116 86 23 116 86 23 116 86 23 58 38 16 -+116 86 23 131 100 59 119 92 52 116 86 23 65 48 15 156 123 43 -+255 255 42 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 -+248 233 31 123 94 35 248 233 31 249 230 10 200 156 55 22 13 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 4 0 2 65 48 15 248 233 31 255 255 42 255 255 40 -+255 255 41 255 255 41 255 255 40 255 255 42 123 94 35 20 10 4 -+65 48 15 133 97 51 186 149 103 186 149 103 143 108 61 83 51 28 -+219 162 97 236 169 118 236 169 118 208 160 108 107 66 48 156 123 43 -+255 255 42 255 255 41 255 255 41 255 255 41 255 255 41 255 255 40 -+255 255 42 111 90 31 248 233 31 255 255 42 249 230 10 200 156 55 -+22 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 58 38 16 248 233 31 255 255 42 255 255 40 255 255 41 -+255 255 41 255 255 41 255 255 41 248 233 31 58 38 16 98 62 37 -+219 162 97 236 169 118 236 169 118 236 169 118 230 163 113 219 162 97 -+232 168 117 231 165 115 231 165 115 236 169 118 190 135 80 116 86 23 -+248 233 31 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 -+255 255 41 200 156 55 156 123 43 255 255 40 255 255 42 249 230 10 -+200 156 55 40 20 7 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+40 20 7 248 233 31 255 255 41 255 255 40 255 255 41 255 255 41 -+255 255 41 255 255 41 255 255 41 156 123 43 83 51 28 225 161 106 -+232 168 117 231 165 115 219 162 97 219 162 97 232 168 117 232 168 117 -+230 164 114 230 164 114 229 163 112 231 165 115 236 169 118 94 65 40 -+248 233 31 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 -+255 255 40 255 255 42 86 63 36 255 255 40 255 255 41 255 255 41 -+249 230 10 99 70 33 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 20 7 -+248 233 31 255 255 41 255 255 40 255 255 41 255 255 41 255 255 41 -+255 255 41 255 255 41 248 233 31 83 51 28 226 164 99 231 165 115 -+230 164 114 230 163 113 225 161 106 229 163 112 231 165 115 231 165 115 -+231 165 115 225 161 106 200 154 86 232 168 117 236 169 118 131 100 59 -+200 156 55 255 255 40 255 255 41 255 255 41 255 255 41 255 255 41 -+255 255 41 255 255 40 86 63 36 255 255 41 255 255 40 255 255 41 -+255 255 41 248 233 31 18 6 8 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 40 20 7 248 233 31 -+255 255 42 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 -+255 255 40 255 255 41 156 123 43 143 108 61 230 172 123 236 217 150 -+232 170 121 227 181 122 236 217 150 230 172 123 229 163 112 230 163 113 -+230 163 113 230 164 114 231 165 115 230 163 113 231 165 115 225 161 106 -+73 49 22 255 255 40 255 255 41 255 255 40 255 255 41 255 255 41 -+255 255 41 255 255 41 156 123 43 200 156 55 255 255 41 255 255 40 -+255 255 41 255 255 41 123 94 35 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 18 6 8 248 233 31 255 255 42 -+255 255 40 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 -+255 255 41 248 233 31 83 51 28 225 161 106 236 217 150 249 228 179 -+236 217 150 255 232 190 255 234 192 249 228 179 249 228 179 236 217 150 -+233 170 120 232 170 121 232 170 121 232 170 121 230 164 114 232 168 117 -+91 67 37 248 233 31 255 255 40 255 255 41 255 255 41 255 255 41 -+255 255 41 255 255 42 255 221 0 111 90 31 255 255 42 255 255 41 -+255 255 41 255 255 42 200 156 55 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 99 70 33 255 255 41 255 255 40 -+255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 255 255 40 -+255 255 42 123 94 35 155 112 61 230 172 123 249 228 179 255 231 189 -+255 231 189 255 231 189 255 230 188 255 232 190 255 232 190 255 232 190 -+255 231 189 255 231 189 255 231 189 255 230 188 230 172 123 232 166 115 -+168 130 70 116 86 23 249 230 10 255 255 41 255 255 41 255 255 41 -+255 255 41 255 255 42 255 221 0 111 90 31 255 255 42 255 255 41 -+255 255 41 255 255 41 248 233 31 58 38 16 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 86 63 36 248 233 31 255 255 41 255 255 41 -+255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 -+248 233 31 104 73 33 219 162 97 230 172 123 249 228 179 255 232 190 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 232 190 236 217 150 230 163 113 -+225 161 106 104 73 33 200 156 55 249 230 10 255 255 41 255 255 41 -+255 255 40 249 230 10 255 221 0 111 90 31 255 255 42 255 255 40 -+255 255 41 255 255 40 255 255 42 156 123 43 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 9 2 0 156 123 43 255 255 42 255 255 40 255 255 41 -+255 255 41 255 255 41 255 255 41 255 255 41 255 255 40 255 255 42 -+156 123 43 155 112 61 236 169 118 236 169 118 236 217 150 255 234 192 -+255 233 191 255 232 190 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 230 172 123 -+236 169 118 164 128 83 156 123 43 255 232 0 255 222 0 255 222 0 -+255 222 0 255 222 0 255 221 0 111 90 31 248 233 31 255 255 41 -+255 255 41 255 255 41 255 255 42 123 94 35 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 65 48 15 255 255 42 255 255 40 255 255 41 255 255 41 -+255 255 41 255 255 41 255 255 41 255 255 40 255 255 41 200 156 55 -+98 62 37 115 82 46 119 92 52 119 92 52 131 100 59 161 127 82 -+249 228 179 249 228 179 255 230 188 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 230 188 255 231 189 249 228 179 178 137 80 -+115 82 46 115 82 46 40 20 7 156 123 43 253 230 2 255 221 0 -+255 221 0 255 221 0 255 232 0 156 123 43 156 123 43 255 255 42 -+255 255 41 255 255 41 255 255 41 123 94 35 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+9 2 0 200 156 55 255 255 41 255 255 41 255 255 41 255 255 41 -+255 255 41 255 255 41 255 255 41 255 255 41 255 255 40 73 49 22 -+83 51 28 155 112 61 164 128 83 146 115 67 164 128 83 133 97 51 -+81 56 37 211 185 152 255 234 192 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 249 228 179 94 65 40 115 82 46 -+164 128 83 153 118 66 133 97 51 65 48 15 255 221 0 255 222 0 -+255 221 0 255 222 0 255 232 0 156 123 43 156 123 43 255 255 42 -+255 255 41 255 255 41 255 255 42 249 230 10 40 20 7 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 0 2 248 233 31 255 255 40 255 255 41 255 255 41 255 255 41 -+255 255 41 255 255 41 255 255 41 248 233 31 123 94 35 155 112 61 -+230 163 113 236 169 118 200 154 86 94 65 40 138 104 59 236 217 150 -+236 221 188 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 230 188 236 221 188 249 228 179 -+180 145 91 89 60 38 168 130 70 166 125 65 116 86 23 255 221 0 -+255 222 0 255 221 0 255 232 0 156 123 43 156 123 43 255 255 42 -+255 255 41 255 255 41 255 255 42 249 230 10 65 48 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+116 86 23 248 233 31 255 255 41 255 255 41 255 255 41 255 255 41 -+255 255 41 255 255 41 255 255 41 248 233 31 94 65 40 236 169 118 -+232 166 115 143 108 61 104 74 41 104 74 41 32 15 7 115 82 46 -+236 217 150 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 230 188 255 232 190 255 231 189 164 128 83 -+22 13 4 98 62 37 106 76 45 190 135 80 166 125 65 116 86 23 -+255 222 0 255 222 0 255 232 0 156 123 43 156 123 43 255 255 42 -+255 255 40 255 255 41 255 255 42 249 230 10 65 48 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+156 123 43 255 255 40 255 255 41 255 255 41 255 255 41 255 255 41 -+255 255 41 255 255 40 255 255 40 86 63 36 190 135 80 190 135 80 -+42 24 20 42 24 20 73 53 28 81 56 37 82 57 39 42 24 20 -+106 76 45 249 228 179 255 233 191 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 161 127 82 32 15 7 -+82 57 39 82 57 39 73 53 28 73 53 28 99 70 33 133 97 51 -+116 86 23 255 221 0 255 234 0 156 123 43 156 123 43 255 255 42 -+255 255 42 255 255 40 248 233 31 253 230 2 65 48 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 20 7 -+255 221 0 255 255 40 255 255 40 255 255 41 255 255 41 255 255 41 -+255 255 40 255 255 41 200 156 55 115 82 46 190 135 80 32 15 7 -+42 24 20 161 127 82 172 197 155 172 197 155 172 197 155 212 211 185 -+46 29 24 210 175 116 255 234 192 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 232 190 249 228 179 32 15 7 173 198 156 -+173 198 156 172 197 155 186 149 103 161 127 82 82 57 39 20 10 4 -+98 62 37 116 86 23 156 123 43 116 86 23 156 123 43 248 233 31 -+248 233 31 255 222 0 255 221 0 253 230 2 65 48 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 86 23 -+255 234 0 249 230 10 255 255 42 255 255 40 255 255 41 255 255 41 -+255 255 41 255 255 41 111 90 31 190 135 80 106 76 45 22 13 4 -+161 127 82 51 35 26 5 0 27 186 149 103 161 127 82 161 127 82 -+212 211 185 215 204 162 255 232 190 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 249 228 179 199 209 176 172 197 155 -+5 0 27 73 53 28 172 197 155 161 127 82 134 113 63 51 35 26 -+58 38 16 190 135 80 115 82 46 4 0 2 156 123 43 253 230 2 -+255 221 0 255 221 0 255 222 0 253 230 2 65 48 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 86 23 -+255 232 0 255 222 0 255 255 40 255 255 42 255 255 41 255 255 41 -+255 255 41 200 156 55 115 82 46 133 97 51 10 1 0 172 197 155 -+51 35 26 5 0 27 46 29 24 212 211 185 247 255 212 107 78 54 -+212 211 185 247 255 212 255 230 188 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 230 188 255 234 192 247 255 212 107 78 54 -+5 0 27 82 57 39 247 255 212 247 255 212 134 113 63 172 197 155 -+22 13 4 98 62 37 200 154 86 9 4 10 156 123 43 255 232 0 -+255 221 0 255 222 0 255 222 0 253 230 2 65 48 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 86 23 -+255 232 0 255 221 0 253 230 2 248 233 31 255 255 41 255 255 41 -+255 255 42 200 156 55 57 32 26 22 13 4 82 57 39 230 232 196 -+42 24 20 5 0 27 5 0 27 51 35 26 199 209 176 199 209 176 -+134 113 63 247 255 212 255 230 188 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 230 188 255 234 192 199 209 176 5 0 27 -+5 0 27 5 0 27 82 57 39 247 255 212 186 149 103 173 198 156 -+134 113 63 9 2 0 69 42 21 46 29 24 116 86 23 255 221 0 -+255 222 0 255 222 0 255 221 0 255 232 0 65 48 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 86 23 -+255 232 0 255 222 0 255 221 0 255 221 0 253 230 2 248 233 31 -+248 233 31 99 70 33 133 97 51 32 15 7 161 127 82 247 255 212 -+51 35 26 107 78 54 51 35 26 5 0 27 46 29 24 199 209 176 -+134 113 63 255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 230 188 255 234 192 200 194 140 51 35 26 -+107 78 54 46 29 24 5 0 27 107 78 54 186 149 103 199 209 176 -+212 211 185 10 1 0 104 73 33 166 125 65 77 45 20 255 221 0 -+255 222 0 255 221 0 255 234 0 156 123 43 9 4 10 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 86 23 -+255 234 0 255 221 0 255 222 0 255 221 0 255 221 0 255 222 0 -+255 221 0 83 51 28 98 62 37 133 97 51 134 113 63 247 255 212 -+107 78 54 107 78 54 172 197 155 173 198 156 107 78 54 134 113 63 -+186 149 103 255 234 192 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 234 192 211 185 152 82 57 39 -+172 197 155 199 209 176 172 197 155 107 78 54 134 113 63 230 232 196 -+199 209 176 104 73 33 83 51 28 190 135 80 75 50 26 255 221 0 -+255 222 0 255 222 0 255 221 0 65 48 15 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 20 7 -+200 156 55 253 230 2 255 222 0 255 222 0 255 222 0 255 222 0 -+255 221 0 83 51 28 83 51 28 166 125 65 119 92 52 199 209 176 -+212 211 185 82 57 39 51 35 26 82 57 39 82 57 39 131 100 59 -+255 230 188 255 231 189 255 231 189 255 230 188 255 232 190 255 232 190 -+255 230 188 255 231 189 255 231 189 255 231 189 255 234 192 180 145 91 -+51 35 26 82 57 39 82 57 39 51 35 26 186 149 103 230 232 196 -+107 78 54 190 135 80 75 50 26 133 97 51 116 86 23 156 123 43 -+255 222 0 255 232 0 200 156 55 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+156 123 43 255 232 0 255 221 0 255 222 0 255 222 0 255 222 0 -+255 221 0 40 20 7 65 48 15 73 53 28 229 163 112 222 164 108 -+233 169 121 219 162 97 223 184 122 215 204 162 215 204 162 249 228 179 -+255 230 188 255 231 189 255 231 189 255 232 190 236 217 150 227 181 122 -+255 234 192 255 231 189 255 231 189 255 231 189 255 230 188 249 228 179 -+235 224 165 215 204 162 215 204 162 235 224 165 249 228 179 230 172 123 -+225 161 106 131 100 59 40 20 7 116 86 23 255 221 0 73 49 22 -+255 222 0 255 232 0 200 156 55 4 0 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+116 86 23 255 221 0 255 222 0 255 222 0 255 222 0 255 222 0 -+255 221 0 116 86 23 255 221 0 73 49 22 225 161 106 231 165 115 -+231 165 115 236 217 150 255 232 190 255 233 191 255 233 191 255 232 190 -+255 231 189 255 231 189 255 232 190 255 234 192 236 217 150 227 181 122 -+255 234 192 255 233 191 255 233 191 255 231 189 255 231 189 255 232 190 -+255 233 191 255 233 191 255 233 191 255 233 191 255 232 190 236 217 150 -+236 169 118 94 65 40 255 221 0 255 232 0 255 221 0 73 49 22 -+255 222 0 255 222 0 255 221 0 65 48 15 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 0 2 255 221 0 255 232 0 255 221 0 255 222 0 255 221 0 -+255 232 0 156 123 43 156 123 43 200 156 55 131 100 59 236 169 118 -+230 172 123 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 230 188 236 217 150 235 224 165 236 221 188 236 221 188 -+236 221 188 235 224 165 236 217 150 249 228 179 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 249 228 179 -+178 137 80 116 86 23 255 221 0 255 222 0 255 221 0 73 49 22 -+255 222 0 255 222 0 255 234 0 116 86 23 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 58 38 16 255 221 0 255 222 0 255 222 0 255 222 0 -+253 230 2 200 156 55 156 123 43 200 156 55 94 65 40 236 169 118 -+227 181 122 255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 -+255 231 189 255 234 192 186 149 103 36 17 7 58 38 16 40 20 7 -+58 38 16 40 20 7 131 100 59 255 233 191 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 230 188 255 233 191 236 217 150 -+155 112 61 123 94 35 255 234 0 255 221 0 255 222 0 65 48 15 -+248 233 31 255 255 42 255 255 40 116 86 23 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 116 86 23 255 234 0 255 221 0 255 222 0 -+255 221 0 255 234 0 116 86 23 200 156 55 116 86 23 190 135 80 -+230 172 123 249 228 179 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 234 192 200 194 140 58 38 16 116 86 23 155 112 61 -+116 86 23 77 45 20 134 113 63 255 234 192 255 230 188 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 230 172 123 -+99 70 33 255 221 0 255 222 0 253 230 2 156 123 43 156 123 43 -+255 255 42 255 255 41 255 255 42 200 156 55 40 20 7 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 65 48 15 156 123 43 200 156 55 253 230 2 255 221 0 -+255 221 0 255 232 0 116 86 23 255 221 0 156 123 43 115 82 46 -+230 163 113 236 217 150 255 234 192 255 230 188 255 231 189 255 231 189 -+255 231 189 255 234 192 200 194 140 40 20 7 155 112 61 190 135 80 -+155 112 61 77 45 20 134 113 63 255 234 192 255 231 189 255 231 189 -+255 231 189 255 231 189 255 230 188 255 234 192 236 217 150 155 112 61 -+116 86 23 255 234 0 255 221 0 255 232 0 116 86 23 248 233 31 -+255 255 40 255 255 41 255 255 40 255 255 42 65 48 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 65 48 15 156 123 43 200 156 55 253 230 2 253 230 2 -+249 230 10 255 234 0 116 86 23 255 221 0 255 232 0 156 123 43 -+115 82 46 236 169 118 249 228 179 255 232 190 255 231 189 255 230 188 -+255 231 189 255 234 192 211 185 152 77 45 20 155 112 61 190 135 80 -+190 135 80 77 45 20 186 149 103 255 234 192 255 231 189 255 231 189 -+255 230 188 255 230 188 255 233 191 249 228 179 164 128 83 116 86 23 -+200 156 55 255 222 0 255 221 0 255 232 0 116 86 23 248 233 31 -+255 255 41 255 255 41 255 255 40 255 255 42 65 48 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 65 48 15 156 123 43 200 156 55 255 234 0 255 255 40 -+255 255 42 255 255 40 116 86 23 255 221 0 255 222 0 255 232 0 -+156 123 43 115 82 46 236 169 118 249 228 179 255 233 191 255 231 189 -+255 231 189 255 231 189 255 234 192 134 113 63 77 45 20 190 135 80 -+107 66 48 73 53 28 255 230 188 255 231 189 255 231 189 255 230 188 -+255 232 190 255 234 192 249 228 179 164 128 83 116 86 23 255 221 0 -+99 70 33 253 230 2 255 222 0 253 230 2 116 86 23 248 233 31 -+255 255 41 255 255 41 255 255 41 255 255 41 65 48 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+4 0 2 116 86 23 156 123 43 200 156 55 255 255 40 255 255 41 -+255 255 40 255 255 42 111 90 31 255 221 0 255 222 0 255 222 0 -+255 232 0 156 123 43 115 82 46 186 149 103 249 228 179 255 234 192 -+255 231 189 255 230 188 255 234 192 236 217 150 98 62 37 77 45 20 -+77 45 20 212 179 122 255 234 192 255 230 188 255 230 188 255 232 190 -+255 230 188 211 185 152 155 112 61 116 86 23 255 221 0 255 232 0 -+156 123 43 156 123 43 255 234 0 156 123 43 156 123 43 255 255 41 -+255 255 41 255 255 41 255 255 41 156 123 43 4 0 2 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+9 4 10 255 221 0 156 123 43 200 156 55 255 255 40 255 255 40 -+255 255 41 255 255 42 111 90 31 255 221 0 255 222 0 255 221 0 -+253 230 2 200 156 55 116 86 23 116 86 23 166 125 65 236 217 150 -+255 230 188 255 234 192 255 231 189 255 234 192 236 217 150 146 115 67 -+212 179 122 255 234 192 255 231 189 255 232 190 255 234 192 255 230 188 -+208 160 108 116 86 23 65 48 15 255 221 0 255 222 0 255 232 0 -+200 156 55 123 94 35 255 234 0 156 123 43 156 123 43 255 255 42 -+255 255 41 255 255 40 255 255 42 123 94 35 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+22 13 4 255 221 0 156 123 43 200 156 55 255 255 40 255 255 41 -+255 255 41 255 255 42 111 90 31 255 221 0 255 222 0 255 222 0 -+255 232 0 116 86 23 255 221 0 253 230 2 116 86 23 86 63 36 -+190 135 80 236 217 150 255 232 190 255 234 192 255 234 192 255 234 192 -+255 234 192 255 234 192 255 234 192 255 230 188 212 179 122 133 97 51 -+73 49 22 255 221 0 116 86 23 255 221 0 255 222 0 255 232 0 -+200 156 55 123 94 35 255 234 0 156 123 43 200 156 55 255 255 41 -+255 255 41 255 255 41 200 156 55 156 123 43 65 48 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 4 0 2 83 51 28 94 65 40 94 65 40 -+89 60 38 22 13 4 83 51 28 89 60 38 9 2 0 0 0 0 -+156 123 43 255 234 0 116 86 23 200 156 55 255 255 40 255 255 41 -+255 255 41 255 255 41 156 123 43 156 123 43 255 222 0 255 222 0 -+255 232 0 116 86 23 200 156 55 253 230 2 253 230 2 200 156 55 -+40 20 7 104 73 33 146 115 67 210 175 116 249 228 179 255 230 188 -+249 228 179 223 184 122 161 127 82 115 82 46 40 20 7 156 123 43 -+253 230 2 255 234 0 116 86 23 255 221 0 255 222 0 255 232 0 -+200 156 55 156 123 43 255 221 0 111 90 31 255 255 42 255 255 40 -+255 255 41 255 255 41 156 123 43 200 156 55 65 48 15 0 0 0 -+0 0 0 9 2 0 89 60 38 75 50 26 22 13 4 89 60 38 -+94 65 40 94 65 40 83 51 28 4 0 2 0 0 0 0 0 0 -+0 0 0 4 0 2 115 82 46 236 169 118 236 169 118 236 169 118 -+232 166 115 75 50 26 190 135 80 232 166 115 133 97 51 4 0 2 -+156 123 43 255 234 0 255 221 0 116 86 23 248 233 31 255 255 41 -+255 255 41 255 255 40 255 255 42 65 48 15 253 230 2 255 221 0 -+255 232 0 116 86 23 200 156 55 253 230 2 253 230 2 200 156 55 -+98 62 37 133 97 51 104 73 33 83 51 28 89 60 38 107 78 54 -+94 65 40 77 45 20 115 82 46 164 128 83 164 128 83 156 123 43 -+255 232 0 255 232 0 116 86 23 255 221 0 255 222 0 255 232 0 -+200 156 55 156 123 43 255 221 0 111 90 31 255 255 42 255 255 40 -+255 255 41 248 233 31 73 49 22 255 234 0 65 48 15 0 0 0 -+9 2 0 133 97 51 232 166 115 190 135 80 75 50 26 232 166 115 -+236 169 118 236 169 118 236 169 118 115 82 46 4 0 2 0 0 0 -+0 0 0 9 2 0 208 160 108 249 228 179 190 135 80 86 58 39 -+81 56 37 73 53 28 89 60 38 84 59 38 155 112 61 107 66 48 -+156 123 43 255 232 0 255 234 0 73 49 22 255 255 41 255 255 40 -+255 255 41 255 255 41 255 255 41 116 86 23 255 221 0 255 222 0 -+255 232 0 156 123 43 200 156 55 255 222 0 253 230 2 200 156 55 -+83 51 28 190 135 80 182 141 64 166 125 65 155 112 61 155 112 61 -+155 112 61 208 160 108 249 228 179 255 234 192 200 194 140 123 94 35 -+255 234 0 156 123 43 156 123 43 253 230 2 255 222 0 255 232 0 -+156 123 43 156 123 43 116 86 23 248 233 31 255 255 41 255 255 41 -+248 233 31 116 86 23 255 221 0 255 232 0 65 48 15 0 0 0 -+116 87 35 155 112 61 84 59 38 89 60 38 73 53 28 81 56 37 -+86 58 39 190 135 80 249 228 179 208 160 108 4 0 2 0 0 0 -+0 0 0 0 0 0 211 185 152 235 224 165 83 51 28 211 185 152 -+230 172 123 219 162 97 131 100 59 115 82 46 40 20 7 57 32 26 -+156 123 43 255 234 0 255 222 0 156 123 43 156 123 43 255 255 42 -+255 255 41 255 255 41 255 255 41 248 233 31 116 86 23 255 234 0 -+255 221 0 253 230 2 65 48 15 255 222 0 255 232 0 255 221 0 -+83 51 28 182 141 64 166 125 65 166 125 65 190 135 80 227 165 115 -+249 228 179 255 233 191 255 232 190 255 234 192 186 149 103 123 94 35 -+255 234 0 156 123 43 156 123 43 255 232 0 255 221 0 255 222 0 -+255 221 0 116 86 23 156 123 43 255 255 41 255 255 41 248 233 31 -+116 86 23 255 221 0 253 230 2 253 230 2 65 48 15 0 0 0 -+77 45 20 40 20 7 115 82 46 131 100 59 219 162 97 230 172 123 -+211 185 152 83 51 28 249 228 179 211 185 152 0 0 0 0 0 0 -+0 0 0 83 51 28 249 228 179 186 149 103 99 70 33 249 228 179 -+227 181 122 98 62 37 133 97 51 164 128 83 161 127 82 143 108 61 -+83 51 28 255 221 0 253 230 2 253 230 2 156 123 43 99 70 33 -+248 233 31 248 233 31 248 233 31 200 156 55 116 86 23 255 234 0 -+255 232 0 255 232 0 156 123 43 123 94 35 156 123 43 83 51 28 -+155 112 61 190 135 80 225 161 106 211 185 152 249 228 179 255 231 189 -+255 233 191 255 231 189 255 231 189 255 234 192 235 224 165 121 95 40 -+116 86 23 156 123 43 156 123 43 255 234 0 255 232 0 255 234 0 -+200 156 55 123 94 35 248 233 31 248 233 31 248 233 31 123 94 35 -+255 221 0 253 230 2 255 221 0 255 232 0 58 38 16 40 20 7 -+143 108 61 161 127 82 164 128 83 133 97 51 98 62 37 227 181 122 -+249 228 179 98 62 37 186 149 103 249 228 179 83 51 28 0 0 0 -+0 0 0 143 108 61 252 233 179 131 100 59 146 115 67 255 234 192 -+146 115 67 133 97 51 230 172 123 190 135 80 83 51 28 94 65 40 -+80 54 33 83 51 28 255 221 0 255 232 0 255 221 0 156 123 43 -+83 51 28 84 59 38 86 63 36 86 63 36 69 42 21 156 123 43 -+156 123 43 200 156 55 104 73 33 69 42 21 155 112 61 208 160 108 -+236 217 150 249 228 179 255 231 189 255 234 192 255 233 191 255 231 189 -+255 230 188 255 231 189 255 231 189 255 230 188 255 232 190 249 228 179 -+186 149 103 94 65 40 83 51 28 156 123 43 156 123 43 156 123 43 -+73 49 22 84 59 38 86 63 36 86 63 36 75 50 26 156 123 43 -+255 221 0 253 230 2 253 230 2 255 221 0 75 50 26 82 57 39 -+94 65 40 83 51 28 190 135 80 230 172 123 133 97 51 146 115 67 -+255 234 192 146 115 67 131 100 59 252 233 179 143 108 61 0 0 0 -+0 0 0 161 127 82 249 228 179 83 51 28 211 185 152 255 230 188 -+104 73 33 180 145 91 249 228 179 107 78 54 166 125 65 236 217 150 -+236 217 150 190 135 80 104 73 33 255 221 0 116 86 23 107 78 54 -+200 154 86 236 169 118 236 217 150 235 224 165 236 217 150 186 149 103 -+146 115 67 107 66 48 83 51 28 133 97 51 236 169 118 249 228 179 -+255 234 192 255 233 191 255 231 189 255 231 189 255 230 188 255 231 189 -+255 231 189 255 230 188 255 231 189 255 232 190 255 234 192 255 230 188 -+236 217 150 190 135 80 98 62 37 98 62 37 131 100 59 161 127 82 -+227 181 122 249 228 179 236 217 150 235 224 165 227 181 122 131 100 59 -+99 70 33 255 221 0 255 221 0 99 70 33 190 135 80 236 169 118 -+238 197 114 166 125 65 107 78 54 249 228 179 180 145 91 104 73 33 -+255 230 188 212 179 122 83 51 28 249 228 179 161 127 82 0 0 0 -+58 38 16 227 181 122 215 204 162 84 59 38 249 228 179 212 179 122 -+83 51 28 236 217 150 211 185 152 98 62 37 227 181 122 255 233 191 -+249 228 179 227 181 122 119 92 52 40 20 7 166 125 65 236 169 118 -+236 217 150 249 228 179 255 232 190 255 234 192 255 234 192 255 234 192 -+255 234 192 249 228 179 208 160 108 115 82 46 58 38 16 155 112 61 -+230 172 123 249 228 179 255 233 191 255 232 190 255 230 188 255 231 189 -+255 230 188 255 231 189 255 233 191 255 230 188 227 181 122 190 135 80 -+77 45 20 98 62 37 190 135 80 236 217 150 255 231 189 255 234 192 -+255 234 192 255 234 192 255 234 192 255 234 192 255 232 190 255 230 188 -+208 160 108 83 51 28 22 13 4 131 100 59 229 163 112 229 163 112 -+236 217 150 236 217 150 98 62 37 211 185 152 236 217 150 83 51 28 -+212 179 122 249 228 179 84 59 38 215 204 162 227 181 122 58 38 16 -+81 56 37 249 228 179 215 204 162 143 108 61 255 234 192 164 128 83 -+107 78 54 253 234 183 180 145 91 131 100 59 255 232 190 249 228 179 -+155 112 61 32 15 7 99 70 33 166 125 65 236 169 118 236 217 150 -+255 230 188 255 232 190 255 231 189 255 230 188 255 231 189 255 231 189 -+255 231 189 255 233 191 255 233 191 236 217 150 222 164 108 104 74 41 -+77 45 20 133 97 51 227 165 115 249 228 179 255 232 190 255 231 189 -+255 231 189 255 230 188 227 181 122 155 112 61 98 62 37 83 51 28 -+190 135 80 236 217 150 255 230 188 255 234 192 255 232 190 255 231 189 -+255 230 188 255 231 189 255 231 189 255 230 188 255 231 189 255 233 191 -+255 230 188 222 164 108 58 38 16 69 42 21 40 20 7 143 108 61 -+236 217 150 255 231 189 124 98 54 186 149 103 253 234 183 107 78 54 -+164 128 83 255 234 192 143 108 61 215 204 162 249 228 179 81 56 37 -+81 56 37 236 217 150 249 228 179 235 224 165 255 233 191 98 62 37 -+186 149 103 245 232 191 98 62 37 208 160 108 255 234 192 249 228 179 -+208 160 108 153 118 66 98 62 37 190 135 80 236 217 150 255 230 188 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 233 191 255 230 188 249 228 179 -+211 185 152 186 149 103 211 185 152 249 228 179 255 232 190 255 231 189 -+255 231 189 255 230 188 236 217 150 186 149 103 210 175 116 236 217 150 -+255 230 188 255 234 192 255 231 189 255 230 188 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 -+255 232 190 255 230 188 166 125 65 69 42 21 153 118 66 178 137 80 -+233 170 120 255 231 189 208 160 108 98 62 37 245 232 191 186 149 103 -+98 62 37 255 233 191 235 224 165 249 228 179 236 217 150 81 56 37 -+58 38 16 190 135 80 236 217 150 255 233 191 255 232 190 200 154 86 -+236 217 150 236 221 188 98 62 37 236 217 150 255 233 191 255 231 189 -+255 234 192 249 228 179 143 108 61 115 82 46 255 230 188 255 231 189 -+255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 230 188 255 231 189 255 233 191 -+255 234 192 255 234 192 255 234 192 255 232 190 255 230 188 255 231 189 -+255 230 188 255 231 189 255 234 192 255 234 192 255 234 192 255 234 192 -+255 232 190 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 230 188 115 82 46 143 108 61 236 169 118 236 169 118 -+229 163 112 249 228 179 249 228 179 98 62 37 236 221 188 236 217 150 -+200 154 86 255 233 191 255 232 190 236 217 150 190 135 80 42 24 20 -+0 0 0 58 38 16 190 135 80 236 217 150 235 224 165 255 234 192 -+255 234 192 255 230 188 227 181 122 255 230 188 255 231 189 255 230 188 -+255 231 189 255 233 191 227 181 122 75 50 26 236 221 188 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 232 190 236 221 188 73 53 28 225 161 106 231 165 115 230 164 114 -+229 163 112 227 181 122 249 228 179 227 181 122 255 230 188 255 234 192 -+249 228 179 236 217 150 236 217 150 190 135 80 58 38 16 0 0 0 -+0 0 0 0 0 0 40 20 7 104 73 33 200 154 86 230 172 123 -+236 217 150 249 228 179 255 232 190 255 232 190 255 232 190 255 230 188 -+255 231 189 255 232 190 249 228 179 94 65 40 236 221 188 255 231 189 -+255 231 189 255 232 190 255 233 191 255 233 191 255 231 189 255 230 188 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 -+255 232 190 255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 230 188 255 231 189 255 233 191 255 233 191 255 231 189 255 230 188 -+255 231 189 236 221 188 84 59 38 236 169 118 231 165 115 231 165 115 -+230 164 114 230 163 113 230 172 123 227 181 122 230 172 123 227 181 122 -+236 169 118 200 154 86 104 73 33 40 20 7 9 2 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 20 10 4 115 82 46 -+190 135 80 236 169 118 233 169 121 236 217 150 249 228 179 255 232 190 -+255 230 188 255 234 192 236 217 150 75 50 26 211 185 152 255 233 191 -+255 230 188 249 228 179 235 224 165 235 224 165 255 230 188 255 233 191 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 233 191 -+255 230 188 236 217 150 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 -+255 231 189 255 230 188 235 224 165 249 228 179 255 230 188 255 231 189 -+255 233 191 211 185 152 69 42 21 200 154 86 232 168 117 231 165 115 -+231 165 115 230 164 114 230 163 113 231 165 115 236 169 118 190 135 80 -+115 82 46 20 10 4 9 2 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+36 17 7 104 74 41 200 154 86 231 165 115 230 172 123 249 228 179 -+255 231 189 255 234 192 236 217 150 69 42 21 208 160 108 255 234 192 -+255 233 191 227 181 122 219 162 97 232 166 115 230 172 123 236 217 150 -+255 231 189 255 233 191 255 234 192 255 234 192 255 234 192 255 234 192 -+255 234 192 255 234 192 255 232 190 255 231 189 255 231 189 236 217 150 -+225 161 106 227 181 122 255 234 192 255 234 192 255 234 192 255 234 192 -+255 234 192 255 234 192 255 234 192 255 232 190 255 231 189 255 231 189 -+255 230 188 236 217 150 225 161 106 219 162 97 249 228 179 255 231 189 -+255 234 192 208 160 108 73 49 22 229 163 112 231 165 115 231 165 115 -+231 165 115 230 164 114 236 169 118 200 154 86 104 74 41 36 17 7 -+0 0 0 4 0 2 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 58 38 16 200 154 86 231 165 115 227 181 122 -+255 233 191 255 231 189 249 228 179 168 130 70 94 65 40 249 228 179 -+255 233 191 255 231 189 131 100 59 155 112 61 230 172 123 255 230 188 -+255 234 192 249 228 179 211 185 152 211 185 152 211 185 152 211 185 152 -+211 185 152 235 224 165 255 230 188 255 234 192 236 217 150 200 154 86 -+190 135 80 236 217 150 249 228 179 215 204 162 211 185 152 211 185 152 -+211 185 152 211 185 152 236 217 150 255 230 188 255 234 192 255 234 192 -+249 228 179 190 135 80 98 62 37 227 181 122 255 232 190 255 232 190 -+249 228 179 94 65 40 166 125 65 236 169 118 230 164 114 230 164 114 -+229 163 112 232 166 115 200 154 86 58 38 16 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 133 97 51 232 166 115 227 181 122 -+255 234 192 255 230 188 255 234 192 227 181 122 69 42 21 227 181 122 -+255 234 192 255 230 188 225 161 106 75 50 26 233 178 115 186 149 103 -+131 100 59 104 73 33 82 57 39 107 78 54 107 78 54 107 78 54 -+82 57 39 89 60 38 131 100 59 146 115 67 138 104 59 182 141 64 -+123 94 35 119 92 52 115 82 46 82 57 39 107 78 54 107 78 54 -+107 78 54 91 67 37 86 63 36 119 92 52 146 115 67 161 127 82 -+236 169 118 107 78 54 166 125 65 249 228 179 255 232 190 255 234 192 -+236 217 150 69 42 21 225 161 106 231 165 115 230 163 113 232 168 117 -+227 181 122 230 172 123 119 92 52 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 36 17 7 200 154 86 236 217 150 -+255 233 191 255 231 189 255 231 189 249 228 179 104 73 33 153 118 66 -+236 217 150 236 217 150 200 154 86 42 24 20 73 49 22 107 78 54 -+161 127 82 172 197 155 212 216 184 231 255 198 235 255 203 232 255 199 -+231 255 198 172 197 155 186 149 103 132 119 61 107 78 54 69 42 21 -+107 78 54 161 127 82 172 197 155 210 220 166 231 255 198 232 255 199 -+235 255 203 231 255 198 189 206 156 172 197 155 161 127 82 134 113 63 -+75 50 26 42 24 20 155 112 61 227 181 122 249 228 179 255 234 192 -+164 128 83 104 73 33 230 164 114 230 163 113 231 165 115 236 217 150 -+255 234 192 215 204 162 32 15 7 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 186 149 103 249 228 179 -+255 231 189 255 231 189 255 230 188 255 233 191 161 127 82 115 82 46 -+236 169 118 190 135 80 80 54 33 82 57 39 172 197 155 230 232 196 -+247 255 212 237 255 203 235 255 203 232 255 199 231 255 198 232 255 198 -+231 255 198 212 216 184 172 197 155 107 78 54 107 78 54 172 197 155 -+212 216 184 237 255 203 231 255 198 212 216 184 191 208 160 212 216 184 -+231 255 198 233 255 199 237 255 203 237 255 203 247 255 212 232 255 199 -+173 198 156 125 102 55 51 35 26 155 112 61 236 217 150 255 230 188 -+115 82 46 161 127 82 236 169 118 232 168 117 236 217 150 255 232 190 -+255 234 192 212 203 153 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 4 0 2 186 149 103 255 234 192 -+255 230 188 255 231 189 255 231 189 255 232 190 208 160 108 83 51 28 -+166 125 65 91 67 37 172 197 155 212 216 184 212 216 184 161 127 82 -+161 127 82 191 208 160 230 232 196 231 255 198 231 255 198 231 255 198 -+231 255 198 232 255 199 235 255 203 232 255 199 212 216 184 210 220 166 -+210 220 166 199 209 176 173 198 156 189 206 156 230 232 196 233 255 199 -+231 255 198 231 255 198 230 232 196 199 209 176 186 149 103 134 113 63 -+191 208 160 212 216 184 173 198 156 107 78 54 166 125 65 215 204 162 -+83 51 28 200 154 86 232 166 115 236 217 150 255 232 190 255 231 189 -+255 234 192 215 204 162 4 0 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 9 2 0 186 149 103 255 234 192 -+255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 104 74 41 -+32 15 7 172 197 155 230 232 196 161 127 82 51 35 26 125 102 55 -+172 197 155 212 216 184 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 212 216 184 199 209 176 -+172 197 155 172 197 155 191 208 160 230 232 196 232 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 230 232 196 172 197 155 132 119 61 -+51 35 26 125 102 55 212 216 184 191 208 160 82 57 39 186 149 103 -+106 76 45 236 169 118 232 170 121 249 228 179 255 232 190 255 231 189 -+255 234 192 215 204 162 4 0 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 9 2 0 186 149 103 255 234 192 -+255 231 189 255 231 189 255 231 189 255 233 191 249 228 179 138 104 59 -+42 24 20 191 208 160 161 127 82 91 67 37 172 197 155 212 216 184 -+235 255 203 232 255 199 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 199 209 176 212 216 184 173 198 156 -+172 197 155 173 198 156 230 232 196 232 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 232 255 198 233 255 199 230 232 196 -+173 198 156 125 102 55 107 78 54 199 209 176 82 57 39 138 104 59 -+107 78 54 236 169 118 227 181 122 255 234 192 255 230 188 255 231 189 -+255 234 192 215 204 162 4 0 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 186 149 103 255 234 192 -+255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 236 169 118 -+133 97 51 73 53 28 107 78 54 172 197 155 199 209 176 232 255 199 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+212 216 184 199 209 176 212 216 184 199 209 176 199 209 176 173 198 156 -+199 209 176 199 209 176 173 198 156 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 232 255 198 -+230 232 196 191 208 160 134 113 63 73 53 28 106 76 45 83 51 28 -+168 130 70 236 169 118 236 217 150 255 232 190 255 231 189 255 231 189 -+255 234 192 211 185 152 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 22 13 4 208 160 108 255 233 191 -+255 231 189 255 231 189 255 231 189 255 231 189 255 233 191 236 217 150 -+225 161 106 83 51 28 161 127 82 191 208 160 230 232 196 232 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 212 216 184 -+199 209 176 199 209 176 199 209 176 199 209 176 199 209 176 199 209 176 -+173 198 156 173 198 156 199 209 176 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+232 255 198 230 232 196 172 197 155 73 53 28 155 112 61 73 53 28 -+236 169 118 231 165 115 255 230 188 255 230 188 255 231 189 255 231 189 -+255 234 192 215 204 162 22 13 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 133 97 51 236 169 118 255 231 189 -+255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 236 217 150 -+200 154 86 82 57 39 173 198 156 199 209 176 232 255 199 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+173 198 156 173 198 156 199 209 176 173 198 156 199 209 176 212 216 184 -+199 209 176 173 198 156 199 209 176 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 232 255 199 230 232 196 132 119 61 104 73 33 80 54 33 -+232 166 115 230 172 123 255 230 188 255 230 188 255 231 189 255 231 189 -+255 232 190 249 228 179 115 82 46 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 230 188 -+255 231 189 255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 -+166 125 65 107 78 54 189 206 156 230 232 196 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+230 232 196 212 216 184 199 209 176 173 198 156 173 198 156 199 209 176 -+199 209 176 173 198 156 199 209 176 199 209 176 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 237 255 203 161 127 82 104 73 33 84 59 38 -+232 166 115 235 224 165 255 232 190 255 231 189 255 231 189 255 231 189 -+255 231 189 255 233 191 146 115 67 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 -+82 57 39 172 197 155 173 198 156 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 199 209 176 199 209 176 173 198 156 199 209 176 199 209 176 -+173 198 156 230 232 196 231 255 198 173 198 156 230 232 196 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 233 255 199 212 216 184 82 57 39 166 125 65 -+230 163 113 235 224 165 255 233 191 255 231 189 255 231 189 255 231 189 -+255 230 188 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 -+82 57 39 172 197 155 172 197 155 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 199 209 176 231 255 198 -+231 255 198 212 216 184 173 198 156 199 209 176 173 198 156 173 198 156 -+199 209 176 231 255 198 212 216 184 173 198 156 199 209 176 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 232 255 198 230 232 196 82 57 39 200 154 86 -+233 170 120 249 228 179 255 232 190 255 231 189 255 231 189 255 231 189 -+255 231 189 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 233 191 -+82 57 39 172 197 155 172 197 155 212 216 184 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 199 209 176 199 209 176 -+231 255 198 231 255 198 231 255 198 199 209 176 173 198 156 199 209 176 -+231 255 198 231 255 198 199 209 176 173 198 156 199 209 176 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 233 255 199 231 255 198 82 57 39 190 135 80 -+236 217 150 255 233 191 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 234 192 -+119 92 52 132 119 61 173 198 156 172 197 155 212 216 184 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 212 216 184 199 209 176 -+230 232 196 231 255 198 231 255 198 199 209 176 173 198 156 173 198 156 -+199 209 176 199 209 176 199 209 176 173 198 156 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 235 255 203 172 197 155 86 63 36 219 162 97 -+236 217 150 255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 -+255 231 189 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 231 189 -+255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 255 234 192 -+200 154 86 82 57 39 191 208 160 172 197 155 173 198 156 212 216 184 -+231 255 198 232 255 199 231 255 198 231 255 198 231 255 198 199 209 176 -+199 209 176 199 209 176 199 209 176 199 209 176 173 198 156 212 216 184 -+199 209 176 173 198 156 173 198 156 199 209 176 232 255 199 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 235 255 203 132 119 61 133 97 51 236 169 118 -+236 217 150 255 233 191 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 230 188 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 233 191 -+211 185 152 82 57 39 172 197 155 173 198 156 172 197 155 172 197 155 -+206 210 177 230 232 196 233 255 199 233 255 199 231 255 198 231 255 198 -+199 209 176 199 209 176 173 198 156 173 198 156 199 209 176 191 208 160 -+172 197 155 172 197 155 199 209 176 230 232 196 230 232 196 231 255 198 -+233 255 199 233 255 199 233 255 199 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 199 209 176 107 78 54 166 125 65 233 170 120 -+249 228 179 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 236 217 150 -+255 233 191 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 230 188 133 97 51 125 102 55 189 206 156 173 198 156 172 197 155 -+172 197 155 173 198 156 199 209 176 212 216 184 231 255 198 233 255 199 -+232 255 199 230 232 196 199 209 176 173 198 156 191 208 160 172 197 155 -+172 197 155 172 197 155 172 197 155 172 197 155 173 198 156 199 209 176 -+199 209 176 199 209 176 212 216 184 232 255 198 232 255 199 232 255 199 -+231 255 198 212 216 184 186 149 103 83 51 28 230 163 113 230 172 123 -+255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 -+255 230 188 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 227 181 122 -+255 234 192 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 227 165 115 86 63 36 161 127 82 189 206 156 173 198 156 -+172 197 155 172 197 155 172 197 155 172 197 155 189 206 156 191 208 160 -+191 208 160 191 208 160 173 198 156 172 197 155 172 197 155 173 198 156 -+173 198 156 173 198 156 173 198 156 173 198 156 172 197 155 172 197 155 -+172 197 155 172 197 155 173 198 156 189 206 156 189 206 156 191 208 160 -+191 208 160 172 197 155 86 63 36 190 135 80 232 166 115 230 172 123 -+255 233 191 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 230 188 138 104 59 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 77 45 20 219 162 97 236 217 150 -+255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 255 230 188 -+255 234 192 235 224 165 200 154 86 96 68 37 125 102 55 172 197 155 -+191 208 160 173 198 156 173 198 156 172 197 155 172 197 155 172 197 155 -+172 197 155 172 197 155 172 197 155 173 198 156 173 198 156 173 198 156 -+173 198 156 173 198 156 173 198 156 173 198 156 172 197 155 172 197 155 -+172 197 155 172 197 155 173 198 156 173 198 156 173 198 156 172 197 155 -+132 119 61 82 57 39 115 82 46 236 169 118 229 163 112 230 172 123 -+255 233 191 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 234 192 235 224 165 69 42 21 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 190 135 80 227 181 122 -+249 228 179 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 -+255 234 192 236 217 150 200 154 86 96 68 37 107 78 54 82 57 39 -+107 78 54 172 197 155 172 197 155 172 197 155 172 197 155 173 198 156 -+173 198 156 173 198 156 173 198 156 172 197 155 173 198 156 173 198 156 -+173 198 156 172 197 155 172 197 155 172 197 155 172 197 155 172 197 155 -+172 197 155 173 198 156 172 197 155 107 78 54 82 57 39 82 57 39 -+107 78 54 172 197 155 73 53 28 200 154 86 230 164 114 230 172 123 -+255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 255 230 188 -+255 234 192 211 185 152 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 9 2 0 190 135 80 232 166 115 -+236 217 150 255 234 192 255 231 189 255 231 189 255 231 189 255 231 189 -+255 234 192 249 228 179 98 62 37 161 127 82 212 216 184 173 198 156 -+161 127 82 82 57 39 172 197 155 191 208 160 173 198 156 172 197 155 -+161 127 82 186 149 103 173 198 156 191 208 160 189 206 156 173 198 156 -+172 197 155 172 197 155 173 198 156 191 208 160 212 216 184 231 255 198 -+231 255 198 231 255 198 231 255 198 210 220 166 210 220 166 210 220 166 -+231 255 198 230 232 196 161 127 82 104 74 41 236 169 118 230 172 123 -+249 228 179 255 232 190 255 230 188 255 231 189 255 231 189 255 231 189 -+255 231 189 186 149 103 9 2 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 4 0 2 99 70 33 232 166 115 -+236 217 150 255 232 190 255 230 188 255 231 189 255 231 189 255 230 188 -+255 232 190 236 217 150 89 60 38 172 197 155 212 216 184 233 255 199 -+235 255 203 237 255 203 233 255 199 231 255 198 212 216 184 172 197 155 -+125 102 55 107 78 54 107 78 54 107 78 54 125 102 55 172 197 155 -+191 208 160 212 216 184 232 255 199 237 255 203 235 255 203 233 255 199 -+233 255 199 233 255 199 232 255 199 233 255 199 233 255 199 233 255 199 -+232 255 198 212 216 184 172 197 155 94 65 40 236 169 118 229 163 112 -+227 181 122 255 230 188 255 231 189 255 231 189 255 230 188 255 233 191 -+236 217 150 98 62 37 4 0 2 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 22 13 4 190 135 80 -+233 169 121 249 228 179 255 234 192 255 231 189 255 231 189 255 234 192 -+249 228 179 233 169 121 166 125 65 91 67 37 172 197 155 212 216 184 -+237 255 203 237 255 203 237 255 203 235 255 203 212 216 184 173 198 156 -+132 119 61 81 56 37 138 104 59 178 137 80 133 97 51 73 53 28 -+82 57 39 107 78 54 86 63 36 161 127 82 173 198 156 211 215 171 -+212 216 184 230 232 196 233 255 199 237 255 203 237 255 203 235 255 203 -+212 216 184 172 197 155 82 57 39 168 130 70 236 169 118 230 164 114 -+230 164 114 249 228 179 255 233 191 255 230 188 255 232 190 255 230 188 -+208 160 108 22 13 4 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 68 37 -+236 169 118 227 181 122 249 228 179 255 232 190 255 232 190 249 228 179 -+227 181 122 230 164 114 230 163 113 104 73 33 51 35 26 161 127 82 -+186 149 103 186 149 103 161 127 82 132 119 61 86 63 36 80 54 33 -+133 97 51 219 162 97 236 169 118 236 169 118 232 166 115 225 161 106 -+225 161 106 225 161 106 200 154 86 106 76 45 84 59 38 94 65 40 -+86 58 39 86 63 36 132 119 61 161 127 82 186 149 103 161 127 82 -+107 78 54 9 2 0 22 13 4 166 125 65 232 166 115 231 165 115 -+229 163 112 227 181 122 249 228 179 255 233 191 249 228 179 227 181 122 -+98 62 37 9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 15 7 -+166 125 65 232 166 115 233 170 120 227 181 122 227 181 122 232 168 117 -+232 166 115 225 161 106 115 82 46 9 2 0 0 0 0 106 76 45 -+138 104 59 131 100 59 131 100 59 131 100 59 190 135 80 236 169 118 -+236 169 118 231 165 115 231 165 115 230 164 114 231 165 115 231 165 115 -+231 165 115 231 165 115 232 166 115 236 169 118 236 169 118 236 169 118 -+236 169 118 186 149 103 146 115 67 146 115 67 146 115 67 104 73 33 -+10 1 0 0 0 0 0 0 0 32 15 7 166 125 65 236 169 118 -+232 168 117 230 163 113 227 181 122 249 228 179 227 181 122 155 112 61 -+32 15 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+20 10 4 155 112 61 225 161 106 236 169 118 236 169 118 236 169 118 -+208 160 108 115 82 46 4 0 2 0 0 0 0 0 0 180 145 91 -+236 169 118 236 169 118 236 169 118 236 169 118 236 169 118 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 230 163 113 231 165 115 230 172 123 235 224 165 -+249 228 179 255 232 190 255 234 192 255 234 192 249 228 179 233 170 120 -+22 13 4 0 0 0 0 0 0 0 0 0 20 10 4 155 112 61 -+225 161 106 230 163 113 230 163 113 225 161 106 155 112 61 20 10 4 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 58 38 16 138 104 59 146 115 67 133 97 51 -+22 13 4 0 0 0 0 0 0 0 0 0 0 0 0 166 125 65 -+236 169 118 230 164 114 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 230 164 114 232 168 117 236 217 150 255 233 191 255 232 190 -+255 232 190 255 231 189 255 231 189 255 231 189 255 234 192 227 165 115 -+22 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+58 38 16 116 87 35 116 87 35 58 38 16 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 58 38 16 -+229 163 112 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+230 164 114 229 163 112 227 181 122 255 232 190 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 119 92 52 -+4 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 10 4 -+229 163 112 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+230 163 113 232 168 117 249 228 179 255 232 190 255 230 188 255 231 189 -+255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 81 56 37 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 13 4 -+200 154 86 232 166 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+229 163 112 227 181 122 255 233 191 255 230 188 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 234 192 236 217 150 69 42 21 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 2 -+94 65 40 236 169 118 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+230 163 113 249 228 179 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 234 192 186 149 103 9 2 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+73 53 28 236 169 118 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+229 163 112 249 228 179 255 232 190 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 234 192 161 127 82 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+73 53 28 236 169 118 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 230 163 113 -+230 172 123 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 234 192 161 127 82 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 10 4 -+190 135 80 232 168 117 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 229 163 112 -+236 217 150 255 233 191 255 230 188 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 234 192 227 181 122 58 38 16 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 10 4 -+229 163 112 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 230 164 114 230 163 113 230 163 113 230 164 114 229 163 112 -+236 217 150 255 234 192 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 73 53 28 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 115 82 46 -+232 166 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+230 164 114 230 163 113 230 172 123 236 217 150 233 169 121 225 161 106 -+236 217 150 255 233 191 255 230 188 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 234 192 164 128 83 -+9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 178 137 80 -+236 169 118 230 164 114 231 165 115 231 165 115 231 165 115 230 164 114 -+231 165 115 236 217 150 255 230 188 255 232 190 235 224 165 233 169 121 -+230 172 123 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 227 181 122 -+20 10 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 58 38 16 200 154 86 -+232 168 117 231 165 115 231 165 115 231 165 115 231 165 115 229 163 112 -+227 181 122 255 231 189 255 231 189 255 231 189 255 230 188 229 163 112 -+219 162 97 249 228 179 255 232 190 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 249 228 179 -+89 60 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 9 2 0 131 100 59 236 169 118 -+230 164 114 231 165 115 231 165 115 231 165 115 230 164 114 232 168 117 -+249 228 179 255 232 190 255 230 188 255 233 191 236 217 150 116 87 35 -+166 125 65 255 230 188 255 232 190 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 -+186 149 103 20 10 4 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 32 15 7 166 125 65 232 166 115 -+231 165 115 231 165 115 231 165 115 231 165 115 229 163 112 227 181 122 -+255 233 191 255 230 188 255 231 189 255 234 192 208 160 108 69 42 21 -+225 161 106 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 -+255 231 189 255 231 189 255 232 190 255 234 192 255 234 192 249 228 179 -+208 160 108 58 38 16 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 20 10 4 98 62 37 32 15 7 190 135 80 -+236 169 118 230 164 114 231 165 115 231 165 115 230 163 113 249 228 179 -+255 231 189 255 231 189 255 230 188 255 234 192 227 181 122 155 112 61 -+227 181 122 255 232 190 255 232 190 255 231 189 255 230 188 255 231 189 -+255 231 189 255 230 188 249 228 179 227 181 122 227 181 122 230 172 123 -+58 38 16 83 51 28 123 94 35 9 2 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 115 82 46 232 166 115 98 62 37 104 73 33 -+229 163 112 231 165 115 231 165 115 231 165 115 230 163 113 249 228 179 -+255 234 192 255 232 190 255 234 192 255 230 188 249 228 179 249 228 179 -+235 224 165 249 228 179 255 230 188 236 217 150 230 172 123 236 217 150 -+227 181 122 232 168 117 231 165 115 230 163 113 232 166 115 155 112 61 -+58 38 16 219 162 97 225 161 106 9 2 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 40 20 7 190 135 80 236 169 118 178 137 80 22 13 4 -+119 92 52 236 169 118 231 165 115 230 164 114 230 164 114 230 172 123 -+236 217 150 249 228 179 236 217 150 227 181 122 230 172 123 230 163 113 -+229 163 112 231 165 115 230 172 123 232 168 117 230 163 113 230 163 113 -+230 163 113 230 164 114 230 164 114 232 166 115 155 112 61 22 13 4 -+133 97 51 236 169 118 225 161 106 69 42 21 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+36 17 7 190 135 80 232 166 115 231 165 115 232 166 115 155 112 61 -+58 38 16 219 162 97 232 168 117 230 164 114 231 165 115 229 163 112 -+231 165 115 233 169 121 229 163 112 229 163 112 230 163 113 231 165 115 -+231 165 115 230 164 114 230 163 113 230 164 114 231 165 115 231 165 115 -+231 165 115 230 164 114 236 169 118 200 154 86 32 15 7 115 82 46 -+230 163 113 231 165 115 232 166 115 200 154 86 58 38 16 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+166 125 65 236 169 118 231 165 115 230 164 114 232 166 115 230 164 114 -+58 38 16 69 42 21 225 161 106 232 168 117 231 165 115 231 165 115 -+230 164 114 230 163 113 230 164 114 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+230 164 114 232 166 115 225 161 106 104 73 33 89 60 38 232 166 115 -+232 168 117 230 164 114 231 165 115 236 169 118 133 97 51 4 0 2 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 69 42 21 -+225 161 106 232 168 117 230 164 114 231 165 115 230 164 114 232 166 115 -+190 135 80 58 38 16 166 125 65 236 169 118 236 169 118 236 169 118 -+236 169 118 236 169 118 236 169 118 236 169 118 232 168 117 236 169 118 -+236 169 118 236 169 118 236 169 118 236 169 118 236 169 118 236 169 118 -+236 169 118 225 161 106 115 82 46 22 13 4 168 130 70 236 169 118 -+230 164 114 231 165 115 230 164 114 231 165 115 225 161 106 104 73 33 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 9 2 0 155 112 61 -+236 169 118 230 164 114 231 165 115 231 165 115 231 165 115 231 165 115 -+236 169 118 133 97 51 36 17 7 166 125 65 190 135 80 190 135 80 -+190 135 80 190 135 80 190 135 80 190 135 80 225 161 106 190 135 80 -+190 135 80 190 135 80 190 135 80 190 135 80 190 135 80 190 135 80 -+190 135 80 104 73 33 32 15 7 166 125 65 232 166 115 230 164 114 -+231 165 115 231 165 115 231 165 115 230 164 114 236 169 118 200 154 86 -+22 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 69 42 21 225 161 106 -+231 165 115 230 164 114 231 165 115 231 165 115 231 165 115 230 164 114 -+232 166 115 225 161 106 98 62 37 46 29 24 132 119 61 132 119 61 -+132 119 61 132 119 61 132 119 61 46 29 24 77 45 20 107 78 54 -+132 119 61 132 119 61 132 119 61 132 119 61 132 119 61 132 119 61 -+107 78 54 32 15 7 166 125 65 236 169 118 231 165 115 230 164 114 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 236 169 118 -+115 82 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 81 56 37 236 169 118 -+230 164 114 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+230 164 114 232 168 117 225 161 106 104 74 41 173 198 156 247 255 212 -+247 255 212 247 255 212 237 255 203 199 209 176 172 197 155 232 255 199 -+247 255 212 247 255 212 247 255 212 247 255 212 247 255 212 247 255 212 -+119 92 52 166 125 65 232 166 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 236 169 118 -+138 104 59 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 22 13 4 190 135 80 232 168 117 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 230 164 114 236 169 118 166 125 65 107 78 54 231 255 198 -+231 255 198 231 255 198 231 255 198 235 255 203 237 255 203 232 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 237 255 203 173 198 156 -+86 63 36 232 166 115 231 165 115 230 164 114 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 232 168 117 -+219 162 97 69 42 21 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 22 13 4 229 163 112 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 232 166 115 83 51 28 173 198 156 -+235 255 203 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 232 255 198 235 255 203 107 78 54 -+166 125 65 236 169 118 230 164 114 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 -+236 169 118 80 54 33 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 20 10 4 225 161 106 232 166 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 230 164 114 232 168 117 190 135 80 91 67 37 -+235 255 203 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 237 255 203 172 197 155 98 62 37 -+225 161 106 232 166 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+236 169 118 80 54 33 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 69 42 21 229 163 112 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 230 164 114 232 166 115 96 68 37 -+172 197 155 237 255 203 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 231 255 198 119 92 52 155 112 61 -+236 169 118 230 164 114 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+236 169 118 80 54 33 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 168 130 70 236 169 118 230 164 114 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 236 169 118 166 125 65 -+134 113 63 247 255 212 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 231 255 198 230 232 196 73 53 28 232 166 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+236 169 118 73 53 28 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 236 169 118 190 135 80 -+107 78 54 230 232 196 233 255 199 231 255 198 231 255 198 231 255 198 -+231 255 198 231 255 198 235 255 203 172 197 155 104 74 41 236 169 118 -+230 164 114 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+236 169 118 96 68 37 9 2 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 236 169 118 -+104 73 33 172 197 155 237 255 203 231 255 198 231 255 198 231 255 198 -+231 255 198 232 255 198 231 255 198 82 57 39 190 135 80 232 166 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+232 166 115 200 154 86 22 13 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 236 169 118 -+190 135 80 82 57 39 231 255 198 231 255 198 231 255 198 231 255 198 -+231 255 198 237 255 203 186 149 103 115 82 46 232 166 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 229 163 112 22 13 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 -+236 169 118 104 74 41 186 149 103 237 255 203 231 255 198 231 255 198 -+233 255 199 230 232 196 107 78 54 190 135 80 236 169 118 230 164 114 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+232 166 115 225 161 106 22 13 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 -+232 166 115 200 154 86 82 57 39 231 255 198 233 255 199 232 255 199 -+235 255 203 172 197 155 98 62 37 236 169 118 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 225 161 106 22 13 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 230 164 114 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 232 166 115 116 87 35 132 119 61 232 255 199 233 255 199 -+210 220 166 73 53 28 190 135 80 233 170 120 230 164 114 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 225 161 106 22 13 4 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 83 51 28 230 163 113 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+230 164 114 236 169 118 155 112 61 73 53 28 132 119 61 134 113 63 -+125 102 55 51 35 26 219 162 97 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 -+236 169 118 133 97 51 9 2 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 20 10 4 225 161 106 232 166 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 232 168 117 219 162 97 69 42 21 4 0 2 9 2 0 -+9 2 0 133 97 51 236 169 118 230 164 114 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 -+231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 232 168 117 -+219 162 97 58 38 16 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -diff --git a/drivers/video/logo/logo_zen_clut224.ppm b/drivers/video/logo/logo_zen_clut224.ppm -new file mode 100644 -index 000000000000..f4c78972fe58 ---- /dev/null -+++ b/drivers/video/logo/logo_zen_clut224.ppm -@@ -0,0 +1,2043 @@ -+P3 -+102 120 -+255 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 1 1 0 1 1 0 2 3 0 2 3 1 5 6 -+1 7 9 1 8 11 2 10 13 2 11 15 2 13 18 3 16 22 -+3 18 24 3 21 29 4 23 31 5 25 34 5 28 38 6 30 41 -+6 30 41 6 33 45 7 36 49 7 36 49 7 36 49 7 36 49 -+7 36 49 7 38 51 7 38 51 7 36 49 7 36 49 7 36 49 -+7 36 49 6 33 45 6 33 45 6 30 41 5 28 38 5 27 37 -+5 25 34 4 22 30 4 20 27 3 16 22 3 15 20 2 13 18 -+2 11 15 2 9 12 1 7 9 1 7 9 1 4 5 0 3 4 -+0 2 3 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -+0 1 1 0 2 3 0 3 4 1 4 5 1 5 6 1 7 9 -+2 9 12 2 11 15 2 12 16 3 16 22 3 18 24 3 21 29 -+5 25 34 5 27 37 6 30 41 6 33 45 7 36 49 7 38 51 -+6 40 54 8 41 55 8 42 57 8 44 59 8 45 61 8 45 61 -+8 45 61 8 45 61 8 45 61 8 45 61 8 45 61 8 44 59 -+8 42 57 8 42 57 8 41 55 7 38 51 7 36 49 6 33 45 -+6 33 45 5 29 40 5 25 34 4 23 31 4 20 27 3 18 24 -+3 15 20 2 13 18 1 10 14 1 8 11 1 7 9 1 5 6 -+1 4 5 0 2 3 0 2 3 0 1 1 0 1 1 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 -+0 2 3 0 3 4 1 4 5 1 5 6 1 7 9 2 9 12 -+2 12 16 3 15 20 3 16 22 4 20 27 4 23 31 5 27 37 -+6 30 41 6 33 45 7 36 49 7 39 53 8 42 57 8 45 61 -+9 47 64 9 47 64 9 49 66 9 50 69 9 50 69 10 53 71 -+10 53 71 10 53 71 10 53 71 10 53 71 10 53 71 9 50 69 -+9 49 66 9 49 66 9 47 64 8 45 61 8 42 57 8 42 57 -+7 39 53 7 36 49 6 33 45 5 28 38 5 25 34 4 23 31 -+4 20 27 3 16 22 3 15 20 2 11 15 2 9 12 1 7 9 -+1 5 6 0 3 4 0 3 4 0 2 3 0 1 1 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 -+0 3 4 1 4 5 1 5 6 1 7 9 2 9 12 2 12 16 -+3 15 20 3 18 24 3 21 29 5 25 34 6 30 41 6 33 45 -+7 38 51 8 41 55 8 44 59 9 47 64 9 49 66 10 53 71 -+10 53 71 10 54 74 11 56 77 11 58 79 11 58 79 11 58 79 -+11 58 79 11 58 79 11 58 79 11 58 79 11 58 79 11 58 79 -+11 56 77 11 56 77 10 54 74 10 53 71 9 50 69 9 49 66 -+8 45 61 8 42 57 6 40 54 7 36 49 6 33 45 5 29 40 -+5 25 34 3 21 29 3 18 24 3 15 20 2 12 16 2 10 13 -+1 7 9 1 5 6 0 3 4 0 3 4 0 2 3 0 2 3 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 2 3 -+0 3 4 1 5 6 1 7 9 1 8 11 2 12 16 3 15 20 -+4 19 26 4 23 31 5 27 37 6 30 41 7 36 49 6 40 54 -+8 44 59 9 47 64 9 50 69 10 53 71 11 56 77 11 58 79 -+11 58 79 11 60 82 12 61 82 12 62 85 12 64 87 12 64 87 -+12 64 87 12 64 87 12 64 87 12 64 87 12 64 87 12 64 87 -+12 62 85 11 60 82 11 60 82 11 58 79 11 56 77 10 54 74 -+10 53 71 9 49 66 8 45 61 8 42 57 7 39 53 7 36 49 -+6 30 41 5 27 37 4 22 30 4 19 26 3 15 20 2 12 16 -+2 10 13 1 7 9 1 5 6 0 3 4 0 2 3 0 2 3 -+0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 0 1 1 0 2 3 0 2 3 -+1 4 5 1 5 6 1 8 11 2 10 13 2 13 18 3 18 24 -+4 22 30 5 27 37 6 30 41 7 36 49 8 41 55 8 45 61 -+9 49 66 10 53 71 10 54 74 11 58 79 12 61 82 12 61 82 -+12 64 87 12 64 87 12 66 90 12 66 90 13 67 91 13 67 91 -+13 67 91 13 67 92 13 67 92 13 67 91 13 67 91 12 66 90 -+12 66 90 12 64 87 12 64 87 12 64 87 11 60 82 11 58 79 -+11 58 79 10 54 74 9 50 69 9 47 64 8 44 59 8 41 55 -+7 36 49 6 30 41 5 27 37 4 23 31 4 19 26 3 15 20 -+2 12 16 2 9 12 1 7 9 1 4 5 0 3 4 0 2 3 -+0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 1 0 1 1 0 2 3 0 3 4 -+1 5 6 1 7 9 2 9 12 2 12 16 3 16 22 3 21 29 -+5 25 34 6 30 41 7 36 49 8 41 55 8 45 61 9 49 66 -+10 54 74 11 58 79 11 60 82 12 62 85 12 64 87 12 66 90 -+13 67 92 13 67 92 13 69 94 13 69 94 13 69 94 13 69 94 -+13 69 94 13 71 96 13 71 96 13 69 94 13 69 94 13 69 94 -+13 69 94 13 68 93 13 68 93 13 67 91 12 64 87 12 64 87 -+12 62 85 11 58 79 11 56 77 10 53 71 9 50 69 8 45 61 -+8 41 55 7 36 49 6 30 41 5 27 37 4 23 31 3 18 24 -+3 15 20 2 11 15 1 8 11 1 7 9 1 5 6 0 3 4 -+0 2 3 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 1 0 1 1 0 1 1 0 2 3 1 4 5 -+1 7 9 2 9 12 2 12 16 3 15 20 4 19 26 4 24 33 -+6 30 41 7 36 49 8 41 55 8 45 61 9 50 69 10 54 74 -+11 58 79 12 62 85 12 64 87 13 67 91 13 68 93 13 69 94 -+13 69 94 13 71 96 13 72 97 13 72 98 14 73 99 14 73 99 -+14 73 99 13 72 98 13 72 98 14 73 99 13 72 98 13 72 98 -+13 72 98 13 72 97 13 71 96 13 69 94 13 69 94 13 67 91 -+12 66 90 12 64 87 12 62 85 11 58 79 10 54 74 9 50 69 -+9 47 64 8 41 55 7 36 49 6 33 45 5 27 37 4 23 31 -+3 18 24 2 13 18 1 10 14 1 8 11 1 7 9 1 4 5 -+0 2 3 0 2 3 0 1 1 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 1 0 1 1 0 2 3 0 3 4 1 4 5 -+1 7 9 1 10 14 3 15 20 3 16 22 4 22 30 5 28 38 -+6 33 45 8 41 55 8 45 61 9 50 69 10 54 74 11 58 79 -+12 62 85 12 66 90 13 67 92 13 69 94 13 71 96 13 72 98 -+14 73 99 14 73 99 14 73 99 14 74 101 14 74 101 14 74 101 -+14 74 101 14 74 101 14 74 101 14 74 101 14 74 101 14 74 101 -+14 73 100 14 73 99 13 72 98 13 72 98 13 72 97 13 71 96 -+13 69 94 13 67 92 12 66 90 12 62 85 11 60 82 11 56 77 -+10 53 71 9 47 64 8 41 55 7 36 49 6 33 45 5 27 37 -+3 21 29 3 16 22 2 13 18 2 10 13 1 7 9 1 5 6 -+0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 1 0 1 1 0 2 3 1 4 5 1 5 6 -+1 8 11 2 12 16 3 15 20 4 19 26 5 25 34 6 30 41 -+7 36 49 8 42 57 9 47 64 10 53 71 11 58 79 12 62 85 -+12 66 90 13 68 93 13 69 94 13 72 98 14 73 99 14 73 100 -+14 73 100 14 74 101 14 74 101 14 74 101 14 74 101 14 74 101 -+14 74 101 14 74 101 14 74 101 14 74 101 14 74 101 14 74 101 -+14 74 101 14 74 101 14 74 101 14 74 101 14 73 99 14 73 99 -+13 72 97 13 69 94 13 68 93 12 66 90 12 64 87 11 60 82 -+11 56 77 9 50 69 9 47 64 8 41 55 7 36 49 6 30 41 -+5 25 34 4 19 26 3 15 20 2 12 16 2 9 12 1 7 9 -+1 4 5 0 2 3 0 2 3 0 1 1 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 -+2 9 12 2 13 18 3 16 22 3 21 29 5 27 37 6 33 45 -+7 39 53 9 47 64 9 50 69 11 56 77 11 60 82 12 64 87 -+13 67 92 13 69 94 13 72 97 13 72 98 14 74 101 14 74 101 -+14 74 101 14 74 101 14 74 101 14 75 102 14 75 102 14 75 102 -+14 75 102 14 75 102 14 75 102 14 75 102 14 75 102 14 75 102 -+14 75 102 14 74 101 14 74 101 14 75 102 14 74 101 14 73 99 -+13 72 98 13 72 98 13 69 94 13 68 93 12 66 90 12 64 87 -+11 58 79 10 54 74 9 49 66 8 44 59 6 40 54 6 33 45 -+5 27 37 4 22 30 3 16 22 2 13 18 2 10 13 1 7 9 -+1 5 6 0 3 4 0 2 3 0 1 1 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 2 3 0 2 3 0 2 3 1 5 6 1 7 9 -+2 10 13 3 15 20 4 19 26 4 23 31 5 29 40 7 36 49 -+8 42 57 9 49 66 10 53 71 11 58 79 12 62 85 12 66 90 -+13 69 94 13 72 97 13 72 98 14 74 101 14 75 102 14 74 101 -+14 75 102 14 75 102 14 75 102 14 75 102 14 75 102 14 74 101 -+14 73 99 14 75 102 14 75 102 14 74 101 14 74 101 14 73 100 -+14 73 100 14 75 102 14 75 102 14 74 101 14 74 101 14 74 101 -+14 74 101 14 73 99 13 72 98 13 69 94 13 69 94 12 66 90 -+12 62 85 11 58 79 10 53 71 9 47 64 8 42 57 7 36 49 -+6 30 41 5 25 34 4 19 26 3 15 20 2 12 16 1 8 11 -+1 5 6 1 4 5 0 2 3 0 1 1 0 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 2 3 0 2 3 0 3 4 1 5 6 1 8 11 -+2 11 15 3 16 22 4 20 27 5 25 34 6 30 41 7 38 51 -+8 45 61 9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 -+13 71 96 13 72 98 14 73 99 14 74 101 14 74 101 14 75 102 -+14 75 102 14 75 102 14 74 101 14 75 102 13 72 98 12 64 87 -+9 49 66 8 41 55 6 30 41 6 30 41 7 38 51 9 47 64 -+11 58 79 13 71 96 14 75 102 14 74 101 14 75 102 14 74 101 -+14 74 101 14 74 101 14 73 99 13 72 98 13 69 94 13 68 93 -+12 64 87 11 60 82 11 56 77 9 50 69 9 47 64 8 41 55 -+6 33 45 5 27 37 4 22 30 3 18 24 2 13 18 2 10 13 -+1 7 9 1 5 6 0 3 4 0 2 3 0 2 3 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 2 9 12 -+2 12 16 3 16 22 3 21 29 5 27 37 6 33 45 7 39 53 -+9 47 64 10 53 71 11 56 77 12 62 85 12 66 90 13 69 94 -+13 72 97 14 73 99 14 74 101 14 74 101 14 75 102 14 75 102 -+14 74 101 14 74 101 12 64 87 5 29 40 0 3 4 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 4 24 33 11 60 82 14 75 102 14 74 101 -+14 75 102 14 74 101 14 74 101 13 72 98 13 72 97 13 69 94 -+13 68 93 12 64 87 11 58 79 10 54 74 9 49 66 8 44 59 -+7 36 49 6 30 41 4 24 33 4 19 26 3 15 20 2 11 15 -+1 8 11 1 5 6 0 3 4 0 2 3 0 2 3 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 1 1 0 2 3 1 4 5 1 7 9 2 9 12 -+2 12 16 3 16 22 4 22 30 5 27 37 6 33 45 8 41 55 -+9 47 64 10 54 74 11 58 79 12 62 85 13 67 91 13 69 94 -+13 72 98 14 73 99 14 74 101 14 74 101 14 75 102 14 75 102 -+11 58 79 3 18 24 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 16 22 11 56 77 -+14 74 101 14 74 101 14 74 101 14 74 99 13 72 98 13 71 96 -+13 68 93 12 66 90 11 60 82 11 56 77 10 53 71 8 45 61 -+8 41 55 6 33 45 5 25 34 3 21 29 3 16 22 2 12 16 -+1 8 11 1 7 9 1 4 5 0 3 4 0 1 1 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 -+2 13 18 3 18 24 4 23 31 5 28 38 7 36 49 8 42 57 -+9 49 66 10 54 74 11 60 82 12 64 87 13 67 91 13 69 94 -+13 72 98 14 74 101 14 74 101 14 75 102 14 74 101 8 45 61 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 9 8 8 21 20 20 3 3 3 0 0 0 0 0 0 -+6 33 45 14 74 101 14 74 101 14 74 101 14 73 99 13 72 98 -+13 69 94 13 67 91 12 62 85 11 58 79 10 54 74 9 47 64 -+8 41 55 6 33 45 5 28 38 4 23 31 4 19 26 2 13 18 -+2 9 12 1 7 9 1 4 5 0 3 4 0 2 3 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 2 9 12 -+2 13 18 4 19 26 4 23 31 5 28 38 7 36 49 8 42 57 -+9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 -+14 73 99 14 74 101 14 74 101 14 74 101 9 47 64 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 29 26 26 81 83 82 55 54 51 21 20 20 0 0 0 -+0 0 0 5 25 34 14 73 99 14 74 101 14 73 99 13 72 98 -+13 69 94 13 68 93 12 64 87 11 60 82 11 56 77 9 50 69 -+8 44 59 7 36 49 6 30 41 5 25 34 4 19 26 3 15 20 -+2 10 13 1 7 9 1 5 6 0 3 4 0 2 3 0 1 1 -+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 2 9 12 -+3 15 20 4 19 26 4 24 33 5 29 40 7 36 49 8 44 59 -+9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 -+14 73 99 14 74 101 14 74 101 12 62 85 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 39 37 35 113 114 111 113 114 111 69 68 60 28 32 37 -+3 3 3 0 0 0 5 27 37 14 74 101 14 74 101 14 73 99 -+13 72 97 13 69 94 12 66 90 12 62 85 11 58 79 10 53 71 -+8 45 61 7 38 51 6 30 41 5 25 34 3 21 29 3 15 20 -+2 11 15 1 8 11 1 5 6 1 4 5 0 2 3 0 2 3 -+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 2 3 0 3 4 1 5 6 1 7 9 2 10 13 -+3 15 20 4 19 26 4 24 33 6 30 41 7 36 49 8 44 59 -+9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 -+14 73 99 14 74 101 14 74 101 2 13 18 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 47 44 41 113 114 111 81 83 82 55 54 51 39 37 35 -+9 8 8 0 0 0 0 0 0 9 49 66 14 73 99 14 73 99 -+13 72 98 13 69 94 12 66 90 12 62 85 11 58 79 10 53 71 -+9 47 64 8 41 55 6 33 45 5 27 37 4 22 30 3 16 22 -+2 12 16 1 8 11 1 7 9 1 4 5 0 2 3 0 2 3 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 1 10 14 -+2 13 18 4 19 26 5 25 34 6 30 41 7 36 49 8 44 59 -+9 50 69 11 56 77 11 60 82 12 64 87 13 69 94 13 72 97 -+14 73 100 14 73 99 12 62 85 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 39 37 35 39 37 35 16 15 15 6 5 5 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 1 12 64 87 13 72 98 -+13 72 98 13 69 94 13 67 91 12 64 87 11 58 79 10 54 74 -+9 47 64 8 41 55 6 33 45 5 28 38 4 23 31 3 16 22 -+2 12 16 2 9 12 1 7 9 1 4 5 0 2 3 0 2 3 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 2 10 13 -+3 15 20 4 19 26 5 25 34 6 30 41 7 36 49 8 44 59 -+9 50 69 11 56 77 11 60 82 12 64 87 13 69 94 13 72 97 -+14 73 99 14 73 99 8 41 55 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 1 1 7 7 7 0 0 1 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 4 20 27 14 73 99 -+13 72 98 13 69 94 13 67 91 12 64 87 11 60 82 10 54 74 -+9 49 66 8 42 57 7 36 49 5 29 40 4 23 31 3 18 24 -+2 12 16 2 9 12 1 7 9 1 4 5 0 3 4 0 1 1 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 1 10 14 -+3 15 20 4 19 26 5 25 34 6 30 41 7 36 49 8 44 59 -+9 50 69 11 56 77 11 60 82 12 64 87 13 69 94 13 72 97 -+13 73 99 14 73 99 3 16 22 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 68 93 -+13 72 97 13 69 94 13 68 93 12 64 87 11 60 82 10 54 74 -+9 49 66 8 42 57 7 36 49 6 30 41 4 24 33 3 18 24 -+2 12 16 2 9 12 1 7 9 1 4 5 0 3 4 0 1 1 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 1 10 14 -+2 13 18 4 19 26 5 25 34 6 30 41 7 36 49 8 44 59 -+9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 72 97 -+14 73 99 12 66 90 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 42 57 -+13 72 98 13 71 96 13 68 93 12 64 87 11 60 82 11 56 77 -+9 50 69 8 42 57 7 36 49 6 30 41 4 24 33 4 19 26 -+2 13 18 2 9 12 1 7 9 1 5 6 0 3 4 0 1 1 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 2 10 13 -+2 13 18 4 19 26 4 24 33 5 29 40 7 36 49 8 44 59 -+9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 -+13 72 97 11 58 79 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 11 15 -+13 72 98 13 71 96 13 68 93 12 64 87 11 60 82 11 56 77 -+9 50 69 8 44 59 7 36 49 6 30 41 5 25 34 4 19 26 -+3 15 20 2 10 13 1 7 9 1 5 6 0 3 4 0 1 1 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 -+2 13 18 4 19 26 4 24 33 5 29 40 7 36 49 8 44 59 -+9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 -+13 71 96 9 50 69 0 0 0 0 0 0 0 0 0 0 0 0 -+12 12 11 29 26 26 29 26 26 2 2 2 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 16 15 15 55 54 51 69 68 60 21 20 20 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+13 68 93 13 69 94 13 68 93 12 64 87 12 62 85 11 56 77 -+9 50 69 8 44 59 7 36 49 6 30 41 5 25 34 4 19 26 -+2 13 18 2 10 13 1 7 9 1 5 6 0 3 4 0 1 1 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 -+2 13 18 4 19 26 4 23 31 5 28 38 7 36 49 8 42 57 -+9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 72 97 -+13 72 97 8 45 61 0 0 0 0 0 0 0 0 0 0 0 0 -+9 8 8 39 37 35 81 83 82 69 68 60 7 7 7 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 3 3 3 16 15 15 69 68 60 105 98 84 29 26 26 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+11 60 82 13 69 94 13 69 94 12 64 87 12 61 82 11 58 79 -+9 50 69 8 44 59 7 38 51 6 33 45 5 25 34 4 19 26 -+2 13 18 2 10 13 1 7 9 1 5 6 0 3 4 0 1 1 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 -+2 13 18 3 18 24 4 23 31 5 28 38 7 36 49 8 42 57 -+9 50 69 10 54 74 11 60 82 12 64 87 13 68 93 13 71 96 -+13 72 97 8 42 57 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 1 4 5 47 44 41 39 37 35 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 0 2 3 28 32 37 55 54 51 -+9 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+9 47 64 13 69 94 13 69 94 12 66 90 12 62 85 11 58 79 -+10 53 71 8 45 61 7 38 51 6 33 45 5 27 37 4 20 27 -+3 15 20 1 10 14 1 7 9 1 5 6 0 3 4 0 2 3 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 -+2 13 18 3 18 24 4 23 31 5 28 38 7 36 49 8 42 57 -+9 49 66 10 54 74 11 60 82 12 64 87 13 67 92 13 69 94 -+13 72 97 8 41 55 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 1 1 4 5 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 -+4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+6 30 41 13 72 97 13 69 94 12 66 90 12 64 87 11 58 79 -+10 53 71 9 47 64 7 39 53 6 33 45 5 27 37 3 21 29 -+3 16 22 2 11 15 1 8 11 1 7 9 1 4 5 0 2 3 -+0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 2 9 12 -+2 12 16 3 16 22 4 23 31 5 28 38 7 36 49 8 42 57 -+9 49 66 10 54 74 11 58 79 12 64 87 13 67 91 13 69 94 -+13 72 97 8 42 57 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 16 22 13 72 97 13 69 94 12 66 90 12 64 87 11 58 79 -+10 53 71 9 47 64 8 41 55 7 36 49 5 29 40 4 22 30 -+3 16 22 2 12 16 1 8 11 1 7 9 1 5 6 0 2 3 -+0 2 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 1 1 0 2 3 0 3 4 1 7 9 1 9 12 -+2 12 16 3 16 22 4 22 30 5 27 37 6 33 45 8 42 57 -+9 47 64 10 54 74 11 58 79 12 64 87 13 67 91 13 69 94 -+13 72 97 8 42 57 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 16 22 13 72 97 13 69 94 13 68 93 12 64 87 11 60 82 -+10 54 74 9 49 66 8 42 57 7 36 49 6 30 41 4 23 31 -+4 19 26 2 13 18 2 10 13 1 7 9 1 5 6 0 3 4 -+0 2 3 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 1 8 11 -+2 11 15 3 16 22 3 21 29 5 27 37 6 33 45 8 41 55 -+9 47 64 10 54 74 11 58 79 12 62 85 13 67 91 13 69 94 -+13 71 96 8 44 59 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 4 4 4 4 4 4 0 0 0 0 0 0 9 8 8 -+21 20 20 6 5 5 0 0 0 0 0 0 29 26 26 7 7 7 -+0 0 0 0 0 0 12 12 11 1 1 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 21 29 13 72 97 13 71 96 13 68 93 12 66 90 11 60 82 -+11 56 77 9 49 66 8 44 59 7 38 51 6 30 41 5 25 34 -+4 19 26 2 13 18 1 10 14 1 8 11 1 5 6 0 3 4 -+0 2 3 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 2 3 0 2 3 1 4 5 1 5 6 1 8 11 -+2 12 16 3 16 22 3 21 29 5 25 34 6 33 45 8 41 55 -+9 47 64 10 54 74 11 58 79 12 62 85 13 67 91 13 69 94 -+13 69 94 8 45 61 0 0 0 9 8 8 148 147 146 39 37 35 -+0 0 0 29 26 26 81 83 82 81 83 82 0 0 0 11 13 22 -+69 68 60 28 32 37 7 7 7 148 147 146 201 196 193 39 37 35 -+0 0 0 0 0 1 69 68 60 105 98 84 47 44 41 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+6 30 41 14 73 99 13 71 96 13 68 93 12 66 90 12 61 82 -+11 56 77 9 50 69 8 45 61 6 40 54 6 33 45 5 27 37 -+4 20 27 3 16 22 2 11 15 1 8 11 1 7 9 1 4 5 -+0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 2 3 0 2 3 1 4 5 1 5 6 1 8 11 -+2 12 16 3 16 22 3 21 29 5 25 34 6 33 45 7 39 53 -+9 47 64 10 53 71 11 58 79 12 62 85 13 67 91 13 69 94 -+13 69 94 9 49 66 0 0 0 81 83 82 251 251 251 171 169 168 -+0 2 3 0 0 0 113 114 111 241 241 241 47 44 41 35 25 1 -+35 25 1 35 25 1 148 147 146 248 247 247 250 252 255 113 114 111 -+7 7 7 3 3 3 69 68 60 224 226 233 224 223 222 55 54 51 -+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+7 36 49 13 72 98 13 72 97 13 69 94 13 67 91 12 64 87 -+11 58 79 10 53 71 9 47 64 8 42 57 7 36 49 5 28 38 -+4 23 31 3 16 22 2 12 16 1 10 14 1 7 9 1 5 6 -+0 3 4 0 2 3 0 1 1 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 2 3 0 2 3 1 4 5 1 5 6 1 8 11 -+2 11 15 3 16 22 4 20 27 5 25 34 6 33 45 7 39 53 -+9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 -+13 69 94 11 58 79 0 0 0 81 83 82 255 255 255 255 255 255 -+191 183 178 171 169 168 201 196 193 235 193 64 234 181 0 234 181 0 -+234 181 0 222 168 1 225 176 47 245 217 114 247 240 225 255 255 255 -+213 210 208 208 204 201 241 241 241 255 255 255 255 255 255 191 183 178 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+5 27 37 14 73 99 13 72 98 13 69 94 13 68 93 12 64 87 -+11 60 82 10 54 74 9 49 66 8 44 59 7 38 51 6 30 41 -+5 25 34 4 19 26 3 15 20 2 11 15 1 8 11 1 5 6 -+1 4 5 0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 2 3 0 2 3 0 3 4 1 5 6 1 8 11 -+2 11 15 3 16 22 4 20 27 5 25 34 6 33 45 7 39 53 -+9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 -+13 71 96 11 60 82 0 0 1 47 44 41 250 249 249 255 255 255 -+252 254 255 225 202 147 209 152 1 194 135 4 249 197 0 255 210 1 -+255 206 13 209 152 1 209 152 1 249 197 0 254 207 32 225 202 147 -+247 240 225 250 252 255 252 254 255 255 255 255 252 254 255 191 183 178 -+1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+3 15 20 14 74 101 13 72 98 13 71 96 13 69 94 12 66 90 -+12 61 82 11 58 79 9 50 69 9 47 64 8 41 55 6 33 45 -+5 27 37 3 21 29 3 16 22 2 13 18 2 9 12 1 7 9 -+1 5 6 0 3 4 0 2 3 0 1 1 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 2 3 0 2 3 0 3 4 1 5 6 1 8 11 -+2 11 15 3 16 22 3 21 29 5 25 34 6 33 45 7 39 53 -+9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 -+13 72 98 12 62 85 0 0 0 0 2 3 201 196 193 254 251 250 -+176 158 88 209 152 1 249 197 0 243 191 0 255 205 1 254 207 32 -+255 209 45 255 205 1 249 197 0 255 205 1 255 205 1 249 197 0 -+243 191 0 235 193 64 225 202 147 245 245 244 242 244 252 81 83 82 -+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 5 6 13 72 98 14 73 99 13 72 97 13 69 94 13 67 92 -+12 62 85 11 58 79 10 53 71 9 49 66 8 42 57 7 36 49 -+6 30 41 4 23 31 4 19 26 3 15 20 1 10 14 1 8 11 -+1 5 6 0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 1 1 0 2 3 1 4 5 1 5 6 1 8 11 -+2 12 16 3 16 22 3 21 29 5 25 34 6 33 45 7 39 53 -+9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 -+13 73 99 12 66 90 1 1 1 0 0 0 55 54 51 199 145 62 -+222 168 1 255 205 1 255 205 1 255 205 1 255 205 1 255 209 45 -+255 208 38 255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 -+255 206 22 255 205 1 249 198 10 255 208 38 167 119 72 1 5 6 -+1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 13 69 94 13 72 98 13 72 98 13 71 96 13 68 93 -+12 64 87 11 60 82 11 56 77 9 50 69 8 45 61 7 39 53 -+6 33 45 5 27 37 3 21 29 3 16 22 2 13 18 2 10 13 -+1 7 9 1 4 5 0 3 4 0 2 3 0 1 1 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 2 3 0 3 4 0 3 4 1 7 9 1 8 11 -+2 12 16 3 16 22 4 22 30 5 27 37 6 33 45 8 41 55 -+9 47 64 10 53 71 11 58 79 12 62 85 13 67 91 13 69 94 -+13 72 97 13 72 98 1 8 11 11 5 1 154 101 6 222 168 1 -+255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 255 209 45 -+255 206 13 255 205 1 255 205 1 255 205 1 255 208 38 255 209 52 -+255 209 49 255 206 22 255 205 1 255 210 1 243 191 0 109 74 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 11 58 79 13 72 98 13 72 98 13 72 97 13 69 94 -+13 67 91 12 62 85 11 58 79 10 54 74 9 49 66 8 42 57 -+7 36 49 6 30 41 4 24 33 4 20 27 3 15 20 2 11 15 -+1 8 11 1 7 9 1 4 5 0 2 3 0 2 3 0 1 1 -+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -+0 1 1 0 2 3 0 2 3 1 5 6 1 7 9 2 9 12 -+2 13 18 4 19 26 4 23 31 5 29 40 7 36 49 8 42 57 -+9 49 66 10 54 74 11 58 79 12 64 87 13 67 91 13 69 94 -+13 72 97 14 73 100 0 8 19 72 47 3 209 152 1 255 205 1 -+255 205 1 255 205 1 255 205 1 255 205 1 255 206 22 255 206 22 -+255 205 1 255 205 1 255 205 1 254 207 32 255 209 55 255 209 49 -+255 206 22 255 205 1 255 205 1 255 210 1 241 197 0 154 101 6 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 7 36 49 14 73 100 14 73 99 14 73 99 13 71 96 -+13 68 93 12 64 87 11 60 82 11 56 77 10 53 71 9 47 64 -+7 39 53 6 33 45 5 28 38 4 23 31 3 18 24 3 15 20 -+2 10 13 1 7 9 1 7 9 0 3 4 0 2 3 0 1 1 -+0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 -+0 1 1 0 3 4 1 4 5 1 5 6 1 8 11 2 11 15 -+3 15 20 4 20 27 5 25 34 6 30 41 7 36 49 8 44 59 -+9 50 69 10 54 74 11 60 82 12 64 87 13 68 93 13 71 96 -+13 72 98 13 72 98 0 14 27 109 74 3 234 181 0 255 205 1 -+255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 255 205 1 -+255 205 1 255 205 1 254 207 32 255 209 55 255 208 38 255 206 13 -+255 205 1 255 210 1 243 191 0 222 168 1 234 181 0 109 74 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 2 9 12 14 73 100 14 74 101 14 73 99 13 72 98 -+13 69 94 13 67 91 12 62 85 11 58 79 10 54 74 9 49 66 -+8 42 57 7 36 49 6 30 41 5 25 34 3 21 29 3 16 22 -+2 12 16 2 9 12 1 7 9 1 5 6 0 3 4 0 3 4 -+0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 -+0 2 3 0 2 3 1 5 6 1 7 9 2 9 12 2 12 16 -+3 16 22 4 22 30 5 27 37 6 33 45 7 38 51 8 45 61 -+9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 -+13 72 98 14 73 99 4 24 33 72 47 3 209 152 1 255 205 1 -+255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 -+255 205 1 255 206 22 255 209 49 254 207 32 255 210 1 249 197 0 -+243 191 0 222 168 1 209 152 1 234 181 0 209 152 1 22 11 1 -+0 0 0 0 0 0 12 12 11 47 44 41 12 12 11 0 0 0 -+0 0 0 0 0 0 13 69 94 14 73 99 14 74 101 13 72 98 -+13 71 96 13 67 91 12 64 87 12 61 82 11 58 79 10 53 71 -+8 45 61 8 41 55 6 33 45 5 29 40 4 24 33 4 19 26 -+3 15 20 2 11 15 1 8 11 1 7 9 1 5 6 0 3 4 -+0 2 3 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 2 3 -+0 3 4 1 4 5 1 7 9 1 8 11 2 11 15 3 15 20 -+4 19 26 5 25 34 6 30 41 7 36 49 8 41 55 9 47 64 -+10 53 71 11 58 79 12 64 87 12 66 90 13 69 94 13 72 97 -+13 72 98 14 73 99 6 33 45 5 1 0 154 101 6 209 152 1 -+243 191 0 255 205 1 255 210 1 255 205 1 255 205 1 255 205 1 -+255 205 1 255 206 13 255 206 13 243 191 0 222 168 1 222 168 1 -+234 181 0 241 197 0 255 205 1 234 181 0 139 105 59 16 15 15 -+0 0 0 0 0 0 16 15 15 113 114 111 105 98 84 55 54 51 -+9 8 8 0 0 0 9 49 66 14 73 99 14 74 101 13 72 98 -+13 72 97 13 69 94 13 67 91 12 64 87 11 60 82 10 54 74 -+9 49 66 8 44 59 7 38 51 6 33 45 5 27 37 4 22 30 -+3 18 24 3 15 20 2 11 15 1 8 11 1 7 9 1 4 5 -+0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 1 0 1 1 0 2 3 0 3 4 -+1 4 5 1 7 9 1 8 11 1 10 14 2 13 18 3 18 24 -+4 22 30 5 28 38 6 33 45 7 38 51 8 45 61 9 50 69 -+11 56 77 11 60 82 12 64 87 13 67 91 13 69 94 13 72 98 -+14 73 99 13 74 101 6 40 54 4 0 5 105 98 84 174 129 27 -+183 122 1 222 168 1 234 181 0 234 181 0 243 191 0 243 191 0 -+234 181 0 222 168 1 209 152 1 222 168 1 241 197 0 255 205 1 -+255 205 1 222 168 1 202 153 21 176 158 88 171 169 168 81 83 82 -+0 0 0 0 0 0 0 2 3 69 68 60 113 114 111 113 114 111 -+69 68 60 2 2 2 1 10 14 14 74 101 14 74 101 14 74 99 -+14 73 99 13 71 96 13 69 94 12 66 90 12 64 87 11 58 79 -+10 53 71 9 47 64 8 42 57 7 38 51 6 33 45 5 25 34 -+3 21 29 3 16 22 2 13 18 1 10 14 1 8 11 1 5 6 -+0 3 4 0 2 3 0 2 3 0 1 1 0 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 1 1 0 1 1 0 2 3 0 3 4 1 4 5 -+1 5 6 1 8 11 1 10 14 2 13 18 3 16 22 3 21 29 -+5 25 34 6 33 45 7 38 51 8 41 55 9 47 64 10 53 71 -+11 58 79 12 64 87 12 66 90 13 69 94 13 72 97 13 72 98 -+14 73 99 14 74 101 7 38 51 0 0 0 148 147 146 148 147 146 -+154 101 6 194 135 4 209 152 1 209 152 1 209 152 1 209 152 1 -+209 152 1 234 181 0 241 197 0 255 210 1 249 197 0 222 168 1 -+202 153 21 176 158 88 208 204 201 224 226 233 213 210 208 148 147 146 -+9 8 8 0 0 0 0 0 0 17 25 27 81 83 82 113 114 111 -+113 114 111 12 12 11 0 0 0 11 56 77 14 73 100 14 74 101 -+14 73 99 13 72 98 13 69 94 13 68 93 12 66 90 12 62 85 -+11 58 79 10 53 71 9 47 64 8 42 57 7 36 49 6 30 41 -+5 25 34 4 20 27 3 16 22 2 13 18 1 10 14 1 7 9 -+1 5 6 0 3 4 0 3 4 0 2 3 0 1 1 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 1 1 0 2 3 0 3 4 0 3 4 1 5 6 -+1 7 9 1 10 14 2 13 18 3 16 22 4 20 27 5 25 34 -+6 30 41 7 36 49 8 41 55 9 47 64 9 50 69 11 56 77 -+11 60 82 12 64 87 13 67 91 13 69 94 13 72 98 14 73 99 -+14 74 101 14 74 101 3 16 22 5 1 0 148 147 146 191 183 178 -+148 147 146 139 105 59 194 135 4 243 191 0 255 210 1 255 210 1 -+255 210 1 255 205 1 243 191 0 222 168 1 194 135 4 176 158 88 -+201 196 193 224 226 233 242 244 252 242 244 252 248 247 247 224 223 222 -+69 68 60 0 0 0 0 0 0 0 0 0 12 12 11 69 68 60 -+47 44 41 0 0 1 0 0 0 0 3 4 13 72 97 14 74 101 -+14 74 101 14 73 99 13 72 97 13 69 94 13 67 92 12 64 87 -+11 60 82 11 56 77 9 50 69 9 47 64 8 41 55 7 36 49 -+6 30 41 5 25 34 4 20 27 3 16 22 2 13 18 2 10 13 -+1 7 9 1 5 6 1 4 5 0 2 3 0 2 3 0 1 1 -+0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -+0 1 1 0 2 3 0 2 3 0 3 4 1 5 6 1 7 9 -+2 9 12 2 12 16 3 15 20 4 19 26 4 23 31 5 28 38 -+6 33 45 6 40 54 8 44 59 9 49 66 10 54 74 11 58 79 -+12 64 87 13 67 91 13 69 94 13 71 96 14 73 99 14 73 99 -+14 73 100 12 62 85 0 0 0 2 2 2 148 147 146 213 210 208 -+171 169 168 148 147 146 139 105 59 194 135 4 209 152 1 222 168 1 -+222 168 1 209 152 1 194 135 4 174 129 27 171 169 168 213 210 208 -+224 226 233 250 252 255 255 255 255 255 255 255 254 254 254 252 254 255 -+148 147 146 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 -+0 0 1 0 0 0 0 0 0 0 0 0 9 47 64 14 73 99 -+14 74 101 14 73 99 13 72 98 13 72 97 13 69 94 12 66 90 -+12 64 87 11 58 79 10 54 74 9 50 69 8 45 61 7 39 53 -+6 33 45 5 28 38 4 24 33 4 19 26 3 15 20 2 12 16 -+1 9 12 1 7 9 1 4 5 0 3 4 0 2 3 0 1 1 -+0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 -+0 1 1 0 2 3 1 4 5 1 5 6 1 7 9 2 9 12 -+2 12 16 3 15 20 4 19 26 4 23 31 5 27 37 6 33 45 -+7 38 51 8 44 59 9 49 66 10 53 71 11 58 79 12 62 85 -+12 66 90 13 69 94 13 71 96 13 72 98 14 73 99 14 74 101 -+14 73 100 4 24 33 0 0 0 0 0 1 171 169 168 242 244 252 -+208 204 201 171 169 168 148 147 146 139 105 59 139 105 59 139 105 59 -+167 119 72 167 119 72 148 147 146 191 183 178 218 217 217 241 241 241 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+237 237 236 55 54 51 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 1 5 6 14 72 97 -+14 73 100 14 74 101 14 73 99 13 72 98 13 71 96 13 68 93 -+12 66 90 12 62 85 11 58 79 10 54 74 9 49 66 8 44 59 -+7 38 51 6 33 45 5 28 38 4 23 31 4 19 26 3 15 20 -+2 11 15 2 9 12 1 7 9 1 5 6 0 3 4 0 2 3 -+0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 -+0 2 3 0 3 4 1 5 6 1 7 9 1 8 11 2 12 16 -+3 15 20 4 19 26 4 23 31 5 28 38 6 33 45 7 38 51 -+8 44 59 9 49 66 10 54 74 11 58 79 12 62 85 12 64 87 -+13 68 93 13 69 94 13 72 98 14 73 99 14 74 101 14 73 99 -+11 60 82 0 0 0 0 0 0 16 15 15 218 217 217 252 254 255 -+241 241 241 208 204 201 171 169 168 148 147 146 148 147 146 148 147 146 -+148 147 146 171 169 168 201 196 193 218 217 217 245 245 244 254 254 254 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+252 254 255 171 169 168 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 33 45 -+14 74 101 14 74 101 14 74 101 13 72 98 13 72 98 13 69 94 -+13 68 93 12 64 87 12 62 85 11 58 79 10 53 71 9 47 64 -+8 42 57 7 38 51 6 33 45 5 27 37 4 23 31 3 18 24 -+3 15 20 2 12 16 2 9 12 1 7 9 1 4 5 0 3 4 -+0 2 3 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 2 3 -+0 3 4 1 5 6 1 7 9 2 9 12 2 11 15 3 15 20 -+3 18 24 4 23 31 5 28 38 6 33 45 7 38 51 8 42 57 -+9 47 64 10 53 71 11 58 79 11 60 82 12 64 87 13 67 92 -+13 69 94 13 72 97 13 72 98 14 74 101 14 74 101 14 72 97 -+1 7 9 0 0 0 0 0 0 113 114 111 255 255 255 255 255 255 -+255 255 255 237 237 236 201 196 193 171 169 168 171 169 168 171 169 168 -+201 196 193 208 204 201 224 223 222 250 249 249 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 247 247 69 68 60 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+11 58 79 14 73 99 14 74 101 14 74 101 14 73 99 13 72 98 -+13 69 94 13 67 92 12 64 87 12 61 82 11 58 79 10 53 71 -+9 47 64 8 42 57 7 38 51 6 33 45 5 27 37 4 22 30 -+3 18 24 3 15 20 2 12 16 1 8 11 1 7 9 1 4 5 -+0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 1 1 0 2 3 0 2 3 0 3 4 -+1 4 5 1 7 9 1 8 11 2 12 16 3 15 20 3 18 24 -+4 23 31 5 27 37 6 33 45 7 38 51 8 42 57 9 47 64 -+10 53 71 11 58 79 11 60 82 12 64 87 13 67 91 13 69 94 -+13 72 97 13 72 98 14 74 101 14 74 101 14 73 100 4 23 31 -+0 0 0 0 0 0 55 54 51 241 241 241 255 255 255 255 255 255 -+255 255 255 252 254 255 232 232 232 208 204 201 208 204 201 208 204 201 -+218 217 217 232 232 232 250 251 253 252 254 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 252 254 255 148 147 146 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+1 7 9 13 72 98 14 74 101 14 75 102 14 74 101 13 72 98 -+13 72 97 13 69 94 13 67 91 12 64 87 11 60 82 11 58 79 -+10 53 71 9 47 64 8 42 57 7 38 51 6 33 45 5 27 37 -+3 21 29 3 18 24 3 15 20 2 11 15 1 8 11 1 7 9 -+1 4 5 0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 1 0 1 1 0 2 3 0 3 4 0 3 4 -+1 5 6 1 8 11 1 10 14 3 15 20 3 16 22 3 21 29 -+5 25 34 6 30 41 7 36 49 8 42 57 9 47 64 10 53 71 -+11 56 77 11 60 82 12 64 87 12 66 90 13 69 94 13 72 97 -+13 72 98 14 73 99 14 74 101 14 73 99 10 53 71 0 0 0 -+0 0 0 6 5 5 171 169 168 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 250 251 253 224 226 233 218 217 217 224 226 233 -+241 241 241 250 251 253 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 218 217 217 12 12 11 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 7 39 53 14 73 100 14 74 101 14 74 101 14 73 99 -+13 72 98 13 71 96 13 69 94 13 67 91 12 64 87 11 60 82 -+11 56 77 9 50 69 9 47 64 8 41 55 7 36 49 6 30 41 -+5 25 34 3 21 29 3 18 24 2 13 18 2 10 13 1 8 11 -+1 5 6 0 3 4 0 2 3 0 2 3 0 1 1 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 1 1 0 1 1 0 3 4 0 3 4 1 5 6 -+1 7 9 2 10 13 2 13 18 3 16 22 4 20 27 5 25 34 -+6 30 41 7 36 49 8 41 55 9 47 64 9 50 69 11 56 77 -+11 60 82 12 64 87 13 67 91 13 69 94 13 71 96 13 72 98 -+14 73 99 14 74 101 14 74 101 13 69 94 0 3 4 0 0 0 -+0 0 0 113 114 111 251 251 251 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 251 251 251 250 249 249 251 251 251 -+252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 250 252 255 69 68 60 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 12 64 87 14 73 99 14 74 101 14 74 101 -+14 73 99 13 72 98 13 71 96 13 69 94 12 66 90 12 64 87 -+11 58 79 10 54 74 9 50 69 8 45 61 8 41 55 6 33 45 -+5 29 40 5 25 34 3 21 29 3 16 22 2 12 16 2 9 12 -+1 7 9 1 5 6 0 3 4 0 2 3 0 1 1 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 1 1 0 2 3 0 3 4 1 5 6 1 7 9 -+2 9 12 2 12 16 3 16 22 4 20 27 4 24 33 5 29 40 -+7 36 49 8 41 55 9 47 64 9 50 69 10 54 74 11 60 82 -+12 64 87 13 67 91 13 69 94 13 71 96 13 72 98 14 74 99 -+14 74 101 14 73 100 14 73 99 3 15 20 0 0 0 0 0 0 -+39 37 35 224 223 222 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 148 147 146 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 2 9 12 13 69 94 14 74 101 14 74 101 -+14 74 101 14 73 99 13 72 98 13 71 96 13 69 94 12 66 90 -+12 64 87 11 58 79 10 54 74 9 50 69 8 45 61 7 39 53 -+6 33 45 5 29 40 5 25 34 4 19 26 3 15 20 2 12 16 -+2 9 12 1 7 9 1 5 6 0 3 4 0 2 3 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -+0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 1 9 12 -+2 11 15 3 15 20 4 19 26 5 25 34 5 28 38 6 33 45 -+6 40 54 8 45 61 9 50 69 10 54 74 11 58 79 12 64 87 -+12 66 90 13 69 94 13 71 96 13 72 98 14 73 99 14 74 101 -+14 74 101 14 74 101 4 23 31 0 0 0 0 0 0 0 0 0 -+113 114 111 252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 224 223 222 21 20 20 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 1 10 14 14 74 101 14 75 102 -+14 74 101 14 74 101 14 73 99 13 72 98 13 71 96 13 69 94 -+12 66 90 12 62 85 11 60 82 10 54 74 9 50 69 8 45 61 -+7 39 53 7 36 49 5 29 40 4 23 31 4 19 26 3 15 20 -+2 12 16 2 9 12 1 7 9 1 4 5 0 3 4 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 -+0 1 1 0 2 3 0 3 4 1 7 9 1 7 9 2 10 13 -+3 15 20 3 18 24 4 23 31 5 28 38 6 33 45 7 38 51 -+8 44 59 9 49 66 10 54 74 11 58 79 12 62 85 12 66 90 -+13 69 94 13 71 96 13 72 98 13 72 98 14 74 101 14 74 101 -+14 73 100 7 39 53 0 0 0 0 0 0 0 0 0 16 15 15 -+148 147 146 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 253 -+248 247 247 248 247 247 254 254 254 251 251 251 148 147 146 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 6 33 45 14 75 102 -+14 75 102 14 74 101 14 74 101 14 73 99 13 72 98 13 69 94 -+13 68 93 12 66 90 12 64 87 11 58 79 10 54 74 9 49 66 -+8 44 59 7 38 51 6 33 45 5 28 38 4 23 31 3 18 24 -+3 15 20 2 11 15 1 8 11 1 7 9 1 4 5 0 2 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 -+0 2 3 0 3 4 1 5 6 1 7 9 2 9 12 2 12 16 -+3 16 22 4 20 27 5 25 34 6 30 41 7 36 49 8 41 55 -+9 47 64 10 53 71 11 58 79 11 60 82 12 64 87 13 68 93 -+13 69 94 13 72 97 14 73 99 14 74 101 14 74 101 14 74 101 -+13 69 94 0 0 0 0 0 0 0 0 0 0 0 0 39 37 35 -+171 169 168 232 232 232 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 248 247 247 253 253 253 254 254 254 250 249 249 -+251 251 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 253 253 253 245 245 244 232 232 232 224 223 222 218 217 217 -+208 204 201 208 204 201 224 223 222 255 255 255 218 217 217 7 7 7 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 66 90 -+14 74 101 14 74 101 14 74 101 14 74 101 14 73 99 13 72 97 -+13 69 94 13 67 91 12 64 87 12 62 85 11 58 79 10 53 71 -+9 47 64 8 42 57 7 36 49 6 33 45 5 25 34 3 21 29 -+3 16 22 2 13 18 2 10 13 1 7 9 1 5 6 0 3 4 -+0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 -+0 2 3 0 3 4 1 5 6 1 8 11 2 11 15 3 15 20 -+3 18 24 4 23 31 5 29 40 7 36 49 8 41 55 8 45 61 -+9 50 69 11 56 77 11 60 82 12 64 87 13 67 91 13 69 94 -+13 72 97 14 73 99 14 74 101 14 74 101 14 74 101 14 74 101 -+5 28 38 0 0 0 0 0 0 0 0 0 0 0 0 69 68 60 -+148 147 146 191 183 178 224 223 222 251 251 251 255 255 255 255 255 255 -+255 255 255 255 255 255 237 237 236 208 204 201 208 204 201 224 223 222 -+245 245 244 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+245 245 244 218 217 217 201 196 193 171 169 168 171 169 168 148 147 146 -+148 147 146 171 169 168 171 169 168 224 223 222 255 255 255 81 83 82 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 18 24 -+14 74 101 14 75 102 14 74 101 14 74 101 14 74 101 14 73 99 -+13 72 97 13 69 94 13 67 92 12 64 87 11 60 82 11 56 77 -+9 50 69 9 47 64 8 42 57 7 36 49 5 29 40 4 24 33 -+4 19 26 3 16 22 2 12 16 2 9 12 1 7 9 1 5 6 -+0 0 0 0 0 0 0 0 0 0 1 1 0 2 3 0 2 3 -+0 3 4 1 5 6 1 7 9 2 10 13 2 13 18 3 16 22 -+4 22 30 5 27 37 6 33 45 7 39 53 8 44 59 9 50 69 -+10 54 74 11 60 82 12 64 87 13 67 91 13 69 94 13 72 97 -+14 73 100 14 74 101 14 74 101 14 74 101 14 74 101 12 62 85 -+0 0 0 0 0 0 0 0 0 0 0 0 6 5 5 113 114 111 -+148 147 146 171 169 168 213 210 208 241 241 241 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 232 232 232 229 228 227 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+253 253 253 241 241 241 224 223 222 201 196 193 191 183 178 171 169 168 -+171 169 168 148 147 146 148 147 146 171 169 168 232 232 232 191 183 178 -+1 4 5 0 0 0 21 20 20 29 26 26 3 3 3 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+9 49 66 14 74 101 14 75 102 14 74 101 14 74 101 14 74 99 -+13 72 98 13 72 97 13 69 94 13 67 91 12 64 87 11 60 82 -+10 54 74 9 50 69 9 47 64 8 41 55 6 33 45 5 28 38 -+4 23 31 4 19 26 3 15 20 2 11 15 1 8 11 1 7 9 -+0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 3 4 -+1 4 5 1 7 9 2 9 12 2 12 16 3 16 22 4 20 27 -+5 25 34 6 30 41 7 36 49 8 42 57 9 47 64 10 53 71 -+11 58 79 12 62 85 12 66 90 13 68 93 13 72 97 14 73 99 -+14 73 99 14 74 101 14 74 101 14 75 102 14 74 101 4 19 26 -+0 0 0 0 0 0 0 0 0 0 0 0 39 37 35 148 147 146 -+213 210 208 241 241 241 250 249 249 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 252 254 255 252 254 255 242 244 252 232 232 232 -+218 217 217 191 183 178 171 169 168 148 147 146 171 169 168 237 237 236 -+81 83 82 0 0 0 9 8 8 39 37 35 55 54 51 16 15 15 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 2 3 14 72 97 14 75 102 14 75 102 14 74 101 14 74 101 -+14 73 99 13 72 98 13 72 97 13 69 94 12 66 90 12 64 87 -+11 58 79 10 54 74 9 50 69 8 44 59 7 38 51 6 33 45 -+5 27 37 4 22 30 3 18 24 2 13 18 2 10 13 1 7 9 -+0 0 0 0 0 0 0 1 1 0 2 3 0 2 3 0 3 4 -+1 5 6 1 7 9 2 10 13 3 15 20 3 18 24 4 22 30 -+5 28 38 7 36 49 8 41 55 9 47 64 9 50 69 11 56 77 -+11 60 82 12 66 90 13 68 93 13 69 94 13 72 98 14 73 99 -+14 74 101 14 74 101 14 74 101 14 74 101 12 64 87 0 0 0 -+1 1 1 9 8 8 0 0 0 0 2 3 105 98 84 232 232 232 -+255 255 255 252 254 255 252 254 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+252 254 255 242 244 252 224 223 222 171 169 168 148 147 146 201 196 193 -+191 183 178 3 3 3 0 0 0 0 0 0 17 25 27 55 54 51 -+16 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 7 36 49 14 74 101 14 75 102 14 74 101 14 74 101 -+14 74 101 14 73 99 13 72 98 13 71 96 13 69 94 12 66 90 -+12 62 85 11 58 79 10 53 71 9 47 64 8 42 57 7 36 49 -+6 30 41 5 25 34 4 20 27 3 16 22 2 12 16 2 9 12 -+0 0 0 0 0 0 0 1 1 0 2 3 0 2 3 1 4 5 -+1 7 9 1 8 11 2 12 16 3 16 22 4 20 27 5 25 34 -+6 30 41 7 36 49 8 44 59 9 49 66 10 54 74 11 58 79 -+12 62 85 13 67 91 13 69 94 13 72 97 13 72 98 14 74 101 -+14 74 101 14 74 101 14 75 102 14 74 101 6 33 45 0 0 0 -+21 20 20 21 20 20 0 0 0 7 7 7 191 183 178 252 254 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 232 232 232 191 183 178 148 147 146 -+218 217 217 55 54 51 0 0 1 0 0 0 0 0 0 21 20 20 -+39 37 35 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 14 72 97 14 74 101 14 75 102 14 74 101 -+14 74 101 14 74 101 13 72 98 13 72 98 13 69 94 13 67 91 -+12 64 87 11 60 82 11 56 77 9 50 69 8 45 61 6 40 54 -+6 33 45 5 28 38 4 23 31 4 19 26 3 15 20 2 10 13 -+0 0 0 0 0 1 0 1 1 0 2 3 0 3 4 1 5 6 -+1 7 9 2 10 13 2 13 18 3 18 24 4 23 31 5 28 38 -+6 33 45 8 41 55 9 47 64 10 53 71 11 58 79 11 60 82 -+12 66 90 13 68 93 13 71 96 13 72 98 14 73 99 14 75 102 -+14 74 101 14 75 102 14 75 102 14 73 99 1 4 5 6 5 5 -+47 44 41 12 12 11 0 0 0 81 83 82 242 244 252 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 252 254 255 241 241 241 201 196 193 -+208 204 201 148 147 146 0 0 0 0 0 0 3 3 3 3 3 3 -+12 12 11 12 12 11 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 6 33 45 14 74 101 14 75 102 14 75 102 -+14 74 101 14 75 102 14 74 101 13 72 98 13 72 97 13 69 94 -+12 66 90 12 64 87 11 60 82 10 54 74 9 49 66 8 42 57 -+7 36 49 6 33 45 5 27 37 4 20 27 3 16 22 2 12 16 -+0 0 0 0 1 1 0 2 3 0 2 3 1 4 5 1 5 6 -+1 8 11 2 12 16 3 16 22 3 21 29 5 25 34 6 30 41 -+7 36 49 8 44 59 9 49 66 10 54 74 11 60 82 12 64 87 -+13 67 91 13 69 94 13 72 98 14 73 100 14 74 101 14 74 101 -+14 75 102 14 75 102 14 74 101 11 56 77 0 0 0 29 26 26 -+28 32 37 0 0 0 9 8 8 208 204 201 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 252 254 255 242 244 252 -+218 217 217 218 217 217 29 26 26 0 0 0 16 15 15 39 37 35 -+16 15 15 12 12 11 16 15 15 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 12 64 87 14 74 101 14 75 102 -+14 75 102 14 74 101 14 74 101 14 74 99 13 72 98 13 71 96 -+13 68 93 12 66 90 12 62 85 11 58 79 10 53 71 9 47 64 -+8 41 55 7 36 49 6 30 41 4 24 33 4 19 26 3 15 20 -+0 0 1 0 1 1 0 2 3 0 3 4 1 5 6 1 7 9 -+2 10 13 2 13 18 4 19 26 4 23 31 5 29 40 6 33 45 -+8 41 55 9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 -+13 69 94 13 72 97 14 73 99 14 74 99 14 75 102 14 74 101 -+14 75 102 14 76 103 14 73 100 3 18 24 4 4 4 47 44 41 -+12 12 11 0 0 0 113 114 111 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 253 253 253 254 254 254 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 254 254 250 249 249 113 114 111 0 0 0 17 25 27 47 44 41 -+29 26 26 16 15 15 47 44 41 6 5 5 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 4 24 33 14 75 102 14 75 102 -+14 75 102 14 74 101 14 74 101 14 74 101 14 73 99 13 72 98 -+13 69 94 13 68 93 12 64 87 11 60 82 11 56 77 9 50 69 -+8 45 61 6 40 54 6 33 45 5 27 37 3 21 29 3 16 22 -+0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 1 8 11 -+2 12 16 3 16 22 4 20 27 5 25 34 6 33 45 7 36 49 -+8 44 59 9 50 69 10 54 74 11 60 82 12 64 87 13 67 91 -+13 69 94 13 72 98 14 73 99 14 74 101 14 74 101 14 75 102 -+14 75 102 14 74 101 11 58 79 0 0 0 29 26 26 39 37 35 -+0 0 0 47 44 41 241 241 241 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 253 253 253 248 247 247 250 249 249 254 254 254 255 255 255 -+255 255 255 253 253 253 251 251 251 253 253 253 255 255 255 255 255 255 -+255 255 255 255 255 255 171 169 168 0 0 0 12 12 11 39 37 35 -+12 12 11 0 0 1 55 54 51 39 37 35 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 13 69 94 14 75 102 -+14 75 102 14 75 102 14 74 101 14 74 101 14 74 99 13 72 98 -+13 71 96 13 69 94 13 67 91 12 62 85 11 58 79 10 53 71 -+9 47 64 8 42 57 7 36 49 6 30 41 4 24 33 3 18 24 -+0 1 1 0 2 3 0 3 4 1 5 6 1 7 9 2 10 13 -+2 13 18 3 18 24 4 23 31 5 28 38 6 33 45 7 39 53 -+9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 -+13 71 96 13 72 98 14 74 101 14 74 101 14 74 101 14 75 102 -+14 75 102 14 75 102 5 27 37 0 0 0 39 37 35 21 20 20 -+0 0 1 148 147 146 251 251 251 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 245 245 244 237 237 236 241 241 241 251 251 251 255 255 255 -+255 255 255 250 249 249 248 247 247 251 251 251 254 254 254 255 255 255 -+255 255 255 255 255 255 218 217 217 7 7 7 0 0 0 6 5 5 -+0 0 0 0 0 0 39 37 35 69 68 60 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 9 50 69 14 74 101 -+14 74 101 14 75 102 14 75 102 14 74 101 14 74 101 14 73 99 -+13 72 98 13 69 94 13 68 93 12 64 87 11 60 82 10 54 74 -+9 49 66 8 45 61 7 39 53 6 33 45 5 27 37 3 21 29 -+0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 2 12 16 -+3 16 22 3 21 29 5 25 34 6 33 45 7 38 51 8 42 57 -+9 49 66 10 54 74 11 60 82 12 64 87 13 67 91 13 69 94 -+13 72 98 14 73 99 14 74 101 14 74 101 14 75 102 14 75 102 -+14 75 102 13 72 98 0 1 1 12 12 11 39 37 35 4 4 4 -+16 15 15 218 217 217 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+253 253 253 237 237 236 213 210 208 224 223 222 245 245 244 251 251 251 -+253 253 253 245 245 244 241 241 241 248 247 247 253 253 253 255 255 255 -+255 255 255 252 254 255 250 249 249 47 44 41 0 0 0 0 0 0 -+0 0 0 0 0 0 16 15 15 69 68 60 9 8 8 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 3 15 20 14 75 102 -+14 75 102 14 75 102 14 75 102 14 74 101 14 74 101 14 74 101 -+13 72 98 13 72 97 13 69 94 12 66 90 12 64 87 11 58 79 -+10 53 71 9 49 66 8 42 57 7 36 49 5 29 40 4 23 31 -+0 2 3 1 4 5 1 7 9 1 8 11 2 11 15 3 15 20 -+3 18 24 4 23 31 5 29 40 7 36 49 8 41 55 9 47 64 -+10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 13 71 96 -+13 72 98 14 74 99 14 74 101 14 74 101 14 75 102 14 75 102 -+14 74 101 10 53 71 0 0 0 21 20 20 21 20 20 0 0 0 -+81 83 82 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+254 251 250 224 223 222 201 196 193 208 204 201 229 228 227 245 245 244 -+250 249 249 241 241 241 237 237 236 241 241 241 248 247 247 254 254 254 -+255 255 255 255 255 255 255 255 255 81 83 82 0 0 0 0 0 0 -+0 0 0 0 0 0 1 4 5 69 68 60 16 15 15 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 68 93 -+14 75 102 14 75 102 14 75 102 14 75 102 14 74 101 14 74 101 -+14 73 100 13 72 98 13 71 96 13 68 93 12 64 87 11 60 82 -+11 56 77 9 50 69 8 45 61 7 39 53 6 33 45 5 25 34 -+0 3 4 1 4 5 1 7 9 2 10 13 2 13 18 3 16 22 -+3 21 29 5 27 37 6 33 45 7 39 53 8 45 61 9 50 69 -+10 54 74 11 60 82 12 64 87 13 67 91 13 69 94 13 72 98 -+14 73 99 14 75 102 14 74 101 14 75 102 14 75 102 14 75 102 -+14 74 101 2 11 15 0 0 0 12 12 11 6 5 5 0 0 0 -+148 147 146 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 247 247 245 245 244 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+250 249 249 218 217 217 191 183 178 191 183 178 213 210 208 237 237 236 -+248 247 247 237 237 236 232 232 232 237 237 236 245 245 244 253 253 253 -+255 255 255 255 255 255 255 255 255 113 114 111 2 2 2 0 0 0 -+0 0 0 0 0 0 3 3 3 47 44 41 12 12 11 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 49 66 -+14 74 101 14 75 102 14 75 102 14 75 102 14 74 101 14 74 101 -+14 74 101 13 72 98 13 72 97 13 69 94 12 66 90 12 62 85 -+11 58 79 10 53 71 9 47 64 8 42 57 7 36 49 5 27 37 -+1 4 5 1 5 6 1 8 11 2 11 15 3 16 22 4 20 27 -+4 24 33 6 30 41 7 36 49 8 42 57 9 47 64 10 53 71 -+11 58 79 12 62 85 12 66 90 13 69 94 13 71 96 13 72 98 -+14 74 99 14 74 101 14 74 101 14 75 102 14 75 102 14 74 101 -+11 58 79 0 0 0 9 8 8 12 12 11 0 0 0 2 2 2 -+201 196 193 252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 229 228 227 224 223 222 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+248 247 247 213 210 208 191 183 178 191 183 178 201 196 193 229 228 227 -+245 245 244 237 237 236 229 228 227 232 232 232 241 241 241 251 251 251 -+255 255 255 255 255 255 255 255 255 171 169 168 0 0 0 0 0 0 -+0 0 0 0 0 0 1 1 1 29 26 26 12 12 11 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 20 27 -+14 75 102 14 75 102 14 75 102 14 76 103 14 75 102 14 74 101 -+14 74 101 14 73 99 13 72 98 13 69 94 13 68 93 12 64 87 -+11 60 82 11 56 77 9 50 69 8 44 59 7 36 49 6 30 41 -+1 5 6 1 7 9 2 9 12 2 13 18 3 18 24 3 21 29 -+5 27 37 6 33 45 7 39 53 8 45 61 9 50 69 10 54 74 -+11 60 82 12 64 87 13 67 91 13 69 94 13 72 98 14 73 99 -+14 74 101 14 75 102 14 76 103 14 75 102 14 76 103 14 75 102 -+4 19 26 0 0 0 21 20 20 29 26 26 0 0 0 29 26 26 -+232 232 232 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 252 254 255 250 252 255 -+250 252 255 213 210 208 218 217 217 255 255 255 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 -+248 247 247 208 204 201 171 169 168 191 183 178 201 196 193 224 223 222 -+241 241 241 237 237 236 229 228 227 232 232 232 241 241 241 250 249 249 -+255 255 255 255 255 255 252 254 255 208 204 201 4 4 4 0 0 0 -+0 0 0 0 0 0 0 0 0 9 8 8 6 5 5 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 6 -+14 75 102 14 76 103 14 76 103 14 76 103 14 76 103 14 75 102 -+14 74 101 14 74 101 13 72 98 13 72 97 13 69 94 12 66 90 -+12 62 85 11 56 77 10 53 71 8 45 61 7 39 53 6 30 41 -+1 7 9 1 8 11 2 11 15 3 15 20 4 20 27 4 24 33 -+6 30 41 7 36 49 8 42 57 9 47 64 10 53 71 11 58 79 -+12 62 85 12 66 90 13 69 94 13 72 97 14 73 100 14 74 101 -+14 75 102 14 76 103 14 76 103 14 76 103 14 75 102 12 62 85 -+0 0 0 0 0 0 39 37 35 47 44 41 0 2 3 69 68 60 -+253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 245 245 244 213 210 208 176 158 88 176 158 88 199 145 62 -+176 158 88 167 119 72 171 169 168 237 237 236 255 255 255 255 255 255 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+245 245 244 208 204 201 191 183 178 191 183 178 191 183 178 218 217 217 -+237 237 236 232 232 232 232 232 232 232 232 232 241 241 241 248 247 247 -+254 254 254 255 255 255 255 255 255 224 223 222 12 12 11 0 0 0 -+0 0 0 0 0 0 7 7 7 12 12 11 1 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+13 69 94 14 76 103 14 76 103 14 76 103 14 76 103 14 76 103 -+14 75 102 14 74 101 14 73 99 13 72 98 13 69 94 12 66 90 -+12 64 87 11 58 79 10 53 71 9 47 64 8 41 55 6 33 45 -+1 7 9 2 10 13 2 13 18 3 18 24 4 23 31 5 28 38 -+6 33 45 7 39 53 9 47 64 10 53 71 11 56 77 11 60 82 -+12 64 87 13 68 93 13 72 97 14 73 100 14 74 101 14 75 102 -+14 76 103 14 78 106 14 78 106 14 78 106 14 76 103 3 16 22 -+0 0 0 1 1 1 55 54 51 47 44 41 0 0 1 113 114 111 -+254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 250 252 255 -+225 202 147 174 129 27 183 122 1 183 122 1 183 122 1 183 122 1 -+183 122 1 183 122 1 183 122 1 174 129 27 225 202 147 248 247 247 -+255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 253 -+237 237 236 208 204 201 191 183 178 191 183 178 191 183 178 208 204 201 -+229 228 227 237 237 236 232 232 232 232 232 232 237 237 236 245 245 244 -+253 253 253 255 255 255 255 255 255 229 228 227 16 15 15 0 0 0 -+0 0 0 0 0 0 29 26 26 28 32 37 1 1 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+12 62 85 14 76 103 14 78 106 14 78 106 14 78 106 14 76 103 -+14 75 102 14 74 101 14 74 101 13 72 98 13 69 94 13 68 93 -+12 64 87 11 60 82 10 54 74 9 49 66 8 42 57 7 36 49 -+1 8 11 2 12 16 3 15 20 4 20 27 5 25 34 6 30 41 -+7 36 49 8 42 57 9 49 66 10 54 74 11 58 79 12 64 87 -+13 67 91 13 69 94 13 72 98 14 74 101 14 76 103 14 78 106 -+14 78 106 14 78 106 15 82 111 14 78 106 11 58 79 0 0 0 -+0 0 0 2 2 2 55 54 51 55 54 51 0 0 0 148 147 146 -+253 253 253 255 255 255 255 255 255 255 255 255 245 245 244 176 158 88 -+183 122 1 183 122 1 183 122 1 183 122 1 194 135 4 194 135 4 -+194 135 4 183 122 1 183 122 1 183 122 1 183 122 1 176 158 88 -+229 228 227 255 255 255 255 255 255 255 255 255 255 255 255 251 251 251 -+232 232 232 208 204 201 201 196 193 191 183 178 191 183 178 201 196 193 -+224 223 222 232 232 232 232 232 232 232 232 232 232 232 232 241 241 241 -+251 251 251 255 255 255 255 255 255 224 223 222 21 20 20 0 0 0 -+0 0 0 0 0 0 47 44 41 47 44 41 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+11 60 82 14 78 106 15 82 111 14 78 106 14 78 106 14 78 106 -+14 75 102 14 75 102 14 74 101 13 72 98 13 71 96 13 68 93 -+12 64 87 11 60 82 11 56 77 9 50 69 8 44 59 7 36 49 -+2 9 12 2 13 18 3 16 22 4 22 30 5 28 38 6 33 45 -+7 39 53 8 45 61 10 53 71 11 56 77 12 62 85 12 66 90 -+13 69 94 13 72 97 14 74 101 14 76 103 14 78 106 15 82 111 -+15 82 111 15 82 111 15 86 117 15 82 111 4 20 27 0 0 0 -+0 0 0 0 0 1 39 37 35 55 54 51 0 0 0 148 147 146 -+255 255 255 255 255 255 255 255 255 255 255 255 176 158 88 183 122 1 -+183 122 1 183 122 1 183 122 1 194 135 4 202 153 21 194 135 4 -+202 153 21 194 135 4 194 135 4 183 122 1 183 122 1 183 122 1 -+199 145 62 232 232 232 255 255 255 255 255 255 254 254 254 245 245 244 -+224 223 222 208 204 201 208 204 201 191 183 178 191 183 178 201 196 193 -+213 210 208 232 232 232 232 232 232 232 232 232 232 232 232 241 241 241 -+248 247 247 254 254 254 255 255 255 224 223 222 29 26 26 0 0 0 -+0 0 0 1 5 6 69 68 60 29 26 26 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+10 54 74 15 82 111 15 82 111 15 82 111 14 78 106 14 78 106 -+14 76 103 14 75 102 14 74 101 14 73 99 13 71 96 13 68 93 -+12 64 87 12 61 82 11 56 77 9 50 69 8 45 61 7 36 49 -+2 10 13 2 13 18 4 19 26 4 24 33 6 30 41 7 36 49 -+8 41 55 9 47 64 10 54 74 11 58 79 12 64 87 12 66 90 -+13 69 94 13 72 98 14 75 102 14 78 106 15 82 111 15 82 111 -+15 86 117 15 86 117 15 86 117 15 86 117 1 7 9 0 0 0 -+0 0 0 0 0 1 21 20 20 69 68 60 2 2 2 148 147 146 -+255 255 255 255 255 255 254 254 254 208 204 201 194 135 4 194 135 4 -+183 122 1 183 122 1 194 135 4 194 135 4 202 153 21 202 153 21 -+202 153 21 202 153 21 194 135 4 183 122 1 183 122 1 183 122 1 -+183 122 1 176 158 88 255 255 255 255 255 255 254 254 254 237 237 236 -+213 210 208 213 210 208 208 204 201 201 196 193 191 183 178 201 196 193 -+208 204 201 229 228 227 232 232 232 232 232 232 232 232 232 241 241 241 -+248 247 247 253 253 253 255 255 255 224 223 222 29 26 26 0 0 0 -+0 0 0 16 15 15 81 83 82 7 7 7 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+11 56 77 15 86 117 15 86 117 15 82 111 15 82 111 14 78 106 -+14 76 103 14 75 102 14 74 101 13 72 98 13 71 96 13 68 93 -+12 64 87 12 61 82 11 56 77 9 50 69 8 45 61 7 36 49 -+1 10 14 3 15 20 4 19 26 5 25 34 6 30 41 7 36 49 -+8 44 59 9 50 69 10 54 74 11 60 82 12 64 87 13 68 93 -+13 72 97 14 75 102 14 78 106 15 82 111 15 82 111 15 86 117 -+16 90 122 16 90 122 16 90 122 16 90 122 2 13 18 0 0 0 -+0 0 0 0 0 0 0 2 3 47 44 41 29 26 26 148 147 146 -+252 254 255 255 255 255 251 251 251 199 145 62 194 135 4 183 122 1 -+183 122 1 194 135 4 194 135 4 202 153 21 202 153 21 202 153 21 -+202 153 21 202 153 21 202 153 21 194 135 4 183 122 1 183 122 1 -+194 135 4 194 135 4 229 228 227 255 255 255 250 249 249 229 228 227 -+208 204 201 213 210 208 213 210 208 201 196 193 191 183 178 201 196 193 -+201 196 193 224 223 222 232 232 232 232 232 232 232 232 232 241 241 241 -+248 247 247 253 253 253 255 255 255 224 223 222 29 26 26 0 0 0 -+0 0 0 55 54 51 55 54 51 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+12 66 90 16 90 122 15 86 117 15 86 117 15 82 111 14 78 106 -+14 78 106 14 75 102 14 74 101 13 72 98 13 71 96 13 68 93 -+12 64 87 12 62 85 11 56 77 9 50 69 8 45 61 7 36 49 -+2 11 15 3 15 20 4 20 27 5 25 34 6 33 45 7 38 51 -+8 45 61 9 50 69 11 58 79 12 61 82 12 66 90 13 69 94 -+14 73 99 14 76 103 15 82 111 15 86 117 15 86 117 16 90 122 -+16 90 122 15 94 128 15 94 128 15 94 128 1 37 56 5 1 0 -+72 47 3 109 74 3 35 25 1 2 11 15 47 44 41 148 147 146 -+255 255 255 255 255 255 224 223 222 194 135 4 194 135 4 183 122 1 -+183 122 1 183 122 1 194 135 4 202 153 21 202 153 21 225 176 47 -+202 153 21 202 153 21 202 153 21 194 135 4 183 122 1 183 122 1 -+194 135 4 183 122 1 225 202 147 254 251 250 245 245 244 213 210 208 -+201 196 193 213 210 208 213 210 208 201 196 193 201 196 193 201 196 193 -+201 196 193 224 223 222 232 232 232 232 232 232 237 237 236 245 245 244 -+248 247 247 253 253 253 255 255 255 213 210 208 12 12 11 0 0 0 -+4 4 4 69 68 60 16 15 15 0 0 0 0 0 0 3 1 3 -+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -+15 82 111 16 90 122 16 90 122 15 86 117 15 82 111 15 82 111 -+14 78 106 14 75 102 14 74 101 14 73 99 13 71 96 13 68 93 -+12 64 87 12 61 82 11 56 77 9 50 69 8 45 61 7 36 49 -+2 11 15 3 15 20 3 21 29 5 27 37 6 33 45 7 39 53 -+8 45 61 10 53 71 11 58 79 12 64 87 13 67 92 13 71 96 -+14 74 101 14 78 106 15 82 111 15 86 117 16 90 122 16 90 122 -+15 94 128 15 94 128 15 94 128 15 94 128 57 82 86 209 152 1 -+255 210 1 255 210 1 241 197 0 109 74 3 1 7 9 113 114 111 -+255 255 255 253 253 253 225 202 147 183 122 1 194 135 4 183 122 1 -+183 122 1 194 135 4 194 135 4 202 153 21 202 153 21 202 153 21 -+202 153 21 202 153 21 194 135 4 194 135 4 183 122 1 183 122 1 -+183 122 1 194 135 4 199 145 62 250 251 253 237 237 236 201 196 193 -+191 183 178 213 210 208 213 210 208 201 196 193 201 196 193 201 196 193 -+208 204 201 224 223 222 232 232 232 232 232 232 237 237 236 248 247 247 -+250 252 255 255 255 255 250 252 255 113 114 111 0 0 0 0 0 0 -+28 32 37 69 68 60 6 5 5 5 1 0 83 13 44 121 31 83 -+121 31 83 29 26 26 0 0 0 0 0 0 0 0 0 4 22 30 -+16 90 122 15 94 128 16 90 122 16 90 122 15 86 117 15 82 111 -+14 78 106 14 76 103 14 74 101 14 73 99 13 71 96 13 68 93 -+12 64 87 11 60 82 11 56 77 9 50 69 8 44 59 7 36 49 -+2 11 15 3 15 20 3 21 29 5 27 37 6 33 45 7 39 53 -+8 45 61 10 53 71 11 58 79 12 64 87 13 69 94 14 73 99 -+14 76 103 15 82 111 15 86 117 16 90 122 16 90 122 15 94 128 -+15 94 128 15 94 128 15 94 128 39 101 116 225 176 47 255 210 1 -+255 206 13 255 206 13 255 210 1 255 210 1 154 101 6 11 13 22 -+171 169 168 255 255 255 176 158 88 194 135 4 194 135 4 194 135 4 -+183 122 1 183 122 1 194 135 4 194 135 4 202 153 21 202 153 21 -+202 153 21 202 153 21 194 135 4 183 122 1 183 122 1 183 122 1 -+194 135 4 194 135 4 199 145 62 237 237 236 229 228 227 191 183 178 -+191 183 178 213 210 208 208 204 201 201 196 193 201 196 193 201 196 193 -+208 204 201 224 223 222 232 232 232 232 232 232 245 245 244 247 240 225 -+225 202 147 245 217 114 245 217 114 154 101 6 35 25 1 28 32 37 -+55 54 51 29 26 26 9 8 8 47 44 41 161 10 114 161 10 114 -+161 10 114 121 31 83 12 12 11 29 26 26 3 1 3 6 57 82 -+15 94 128 15 94 128 15 94 128 16 90 122 15 86 117 15 82 111 -+14 78 106 14 75 102 14 74 101 13 72 98 13 69 94 13 67 91 -+12 64 87 11 60 82 10 54 74 9 49 66 8 42 57 7 36 49 -+2 11 15 3 16 22 3 21 29 5 27 37 6 33 45 7 39 53 -+9 47 64 10 53 71 11 58 79 12 64 87 13 69 94 14 73 99 -+14 78 106 15 82 111 15 86 117 16 90 122 15 94 128 15 94 128 -+15 94 128 15 94 128 15 94 128 176 158 88 241 197 0 255 206 13 -+255 208 38 255 213 45 254 207 32 255 210 1 255 210 1 35 25 1 -+2 9 12 171 169 168 176 158 88 174 129 27 194 135 4 194 135 4 -+183 122 1 183 122 1 183 122 1 194 135 4 194 135 4 194 135 4 -+194 135 4 194 135 4 194 135 4 183 122 1 183 122 1 194 135 4 -+194 135 4 194 135 4 174 129 27 224 226 233 224 223 222 191 183 178 -+191 183 178 208 204 201 208 204 201 208 204 201 201 196 193 201 196 193 -+208 204 201 224 223 222 232 232 232 237 237 236 242 244 252 245 217 114 -+255 206 13 255 213 23 255 213 23 255 234 21 154 101 6 20 41 44 -+4 0 5 0 2 3 7 7 7 81 83 82 105 98 84 121 31 83 -+121 31 83 55 54 51 55 54 51 39 37 35 22 11 1 61 109 99 -+15 94 128 15 94 128 15 94 128 16 90 122 15 86 117 15 82 111 -+14 78 106 14 76 103 14 74 101 13 72 98 13 69 94 12 66 90 -+12 62 85 11 58 79 10 53 71 9 47 64 8 41 55 6 33 45 -+2 11 15 3 16 22 3 21 29 5 28 38 6 33 45 6 40 54 -+9 47 64 10 54 74 11 60 82 12 66 90 13 72 97 14 76 103 -+15 82 111 15 86 117 16 90 122 15 94 128 15 94 128 15 94 128 -+15 94 128 15 94 128 61 109 99 255 205 1 255 206 13 255 213 45 -+255 209 49 255 209 52 255 209 52 254 207 32 255 210 1 234 181 0 -+22 11 1 1 8 11 105 82 42 174 129 27 194 135 4 194 135 4 -+194 135 4 183 122 1 183 122 1 183 122 1 194 135 4 194 135 4 -+194 135 4 183 122 1 183 122 1 183 122 1 183 122 1 194 135 4 -+194 135 4 183 122 1 167 119 72 218 217 217 213 210 208 191 183 178 -+191 183 178 208 204 201 201 196 193 208 204 201 208 204 201 201 196 193 -+208 204 201 224 223 222 232 232 232 237 237 236 241 241 241 235 193 64 -+254 207 32 255 215 52 248 200 52 235 193 64 109 74 3 1 7 9 -+0 0 0 0 0 0 0 0 0 9 8 8 29 26 26 17 25 27 -+16 15 15 9 8 8 0 2 3 4 0 5 83 13 44 178 87 56 -+61 109 99 15 94 128 15 94 128 16 90 122 15 86 117 15 82 111 -+14 78 106 14 76 103 14 73 99 13 72 97 13 68 93 12 64 87 -+11 60 82 11 56 77 9 50 69 8 45 61 7 39 53 6 33 45 -+2 12 16 3 16 22 4 23 31 5 29 40 7 36 49 8 42 57 -+9 49 66 11 56 77 12 62 85 13 69 94 14 74 101 14 78 106 -+15 82 111 15 86 117 16 90 122 15 94 128 15 94 128 15 94 128 -+15 94 128 39 101 116 234 181 0 255 210 1 254 207 32 255 209 52 -+255 209 51 255 209 51 255 209 52 255 209 49 255 206 13 255 210 1 -+194 135 4 0 0 0 0 0 0 35 25 1 154 101 6 194 135 4 -+194 135 4 194 135 4 183 122 1 183 122 1 183 122 1 183 122 1 -+183 122 1 183 122 1 183 122 1 194 135 4 183 122 1 183 122 1 -+183 122 1 174 129 27 176 158 88 218 217 217 208 204 201 191 183 178 -+191 183 178 201 196 193 201 196 193 208 204 201 213 210 208 201 196 193 -+208 204 201 224 223 222 232 232 232 241 241 241 237 237 236 225 176 47 -+255 213 23 225 176 47 172 59 77 161 10 114 83 13 44 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 22 11 1 121 31 83 161 10 114 172 59 77 -+176 158 88 15 94 128 15 94 128 16 90 122 15 86 117 15 82 111 -+14 78 106 14 76 103 14 73 100 13 71 96 13 67 92 12 64 87 -+11 58 79 10 54 74 9 49 66 8 42 57 7 36 49 5 29 40 -+2 13 18 4 19 26 5 25 34 6 33 45 7 39 53 8 45 61 -+10 53 71 11 60 82 12 66 90 13 72 98 14 78 106 15 82 111 -+15 86 117 16 90 122 16 90 122 15 94 128 15 94 128 15 94 128 -+39 101 116 174 129 27 255 205 1 255 205 1 255 208 38 255 209 52 -+255 209 51 255 209 51 255 209 51 255 209 52 255 208 38 255 210 1 -+255 210 1 109 74 3 0 0 0 7 5 1 16 15 15 154 101 6 -+183 122 1 183 122 1 183 122 1 183 122 1 183 122 1 183 122 1 -+183 122 1 183 122 1 183 122 1 183 122 1 183 122 1 194 135 4 -+174 129 27 174 129 27 176 158 88 218 217 217 201 196 193 191 183 178 -+191 183 178 191 183 178 191 183 178 208 204 201 213 210 208 208 204 201 -+208 204 201 224 223 222 232 232 232 245 245 244 232 232 232 202 153 21 -+255 205 1 178 87 56 150 20 84 161 10 114 83 13 44 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 72 47 3 183 122 1 154 101 6 172 59 77 199 145 62 -+176 158 88 15 94 128 15 94 128 15 94 128 16 90 122 15 86 117 -+15 82 111 14 78 106 14 73 99 13 69 94 12 66 90 12 62 85 -+11 56 77 10 53 71 8 45 61 6 40 54 6 33 45 5 27 37 -+3 15 20 3 21 29 5 28 38 7 36 49 8 44 59 9 49 66 -+8 56 78 12 62 85 13 69 94 13 74 101 14 78 106 15 82 111 -+15 86 117 16 90 122 15 94 128 16 90 122 39 101 116 81 83 82 -+174 129 27 243 191 0 255 205 1 255 206 22 255 209 45 255 209 52 -+255 209 51 255 209 51 255 209 51 255 209 52 255 209 51 255 206 22 -+255 210 1 241 197 0 72 47 3 0 1 1 1 1 1 2 2 2 -+109 74 3 194 135 4 194 135 4 183 122 1 183 122 1 183 122 1 -+183 122 1 183 122 1 183 122 1 194 135 4 194 135 4 174 129 27 -+174 129 27 174 129 27 191 183 178 213 210 208 201 196 193 191 183 178 -+191 183 178 191 183 178 191 183 178 213 210 208 213 210 208 208 204 201 -+213 210 208 218 217 217 232 232 232 224 226 233 191 183 178 202 153 21 -+255 205 1 172 59 77 161 10 114 172 59 77 154 101 6 72 47 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+72 47 3 183 122 1 194 135 4 222 168 1 209 152 1 178 87 56 -+167 119 72 15 94 128 15 94 128 15 94 128 16 90 122 15 86 117 -+15 82 111 14 78 106 14 74 101 13 69 94 12 64 87 11 60 82 -+10 54 74 9 50 69 8 44 59 7 36 49 6 30 41 4 24 33 -+3 16 22 4 23 31 6 30 41 7 39 53 9 47 64 10 53 71 -+8 56 78 9 63 87 13 71 96 12 75 102 15 82 111 15 82 111 -+15 86 117 61 109 99 105 98 84 194 135 4 194 135 4 209 152 1 -+234 181 0 255 205 1 255 205 1 255 206 22 255 209 52 255 209 52 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 52 255 208 38 -+255 205 1 255 210 1 222 168 1 7 5 1 0 0 0 0 0 0 -+0 0 0 72 47 3 183 122 1 209 152 1 194 135 4 194 135 4 -+194 135 4 194 135 4 194 135 4 174 129 27 174 129 27 174 129 27 -+194 135 4 176 158 88 201 196 193 208 204 201 201 196 193 201 196 193 -+191 183 178 171 169 168 191 183 178 213 210 208 213 210 208 208 204 201 -+213 210 208 224 223 222 224 223 222 201 196 193 148 147 146 194 135 4 -+255 205 1 178 87 56 178 87 56 183 122 1 183 122 1 154 101 6 -+72 47 3 22 11 1 7 5 1 7 5 1 22 11 1 109 74 3 -+194 135 4 209 152 1 222 168 1 255 205 1 178 87 56 161 10 114 -+81 83 82 15 94 128 15 94 128 15 94 128 16 90 122 16 90 122 -+15 86 117 14 78 106 14 75 102 13 69 94 12 64 87 11 58 79 -+10 53 71 9 47 64 8 41 55 6 33 45 5 28 38 4 22 30 -+3 16 22 4 24 33 6 33 45 6 40 54 7 48 67 10 53 71 -+11 58 79 10 65 89 11 69 94 12 75 102 9 72 100 61 109 99 -+202 153 21 249 197 0 255 210 1 255 205 1 255 205 1 255 205 1 -+255 205 1 255 205 1 255 206 13 255 208 38 255 209 52 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 52 255 209 49 -+255 206 22 255 210 1 255 210 1 109 74 3 0 0 0 0 0 0 -+0 0 0 3 3 3 21 20 20 154 101 6 194 135 4 174 129 27 -+174 129 27 174 129 27 174 129 27 174 129 27 194 135 4 194 135 4 -+174 129 27 171 169 168 201 196 193 201 196 193 201 196 193 201 196 193 -+191 183 178 191 183 178 191 183 178 208 204 201 213 210 208 213 210 208 -+218 217 217 218 217 217 218 217 217 191 183 178 148 147 146 154 101 6 -+178 87 56 154 101 6 241 197 0 234 181 0 209 152 1 194 135 4 -+183 122 1 154 101 6 154 101 6 154 101 6 154 101 6 194 135 4 -+222 168 1 243 191 0 255 206 13 255 206 22 172 59 77 161 10 114 -+150 20 84 15 94 128 15 94 128 15 94 128 15 94 128 16 90 122 -+15 86 117 15 82 111 14 76 103 13 69 94 12 64 87 11 56 77 -+9 50 69 8 44 59 7 38 51 6 30 41 5 25 34 4 19 26 -+3 16 22 4 24 33 6 33 45 6 40 54 7 48 67 10 53 71 -+8 56 78 9 63 87 11 69 94 9 72 100 35 87 96 222 168 1 -+255 210 1 255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 -+255 205 1 255 206 13 254 207 32 255 209 51 255 209 52 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 52 -+255 208 38 255 206 13 255 210 1 249 197 0 35 25 1 0 0 0 -+0 0 0 0 0 0 1 1 1 7 5 1 105 82 42 194 135 4 -+194 135 4 194 135 4 194 135 4 194 135 4 183 122 1 167 119 72 -+171 169 168 191 183 178 201 196 193 201 196 193 201 196 193 201 196 193 -+191 183 178 171 169 168 191 183 178 201 196 193 213 210 208 218 217 217 -+218 217 217 224 223 222 224 223 222 191 183 178 148 147 146 150 20 84 -+161 10 114 178 87 56 255 210 1 255 205 1 234 181 0 222 168 1 -+209 152 1 194 135 4 194 135 4 209 152 1 209 152 1 234 181 0 -+249 197 0 255 208 38 253 211 50 255 214 50 172 59 77 161 10 114 -+172 59 77 176 158 88 15 94 128 15 94 128 15 94 128 16 90 122 -+15 86 117 15 82 111 14 78 106 13 72 97 12 64 87 11 56 77 -+9 49 66 8 42 57 7 36 49 5 28 38 4 22 30 3 16 22 -+3 18 24 4 24 33 6 33 45 6 40 54 7 48 67 9 50 69 -+8 56 78 8 60 84 12 66 90 6 67 96 57 82 86 234 181 0 -+255 205 1 255 206 22 255 208 38 255 208 38 255 208 38 255 208 38 -+255 208 38 255 209 45 255 209 51 255 209 52 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 52 -+255 209 51 255 206 22 255 205 1 255 210 1 194 135 4 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 154 101 6 -+194 135 4 194 135 4 183 122 1 174 129 27 148 147 146 171 169 168 -+171 169 168 191 183 178 201 196 193 201 196 193 201 196 193 201 196 193 -+191 183 178 191 183 178 191 183 178 201 196 193 208 204 201 218 217 217 -+224 223 222 224 223 222 224 223 222 201 196 193 148 147 146 161 10 114 -+161 10 114 178 87 56 255 205 1 255 205 1 255 205 1 243 191 0 -+234 181 0 234 181 0 234 181 0 234 181 0 243 191 0 255 205 1 -+254 207 32 255 209 55 255 209 52 255 214 50 225 176 47 139 105 59 -+225 176 47 255 213 23 199 145 62 15 94 128 16 90 122 16 90 122 -+15 86 117 15 86 117 14 78 106 13 72 98 10 65 89 11 56 77 -+9 47 64 8 41 55 6 33 45 5 25 34 4 19 26 3 15 20 -+3 16 22 4 24 33 6 33 45 6 40 54 5 44 60 7 48 67 -+10 54 74 11 58 79 9 63 87 8 66 93 35 87 96 222 168 1 -+255 210 1 255 208 38 255 209 55 255 209 52 255 209 52 255 209 52 -+255 209 52 255 209 52 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 52 255 209 45 255 206 22 255 210 1 255 210 1 109 74 3 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 105 82 42 -+176 158 88 167 119 72 148 147 146 148 147 146 171 169 168 171 169 168 -+191 183 178 201 196 193 201 196 193 201 196 193 201 196 193 191 183 178 -+191 183 178 191 183 178 191 183 178 191 183 178 208 204 201 224 223 222 -+224 223 222 229 228 227 224 226 233 201 196 193 148 147 146 150 20 84 -+150 20 84 202 153 21 255 210 1 255 205 1 255 205 1 255 205 1 -+255 205 1 249 197 0 255 205 1 255 205 1 255 205 1 255 205 1 -+255 209 45 255 209 52 255 209 51 255 218 49 225 176 47 150 20 84 -+199 145 62 255 218 49 255 213 23 176 158 88 16 90 122 16 90 122 -+15 86 117 15 86 117 14 78 106 13 73 99 10 65 89 11 56 77 -+9 47 64 6 40 54 6 30 41 4 24 33 3 18 24 2 12 16 -+3 15 20 4 23 31 5 29 40 7 38 51 5 44 60 7 48 67 -+9 50 69 8 56 78 8 60 84 9 63 87 13 71 96 202 153 21 -+255 210 1 255 206 22 255 209 52 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 52 255 208 38 255 210 1 255 210 1 209 152 1 -+5 1 0 0 0 0 0 0 0 0 0 0 3 1 3 81 83 82 -+201 196 193 191 183 178 191 183 178 171 169 168 171 169 168 191 183 178 -+191 183 178 201 196 193 208 204 201 208 204 201 191 183 178 191 183 178 -+191 183 178 191 183 178 191 183 178 191 183 178 208 204 201 224 223 222 -+229 228 227 229 228 227 232 232 232 208 204 201 148 147 146 109 74 3 -+183 122 1 243 191 0 255 205 1 255 205 1 255 205 1 255 205 1 -+255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 -+255 209 51 255 209 52 255 209 51 252 207 50 172 59 77 161 10 114 -+172 59 77 253 211 50 255 218 49 255 213 23 176 158 88 16 90 122 -+15 86 117 15 82 111 14 78 106 13 73 99 10 65 89 8 56 78 -+7 48 67 6 40 54 6 30 41 4 22 30 3 16 22 2 11 15 -+3 15 20 3 21 29 5 29 40 7 36 49 5 44 60 9 47 64 -+7 48 67 6 54 76 11 58 79 9 63 87 13 67 91 174 129 27 -+255 205 1 255 206 13 255 209 45 255 209 52 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 52 255 209 52 254 207 32 255 210 1 255 210 1 -+109 74 3 0 0 0 0 0 0 0 0 0 0 0 0 113 114 111 -+208 204 201 201 196 193 191 183 178 191 183 178 201 196 193 201 196 193 -+201 196 193 213 210 208 213 210 208 208 204 201 191 183 178 191 183 178 -+191 183 178 201 196 193 191 183 178 191 183 178 208 204 201 224 223 222 -+232 232 232 229 228 227 237 237 236 171 169 168 121 31 83 150 20 84 -+174 129 27 255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 -+255 206 13 255 206 13 255 205 1 255 206 13 255 206 13 255 208 38 -+255 209 52 255 209 51 255 211 51 248 200 52 150 20 84 161 10 114 -+172 59 77 252 207 50 253 211 50 253 211 50 255 213 23 176 158 88 -+39 101 116 14 78 106 14 78 106 11 72 98 10 65 89 8 56 78 -+7 48 67 6 40 54 6 30 41 3 21 29 3 15 20 1 10 13 -+2 13 18 3 20 27 3 27 37 6 33 45 6 40 54 5 44 60 -+7 48 67 10 53 71 8 56 78 8 60 84 9 63 87 139 105 59 -+255 210 1 255 205 1 255 208 38 255 209 52 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 52 255 209 49 255 206 13 255 210 1 -+241 197 0 35 25 1 0 0 1 7 7 7 55 54 51 171 169 168 -+213 210 208 201 196 193 201 196 193 201 196 193 201 196 193 208 204 201 -+213 210 208 218 217 217 218 217 217 208 204 201 191 183 178 191 183 178 -+201 196 193 201 196 193 191 183 178 191 183 178 208 204 201 229 228 227 -+232 232 232 237 237 236 213 210 208 81 83 82 150 20 84 161 10 114 -+172 59 77 249 197 0 255 205 1 255 205 1 255 206 22 255 209 45 -+255 209 45 255 209 45 255 208 38 255 208 38 255 208 38 255 209 51 -+255 209 52 255 209 51 255 211 51 252 207 50 172 59 77 161 10 114 -+199 145 62 252 207 50 255 209 51 255 209 51 253 211 50 255 222 40 -+254 207 32 113 114 111 9 72 100 11 69 94 9 63 87 8 56 78 -+9 47 64 7 39 53 5 29 40 3 20 27 2 13 18 1 8 11 -+2 13 18 3 20 27 3 27 37 6 33 45 6 40 54 8 42 57 -+9 47 64 7 48 67 10 54 74 8 56 78 8 60 84 139 105 59 -+255 210 1 255 205 1 254 207 32 255 209 52 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 52 255 208 38 255 205 1 -+255 210 1 209 152 1 113 114 111 201 196 193 224 223 222 224 226 233 -+218 217 217 218 217 217 213 210 208 213 210 208 218 217 217 218 217 217 -+218 217 217 224 226 233 229 228 227 208 204 201 191 183 178 191 183 178 -+208 204 201 208 204 201 191 183 178 191 183 178 208 204 201 229 228 227 -+245 245 244 237 237 236 81 83 82 22 11 1 150 20 84 161 10 114 -+178 87 56 243 191 0 255 205 1 255 206 22 255 209 49 255 209 52 -+255 209 52 255 209 52 255 209 52 255 209 52 255 209 52 255 209 51 -+255 209 51 255 209 51 255 209 51 255 218 49 202 153 21 167 119 72 -+255 209 45 255 211 51 255 209 51 255 209 51 255 209 51 255 209 49 -+255 213 45 255 213 23 35 87 96 8 66 93 11 60 82 10 53 71 -+5 44 60 7 38 51 5 27 37 3 18 24 2 12 16 1 7 9 -+2 13 18 3 20 27 3 27 37 6 33 45 7 38 51 1 37 56 -+5 44 60 7 48 67 7 48 67 6 54 76 8 60 84 139 105 59 -+255 205 1 255 206 13 255 208 38 255 209 52 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 52 255 209 49 255 206 13 -+255 205 1 255 210 1 225 176 47 224 226 233 250 251 253 232 232 232 -+229 228 227 224 226 233 224 223 222 224 226 233 224 223 222 224 226 233 -+232 232 232 241 241 241 232 232 232 201 196 193 191 183 178 191 183 178 -+208 204 201 208 204 201 191 183 178 171 169 168 213 210 208 241 241 241 -+232 232 232 81 83 82 0 0 0 1 1 1 83 13 44 150 20 84 -+194 135 4 255 205 1 255 206 13 255 208 38 255 209 52 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 218 49 199 145 62 172 59 77 199 145 62 -+255 218 49 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+253 211 50 255 208 38 35 87 96 8 60 84 8 56 78 7 48 67 -+6 40 54 6 33 45 4 23 31 3 16 22 1 10 13 1 4 5 -+2 13 18 3 21 29 3 27 37 6 33 45 7 38 51 6 40 54 -+5 44 60 5 44 60 7 48 67 10 53 71 6 54 76 174 129 27 -+255 210 1 255 206 13 255 209 45 255 209 52 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 52 255 209 49 255 206 22 -+255 205 1 255 205 1 234 181 0 176 158 88 250 252 255 248 247 247 -+241 241 241 237 237 236 237 237 236 232 232 232 237 237 236 241 241 241 -+245 245 244 248 247 247 232 232 232 201 196 193 191 183 178 201 196 193 -+213 210 208 213 210 208 171 169 168 191 183 178 224 223 222 213 210 208 -+81 83 82 0 0 0 0 0 0 0 0 0 109 74 3 109 74 3 -+209 152 1 255 205 1 255 206 13 255 209 45 255 209 52 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 215 52 225 176 47 150 20 84 161 10 114 172 59 77 -+251 208 45 255 211 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 222 40 199 145 62 10 65 89 8 56 78 10 53 71 5 44 60 -+7 36 49 5 29 40 3 20 27 2 13 18 1 8 11 1 4 5 -+3 15 20 3 21 29 3 27 37 6 33 45 1 37 56 6 40 54 -+5 44 60 8 45 61 7 48 67 7 48 67 10 53 71 202 153 21 -+255 210 1 255 206 22 255 209 51 255 209 52 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 52 255 209 49 254 207 32 -+255 205 1 255 205 1 255 210 1 194 135 4 171 169 168 252 254 255 -+253 253 253 250 249 249 248 247 247 248 247 247 250 249 249 253 253 253 -+254 254 254 250 249 249 224 223 222 191 183 178 191 183 178 201 196 193 -+218 217 217 218 217 217 191 183 178 171 169 168 105 98 84 17 25 27 -+0 0 0 0 0 0 0 0 0 7 5 1 109 74 3 150 20 84 -+172 59 77 222 168 1 255 213 23 255 209 45 255 209 52 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 218 49 178 87 56 161 10 114 161 10 114 178 87 56 -+255 215 52 255 209 52 255 209 51 255 209 52 255 213 45 255 208 38 -+176 158 88 23 75 89 6 57 82 10 53 71 8 45 61 7 38 51 -+5 29 40 4 23 31 3 16 22 1 10 14 1 7 9 0 3 4 -+3 16 22 4 23 31 3 27 37 6 33 45 1 37 56 6 40 54 -+8 42 57 5 44 60 5 44 60 5 44 60 45 73 77 255 210 1 -+255 210 1 255 206 22 255 209 49 255 209 52 255 209 52 255 209 52 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 254 207 32 -+255 205 1 255 205 1 255 205 1 243 191 0 154 101 6 191 183 178 -+252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 -+255 255 255 248 247 247 218 217 217 191 183 178 201 196 193 208 204 201 -+208 204 201 171 169 168 105 98 84 47 44 41 9 8 8 0 0 0 -+0 0 0 0 0 0 0 0 0 35 25 1 154 101 6 161 10 114 -+161 10 114 178 87 56 255 206 22 255 209 49 255 209 52 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 218 49 255 218 49 178 87 56 161 10 114 172 59 77 235 193 64 -+255 215 52 255 209 55 255 214 50 254 207 32 225 176 47 61 109 99 -+6 54 76 6 54 76 10 53 71 5 44 60 7 38 51 5 29 40 -+4 23 31 3 18 24 2 12 16 1 7 9 1 4 5 0 2 3 -+3 16 22 4 24 33 5 29 40 6 33 45 7 36 49 6 40 54 -+6 40 54 5 44 60 5 44 60 6 40 54 139 105 59 255 210 1 -+255 205 1 255 205 1 255 206 13 254 207 32 255 209 45 255 209 45 -+255 209 51 255 209 52 255 209 52 255 209 52 255 209 52 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 254 207 32 -+255 205 1 255 205 1 255 205 1 241 197 0 194 135 4 72 47 3 -+105 98 84 171 169 168 218 217 217 237 237 236 245 245 244 245 245 244 -+232 232 232 208 204 201 171 169 168 148 147 146 113 114 111 105 98 84 -+55 54 51 21 20 20 29 26 26 39 37 35 21 20 20 4 4 4 -+0 0 0 0 0 0 5 1 0 35 25 1 154 101 6 150 20 84 -+161 10 114 172 59 77 255 213 23 255 213 45 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 49 -+235 193 64 178 87 56 105 82 42 225 176 47 252 207 50 255 214 50 -+255 213 45 255 206 22 225 176 47 105 98 84 13 67 91 6 57 82 -+6 54 76 9 50 69 5 44 60 7 36 49 3 27 37 3 21 29 -+3 16 22 2 12 16 1 8 11 1 5 6 0 2 3 0 1 1 -+3 16 22 4 24 33 3 27 37 6 33 45 1 37 56 6 40 54 -+1 37 56 6 40 54 1 37 56 5 44 60 174 129 27 255 210 1 -+255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 255 206 22 -+255 206 22 254 207 32 255 208 38 255 209 45 255 209 45 255 209 51 -+255 209 52 255 209 52 255 209 51 255 209 51 255 209 51 255 209 51 -+255 209 51 255 209 51 255 209 51 255 209 51 255 209 52 255 208 38 -+255 205 1 255 205 1 255 205 1 243 191 0 209 152 1 109 74 3 -+4 0 5 0 0 1 12 12 11 39 37 35 47 44 41 47 44 41 -+47 44 41 55 54 51 69 68 60 69 68 60 47 44 41 39 37 35 -+21 20 20 22 11 1 39 37 35 47 44 41 21 20 20 6 5 5 -+0 0 0 0 0 0 1 1 1 72 47 3 183 122 1 194 135 4 -+172 59 77 202 153 21 225 176 47 225 176 47 253 211 50 255 211 51 -+255 209 51 255 211 51 255 211 51 255 211 51 255 211 51 225 176 47 -+150 20 84 161 10 114 161 10 114 225 176 47 255 222 40 255 206 22 -+222 168 1 105 82 42 23 75 89 8 60 84 8 60 84 10 53 71 -+7 48 67 8 42 57 7 36 49 3 27 37 3 21 29 3 15 20 -+2 11 15 1 8 11 1 5 6 0 3 4 0 1 1 0 1 1 -+3 16 22 3 21 29 3 27 37 6 33 45 6 33 45 6 33 45 -+7 36 49 7 36 49 7 36 49 6 33 45 139 105 59 255 210 1 -+255 210 1 255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 -+255 205 1 255 205 1 255 205 1 255 206 13 255 206 13 255 206 22 -+255 208 38 255 209 45 255 209 51 255 209 52 255 209 52 255 209 52 -+255 209 51 255 209 51 255 209 52 255 209 52 255 209 52 255 208 38 -+255 205 1 255 205 1 255 205 1 234 181 0 209 152 1 154 101 6 -+7 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -+16 15 15 47 44 41 69 68 60 55 54 51 47 44 41 39 37 35 -+21 20 20 16 15 15 29 26 26 39 37 35 29 26 26 7 7 7 -+0 0 0 0 0 0 0 0 0 72 47 3 183 122 1 209 152 1 -+222 168 1 154 101 6 161 10 114 150 20 84 178 87 56 255 215 52 -+255 214 50 255 209 49 248 200 52 252 207 50 255 222 40 172 59 77 -+161 10 114 161 10 114 172 59 77 249 198 10 249 197 0 174 129 27 -+45 73 77 6 67 96 10 65 89 8 56 78 10 53 71 5 44 60 -+6 40 54 6 33 45 5 28 38 3 21 29 3 16 22 2 11 15 -+1 8 11 1 5 6 0 3 4 0 2 3 0 1 1 0 0 1 -+2 13 18 3 20 27 4 24 33 3 27 37 5 29 40 6 33 45 -+6 33 45 6 33 45 6 33 45 6 33 45 15 45 54 174 129 27 -+241 197 0 249 197 0 249 197 0 243 191 0 249 197 0 249 197 0 -+249 197 0 249 197 0 255 205 1 255 205 1 255 205 1 255 205 1 -+255 205 1 255 206 13 255 206 22 254 207 32 255 209 45 255 209 49 -+255 209 51 255 209 51 255 209 51 255 209 49 255 208 38 255 206 13 -+255 205 1 255 205 1 255 205 1 234 181 0 209 152 1 154 101 6 -+22 11 1 0 0 0 0 0 0 0 0 0 0 0 0 12 12 11 -+39 37 35 69 68 60 55 54 51 69 68 60 47 44 41 29 26 26 -+16 15 15 12 12 11 21 20 20 39 37 35 29 26 26 9 8 8 -+1 1 1 0 0 0 1 1 1 109 74 3 183 122 1 209 152 1 -+243 191 0 202 153 21 161 10 114 161 10 114 150 20 84 199 145 62 -+252 207 50 172 59 77 150 20 84 172 59 77 199 145 62 178 87 56 -+172 59 77 178 87 56 222 168 1 209 152 1 105 82 42 23 75 89 -+4 60 87 11 60 82 6 54 76 9 50 69 8 45 61 7 39 53 -+6 30 41 5 27 37 3 21 29 3 15 20 2 11 15 1 8 11 -+1 5 6 1 4 5 0 2 3 0 2 3 0 1 1 0 0 0 -+1 10 14 3 15 20 3 18 24 3 21 29 4 24 33 4 24 33 -+3 27 37 3 27 37 3 27 37 3 27 37 3 27 37 6 33 45 -+69 68 60 154 101 6 194 135 4 194 135 4 209 152 1 209 152 1 -+209 152 1 222 168 1 222 168 1 234 181 0 234 181 0 243 191 0 -+249 197 0 255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 -+255 206 22 255 206 22 255 206 22 255 206 13 255 205 1 255 205 1 -+255 205 1 249 197 0 234 181 0 222 168 1 209 152 1 154 101 6 -+22 11 1 0 0 0 0 0 0 0 0 0 5 1 0 29 26 26 -+55 54 51 69 68 60 55 54 51 47 44 41 39 37 35 29 26 26 -+22 11 1 11 5 1 22 11 1 29 26 26 29 26 26 12 12 11 -+1 1 1 0 0 0 5 1 0 72 47 3 183 122 1 194 135 4 -+222 168 1 243 191 0 178 87 56 161 10 114 161 10 114 178 87 56 -+178 87 56 161 10 114 161 10 114 161 10 114 172 59 77 222 168 1 -+209 152 1 209 152 1 154 101 6 45 73 77 4 60 87 8 60 84 -+11 58 79 10 53 71 9 49 66 8 42 57 7 36 49 5 29 40 -+4 24 33 3 20 27 3 15 20 2 11 15 1 8 11 1 5 6 -+0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 -+1 7 9 1 9 14 2 12 16 3 15 20 3 16 22 3 16 22 -+3 18 24 3 20 27 3 21 29 3 20 27 4 23 31 4 23 31 -+3 20 27 5 28 38 20 41 44 47 44 41 105 82 42 154 101 6 -+154 101 6 183 122 1 194 135 4 194 135 4 194 135 4 209 152 1 -+222 168 1 234 181 0 234 181 0 249 197 0 255 205 1 255 205 1 -+255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 -+249 197 0 234 181 0 222 168 1 209 152 1 183 122 1 154 101 6 -+11 5 1 0 0 0 0 0 0 0 0 0 7 5 1 39 37 35 -+69 68 60 105 82 42 55 54 51 55 54 51 39 37 35 29 26 26 -+17 25 27 10 20 26 17 25 27 28 32 37 29 26 26 16 15 15 -+3 3 3 0 0 0 5 1 0 72 47 3 183 122 1 194 135 4 -+209 152 1 222 168 1 243 191 0 222 168 1 209 152 1 209 152 1 -+194 135 4 178 87 56 172 59 77 178 87 56 209 152 1 209 152 1 -+183 122 1 105 82 42 12 64 87 8 60 84 11 58 79 10 54 74 -+9 49 66 8 45 61 7 39 53 7 36 49 5 28 38 4 23 31 -+3 18 24 3 15 20 1 10 14 1 8 11 1 5 6 0 3 4 -+0 2 3 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 -+1 4 5 1 7 9 1 7 9 1 8 11 1 10 13 1 10 14 -+2 12 16 2 13 18 2 13 18 3 15 20 3 15 20 3 16 22 -+3 20 27 3 20 27 3 21 29 4 23 31 4 24 33 5 29 40 -+20 41 44 47 44 41 69 68 60 109 74 3 154 101 6 183 122 1 -+183 122 1 194 135 4 209 152 1 209 152 1 222 168 1 234 181 0 -+243 191 0 249 197 0 249 197 0 249 197 0 243 191 0 243 191 0 -+222 168 1 209 152 1 209 152 1 183 122 1 183 122 1 109 74 3 -+1 7 9 6 33 45 9 47 64 9 50 69 15 53 69 45 73 77 -+81 83 82 81 83 82 81 83 82 57 82 86 45 73 77 32 65 75 -+23 57 72 15 53 69 15 53 69 23 57 72 32 65 75 24 54 62 -+8 45 61 7 38 51 3 27 37 72 47 3 154 101 6 183 122 1 -+194 135 4 209 152 1 222 168 1 234 181 0 234 181 0 234 181 0 -+234 181 0 234 181 0 209 152 1 209 152 1 194 135 4 154 101 6 -+69 68 60 4 60 87 6 57 82 11 56 77 10 53 71 9 47 64 -+8 42 57 7 38 51 6 33 45 5 27 37 4 22 30 3 18 24 -+2 13 18 1 10 14 1 8 11 1 7 9 1 4 5 0 2 3 -+0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 -+0 1 1 0 3 4 1 4 5 1 5 6 1 5 6 1 7 9 -+1 7 9 1 7 9 1 9 12 1 9 14 1 10 14 2 12 16 -+2 13 18 3 15 20 3 18 24 3 20 27 3 21 29 3 27 37 -+3 27 37 5 29 40 6 33 45 1 37 56 8 42 57 55 54 51 -+105 82 42 154 101 6 183 122 1 194 135 4 194 135 4 209 152 1 -+222 168 1 222 168 1 222 168 1 222 168 1 222 168 1 222 168 1 -+209 152 1 194 135 4 183 122 1 183 122 1 109 74 3 20 41 44 -+8 56 78 11 60 82 11 60 82 11 60 82 16 62 81 57 82 86 -+81 83 82 61 109 99 81 83 82 57 82 86 32 65 75 32 65 75 -+23 57 72 15 53 69 10 53 71 23 57 72 32 65 75 23 57 72 -+10 53 71 10 54 74 6 54 76 24 54 62 154 101 6 183 122 1 -+194 135 4 194 135 4 209 152 1 209 152 1 209 152 1 209 152 1 -+209 152 1 209 152 1 194 135 4 183 122 1 183 122 1 69 68 60 -+4 60 87 11 58 79 10 54 74 10 53 71 9 47 64 8 42 57 -+7 38 51 6 33 45 5 28 38 4 23 31 3 18 24 2 13 18 -+2 11 15 1 8 11 1 7 9 1 4 5 0 2 3 0 2 3 -+0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 1 1 0 2 3 0 2 3 0 2 3 1 4 5 -+0 3 4 1 4 5 1 4 5 1 5 6 1 7 9 1 7 9 -+2 9 12 1 10 14 2 12 16 3 15 20 3 16 22 3 20 27 -+4 23 31 3 27 37 6 30 41 6 33 45 7 36 49 7 38 51 -+6 40 54 15 45 54 55 54 51 105 82 42 154 101 6 183 122 1 -+194 135 4 194 135 4 194 135 4 209 152 1 209 152 1 209 152 1 -+194 135 4 183 122 1 183 122 1 105 82 42 16 62 81 11 58 79 -+11 58 79 12 61 82 11 58 79 8 56 78 11 56 77 23 75 89 -+57 82 86 81 83 82 57 82 86 45 73 77 32 65 75 23 57 72 -+15 53 69 7 48 67 7 48 67 10 53 71 23 57 72 15 53 69 -+9 50 69 10 53 71 10 54 74 9 50 69 69 68 60 154 101 6 -+183 122 1 183 122 1 194 135 4 194 135 4 194 135 4 194 135 4 -+194 135 4 194 135 4 183 122 1 154 101 6 69 68 60 6 57 82 -+8 56 78 10 54 74 10 53 71 9 47 64 8 44 59 7 38 51 -+6 33 45 5 27 37 4 23 31 4 19 26 3 15 20 2 11 15 -+1 8 11 1 7 9 1 5 6 0 3 4 0 2 3 0 1 1 -+0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 -+0 1 1 0 2 3 0 2 3 0 2 3 0 3 4 1 4 5 -+1 5 6 1 7 9 1 8 11 2 9 12 2 12 16 2 13 18 -+3 16 22 3 21 29 4 24 33 5 28 38 6 33 45 7 36 49 -+6 40 54 5 44 60 5 44 60 5 44 60 15 53 69 55 54 51 -+105 82 42 154 101 6 183 122 1 183 122 1 183 122 1 183 122 1 -+183 122 1 154 101 6 105 82 42 11 56 77 8 56 78 45 73 77 -+139 105 59 139 105 59 139 105 59 139 105 59 105 98 84 105 98 84 -+105 98 84 113 114 111 105 98 84 105 98 84 105 98 84 105 98 84 -+105 98 84 81 83 82 81 83 82 105 98 84 105 98 84 105 98 84 -+105 98 84 139 105 59 139 105 59 139 105 59 105 82 42 105 82 42 -+154 101 6 154 101 6 183 122 1 183 122 1 183 122 1 183 122 1 -+183 122 1 154 101 6 105 82 42 32 65 75 6 57 82 8 56 78 -+10 54 74 9 50 69 9 47 64 8 42 57 7 38 51 6 33 45 -+5 27 37 4 23 31 4 19 26 3 15 20 2 11 15 2 9 12 -+1 7 9 1 4 5 0 3 4 0 2 3 0 1 1 0 1 1 -+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 1 0 1 1 0 1 1 0 1 1 0 2 3 -+0 2 3 0 3 4 1 4 5 1 7 9 1 8 11 2 10 13 -+2 13 18 3 16 22 4 19 26 4 22 30 5 27 37 6 30 41 -+7 36 49 7 39 53 8 42 57 5 44 60 7 48 67 7 48 67 -+10 53 71 24 54 62 55 54 51 69 68 60 105 82 42 105 82 42 -+69 68 60 32 65 75 6 54 76 8 56 78 6 54 76 57 82 86 -+193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 -+193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 -+193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 -+193 130 84 193 130 84 193 130 84 193 130 84 105 98 84 6 54 76 -+32 65 75 69 68 60 105 82 42 105 82 42 105 82 42 105 82 42 -+69 68 60 32 65 75 11 58 79 8 56 78 11 56 77 10 54 74 -+9 50 69 9 47 64 8 42 57 7 38 51 6 33 45 5 28 38 -+4 23 31 4 19 26 3 15 20 2 12 16 2 9 12 1 7 9 -+1 5 6 0 3 4 0 3 4 0 1 1 0 1 1 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 -+0 1 1 0 2 3 0 3 4 1 4 5 1 5 6 1 7 9 -+2 9 12 2 12 16 3 15 20 3 18 24 3 21 29 5 25 34 -+6 30 41 6 33 45 7 38 51 8 41 55 8 44 59 9 47 64 -+9 50 69 6 54 76 6 54 76 10 53 71 9 50 69 10 53 71 -+10 53 71 6 54 76 11 56 77 11 56 77 6 54 76 32 65 75 -+193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 -+167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 -+167 119 72 167 119 72 167 119 72 193 130 84 167 119 72 193 130 84 -+193 130 84 193 130 84 193 130 84 193 130 84 69 68 60 6 54 76 -+8 56 78 8 56 78 6 54 76 6 57 82 6 54 76 6 57 82 -+6 57 82 8 56 78 11 58 79 11 56 77 10 54 74 9 50 69 -+9 47 64 8 42 57 7 38 51 6 33 45 5 29 40 4 24 33 -+4 19 26 3 16 22 2 13 18 2 10 13 1 7 9 1 5 6 -+0 3 4 0 3 4 0 2 3 0 1 1 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 1 1 0 1 1 0 2 3 0 2 3 1 4 5 1 5 6 -+1 7 9 2 9 12 2 12 16 3 15 20 3 18 24 4 22 30 -+5 25 34 6 30 41 6 33 45 7 36 49 8 41 55 8 44 59 -+9 47 64 9 49 66 9 50 69 9 50 69 10 53 71 10 53 71 -+10 54 74 10 53 71 10 53 71 10 53 71 9 50 69 9 50 69 -+167 119 72 193 130 84 193 130 84 193 130 84 167 119 72 167 119 72 -+167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 -+167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 -+167 119 72 193 130 84 193 130 84 167 119 72 15 53 69 10 53 71 -+11 56 77 11 56 77 8 56 78 8 56 78 8 56 78 8 56 78 -+11 58 79 11 56 77 10 54 74 10 53 71 9 50 69 9 47 64 -+8 42 57 7 38 51 6 33 45 6 30 41 5 25 34 3 21 29 -+3 16 22 2 13 18 2 11 15 1 8 11 1 7 9 1 4 5 -+0 3 4 0 1 1 0 2 3 0 1 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 1 1 0 1 1 0 1 1 0 2 3 1 4 5 -+1 5 6 1 7 9 2 10 13 2 12 16 3 15 20 3 18 24 -+4 22 30 5 25 34 6 30 41 6 33 45 7 36 49 8 41 55 -+8 42 57 8 45 61 9 47 64 9 49 66 9 49 66 9 49 66 -+9 49 66 9 50 69 9 49 66 9 49 66 9 47 64 9 47 64 -+69 68 60 193 130 84 167 119 72 167 119 72 167 119 72 167 119 72 -+139 105 59 139 105 59 139 105 59 139 105 59 139 105 59 139 105 59 -+139 105 59 139 105 59 139 105 59 139 105 59 139 105 59 167 119 72 -+167 119 72 167 119 72 193 130 84 69 68 60 8 45 61 9 50 69 -+10 53 71 10 53 71 10 54 74 10 54 74 10 54 74 10 54 74 -+10 54 74 10 53 71 9 50 69 9 49 66 8 45 61 8 42 57 -+7 39 53 6 33 45 6 30 41 5 27 37 4 22 30 4 19 26 -+3 15 20 2 11 15 2 9 12 1 7 9 1 5 6 0 3 4 -+0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 1 0 1 1 0 2 3 0 2 3 0 3 4 -+1 4 5 1 5 6 1 7 9 2 9 12 2 11 15 3 15 20 -+3 18 24 4 22 30 5 25 34 5 28 38 6 33 45 7 36 49 -+7 38 51 6 40 54 8 42 57 8 44 59 8 44 59 8 45 61 -+8 44 59 8 45 61 8 44 59 8 44 59 8 44 59 8 41 55 -+8 42 57 105 82 42 167 119 72 167 119 72 139 105 59 139 105 59 -+139 105 59 139 105 59 105 82 42 105 82 42 105 82 42 105 82 42 -+105 82 42 105 82 42 139 105 59 139 105 59 139 105 59 139 105 59 -+167 119 72 167 119 72 105 82 42 1 37 56 8 42 57 8 44 59 -+8 45 61 9 47 64 9 47 64 9 49 66 9 49 66 9 49 66 -+9 47 64 9 47 64 8 45 61 8 44 59 8 41 55 7 38 51 -+6 33 45 5 29 40 5 27 37 4 23 31 3 18 24 3 15 20 -+2 12 16 2 9 12 1 7 9 1 5 6 0 3 4 0 2 3 -+0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 2 3 -+0 3 4 1 5 6 1 7 9 1 7 9 2 9 12 2 11 15 -+3 15 20 3 18 24 4 20 27 4 23 31 5 25 34 6 30 41 -+6 33 45 7 36 49 7 36 49 7 38 51 7 39 53 7 39 53 -+7 39 53 7 39 53 7 39 53 7 38 51 7 38 51 7 36 49 -+6 33 45 8 41 55 69 68 60 167 119 72 139 105 59 139 105 59 -+105 82 42 105 82 42 105 82 42 105 82 42 105 82 42 105 82 42 -+105 82 42 105 82 42 105 82 42 105 82 42 139 105 59 139 105 59 -+139 105 59 69 68 60 6 33 45 6 30 41 7 36 49 7 36 49 -+7 38 51 8 41 55 8 41 55 8 41 55 8 42 57 8 42 57 -+8 41 55 8 41 55 7 39 53 7 36 49 7 36 49 6 33 45 -+5 29 40 5 25 34 3 21 29 3 18 24 3 15 20 2 12 16 -+2 9 12 1 7 9 1 5 6 0 3 4 0 2 3 0 1 1 -+0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 -+0 2 3 0 3 4 1 4 5 1 5 6 1 7 9 2 9 12 -+2 12 16 3 15 20 3 16 22 4 19 26 4 22 30 5 25 34 -+5 27 37 5 29 40 6 30 41 6 33 45 6 33 45 6 33 45 -+6 33 45 6 33 45 6 30 41 6 30 41 6 30 41 6 30 41 -+5 27 37 5 25 34 5 25 34 28 32 37 105 82 42 105 82 42 -+139 105 59 139 105 59 105 82 42 105 82 42 105 82 42 105 82 42 -+105 82 42 105 82 42 105 82 42 105 82 42 105 82 42 55 54 51 -+28 32 37 4 19 26 4 23 31 5 27 37 5 29 40 6 30 41 -+6 33 45 6 33 45 6 33 45 6 33 45 6 33 45 7 36 49 -+7 36 49 6 33 45 6 33 45 6 30 41 5 29 40 5 25 34 -+4 23 31 4 20 27 3 16 22 3 15 20 2 12 16 2 9 12 -+1 7 9 1 5 6 1 4 5 0 2 3 0 2 3 0 1 1 -+0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 -+0 1 1 0 2 3 0 3 4 1 4 5 1 5 6 1 7 9 -+2 9 12 2 11 15 2 13 18 3 15 20 3 18 24 4 20 27 -+4 22 30 4 24 33 5 25 34 5 25 34 5 27 37 5 27 37 -+5 27 37 5 25 34 5 25 34 5 25 34 4 24 33 4 23 31 -+4 22 30 3 21 29 4 19 26 3 16 22 0 14 27 21 20 20 -+39 37 35 39 37 35 47 44 41 47 44 41 39 37 35 39 37 35 -+39 37 35 47 44 41 39 37 35 29 26 26 2 13 18 2 11 15 -+2 13 18 3 18 24 4 20 27 3 21 29 4 23 31 4 24 33 -+5 25 34 5 27 37 5 27 37 5 28 38 5 28 38 5 28 38 -+5 27 37 5 27 37 5 25 34 5 25 34 4 23 31 3 21 29 -+3 18 24 3 15 20 2 13 18 2 11 15 2 9 12 1 7 9 -+1 5 6 1 4 5 0 3 4 0 2 3 0 1 1 0 1 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 -+0 1 1 0 1 1 0 2 3 0 3 4 0 3 4 1 5 6 -+1 7 9 2 9 12 2 10 13 2 11 15 2 13 18 3 16 22 -+3 16 22 4 19 26 4 19 26 4 20 27 4 20 27 4 19 26 -+4 19 26 4 20 27 4 19 26 4 19 26 3 18 24 3 18 24 -+3 16 22 3 16 22 3 15 20 3 15 20 2 12 16 2 11 15 -+1 8 11 1 7 9 9 8 8 7 7 7 1 5 6 7 7 7 -+1 5 6 1 7 9 7 7 7 1 9 12 2 11 15 2 12 16 -+2 13 18 2 13 18 3 15 20 3 16 22 3 16 22 3 18 24 -+4 19 26 4 20 27 4 20 27 3 21 29 3 21 29 3 21 29 -+3 21 29 3 21 29 4 19 26 4 19 26 3 18 24 3 16 22 -+3 15 20 2 12 16 1 10 14 1 8 11 1 7 9 1 5 6 -+1 4 5 0 3 4 0 2 3 0 1 1 0 1 1 0 0 1 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 1 0 1 1 0 1 1 0 2 3 0 2 3 0 3 4 -+1 4 5 1 7 9 1 7 9 1 8 11 2 10 13 2 11 15 -+2 12 16 2 13 18 2 13 18 3 15 20 3 15 20 3 15 20 -+3 15 20 3 15 20 3 15 20 2 13 18 2 12 16 2 12 16 -+2 12 16 2 12 16 2 11 15 1 10 14 2 10 13 2 9 12 -+1 8 11 1 8 11 1 8 11 1 8 11 1 8 11 1 8 11 -+1 7 9 1 7 9 1 8 11 1 8 11 1 8 11 1 8 11 -+2 9 12 2 9 12 1 10 14 2 11 15 2 11 15 2 12 16 -+2 12 16 2 13 18 2 13 18 3 15 20 3 15 20 3 15 20 -+3 15 20 3 15 20 2 13 18 2 13 18 2 12 16 2 11 15 -+1 10 14 1 8 11 1 7 9 1 7 9 1 5 6 0 3 4 -+0 2 3 0 2 3 0 1 1 0 1 1 0 0 1 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 1 0 1 1 0 1 1 0 1 1 0 3 4 -+0 3 4 1 4 5 1 5 6 1 7 9 1 7 9 1 8 11 -+1 8 11 2 9 12 2 10 13 2 10 13 2 10 13 2 9 12 -+2 10 13 2 10 13 2 9 12 1 8 11 1 8 11 1 8 11 -+1 8 11 1 7 9 1 7 9 1 7 9 1 7 9 1 7 9 -+1 7 9 1 5 6 1 5 6 1 5 6 1 5 6 1 5 6 -+1 5 6 1 5 6 1 5 6 1 5 6 1 5 6 1 7 9 -+1 7 9 1 7 9 1 7 9 1 7 9 1 8 11 1 8 11 -+1 8 11 2 9 12 2 9 12 2 9 12 2 10 13 2 9 12 -+2 10 13 2 10 13 2 10 13 2 9 12 1 8 11 1 8 11 -+1 7 9 1 5 6 1 4 5 1 4 5 0 3 4 0 3 4 -+0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 -+0 1 1 0 2 3 0 3 4 0 3 4 1 4 5 1 4 5 -+1 7 9 1 7 9 1 7 9 1 7 9 1 7 9 1 7 9 -+1 7 9 1 7 9 1 7 9 1 7 9 1 5 6 1 4 5 -+1 5 6 1 5 6 1 5 6 1 4 5 1 4 5 1 4 5 -+1 4 5 1 4 5 0 3 4 0 3 4 0 3 4 0 3 4 -+0 3 4 0 3 4 0 3 4 0 3 4 1 4 5 1 4 5 -+1 4 5 1 4 5 1 4 5 1 4 5 1 5 6 1 4 5 -+1 5 6 1 7 9 1 7 9 1 7 9 1 7 9 1 7 9 -+1 7 9 1 7 9 1 7 9 1 7 9 1 7 9 1 5 6 -+1 4 5 0 3 4 0 3 4 0 2 3 0 2 3 0 1 1 -+0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -+0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c -index f363fbeb5ab0..e09edb5c5e06 100644 ---- a/drivers/virtio/virtio_mmio.c -+++ b/drivers/virtio/virtio_mmio.c -@@ -463,9 +463,14 @@ static int vm_find_vqs(struct virtio_device *vdev, unsigned nvqs, - struct irq_affinity *desc) - { - struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev); -- unsigned int irq = platform_get_irq(vm_dev->pdev, 0); -+ int irq = platform_get_irq(vm_dev->pdev, 0); - int i, err, queue_idx = 0; - -+ if (irq < 0) { -+ dev_err(&vdev->dev, "Cannot get IRQ resource\n"); -+ return irq; -+ } -+ - err = request_irq(irq, vm_interrupt, IRQF_SHARED, - dev_name(&vdev->dev), vm_dev); - if (err) -diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c -index d37dd5bb7a8f..559768dc2567 100644 ---- a/drivers/xen/balloon.c -+++ b/drivers/xen/balloon.c -@@ -538,8 +538,15 @@ static void balloon_process(struct work_struct *work) - state = reserve_additional_memory(); - } - -- if (credit < 0) -- state = decrease_reservation(-credit, GFP_BALLOON); -+ if (credit < 0) { -+ long n_pages; -+ -+ n_pages = min(-credit, si_mem_available()); -+ state = decrease_reservation(n_pages, GFP_BALLOON); -+ if (state == BP_DONE && n_pages != -credit && -+ n_pages < totalreserve_pages) -+ state = BP_EAGAIN; -+ } - - state = update_schedule(state); - -@@ -578,6 +585,9 @@ static int add_ballooned_pages(int nr_pages) - } - } - -+ if (si_mem_available() < nr_pages) -+ return -ENOMEM; -+ - st = decrease_reservation(nr_pages, GFP_USER); - if (st != BP_DONE) - return -ENOMEM; -@@ -710,7 +720,7 @@ static int __init balloon_init(void) - balloon_stats.schedule_delay = 1; - balloon_stats.max_schedule_delay = 32; - balloon_stats.retry_count = 1; -- balloon_stats.max_retry_count = RETRY_UNLIMITED; -+ balloon_stats.max_retry_count = 4; - - #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG - set_online_page_callback(&xen_online_page); -diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c -index ff9b51055b14..2e8570c09789 100644 ---- a/drivers/xen/events/events_base.c -+++ b/drivers/xen/events/events_base.c -@@ -1294,7 +1294,7 @@ void rebind_evtchn_irq(int evtchn, int irq) - } - - /* Rebind an evtchn so that it gets delivered to a specific cpu */ --int xen_rebind_evtchn_to_cpu(int evtchn, unsigned tcpu) -+static int xen_rebind_evtchn_to_cpu(int evtchn, unsigned int tcpu) - { - struct evtchn_bind_vcpu bind_vcpu; - int masked; -@@ -1328,7 +1328,6 @@ int xen_rebind_evtchn_to_cpu(int evtchn, unsigned tcpu) - - return 0; - } --EXPORT_SYMBOL_GPL(xen_rebind_evtchn_to_cpu); - - static int set_affinity_irq(struct irq_data *data, const struct cpumask *dest, - bool force) -@@ -1342,6 +1341,15 @@ static int set_affinity_irq(struct irq_data *data, const struct cpumask *dest, - return ret; - } - -+/* To be called with desc->lock held. */ -+int xen_set_affinity_evtchn(struct irq_desc *desc, unsigned int tcpu) -+{ -+ struct irq_data *d = irq_desc_get_irq_data(desc); -+ -+ return set_affinity_irq(d, cpumask_of(tcpu), false); -+} -+EXPORT_SYMBOL_GPL(xen_set_affinity_evtchn); -+ - static void enable_dynirq(struct irq_data *data) - { - int evtchn = evtchn_from_irq(data->irq); -diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c -index f341b016672f..052b55a14ebc 100644 ---- a/drivers/xen/evtchn.c -+++ b/drivers/xen/evtchn.c -@@ -447,7 +447,7 @@ static void evtchn_bind_interdom_next_vcpu(int evtchn) - this_cpu_write(bind_last_selected_cpu, selected_cpu); - - /* unmask expects irqs to be disabled */ -- xen_rebind_evtchn_to_cpu(evtchn, selected_cpu); -+ xen_set_affinity_evtchn(desc, selected_cpu); - raw_spin_unlock_irqrestore(&desc->lock, flags); - } - -diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c -index 469dfbd6cf90..dd4d5dea9a54 100644 ---- a/drivers/xen/gntdev.c -+++ b/drivers/xen/gntdev.c -@@ -1145,7 +1145,7 @@ static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma) - goto out_put_map; - - if (!use_ptemod) { -- err = vm_map_pages(vma, map->pages, map->count); -+ err = vm_map_pages_zero(vma, map->pages, map->count); - if (err) - goto out_put_map; - } else { -diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c -index d53f3493a6b9..c416d31cb545 100644 ---- a/drivers/xen/swiotlb-xen.c -+++ b/drivers/xen/swiotlb-xen.c -@@ -361,8 +361,8 @@ xen_swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr, - /* Convert the size to actually allocated. */ - size = 1UL << (order + XEN_PAGE_SHIFT); - -- if (((dev_addr + size - 1 <= dma_mask)) || -- range_straddles_page_boundary(phys, size)) -+ if (!WARN_ON((dev_addr + size - 1 > dma_mask) || -+ range_straddles_page_boundary(phys, size))) - xen_destroy_contiguous_region(phys, order); - - xen_free_coherent_pages(hwdev, size, vaddr, (dma_addr_t)phys, attrs); -@@ -402,7 +402,7 @@ static dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page, - - map = swiotlb_tbl_map_single(dev, start_dma_addr, phys, size, dir, - attrs); -- if (map == DMA_MAPPING_ERROR) -+ if (map == (phys_addr_t)DMA_MAPPING_ERROR) - return DMA_MAPPING_ERROR; - - dev_addr = xen_phys_to_bus(map); -diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c -index bc57ae9e2963..cce9ace651a2 100644 ---- a/fs/9p/vfs_addr.c -+++ b/fs/9p/vfs_addr.c -@@ -35,8 +35,9 @@ - * @page: structure to page - * - */ --static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page) -+static int v9fs_fid_readpage(void *data, struct page *page) - { -+ struct p9_fid *fid = data; - struct inode *inode = page->mapping->host; - struct bio_vec bvec = {.bv_page = page, .bv_len = PAGE_SIZE}; - struct iov_iter to; -@@ -107,7 +108,8 @@ static int v9fs_vfs_readpages(struct file *filp, struct address_space *mapping, - if (ret == 0) - return ret; - -- ret = read_cache_pages(mapping, pages, (void *)v9fs_vfs_readpage, filp); -+ ret = read_cache_pages(mapping, pages, v9fs_fid_readpage, -+ filp->private_data); - p9_debug(P9_DEBUG_VFS, " = %d\n", ret); - return ret; - } -diff --git a/fs/adfs/super.c b/fs/adfs/super.c -index ffb669f9bba7..ce0fbbe002bf 100644 ---- a/fs/adfs/super.c -+++ b/fs/adfs/super.c -@@ -360,6 +360,7 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) - struct buffer_head *bh; - struct object_info root_obj; - unsigned char *b_data; -+ unsigned int blocksize; - struct adfs_sb_info *asb; - struct inode *root; - int ret = -EINVAL; -@@ -411,8 +412,10 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) - goto error_free_bh; - } - -+ blocksize = 1 << dr->log2secsize; - brelse(bh); -- if (sb_set_blocksize(sb, 1 << dr->log2secsize)) { -+ -+ if (sb_set_blocksize(sb, blocksize)) { - bh = sb_bread(sb, ADFS_DISCRECORD / sb->s_blocksize); - if (!bh) { - adfs_error(sb, "couldn't read superblock on " -diff --git a/fs/block_dev.c b/fs/block_dev.c -index 749f5984425d..a9e7c1b69437 100644 ---- a/fs/block_dev.c -+++ b/fs/block_dev.c -@@ -1151,8 +1151,7 @@ static struct gendisk *bdev_get_gendisk(struct block_device *bdev, int *partno) - * Pointer to the block device containing @bdev on success, ERR_PTR() - * value on failure. - */ --static struct block_device *bd_start_claiming(struct block_device *bdev, -- void *holder) -+struct block_device *bd_start_claiming(struct block_device *bdev, void *holder) - { - struct gendisk *disk; - struct block_device *whole; -@@ -1199,6 +1198,62 @@ static struct block_device *bd_start_claiming(struct block_device *bdev, - return ERR_PTR(err); - } - } -+EXPORT_SYMBOL(bd_start_claiming); -+ -+static void bd_clear_claiming(struct block_device *whole, void *holder) -+{ -+ lockdep_assert_held(&bdev_lock); -+ /* tell others that we're done */ -+ BUG_ON(whole->bd_claiming != holder); -+ whole->bd_claiming = NULL; -+ wake_up_bit(&whole->bd_claiming, 0); -+} -+ -+/** -+ * bd_finish_claiming - finish claiming of a block device -+ * @bdev: block device of interest -+ * @whole: whole block device (returned from bd_start_claiming()) -+ * @holder: holder that has claimed @bdev -+ * -+ * Finish exclusive open of a block device. Mark the device as exlusively -+ * open by the holder and wake up all waiters for exclusive open to finish. -+ */ -+void bd_finish_claiming(struct block_device *bdev, struct block_device *whole, -+ void *holder) -+{ -+ spin_lock(&bdev_lock); -+ BUG_ON(!bd_may_claim(bdev, whole, holder)); -+ /* -+ * Note that for a whole device bd_holders will be incremented twice, -+ * and bd_holder will be set to bd_may_claim before being set to holder -+ */ -+ whole->bd_holders++; -+ whole->bd_holder = bd_may_claim; -+ bdev->bd_holders++; -+ bdev->bd_holder = holder; -+ bd_clear_claiming(whole, holder); -+ spin_unlock(&bdev_lock); -+} -+EXPORT_SYMBOL(bd_finish_claiming); -+ -+/** -+ * bd_abort_claiming - abort claiming of a block device -+ * @bdev: block device of interest -+ * @whole: whole block device (returned from bd_start_claiming()) -+ * @holder: holder that has claimed @bdev -+ * -+ * Abort claiming of a block device when the exclusive open failed. This can be -+ * also used when exclusive open is not actually desired and we just needed -+ * to block other exclusive openers for a while. -+ */ -+void bd_abort_claiming(struct block_device *bdev, struct block_device *whole, -+ void *holder) -+{ -+ spin_lock(&bdev_lock); -+ bd_clear_claiming(whole, holder); -+ spin_unlock(&bdev_lock); -+} -+EXPORT_SYMBOL(bd_abort_claiming); - - #ifdef CONFIG_SYSFS - struct bd_holder_disk { -@@ -1668,29 +1723,10 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder) - - /* finish claiming */ - mutex_lock(&bdev->bd_mutex); -- spin_lock(&bdev_lock); -- -- if (!res) { -- BUG_ON(!bd_may_claim(bdev, whole, holder)); -- /* -- * Note that for a whole device bd_holders -- * will be incremented twice, and bd_holder -- * will be set to bd_may_claim before being -- * set to holder -- */ -- whole->bd_holders++; -- whole->bd_holder = bd_may_claim; -- bdev->bd_holders++; -- bdev->bd_holder = holder; -- } -- -- /* tell others that we're done */ -- BUG_ON(whole->bd_claiming != holder); -- whole->bd_claiming = NULL; -- wake_up_bit(&whole->bd_claiming, 0); -- -- spin_unlock(&bdev_lock); -- -+ if (!res) -+ bd_finish_claiming(bdev, whole, holder); -+ else -+ bd_abort_claiming(bdev, whole, holder); - /* - * Block event polling for write claims if requested. Any - * write holder makes the write_holder state stick until -diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c -index 84dd4a8980c5..75efb843b7b5 100644 ---- a/fs/btrfs/compression.c -+++ b/fs/btrfs/compression.c -@@ -42,6 +42,22 @@ const char* btrfs_compress_type2str(enum btrfs_compression_type type) - return NULL; - } - -+bool btrfs_compress_is_valid_type(const char *str, size_t len) -+{ -+ int i; -+ -+ for (i = 1; i < ARRAY_SIZE(btrfs_compress_types); i++) { -+ size_t comp_len = strlen(btrfs_compress_types[i]); -+ -+ if (len < comp_len) -+ continue; -+ -+ if (!strncmp(btrfs_compress_types[i], str, comp_len)) -+ return true; -+ } -+ return false; -+} -+ - static int btrfs_decompress_bio(struct compressed_bio *cb); - - static inline int compressed_bio_size(struct btrfs_fs_info *fs_info, -diff --git a/fs/btrfs/compression.h b/fs/btrfs/compression.h -index 9976fe0f7526..b61879485e60 100644 ---- a/fs/btrfs/compression.h -+++ b/fs/btrfs/compression.h -@@ -173,6 +173,7 @@ extern const struct btrfs_compress_op btrfs_lzo_compress; - extern const struct btrfs_compress_op btrfs_zstd_compress; - - const char* btrfs_compress_type2str(enum btrfs_compression_type type); -+bool btrfs_compress_is_valid_type(const char *str, size_t len); - - int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end); - -diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c -index 5faf057f6f37..808a5c7cf01d 100644 ---- a/fs/btrfs/extent-tree.c -+++ b/fs/btrfs/extent-tree.c -@@ -6056,7 +6056,7 @@ int btrfs_delalloc_reserve_metadata(struct btrfs_inode *inode, u64 num_bytes) - flush = BTRFS_RESERVE_FLUSH_LIMIT; - - if (btrfs_transaction_in_commit(fs_info)) -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - } - - if (delalloc_lock) -diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c -index 89f5be2bfb43..1c7533db16b0 100644 ---- a/fs/btrfs/file.c -+++ b/fs/btrfs/file.c -@@ -2721,6 +2721,11 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len) - * for detecting, at fsync time, if the inode isn't yet in the - * log tree or it's there but not up to date. - */ -+ struct timespec64 now = current_time(inode); -+ -+ inode_inc_iversion(inode); -+ inode->i_mtime = now; -+ inode->i_ctime = now; - trans = btrfs_start_transaction(root, 1); - if (IS_ERR(trans)) { - err = PTR_ERR(trans); -diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c -index ffca2abf13d0..89b2a7f7397e 100644 ---- a/fs/btrfs/inode-map.c -+++ b/fs/btrfs/inode-map.c -@@ -75,7 +75,7 @@ static int caching_kthread(void *data) - btrfs_release_path(path); - root->ino_cache_progress = last; - up_read(&fs_info->commit_root_sem); -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - goto again; - } else - continue; -diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c -index a2aabdb85226..8c9c7d76c900 100644 ---- a/fs/btrfs/inode.c -+++ b/fs/btrfs/inode.c -@@ -394,10 +394,31 @@ static noinline int add_async_extent(struct async_chunk *cow, - return 0; - } - -+/* -+ * Check if the inode has flags compatible with compression -+ */ -+static inline bool inode_can_compress(struct inode *inode) -+{ -+ if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW || -+ BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) -+ return false; -+ return true; -+} -+ -+/* -+ * Check if the inode needs to be submitted to compression, based on mount -+ * options, defragmentation, properties or heuristics. -+ */ - static inline int inode_need_compress(struct inode *inode, u64 start, u64 end) - { - struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); - -+ if (!inode_can_compress(inode)) { -+ WARN(IS_ENABLED(CONFIG_BTRFS_DEBUG), -+ KERN_ERR "BTRFS: unexpected compression for ino %llu\n", -+ btrfs_ino(BTRFS_I(inode))); -+ return 0; -+ } - /* force compress */ - if (btrfs_test_opt(fs_info, FORCE_COMPRESS)) - return 1; -@@ -1630,7 +1651,8 @@ int btrfs_run_delalloc_range(struct inode *inode, struct page *locked_page, - } else if (BTRFS_I(inode)->flags & BTRFS_INODE_PREALLOC && !force_cow) { - ret = run_delalloc_nocow(inode, locked_page, start, end, - page_started, 0, nr_written); -- } else if (!inode_need_compress(inode, start, end)) { -+ } else if (!inode_can_compress(inode) || -+ !inode_need_compress(inode, start, end)) { - ret = cow_file_range(inode, locked_page, start, end, end, - page_started, nr_written, 1, NULL); - } else { -diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c -index 2a1be0d1a698..5b4beebf138c 100644 ---- a/fs/btrfs/ioctl.c -+++ b/fs/btrfs/ioctl.c -@@ -3999,6 +3999,27 @@ static int btrfs_remap_file_range_prep(struct file *file_in, loff_t pos_in, - if (!same_inode) - inode_dio_wait(inode_out); - -+ /* -+ * Workaround to make sure NOCOW buffered write reach disk as NOCOW. -+ * -+ * Btrfs' back references do not have a block level granularity, they -+ * work at the whole extent level. -+ * NOCOW buffered write without data space reserved may not be able -+ * to fall back to CoW due to lack of data space, thus could cause -+ * data loss. -+ * -+ * Here we take a shortcut by flushing the whole inode, so that all -+ * nocow write should reach disk as nocow before we increase the -+ * reference of the extent. We could do better by only flushing NOCOW -+ * data, but that needs extra accounting. -+ * -+ * Also we don't need to check ASYNC_EXTENT, as async extent will be -+ * CoWed anyway, not affecting nocow part. -+ */ -+ ret = filemap_flush(inode_in->i_mapping); -+ if (ret < 0) -+ return ret; -+ - ret = btrfs_wait_ordered_range(inode_in, ALIGN_DOWN(pos_in, bs), - wb_len); - if (ret < 0) -diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c -index a9e2e66152ee..e0469816c678 100644 ---- a/fs/btrfs/props.c -+++ b/fs/btrfs/props.c -@@ -257,11 +257,7 @@ static int prop_compression_validate(const char *value, size_t len) - if (!value) - return 0; - -- if (!strncmp("lzo", value, 3)) -- return 0; -- else if (!strncmp("zlib", value, 4)) -- return 0; -- else if (!strncmp("zstd", value, 4)) -+ if (btrfs_compress_is_valid_type(value, len)) - return 0; - - return -EINVAL; -@@ -341,7 +337,7 @@ static int inherit_props(struct btrfs_trans_handle *trans, - for (i = 0; i < ARRAY_SIZE(prop_handlers); i++) { - const struct prop_handler *h = &prop_handlers[i]; - const char *value; -- u64 num_bytes; -+ u64 num_bytes = 0; - - if (!h->inheritable) - continue; -diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c -index 3e6ffbbd8b0a..f8a3c1b0a15a 100644 ---- a/fs/btrfs/qgroup.c -+++ b/fs/btrfs/qgroup.c -@@ -2614,6 +2614,7 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, u64 srcid, - int ret = 0; - int i; - u64 *i_qgroups; -+ bool committing = false; - struct btrfs_fs_info *fs_info = trans->fs_info; - struct btrfs_root *quota_root; - struct btrfs_qgroup *srcgroup; -@@ -2621,7 +2622,25 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, u64 srcid, - u32 level_size = 0; - u64 nums; - -- mutex_lock(&fs_info->qgroup_ioctl_lock); -+ /* -+ * There are only two callers of this function. -+ * -+ * One in create_subvol() in the ioctl context, which needs to hold -+ * the qgroup_ioctl_lock. -+ * -+ * The other one in create_pending_snapshot() where no other qgroup -+ * code can modify the fs as they all need to either start a new trans -+ * or hold a trans handler, thus we don't need to hold -+ * qgroup_ioctl_lock. -+ * This would avoid long and complex lock chain and make lockdep happy. -+ */ -+ spin_lock(&fs_info->trans_lock); -+ if (trans->transaction->state == TRANS_STATE_COMMIT_DOING) -+ committing = true; -+ spin_unlock(&fs_info->trans_lock); -+ -+ if (!committing) -+ mutex_lock(&fs_info->qgroup_ioctl_lock); - if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) - goto out; - -@@ -2785,7 +2804,8 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, u64 srcid, - unlock: - spin_unlock(&fs_info->qgroup_lock); - out: -- mutex_unlock(&fs_info->qgroup_ioctl_lock); -+ if (!committing) -+ mutex_unlock(&fs_info->qgroup_ioctl_lock); - return ret; - } - -diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c -index f7fe4770f0e5..d25271381c56 100644 ---- a/fs/btrfs/send.c -+++ b/fs/btrfs/send.c -@@ -6322,68 +6322,21 @@ static int changed_extent(struct send_ctx *sctx, - { - int ret = 0; - -- if (sctx->cur_ino != sctx->cmp_key->objectid) { -- -- if (result == BTRFS_COMPARE_TREE_CHANGED) { -- struct extent_buffer *leaf_l; -- struct extent_buffer *leaf_r; -- struct btrfs_file_extent_item *ei_l; -- struct btrfs_file_extent_item *ei_r; -- -- leaf_l = sctx->left_path->nodes[0]; -- leaf_r = sctx->right_path->nodes[0]; -- ei_l = btrfs_item_ptr(leaf_l, -- sctx->left_path->slots[0], -- struct btrfs_file_extent_item); -- ei_r = btrfs_item_ptr(leaf_r, -- sctx->right_path->slots[0], -- struct btrfs_file_extent_item); -- -- /* -- * We may have found an extent item that has changed -- * only its disk_bytenr field and the corresponding -- * inode item was not updated. This case happens due to -- * very specific timings during relocation when a leaf -- * that contains file extent items is COWed while -- * relocation is ongoing and its in the stage where it -- * updates data pointers. So when this happens we can -- * safely ignore it since we know it's the same extent, -- * but just at different logical and physical locations -- * (when an extent is fully replaced with a new one, we -- * know the generation number must have changed too, -- * since snapshot creation implies committing the current -- * transaction, and the inode item must have been updated -- * as well). -- * This replacement of the disk_bytenr happens at -- * relocation.c:replace_file_extents() through -- * relocation.c:btrfs_reloc_cow_block(). -- */ -- if (btrfs_file_extent_generation(leaf_l, ei_l) == -- btrfs_file_extent_generation(leaf_r, ei_r) && -- btrfs_file_extent_ram_bytes(leaf_l, ei_l) == -- btrfs_file_extent_ram_bytes(leaf_r, ei_r) && -- btrfs_file_extent_compression(leaf_l, ei_l) == -- btrfs_file_extent_compression(leaf_r, ei_r) && -- btrfs_file_extent_encryption(leaf_l, ei_l) == -- btrfs_file_extent_encryption(leaf_r, ei_r) && -- btrfs_file_extent_other_encoding(leaf_l, ei_l) == -- btrfs_file_extent_other_encoding(leaf_r, ei_r) && -- btrfs_file_extent_type(leaf_l, ei_l) == -- btrfs_file_extent_type(leaf_r, ei_r) && -- btrfs_file_extent_disk_bytenr(leaf_l, ei_l) != -- btrfs_file_extent_disk_bytenr(leaf_r, ei_r) && -- btrfs_file_extent_disk_num_bytes(leaf_l, ei_l) == -- btrfs_file_extent_disk_num_bytes(leaf_r, ei_r) && -- btrfs_file_extent_offset(leaf_l, ei_l) == -- btrfs_file_extent_offset(leaf_r, ei_r) && -- btrfs_file_extent_num_bytes(leaf_l, ei_l) == -- btrfs_file_extent_num_bytes(leaf_r, ei_r)) -- return 0; -- } -- -- inconsistent_snapshot_error(sctx, result, "extent"); -- return -EIO; -- } -+ /* -+ * We have found an extent item that changed without the inode item -+ * having changed. This can happen either after relocation (where the -+ * disk_bytenr of an extent item is replaced at -+ * relocation.c:replace_file_extents()) or after deduplication into a -+ * file in both the parent and send snapshots (where an extent item can -+ * get modified or replaced with a new one). Note that deduplication -+ * updates the inode item, but it only changes the iversion (sequence -+ * field in the inode item) of the inode, so if a file is deduplicated -+ * the same amount of times in both the parent and send snapshots, its -+ * iversion becames the same in both snapshots, whence the inode item is -+ * the same on both snapshots. -+ */ -+ if (sctx->cur_ino != sctx->cmp_key->objectid) -+ return 0; - - if (!sctx->cur_inode_new_gen && !sctx->cur_inode_deleted) { - if (result != BTRFS_COMPARE_TREE_DELETED) -diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c -index 3f6811cdf803..1aa3f6d6d775 100644 ---- a/fs/btrfs/transaction.c -+++ b/fs/btrfs/transaction.c -@@ -2019,6 +2019,16 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans) - } - } else { - spin_unlock(&fs_info->trans_lock); -+ /* -+ * The previous transaction was aborted and was already removed -+ * from the list of transactions at fs_info->trans_list. So we -+ * abort to prevent writing a new superblock that reflects a -+ * corrupt state (pointing to trees with unwritten nodes/leafs). -+ */ -+ if (test_bit(BTRFS_FS_STATE_TRANS_ABORTED, &fs_info->fs_state)) { -+ ret = -EROFS; -+ goto cleanup_transaction; -+ } - } - - extwriter_counter_dec(cur_trans, trans->type); -diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c -index 96fce4bef4e7..ccd5706199d7 100644 ---- a/fs/btrfs/tree-checker.c -+++ b/fs/btrfs/tree-checker.c -@@ -132,6 +132,7 @@ static int check_extent_data_item(struct extent_buffer *leaf, - struct btrfs_file_extent_item *fi; - u32 sectorsize = fs_info->sectorsize; - u32 item_size = btrfs_item_size_nr(leaf, slot); -+ u64 extent_end; - - if (!IS_ALIGNED(key->offset, sectorsize)) { - file_extent_err(leaf, slot, -@@ -207,6 +208,16 @@ static int check_extent_data_item(struct extent_buffer *leaf, - CHECK_FE_ALIGNED(leaf, slot, fi, num_bytes, sectorsize)) - return -EUCLEAN; - -+ /* Catch extent end overflow */ -+ if (check_add_overflow(btrfs_file_extent_num_bytes(leaf, fi), -+ key->offset, &extent_end)) { -+ file_extent_err(leaf, slot, -+ "extent end overflow, have file offset %llu extent num bytes %llu", -+ key->offset, -+ btrfs_file_extent_num_bytes(leaf, fi)); -+ return -EUCLEAN; -+ } -+ - /* - * Check that no two consecutive file extent items, in the same leaf, - * present ranges that overlap each other. -diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c -index 3fc8d854d7fb..6c8297bcfeb7 100644 ---- a/fs/btrfs/tree-log.c -+++ b/fs/btrfs/tree-log.c -@@ -3322,6 +3322,30 @@ int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans, - return 0; - } - -+/* -+ * Check if an inode was logged in the current transaction. We can't always rely -+ * on an inode's logged_trans value, because it's an in-memory only field and -+ * therefore not persisted. This means that its value is lost if the inode gets -+ * evicted and loaded again from disk (in which case it has a value of 0, and -+ * certainly it is smaller then any possible transaction ID), when that happens -+ * the full_sync flag is set in the inode's runtime flags, so on that case we -+ * assume eviction happened and ignore the logged_trans value, assuming the -+ * worst case, that the inode was logged before in the current transaction. -+ */ -+static bool inode_logged(struct btrfs_trans_handle *trans, -+ struct btrfs_inode *inode) -+{ -+ if (inode->logged_trans == trans->transid) -+ return true; -+ -+ if (inode->last_trans == trans->transid && -+ test_bit(BTRFS_INODE_NEEDS_FULL_SYNC, &inode->runtime_flags) && -+ !test_bit(BTRFS_FS_LOG_RECOVERING, &trans->fs_info->flags)) -+ return true; -+ -+ return false; -+} -+ - /* - * If both a file and directory are logged, and unlinks or renames are - * mixed in, we have a few interesting corners: -@@ -3356,7 +3380,7 @@ int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans, - int bytes_del = 0; - u64 dir_ino = btrfs_ino(dir); - -- if (dir->logged_trans < trans->transid) -+ if (!inode_logged(trans, dir)) - return 0; - - ret = join_running_log_trans(root); -@@ -3460,7 +3484,7 @@ int btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans, - u64 index; - int ret; - -- if (inode->logged_trans < trans->transid) -+ if (!inode_logged(trans, inode)) - return 0; - - ret = join_running_log_trans(root); -@@ -5420,9 +5444,19 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, - } - } - -+ /* -+ * Don't update last_log_commit if we logged that an inode exists after -+ * it was loaded to memory (full_sync bit set). -+ * This is to prevent data loss when we do a write to the inode, then -+ * the inode gets evicted after all delalloc was flushed, then we log -+ * it exists (due to a rename for example) and then fsync it. This last -+ * fsync would do nothing (not logging the extents previously written). -+ */ - spin_lock(&inode->lock); - inode->logged_trans = trans->transid; -- inode->last_log_commit = inode->last_sub_trans; -+ if (inode_only != LOG_INODE_EXISTS || -+ !test_bit(BTRFS_INODE_NEEDS_FULL_SYNC, &inode->runtime_flags)) -+ inode->last_log_commit = inode->last_sub_trans; - spin_unlock(&inode->lock); - out_unlock: - mutex_unlock(&inode->log_mutex); -diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c -index 1c2a6e4b39da..8508f6028c8d 100644 ---- a/fs/btrfs/volumes.c -+++ b/fs/btrfs/volumes.c -@@ -5328,8 +5328,7 @@ static inline int btrfs_chunk_max_errors(struct map_lookup *map) - - if (map->type & (BTRFS_BLOCK_GROUP_RAID1 | - BTRFS_BLOCK_GROUP_RAID10 | -- BTRFS_BLOCK_GROUP_RAID5 | -- BTRFS_BLOCK_GROUP_DUP)) { -+ BTRFS_BLOCK_GROUP_RAID5)) { - max_errors = 1; - } else if (map->type & BTRFS_BLOCK_GROUP_RAID6) { - max_errors = 2; -diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c -index 0176241eaea7..7754d7679122 100644 ---- a/fs/ceph/caps.c -+++ b/fs/ceph/caps.c -@@ -1263,20 +1263,22 @@ static int send_cap_msg(struct cap_msg_args *arg) - } - - /* -- * Queue cap releases when an inode is dropped from our cache. Since -- * inode is about to be destroyed, there is no need for i_ceph_lock. -+ * Queue cap releases when an inode is dropped from our cache. - */ --void __ceph_remove_caps(struct inode *inode) -+void __ceph_remove_caps(struct ceph_inode_info *ci) - { -- struct ceph_inode_info *ci = ceph_inode(inode); - struct rb_node *p; - -+ /* lock i_ceph_lock, because ceph_d_revalidate(..., LOOKUP_RCU) -+ * may call __ceph_caps_issued_mask() on a freeing inode. */ -+ spin_lock(&ci->i_ceph_lock); - p = rb_first(&ci->i_caps); - while (p) { - struct ceph_cap *cap = rb_entry(p, struct ceph_cap, ci_node); - p = rb_next(p); - __ceph_remove_cap(cap, true); - } -+ spin_unlock(&ci->i_ceph_lock); - } - - /* -diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c -index 0637149fb9f9..1271024a3797 100644 ---- a/fs/ceph/dir.c -+++ b/fs/ceph/dir.c -@@ -1512,18 +1512,26 @@ static int __dir_lease_try_check(const struct dentry *dentry) - static int dir_lease_is_valid(struct inode *dir, struct dentry *dentry) - { - struct ceph_inode_info *ci = ceph_inode(dir); -- struct ceph_dentry_info *di = ceph_dentry(dentry); -- int valid = 0; -+ int valid; -+ int shared_gen; - - spin_lock(&ci->i_ceph_lock); -- if (atomic_read(&ci->i_shared_gen) == di->lease_shared_gen) -- valid = __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1); -+ valid = __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1); -+ shared_gen = atomic_read(&ci->i_shared_gen); - spin_unlock(&ci->i_ceph_lock); -- if (valid) -- __ceph_dentry_dir_lease_touch(di); -- dout("dir_lease_is_valid dir %p v%u dentry %p v%u = %d\n", -- dir, (unsigned)atomic_read(&ci->i_shared_gen), -- dentry, (unsigned)di->lease_shared_gen, valid); -+ if (valid) { -+ struct ceph_dentry_info *di; -+ spin_lock(&dentry->d_lock); -+ di = ceph_dentry(dentry); -+ if (dir == d_inode(dentry->d_parent) && -+ di && di->lease_shared_gen == shared_gen) -+ __ceph_dentry_dir_lease_touch(di); -+ else -+ valid = 0; -+ spin_unlock(&dentry->d_lock); -+ } -+ dout("dir_lease_is_valid dir %p v%u dentry %p = %d\n", -+ dir, (unsigned)atomic_read(&ci->i_shared_gen), dentry, valid); - return valid; - } - -diff --git a/fs/ceph/file.c b/fs/ceph/file.c -index 183c37c0a8fc..7a57db8e2fa9 100644 ---- a/fs/ceph/file.c -+++ b/fs/ceph/file.c -@@ -1007,7 +1007,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter, - * may block. - */ - truncate_inode_pages_range(inode->i_mapping, pos, -- (pos+len) | (PAGE_SIZE - 1)); -+ PAGE_ALIGN(pos + len) - 1); - - req->r_mtime = mtime; - } -diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c -index 761451f36e2d..3c7a32779574 100644 ---- a/fs/ceph/inode.c -+++ b/fs/ceph/inode.c -@@ -523,17 +523,20 @@ void ceph_free_inode(struct inode *inode) - kmem_cache_free(ceph_inode_cachep, ci); - } - --void ceph_destroy_inode(struct inode *inode) -+void ceph_evict_inode(struct inode *inode) - { - struct ceph_inode_info *ci = ceph_inode(inode); - struct ceph_inode_frag *frag; - struct rb_node *n; - -- dout("destroy_inode %p ino %llx.%llx\n", inode, ceph_vinop(inode)); -+ dout("evict_inode %p ino %llx.%llx\n", inode, ceph_vinop(inode)); -+ -+ truncate_inode_pages_final(&inode->i_data); -+ clear_inode(inode); - - ceph_fscache_unregister_inode_cookie(ci); - -- __ceph_remove_caps(inode); -+ __ceph_remove_caps(ci); - - if (__ceph_has_any_quota(ci)) - ceph_adjust_quota_realms_count(inode, false); -diff --git a/fs/ceph/super.c b/fs/ceph/super.c -index d57fa60dcd43..74ca5970397f 100644 ---- a/fs/ceph/super.c -+++ b/fs/ceph/super.c -@@ -840,10 +840,10 @@ static int ceph_remount(struct super_block *sb, int *flags, char *data) - - static const struct super_operations ceph_super_ops = { - .alloc_inode = ceph_alloc_inode, -- .destroy_inode = ceph_destroy_inode, - .free_inode = ceph_free_inode, - .write_inode = ceph_write_inode, - .drop_inode = ceph_drop_inode, -+ .evict_inode = ceph_evict_inode, - .sync_fs = ceph_sync_fs, - .put_super = ceph_put_super, - .remount_fs = ceph_remount, -diff --git a/fs/ceph/super.h b/fs/ceph/super.h -index 5f27e1f7f2d6..1d313d0536f9 100644 ---- a/fs/ceph/super.h -+++ b/fs/ceph/super.h -@@ -544,7 +544,12 @@ static inline void __ceph_dir_set_complete(struct ceph_inode_info *ci, - long long release_count, - long long ordered_count) - { -- smp_mb__before_atomic(); -+ /* -+ * Makes sure operations that setup readdir cache (update page -+ * cache and i_size) are strongly ordered w.r.t. the following -+ * atomic64_set() operations. -+ */ -+ smp_mb(); - atomic64_set(&ci->i_complete_seq[0], release_count); - atomic64_set(&ci->i_complete_seq[1], ordered_count); - } -@@ -876,7 +881,7 @@ static inline bool __ceph_have_pending_cap_snap(struct ceph_inode_info *ci) - extern const struct inode_operations ceph_file_iops; - - extern struct inode *ceph_alloc_inode(struct super_block *sb); --extern void ceph_destroy_inode(struct inode *inode); -+extern void ceph_evict_inode(struct inode *inode); - extern void ceph_free_inode(struct inode *inode); - extern int ceph_drop_inode(struct inode *inode); - -@@ -1000,7 +1005,7 @@ extern void ceph_add_cap(struct inode *inode, - unsigned cap, unsigned seq, u64 realmino, int flags, - struct ceph_cap **new_cap); - extern void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release); --extern void __ceph_remove_caps(struct inode* inode); -+extern void __ceph_remove_caps(struct ceph_inode_info *ci); - extern void ceph_put_cap(struct ceph_mds_client *mdsc, - struct ceph_cap *cap); - extern int ceph_is_any_caps(struct inode *inode); -diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c -index 0cc42c8879e9..0619adbcbe14 100644 ---- a/fs/ceph/xattr.c -+++ b/fs/ceph/xattr.c -@@ -79,7 +79,7 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, - const char *ns_field = " pool_namespace="; - char buf[128]; - size_t len, total_len = 0; -- int ret; -+ ssize_t ret; - - pool_ns = ceph_try_get_string(ci->i_layout.pool_ns); - -@@ -103,11 +103,8 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, - if (pool_ns) - total_len += strlen(ns_field) + pool_ns->len; - -- if (!size) { -- ret = total_len; -- } else if (total_len > size) { -- ret = -ERANGE; -- } else { -+ ret = total_len; -+ if (size >= total_len) { - memcpy(val, buf, len); - ret = len; - if (pool_name) { -@@ -835,8 +832,11 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value, - if (err) - return err; - err = -ENODATA; -- if (!(vxattr->exists_cb && !vxattr->exists_cb(ci))) -+ if (!(vxattr->exists_cb && !vxattr->exists_cb(ci))) { - err = vxattr->getxattr_cb(ci, value, size); -+ if (size && size < err) -+ err = -ERANGE; -+ } - return err; - } - -diff --git a/fs/cifs/cifs_fs_sb.h b/fs/cifs/cifs_fs_sb.h -index ed49222abecb..afa56237a0c3 100644 ---- a/fs/cifs/cifs_fs_sb.h -+++ b/fs/cifs/cifs_fs_sb.h -@@ -83,5 +83,10 @@ struct cifs_sb_info { - * failover properly. - */ - char *origin_fullpath; /* \\HOST\SHARE\[OPTIONAL PATH] */ -+ /* -+ * Indicate whether serverino option was turned off later -+ * (cifs_autodisable_serverino) in order to match new mounts. -+ */ -+ bool mnt_cifs_serverino_autodisabled; - }; - #endif /* _CIFS_FS_SB_H */ -diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c -index 8dd6637a3cbb..18c7c6b2fe08 100644 ---- a/fs/cifs/connect.c -+++ b/fs/cifs/connect.c -@@ -706,10 +706,10 @@ static bool - server_unresponsive(struct TCP_Server_Info *server) - { - /* -- * We need to wait 2 echo intervals to make sure we handle such -+ * We need to wait 3 echo intervals to make sure we handle such - * situations right: - * 1s client sends a normal SMB request -- * 2s client gets a response -+ * 3s client gets a response - * 30s echo workqueue job pops, and decides we got a response recently - * and don't need to send another - * ... -@@ -718,9 +718,9 @@ server_unresponsive(struct TCP_Server_Info *server) - */ - if ((server->tcpStatus == CifsGood || - server->tcpStatus == CifsNeedNegotiate) && -- time_after(jiffies, server->lstrp + 2 * server->echo_interval)) { -+ time_after(jiffies, server->lstrp + 3 * server->echo_interval)) { - cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n", -- server->hostname, (2 * server->echo_interval) / HZ); -+ server->hostname, (3 * server->echo_interval) / HZ); - cifs_reconnect(server); - wake_up(&server->response_q); - return true; -@@ -1223,11 +1223,11 @@ cifs_demultiplex_thread(void *p) - atomic_read(&midCount)); - cifs_dump_mem("Received Data is: ", bufs[i], - HEADER_SIZE(server)); -+ smb2_add_credits_from_hdr(bufs[i], server); - #ifdef CONFIG_CIFS_DEBUG2 - if (server->ops->dump_detail) - server->ops->dump_detail(bufs[i], - server); -- smb2_add_credits_from_hdr(bufs[i], server); - cifs_dump_mids(server); - #endif /* CIFS_DEBUG2 */ - } -@@ -3460,12 +3460,16 @@ compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data) - { - struct cifs_sb_info *old = CIFS_SB(sb); - struct cifs_sb_info *new = mnt_data->cifs_sb; -+ unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK; -+ unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK; - - if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK)) - return 0; - -- if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) != -- (new->mnt_cifs_flags & CIFS_MOUNT_MASK)) -+ if (old->mnt_cifs_serverino_autodisabled) -+ newflags &= ~CIFS_MOUNT_SERVER_INUM; -+ -+ if (oldflags != newflags) - return 0; - - /* -@@ -4459,11 +4463,13 @@ cifs_are_all_path_components_accessible(struct TCP_Server_Info *server, - unsigned int xid, - struct cifs_tcon *tcon, - struct cifs_sb_info *cifs_sb, -- char *full_path) -+ char *full_path, -+ int added_treename) - { - int rc; - char *s; - char sep, tmp; -+ int skip = added_treename ? 1 : 0; - - sep = CIFS_DIR_SEP(cifs_sb); - s = full_path; -@@ -4478,7 +4484,14 @@ cifs_are_all_path_components_accessible(struct TCP_Server_Info *server, - /* next separator */ - while (*s && *s != sep) - s++; -- -+ /* -+ * if the treename is added, we then have to skip the first -+ * part within the separators -+ */ -+ if (skip) { -+ skip = 0; -+ continue; -+ } - /* - * temporarily null-terminate the path at the end of - * the current component -@@ -4526,8 +4539,7 @@ static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol, - - if (rc != -EREMOTE) { - rc = cifs_are_all_path_components_accessible(server, xid, tcon, -- cifs_sb, -- full_path); -+ cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS); - if (rc != 0) { - cifs_dbg(VFS, "cannot query dirs between root and final path, " - "enabling CIFS_MOUNT_USE_PREFIX_PATH\n"); -diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c -index d7cc62252634..efaf7a3631ba 100644 ---- a/fs/cifs/inode.c -+++ b/fs/cifs/inode.c -@@ -2408,6 +2408,8 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) - struct inode *inode = d_inode(direntry); - struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); - struct cifsInodeInfo *cifsInode = CIFS_I(inode); -+ struct cifsFileInfo *wfile; -+ struct cifs_tcon *tcon; - char *full_path = NULL; - int rc = -EACCES; - __u32 dosattr = 0; -@@ -2454,6 +2456,20 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) - mapping_set_error(inode->i_mapping, rc); - rc = 0; - -+ if (attrs->ia_valid & ATTR_MTIME) { -+ rc = cifs_get_writable_file(cifsInode, false, &wfile); -+ if (!rc) { -+ tcon = tlink_tcon(wfile->tlink); -+ rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid); -+ cifsFileInfo_put(wfile); -+ if (rc) -+ return rc; -+ } else if (rc != -EBADF) -+ return rc; -+ else -+ rc = 0; -+ } -+ - if (attrs->ia_valid & ATTR_SIZE) { - rc = cifs_set_file_size(inode, attrs, xid, full_path); - if (rc != 0) -diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c -index b1a696a73f7c..f383877a6511 100644 ---- a/fs/cifs/misc.c -+++ b/fs/cifs/misc.c -@@ -539,6 +539,7 @@ cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb) - tcon = cifs_sb_master_tcon(cifs_sb); - - cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM; -+ cifs_sb->mnt_cifs_serverino_autodisabled = true; - cifs_dbg(VFS, "Autodisabling the use of server inode numbers on %s.\n", - tcon ? tcon->treeName : "new server"); - cifs_dbg(VFS, "The server doesn't seem to support them properly or the files might be on different servers (DFS).\n"); -diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c -index 278405d26c47..d8d9cdfa30b6 100644 ---- a/fs/cifs/smb2inode.c -+++ b/fs/cifs/smb2inode.c -@@ -120,6 +120,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, - SMB2_O_INFO_FILE, 0, - sizeof(struct smb2_file_all_info) + - PATH_MAX * 2, 0, NULL); -+ if (rc) -+ goto finished; - smb2_set_next_command(tcon, &rqst[num_rqst]); - smb2_set_related(&rqst[num_rqst++]); - trace_smb3_query_info_compound_enter(xid, ses->Suid, tcon->tid, -@@ -147,6 +149,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, - COMPOUND_FID, current->tgid, - FILE_DISPOSITION_INFORMATION, - SMB2_O_INFO_FILE, 0, data, size); -+ if (rc) -+ goto finished; - smb2_set_next_command(tcon, &rqst[num_rqst]); - smb2_set_related(&rqst[num_rqst++]); - trace_smb3_rmdir_enter(xid, ses->Suid, tcon->tid, full_path); -@@ -163,6 +167,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, - COMPOUND_FID, current->tgid, - FILE_END_OF_FILE_INFORMATION, - SMB2_O_INFO_FILE, 0, data, size); -+ if (rc) -+ goto finished; - smb2_set_next_command(tcon, &rqst[num_rqst]); - smb2_set_related(&rqst[num_rqst++]); - trace_smb3_set_eof_enter(xid, ses->Suid, tcon->tid, full_path); -@@ -180,6 +186,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, - COMPOUND_FID, current->tgid, - FILE_BASIC_INFORMATION, - SMB2_O_INFO_FILE, 0, data, size); -+ if (rc) -+ goto finished; - smb2_set_next_command(tcon, &rqst[num_rqst]); - smb2_set_related(&rqst[num_rqst++]); - trace_smb3_set_info_compound_enter(xid, ses->Suid, tcon->tid, -@@ -206,6 +214,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, - COMPOUND_FID, current->tgid, - FILE_RENAME_INFORMATION, - SMB2_O_INFO_FILE, 0, data, size); -+ if (rc) -+ goto finished; - smb2_set_next_command(tcon, &rqst[num_rqst]); - smb2_set_related(&rqst[num_rqst++]); - trace_smb3_rename_enter(xid, ses->Suid, tcon->tid, full_path); -@@ -231,6 +241,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, - COMPOUND_FID, current->tgid, - FILE_LINK_INFORMATION, - SMB2_O_INFO_FILE, 0, data, size); -+ if (rc) -+ goto finished; - smb2_set_next_command(tcon, &rqst[num_rqst]); - smb2_set_related(&rqst[num_rqst++]); - trace_smb3_hardlink_enter(xid, ses->Suid, tcon->tid, full_path); -diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c -index 9fd56b0acd7e..2ec37dc589a7 100644 ---- a/fs/cifs/smb2ops.c -+++ b/fs/cifs/smb2ops.c -@@ -694,8 +694,51 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) - - smb2_set_related(&rqst[1]); - -+ /* -+ * We do not hold the lock for the open because in case -+ * SMB2_open needs to reconnect, it will end up calling -+ * cifs_mark_open_files_invalid() which takes the lock again -+ * thus causing a deadlock -+ */ -+ -+ mutex_unlock(&tcon->crfid.fid_mutex); - rc = compound_send_recv(xid, ses, flags, 2, rqst, - resp_buftype, rsp_iov); -+ mutex_lock(&tcon->crfid.fid_mutex); -+ -+ /* -+ * Now we need to check again as the cached root might have -+ * been successfully re-opened from a concurrent process -+ */ -+ -+ if (tcon->crfid.is_valid) { -+ /* work was already done */ -+ -+ /* stash fids for close() later */ -+ struct cifs_fid fid = { -+ .persistent_fid = pfid->persistent_fid, -+ .volatile_fid = pfid->volatile_fid, -+ }; -+ -+ /* -+ * caller expects this func to set pfid to a valid -+ * cached root, so we copy the existing one and get a -+ * reference. -+ */ -+ memcpy(pfid, tcon->crfid.fid, sizeof(*pfid)); -+ kref_get(&tcon->crfid.refcount); -+ -+ mutex_unlock(&tcon->crfid.fid_mutex); -+ -+ if (rc == 0) { -+ /* close extra handle outside of crit sec */ -+ SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); -+ } -+ goto oshr_free; -+ } -+ -+ /* Cached root is still invalid, continue normaly */ -+ - if (rc) - goto oshr_exit; - -@@ -729,8 +772,9 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) - (char *)&tcon->crfid.file_all_info)) - tcon->crfid.file_all_info_is_valid = 1; - -- oshr_exit: -+oshr_exit: - mutex_unlock(&tcon->crfid.fid_mutex); -+oshr_free: - SMB2_open_free(&rqst[0]); - SMB2_query_info_free(&rqst[1]); - free_rsp_buf(resp_buftype[0], rsp_iov[0].iov_base); -@@ -2027,6 +2071,10 @@ smb2_set_related(struct smb_rqst *rqst) - struct smb2_sync_hdr *shdr; - - shdr = (struct smb2_sync_hdr *)(rqst->rq_iov[0].iov_base); -+ if (shdr == NULL) { -+ cifs_dbg(FYI, "shdr NULL in smb2_set_related\n"); -+ return; -+ } - shdr->Flags |= SMB2_FLAGS_RELATED_OPERATIONS; - } - -@@ -2041,6 +2089,12 @@ smb2_set_next_command(struct cifs_tcon *tcon, struct smb_rqst *rqst) - unsigned long len = smb_rqst_len(server, rqst); - int i, num_padding; - -+ shdr = (struct smb2_sync_hdr *)(rqst->rq_iov[0].iov_base); -+ if (shdr == NULL) { -+ cifs_dbg(FYI, "shdr NULL in smb2_set_next_command\n"); -+ return; -+ } -+ - /* SMB headers in a compound are 8 byte aligned. */ - - /* No padding needed */ -@@ -2080,7 +2134,6 @@ smb2_set_next_command(struct cifs_tcon *tcon, struct smb_rqst *rqst) - } - - finished: -- shdr = (struct smb2_sync_hdr *)(rqst->rq_iov[0].iov_base); - shdr->NextCommand = cpu_to_le32(len); - } - -diff --git a/fs/coda/file.c b/fs/coda/file.c -index 1cbc1f2298ee..43d371551d2b 100644 ---- a/fs/coda/file.c -+++ b/fs/coda/file.c -@@ -27,6 +27,13 @@ - #include "coda_linux.h" - #include "coda_int.h" - -+struct coda_vm_ops { -+ atomic_t refcnt; -+ struct file *coda_file; -+ const struct vm_operations_struct *host_vm_ops; -+ struct vm_operations_struct vm_ops; -+}; -+ - static ssize_t - coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to) - { -@@ -61,6 +68,34 @@ coda_file_write_iter(struct kiocb *iocb, struct iov_iter *to) - return ret; - } - -+static void -+coda_vm_open(struct vm_area_struct *vma) -+{ -+ struct coda_vm_ops *cvm_ops = -+ container_of(vma->vm_ops, struct coda_vm_ops, vm_ops); -+ -+ atomic_inc(&cvm_ops->refcnt); -+ -+ if (cvm_ops->host_vm_ops && cvm_ops->host_vm_ops->open) -+ cvm_ops->host_vm_ops->open(vma); -+} -+ -+static void -+coda_vm_close(struct vm_area_struct *vma) -+{ -+ struct coda_vm_ops *cvm_ops = -+ container_of(vma->vm_ops, struct coda_vm_ops, vm_ops); -+ -+ if (cvm_ops->host_vm_ops && cvm_ops->host_vm_ops->close) -+ cvm_ops->host_vm_ops->close(vma); -+ -+ if (atomic_dec_and_test(&cvm_ops->refcnt)) { -+ vma->vm_ops = cvm_ops->host_vm_ops; -+ fput(cvm_ops->coda_file); -+ kfree(cvm_ops); -+ } -+} -+ - static int - coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) - { -@@ -68,6 +103,8 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) - struct coda_inode_info *cii; - struct file *host_file; - struct inode *coda_inode, *host_inode; -+ struct coda_vm_ops *cvm_ops; -+ int ret; - - cfi = CODA_FTOC(coda_file); - BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); -@@ -76,6 +113,13 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) - if (!host_file->f_op->mmap) - return -ENODEV; - -+ if (WARN_ON(coda_file != vma->vm_file)) -+ return -EIO; -+ -+ cvm_ops = kmalloc(sizeof(struct coda_vm_ops), GFP_KERNEL); -+ if (!cvm_ops) -+ return -ENOMEM; -+ - coda_inode = file_inode(coda_file); - host_inode = file_inode(host_file); - -@@ -89,6 +133,7 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) - * the container file on us! */ - else if (coda_inode->i_mapping != host_inode->i_mapping) { - spin_unlock(&cii->c_lock); -+ kfree(cvm_ops); - return -EBUSY; - } - -@@ -97,7 +142,29 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) - cfi->cfi_mapcount++; - spin_unlock(&cii->c_lock); - -- return call_mmap(host_file, vma); -+ vma->vm_file = get_file(host_file); -+ ret = call_mmap(vma->vm_file, vma); -+ -+ if (ret) { -+ /* if call_mmap fails, our caller will put coda_file so we -+ * should drop the reference to the host_file that we got. -+ */ -+ fput(host_file); -+ kfree(cvm_ops); -+ } else { -+ /* here we add redirects for the open/close vm_operations */ -+ cvm_ops->host_vm_ops = vma->vm_ops; -+ if (vma->vm_ops) -+ cvm_ops->vm_ops = *vma->vm_ops; -+ -+ cvm_ops->vm_ops.open = coda_vm_open; -+ cvm_ops->vm_ops.close = coda_vm_close; -+ cvm_ops->coda_file = coda_file; -+ atomic_set(&cvm_ops->refcnt, 1); -+ -+ vma->vm_ops = &cvm_ops->vm_ops; -+ } -+ return ret; - } - - int coda_open(struct inode *coda_inode, struct file *coda_file) -@@ -207,4 +274,3 @@ const struct file_operations coda_file_operations = { - .fsync = coda_fsync, - .splice_read = generic_file_splice_read, - }; -- -diff --git a/fs/coda/psdev.c b/fs/coda/psdev.c -index 0ceef32e6fae..241f7e04ad04 100644 ---- a/fs/coda/psdev.c -+++ b/fs/coda/psdev.c -@@ -182,8 +182,11 @@ static ssize_t coda_psdev_write(struct file *file, const char __user *buf, - if (req->uc_opcode == CODA_OPEN_BY_FD) { - struct coda_open_by_fd_out *outp = - (struct coda_open_by_fd_out *)req->uc_data; -- if (!outp->oh.result) -+ if (!outp->oh.result) { - outp->fh = fget(outp->fd); -+ if (!outp->fh) -+ return -EBADF; -+ } - } - - wake_up(&req->uc_sleep); -diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c -index 6e30949d9f77..a7ec2d3dff92 100644 ---- a/fs/compat_ioctl.c -+++ b/fs/compat_ioctl.c -@@ -638,9 +638,6 @@ COMPATIBLE_IOCTL(PPPIOCDISCONN) - COMPATIBLE_IOCTL(PPPIOCATTCHAN) - COMPATIBLE_IOCTL(PPPIOCGCHAN) - COMPATIBLE_IOCTL(PPPIOCGL2TPSTATS) --/* PPPOX */ --COMPATIBLE_IOCTL(PPPOEIOCSFWD) --COMPATIBLE_IOCTL(PPPOEIOCDFWD) - /* Big A */ - /* sparc only */ - /* Big Q for sound/OSS */ -diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c -index 335a362ee446..6f753198eeef 100644 ---- a/fs/crypto/crypto.c -+++ b/fs/crypto/crypto.c -@@ -154,7 +154,10 @@ int fscrypt_do_page_crypto(const struct inode *inode, fscrypt_direction_t rw, - struct crypto_skcipher *tfm = ci->ci_ctfm; - int res = 0; - -- BUG_ON(len == 0); -+ if (WARN_ON_ONCE(len <= 0)) -+ return -EINVAL; -+ if (WARN_ON_ONCE(len % FS_CRYPTO_BLOCK_SIZE != 0)) -+ return -EINVAL; - - fscrypt_generate_iv(&iv, lblk_num, ci); - -@@ -238,8 +241,6 @@ struct page *fscrypt_encrypt_page(const struct inode *inode, - struct page *ciphertext_page = page; - int err; - -- BUG_ON(len % FS_CRYPTO_BLOCK_SIZE != 0); -- - if (inode->i_sb->s_cop->flags & FS_CFLG_OWN_PAGES) { - /* with inplace-encryption we just encrypt the page */ - err = fscrypt_do_page_crypto(inode, FS_ENCRYPT, lblk_num, page, -@@ -251,7 +252,8 @@ struct page *fscrypt_encrypt_page(const struct inode *inode, - return ciphertext_page; - } - -- BUG_ON(!PageLocked(page)); -+ if (WARN_ON_ONCE(!PageLocked(page))) -+ return ERR_PTR(-EINVAL); - - ctx = fscrypt_get_ctx(gfp_flags); - if (IS_ERR(ctx)) -@@ -299,8 +301,9 @@ EXPORT_SYMBOL(fscrypt_encrypt_page); - int fscrypt_decrypt_page(const struct inode *inode, struct page *page, - unsigned int len, unsigned int offs, u64 lblk_num) - { -- if (!(inode->i_sb->s_cop->flags & FS_CFLG_OWN_PAGES)) -- BUG_ON(!PageLocked(page)); -+ if (WARN_ON_ONCE(!PageLocked(page) && -+ !(inode->i_sb->s_cop->flags & FS_CFLG_OWN_PAGES))) -+ return -EINVAL; - - return fscrypt_do_page_crypto(inode, FS_DECRYPT, lblk_num, page, page, - len, offs, GFP_NOFS); -diff --git a/fs/crypto/policy.c b/fs/crypto/policy.c -index d536889ac31b..4941fe8471ce 100644 ---- a/fs/crypto/policy.c -+++ b/fs/crypto/policy.c -@@ -81,6 +81,8 @@ int fscrypt_ioctl_set_policy(struct file *filp, const void __user *arg) - if (ret == -ENODATA) { - if (!S_ISDIR(inode->i_mode)) - ret = -ENOTDIR; -+ else if (IS_DEADDIR(inode)) -+ ret = -ENOENT; - else if (!inode->i_sb->s_cop->empty_dir(inode)) - ret = -ENOTEMPTY; - else -diff --git a/fs/dax.c b/fs/dax.c -index d2c90bf1969a..7d0e99982d48 100644 ---- a/fs/dax.c -+++ b/fs/dax.c -@@ -123,6 +123,15 @@ static int dax_is_empty_entry(void *entry) - return xa_to_value(entry) & DAX_EMPTY; - } - -+/* -+ * true if the entry that was found is of a smaller order than the entry -+ * we were looking for -+ */ -+static bool dax_is_conflict(void *entry) -+{ -+ return entry == XA_RETRY_ENTRY; -+} -+ - /* - * DAX page cache entry locking - */ -@@ -195,11 +204,13 @@ static void dax_wake_entry(struct xa_state *xas, void *entry, bool wake_all) - * Look up entry in page cache, wait for it to become unlocked if it - * is a DAX entry and return it. The caller must subsequently call - * put_unlocked_entry() if it did not lock the entry or dax_unlock_entry() -- * if it did. -+ * if it did. The entry returned may have a larger order than @order. -+ * If @order is larger than the order of the entry found in i_pages, this -+ * function returns a dax_is_conflict entry. - * - * Must be called with the i_pages lock held. - */ --static void *get_unlocked_entry(struct xa_state *xas) -+static void *get_unlocked_entry(struct xa_state *xas, unsigned int order) - { - void *entry; - struct wait_exceptional_entry_queue ewait; -@@ -210,6 +221,8 @@ static void *get_unlocked_entry(struct xa_state *xas) - - for (;;) { - entry = xas_find_conflict(xas); -+ if (dax_entry_order(entry) < order) -+ return XA_RETRY_ENTRY; - if (!entry || WARN_ON_ONCE(!xa_is_value(entry)) || - !dax_is_locked(entry)) - return entry; -@@ -254,7 +267,7 @@ static void wait_entry_unlocked(struct xa_state *xas, void *entry) - static void put_unlocked_entry(struct xa_state *xas, void *entry) - { - /* If we were the only waiter woken, wake the next one */ -- if (entry) -+ if (entry && !dax_is_conflict(entry)) - dax_wake_entry(xas, entry, false); - } - -@@ -461,7 +474,7 @@ void dax_unlock_page(struct page *page, dax_entry_t cookie) - * overlap with xarray value entries. - */ - static void *grab_mapping_entry(struct xa_state *xas, -- struct address_space *mapping, unsigned long size_flag) -+ struct address_space *mapping, unsigned int order) - { - unsigned long index = xas->xa_index; - bool pmd_downgrade = false; /* splitting PMD entry into PTE entries? */ -@@ -469,20 +482,17 @@ static void *grab_mapping_entry(struct xa_state *xas, - - retry: - xas_lock_irq(xas); -- entry = get_unlocked_entry(xas); -+ entry = get_unlocked_entry(xas, order); - - if (entry) { -+ if (dax_is_conflict(entry)) -+ goto fallback; - if (!xa_is_value(entry)) { - xas_set_err(xas, EIO); - goto out_unlock; - } - -- if (size_flag & DAX_PMD) { -- if (dax_is_pte_entry(entry)) { -- put_unlocked_entry(xas, entry); -- goto fallback; -- } -- } else { /* trying to grab a PTE entry */ -+ if (order == 0) { - if (dax_is_pmd_entry(entry) && - (dax_is_zero_entry(entry) || - dax_is_empty_entry(entry))) { -@@ -523,7 +533,11 @@ static void *grab_mapping_entry(struct xa_state *xas, - if (entry) { - dax_lock_entry(xas, entry); - } else { -- entry = dax_make_entry(pfn_to_pfn_t(0), size_flag | DAX_EMPTY); -+ unsigned long flags = DAX_EMPTY; -+ -+ if (order > 0) -+ flags |= DAX_PMD; -+ entry = dax_make_entry(pfn_to_pfn_t(0), flags); - dax_lock_entry(xas, entry); - if (xas_error(xas)) - goto out_unlock; -@@ -594,7 +608,7 @@ struct page *dax_layout_busy_page(struct address_space *mapping) - if (WARN_ON_ONCE(!xa_is_value(entry))) - continue; - if (unlikely(dax_is_locked(entry))) -- entry = get_unlocked_entry(&xas); -+ entry = get_unlocked_entry(&xas, 0); - if (entry) - page = dax_busy_page(entry); - put_unlocked_entry(&xas, entry); -@@ -621,7 +635,7 @@ static int __dax_invalidate_entry(struct address_space *mapping, - void *entry; - - xas_lock_irq(&xas); -- entry = get_unlocked_entry(&xas); -+ entry = get_unlocked_entry(&xas, 0); - if (!entry || WARN_ON_ONCE(!xa_is_value(entry))) - goto out; - if (!trunc && -@@ -848,7 +862,7 @@ static int dax_writeback_one(struct xa_state *xas, struct dax_device *dax_dev, - if (unlikely(dax_is_locked(entry))) { - void *old_entry = entry; - -- entry = get_unlocked_entry(xas); -+ entry = get_unlocked_entry(xas, 0); - - /* Entry got punched out / reallocated? */ - if (!entry || WARN_ON_ONCE(!xa_is_value(entry))) -@@ -1509,7 +1523,7 @@ static vm_fault_t dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp, - * entry is already in the array, for instance), it will return - * VM_FAULT_FALLBACK. - */ -- entry = grab_mapping_entry(&xas, mapping, DAX_PMD); -+ entry = grab_mapping_entry(&xas, mapping, PMD_ORDER); - if (xa_is_internal(entry)) { - result = xa_to_internal(entry); - goto fallback; -@@ -1658,11 +1672,10 @@ dax_insert_pfn_mkwrite(struct vm_fault *vmf, pfn_t pfn, unsigned int order) - vm_fault_t ret; - - xas_lock_irq(&xas); -- entry = get_unlocked_entry(&xas); -+ entry = get_unlocked_entry(&xas, order); - /* Did we race with someone splitting entry or so? */ -- if (!entry || -- (order == 0 && !dax_is_pte_entry(entry)) || -- (order == PMD_ORDER && !dax_is_pmd_entry(entry))) { -+ if (!entry || dax_is_conflict(entry) || -+ (order == 0 && !dax_is_pte_entry(entry))) { - put_unlocked_entry(&xas, entry); - xas_unlock_irq(&xas); - trace_dax_insert_pfn_mkwrite_no_entry(mapping->host, vmf, -diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c -index 114ebfe30929..3951d39b9b75 100644 ---- a/fs/dlm/lowcomms.c -+++ b/fs/dlm/lowcomms.c -@@ -1628,8 +1628,10 @@ static void clean_writequeues(void) - - static void work_stop(void) - { -- destroy_workqueue(recv_workqueue); -- destroy_workqueue(send_workqueue); -+ if (recv_workqueue) -+ destroy_workqueue(recv_workqueue); -+ if (send_workqueue) -+ destroy_workqueue(send_workqueue); - } - - static int work_start(void) -@@ -1689,13 +1691,17 @@ static void work_flush(void) - struct hlist_node *n; - struct connection *con; - -- flush_workqueue(recv_workqueue); -- flush_workqueue(send_workqueue); -+ if (recv_workqueue) -+ flush_workqueue(recv_workqueue); -+ if (send_workqueue) -+ flush_workqueue(send_workqueue); - do { - ok = 1; - foreach_conn(stop_conn); -- flush_workqueue(recv_workqueue); -- flush_workqueue(send_workqueue); -+ if (recv_workqueue) -+ flush_workqueue(recv_workqueue); -+ if (send_workqueue) -+ flush_workqueue(send_workqueue); - for (i = 0; i < CONN_HASH_SIZE && ok; i++) { - hlist_for_each_entry_safe(con, n, - &connection_hash[i], list) { -diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c -index 91d65f337d87..54bfa71ffdad 100644 ---- a/fs/ecryptfs/crypto.c -+++ b/fs/ecryptfs/crypto.c -@@ -1004,8 +1004,10 @@ int ecryptfs_read_and_validate_header_region(struct inode *inode) - - rc = ecryptfs_read_lower(file_size, 0, ECRYPTFS_SIZE_AND_MARKER_BYTES, - inode); -- if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES) -- return rc >= 0 ? -EINVAL : rc; -+ if (rc < 0) -+ return rc; -+ else if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES) -+ return -EINVAL; - rc = ecryptfs_validate_marker(marker); - if (!rc) - ecryptfs_i_size_init(file_size, inode); -@@ -1367,8 +1369,10 @@ int ecryptfs_read_and_validate_xattr_region(struct dentry *dentry, - ecryptfs_inode_to_lower(inode), - ECRYPTFS_XATTR_NAME, file_size, - ECRYPTFS_SIZE_AND_MARKER_BYTES); -- if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES) -- return rc >= 0 ? -EINVAL : rc; -+ if (rc < 0) -+ return rc; -+ else if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES) -+ return -EINVAL; - rc = ecryptfs_validate_marker(marker); - if (!rc) - ecryptfs_i_size_init(file_size, inode); -diff --git a/fs/exec.c b/fs/exec.c -index 89a500bb897a..32eb9ca496a3 100644 ---- a/fs/exec.c -+++ b/fs/exec.c -@@ -64,6 +64,8 @@ - #include - #include - -+#include -+ - #include - #include - #include -@@ -869,8 +871,10 @@ static struct file *do_open_execat(int fd, struct filename *name, int flags) - if (err) - goto exit; - -- if (name->name[0] != '\0') -+ if (name->name[0] != '\0') { - fsnotify_open(file); -+ trace_open_exec(name->name); -+ } - - out: - return file; -@@ -1828,7 +1832,7 @@ static int __do_execve_file(int fd, struct filename *filename, - membarrier_execve(current); - rseq_execve(current); - acct_update_integrals(current); -- task_numa_free(current); -+ task_numa_free(current, false); - free_bprm(bprm); - kfree(pathbuf); - if (filename) -diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c -index c7843b149a1e..92042f073d58 100644 ---- a/fs/ext4/dir.c -+++ b/fs/ext4/dir.c -@@ -109,7 +109,6 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) - struct inode *inode = file_inode(file); - struct super_block *sb = inode->i_sb; - struct buffer_head *bh = NULL; -- int dir_has_error = 0; - struct fscrypt_str fstr = FSTR_INIT(NULL, 0); - - if (IS_ENCRYPTED(inode)) { -@@ -145,8 +144,6 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) - return err; - } - -- offset = ctx->pos & (sb->s_blocksize - 1); -- - while (ctx->pos < inode->i_size) { - struct ext4_map_blocks map; - -@@ -155,9 +152,18 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) - goto errout; - } - cond_resched(); -+ offset = ctx->pos & (sb->s_blocksize - 1); - map.m_lblk = ctx->pos >> EXT4_BLOCK_SIZE_BITS(sb); - map.m_len = 1; - err = ext4_map_blocks(NULL, inode, &map, 0); -+ if (err == 0) { -+ /* m_len should never be zero but let's avoid -+ * an infinite loop if it somehow is */ -+ if (map.m_len == 0) -+ map.m_len = 1; -+ ctx->pos += map.m_len * sb->s_blocksize; -+ continue; -+ } - if (err > 0) { - pgoff_t index = map.m_pblk >> - (PAGE_SHIFT - inode->i_blkbits); -@@ -176,13 +182,6 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) - } - - if (!bh) { -- if (!dir_has_error) { -- EXT4_ERROR_FILE(file, 0, -- "directory contains a " -- "hole at offset %llu", -- (unsigned long long) ctx->pos); -- dir_has_error = 1; -- } - /* corrupt size? Maybe no more blocks to read */ - if (ctx->pos > inode->i_blocks << 9) - break; -diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h -index 75a5309f2231..ef8fcf7d0d3b 100644 ---- a/fs/ext4/ext4_jbd2.h -+++ b/fs/ext4/ext4_jbd2.h -@@ -361,20 +361,20 @@ static inline int ext4_journal_force_commit(journal_t *journal) - } - - static inline int ext4_jbd2_inode_add_write(handle_t *handle, -- struct inode *inode) -+ struct inode *inode, loff_t start_byte, loff_t length) - { - if (ext4_handle_valid(handle)) -- return jbd2_journal_inode_add_write(handle, -- EXT4_I(inode)->jinode); -+ return jbd2_journal_inode_ranged_write(handle, -+ EXT4_I(inode)->jinode, start_byte, length); - return 0; - } - - static inline int ext4_jbd2_inode_add_wait(handle_t *handle, -- struct inode *inode) -+ struct inode *inode, loff_t start_byte, loff_t length) - { - if (ext4_handle_valid(handle)) -- return jbd2_journal_inode_add_wait(handle, -- EXT4_I(inode)->jinode); -+ return jbd2_journal_inode_ranged_wait(handle, -+ EXT4_I(inode)->jinode, start_byte, length); - return 0; - } - -diff --git a/fs/ext4/file.c b/fs/ext4/file.c -index 2c5baa5e8291..f4a24a46245e 100644 ---- a/fs/ext4/file.c -+++ b/fs/ext4/file.c -@@ -165,6 +165,10 @@ static ssize_t ext4_write_checks(struct kiocb *iocb, struct iov_iter *from) - ret = generic_write_checks(iocb, from); - if (ret <= 0) - return ret; -+ -+ if (unlikely(IS_IMMUTABLE(inode))) -+ return -EPERM; -+ - /* - * If we have encountered a bitmap-format file, the size limit - * is smaller than s_maxbytes, which is for extent-mapped files. -diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c -index c7f77c643008..85c648289b57 100644 ---- a/fs/ext4/inode.c -+++ b/fs/ext4/inode.c -@@ -731,10 +731,16 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode, - !(flags & EXT4_GET_BLOCKS_ZERO) && - !ext4_is_quota_file(inode) && - ext4_should_order_data(inode)) { -+ loff_t start_byte = -+ (loff_t)map->m_lblk << inode->i_blkbits; -+ loff_t length = (loff_t)map->m_len << inode->i_blkbits; -+ - if (flags & EXT4_GET_BLOCKS_IO_SUBMIT) -- ret = ext4_jbd2_inode_add_wait(handle, inode); -+ ret = ext4_jbd2_inode_add_wait(handle, inode, -+ start_byte, length); - else -- ret = ext4_jbd2_inode_add_write(handle, inode); -+ ret = ext4_jbd2_inode_add_write(handle, inode, -+ start_byte, length); - if (ret) - return ret; - } -@@ -4085,7 +4091,8 @@ static int __ext4_block_zero_page_range(handle_t *handle, - err = 0; - mark_buffer_dirty(bh); - if (ext4_should_order_data(inode)) -- err = ext4_jbd2_inode_add_write(handle, inode); -+ err = ext4_jbd2_inode_add_write(handle, inode, from, -+ length); - } - - unlock: -@@ -5520,6 +5527,14 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) - if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) - return -EIO; - -+ if (unlikely(IS_IMMUTABLE(inode))) -+ return -EPERM; -+ -+ if (unlikely(IS_APPEND(inode) && -+ (ia_valid & (ATTR_MODE | ATTR_UID | -+ ATTR_GID | ATTR_TIMES_SET)))) -+ return -EPERM; -+ - error = setattr_prepare(dentry, attr); - if (error) - return error; -@@ -6190,6 +6205,9 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf) - get_block_t *get_block; - int retries = 0; - -+ if (unlikely(IS_IMMUTABLE(inode))) -+ return VM_FAULT_SIGBUS; -+ - sb_start_pagefault(inode->i_sb); - file_update_time(vma->vm_file); - -diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c -index e486e49b31ed..7af835ac8d23 100644 ---- a/fs/ext4/ioctl.c -+++ b/fs/ext4/ioctl.c -@@ -269,6 +269,29 @@ static int uuid_is_zero(__u8 u[16]) - } - #endif - -+/* -+ * If immutable is set and we are not clearing it, we're not allowed to change -+ * anything else in the inode. Don't error out if we're only trying to set -+ * immutable on an immutable file. -+ */ -+static int ext4_ioctl_check_immutable(struct inode *inode, __u32 new_projid, -+ unsigned int flags) -+{ -+ struct ext4_inode_info *ei = EXT4_I(inode); -+ unsigned int oldflags = ei->i_flags; -+ -+ if (!(oldflags & EXT4_IMMUTABLE_FL) || !(flags & EXT4_IMMUTABLE_FL)) -+ return 0; -+ -+ if ((oldflags & ~EXT4_IMMUTABLE_FL) != (flags & ~EXT4_IMMUTABLE_FL)) -+ return -EPERM; -+ if (ext4_has_feature_project(inode->i_sb) && -+ __kprojid_val(ei->i_projid) != new_projid) -+ return -EPERM; -+ -+ return 0; -+} -+ - static int ext4_ioctl_setflags(struct inode *inode, - unsigned int flags) - { -@@ -340,6 +363,20 @@ static int ext4_ioctl_setflags(struct inode *inode, - } - } - -+ /* -+ * Wait for all pending directio and then flush all the dirty pages -+ * for this file. The flush marks all the pages readonly, so any -+ * subsequent attempt to write to the file (particularly mmap pages) -+ * will come through the filesystem and fail. -+ */ -+ if (S_ISREG(inode->i_mode) && !IS_IMMUTABLE(inode) && -+ (flags & EXT4_IMMUTABLE_FL)) { -+ inode_dio_wait(inode); -+ err = filemap_write_and_wait(inode->i_mapping); -+ if (err) -+ goto flags_out; -+ } -+ - handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); - if (IS_ERR(handle)) { - err = PTR_ERR(handle); -@@ -769,7 +806,11 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) - return err; - - inode_lock(inode); -- err = ext4_ioctl_setflags(inode, flags); -+ err = ext4_ioctl_check_immutable(inode, -+ from_kprojid(&init_user_ns, ei->i_projid), -+ flags); -+ if (!err) -+ err = ext4_ioctl_setflags(inode, flags); - inode_unlock(inode); - mnt_drop_write_file(filp); - return err; -@@ -1139,6 +1180,9 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) - goto out; - flags = (ei->i_flags & ~EXT4_FL_XFLAG_VISIBLE) | - (flags & EXT4_FL_XFLAG_VISIBLE); -+ err = ext4_ioctl_check_immutable(inode, fa.fsx_projid, flags); -+ if (err) -+ goto out; - err = ext4_ioctl_setflags(inode, flags); - if (err) - goto out; -diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c -index 1083a9f3f16a..c7ded4e2adff 100644 ---- a/fs/ext4/move_extent.c -+++ b/fs/ext4/move_extent.c -@@ -390,7 +390,8 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode, - - /* Even in case of data=writeback it is reasonable to pin - * inode to transaction, to prevent unexpected data loss */ -- *err = ext4_jbd2_inode_add_write(handle, orig_inode); -+ *err = ext4_jbd2_inode_add_write(handle, orig_inode, -+ (loff_t)orig_page_offset << PAGE_SHIFT, replaced_size); - - unlock_pages: - unlock_page(pagep[0]); -diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c -index cd01c4a67ffb..771fe02f317d 100644 ---- a/fs/ext4/namei.c -+++ b/fs/ext4/namei.c -@@ -82,8 +82,18 @@ static struct buffer_head *ext4_append(handle_t *handle, - static int ext4_dx_csum_verify(struct inode *inode, - struct ext4_dir_entry *dirent); - -+/* -+ * Hints to ext4_read_dirblock regarding whether we expect a directory -+ * block being read to be an index block, or a block containing -+ * directory entries (and if the latter, whether it was found via a -+ * logical block in an htree index block). This is used to control -+ * what sort of sanity checkinig ext4_read_dirblock() will do on the -+ * directory block read from the storage device. EITHER will means -+ * the caller doesn't know what kind of directory block will be read, -+ * so no specific verification will be done. -+ */ - typedef enum { -- EITHER, INDEX, DIRENT -+ EITHER, INDEX, DIRENT, DIRENT_HTREE - } dirblock_type_t; - - #define ext4_read_dirblock(inode, block, type) \ -@@ -109,11 +119,14 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode, - - return bh; - } -- if (!bh) { -+ if (!bh && (type == INDEX || type == DIRENT_HTREE)) { - ext4_error_inode(inode, func, line, block, -- "Directory hole found"); -+ "Directory hole found for htree %s block", -+ (type == INDEX) ? "index" : "leaf"); - return ERR_PTR(-EFSCORRUPTED); - } -+ if (!bh) -+ return NULL; - dirent = (struct ext4_dir_entry *) bh->b_data; - /* Determine whether or not we have an index block */ - if (is_dx(inode)) { -@@ -980,7 +993,7 @@ static int htree_dirblock_to_tree(struct file *dir_file, - - dxtrace(printk(KERN_INFO "In htree dirblock_to_tree: block %lu\n", - (unsigned long)block)); -- bh = ext4_read_dirblock(dir, block, DIRENT); -+ bh = ext4_read_dirblock(dir, block, DIRENT_HTREE); - if (IS_ERR(bh)) - return PTR_ERR(bh); - -@@ -1586,7 +1599,7 @@ static struct buffer_head * ext4_dx_find_entry(struct inode *dir, - return (struct buffer_head *) frame; - do { - block = dx_get_block(frame->at); -- bh = ext4_read_dirblock(dir, block, DIRENT); -+ bh = ext4_read_dirblock(dir, block, DIRENT_HTREE); - if (IS_ERR(bh)) - goto errout; - -@@ -2170,6 +2183,11 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, - blocks = dir->i_size >> sb->s_blocksize_bits; - for (block = 0; block < blocks; block++) { - bh = ext4_read_dirblock(dir, block, DIRENT); -+ if (bh == NULL) { -+ bh = ext4_bread(handle, dir, block, -+ EXT4_GET_BLOCKS_CREATE); -+ goto add_to_new_block; -+ } - if (IS_ERR(bh)) { - retval = PTR_ERR(bh); - bh = NULL; -@@ -2190,6 +2208,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, - brelse(bh); - } - bh = ext4_append(handle, dir, &block); -+add_to_new_block: - if (IS_ERR(bh)) { - retval = PTR_ERR(bh); - bh = NULL; -@@ -2234,7 +2253,7 @@ static int ext4_dx_add_entry(handle_t *handle, struct ext4_filename *fname, - return PTR_ERR(frame); - entries = frame->entries; - at = frame->at; -- bh = ext4_read_dirblock(dir, dx_get_block(frame->at), DIRENT); -+ bh = ext4_read_dirblock(dir, dx_get_block(frame->at), DIRENT_HTREE); - if (IS_ERR(bh)) { - err = PTR_ERR(bh); - bh = NULL; -@@ -2782,7 +2801,10 @@ bool ext4_empty_dir(struct inode *inode) - EXT4_ERROR_INODE(inode, "invalid size"); - return true; - } -- bh = ext4_read_dirblock(inode, 0, EITHER); -+ /* The first directory block must not be a hole, -+ * so treat it as DIRENT_HTREE -+ */ -+ bh = ext4_read_dirblock(inode, 0, DIRENT_HTREE); - if (IS_ERR(bh)) - return true; - -@@ -2804,6 +2826,10 @@ bool ext4_empty_dir(struct inode *inode) - brelse(bh); - lblock = offset >> EXT4_BLOCK_SIZE_BITS(sb); - bh = ext4_read_dirblock(inode, lblock, EITHER); -+ if (bh == NULL) { -+ offset += sb->s_blocksize; -+ continue; -+ } - if (IS_ERR(bh)) - return true; - de = (struct ext4_dir_entry_2 *) bh->b_data; -@@ -3369,7 +3395,10 @@ static struct buffer_head *ext4_get_first_dir_block(handle_t *handle, - struct buffer_head *bh; - - if (!ext4_has_inline_data(inode)) { -- bh = ext4_read_dirblock(inode, 0, EITHER); -+ /* The first directory block must not be a hole, so -+ * treat it as DIRENT_HTREE -+ */ -+ bh = ext4_read_dirblock(inode, 0, DIRENT_HTREE); - if (IS_ERR(bh)) { - *retval = PTR_ERR(bh); - return NULL; -diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c -index ed70b68b2b38..d0539ddad6e2 100644 ---- a/fs/f2fs/checkpoint.c -+++ b/fs/f2fs/checkpoint.c -@@ -832,17 +832,6 @@ static int get_checkpoint_version(struct f2fs_sb_info *sbi, block_t cp_addr, - return -EINVAL; - } - -- if (__is_set_ckpt_flags(*cp_block, CP_LARGE_NAT_BITMAP_FLAG)) { -- if (crc_offset != CP_MIN_CHKSUM_OFFSET) { -- f2fs_put_page(*cp_page, 1); -- f2fs_msg(sbi->sb, KERN_WARNING, -- "layout of large_nat_bitmap is deprecated, " -- "run fsck to repair, chksum_offset: %zu", -- crc_offset); -- return -EINVAL; -- } -- } -- - crc = f2fs_checkpoint_chksum(sbi, *cp_block); - if (crc != cur_cp_crc(*cp_block)) { - f2fs_put_page(*cp_page, 1); -diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c -index eda4181d2092..923923603a7d 100644 ---- a/fs/f2fs/data.c -+++ b/fs/f2fs/data.c -@@ -2262,6 +2262,9 @@ static inline bool __should_serialize_io(struct inode *inode, - return false; - if (IS_NOQUOTA(inode)) - return false; -+ /* to avoid deadlock in path of data flush */ -+ if (F2FS_I(inode)->cp_task) -+ return false; - if (wbc->sync_mode != WB_SYNC_ALL) - return true; - if (get_dirty_pages(inode) >= SM_I(F2FS_I_SB(inode))->min_seq_blocks) -diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h -index 06b89a9862ab..cbdc2f88a98c 100644 ---- a/fs/f2fs/f2fs.h -+++ b/fs/f2fs/f2fs.h -@@ -1207,6 +1207,7 @@ struct f2fs_sb_info { - /* for inode management */ - struct list_head inode_list[NR_INODE_TYPE]; /* dirty inode list */ - spinlock_t inode_lock[NR_INODE_TYPE]; /* for dirty inode list lock */ -+ struct mutex flush_lock; /* for flush exclusion */ - - /* for extent tree cache */ - struct radix_tree_root extent_tree_root;/* cache extent cache entries */ -@@ -1766,8 +1767,12 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, - - if (!__allow_reserved_blocks(sbi, inode, true)) - avail_user_block_count -= F2FS_OPTION(sbi).root_reserved_blocks; -- if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) -- avail_user_block_count -= sbi->unusable_block_count; -+ if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) { -+ if (avail_user_block_count > sbi->unusable_block_count) -+ avail_user_block_count -= sbi->unusable_block_count; -+ else -+ avail_user_block_count = 0; -+ } - if (unlikely(sbi->total_valid_block_count > avail_user_block_count)) { - diff = sbi->total_valid_block_count - avail_user_block_count; - if (diff > *count) -@@ -1967,7 +1972,7 @@ static inline int inc_valid_node_count(struct f2fs_sb_info *sbi, - struct inode *inode, bool is_inode) - { - block_t valid_block_count; -- unsigned int valid_node_count; -+ unsigned int valid_node_count, user_block_count; - int err; - - if (is_inode) { -@@ -1994,10 +1999,11 @@ static inline int inc_valid_node_count(struct f2fs_sb_info *sbi, - - if (!__allow_reserved_blocks(sbi, inode, false)) - valid_block_count += F2FS_OPTION(sbi).root_reserved_blocks; -+ user_block_count = sbi->user_block_count; - if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) -- valid_block_count += sbi->unusable_block_count; -+ user_block_count -= sbi->unusable_block_count; - -- if (unlikely(valid_block_count > sbi->user_block_count)) { -+ if (unlikely(valid_block_count > user_block_count)) { - spin_unlock(&sbi->stat_lock); - goto enospc; - } -@@ -2198,7 +2204,7 @@ static inline bool is_idle(struct f2fs_sb_info *sbi, int type) - get_pages(sbi, F2FS_DIO_WRITE)) - return false; - -- if (SM_I(sbi) && SM_I(sbi)->dcc_info && -+ if (type != DISCARD_TIME && SM_I(sbi) && SM_I(sbi)->dcc_info && - atomic_read(&SM_I(sbi)->dcc_info->queued_discard)) - return false; - -diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c -index 8dee063c833f..ce15fbcd7cff 100644 ---- a/fs/f2fs/segment.c -+++ b/fs/f2fs/segment.c -@@ -546,9 +546,13 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi) - if (test_opt(sbi, DATA_FLUSH)) { - struct blk_plug plug; - -+ mutex_lock(&sbi->flush_lock); -+ - blk_start_plug(&plug); - f2fs_sync_dirty_inodes(sbi, FILE_INODE); - blk_finish_plug(&plug); -+ -+ mutex_unlock(&sbi->flush_lock); - } - f2fs_sync_fs(sbi->sb, true); - stat_inc_bg_cp_count(sbi->stat_info); -@@ -872,7 +876,9 @@ void f2fs_dirty_to_prefree(struct f2fs_sb_info *sbi) - int f2fs_disable_cp_again(struct f2fs_sb_info *sbi) - { - struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); -- block_t ovp = overprovision_segments(sbi) << sbi->log_blocks_per_seg; -+ int ovp_hole_segs = -+ (overprovision_segments(sbi) - reserved_segments(sbi)); -+ block_t ovp_holes = ovp_hole_segs << sbi->log_blocks_per_seg; - block_t holes[2] = {0, 0}; /* DATA and NODE */ - struct seg_entry *se; - unsigned int segno; -@@ -887,10 +893,10 @@ int f2fs_disable_cp_again(struct f2fs_sb_info *sbi) - } - mutex_unlock(&dirty_i->seglist_lock); - -- if (holes[DATA] > ovp || holes[NODE] > ovp) -+ if (holes[DATA] > ovp_holes || holes[NODE] > ovp_holes) - return -EAGAIN; - if (is_sbi_flag_set(sbi, SBI_CP_DISABLED_QUICK) && -- dirty_segments(sbi) > overprovision_segments(sbi)) -+ dirty_segments(sbi) > ovp_hole_segs) - return -EAGAIN; - return 0; - } -@@ -1480,6 +1486,10 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi, - list_for_each_entry_safe(dc, tmp, pend_list, list) { - f2fs_bug_on(sbi, dc->state != D_PREP); - -+ if (dpolicy->timeout != 0 && -+ f2fs_time_over(sbi, dpolicy->timeout)) -+ break; -+ - if (dpolicy->io_aware && i < dpolicy->io_aware_gran && - !is_idle(sbi, DISCARD_TIME)) { - io_interrupted = true; -@@ -3393,6 +3403,11 @@ static int read_compacted_summaries(struct f2fs_sb_info *sbi) - seg_i = CURSEG_I(sbi, i); - segno = le32_to_cpu(ckpt->cur_data_segno[i]); - blk_off = le16_to_cpu(ckpt->cur_data_blkoff[i]); -+ if (blk_off > ENTRIES_IN_SUM) { -+ f2fs_bug_on(sbi, 1); -+ f2fs_put_page(page, 1); -+ return -EFAULT; -+ } - seg_i->next_segno = segno; - reset_curseg(sbi, i, 0); - seg_i->alloc_type = ckpt->alloc_type[i]; -diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c -index 6b959bbb336a..4b47ac994daf 100644 ---- a/fs/f2fs/super.c -+++ b/fs/f2fs/super.c -@@ -2718,6 +2718,15 @@ int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi) - return 1; - } - -+ if (__is_set_ckpt_flags(ckpt, CP_LARGE_NAT_BITMAP_FLAG) && -+ le32_to_cpu(ckpt->checksum_offset) != CP_MIN_CHKSUM_OFFSET) { -+ f2fs_msg(sbi->sb, KERN_WARNING, -+ "layout of large_nat_bitmap is deprecated, " -+ "run fsck to repair, chksum_offset: %u", -+ le32_to_cpu(ckpt->checksum_offset)); -+ return 1; -+ } -+ - if (unlikely(f2fs_cp_error(sbi))) { - f2fs_msg(sbi->sb, KERN_ERR, "A bug case: need to run fsck"); - return 1; -@@ -3287,6 +3296,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) - INIT_LIST_HEAD(&sbi->inode_list[i]); - spin_lock_init(&sbi->inode_lock[i]); - } -+ mutex_init(&sbi->flush_lock); - - f2fs_init_extent_cache_info(sbi); - -diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c -index e41cbe8e81b9..9ebfb1b28430 100644 ---- a/fs/fs-writeback.c -+++ b/fs/fs-writeback.c -@@ -715,6 +715,7 @@ void wbc_detach_inode(struct writeback_control *wbc) - void wbc_account_io(struct writeback_control *wbc, struct page *page, - size_t bytes) - { -+ struct cgroup_subsys_state *css; - int id; - - /* -@@ -726,7 +727,12 @@ void wbc_account_io(struct writeback_control *wbc, struct page *page, - if (!wbc->wb) - return; - -- id = mem_cgroup_css_from_page(page)->id; -+ css = mem_cgroup_css_from_page(page); -+ /* dead cgroups shouldn't contribute to inode ownership arbitration */ -+ if (!(css->flags & CSS_ONLINE)) -+ return; -+ -+ id = css->id; - - if (id == wbc->wb_id) { - wbc->wb_bytes += bytes; -diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c -index 93ea1d529aa3..253e2f939d5f 100644 ---- a/fs/gfs2/bmap.c -+++ b/fs/gfs2/bmap.c -@@ -390,6 +390,19 @@ static int fillup_metapath(struct gfs2_inode *ip, struct metapath *mp, int h) - return mp->mp_aheight - x - 1; - } - -+static sector_t metapath_to_block(struct gfs2_sbd *sdp, struct metapath *mp) -+{ -+ sector_t factor = 1, block = 0; -+ int hgt; -+ -+ for (hgt = mp->mp_fheight - 1; hgt >= 0; hgt--) { -+ if (hgt < mp->mp_aheight) -+ block += mp->mp_list[hgt] * factor; -+ factor *= sdp->sd_inptrs; -+ } -+ return block; -+} -+ - static void release_metapath(struct metapath *mp) - { - int i; -@@ -430,60 +443,84 @@ static inline unsigned int gfs2_extent_length(struct buffer_head *bh, __be64 *pt - return ptr - first; - } - --typedef const __be64 *(*gfs2_metadata_walker)( -- struct metapath *mp, -- const __be64 *start, const __be64 *end, -- u64 factor, void *data); -+enum walker_status { WALK_STOP, WALK_FOLLOW, WALK_CONTINUE }; - --#define WALK_STOP ((__be64 *)0) --#define WALK_NEXT ((__be64 *)1) -+/* -+ * gfs2_metadata_walker - walk an indirect block -+ * @mp: Metapath to indirect block -+ * @ptrs: Number of pointers to look at -+ * -+ * When returning WALK_FOLLOW, the walker must update @mp to point at the right -+ * indirect block to follow. -+ */ -+typedef enum walker_status (*gfs2_metadata_walker)(struct metapath *mp, -+ unsigned int ptrs); - --static int gfs2_walk_metadata(struct inode *inode, sector_t lblock, -- u64 len, struct metapath *mp, gfs2_metadata_walker walker, -- void *data) -+/* -+ * gfs2_walk_metadata - walk a tree of indirect blocks -+ * @inode: The inode -+ * @mp: Starting point of walk -+ * @max_len: Maximum number of blocks to walk -+ * @walker: Called during the walk -+ * -+ * Returns 1 if the walk was stopped by @walker, 0 if we went past @max_len or -+ * past the end of metadata, and a negative error code otherwise. -+ */ -+ -+static int gfs2_walk_metadata(struct inode *inode, struct metapath *mp, -+ u64 max_len, gfs2_metadata_walker walker) - { -- struct metapath clone; - struct gfs2_inode *ip = GFS2_I(inode); - struct gfs2_sbd *sdp = GFS2_SB(inode); -- const __be64 *start, *end, *ptr; - u64 factor = 1; - unsigned int hgt; -- int ret = 0; -+ int ret; - -- for (hgt = ip->i_height - 1; hgt >= mp->mp_aheight; hgt--) -+ /* -+ * The walk starts in the lowest allocated indirect block, which may be -+ * before the position indicated by @mp. Adjust @max_len accordingly -+ * to avoid a short walk. -+ */ -+ for (hgt = mp->mp_fheight - 1; hgt >= mp->mp_aheight; hgt--) { -+ max_len += mp->mp_list[hgt] * factor; -+ mp->mp_list[hgt] = 0; - factor *= sdp->sd_inptrs; -+ } - - for (;;) { -- u64 step; -+ u16 start = mp->mp_list[hgt]; -+ enum walker_status status; -+ unsigned int ptrs; -+ u64 len; - - /* Walk indirect block. */ -- start = metapointer(hgt, mp); -- end = metaend(hgt, mp); -- -- step = (end - start) * factor; -- if (step > len) -- end = start + DIV_ROUND_UP_ULL(len, factor); -- -- ptr = walker(mp, start, end, factor, data); -- if (ptr == WALK_STOP) -+ ptrs = (hgt >= 1 ? sdp->sd_inptrs : sdp->sd_diptrs) - start; -+ len = ptrs * factor; -+ if (len > max_len) -+ ptrs = DIV_ROUND_UP_ULL(max_len, factor); -+ status = walker(mp, ptrs); -+ switch (status) { -+ case WALK_STOP: -+ return 1; -+ case WALK_FOLLOW: -+ BUG_ON(mp->mp_aheight == mp->mp_fheight); -+ ptrs = mp->mp_list[hgt] - start; -+ len = ptrs * factor; - break; -- if (step >= len) -+ case WALK_CONTINUE: - break; -- len -= step; -- if (ptr != WALK_NEXT) { -- BUG_ON(!*ptr); -- mp->mp_list[hgt] += ptr - start; -- goto fill_up_metapath; - } -+ if (len >= max_len) -+ break; -+ max_len -= len; -+ if (status == WALK_FOLLOW) -+ goto fill_up_metapath; - - lower_metapath: - /* Decrease height of metapath. */ -- if (mp != &clone) { -- clone_metapath(&clone, mp); -- mp = &clone; -- } - brelse(mp->mp_bh[hgt]); - mp->mp_bh[hgt] = NULL; -+ mp->mp_list[hgt] = 0; - if (!hgt) - break; - hgt--; -@@ -491,10 +528,7 @@ static int gfs2_walk_metadata(struct inode *inode, sector_t lblock, - - /* Advance in metadata tree. */ - (mp->mp_list[hgt])++; -- start = metapointer(hgt, mp); -- end = metaend(hgt, mp); -- if (start >= end) { -- mp->mp_list[hgt] = 0; -+ if (mp->mp_list[hgt] >= sdp->sd_inptrs) { - if (!hgt) - break; - goto lower_metapath; -@@ -502,44 +536,36 @@ static int gfs2_walk_metadata(struct inode *inode, sector_t lblock, - - fill_up_metapath: - /* Increase height of metapath. */ -- if (mp != &clone) { -- clone_metapath(&clone, mp); -- mp = &clone; -- } - ret = fillup_metapath(ip, mp, ip->i_height - 1); - if (ret < 0) -- break; -+ return ret; - hgt += ret; - for (; ret; ret--) - do_div(factor, sdp->sd_inptrs); - mp->mp_aheight = hgt + 1; - } -- if (mp == &clone) -- release_metapath(mp); -- return ret; -+ return 0; - } - --struct gfs2_hole_walker_args { -- u64 blocks; --}; -- --static const __be64 *gfs2_hole_walker(struct metapath *mp, -- const __be64 *start, const __be64 *end, -- u64 factor, void *data) -+static enum walker_status gfs2_hole_walker(struct metapath *mp, -+ unsigned int ptrs) - { -- struct gfs2_hole_walker_args *args = data; -- const __be64 *ptr; -+ const __be64 *start, *ptr, *end; -+ unsigned int hgt; -+ -+ hgt = mp->mp_aheight - 1; -+ start = metapointer(hgt, mp); -+ end = start + ptrs; - - for (ptr = start; ptr < end; ptr++) { - if (*ptr) { -- args->blocks += (ptr - start) * factor; -+ mp->mp_list[hgt] += ptr - start; - if (mp->mp_aheight == mp->mp_fheight) - return WALK_STOP; -- return ptr; /* increase height */ -+ return WALK_FOLLOW; - } - } -- args->blocks += (end - start) * factor; -- return WALK_NEXT; -+ return WALK_CONTINUE; - } - - /** -@@ -557,12 +583,24 @@ static const __be64 *gfs2_hole_walker(struct metapath *mp, - static int gfs2_hole_size(struct inode *inode, sector_t lblock, u64 len, - struct metapath *mp, struct iomap *iomap) - { -- struct gfs2_hole_walker_args args = { }; -- int ret = 0; -+ struct metapath clone; -+ u64 hole_size; -+ int ret; - -- ret = gfs2_walk_metadata(inode, lblock, len, mp, gfs2_hole_walker, &args); -- if (!ret) -- iomap->length = args.blocks << inode->i_blkbits; -+ clone_metapath(&clone, mp); -+ ret = gfs2_walk_metadata(inode, &clone, len, gfs2_hole_walker); -+ if (ret < 0) -+ goto out; -+ -+ if (ret == 1) -+ hole_size = metapath_to_block(GFS2_SB(inode), &clone) - lblock; -+ else -+ hole_size = len; -+ iomap->length = hole_size << inode->i_blkbits; -+ ret = 0; -+ -+out: -+ release_metapath(&clone); - return ret; - } - -diff --git a/fs/io_uring.c b/fs/io_uring.c -index 4ef62a45045d..3e887a09533b 100644 ---- a/fs/io_uring.c -+++ b/fs/io_uring.c -@@ -231,6 +231,7 @@ struct io_ring_ctx { - struct task_struct *sqo_thread; /* if using sq thread polling */ - struct mm_struct *sqo_mm; - wait_queue_head_t sqo_wait; -+ struct completion sqo_thread_started; - - struct { - /* CQ ring */ -@@ -330,6 +331,9 @@ struct io_kiocb { - #define REQ_F_SEQ_PREV 8 /* sequential with previous */ - #define REQ_F_IO_DRAIN 16 /* drain existing IO first */ - #define REQ_F_IO_DRAINED 32 /* drain done */ -+#define REQ_F_LINK 64 /* linked sqes */ -+#define REQ_F_LINK_DONE 128 /* linked sqes done */ -+#define REQ_F_FAIL_LINK 256 /* fail rest of links */ - u64 user_data; - u32 error; /* iopoll result from callback */ - u32 sequence; -@@ -403,6 +407,7 @@ static struct io_ring_ctx *io_ring_ctx_alloc(struct io_uring_params *p) - ctx->flags = p->flags; - init_waitqueue_head(&ctx->cq_wait); - init_completion(&ctx->ctx_done); -+ init_completion(&ctx->sqo_thread_started); - mutex_init(&ctx->uring_lock); - init_waitqueue_head(&ctx->wait); - for (i = 0; i < ARRAY_SIZE(ctx->pending_async); i++) { -@@ -423,7 +428,7 @@ static inline bool io_sequence_defer(struct io_ring_ctx *ctx, - if ((req->flags & (REQ_F_IO_DRAIN|REQ_F_IO_DRAINED)) != REQ_F_IO_DRAIN) - return false; - -- return req->sequence > ctx->cached_cq_tail + ctx->sq_ring->dropped; -+ return req->sequence != ctx->cached_cq_tail + ctx->sq_ring->dropped; - } - - static struct io_kiocb *io_get_deferred_req(struct io_ring_ctx *ctx) -@@ -996,8 +1001,43 @@ static int io_import_fixed(struct io_ring_ctx *ctx, int rw, - */ - offset = buf_addr - imu->ubuf; - iov_iter_bvec(iter, rw, imu->bvec, imu->nr_bvecs, offset + len); -- if (offset) -- iov_iter_advance(iter, offset); -+ -+ if (offset) { -+ /* -+ * Don't use iov_iter_advance() here, as it's really slow for -+ * using the latter parts of a big fixed buffer - it iterates -+ * over each segment manually. We can cheat a bit here, because -+ * we know that: -+ * -+ * 1) it's a BVEC iter, we set it up -+ * 2) all bvecs are PAGE_SIZE in size, except potentially the -+ * first and last bvec -+ * -+ * So just find our index, and adjust the iterator afterwards. -+ * If the offset is within the first bvec (or the whole first -+ * bvec, just use iov_iter_advance(). This makes it easier -+ * since we can just skip the first segment, which may not -+ * be PAGE_SIZE aligned. -+ */ -+ const struct bio_vec *bvec = imu->bvec; -+ -+ if (offset <= bvec->bv_len) { -+ iov_iter_advance(iter, offset); -+ } else { -+ unsigned long seg_skip; -+ -+ /* skip first vec */ -+ offset -= bvec->bv_len; -+ seg_skip = 1 + (offset >> PAGE_SHIFT); -+ -+ iter->bvec = bvec + seg_skip; -+ iter->nr_segs -= seg_skip; -+ iter->count -= (seg_skip << PAGE_SHIFT); -+ iter->iov_offset = offset & ~PAGE_MASK; -+ if (iter->iov_offset) -+ iter->count -= iter->iov_offset; -+ } -+ } - - /* don't drop a reference to these pages */ - iter->type |= ITER_BVEC_FLAG_NO_REF; -@@ -1487,6 +1527,8 @@ static int io_poll_add(struct io_kiocb *req, const struct io_uring_sqe *sqe) - INIT_LIST_HEAD(&poll->wait.entry); - init_waitqueue_func_entry(&poll->wait, io_poll_wake); - -+ INIT_LIST_HEAD(&req->list); -+ - mask = vfs_poll(poll->file, &ipt.pt) & poll->events; - - spin_lock_irq(&ctx->completion_lock); -@@ -1650,6 +1692,7 @@ static void io_sq_wq_submit_work(struct work_struct *work) - do { - struct sqe_submit *s = &req->submit; - const struct io_uring_sqe *sqe = s->sqe; -+ unsigned int flags = req->flags; - - /* Ensure we clear previously set non-block flag */ - req->rw.ki_flags &= ~IOCB_NOWAIT; -@@ -1694,6 +1737,10 @@ static void io_sq_wq_submit_work(struct work_struct *work) - /* async context always use a copy of the sqe */ - kfree(sqe); - -+ /* req from defer and link list needn't decrease async cnt */ -+ if (flags & (REQ_F_IO_DRAINED | REQ_F_LINK_DONE)) -+ goto out; -+ - if (!async_list) - break; - if (!list_empty(&req_list)) { -@@ -1741,6 +1788,7 @@ static void io_sq_wq_submit_work(struct work_struct *work) - } - } - -+out: - if (cur_mm) { - set_fs(old_fs); - unuse_mm(cur_mm); -@@ -1767,6 +1815,10 @@ static bool io_add_to_prev_work(struct async_list *list, struct io_kiocb *req) - ret = true; - spin_lock(&list->lock); - list_add_tail(&req->list, &list->list); -+ /* -+ * Ensure we see a simultaneous modification from io_sq_wq_submit_work() -+ */ -+ smp_mb(); - if (!atomic_read(&list->cnt)) { - list_del_init(&req->list); - ret = false; -@@ -2009,6 +2061,8 @@ static int io_sq_thread(void *data) - unsigned inflight; - unsigned long timeout; - -+ complete(&ctx->sqo_thread_started); -+ - old_fs = get_fs(); - set_fs(USER_DS); - -@@ -2243,6 +2297,7 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx) - static void io_sq_thread_stop(struct io_ring_ctx *ctx) - { - if (ctx->sqo_thread) { -+ wait_for_completion(&ctx->sqo_thread_started); - /* - * The park is a bit of a work-around, without it we get - * warning spews on shutdown with SQPOLL set and affinity -diff --git a/fs/iomap.c b/fs/iomap.c -index 12654c2e78f8..da961fca3180 100644 ---- a/fs/iomap.c -+++ b/fs/iomap.c -@@ -333,7 +333,7 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data, - if (iop) - atomic_inc(&iop->read_count); - -- if (!ctx->bio || !is_contig || bio_full(ctx->bio)) { -+ if (!ctx->bio || !is_contig || bio_full(ctx->bio, plen)) { - gfp_t gfp = mapping_gfp_constraint(page->mapping, GFP_KERNEL); - int nr_vecs = (length + PAGE_SIZE - 1) >> PAGE_SHIFT; - -diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c -index efd0ce9489ae..668f9021cf11 100644 ---- a/fs/jbd2/commit.c -+++ b/fs/jbd2/commit.c -@@ -187,14 +187,15 @@ static int journal_wait_on_commit_record(journal_t *journal, - * use writepages() because with dealyed allocation we may be doing - * block allocation in writepages(). - */ --static int journal_submit_inode_data_buffers(struct address_space *mapping) -+static int journal_submit_inode_data_buffers(struct address_space *mapping, -+ loff_t dirty_start, loff_t dirty_end) - { - int ret; - struct writeback_control wbc = { - .sync_mode = WB_SYNC_ALL, - .nr_to_write = mapping->nrpages * 2, -- .range_start = 0, -- .range_end = i_size_read(mapping->host), -+ .range_start = dirty_start, -+ .range_end = dirty_end, - }; - - ret = generic_writepages(mapping, &wbc); -@@ -218,6 +219,9 @@ static int journal_submit_data_buffers(journal_t *journal, - - spin_lock(&journal->j_list_lock); - list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { -+ loff_t dirty_start = jinode->i_dirty_start; -+ loff_t dirty_end = jinode->i_dirty_end; -+ - if (!(jinode->i_flags & JI_WRITE_DATA)) - continue; - mapping = jinode->i_vfs_inode->i_mapping; -@@ -230,7 +234,8 @@ static int journal_submit_data_buffers(journal_t *journal, - * only allocated blocks here. - */ - trace_jbd2_submit_inode_data(jinode->i_vfs_inode); -- err = journal_submit_inode_data_buffers(mapping); -+ err = journal_submit_inode_data_buffers(mapping, dirty_start, -+ dirty_end); - if (!ret) - ret = err; - spin_lock(&journal->j_list_lock); -@@ -257,12 +262,16 @@ static int journal_finish_inode_data_buffers(journal_t *journal, - /* For locking, see the comment in journal_submit_data_buffers() */ - spin_lock(&journal->j_list_lock); - list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { -+ loff_t dirty_start = jinode->i_dirty_start; -+ loff_t dirty_end = jinode->i_dirty_end; -+ - if (!(jinode->i_flags & JI_WAIT_DATA)) - continue; - jinode->i_flags |= JI_COMMIT_RUNNING; - spin_unlock(&journal->j_list_lock); -- err = filemap_fdatawait_keep_errors( -- jinode->i_vfs_inode->i_mapping); -+ err = filemap_fdatawait_range_keep_errors( -+ jinode->i_vfs_inode->i_mapping, dirty_start, -+ dirty_end); - if (!ret) - ret = err; - spin_lock(&journal->j_list_lock); -@@ -282,6 +291,8 @@ static int journal_finish_inode_data_buffers(journal_t *journal, - &jinode->i_transaction->t_inode_list); - } else { - jinode->i_transaction = NULL; -+ jinode->i_dirty_start = 0; -+ jinode->i_dirty_end = 0; - } - } - spin_unlock(&journal->j_list_lock); -diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c -index 43df0c943229..e0382067c824 100644 ---- a/fs/jbd2/journal.c -+++ b/fs/jbd2/journal.c -@@ -94,6 +94,8 @@ EXPORT_SYMBOL(jbd2_journal_try_to_free_buffers); - EXPORT_SYMBOL(jbd2_journal_force_commit); - EXPORT_SYMBOL(jbd2_journal_inode_add_write); - EXPORT_SYMBOL(jbd2_journal_inode_add_wait); -+EXPORT_SYMBOL(jbd2_journal_inode_ranged_write); -+EXPORT_SYMBOL(jbd2_journal_inode_ranged_wait); - EXPORT_SYMBOL(jbd2_journal_init_jbd_inode); - EXPORT_SYMBOL(jbd2_journal_release_jbd_inode); - EXPORT_SYMBOL(jbd2_journal_begin_ordered_truncate); -@@ -2574,6 +2576,8 @@ void jbd2_journal_init_jbd_inode(struct jbd2_inode *jinode, struct inode *inode) - jinode->i_next_transaction = NULL; - jinode->i_vfs_inode = inode; - jinode->i_flags = 0; -+ jinode->i_dirty_start = 0; -+ jinode->i_dirty_end = 0; - INIT_LIST_HEAD(&jinode->i_list); - } - -diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c -index 8ca4fddc705f..990e7b5062e7 100644 ---- a/fs/jbd2/transaction.c -+++ b/fs/jbd2/transaction.c -@@ -2565,7 +2565,7 @@ void jbd2_journal_refile_buffer(journal_t *journal, struct journal_head *jh) - * File inode in the inode list of the handle's transaction - */ - static int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode, -- unsigned long flags) -+ unsigned long flags, loff_t start_byte, loff_t end_byte) - { - transaction_t *transaction = handle->h_transaction; - journal_t *journal; -@@ -2577,26 +2577,17 @@ static int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode, - jbd_debug(4, "Adding inode %lu, tid:%d\n", jinode->i_vfs_inode->i_ino, - transaction->t_tid); - -- /* -- * First check whether inode isn't already on the transaction's -- * lists without taking the lock. Note that this check is safe -- * without the lock as we cannot race with somebody removing inode -- * from the transaction. The reason is that we remove inode from the -- * transaction only in journal_release_jbd_inode() and when we commit -- * the transaction. We are guarded from the first case by holding -- * a reference to the inode. We are safe against the second case -- * because if jinode->i_transaction == transaction, commit code -- * cannot touch the transaction because we hold reference to it, -- * and if jinode->i_next_transaction == transaction, commit code -- * will only file the inode where we want it. -- */ -- if ((jinode->i_transaction == transaction || -- jinode->i_next_transaction == transaction) && -- (jinode->i_flags & flags) == flags) -- return 0; -- - spin_lock(&journal->j_list_lock); - jinode->i_flags |= flags; -+ -+ if (jinode->i_dirty_end) { -+ jinode->i_dirty_start = min(jinode->i_dirty_start, start_byte); -+ jinode->i_dirty_end = max(jinode->i_dirty_end, end_byte); -+ } else { -+ jinode->i_dirty_start = start_byte; -+ jinode->i_dirty_end = end_byte; -+ } -+ - /* Is inode already attached where we need it? */ - if (jinode->i_transaction == transaction || - jinode->i_next_transaction == transaction) -@@ -2631,12 +2622,28 @@ static int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode, - int jbd2_journal_inode_add_write(handle_t *handle, struct jbd2_inode *jinode) - { - return jbd2_journal_file_inode(handle, jinode, -- JI_WRITE_DATA | JI_WAIT_DATA); -+ JI_WRITE_DATA | JI_WAIT_DATA, 0, LLONG_MAX); - } - - int jbd2_journal_inode_add_wait(handle_t *handle, struct jbd2_inode *jinode) - { -- return jbd2_journal_file_inode(handle, jinode, JI_WAIT_DATA); -+ return jbd2_journal_file_inode(handle, jinode, JI_WAIT_DATA, 0, -+ LLONG_MAX); -+} -+ -+int jbd2_journal_inode_ranged_write(handle_t *handle, -+ struct jbd2_inode *jinode, loff_t start_byte, loff_t length) -+{ -+ return jbd2_journal_file_inode(handle, jinode, -+ JI_WRITE_DATA | JI_WAIT_DATA, start_byte, -+ start_byte + length - 1); -+} -+ -+int jbd2_journal_inode_ranged_wait(handle_t *handle, struct jbd2_inode *jinode, -+ loff_t start_byte, loff_t length) -+{ -+ return jbd2_journal_file_inode(handle, jinode, JI_WAIT_DATA, -+ start_byte, start_byte + length - 1); - } - - /* -diff --git a/fs/nfs/client.c b/fs/nfs/client.c -index d7e4f0848e28..4d90f5bf0b0a 100644 ---- a/fs/nfs/client.c -+++ b/fs/nfs/client.c -@@ -406,10 +406,10 @@ struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_init) - clp = nfs_match_client(cl_init); - if (clp) { - spin_unlock(&nn->nfs_client_lock); -- if (IS_ERR(clp)) -- return clp; - if (new) - new->rpc_ops->free_client(new); -+ if (IS_ERR(clp)) -+ return clp; - return nfs_found_client(cl_init, clp); - } - if (new) { -diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c -index 57b6a45576ad..9f44ddc34c7b 100644 ---- a/fs/nfs/dir.c -+++ b/fs/nfs/dir.c -@@ -140,19 +140,12 @@ struct nfs_cache_array { - struct nfs_cache_array_entry array[0]; - }; - --struct readdirvec { -- unsigned long nr; -- unsigned long index; -- struct page *pages[NFS_MAX_READDIR_RAPAGES]; --}; -- - typedef int (*decode_dirent_t)(struct xdr_stream *, struct nfs_entry *, bool); - typedef struct { - struct file *file; - struct page *page; - struct dir_context *ctx; - unsigned long page_index; -- struct readdirvec pvec; - u64 *dir_cookie; - u64 last_cookie; - loff_t current_index; -@@ -532,10 +525,6 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en - struct nfs_cache_array *array; - unsigned int count = 0; - int status; -- int max_rapages = NFS_MAX_READDIR_RAPAGES; -- -- desc->pvec.index = desc->page_index; -- desc->pvec.nr = 0; - - scratch = alloc_page(GFP_KERNEL); - if (scratch == NULL) -@@ -560,40 +549,20 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en - if (desc->plus) - nfs_prime_dcache(file_dentry(desc->file), entry); - -- status = nfs_readdir_add_to_array(entry, desc->pvec.pages[desc->pvec.nr]); -- if (status == -ENOSPC) { -- desc->pvec.nr++; -- if (desc->pvec.nr == max_rapages) -- break; -- status = nfs_readdir_add_to_array(entry, desc->pvec.pages[desc->pvec.nr]); -- } -+ status = nfs_readdir_add_to_array(entry, page); - if (status != 0) - break; - } while (!entry->eof); - -- /* -- * page and desc->pvec.pages[0] are valid, don't need to check -- * whether or not to be NULL. -- */ -- copy_highpage(page, desc->pvec.pages[0]); -- - out_nopages: - if (count == 0 || (status == -EBADCOOKIE && entry->eof != 0)) { -- array = kmap_atomic(desc->pvec.pages[desc->pvec.nr]); -+ array = kmap(page); - array->eof_index = array->size; - status = 0; -- kunmap_atomic(array); -+ kunmap(page); - } - - put_page(scratch); -- -- /* -- * desc->pvec.nr > 0 means at least one page was completely filled, -- * we should return -ENOSPC. Otherwise function -- * nfs_readdir_xdr_to_array will enter infinite loop. -- */ -- if (desc->pvec.nr > 0) -- return -ENOSPC; - return status; - } - -@@ -627,24 +596,6 @@ int nfs_readdir_alloc_pages(struct page **pages, unsigned int npages) - return -ENOMEM; - } - --/* -- * nfs_readdir_rapages_init initialize rapages by nfs_cache_array structure. -- */ --static --void nfs_readdir_rapages_init(nfs_readdir_descriptor_t *desc) --{ -- struct nfs_cache_array *array; -- int max_rapages = NFS_MAX_READDIR_RAPAGES; -- int index; -- -- for (index = 0; index < max_rapages; index++) { -- array = kmap_atomic(desc->pvec.pages[index]); -- memset(array, 0, sizeof(struct nfs_cache_array)); -- array->eof_index = -1; -- kunmap_atomic(array); -- } --} -- - static - int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, struct inode *inode) - { -@@ -655,12 +606,6 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, - int status = -ENOMEM; - unsigned int array_size = ARRAY_SIZE(pages); - -- /* -- * This means we hit readdir rdpages miss, the preallocated rdpages -- * are useless, the preallocate rdpages should be reinitialized. -- */ -- nfs_readdir_rapages_init(desc); -- - entry.prev_cookie = 0; - entry.cookie = desc->last_cookie; - entry.eof = 0; -@@ -721,24 +666,9 @@ int nfs_readdir_filler(void *data, struct page* page) - struct inode *inode = file_inode(desc->file); - int ret; - -- /* -- * If desc->page_index in range desc->pvec.index and -- * desc->pvec.index + desc->pvec.nr, we get readdir cache hit. -- */ -- if (desc->page_index >= desc->pvec.index && -- desc->page_index < (desc->pvec.index + desc->pvec.nr)) { -- /* -- * page and desc->pvec.pages[x] are valid, don't need to check -- * whether or not to be NULL. -- */ -- copy_highpage(page, desc->pvec.pages[desc->page_index - desc->pvec.index]); -- ret = 0; -- } else { -- ret = nfs_readdir_xdr_to_array(desc, page, inode); -- if (ret < 0) -- goto error; -- } -- -+ ret = nfs_readdir_xdr_to_array(desc, page, inode); -+ if (ret < 0) -+ goto error; - SetPageUptodate(page); - - if (invalidate_inode_pages2_range(inode->i_mapping, page->index + 1, -1) < 0) { -@@ -903,7 +833,6 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) - *desc = &my_desc; - struct nfs_open_dir_context *dir_ctx = file->private_data; - int res = 0; -- int max_rapages = NFS_MAX_READDIR_RAPAGES; - - dfprintk(FILE, "NFS: readdir(%pD2) starting at cookie %llu\n", - file, (long long)ctx->pos); -@@ -923,12 +852,6 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) - desc->decode = NFS_PROTO(inode)->decode_dirent; - desc->plus = nfs_use_readdirplus(inode, ctx); - -- res = nfs_readdir_alloc_pages(desc->pvec.pages, max_rapages); -- if (res < 0) -- return -ENOMEM; -- -- nfs_readdir_rapages_init(desc); -- - if (ctx->pos == 0 || nfs_attribute_cache_expired(inode)) - res = nfs_revalidate_mapping(inode, file->f_mapping); - if (res < 0) -@@ -964,7 +887,6 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) - break; - } while (!desc->eof); - out: -- nfs_readdir_free_pages(desc->pvec.pages, max_rapages); - if (res > 0) - res = 0; - dfprintk(FILE, "NFS: readdir(%pD2) returns %d\n", file, res); -diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c -index 19f856f45689..3eda40a320a5 100644 ---- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c -+++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c -@@ -257,7 +257,7 @@ int ff_layout_track_ds_error(struct nfs4_flexfile_layout *flo, - if (status == 0) - return 0; - -- if (mirror->mirror_ds == NULL) -+ if (IS_ERR_OR_NULL(mirror->mirror_ds)) - return -EINVAL; - - dserr = kmalloc(sizeof(*dserr), gfp_flags); -diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c -index 0b4a1a974411..53777813ca95 100644 ---- a/fs/nfs/inode.c -+++ b/fs/nfs/inode.c -@@ -1100,6 +1100,7 @@ int nfs_open(struct inode *inode, struct file *filp) - nfs_fscache_open_file(inode, filp); - return 0; - } -+EXPORT_SYMBOL_GPL(nfs_open); - - /* - * This function is called whenever some part of NFS notices that -diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h -index 498fab72f70b..81e2fdff227e 100644 ---- a/fs/nfs/internal.h -+++ b/fs/nfs/internal.h -@@ -69,8 +69,7 @@ struct nfs_clone_mount { - * Maximum number of pages that readdir can use for creating - * a vmapped array of pages. - */ --#define NFS_MAX_READDIR_PAGES 64 --#define NFS_MAX_READDIR_RAPAGES 8 -+#define NFS_MAX_READDIR_PAGES 8 - - struct nfs_client_initdata { - unsigned long init_flags; -diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c -index cf42a8b939e3..3a507c42c1ca 100644 ---- a/fs/nfs/nfs4file.c -+++ b/fs/nfs/nfs4file.c -@@ -49,7 +49,7 @@ nfs4_file_open(struct inode *inode, struct file *filp) - return err; - - if ((openflags & O_ACCMODE) == 3) -- openflags--; -+ return nfs_open(inode, filp); - - /* We can't create new files here */ - openflags &= ~(O_CREAT|O_EXCL); -diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c -index 83722e936b4a..bfe1f4625f60 100644 ---- a/fs/nfs/pnfs.c -+++ b/fs/nfs/pnfs.c -@@ -1890,7 +1890,7 @@ pnfs_update_layout(struct inode *ino, - spin_unlock(&ino->i_lock); - lseg = ERR_PTR(wait_var_event_killable(&lo->plh_outstanding, - !atomic_read(&lo->plh_outstanding))); -- if (IS_ERR(lseg) || !list_empty(&lo->plh_segs)) -+ if (IS_ERR(lseg)) - goto out_put_layout_hdr; - pnfs_put_layout_hdr(lo); - goto lookup_again; -diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c -index b428c295d13f..5778d1347b35 100644 ---- a/fs/notify/fanotify/fanotify.c -+++ b/fs/notify/fanotify/fanotify.c -@@ -288,10 +288,13 @@ struct fanotify_event *fanotify_alloc_event(struct fsnotify_group *group, - /* - * For queues with unlimited length lost events are not expected and - * can possibly have security implications. Avoid losing events when -- * memory is short. -+ * memory is short. For the limited size queues, avoid OOM killer in the -+ * target monitoring memcg as it may have security repercussion. - */ - if (group->max_events == UINT_MAX) - gfp |= __GFP_NOFAIL; -+ else -+ gfp |= __GFP_RETRY_MAYFAIL; - - /* Whoever is interested in the event, pays for the allocation. */ - memalloc_use_memcg(group->memcg); -diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c -index 2fda08b2b885..d510223d302c 100644 ---- a/fs/notify/inotify/inotify_fsnotify.c -+++ b/fs/notify/inotify/inotify_fsnotify.c -@@ -90,9 +90,13 @@ int inotify_handle_event(struct fsnotify_group *group, - i_mark = container_of(inode_mark, struct inotify_inode_mark, - fsn_mark); - -- /* Whoever is interested in the event, pays for the allocation. */ -+ /* -+ * Whoever is interested in the event, pays for the allocation. Do not -+ * trigger OOM killer in the target monitoring memcg as it may have -+ * security repercussion. -+ */ - memalloc_use_memcg(group->memcg); -- event = kmalloc(alloc_len, GFP_KERNEL_ACCOUNT); -+ event = kmalloc(alloc_len, GFP_KERNEL_ACCOUNT | __GFP_RETRY_MAYFAIL); - memalloc_unuse_memcg(); - - if (unlikely(!event)) { -diff --git a/fs/open.c b/fs/open.c -index b5b80469b93d..f384a1e1c951 100644 ---- a/fs/open.c -+++ b/fs/open.c -@@ -35,6 +35,9 @@ - - #include "internal.h" - -+#define CREATE_TRACE_POINTS -+#include -+ - int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, - struct file *filp) - { -@@ -374,6 +377,25 @@ long do_faccessat(int dfd, const char __user *filename, int mode) - override_cred->cap_permitted; - } - -+ /* -+ * The new set of credentials can *only* be used in -+ * task-synchronous circumstances, and does not need -+ * RCU freeing, unless somebody then takes a separate -+ * reference to it. -+ * -+ * NOTE! This is _only_ true because this credential -+ * is used purely for override_creds() that installs -+ * it as the subjective cred. Other threads will be -+ * accessing ->real_cred, not the subjective cred. -+ * -+ * If somebody _does_ make a copy of this (using the -+ * 'get_current_cred()' function), that will clear the -+ * non_rcu field, because now that other user may be -+ * expecting RCU freeing. But normal thread-synchronous -+ * cred accesses will keep things non-RCY. -+ */ -+ override_cred->non_rcu = 1; -+ - old_cred = override_creds(override_cred); - retry: - res = user_path_at(dfd, filename, lookup_flags, &path); -@@ -1074,6 +1096,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode) - } else { - fsnotify_open(f); - fd_install(fd, f); -+ trace_do_sys_open(tmp->name, flags, mode); - } - } - putname(tmp); -diff --git a/fs/proc/base.c b/fs/proc/base.c -index 255f6754c70d..cd456bb3dc61 100644 ---- a/fs/proc/base.c -+++ b/fs/proc/base.c -@@ -209,12 +209,53 @@ static int proc_root_link(struct dentry *dentry, struct path *path) - return result; - } - -+/* -+ * If the user used setproctitle(), we just get the string from -+ * user space at arg_start, and limit it to a maximum of one page. -+ */ -+static ssize_t get_mm_proctitle(struct mm_struct *mm, char __user *buf, -+ size_t count, unsigned long pos, -+ unsigned long arg_start) -+{ -+ char *page; -+ int ret, got; -+ -+ if (pos >= PAGE_SIZE) -+ return 0; -+ -+ page = (char *)__get_free_page(GFP_KERNEL); -+ if (!page) -+ return -ENOMEM; -+ -+ ret = 0; -+ got = access_remote_vm(mm, arg_start, page, PAGE_SIZE, FOLL_ANON); -+ if (got > 0) { -+ int len = strnlen(page, got); -+ -+ /* Include the NUL character if it was found */ -+ if (len < got) -+ len++; -+ -+ if (len > pos) { -+ len -= pos; -+ if (len > count) -+ len = count; -+ len -= copy_to_user(buf, page+pos, len); -+ if (!len) -+ len = -EFAULT; -+ ret = len; -+ } -+ } -+ free_page((unsigned long)page); -+ return ret; -+} -+ - static ssize_t get_mm_cmdline(struct mm_struct *mm, char __user *buf, - size_t count, loff_t *ppos) - { - unsigned long arg_start, arg_end, env_start, env_end; - unsigned long pos, len; -- char *page; -+ char *page, c; - - /* Check if process spawned far enough to have cmdline. */ - if (!mm->env_end) -@@ -231,28 +272,42 @@ static ssize_t get_mm_cmdline(struct mm_struct *mm, char __user *buf, - return 0; - - /* -- * We have traditionally allowed the user to re-write -- * the argument strings and overflow the end result -- * into the environment section. But only do that if -- * the environment area is contiguous to the arguments. -+ * We allow setproctitle() to overwrite the argument -+ * strings, and overflow past the original end. But -+ * only when it overflows into the environment area. - */ -- if (env_start != arg_end || env_start >= env_end) -+ if (env_start != arg_end || env_end < env_start) - env_start = env_end = arg_end; -- -- /* .. and limit it to a maximum of one page of slop */ -- if (env_end >= arg_end + PAGE_SIZE) -- env_end = arg_end + PAGE_SIZE - 1; -+ len = env_end - arg_start; - - /* We're not going to care if "*ppos" has high bits set */ -- pos = arg_start + *ppos; -- -- /* .. but we do check the result is in the proper range */ -- if (pos < arg_start || pos >= env_end) -+ pos = *ppos; -+ if (pos >= len) -+ return 0; -+ if (count > len - pos) -+ count = len - pos; -+ if (!count) - return 0; - -- /* .. and we never go past env_end */ -- if (env_end - pos < count) -- count = env_end - pos; -+ /* -+ * Magical special case: if the argv[] end byte is not -+ * zero, the user has overwritten it with setproctitle(3). -+ * -+ * Possible future enhancement: do this only once when -+ * pos is 0, and set a flag in the 'struct file'. -+ */ -+ if (access_remote_vm(mm, arg_end-1, &c, 1, FOLL_ANON) == 1 && c) -+ return get_mm_proctitle(mm, buf, count, pos, arg_start); -+ -+ /* -+ * For the non-setproctitle() case we limit things strictly -+ * to the [arg_start, arg_end[ range. -+ */ -+ pos += arg_start; -+ if (pos < arg_start || pos >= arg_end) -+ return 0; -+ if (count > arg_end - pos) -+ count = arg_end - pos; - - page = (char *)__get_free_page(GFP_KERNEL); - if (!page) -@@ -262,48 +317,11 @@ static ssize_t get_mm_cmdline(struct mm_struct *mm, char __user *buf, - while (count) { - int got; - size_t size = min_t(size_t, PAGE_SIZE, count); -- long offset; - -- /* -- * Are we already starting past the official end? -- * We always include the last byte that is *supposed* -- * to be NUL -- */ -- offset = (pos >= arg_end) ? pos - arg_end + 1 : 0; -- -- got = access_remote_vm(mm, pos - offset, page, size + offset, FOLL_ANON); -- if (got <= offset) -+ got = access_remote_vm(mm, pos, page, size, FOLL_ANON); -+ if (got <= 0) - break; -- got -= offset; -- -- /* Don't walk past a NUL character once you hit arg_end */ -- if (pos + got >= arg_end) { -- int n = 0; -- -- /* -- * If we started before 'arg_end' but ended up -- * at or after it, we start the NUL character -- * check at arg_end-1 (where we expect the normal -- * EOF to be). -- * -- * NOTE! This is smaller than 'got', because -- * pos + got >= arg_end -- */ -- if (pos < arg_end) -- n = arg_end - pos - 1; -- -- /* Cut off at first NUL after 'n' */ -- got = n + strnlen(page+n, offset+got-n); -- if (got < offset) -- break; -- got -= offset; -- -- /* Include the NUL if it existed */ -- if (got < size) -- got++; -- } -- -- got -= copy_to_user(buf, page+offset, got); -+ got -= copy_to_user(buf, page, got); - if (unlikely(!got)) { - if (!len) - len = -EFAULT; -@@ -459,7 +477,7 @@ static int proc_pid_schedstat(struct seq_file *m, struct pid_namespace *ns, - seq_puts(m, "0 0 0\n"); - else - seq_printf(m, "%llu %llu %lu\n", -- (unsigned long long)task->se.sum_exec_runtime, -+ (unsigned long long)tsk_seruntime(task), - (unsigned long long)task->sched_info.run_delay, - task->sched_info.pcount); - -@@ -1962,9 +1980,12 @@ static int map_files_d_revalidate(struct dentry *dentry, unsigned int flags) - goto out; - - if (!dname_to_vma_addr(dentry, &vm_start, &vm_end)) { -- down_read(&mm->mmap_sem); -- exact_vma_exists = !!find_exact_vma(mm, vm_start, vm_end); -- up_read(&mm->mmap_sem); -+ status = down_read_killable(&mm->mmap_sem); -+ if (!status) { -+ exact_vma_exists = !!find_exact_vma(mm, vm_start, -+ vm_end); -+ up_read(&mm->mmap_sem); -+ } - } - - mmput(mm); -@@ -2010,8 +2031,11 @@ static int map_files_get_link(struct dentry *dentry, struct path *path) - if (rc) - goto out_mmput; - -+ rc = down_read_killable(&mm->mmap_sem); -+ if (rc) -+ goto out_mmput; -+ - rc = -ENOENT; -- down_read(&mm->mmap_sem); - vma = find_exact_vma(mm, vm_start, vm_end); - if (vma && vma->vm_file) { - *path = vma->vm_file->f_path; -@@ -2107,7 +2131,11 @@ static struct dentry *proc_map_files_lookup(struct inode *dir, - if (!mm) - goto out_put_task; - -- down_read(&mm->mmap_sem); -+ result = ERR_PTR(-EINTR); -+ if (down_read_killable(&mm->mmap_sem)) -+ goto out_put_mm; -+ -+ result = ERR_PTR(-ENOENT); - vma = find_exact_vma(mm, vm_start, vm_end); - if (!vma) - goto out_no_vma; -@@ -2118,6 +2146,7 @@ static struct dentry *proc_map_files_lookup(struct inode *dir, - - out_no_vma: - up_read(&mm->mmap_sem); -+out_put_mm: - mmput(mm); - out_put_task: - put_task_struct(task); -@@ -2160,7 +2189,12 @@ proc_map_files_readdir(struct file *file, struct dir_context *ctx) - mm = get_task_mm(task); - if (!mm) - goto out_put_task; -- down_read(&mm->mmap_sem); -+ -+ ret = down_read_killable(&mm->mmap_sem); -+ if (ret) { -+ mmput(mm); -+ goto out_put_task; -+ } - - nr_files = 0; - -diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c -index c74570736b24..36ad1b0d6259 100644 ---- a/fs/proc/proc_sysctl.c -+++ b/fs/proc/proc_sysctl.c -@@ -499,6 +499,10 @@ static struct inode *proc_sys_make_inode(struct super_block *sb, - - if (root->set_ownership) - root->set_ownership(head, table, &inode->i_uid, &inode->i_gid); -+ else { -+ inode->i_uid = GLOBAL_ROOT_UID; -+ inode->i_gid = GLOBAL_ROOT_GID; -+ } - - return inode; - } -diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c -index 01d4eb0e6bd1..7f84d1477b5b 100644 ---- a/fs/proc/task_mmu.c -+++ b/fs/proc/task_mmu.c -@@ -166,7 +166,11 @@ static void *m_start(struct seq_file *m, loff_t *ppos) - if (!mm || !mmget_not_zero(mm)) - return NULL; - -- down_read(&mm->mmap_sem); -+ if (down_read_killable(&mm->mmap_sem)) { -+ mmput(mm); -+ return ERR_PTR(-EINTR); -+ } -+ - hold_task_mempolicy(priv); - priv->tail_vma = get_gate_vma(mm); - -@@ -828,7 +832,10 @@ static int show_smaps_rollup(struct seq_file *m, void *v) - - memset(&mss, 0, sizeof(mss)); - -- down_read(&mm->mmap_sem); -+ ret = down_read_killable(&mm->mmap_sem); -+ if (ret) -+ goto out_put_mm; -+ - hold_task_mempolicy(priv); - - for (vma = priv->mm->mmap; vma; vma = vma->vm_next) { -@@ -845,8 +852,9 @@ static int show_smaps_rollup(struct seq_file *m, void *v) - - release_task_mempolicy(priv); - up_read(&mm->mmap_sem); -- mmput(mm); - -+out_put_mm: -+ mmput(mm); - out_put_task: - put_task_struct(priv->task); - priv->task = NULL; -@@ -1132,7 +1140,10 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, - goto out_mm; - } - -- down_read(&mm->mmap_sem); -+ if (down_read_killable(&mm->mmap_sem)) { -+ count = -EINTR; -+ goto out_mm; -+ } - tlb_gather_mmu(&tlb, mm, 0, -1); - if (type == CLEAR_REFS_SOFT_DIRTY) { - for (vma = mm->mmap; vma; vma = vma->vm_next) { -@@ -1539,7 +1550,9 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, - /* overflow ? */ - if (end < start_vaddr || end > end_vaddr) - end = end_vaddr; -- down_read(&mm->mmap_sem); -+ ret = down_read_killable(&mm->mmap_sem); -+ if (ret) -+ goto out_free; - ret = walk_page_range(start_vaddr, end, &pagemap_walk); - up_read(&mm->mmap_sem); - start_vaddr = end; -diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c -index 36bf0f2e102e..7907e6419e57 100644 ---- a/fs/proc/task_nommu.c -+++ b/fs/proc/task_nommu.c -@@ -211,7 +211,11 @@ static void *m_start(struct seq_file *m, loff_t *pos) - if (!mm || !mmget_not_zero(mm)) - return NULL; - -- down_read(&mm->mmap_sem); -+ if (down_read_killable(&mm->mmap_sem)) { -+ mmput(mm); -+ return ERR_PTR(-EINTR); -+ } -+ - /* start from the Nth VMA */ - for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) - if (n-- == 0) -diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c -index 89a80b568a17..7fbe8f058220 100644 ---- a/fs/pstore/inode.c -+++ b/fs/pstore/inode.c -@@ -318,22 +318,21 @@ int pstore_mkfile(struct dentry *root, struct pstore_record *record) - goto fail; - inode->i_mode = S_IFREG | 0444; - inode->i_fop = &pstore_file_operations; -- private = kzalloc(sizeof(*private), GFP_KERNEL); -- if (!private) -- goto fail_alloc; -- private->record = record; -- - scnprintf(name, sizeof(name), "%s-%s-%llu%s", - pstore_type_to_name(record->type), - record->psi->name, record->id, - record->compressed ? ".enc.z" : ""); - -+ private = kzalloc(sizeof(*private), GFP_KERNEL); -+ if (!private) -+ goto fail_inode; -+ - dentry = d_alloc_name(root, name); - if (!dentry) - goto fail_private; - -+ private->record = record; - inode->i_size = private->total_size = size; -- - inode->i_private = private; - - if (record->time.tv_sec) -@@ -349,7 +348,7 @@ int pstore_mkfile(struct dentry *root, struct pstore_record *record) - - fail_private: - free_pstore_private(private); --fail_alloc: -+fail_inode: - iput(inode); - - fail: -diff --git a/fs/udf/inode.c b/fs/udf/inode.c -index e7276932e433..9bb18311a22f 100644 ---- a/fs/udf/inode.c -+++ b/fs/udf/inode.c -@@ -470,13 +470,15 @@ static struct buffer_head *udf_getblk(struct inode *inode, udf_pblk_t block, - return NULL; - } - --/* Extend the file by 'blocks' blocks, return the number of extents added */ -+/* Extend the file with new blocks totaling 'new_block_bytes', -+ * return the number of extents added -+ */ - static int udf_do_extend_file(struct inode *inode, - struct extent_position *last_pos, - struct kernel_long_ad *last_ext, -- sector_t blocks) -+ loff_t new_block_bytes) - { -- sector_t add; -+ uint32_t add; - int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK); - struct super_block *sb = inode->i_sb; - struct kernel_lb_addr prealloc_loc = {}; -@@ -486,7 +488,7 @@ static int udf_do_extend_file(struct inode *inode, - - /* The previous extent is fake and we should not extend by anything - * - there's nothing to do... */ -- if (!blocks && fake) -+ if (!new_block_bytes && fake) - return 0; - - iinfo = UDF_I(inode); -@@ -517,13 +519,12 @@ static int udf_do_extend_file(struct inode *inode, - /* Can we merge with the previous extent? */ - if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) == - EXT_NOT_RECORDED_NOT_ALLOCATED) { -- add = ((1 << 30) - sb->s_blocksize - -- (last_ext->extLength & UDF_EXTENT_LENGTH_MASK)) >> -- sb->s_blocksize_bits; -- if (add > blocks) -- add = blocks; -- blocks -= add; -- last_ext->extLength += add << sb->s_blocksize_bits; -+ add = (1 << 30) - sb->s_blocksize - -+ (last_ext->extLength & UDF_EXTENT_LENGTH_MASK); -+ if (add > new_block_bytes) -+ add = new_block_bytes; -+ new_block_bytes -= add; -+ last_ext->extLength += add; - } - - if (fake) { -@@ -544,28 +545,27 @@ static int udf_do_extend_file(struct inode *inode, - } - - /* Managed to do everything necessary? */ -- if (!blocks) -+ if (!new_block_bytes) - goto out; - - /* All further extents will be NOT_RECORDED_NOT_ALLOCATED */ - last_ext->extLocation.logicalBlockNum = 0; - last_ext->extLocation.partitionReferenceNum = 0; -- add = (1 << (30-sb->s_blocksize_bits)) - 1; -- last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | -- (add << sb->s_blocksize_bits); -+ add = (1 << 30) - sb->s_blocksize; -+ last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | add; - - /* Create enough extents to cover the whole hole */ -- while (blocks > add) { -- blocks -= add; -+ while (new_block_bytes > add) { -+ new_block_bytes -= add; - err = udf_add_aext(inode, last_pos, &last_ext->extLocation, - last_ext->extLength, 1); - if (err) - return err; - count++; - } -- if (blocks) { -+ if (new_block_bytes) { - last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | -- (blocks << sb->s_blocksize_bits); -+ new_block_bytes; - err = udf_add_aext(inode, last_pos, &last_ext->extLocation, - last_ext->extLength, 1); - if (err) -@@ -596,6 +596,24 @@ static int udf_do_extend_file(struct inode *inode, - return count; - } - -+/* Extend the final block of the file to final_block_len bytes */ -+static void udf_do_extend_final_block(struct inode *inode, -+ struct extent_position *last_pos, -+ struct kernel_long_ad *last_ext, -+ uint32_t final_block_len) -+{ -+ struct super_block *sb = inode->i_sb; -+ uint32_t added_bytes; -+ -+ added_bytes = final_block_len - -+ (last_ext->extLength & (sb->s_blocksize - 1)); -+ last_ext->extLength += added_bytes; -+ UDF_I(inode)->i_lenExtents += added_bytes; -+ -+ udf_write_aext(inode, last_pos, &last_ext->extLocation, -+ last_ext->extLength, 1); -+} -+ - static int udf_extend_file(struct inode *inode, loff_t newsize) - { - -@@ -605,10 +623,12 @@ static int udf_extend_file(struct inode *inode, loff_t newsize) - int8_t etype; - struct super_block *sb = inode->i_sb; - sector_t first_block = newsize >> sb->s_blocksize_bits, offset; -+ unsigned long partial_final_block; - int adsize; - struct udf_inode_info *iinfo = UDF_I(inode); - struct kernel_long_ad extent; -- int err; -+ int err = 0; -+ int within_final_block; - - if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) - adsize = sizeof(struct short_ad); -@@ -618,18 +638,8 @@ static int udf_extend_file(struct inode *inode, loff_t newsize) - BUG(); - - etype = inode_bmap(inode, first_block, &epos, &eloc, &elen, &offset); -+ within_final_block = (etype != -1); - -- /* File has extent covering the new size (could happen when extending -- * inside a block)? */ -- if (etype != -1) -- return 0; -- if (newsize & (sb->s_blocksize - 1)) -- offset++; -- /* Extended file just to the boundary of the last file block? */ -- if (offset == 0) -- return 0; -- -- /* Truncate is extending the file by 'offset' blocks */ - if ((!epos.bh && epos.offset == udf_file_entry_alloc_offset(inode)) || - (epos.bh && epos.offset == sizeof(struct allocExtDesc))) { - /* File has no extents at all or has empty last -@@ -643,7 +653,22 @@ static int udf_extend_file(struct inode *inode, loff_t newsize) - &extent.extLength, 0); - extent.extLength |= etype << 30; - } -- err = udf_do_extend_file(inode, &epos, &extent, offset); -+ -+ partial_final_block = newsize & (sb->s_blocksize - 1); -+ -+ /* File has extent covering the new size (could happen when extending -+ * inside a block)? -+ */ -+ if (within_final_block) { -+ /* Extending file within the last file block */ -+ udf_do_extend_final_block(inode, &epos, &extent, -+ partial_final_block); -+ } else { -+ loff_t add = ((loff_t)offset << sb->s_blocksize_bits) | -+ partial_final_block; -+ err = udf_do_extend_file(inode, &epos, &extent, add); -+ } -+ - if (err < 0) - goto out; - err = 0; -@@ -745,6 +770,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, - /* Are we beyond EOF? */ - if (etype == -1) { - int ret; -+ loff_t hole_len; - isBeyondEOF = true; - if (count) { - if (c) -@@ -760,7 +786,8 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, - startnum = (offset > 0); - } - /* Create extents for the hole between EOF and offset */ -- ret = udf_do_extend_file(inode, &prev_epos, laarr, offset); -+ hole_len = (loff_t)offset << inode->i_blkbits; -+ ret = udf_do_extend_file(inode, &prev_epos, laarr, hole_len); - if (ret < 0) { - *err = ret; - newblock = 0; -diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c -index 8da5e6637771..11f703d4a605 100644 ---- a/fs/xfs/xfs_aops.c -+++ b/fs/xfs/xfs_aops.c -@@ -782,7 +782,7 @@ xfs_add_to_ioend( - atomic_inc(&iop->write_count); - - if (!merged) { -- if (bio_full(wpc->ioend->io_bio)) -+ if (bio_full(wpc->ioend->io_bio, len)) - xfs_chain_bio(wpc->ioend, wbc, bdev, sector); - bio_add_page(wpc->ioend->io_bio, page, len, poff); - } -diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h -index 0e9bd9c83870..aa6c093d9ce9 100644 ---- a/include/asm-generic/bug.h -+++ b/include/asm-generic/bug.h -@@ -104,8 +104,10 @@ extern void warn_slowpath_null(const char *file, const int line); - warn_slowpath_fmt_taint(__FILE__, __LINE__, taint, arg) - #else - extern __printf(1, 2) void __warn_printk(const char *fmt, ...); --#define __WARN() __WARN_TAINT(TAINT_WARN) --#define __WARN_printf(arg...) do { __warn_printk(arg); __WARN(); } while (0) -+#define __WARN() do { \ -+ printk(KERN_WARNING CUT_HERE); __WARN_TAINT(TAINT_WARN); \ -+} while (0) -+#define __WARN_printf(arg...) __WARN_printf_taint(TAINT_WARN, arg) - #define __WARN_printf_taint(taint, arg...) \ - do { __warn_printk(arg); __WARN_TAINT(taint); } while (0) - #endif -diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h -index c0d4df6a606f..9d3b745c3107 100644 ---- a/include/drm/drm_displayid.h -+++ b/include/drm/drm_displayid.h -@@ -40,6 +40,7 @@ - #define DATA_BLOCK_DISPLAY_INTERFACE 0x0f - #define DATA_BLOCK_STEREO_DISPLAY_INTERFACE 0x10 - #define DATA_BLOCK_TILED_DISPLAY 0x12 -+#define DATA_BLOCK_CTA 0x81 - - #define DATA_BLOCK_VENDOR_SPECIFIC 0x7f - -@@ -90,4 +91,13 @@ struct displayid_detailed_timing_block { - struct displayid_block base; - struct displayid_detailed_timings_1 timings[0]; - }; -+ -+#define for_each_displayid_db(displayid, block, idx, length) \ -+ for ((block) = (struct displayid_block *)&(displayid)[idx]; \ -+ (idx) + sizeof(struct displayid_block) <= (length) && \ -+ (idx) + sizeof(struct displayid_block) + (block)->num_bytes <= (length) && \ -+ (block)->num_bytes > 0; \ -+ (idx) += (block)->num_bytes + sizeof(struct displayid_block), \ -+ (block) = (struct displayid_block *)&(displayid)[idx]) -+ - #endif -diff --git a/include/linux/acpi.h b/include/linux/acpi.h -index d315d86844e4..872ab208c8ad 100644 ---- a/include/linux/acpi.h -+++ b/include/linux/acpi.h -@@ -317,7 +317,10 @@ void acpi_set_irq_model(enum acpi_irq_model_id model, - #ifdef CONFIG_X86_IO_APIC - extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity); - #else --#define acpi_get_override_irq(gsi, trigger, polarity) (-1) -+static inline int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity) -+{ -+ return -1; -+} - #endif - /* - * This function undoes the effect of one call to acpi_register_gsi(). -diff --git a/include/linux/bio.h b/include/linux/bio.h -index f87abaa898f0..e36b8fc1b1c3 100644 ---- a/include/linux/bio.h -+++ b/include/linux/bio.h -@@ -102,9 +102,23 @@ static inline void *bio_data(struct bio *bio) - return NULL; - } - --static inline bool bio_full(struct bio *bio) -+/** -+ * bio_full - check if the bio is full -+ * @bio: bio to check -+ * @len: length of one segment to be added -+ * -+ * Return true if @bio is full and one segment with @len bytes can't be -+ * added to the bio, otherwise return false -+ */ -+static inline bool bio_full(struct bio *bio, unsigned len) - { -- return bio->bi_vcnt >= bio->bi_max_vecs; -+ if (bio->bi_vcnt >= bio->bi_max_vecs) -+ return true; -+ -+ if (bio->bi_iter.bi_size > UINT_MAX - len) -+ return true; -+ -+ return false; - } - - static inline bool bio_next_segment(const struct bio *bio, -diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h -index 592669bcc536..c0106f635540 100644 ---- a/include/linux/blkdev.h -+++ b/include/linux/blkdev.h -@@ -45,7 +45,11 @@ struct blk_queue_stats; - struct blk_stat_callback; - - #define BLKDEV_MIN_RQ 4 -+#ifdef CONFIG_ZEN_INTERACTIVE -+#define BLKDEV_MAX_RQ 512 -+#else - #define BLKDEV_MAX_RQ 128 /* Default maximum */ -+#endif - - /* Must be consistent with blk_mq_poll_stats_bkt() */ - #define BLK_MQ_POLL_STATS_BKTS 16 -@@ -344,6 +348,11 @@ struct queue_limits { - - #ifdef CONFIG_BLK_DEV_ZONED - -+/* -+ * Maximum number of zones to report with a single report zones command. -+ */ -+#define BLK_ZONED_REPORT_MAX_ZONES 8192U -+ - extern unsigned int blkdev_nr_zones(struct block_device *bdev); - extern int blkdev_report_zones(struct block_device *bdev, - sector_t sector, struct blk_zone *zones, -@@ -681,7 +690,7 @@ static inline bool blk_queue_is_zoned(struct request_queue *q) - } - } - --static inline unsigned int blk_queue_zone_sectors(struct request_queue *q) -+static inline sector_t blk_queue_zone_sectors(struct request_queue *q) - { - return blk_queue_is_zoned(q) ? q->limits.chunk_sectors : 0; - } -@@ -1429,7 +1438,7 @@ static inline bool bdev_is_zoned(struct block_device *bdev) - return false; - } - --static inline unsigned int bdev_zone_sectors(struct block_device *bdev) -+static inline sector_t bdev_zone_sectors(struct block_device *bdev) - { - struct request_queue *q = bdev_get_queue(bdev); - -diff --git a/include/linux/ccp.h b/include/linux/ccp.h -index 55cb455cfcb0..a5dfbaf2470d 100644 ---- a/include/linux/ccp.h -+++ b/include/linux/ccp.h -@@ -170,6 +170,8 @@ struct ccp_aes_engine { - enum ccp_aes_mode mode; - enum ccp_aes_action action; - -+ u32 authsize; -+ - struct scatterlist *key; - u32 key_len; /* In bytes */ - -diff --git a/include/linux/coda.h b/include/linux/coda.h -index d30209b9cef8..0ca0c83fdb1c 100644 ---- a/include/linux/coda.h -+++ b/include/linux/coda.h -@@ -58,8 +58,7 @@ Mellon the rights to redistribute these changes without encumbrance. - #ifndef _CODA_HEADER_ - #define _CODA_HEADER_ - --#if defined(__linux__) - typedef unsigned long long u_quad_t; --#endif -+ - #include - #endif -diff --git a/include/linux/coda_psdev.h b/include/linux/coda_psdev.h -index 15170954aa2b..57d2b2faf6a3 100644 ---- a/include/linux/coda_psdev.h -+++ b/include/linux/coda_psdev.h -@@ -19,6 +19,17 @@ struct venus_comm { - struct mutex vc_mutex; - }; - -+/* messages between coda filesystem in kernel and Venus */ -+struct upc_req { -+ struct list_head uc_chain; -+ caddr_t uc_data; -+ u_short uc_flags; -+ u_short uc_inSize; /* Size is at most 5000 bytes */ -+ u_short uc_outSize; -+ u_short uc_opcode; /* copied from data to save lookup */ -+ int uc_unique; -+ wait_queue_head_t uc_sleep; /* process' wait queue */ -+}; - - static inline struct venus_comm *coda_vcp(struct super_block *sb) - { -diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h -index e8579412ad21..d7ee4c6bad48 100644 ---- a/include/linux/compiler-gcc.h -+++ b/include/linux/compiler-gcc.h -@@ -170,3 +170,5 @@ - #else - #define __diag_GCC_8(s) - #endif -+ -+#define __no_fgcse __attribute__((optimize("-fno-gcse"))) -diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h -index 19e58b9138a0..0454d82f8bd8 100644 ---- a/include/linux/compiler_types.h -+++ b/include/linux/compiler_types.h -@@ -187,6 +187,10 @@ struct ftrace_likely_data { - #define asm_volatile_goto(x...) asm goto(x) - #endif - -+#ifndef __no_fgcse -+# define __no_fgcse -+#endif -+ - /* Are two types/vars the same type (ignoring qualifiers)? */ - #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) - -diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h -index 5c6062206760..068793a619ca 100644 ---- a/include/linux/cpuhotplug.h -+++ b/include/linux/cpuhotplug.h -@@ -116,10 +116,10 @@ enum cpuhp_state { - CPUHP_AP_PERF_ARM_ACPI_STARTING, - CPUHP_AP_PERF_ARM_STARTING, - CPUHP_AP_ARM_L2X0_STARTING, -+ CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING, - CPUHP_AP_ARM_ARCH_TIMER_STARTING, - CPUHP_AP_ARM_GLOBAL_TIMER_STARTING, - CPUHP_AP_JCORE_TIMER_STARTING, -- CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING, - CPUHP_AP_ARM_TWD_STARTING, - CPUHP_AP_QCOM_TIMER_STARTING, - CPUHP_AP_TEGRA_TIMER_STARTING, -@@ -176,6 +176,7 @@ enum cpuhp_state { - CPUHP_AP_WATCHDOG_ONLINE, - CPUHP_AP_WORKQUEUE_ONLINE, - CPUHP_AP_RCUTREE_ONLINE, -+ CPUHP_AP_BASE_CACHEINFO_ONLINE, - CPUHP_AP_ONLINE_DYN, - CPUHP_AP_ONLINE_DYN_END = CPUHP_AP_ONLINE_DYN + 30, - CPUHP_AP_X86_HPET_ONLINE, -diff --git a/include/linux/cred.h b/include/linux/cred.h -index 7eb43a038330..f7a30e0099be 100644 ---- a/include/linux/cred.h -+++ b/include/linux/cred.h -@@ -145,7 +145,11 @@ struct cred { - struct user_struct *user; /* real user ID subscription */ - struct user_namespace *user_ns; /* user_ns the caps and keyrings are relative to. */ - struct group_info *group_info; /* supplementary groups for euid/fsgid */ -- struct rcu_head rcu; /* RCU deletion hook */ -+ /* RCU deletion */ -+ union { -+ int non_rcu; /* Can we skip RCU deletion? */ -+ struct rcu_head rcu; /* RCU deletion hook */ -+ }; - } __randomize_layout; - - extern void __put_cred(struct cred *); -@@ -246,6 +250,7 @@ static inline const struct cred *get_cred(const struct cred *cred) - if (!cred) - return cred; - validate_creds(cred); -+ nonconst_cred->non_rcu = 0; - return get_new_cred(nonconst_cred); - } - -@@ -257,6 +262,7 @@ static inline const struct cred *get_cred_rcu(const struct cred *cred) - if (!atomic_inc_not_zero(&nonconst_cred->usage)) - return NULL; - validate_creds(cred); -+ nonconst_cred->non_rcu = 0; - return cred; - } - -diff --git a/include/linux/device.h b/include/linux/device.h -index 4a295e324ac5..b12c586fae28 100644 ---- a/include/linux/device.h -+++ b/include/linux/device.h -@@ -1375,6 +1375,7 @@ extern int (*platform_notify_remove)(struct device *dev); - */ - extern struct device *get_device(struct device *dev); - extern void put_device(struct device *dev); -+extern bool kill_device(struct device *dev); - - #ifdef CONFIG_DEVTMPFS - extern int devtmpfs_create_node(struct device *dev); -diff --git a/include/linux/freezer.h b/include/linux/freezer.h -index 21f5aa0b217f..ee9b46394fdf 100644 ---- a/include/linux/freezer.h -+++ b/include/linux/freezer.h -@@ -297,6 +297,7 @@ static inline void set_freezable(void) {} - #define wait_event_freezekillable_unsafe(wq, condition) \ - wait_event_killable(wq, condition) - -+#define pm_freezing (false) - #endif /* !CONFIG_FREEZER */ - - #endif /* FREEZER_H_INCLUDED */ -diff --git a/include/linux/fs.h b/include/linux/fs.h -index f7fdfe93e25d..5186ac5b2a29 100644 ---- a/include/linux/fs.h -+++ b/include/linux/fs.h -@@ -2615,6 +2615,12 @@ extern struct block_device *blkdev_get_by_path(const char *path, fmode_t mode, - void *holder); - extern struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, - void *holder); -+extern struct block_device *bd_start_claiming(struct block_device *bdev, -+ void *holder); -+extern void bd_finish_claiming(struct block_device *bdev, -+ struct block_device *whole, void *holder); -+extern void bd_abort_claiming(struct block_device *bdev, -+ struct block_device *whole, void *holder); - extern void blkdev_put(struct block_device *bdev, fmode_t mode); - extern int __blkdev_reread_part(struct block_device *bdev); - extern int blkdev_reread_part(struct block_device *bdev); -@@ -2712,6 +2718,8 @@ extern int filemap_flush(struct address_space *); - extern int filemap_fdatawait_keep_errors(struct address_space *mapping); - extern int filemap_fdatawait_range(struct address_space *, loff_t lstart, - loff_t lend); -+extern int filemap_fdatawait_range_keep_errors(struct address_space *mapping, -+ loff_t start_byte, loff_t end_byte); - - static inline int filemap_fdatawait(struct address_space *mapping) - { -diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h -index 9ddcf50a3c59..a7f08fb0f865 100644 ---- a/include/linux/gpio/consumer.h -+++ b/include/linux/gpio/consumer.h -@@ -247,7 +247,7 @@ static inline void gpiod_put(struct gpio_desc *desc) - might_sleep(); - - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - } - - static inline void devm_gpiod_unhinge(struct device *dev, -@@ -256,7 +256,7 @@ static inline void devm_gpiod_unhinge(struct device *dev, - might_sleep(); - - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - } - - static inline void gpiod_put_array(struct gpio_descs *descs) -@@ -264,7 +264,7 @@ static inline void gpiod_put_array(struct gpio_descs *descs) - might_sleep(); - - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(descs); - } - - static inline struct gpio_desc *__must_check -@@ -317,7 +317,7 @@ static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc) - might_sleep(); - - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - } - - static inline void devm_gpiod_put_array(struct device *dev, -@@ -326,32 +326,32 @@ static inline void devm_gpiod_put_array(struct device *dev, - might_sleep(); - - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(descs); - } - - - static inline int gpiod_get_direction(const struct gpio_desc *desc) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return -ENOSYS; - } - static inline int gpiod_direction_input(struct gpio_desc *desc) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return -ENOSYS; - } - static inline int gpiod_direction_output(struct gpio_desc *desc, int value) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return -ENOSYS; - } - static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return -ENOSYS; - } - -@@ -359,7 +359,7 @@ static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value) - static inline int gpiod_get_value(const struct gpio_desc *desc) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return 0; - } - static inline int gpiod_get_array_value(unsigned int array_size, -@@ -368,13 +368,13 @@ static inline int gpiod_get_array_value(unsigned int array_size, - unsigned long *value_bitmap) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc_array); - return 0; - } - static inline void gpiod_set_value(struct gpio_desc *desc, int value) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - } - static inline int gpiod_set_array_value(unsigned int array_size, - struct gpio_desc **desc_array, -@@ -382,13 +382,13 @@ static inline int gpiod_set_array_value(unsigned int array_size, - unsigned long *value_bitmap) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc_array); - return 0; - } - static inline int gpiod_get_raw_value(const struct gpio_desc *desc) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return 0; - } - static inline int gpiod_get_raw_array_value(unsigned int array_size, -@@ -397,13 +397,13 @@ static inline int gpiod_get_raw_array_value(unsigned int array_size, - unsigned long *value_bitmap) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc_array); - return 0; - } - static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - } - static inline int gpiod_set_raw_array_value(unsigned int array_size, - struct gpio_desc **desc_array, -@@ -411,14 +411,14 @@ static inline int gpiod_set_raw_array_value(unsigned int array_size, - unsigned long *value_bitmap) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc_array); - return 0; - } - - static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return 0; - } - static inline int gpiod_get_array_value_cansleep(unsigned int array_size, -@@ -427,13 +427,13 @@ static inline int gpiod_get_array_value_cansleep(unsigned int array_size, - unsigned long *value_bitmap) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc_array); - return 0; - } - static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - } - static inline int gpiod_set_array_value_cansleep(unsigned int array_size, - struct gpio_desc **desc_array, -@@ -441,13 +441,13 @@ static inline int gpiod_set_array_value_cansleep(unsigned int array_size, - unsigned long *value_bitmap) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc_array); - return 0; - } - static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return 0; - } - static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size, -@@ -456,14 +456,14 @@ static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size, - unsigned long *value_bitmap) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc_array); - return 0; - } - static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, - int value) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - } - static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size, - struct gpio_desc **desc_array, -@@ -471,41 +471,41 @@ static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size, - unsigned long *value_bitmap) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc_array); - return 0; - } - - static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return -ENOSYS; - } - - static inline int gpiod_set_transitory(struct gpio_desc *desc, bool transitory) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return -ENOSYS; - } - - static inline int gpiod_is_active_low(const struct gpio_desc *desc) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return 0; - } - static inline int gpiod_cansleep(const struct gpio_desc *desc) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return 0; - } - - static inline int gpiod_to_irq(const struct gpio_desc *desc) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return -EINVAL; - } - -@@ -513,7 +513,7 @@ static inline int gpiod_set_consumer_name(struct gpio_desc *desc, - const char *name) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return -EINVAL; - } - -@@ -525,7 +525,7 @@ static inline struct gpio_desc *gpio_to_desc(unsigned gpio) - static inline int desc_to_gpio(const struct gpio_desc *desc) - { - /* GPIO can never have been requested */ -- WARN_ON(1); -+ WARN_ON(desc); - return -EINVAL; - } - -diff --git a/include/linux/hmm.h b/include/linux/hmm.h -index 044a36d7c3f8..89508dc0795f 100644 ---- a/include/linux/hmm.h -+++ b/include/linux/hmm.h -@@ -93,6 +93,7 @@ struct hmm { - struct mmu_notifier mmu_notifier; - struct rw_semaphore mirrors_sem; - wait_queue_head_t wq; -+ struct rcu_head rcu; - long notifiers; - bool dead; - }; -diff --git a/include/linux/host1x.h b/include/linux/host1x.h -index cfff30b9a62e..e6eea45e1154 100644 ---- a/include/linux/host1x.h -+++ b/include/linux/host1x.h -@@ -297,6 +297,8 @@ struct host1x_device { - struct list_head clients; - - bool registered; -+ -+ struct device_dma_parameters dma_parms; - }; - - static inline struct host1x_device *to_host1x_device(struct device *dev) -diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h -index 8b728750a625..69e813bcb947 100644 ---- a/include/linux/if_pppox.h -+++ b/include/linux/if_pppox.h -@@ -80,6 +80,9 @@ extern int register_pppox_proto(int proto_num, const struct pppox_proto *pp); - extern void unregister_pppox_proto(int proto_num); - extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ - extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); -+extern int pppox_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); -+ -+#define PPPOEIOCSFWD32 _IOW(0xB1 ,0, compat_size_t) - - /* PPPoX socket states */ - enum { -diff --git a/include/linux/init_task.h b/include/linux/init_task.h -index 6049baa5b8bc..9a70cbc958a7 100644 ---- a/include/linux/init_task.h -+++ b/include/linux/init_task.h -@@ -47,7 +47,11 @@ extern struct cred init_cred; - #define INIT_CPU_TIMERS(s) - #endif - -+#ifdef CONFIG_SCHED_MUQSS -+#define INIT_TASK_COMM "MuQSS" -+#else - #define INIT_TASK_COMM "swapper" -+#endif - - /* Attach to the init_task data structure for proper alignment */ - #ifdef CONFIG_ARCH_TASK_STRUCT_ON_STACK -diff --git a/include/linux/ioprio.h b/include/linux/ioprio.h -index e9bfe6972aed..16ba1c7e5bde 100644 ---- a/include/linux/ioprio.h -+++ b/include/linux/ioprio.h -@@ -53,6 +53,8 @@ enum { - */ - static inline int task_nice_ioprio(struct task_struct *task) - { -+ if (iso_task(task)) -+ return 0; - return (task_nice(task) + 20) / 5; - } - -diff --git a/include/linux/iova.h b/include/linux/iova.h -index 781b96ac706f..a0637abffee8 100644 ---- a/include/linux/iova.h -+++ b/include/linux/iova.h -@@ -155,6 +155,7 @@ struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo, - void copy_reserved_iova(struct iova_domain *from, struct iova_domain *to); - void init_iova_domain(struct iova_domain *iovad, unsigned long granule, - unsigned long start_pfn); -+bool has_iova_flush_queue(struct iova_domain *iovad); - int init_iova_flush_queue(struct iova_domain *iovad, - iova_flush_cb flush_cb, iova_entry_dtor entry_dtor); - struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn); -@@ -235,6 +236,11 @@ static inline void init_iova_domain(struct iova_domain *iovad, - { - } - -+static inline bool has_iova_flush_queue(struct iova_domain *iovad) -+{ -+ return false; -+} -+ - static inline int init_iova_flush_queue(struct iova_domain *iovad, - iova_flush_cb flush_cb, - iova_entry_dtor entry_dtor) -diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h -index 5c04181b7c6d..0e0393e7f41a 100644 ---- a/include/linux/jbd2.h -+++ b/include/linux/jbd2.h -@@ -451,6 +451,22 @@ struct jbd2_inode { - * @i_flags: Flags of inode [j_list_lock] - */ - unsigned long i_flags; -+ -+ /** -+ * @i_dirty_start: -+ * -+ * Offset in bytes where the dirty range for this inode starts. -+ * [j_list_lock] -+ */ -+ loff_t i_dirty_start; -+ -+ /** -+ * @i_dirty_end: -+ * -+ * Inclusive offset in bytes where the dirty range for this inode -+ * ends. [j_list_lock] -+ */ -+ loff_t i_dirty_end; - }; - - struct jbd2_revoke_table_s; -@@ -1397,6 +1413,12 @@ extern int jbd2_journal_force_commit(journal_t *); - extern int jbd2_journal_force_commit_nested(journal_t *); - extern int jbd2_journal_inode_add_write(handle_t *handle, struct jbd2_inode *inode); - extern int jbd2_journal_inode_add_wait(handle_t *handle, struct jbd2_inode *inode); -+extern int jbd2_journal_inode_ranged_write(handle_t *handle, -+ struct jbd2_inode *inode, loff_t start_byte, -+ loff_t length); -+extern int jbd2_journal_inode_ranged_wait(handle_t *handle, -+ struct jbd2_inode *inode, loff_t start_byte, -+ loff_t length); - extern int jbd2_journal_begin_ordered_truncate(journal_t *journal, - struct jbd2_inode *inode, loff_t new_size); - extern void jbd2_journal_init_jbd_inode(struct jbd2_inode *jinode, struct inode *inode); -diff --git a/include/linux/linux_logo.h b/include/linux/linux_logo.h -index d4d5b93efe84..0a63e8c0959b 100644 ---- a/include/linux/linux_logo.h -+++ b/include/linux/linux_logo.h -@@ -36,6 +36,18 @@ struct linux_logo { - extern const struct linux_logo logo_linux_mono; - extern const struct linux_logo logo_linux_vga16; - extern const struct linux_logo logo_linux_clut224; -+extern const struct linux_logo logo_zen_clut224; -+extern const struct linux_logo logo_oldzen_clut224; -+extern const struct linux_logo logo_arch_clut224; -+extern const struct linux_logo logo_gentoo_clut224; -+extern const struct linux_logo logo_exherbo_clut224; -+extern const struct linux_logo logo_slackware_clut224; -+extern const struct linux_logo logo_debian_clut224; -+extern const struct linux_logo logo_fedorasimple_clut224; -+extern const struct linux_logo logo_fedoraglossy_clut224; -+extern const struct linux_logo logo_tits_clut224; -+extern const struct linux_logo logo_bsd_clut224; -+extern const struct linux_logo logo_fbsd_clut224; - extern const struct linux_logo logo_dec_clut224; - extern const struct linux_logo logo_mac_clut224; - extern const struct linux_logo logo_parisc_clut224; -diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h -index ae892eef8b82..988fde33cd7f 100644 ---- a/include/linux/memory_hotplug.h -+++ b/include/linux/memory_hotplug.h -@@ -324,7 +324,7 @@ static inline void pgdat_resize_init(struct pglist_data *pgdat) {} - extern bool is_mem_section_removable(unsigned long pfn, unsigned long nr_pages); - extern void try_offline_node(int nid); - extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages); --extern void remove_memory(int nid, u64 start, u64 size); -+extern int remove_memory(int nid, u64 start, u64 size); - extern void __remove_memory(int nid, u64 start, u64 size); - - #else -@@ -341,7 +341,11 @@ static inline int offline_pages(unsigned long start_pfn, unsigned long nr_pages) - return -EINVAL; - } - --static inline void remove_memory(int nid, u64 start, u64 size) {} -+static inline int remove_memory(int nid, u64 start, u64 size) -+{ -+ return -EBUSY; -+} -+ - static inline void __remove_memory(int nid, u64 start, u64 size) {} - #endif /* CONFIG_MEMORY_HOTREMOVE */ - -diff --git a/include/linux/mlx5/fs.h b/include/linux/mlx5/fs.h -index e690ba0f965c..70185079f83e 100644 ---- a/include/linux/mlx5/fs.h -+++ b/include/linux/mlx5/fs.h -@@ -211,6 +211,7 @@ int mlx5_modify_rule_destination(struct mlx5_flow_handle *handler, - - struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging); - void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter); -+u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter); - void mlx5_fc_query_cached(struct mlx5_fc *counter, - u64 *bytes, u64 *packets, u64 *lastuse); - int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter, -diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h -index 5e74305e2e57..29b55f8cd7b3 100644 ---- a/include/linux/mlx5/mlx5_ifc.h -+++ b/include/linux/mlx5/mlx5_ifc.h -@@ -749,7 +749,8 @@ struct mlx5_ifc_per_protocol_networking_offload_caps_bits { - u8 swp[0x1]; - u8 swp_csum[0x1]; - u8 swp_lso[0x1]; -- u8 reserved_at_23[0xd]; -+ u8 cqe_checksum_full[0x1]; -+ u8 reserved_at_24[0xc]; - u8 max_vxlan_udp_ports[0x8]; - u8 reserved_at_38[0x6]; - u8 max_geneve_opt_len[0x1]; -@@ -5864,10 +5865,12 @@ struct mlx5_ifc_modify_cq_in_bits { - - struct mlx5_ifc_cqc_bits cq_context; - -- u8 reserved_at_280[0x40]; -+ u8 reserved_at_280[0x60]; - - u8 cq_umem_valid[0x1]; -- u8 reserved_at_2c1[0x5bf]; -+ u8 reserved_at_2e1[0x1f]; -+ -+ u8 reserved_at_300[0x580]; - - u8 pas[0][0x40]; - }; -diff --git a/include/linux/mm.h b/include/linux/mm.h -index dd0b5f4e1e45..0a6dae2f2b84 100644 ---- a/include/linux/mm.h -+++ b/include/linux/mm.h -@@ -633,6 +633,11 @@ static inline bool is_vmalloc_addr(const void *x) - return false; - #endif - } -+ -+#ifndef is_ioremap_addr -+#define is_ioremap_addr(x) is_vmalloc_addr(x) -+#endif -+ - #ifdef CONFIG_MMU - extern int is_vmalloc_or_module_addr(const void *x); - #else -diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h -index 2bca72f3028b..a9d3fbbab4c1 100644 ---- a/include/linux/perf_event.h -+++ b/include/linux/perf_event.h -@@ -1049,6 +1049,11 @@ static inline int in_software_context(struct perf_event *event) - return event->ctx->pmu->task_ctx_nr == perf_sw_context; - } - -+static inline int is_exclusive_pmu(struct pmu *pmu) -+{ -+ return pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE; -+} -+ - extern struct static_key perf_swevent_enabled[PERF_COUNT_SW_MAX]; - - extern void ___perf_sw_event(u32, u64, struct pt_regs *, u64); -diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h -index b25d20822e75..3508f4508a11 100644 ---- a/include/linux/rcupdate.h -+++ b/include/linux/rcupdate.h -@@ -586,7 +586,7 @@ static inline void rcu_preempt_sleep_check(void) { } - * read-side critical sections may be preempted and they may also block, but - * only when acquiring spinlocks that are subject to priority inheritance. - */ --static inline void rcu_read_lock(void) -+static __always_inline void rcu_read_lock(void) - { - __rcu_read_lock(); - __acquire(RCU); -diff --git a/include/linux/sched.h b/include/linux/sched.h -index 11837410690f..91bb1552f720 100644 ---- a/include/linux/sched.h -+++ b/include/linux/sched.h -@@ -29,6 +29,9 @@ - #include - #include - #include -+#ifdef CONFIG_SCHED_MUQSS -+#include -+#endif - - /* task_struct member predeclarations (sorted alphabetically): */ - struct audit_context; -@@ -217,6 +220,34 @@ extern long schedule_timeout_interruptible(long timeout); - extern long schedule_timeout_killable(long timeout); - extern long schedule_timeout_uninterruptible(long timeout); - extern long schedule_timeout_idle(long timeout); -+ -+#if defined(CONFIG_HIGH_RES_TIMERS) && defined(CONFIG_SCHED_MUQSS) -+extern long schedule_msec_hrtimeout(long timeout); -+extern long schedule_min_hrtimeout(void); -+extern long schedule_msec_hrtimeout_interruptible(long timeout); -+extern long schedule_msec_hrtimeout_uninterruptible(long timeout); -+#else -+static inline long schedule_msec_hrtimeout(long timeout) -+{ -+ return schedule_timeout(msecs_to_jiffies(timeout)); -+} -+ -+static inline long schedule_min_hrtimeout(void) -+{ -+ return schedule_timeout(1); -+} -+ -+static inline long schedule_msec_hrtimeout_interruptible(long timeout) -+{ -+ return schedule_timeout_interruptible(msecs_to_jiffies(timeout)); -+} -+ -+static inline long schedule_msec_hrtimeout_uninterruptible(long timeout) -+{ -+ return schedule_timeout_uninterruptible(msecs_to_jiffies(timeout)); -+} -+#endif -+ - asmlinkage void schedule(void); - extern void schedule_preempt_disabled(void); - -@@ -604,9 +635,11 @@ struct task_struct { - unsigned int flags; - unsigned int ptrace; - -+#if defined(CONFIG_SMP) || defined(CONFIG_SCHED_MUQSS) -+ int on_cpu; -+#endif - #ifdef CONFIG_SMP - struct llist_node wake_entry; -- int on_cpu; - #ifdef CONFIG_THREAD_INFO_IN_TASK - /* Current CPU: */ - unsigned int cpu; -@@ -631,10 +664,25 @@ struct task_struct { - int static_prio; - int normal_prio; - unsigned int rt_priority; -+#ifdef CONFIG_SCHED_MUQSS -+ int time_slice; -+ u64 deadline; -+ skiplist_node node; /* Skip list node */ -+ u64 last_ran; -+ u64 sched_time; /* sched_clock time spent running */ -+#ifdef CONFIG_SMT_NICE -+ int smt_bias; /* Policy/nice level bias across smt siblings */ -+#endif -+#ifdef CONFIG_HOTPLUG_CPU -+ bool zerobound; /* Bound to CPU0 for hotplug */ -+#endif -+ unsigned long rt_timeout; -+#else /* CONFIG_SCHED_MUQSS */ - - const struct sched_class *sched_class; - struct sched_entity se; - struct sched_rt_entity rt; -+#endif - #ifdef CONFIG_CGROUP_SCHED - struct task_group *sched_task_group; - #endif -@@ -791,6 +839,10 @@ struct task_struct { - #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME - u64 utimescaled; - u64 stimescaled; -+#endif -+#ifdef CONFIG_SCHED_MUQSS -+ /* Unbanked cpu time */ -+ unsigned long utime_ns, stime_ns; - #endif - u64 gtime; - struct prev_cputime prev_cputime; -@@ -1026,7 +1078,15 @@ struct task_struct { - u64 last_sum_exec_runtime; - struct callback_head numa_work; - -- struct numa_group *numa_group; -+ /* -+ * This pointer is only modified for current in syscall and -+ * pagefault context (and for tasks being destroyed), so it can be read -+ * from any of the following contexts: -+ * - RCU read-side critical section -+ * - current->numa_group from everywhere -+ * - task's runqueue locked, task not running -+ */ -+ struct numa_group __rcu *numa_group; - - /* - * numa_faults is an array split into four regions: -@@ -1217,6 +1277,40 @@ struct task_struct { - */ - }; - -+#ifdef CONFIG_SCHED_MUQSS -+#define tsk_seruntime(t) ((t)->sched_time) -+#define tsk_rttimeout(t) ((t)->rt_timeout) -+ -+static inline void tsk_cpus_current(struct task_struct *p) -+{ -+} -+ -+void print_scheduler_version(void); -+ -+static inline bool iso_task(struct task_struct *p) -+{ -+ return (p->policy == SCHED_ISO); -+} -+#else /* CFS */ -+#define tsk_seruntime(t) ((t)->se.sum_exec_runtime) -+#define tsk_rttimeout(t) ((t)->rt.timeout) -+ -+static inline void tsk_cpus_current(struct task_struct *p) -+{ -+ p->nr_cpus_allowed = current->nr_cpus_allowed; -+} -+ -+static inline void print_scheduler_version(void) -+{ -+ printk(KERN_INFO "CFS CPU scheduler.\n"); -+} -+ -+static inline bool iso_task(struct task_struct *p) -+{ -+ return false; -+} -+#endif /* CONFIG_SCHED_MUQSS */ -+ - static inline struct pid *task_pid(struct task_struct *task) - { - return task->thread_pid; -diff --git a/include/linux/sched/nohz.h b/include/linux/sched/nohz.h -index b36f4cf38111..61b03ea2edc9 100644 ---- a/include/linux/sched/nohz.h -+++ b/include/linux/sched/nohz.h -@@ -6,7 +6,7 @@ - * This is the interface between the scheduler and nohz/dynticks: - */ - --#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON) -+#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON) && !defined(CONFIG_SCHED_MUQSS) - extern void cpu_load_update_nohz_start(void); - extern void cpu_load_update_nohz_stop(void); - #else -@@ -21,7 +21,7 @@ extern int get_nohz_timer_target(void); - static inline void nohz_balance_enter_idle(int cpu) { } - #endif - --#ifdef CONFIG_NO_HZ_COMMON -+#if defined(CONFIG_NO_HZ_COMMON) && !defined(CONFIG_SCHED_MUQSS) - void calc_load_nohz_start(void); - void calc_load_nohz_stop(void); - #else -diff --git a/include/linux/sched/numa_balancing.h b/include/linux/sched/numa_balancing.h -index e7dd04a84ba8..3988762efe15 100644 ---- a/include/linux/sched/numa_balancing.h -+++ b/include/linux/sched/numa_balancing.h -@@ -19,7 +19,7 @@ - extern void task_numa_fault(int last_node, int node, int pages, int flags); - extern pid_t task_numa_group_id(struct task_struct *p); - extern void set_numabalancing_state(bool enabled); --extern void task_numa_free(struct task_struct *p); -+extern void task_numa_free(struct task_struct *p, bool final); - extern bool should_numa_migrate_memory(struct task_struct *p, struct page *page, - int src_nid, int dst_cpu); - #else -@@ -34,7 +34,7 @@ static inline pid_t task_numa_group_id(struct task_struct *p) - static inline void set_numabalancing_state(bool enabled) - { - } --static inline void task_numa_free(struct task_struct *p) -+static inline void task_numa_free(struct task_struct *p, bool final) - { - } - static inline bool should_numa_migrate_memory(struct task_struct *p, -diff --git a/include/linux/sched/prio.h b/include/linux/sched/prio.h -index 7d64feafc408..43c9d9e50c09 100644 ---- a/include/linux/sched/prio.h -+++ b/include/linux/sched/prio.h -@@ -20,8 +20,20 @@ - */ - - #define MAX_USER_RT_PRIO 100 -+ -+#ifdef CONFIG_SCHED_MUQSS -+/* Note different MAX_RT_PRIO */ -+#define MAX_RT_PRIO (MAX_USER_RT_PRIO + 1) -+ -+#define ISO_PRIO (MAX_RT_PRIO) -+#define NORMAL_PRIO (MAX_RT_PRIO + 1) -+#define IDLE_PRIO (MAX_RT_PRIO + 2) -+#define PRIO_LIMIT ((IDLE_PRIO) + 1) -+#else /* CONFIG_SCHED_MUQSS */ - #define MAX_RT_PRIO MAX_USER_RT_PRIO - -+#endif /* CONFIG_SCHED_MUQSS */ -+ - #define MAX_PRIO (MAX_RT_PRIO + NICE_WIDTH) - #define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH / 2) - -diff --git a/include/linux/sched/rt.h b/include/linux/sched/rt.h -index e5af028c08b4..010b2244e0b6 100644 ---- a/include/linux/sched/rt.h -+++ b/include/linux/sched/rt.h -@@ -24,8 +24,10 @@ static inline bool task_is_realtime(struct task_struct *tsk) - - if (policy == SCHED_FIFO || policy == SCHED_RR) - return true; -+#ifndef CONFIG_SCHED_MUQSS - if (policy == SCHED_DEADLINE) - return true; -+#endif - return false; - } - -diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h -index 38a0f0785323..c68ca81db0a1 100644 ---- a/include/linux/sched/signal.h -+++ b/include/linux/sched/signal.h -@@ -329,7 +329,7 @@ extern void force_sigsegv(int sig, struct task_struct *p); - extern int force_sig_info(int, struct kernel_siginfo *, struct task_struct *); - extern int __kill_pgrp_info(int sig, struct kernel_siginfo *info, struct pid *pgrp); - extern int kill_pid_info(int sig, struct kernel_siginfo *info, struct pid *pid); --extern int kill_pid_info_as_cred(int, struct kernel_siginfo *, struct pid *, -+extern int kill_pid_usb_asyncio(int sig, int errno, sigval_t addr, struct pid *, - const struct cred *); - extern int kill_pgrp(struct pid *pid, int sig, int priv); - extern int kill_pid(struct pid *pid, int sig, int priv); -diff --git a/include/linux/sched/task.h b/include/linux/sched/task.h -index f1227f2c38a4..a531a61a570a 100644 ---- a/include/linux/sched/task.h -+++ b/include/linux/sched/task.h -@@ -83,7 +83,7 @@ extern long kernel_wait4(pid_t, int __user *, int, struct rusage *); - extern void free_task(struct task_struct *tsk); - - /* sched_exec is called by processes performing an exec */ --#ifdef CONFIG_SMP -+#if defined(CONFIG_SMP) && !defined(CONFIG_SCHED_MUQSS) - extern void sched_exec(void); - #else - #define sched_exec() {} -diff --git a/include/linux/skip_list.h b/include/linux/skip_list.h -new file mode 100644 -index 000000000000..d4be84ba273b ---- /dev/null -+++ b/include/linux/skip_list.h -@@ -0,0 +1,33 @@ -+#ifndef _LINUX_SKIP_LISTS_H -+#define _LINUX_SKIP_LISTS_H -+typedef u64 keyType; -+typedef void *valueType; -+ -+typedef struct nodeStructure skiplist_node; -+ -+struct nodeStructure { -+ int level; /* Levels in this structure */ -+ keyType key; -+ valueType value; -+ skiplist_node *next[8]; -+ skiplist_node *prev[8]; -+}; -+ -+typedef struct listStructure { -+ int entries; -+ int level; /* Maximum level of the list -+ (1 more than the number of levels in the list) */ -+ skiplist_node *header; /* pointer to header */ -+} skiplist; -+ -+void skiplist_init(skiplist_node *slnode); -+skiplist *new_skiplist(skiplist_node *slnode); -+void free_skiplist(skiplist *l); -+void skiplist_node_init(skiplist_node *node); -+void skiplist_insert(skiplist *l, skiplist_node *node, keyType key, valueType value, unsigned int randseed); -+void skiplist_delete(skiplist *l, skiplist_node *node); -+ -+static inline bool skiplist_node_empty(skiplist_node *node) { -+ return (!node->next[0]); -+} -+#endif /* _LINUX_SKIP_LISTS_H */ -diff --git a/include/linux/swap.h b/include/linux/swap.h -index 4bfb5c4ac108..6358a6185634 100644 ---- a/include/linux/swap.h -+++ b/include/linux/swap.h -@@ -175,8 +175,9 @@ enum { - SWP_PAGE_DISCARD = (1 << 10), /* freed swap page-cluster discards */ - SWP_STABLE_WRITES = (1 << 11), /* no overwrite PG_writeback pages */ - SWP_SYNCHRONOUS_IO = (1 << 12), /* synchronous IO is efficient */ -+ SWP_VALID = (1 << 13), /* swap is valid to be operated on? */ - /* add others here before... */ -- SWP_SCANNING = (1 << 13), /* refcount in scan_swap_map */ -+ SWP_SCANNING = (1 << 14), /* refcount in scan_swap_map */ - }; - - #define SWAP_CLUSTER_MAX 32UL -@@ -460,7 +461,7 @@ extern unsigned int count_swap_pages(int, int); - extern sector_t map_swap_page(struct page *, struct block_device **); - extern sector_t swapdev_block(int, pgoff_t); - extern int page_swapcount(struct page *); --extern int __swap_count(struct swap_info_struct *si, swp_entry_t entry); -+extern int __swap_count(swp_entry_t entry); - extern int __swp_swapcount(swp_entry_t entry); - extern int swp_swapcount(swp_entry_t entry); - extern struct swap_info_struct *page_swap_info(struct page *); -@@ -470,6 +471,12 @@ extern int try_to_free_swap(struct page *); - struct backing_dev_info; - extern int init_swap_address_space(unsigned int type, unsigned long nr_pages); - extern void exit_swap_address_space(unsigned int type); -+extern struct swap_info_struct *get_swap_device(swp_entry_t entry); -+ -+static inline void put_swap_device(struct swap_info_struct *si) -+{ -+ rcu_read_unlock(); -+} - - #else /* CONFIG_SWAP */ - -@@ -576,7 +583,7 @@ static inline int page_swapcount(struct page *page) - return 0; - } - --static inline int __swap_count(struct swap_info_struct *si, swp_entry_t entry) -+static inline int __swap_count(swp_entry_t entry) - { - return 0; - } -diff --git a/include/linux/thinkpad_ec.h b/include/linux/thinkpad_ec.h -new file mode 100644 -index 000000000000..1b80d7ee5493 ---- /dev/null -+++ b/include/linux/thinkpad_ec.h -@@ -0,0 +1,47 @@ -+/* -+ * thinkpad_ec.h - interface to ThinkPad embedded controller LPC3 functions -+ * -+ * Copyright (C) 2005 Shem Multinymous -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ */ -+ -+#ifndef _THINKPAD_EC_H -+#define _THINKPAD_EC_H -+ -+#ifdef __KERNEL__ -+ -+#define TP_CONTROLLER_ROW_LEN 16 -+ -+/* EC transactions input and output (possibly partial) vectors of 16 bytes. */ -+struct thinkpad_ec_row { -+ u16 mask; /* bitmap of which entries of val[] are meaningful */ -+ u8 val[TP_CONTROLLER_ROW_LEN]; -+}; -+ -+extern int __must_check thinkpad_ec_lock(void); -+extern int __must_check thinkpad_ec_try_lock(void); -+extern void thinkpad_ec_unlock(void); -+ -+extern int thinkpad_ec_read_row(const struct thinkpad_ec_row *args, -+ struct thinkpad_ec_row *data); -+extern int thinkpad_ec_try_read_row(const struct thinkpad_ec_row *args, -+ struct thinkpad_ec_row *mask); -+extern int thinkpad_ec_prefetch_row(const struct thinkpad_ec_row *args); -+extern void thinkpad_ec_invalidate(void); -+ -+ -+#endif /* __KERNEL */ -+#endif /* _THINKPAD_EC_H */ -diff --git a/include/linux/vmw_vmci_defs.h b/include/linux/vmw_vmci_defs.h -index 77ac9c7b9483..762f793e92f6 100644 ---- a/include/linux/vmw_vmci_defs.h -+++ b/include/linux/vmw_vmci_defs.h -@@ -62,9 +62,18 @@ enum { - - /* - * A single VMCI device has an upper limit of 128MB on the amount of -- * memory that can be used for queue pairs. -+ * memory that can be used for queue pairs. Since each queue pair -+ * consists of at least two pages, the memory limit also dictates the -+ * number of queue pairs a guest can create. - */ - #define VMCI_MAX_GUEST_QP_MEMORY (128 * 1024 * 1024) -+#define VMCI_MAX_GUEST_QP_COUNT (VMCI_MAX_GUEST_QP_MEMORY / PAGE_SIZE / 2) -+ -+/* -+ * There can be at most PAGE_SIZE doorbells since there is one doorbell -+ * per byte in the doorbell bitmap page. -+ */ -+#define VMCI_MAX_GUEST_DOORBELL_COUNT PAGE_SIZE - - /* - * Queues with pre-mapped data pages must be small, so that we don't pin -diff --git a/include/net/dst.h b/include/net/dst.h -index 12b31c602cb0..f8206d3fed2f 100644 ---- a/include/net/dst.h -+++ b/include/net/dst.h -@@ -302,8 +302,9 @@ static inline bool dst_hold_safe(struct dst_entry *dst) - * @skb: buffer - * - * If dst is not yet refcounted and not destroyed, grab a ref on it. -+ * Returns true if dst is refcounted. - */ --static inline void skb_dst_force(struct sk_buff *skb) -+static inline bool skb_dst_force(struct sk_buff *skb) - { - if (skb_dst_is_noref(skb)) { - struct dst_entry *dst = skb_dst(skb); -@@ -314,6 +315,8 @@ static inline void skb_dst_force(struct sk_buff *skb) - - skb->_skb_refdst = (unsigned long)dst; - } -+ -+ return skb->_skb_refdst != 0UL; - } - - -diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h -index 2ac40135b576..b36a1df93e7c 100644 ---- a/include/net/ip_vs.h -+++ b/include/net/ip_vs.h -@@ -808,11 +808,12 @@ struct ipvs_master_sync_state { - struct ip_vs_sync_buff *sync_buff; - unsigned long sync_queue_len; - unsigned int sync_queue_delay; -- struct task_struct *master_thread; - struct delayed_work master_wakeup_work; - struct netns_ipvs *ipvs; - }; - -+struct ip_vs_sync_thread_data; -+ - /* How much time to keep dests in trash */ - #define IP_VS_DEST_TRASH_PERIOD (120 * HZ) - -@@ -943,7 +944,8 @@ struct netns_ipvs { - spinlock_t sync_lock; - struct ipvs_master_sync_state *ms; - spinlock_t sync_buff_lock; -- struct task_struct **backup_threads; -+ struct ip_vs_sync_thread_data *master_tinfo; -+ struct ip_vs_sync_thread_data *backup_tinfo; - int threads_mask; - volatile int sync_state; - struct mutex sync_mutex; -diff --git a/include/net/tcp.h b/include/net/tcp.h -index 582c0caa9811..2ee06191c488 100644 ---- a/include/net/tcp.h -+++ b/include/net/tcp.h -@@ -1063,7 +1063,8 @@ void tcp_get_default_congestion_control(struct net *net, char *name); - void tcp_get_available_congestion_control(char *buf, size_t len); - void tcp_get_allowed_congestion_control(char *buf, size_t len); - int tcp_set_allowed_congestion_control(char *allowed); --int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, bool reinit); -+int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, -+ bool reinit, bool cap_net_admin); - u32 tcp_slow_start(struct tcp_sock *tp, u32 acked); - void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked); - -@@ -1675,6 +1676,11 @@ static inline struct sk_buff *tcp_rtx_queue_head(const struct sock *sk) - return skb_rb_first(&sk->tcp_rtx_queue); - } - -+static inline struct sk_buff *tcp_rtx_queue_tail(const struct sock *sk) -+{ -+ return skb_rb_last(&sk->tcp_rtx_queue); -+} -+ - static inline struct sk_buff *tcp_write_queue_head(const struct sock *sk) - { - return skb_peek(&sk->sk_write_queue); -diff --git a/include/net/tls.h b/include/net/tls.h -index 53d96bca220d..889df0312cd1 100644 ---- a/include/net/tls.h -+++ b/include/net/tls.h -@@ -313,6 +313,7 @@ struct tls_offload_context_rx { - (ALIGN(sizeof(struct tls_offload_context_rx), sizeof(void *)) + \ - TLS_DRIVER_STATE_SIZE) - -+void tls_ctx_free(struct tls_context *ctx); - int wait_on_pending_writer(struct sock *sk, long *timeo); - int tls_sk_query(struct sock *sk, int optname, char __user *optval, - int __user *optlen); -diff --git a/include/net/xdp_sock.h b/include/net/xdp_sock.h -index d074b6d60f8a..ac3c047d058c 100644 ---- a/include/net/xdp_sock.h -+++ b/include/net/xdp_sock.h -@@ -67,6 +67,8 @@ struct xdp_sock { - * in the SKB destructor callback. - */ - spinlock_t tx_completion_lock; -+ /* Protects generic receive. */ -+ spinlock_t rx_lock; - u64 rx_dropped; - }; - -diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h -index 54873085f2da..db0fc59cf4f0 100644 ---- a/include/rdma/ib_verbs.h -+++ b/include/rdma/ib_verbs.h -@@ -327,8 +327,8 @@ struct ib_rss_caps { - }; - - enum ib_tm_cap_flags { -- /* Support tag matching on RC transport */ -- IB_TM_CAP_RC = 1 << 0, -+ /* Support tag matching with rendezvous offload for RC transport */ -+ IB_TM_CAP_RNDV_RC = 1 << 0, - }; - - struct ib_tm_caps { -@@ -2722,6 +2722,9 @@ struct ib_client { - const union ib_gid *gid, - const struct sockaddr *addr, - void *client_data); -+ -+ refcount_t uses; -+ struct completion uses_zero; - struct list_head list; - u32 client_id; - -diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h -index c50fb297e265..e89a922ee849 100644 ---- a/include/scsi/libfcoe.h -+++ b/include/scsi/libfcoe.h -@@ -229,6 +229,7 @@ struct fcoe_fcf { - * @vn_mac: VN_Node assigned MAC address for data - */ - struct fcoe_rport { -+ struct fc_rport_priv rdata; - unsigned long time; - u16 fcoe_len; - u16 flags; -diff --git a/include/sound/hda_codec.h b/include/sound/hda_codec.h -index a7c602576b68..66fb592f2d5e 100644 ---- a/include/sound/hda_codec.h -+++ b/include/sound/hda_codec.h -@@ -249,6 +249,8 @@ struct hda_codec { - unsigned int auto_runtime_pm:1; /* enable automatic codec runtime pm */ - unsigned int force_pin_prefix:1; /* Add location prefix */ - unsigned int link_down_at_suspend:1; /* link down at runtime suspend */ -+ unsigned int relaxed_resume:1; /* don't resume forcibly for jack */ -+ - #ifdef CONFIG_PM - unsigned long power_on_acct; - unsigned long power_off_acct; -diff --git a/include/trace/events/fs.h b/include/trace/events/fs.h -new file mode 100644 -index 000000000000..fb634b74adf3 ---- /dev/null -+++ b/include/trace/events/fs.h -@@ -0,0 +1,53 @@ -+#undef TRACE_SYSTEM -+#define TRACE_SYSTEM fs -+ -+#if !defined(_TRACE_FS_H) || defined(TRACE_HEADER_MULTI_READ) -+#define _TRACE_FS_H -+ -+#include -+#include -+ -+TRACE_EVENT(do_sys_open, -+ -+ TP_PROTO(const char *filename, int flags, int mode), -+ -+ TP_ARGS(filename, flags, mode), -+ -+ TP_STRUCT__entry( -+ __string( filename, filename ) -+ __field( int, flags ) -+ __field( int, mode ) -+ ), -+ -+ TP_fast_assign( -+ __assign_str(filename, filename); -+ __entry->flags = flags; -+ __entry->mode = mode; -+ ), -+ -+ TP_printk("\"%s\" %x %o", -+ __get_str(filename), __entry->flags, __entry->mode) -+); -+ -+TRACE_EVENT(open_exec, -+ -+ TP_PROTO(const char *filename), -+ -+ TP_ARGS(filename), -+ -+ TP_STRUCT__entry( -+ __string( filename, filename ) -+ ), -+ -+ TP_fast_assign( -+ __assign_str(filename, filename); -+ ), -+ -+ TP_printk("\"%s\"", -+ __get_str(filename)) -+); -+ -+#endif /* _TRACE_FS_H */ -+ -+/* This part must be outside protection */ -+#include -diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h -index d85816878a52..cc1d060cbf13 100644 ---- a/include/trace/events/rxrpc.h -+++ b/include/trace/events/rxrpc.h -@@ -1379,7 +1379,7 @@ TRACE_EVENT(rxrpc_rx_eproto, - ), - - TP_fast_assign( -- __entry->call = call->debug_id; -+ __entry->call = call ? call->debug_id : 0; - __entry->serial = serial; - __entry->why = why; - ), -diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h -index a8b823c30b43..29a5bc3d5c66 100644 ---- a/include/uapi/linux/bpf.h -+++ b/include/uapi/linux/bpf.h -@@ -3143,6 +3143,7 @@ struct bpf_prog_info { - char name[BPF_OBJ_NAME_LEN]; - __u32 ifindex; - __u32 gpl_compatible:1; -+ __u32 :31; /* alignment pad */ - __u64 netns_dev; - __u64 netns_ino; - __u32 nr_jited_ksyms; -diff --git a/include/uapi/linux/coda_psdev.h b/include/uapi/linux/coda_psdev.h -index aa6623efd2dd..d50d51a57fe4 100644 ---- a/include/uapi/linux/coda_psdev.h -+++ b/include/uapi/linux/coda_psdev.h -@@ -7,19 +7,6 @@ - #define CODA_PSDEV_MAJOR 67 - #define MAX_CODADEVS 5 /* how many do we allow */ - -- --/* messages between coda filesystem in kernel and Venus */ --struct upc_req { -- struct list_head uc_chain; -- caddr_t uc_data; -- u_short uc_flags; -- u_short uc_inSize; /* Size is at most 5000 bytes */ -- u_short uc_outSize; -- u_short uc_opcode; /* copied from data to save lookup */ -- int uc_unique; -- wait_queue_head_t uc_sleep; /* process' wait queue */ --}; -- - #define CODA_REQ_ASYNC 0x1 - #define CODA_REQ_READ 0x2 - #define CODA_REQ_WRITE 0x4 -diff --git a/include/uapi/linux/nilfs2_ondisk.h b/include/uapi/linux/nilfs2_ondisk.h -index a7e66ab11d1d..c23f91ae5fe8 100644 ---- a/include/uapi/linux/nilfs2_ondisk.h -+++ b/include/uapi/linux/nilfs2_ondisk.h -@@ -29,7 +29,7 @@ - - #include - #include -- -+#include - - #define NILFS_INODE_BMAP_SIZE 7 - -@@ -533,19 +533,19 @@ enum { - static inline void \ - nilfs_checkpoint_set_##name(struct nilfs_checkpoint *cp) \ - { \ -- cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) | \ -- (1UL << NILFS_CHECKPOINT_##flag)); \ -+ cp->cp_flags = __cpu_to_le32(__le32_to_cpu(cp->cp_flags) | \ -+ (1UL << NILFS_CHECKPOINT_##flag)); \ - } \ - static inline void \ - nilfs_checkpoint_clear_##name(struct nilfs_checkpoint *cp) \ - { \ -- cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) & \ -+ cp->cp_flags = __cpu_to_le32(__le32_to_cpu(cp->cp_flags) & \ - ~(1UL << NILFS_CHECKPOINT_##flag)); \ - } \ - static inline int \ - nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp) \ - { \ -- return !!(le32_to_cpu(cp->cp_flags) & \ -+ return !!(__le32_to_cpu(cp->cp_flags) & \ - (1UL << NILFS_CHECKPOINT_##flag)); \ - } - -@@ -595,20 +595,20 @@ enum { - static inline void \ - nilfs_segment_usage_set_##name(struct nilfs_segment_usage *su) \ - { \ -- su->su_flags = cpu_to_le32(le32_to_cpu(su->su_flags) | \ -+ su->su_flags = __cpu_to_le32(__le32_to_cpu(su->su_flags) | \ - (1UL << NILFS_SEGMENT_USAGE_##flag));\ - } \ - static inline void \ - nilfs_segment_usage_clear_##name(struct nilfs_segment_usage *su) \ - { \ - su->su_flags = \ -- cpu_to_le32(le32_to_cpu(su->su_flags) & \ -+ __cpu_to_le32(__le32_to_cpu(su->su_flags) & \ - ~(1UL << NILFS_SEGMENT_USAGE_##flag)); \ - } \ - static inline int \ - nilfs_segment_usage_##name(const struct nilfs_segment_usage *su) \ - { \ -- return !!(le32_to_cpu(su->su_flags) & \ -+ return !!(__le32_to_cpu(su->su_flags) & \ - (1UL << NILFS_SEGMENT_USAGE_##flag)); \ - } - -@@ -619,15 +619,15 @@ NILFS_SEGMENT_USAGE_FNS(ERROR, error) - static inline void - nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su) - { -- su->su_lastmod = cpu_to_le64(0); -- su->su_nblocks = cpu_to_le32(0); -- su->su_flags = cpu_to_le32(0); -+ su->su_lastmod = __cpu_to_le64(0); -+ su->su_nblocks = __cpu_to_le32(0); -+ su->su_flags = __cpu_to_le32(0); - } - - static inline int - nilfs_segment_usage_clean(const struct nilfs_segment_usage *su) - { -- return !le32_to_cpu(su->su_flags); -+ return !__le32_to_cpu(su->su_flags); - } - - /** -diff --git a/include/uapi/linux/sched.h b/include/uapi/linux/sched.h -index ed4ee170bee2..f430694a061c 100644 ---- a/include/uapi/linux/sched.h -+++ b/include/uapi/linux/sched.h -@@ -38,9 +38,16 @@ - #define SCHED_FIFO 1 - #define SCHED_RR 2 - #define SCHED_BATCH 3 --/* SCHED_ISO: reserved but not implemented yet */ -+/* SCHED_ISO: Implemented on MuQSS only */ - #define SCHED_IDLE 5 -+#ifdef CONFIG_SCHED_MUQSS -+#define SCHED_ISO 4 -+#define SCHED_IDLEPRIO SCHED_IDLE -+#define SCHED_MAX (SCHED_IDLEPRIO) -+#define SCHED_RANGE(policy) ((policy) <= SCHED_MAX) -+#else /* CONFIG_SCHED_MUQSS */ - #define SCHED_DEADLINE 6 -+#endif /* CONFIG_SCHED_MUQSS */ - - /* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */ - #define SCHED_RESET_ON_FORK 0x40000000 -diff --git a/include/uapi/linux/usb/audio.h b/include/uapi/linux/usb/audio.h -index ddc5396800aa..76b7c3f6cd0d 100644 ---- a/include/uapi/linux/usb/audio.h -+++ b/include/uapi/linux/usb/audio.h -@@ -450,6 +450,43 @@ static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_desc - } - } - -+/* -+ * Extension Unit (XU) has almost compatible layout with Processing Unit, but -+ * on UAC2, it has a different bmControls size (bControlSize); it's 1 byte for -+ * XU while 2 bytes for PU. The last iExtension field is a one-byte index as -+ * well as iProcessing field of PU. -+ */ -+static inline __u8 uac_extension_unit_bControlSize(struct uac_processing_unit_descriptor *desc, -+ int protocol) -+{ -+ switch (protocol) { -+ case UAC_VERSION_1: -+ return desc->baSourceID[desc->bNrInPins + 4]; -+ case UAC_VERSION_2: -+ return 1; /* in UAC2, this value is constant */ -+ case UAC_VERSION_3: -+ return 4; /* in UAC3, this value is constant */ -+ default: -+ return 1; -+ } -+} -+ -+static inline __u8 uac_extension_unit_iExtension(struct uac_processing_unit_descriptor *desc, -+ int protocol) -+{ -+ __u8 control_size = uac_extension_unit_bControlSize(desc, protocol); -+ -+ switch (protocol) { -+ case UAC_VERSION_1: -+ case UAC_VERSION_2: -+ default: -+ return *(uac_processing_unit_bmControls(desc, protocol) -+ + control_size); -+ case UAC_VERSION_3: -+ return 0; /* UAC3 does not have this field */ -+ } -+} -+ - /* 4.5.2 Class-Specific AS Interface Descriptor */ - struct uac1_as_header_descriptor { - __u8 bLength; /* in bytes: 7 */ -diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h -index 1050a75fb7ef..dcd776e77442 100644 ---- a/include/uapi/linux/videodev2.h -+++ b/include/uapi/linux/videodev2.h -@@ -518,7 +518,13 @@ struct v4l2_pix_format { - #define V4L2_PIX_FMT_RGBX444 v4l2_fourcc('R', 'X', '1', '2') /* 16 rrrrgggg bbbbxxxx */ - #define V4L2_PIX_FMT_ABGR444 v4l2_fourcc('A', 'B', '1', '2') /* 16 aaaabbbb ggggrrrr */ - #define V4L2_PIX_FMT_XBGR444 v4l2_fourcc('X', 'B', '1', '2') /* 16 xxxxbbbb ggggrrrr */ --#define V4L2_PIX_FMT_BGRA444 v4l2_fourcc('B', 'A', '1', '2') /* 16 bbbbgggg rrrraaaa */ -+ -+/* -+ * Originally this had 'BA12' as fourcc, but this clashed with the older -+ * V4L2_PIX_FMT_SGRBG12 which inexplicably used that same fourcc. -+ * So use 'GA12' instead for V4L2_PIX_FMT_BGRA444. -+ */ -+#define V4L2_PIX_FMT_BGRA444 v4l2_fourcc('G', 'A', '1', '2') /* 16 bbbbgggg rrrraaaa */ - #define V4L2_PIX_FMT_BGRX444 v4l2_fourcc('B', 'X', '1', '2') /* 16 bbbbgggg rrrrxxxx */ - #define V4L2_PIX_FMT_RGB555 v4l2_fourcc('R', 'G', 'B', 'O') /* 16 RGB-5-5-5 */ - #define V4L2_PIX_FMT_ARGB555 v4l2_fourcc('A', 'R', '1', '5') /* 16 ARGB-1-5-5-5 */ -diff --git a/include/uapi/linux/vt.h b/include/uapi/linux/vt.h -index e9d39c48520a..3bceead8da40 100644 ---- a/include/uapi/linux/vt.h -+++ b/include/uapi/linux/vt.h -@@ -3,12 +3,25 @@ - #define _UAPI_LINUX_VT_H - - -+/* -+ * We will make this definition solely for the purpose of making packages -+ * such as splashutils build, because they can not understand that -+ * NR_TTY_DEVICES is defined in the kernel configuration. -+ */ -+#ifndef CONFIG_NR_TTY_DEVICES -+#define CONFIG_NR_TTY_DEVICES 63 -+#endif -+ - /* - * These constants are also useful for user-level apps (e.g., VC - * resizing). - */ - #define MIN_NR_CONSOLES 1 /* must be at least 1 */ --#define MAX_NR_CONSOLES 63 /* serial lines start at 64 */ -+/* -+ * NR_TTY_DEVICES: -+ * Value MUST be at least 12 and must never be higher then 63 -+ */ -+#define MAX_NR_CONSOLES CONFIG_NR_TTY_DEVICES /* serial lines start above this */ - /* Note: the ioctl VT_GETSTATE does not work for - consoles 16 and higher (since it returns a short) */ - -diff --git a/include/xen/events.h b/include/xen/events.h -index a48897199975..c0e6a0598397 100644 ---- a/include/xen/events.h -+++ b/include/xen/events.h -@@ -3,6 +3,7 @@ - #define _XEN_EVENTS_H - - #include -+#include - #ifdef CONFIG_PCI_MSI - #include - #endif -@@ -59,7 +60,7 @@ void evtchn_put(unsigned int evtchn); - - void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector); - void rebind_evtchn_irq(int evtchn, int irq); --int xen_rebind_evtchn_to_cpu(int evtchn, unsigned tcpu); -+int xen_set_affinity_evtchn(struct irq_desc *desc, unsigned int tcpu); - - static inline void notify_remote_via_evtchn(int port) - { -diff --git a/init/Kconfig b/init/Kconfig -index 0e2344389501..093e054c521c 100644 ---- a/init/Kconfig -+++ b/init/Kconfig -@@ -65,6 +65,47 @@ config THREAD_INFO_IN_TASK - - menu "General setup" - -+config ZEN_INTERACTIVE -+ bool "Tune kernel for interactivity" -+ default y -+ help -+ Tunes the kernel for responsiveness at the cost of throughput and power usage. -+ -+ --- Virtual Memory Subsystem --------------------------- -+ -+ Mem dirty before bg writeback..: 10 % -> 20 % -+ Mem dirty before sync writeback: 20 % -> 50 % -+ -+ --- Block Layer ---------------------------------------- -+ -+ Queue depth...............: 128 -> 512 -+ Default scheduler.........: mq-deadline -> bfq -+ -+ --- CFS CPU Scheduler ---------------------------------- -+ -+ Scheduling latency.............: 6 -> 4 ms -+ Minimal granularity............: 0.75 -> 0.4 ms -+ Wakeup granularity.............: 1 -> 0.5 ms -+ CPU migration cost.............: 0.5 -> 0.25 ms -+ Bandwidth slice size...........: 5 -> 3 ms -+ Ondemand sampling down factor..: 1 -> 5 -+ -+ --- MuQSS CPU Scheduler -------------------------------- -+ -+ Scheduling interval............: 6 -> 2 ms -+ ISO task max realtime use......: 70 % -> 25 % -+ Ondemand sampling down factor..: 1 -> 5 -+ Yield type.....................: 1 -> 2 -+ -+config SCHED_MUQSS -+ bool "MuQSS cpu scheduler" -+ select HIGH_RES_TIMERS -+ default n -+ ---help--- -+ The Multiple Queue Skiplist Scheduler for excellent interactivity and -+ responsiveness on the desktop and highly scalable deterministic -+ low latency on any hardware. -+ - config BROKEN - bool - -@@ -711,6 +752,7 @@ config NUMA_BALANCING - depends on ARCH_SUPPORTS_NUMA_BALANCING - depends on !ARCH_WANT_NUMA_VARIABLE_LOCALITY - depends on SMP && NUMA && MIGRATION -+ depends on !SCHED_MUQSS - help - This option adds support for automatic NUMA aware memory/task placement. - The mechanism is quite primitive and is based on migrating memory when -@@ -818,9 +860,13 @@ menuconfig CGROUP_SCHED - help - This feature lets CPU scheduler recognize task groups and control CPU - bandwidth allocation to such task groups. It uses cgroups to group -- tasks. -+ tasks. In combination with MuQSS this is purely a STUB to create the -+ files associated with the CPU controller cgroup but most of the -+ controls do nothing. This is useful for working in environments and -+ with applications that will only work if this control group is -+ present. - --if CGROUP_SCHED -+if CGROUP_SCHED && !SCHED_MUQSS - config FAIR_GROUP_SCHED - bool "Group scheduling for SCHED_OTHER" - depends on CGROUP_SCHED -@@ -927,6 +973,7 @@ config CGROUP_DEVICE - - config CGROUP_CPUACCT - bool "Simple CPU accounting controller" -+ depends on !SCHED_MUQSS - help - Provides a simple controller for monitoring the - total CPU consumed by the tasks in a cgroup. -@@ -1013,6 +1060,22 @@ config USER_NS - - If unsure, say N. - -+config USER_NS_UNPRIVILEGED -+ bool "Allow unprivileged users to create namespaces" -+ default y -+ depends on USER_NS -+ help -+ When disabled, unprivileged users will not be able to create -+ new namespaces. Allowing users to create their own namespaces -+ has been part of several recent local privilege escalation -+ exploits, so if you need user namespaces but are -+ paranoid^Wsecurity-conscious you want to disable this. -+ -+ This setting can be overridden at runtime via the -+ kernel.unprivileged_userns_clone sysctl. -+ -+ If unsure, say Y. -+ - config PID_NS - bool "PID Namespaces" - default y -@@ -1045,6 +1108,7 @@ config CHECKPOINT_RESTORE - - config SCHED_AUTOGROUP - bool "Automatic process group scheduling" -+ depends on !SCHED_MUQSS - select CGROUPS - select CGROUP_SCHED - select FAIR_GROUP_SCHED -@@ -1137,6 +1201,14 @@ config CC_OPTIMIZE_FOR_PERFORMANCE - with the "-O2" compiler flag for best performance and most - helpful compile-time warnings. - -+config CC_OPTIMIZE_HARDER -+ bool "Optimize harder" -+ imply CC_DISABLE_WARN_MAYBE_UNINITIALIZED # avoid false positives -+ help -+ This option will pass "-O3" to your compiler resulting in a -+ larger and faster kernel. The more complex optimizations also -+ increase compilation time and may affect stability. -+ - config CC_OPTIMIZE_FOR_SIZE - bool "Optimize for size" - imply CC_DISABLE_WARN_MAYBE_UNINITIALIZED # avoid false positives -diff --git a/init/init_task.c b/init/init_task.c -index c70ef656d0f4..91fab35e0d51 100644 ---- a/init/init_task.c -+++ b/init/init_task.c -@@ -68,9 +68,17 @@ struct task_struct init_task - .stack = init_stack, - .usage = REFCOUNT_INIT(2), - .flags = PF_KTHREAD, -+#ifdef CONFIG_SCHED_MUQSS -+ .prio = NORMAL_PRIO, -+ .static_prio = MAX_PRIO-20, -+ .normal_prio = NORMAL_PRIO, -+ .deadline = 0, -+ .time_slice = 1000000, -+#else - .prio = MAX_PRIO - 20, - .static_prio = MAX_PRIO - 20, - .normal_prio = MAX_PRIO - 20, -+#endif - .policy = SCHED_NORMAL, - .cpus_allowed = CPU_MASK_ALL, - .nr_cpus_allowed= NR_CPUS, -@@ -79,6 +87,7 @@ struct task_struct init_task - .restart_block = { - .fn = do_no_restart_syscall, - }, -+#ifndef CONFIG_SCHED_MUQSS - .se = { - .group_node = LIST_HEAD_INIT(init_task.se.group_node), - }, -@@ -86,6 +95,7 @@ struct task_struct init_task - .run_list = LIST_HEAD_INIT(init_task.rt.run_list), - .time_slice = RR_TIMESLICE, - }, -+#endif - .tasks = LIST_HEAD_INIT(init_task.tasks), - #ifdef CONFIG_SMP - .pushable_tasks = PLIST_NODE_INIT(init_task.pushable_tasks, MAX_PRIO), -diff --git a/init/main.c b/init/main.c -index 66a196c5e4c3..cc931fed2f3c 100644 ---- a/init/main.c -+++ b/init/main.c -@@ -1102,6 +1102,8 @@ static int __ref kernel_init(void *unused) - - rcu_end_inkernel_boot(); - -+ print_scheduler_version(); -+ - if (ramdisk_execute_command) { - ret = run_init_process(ramdisk_execute_command); - if (!ret) -diff --git a/ipc/mqueue.c b/ipc/mqueue.c -index 216cad1ff0d0..65c351564ad0 100644 ---- a/ipc/mqueue.c -+++ b/ipc/mqueue.c -@@ -438,7 +438,6 @@ static void mqueue_evict_inode(struct inode *inode) - { - struct mqueue_inode_info *info; - struct user_struct *user; -- unsigned long mq_bytes, mq_treesize; - struct ipc_namespace *ipc_ns; - struct msg_msg *msg, *nmsg; - LIST_HEAD(tmp_msg); -@@ -461,16 +460,18 @@ static void mqueue_evict_inode(struct inode *inode) - free_msg(msg); - } - -- /* Total amount of bytes accounted for the mqueue */ -- mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) + -- min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) * -- sizeof(struct posix_msg_tree_node); -- -- mq_bytes = mq_treesize + (info->attr.mq_maxmsg * -- info->attr.mq_msgsize); -- - user = info->user; - if (user) { -+ unsigned long mq_bytes, mq_treesize; -+ -+ /* Total amount of bytes accounted for the mqueue */ -+ mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) + -+ min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) * -+ sizeof(struct posix_msg_tree_node); -+ -+ mq_bytes = mq_treesize + (info->attr.mq_maxmsg * -+ info->attr.mq_msgsize); -+ - spin_lock(&mq_lock); - user->mq_bytes -= mq_bytes; - /* -diff --git a/kernel/Kconfig.MuQSS b/kernel/Kconfig.MuQSS -new file mode 100644 -index 000000000000..558a7cb02cb9 ---- /dev/null -+++ b/kernel/Kconfig.MuQSS -@@ -0,0 +1,89 @@ -+choice -+ prompt "CPU scheduler runqueue sharing" -+ default RQ_MC if SCHED_MUQSS -+ default RQ_NONE -+ -+config RQ_NONE -+ bool "No sharing" -+ help -+ This is the default behaviour where the CPU scheduler has one runqueue -+ per CPU, whether it is a physical or logical CPU (hyperthread). -+ -+ This can still be enabled runtime with the boot parameter -+ rqshare=none -+ -+ If unsure, say N. -+ -+config RQ_SMT -+ bool "SMT (hyperthread) siblings" -+ depends on SCHED_SMT && SCHED_MUQSS -+ -+ help -+ With this option enabled, the CPU scheduler will have one runqueue -+ shared by SMT (hyperthread) siblings. As these logical cores share -+ one physical core, sharing the runqueue resource can lead to decreased -+ overhead, lower latency and higher throughput. -+ -+ This can still be enabled runtime with the boot parameter -+ rqshare=smt -+ -+ If unsure, say N. -+ -+config RQ_MC -+ bool "Multicore siblings" -+ depends on SCHED_MC && SCHED_MUQSS -+ help -+ With this option enabled, the CPU scheduler will have one runqueue -+ shared by multicore siblings in addition to any SMT siblings. -+ As these physical cores share caches, sharing the runqueue resource -+ will lead to lower latency, but its effects on overhead and throughput -+ are less predictable. As a general rule, 6 or fewer cores will likely -+ benefit from this, while larger CPUs will only derive a latency -+ benefit. If your workloads are primarily single threaded, this will -+ possibly worsen throughput. If you are only concerned about latency -+ then enable this regardless of how many cores you have. -+ -+ This can still be enabled runtime with the boot parameter -+ rqshare=mc -+ -+ If unsure, say Y. -+ -+config RQ_SMP -+ bool "Symmetric Multi-Processing" -+ depends on SMP && SCHED_MUQSS -+ help -+ With this option enabled, the CPU scheduler will have one runqueue -+ shared by all physical CPUs unless they are on separate NUMA nodes. -+ As physical CPUs usually do not share resources, sharing the runqueue -+ will normally worsen throughput but improve latency. If you only -+ care about latency enable this. -+ -+ This can still be enabled runtime with the boot parameter -+ rqshare=smp -+ -+ If unsure, say N. -+ -+config RQ_ALL -+ bool "NUMA" -+ depends on SMP && SCHED_MUQSS -+ help -+ With this option enabled, the CPU scheduler will have one runqueue -+ regardless of the architecture configuration, including across NUMA -+ nodes. This can substantially decrease throughput in NUMA -+ configurations, but light NUMA designs will not be dramatically -+ affected. This option should only be chosen if latency is the prime -+ concern. -+ -+ This can still be enabled runtime with the boot parameter -+ rqshare=all -+ -+ If unsure, say N. -+endchoice -+ -+config SHARERQ -+ int -+ default 0 if RQ_NONE -+ default 1 if RQ_SMT -+ default 2 if RQ_MC -+ default 3 if RQ_SMP -+ default 4 if RQ_ALL -diff --git a/kernel/Makefile b/kernel/Makefile -index a8d923b5481b..b8ec0b21ee99 100644 ---- a/kernel/Makefile -+++ b/kernel/Makefile -@@ -10,7 +10,7 @@ obj-y = fork.o exec_domain.o panic.o \ - extable.o params.o \ - kthread.o sys_ni.o nsproxy.o \ - notifier.o ksysfs.o cred.o reboot.o \ -- async.o range.o smpboot.o ucount.o -+ async.o range.o smpboot.o ucount.o skip_list.o - - obj-$(CONFIG_MODULES) += kmod.o - obj-$(CONFIG_MULTIUSER) += groups.o -diff --git a/kernel/bpf/Makefile b/kernel/bpf/Makefile -index 4c2fa3ac56f6..29d781061cd5 100644 ---- a/kernel/bpf/Makefile -+++ b/kernel/bpf/Makefile -@@ -1,5 +1,6 @@ - # SPDX-License-Identifier: GPL-2.0 - obj-y := core.o -+CFLAGS_core.o += $(call cc-disable-warning, override-init) - - obj-$(CONFIG_BPF_SYSCALL) += syscall.o verifier.o inode.o helpers.o tnum.o - obj-$(CONFIG_BPF_SYSCALL) += hashtab.o arraymap.o percpu_freelist.o bpf_lru_list.o lpm_trie.o map_in_map.o -diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c -index cad09858a5f2..5fcc7a17eb5a 100644 ---- a/kernel/bpf/btf.c -+++ b/kernel/bpf/btf.c -@@ -1073,11 +1073,18 @@ const struct btf_type *btf_type_id_size(const struct btf *btf, - !btf_type_is_var(size_type))) - return NULL; - -- size = btf->resolved_sizes[size_type_id]; - size_type_id = btf->resolved_ids[size_type_id]; - size_type = btf_type_by_id(btf, size_type_id); - if (btf_type_nosize_or_null(size_type)) - return NULL; -+ else if (btf_type_has_size(size_type)) -+ size = size_type->size; -+ else if (btf_type_is_array(size_type)) -+ size = btf->resolved_sizes[size_type_id]; -+ else if (btf_type_is_ptr(size_type)) -+ size = sizeof(void *); -+ else -+ return NULL; - } - - *type_id = size_type_id; -@@ -1602,7 +1609,6 @@ static int btf_modifier_resolve(struct btf_verifier_env *env, - const struct btf_type *next_type; - u32 next_type_id = t->type; - struct btf *btf = env->btf; -- u32 next_type_size = 0; - - next_type = btf_type_by_id(btf, next_type_id); - if (!next_type || btf_type_is_resolve_source_only(next_type)) { -@@ -1620,7 +1626,7 @@ static int btf_modifier_resolve(struct btf_verifier_env *env, - * save us a few type-following when we use it later (e.g. in - * pretty print). - */ -- if (!btf_type_id_size(btf, &next_type_id, &next_type_size)) { -+ if (!btf_type_id_size(btf, &next_type_id, NULL)) { - if (env_type_is_resolved(env, next_type_id)) - next_type = btf_type_id_resolve(btf, &next_type_id); - -@@ -1633,7 +1639,7 @@ static int btf_modifier_resolve(struct btf_verifier_env *env, - } - } - -- env_stack_pop_resolved(env, next_type_id, next_type_size); -+ env_stack_pop_resolved(env, next_type_id, 0); - - return 0; - } -@@ -1645,7 +1651,6 @@ static int btf_var_resolve(struct btf_verifier_env *env, - const struct btf_type *t = v->t; - u32 next_type_id = t->type; - struct btf *btf = env->btf; -- u32 next_type_size; - - next_type = btf_type_by_id(btf, next_type_id); - if (!next_type || btf_type_is_resolve_source_only(next_type)) { -@@ -1675,12 +1680,12 @@ static int btf_var_resolve(struct btf_verifier_env *env, - * forward types or similar that would resolve to size of - * zero is allowed. - */ -- if (!btf_type_id_size(btf, &next_type_id, &next_type_size)) { -+ if (!btf_type_id_size(btf, &next_type_id, NULL)) { - btf_verifier_log_type(env, v->t, "Invalid type_id"); - return -EINVAL; - } - -- env_stack_pop_resolved(env, next_type_id, next_type_size); -+ env_stack_pop_resolved(env, next_type_id, 0); - - return 0; - } -@@ -1928,8 +1933,8 @@ static int btf_array_resolve(struct btf_verifier_env *env, - /* Check array->index_type */ - index_type_id = array->index_type; - index_type = btf_type_by_id(btf, index_type_id); -- if (btf_type_is_resolve_source_only(index_type) || -- btf_type_nosize_or_null(index_type)) { -+ if (btf_type_nosize_or_null(index_type) || -+ btf_type_is_resolve_source_only(index_type)) { - btf_verifier_log_type(env, v->t, "Invalid index"); - return -EINVAL; - } -@@ -1948,8 +1953,8 @@ static int btf_array_resolve(struct btf_verifier_env *env, - /* Check array->type */ - elem_type_id = array->type; - elem_type = btf_type_by_id(btf, elem_type_id); -- if (btf_type_is_resolve_source_only(elem_type) || -- btf_type_nosize_or_null(elem_type)) { -+ if (btf_type_nosize_or_null(elem_type) || -+ btf_type_is_resolve_source_only(elem_type)) { - btf_verifier_log_type(env, v->t, - "Invalid elem"); - return -EINVAL; -@@ -2170,8 +2175,8 @@ static int btf_struct_resolve(struct btf_verifier_env *env, - const struct btf_type *member_type = btf_type_by_id(env->btf, - member_type_id); - -- if (btf_type_is_resolve_source_only(member_type) || -- btf_type_nosize_or_null(member_type)) { -+ if (btf_type_nosize_or_null(member_type) || -+ btf_type_is_resolve_source_only(member_type)) { - btf_verifier_log_member(env, v->t, member, - "Invalid member"); - return -EINVAL; -diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c -index 080e2bb644cc..ceee0730fba5 100644 ---- a/kernel/bpf/core.c -+++ b/kernel/bpf/core.c -@@ -1295,7 +1295,7 @@ bool bpf_opcode_in_insntable(u8 code) - * - * Decode and execute eBPF instructions. - */ --static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack) -+static u64 __no_fgcse ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack) - { - #define BPF_INSN_2_LBL(x, y) [BPF_##x | BPF_##y] = &&x##_##y - #define BPF_INSN_3_LBL(x, y, z) [BPF_##x | BPF_##y | BPF_##z] = &&x##_##y##_##z -@@ -1364,10 +1364,10 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack) - insn++; - CONT; - ALU_ARSH_X: -- DST = (u64) (u32) ((*(s32 *) &DST) >> SRC); -+ DST = (u64) (u32) (((s32) DST) >> SRC); - CONT; - ALU_ARSH_K: -- DST = (u64) (u32) ((*(s32 *) &DST) >> IMM); -+ DST = (u64) (u32) (((s32) DST) >> IMM); - CONT; - ALU64_ARSH_X: - (*(s64 *) &DST) >>= SRC; -diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c -index a5c369e60343..11528bdaa9dc 100644 ---- a/kernel/bpf/verifier.c -+++ b/kernel/bpf/verifier.c -@@ -6456,17 +6456,18 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx) - * the state of the call instruction (with WRITTEN set), and r0 comes - * from callee with its full parentage chain, anyway. - */ -- for (j = 0; j <= cur->curframe; j++) -- for (i = j < cur->curframe ? BPF_REG_6 : 0; i < BPF_REG_FP; i++) -- cur->frame[j]->regs[i].parent = &new->frame[j]->regs[i]; - /* clear write marks in current state: the writes we did are not writes - * our child did, so they don't screen off its reads from us. - * (There are no read marks in current state, because reads always mark - * their parent and current state never has children yet. Only - * explored_states can get read marks.) - */ -- for (i = 0; i < BPF_REG_FP; i++) -- cur->frame[cur->curframe]->regs[i].live = REG_LIVE_NONE; -+ for (j = 0; j <= cur->curframe; j++) { -+ for (i = j < cur->curframe ? BPF_REG_6 : 0; i < BPF_REG_FP; i++) -+ cur->frame[j]->regs[i].parent = &new->frame[j]->regs[i]; -+ for (i = 0; i < BPF_REG_FP; i++) -+ cur->frame[j]->regs[i].live = REG_LIVE_NONE; -+ } - - /* all stack frames are accessible from callee, clear them all */ - for (j = 0; j <= cur->curframe; j++) { -diff --git a/kernel/cred.c b/kernel/cred.c -index c73a87a4df13..153ae369e024 100644 ---- a/kernel/cred.c -+++ b/kernel/cred.c -@@ -144,7 +144,10 @@ void __put_cred(struct cred *cred) - BUG_ON(cred == current->cred); - BUG_ON(cred == current->real_cred); - -- call_rcu(&cred->rcu, put_cred_rcu); -+ if (cred->non_rcu) -+ put_cred_rcu(&cred->rcu); -+ else -+ call_rcu(&cred->rcu, put_cred_rcu); - } - EXPORT_SYMBOL(__put_cred); - -@@ -256,6 +259,7 @@ struct cred *prepare_creds(void) - old = task->cred; - memcpy(new, old, sizeof(struct cred)); - -+ new->non_rcu = 0; - atomic_set(&new->usage, 1); - set_cred_subscribers(new, 0); - get_group_info(new->group_info); -@@ -535,7 +539,19 @@ const struct cred *override_creds(const struct cred *new) - - validate_creds(old); - validate_creds(new); -- get_cred(new); -+ -+ /* -+ * NOTE! This uses 'get_new_cred()' rather than 'get_cred()'. -+ * -+ * That means that we do not clear the 'non_rcu' flag, since -+ * we are only installing the cred into the thread-synchronous -+ * '->cred' pointer, not the '->real_cred' pointer that is -+ * visible to other threads under RCU. -+ * -+ * Also note that we did validate_creds() manually, not depending -+ * on the validation in 'get_cred()'. -+ */ -+ get_new_cred((struct cred *)new); - alter_cred_subscribers(new, 1); - rcu_assign_pointer(current->cred, new); - alter_cred_subscribers(old, -1); -@@ -672,6 +688,7 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon) - validate_creds(old); - - *new = *old; -+ new->non_rcu = 0; - atomic_set(&new->usage, 1); - set_cred_subscribers(new, 0); - get_uid(new->user); -diff --git a/kernel/delayacct.c b/kernel/delayacct.c -index 27725754ac99..769d773c7182 100644 ---- a/kernel/delayacct.c -+++ b/kernel/delayacct.c -@@ -106,7 +106,7 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) - */ - t1 = tsk->sched_info.pcount; - t2 = tsk->sched_info.run_delay; -- t3 = tsk->se.sum_exec_runtime; -+ t3 = tsk_seruntime(tsk); - - d->cpu_count += t1; - -diff --git a/kernel/dma/remap.c b/kernel/dma/remap.c -index 7a723194ecbe..0207e3764d52 100644 ---- a/kernel/dma/remap.c -+++ b/kernel/dma/remap.c -@@ -158,6 +158,9 @@ int __init dma_atomic_pool_init(gfp_t gfp, pgprot_t prot) - - bool dma_in_atomic_pool(void *start, size_t size) - { -+ if (unlikely(!atomic_pool)) -+ return false; -+ - return addr_in_gen_pool(atomic_pool, (unsigned long)start, size); - } - -diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c -index 13f0cb080a4d..5f4e1b78babb 100644 ---- a/kernel/dma/swiotlb.c -+++ b/kernel/dma/swiotlb.c -@@ -546,7 +546,7 @@ phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, - if (!(attrs & DMA_ATTR_NO_WARN) && printk_ratelimit()) - dev_warn(hwdev, "swiotlb buffer is full (sz: %zd bytes), total %lu (slots), used %lu (slots)\n", - size, io_tlb_nslabs, tmp_io_tlb_used); -- return DMA_MAPPING_ERROR; -+ return (phys_addr_t)DMA_MAPPING_ERROR; - found: - io_tlb_used += nslots; - spin_unlock_irqrestore(&io_tlb_lock, flags); -@@ -664,7 +664,7 @@ bool swiotlb_map(struct device *dev, phys_addr_t *phys, dma_addr_t *dma_addr, - /* Oh well, have to allocate and map a bounce buffer. */ - *phys = swiotlb_tbl_map_single(dev, __phys_to_dma(dev, io_tlb_start), - *phys, size, dir, attrs); -- if (*phys == DMA_MAPPING_ERROR) -+ if (*phys == (phys_addr_t)DMA_MAPPING_ERROR) - return false; - - /* Ensure that the address returned is DMA'ble */ -diff --git a/kernel/events/core.c b/kernel/events/core.c -index f85929ce13be..f851934d55d4 100644 ---- a/kernel/events/core.c -+++ b/kernel/events/core.c -@@ -2553,6 +2553,9 @@ static int __perf_install_in_context(void *info) - return ret; - } - -+static bool exclusive_event_installable(struct perf_event *event, -+ struct perf_event_context *ctx); -+ - /* - * Attach a performance event to a context. - * -@@ -2567,6 +2570,8 @@ perf_install_in_context(struct perf_event_context *ctx, - - lockdep_assert_held(&ctx->mutex); - -+ WARN_ON_ONCE(!exclusive_event_installable(event, ctx)); -+ - if (event->cpu != -1) - event->cpu = cpu; - -@@ -4358,7 +4363,7 @@ static int exclusive_event_init(struct perf_event *event) - { - struct pmu *pmu = event->pmu; - -- if (!(pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE)) -+ if (!is_exclusive_pmu(pmu)) - return 0; - - /* -@@ -4389,7 +4394,7 @@ static void exclusive_event_destroy(struct perf_event *event) - { - struct pmu *pmu = event->pmu; - -- if (!(pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE)) -+ if (!is_exclusive_pmu(pmu)) - return; - - /* see comment in exclusive_event_init() */ -@@ -4409,14 +4414,15 @@ static bool exclusive_event_match(struct perf_event *e1, struct perf_event *e2) - return false; - } - --/* Called under the same ctx::mutex as perf_install_in_context() */ - static bool exclusive_event_installable(struct perf_event *event, - struct perf_event_context *ctx) - { - struct perf_event *iter_event; - struct pmu *pmu = event->pmu; - -- if (!(pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE)) -+ lockdep_assert_held(&ctx->mutex); -+ -+ if (!is_exclusive_pmu(pmu)) - return true; - - list_for_each_entry(iter_event, &ctx->event_list, event_entry) { -@@ -4463,12 +4469,20 @@ static void _free_event(struct perf_event *event) - if (event->destroy) - event->destroy(event); - -- if (event->ctx) -- put_ctx(event->ctx); -- -+ /* -+ * Must be after ->destroy(), due to uprobe_perf_close() using -+ * hw.target. -+ */ - if (event->hw.target) - put_task_struct(event->hw.target); - -+ /* -+ * perf_event_free_task() relies on put_ctx() being 'last', in particular -+ * all task references must be cleaned up. -+ */ -+ if (event->ctx) -+ put_ctx(event->ctx); -+ - exclusive_event_destroy(event); - module_put(event->pmu->module); - -@@ -4648,8 +4662,17 @@ int perf_event_release_kernel(struct perf_event *event) - mutex_unlock(&event->child_mutex); - - list_for_each_entry_safe(child, tmp, &free_list, child_list) { -+ void *var = &child->ctx->refcount; -+ - list_del(&child->child_list); - free_event(child); -+ -+ /* -+ * Wake any perf_event_free_task() waiting for this event to be -+ * freed. -+ */ -+ smp_mb(); /* pairs with wait_var_event() */ -+ wake_up_var(var); - } - - no_ctx: -@@ -10922,11 +10945,6 @@ SYSCALL_DEFINE5(perf_event_open, - goto err_alloc; - } - -- if ((pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE) && group_leader) { -- err = -EBUSY; -- goto err_context; -- } -- - /* - * Look up the group leader (we will attach this event to it): - */ -@@ -11014,6 +11032,18 @@ SYSCALL_DEFINE5(perf_event_open, - move_group = 0; - } - } -+ -+ /* -+ * Failure to create exclusive events returns -EBUSY. -+ */ -+ err = -EBUSY; -+ if (!exclusive_event_installable(group_leader, ctx)) -+ goto err_locked; -+ -+ for_each_sibling_event(sibling, group_leader) { -+ if (!exclusive_event_installable(sibling, ctx)) -+ goto err_locked; -+ } - } else { - mutex_lock(&ctx->mutex); - } -@@ -11050,9 +11080,6 @@ SYSCALL_DEFINE5(perf_event_open, - * because we need to serialize with concurrent event creation. - */ - if (!exclusive_event_installable(event, ctx)) { -- /* exclusive and group stuff are assumed mutually exclusive */ -- WARN_ON_ONCE(move_group); -- - err = -EBUSY; - goto err_locked; - } -@@ -11519,11 +11546,11 @@ static void perf_free_event(struct perf_event *event, - } - - /* -- * Free an unexposed, unused context as created by inheritance by -- * perf_event_init_task below, used by fork() in case of fail. -+ * Free a context as created by inheritance by perf_event_init_task() below, -+ * used by fork() in case of fail. - * -- * Not all locks are strictly required, but take them anyway to be nice and -- * help out with the lockdep assertions. -+ * Even though the task has never lived, the context and events have been -+ * exposed through the child_list, so we must take care tearing it all down. - */ - void perf_event_free_task(struct task_struct *task) - { -@@ -11553,7 +11580,23 @@ void perf_event_free_task(struct task_struct *task) - perf_free_event(event, ctx); - - mutex_unlock(&ctx->mutex); -- put_ctx(ctx); -+ -+ /* -+ * perf_event_release_kernel() could've stolen some of our -+ * child events and still have them on its free_list. In that -+ * case we must wait for these events to have been freed (in -+ * particular all their references to this task must've been -+ * dropped). -+ * -+ * Without this copy_process() will unconditionally free this -+ * task (irrespective of its reference count) and -+ * _free_event()'s put_task_struct(event->hw.target) will be a -+ * use-after-free. -+ * -+ * Wait for all events to drop their context reference. -+ */ -+ wait_var_event(&ctx->refcount, refcount_read(&ctx->refcount) == 1); -+ put_ctx(ctx); /* must be last */ - } - } - -diff --git a/kernel/exit.c b/kernel/exit.c -index a75b6a7f458a..b63fdd44efe1 100644 ---- a/kernel/exit.c -+++ b/kernel/exit.c -@@ -131,7 +131,7 @@ static void __exit_signal(struct task_struct *tsk) - sig->curr_target = next_thread(tsk); - } - -- add_device_randomness((const void*) &tsk->se.sum_exec_runtime, -+ add_device_randomness((const void*) &tsk_seruntime(tsk), - sizeof(unsigned long long)); - - /* -@@ -152,7 +152,7 @@ static void __exit_signal(struct task_struct *tsk) - sig->inblock += task_io_get_inblock(tsk); - sig->oublock += task_io_get_oublock(tsk); - task_io_accounting_add(&sig->ioac, &tsk->ioac); -- sig->sum_sched_runtime += tsk->se.sum_exec_runtime; -+ sig->sum_sched_runtime += tsk_seruntime(tsk); - sig->nr_threads--; - __unhash_process(tsk, group_dead); - write_sequnlock(&sig->stats_lock); -diff --git a/kernel/fork.c b/kernel/fork.c -index fe83343da24b..5af242ba790f 100644 ---- a/kernel/fork.c -+++ b/kernel/fork.c -@@ -106,6 +106,11 @@ - - #define CREATE_TRACE_POINTS - #include -+#ifdef CONFIG_USER_NS -+extern int unprivileged_userns_clone; -+#else -+#define unprivileged_userns_clone 0 -+#endif - - /* - * Minimum number of threads to boot the kernel -@@ -727,7 +732,7 @@ void __put_task_struct(struct task_struct *tsk) - WARN_ON(tsk == current); - - cgroup_free(tsk); -- task_numa_free(tsk); -+ task_numa_free(tsk, true); - security_task_free(tsk); - exit_creds(tsk); - delayacct_tsk_free(tsk); -@@ -1765,6 +1770,10 @@ static __latent_entropy struct task_struct *copy_process( - if ((clone_flags & (CLONE_NEWUSER|CLONE_FS)) == (CLONE_NEWUSER|CLONE_FS)) - return ERR_PTR(-EINVAL); - -+ if ((clone_flags & CLONE_NEWUSER) && !unprivileged_userns_clone) -+ if (!capable(CAP_SYS_ADMIN)) -+ return ERR_PTR(-EPERM); -+ - /* - * Thread groups must share signals as well, and detached threads - * can only be started up within the thread group. -@@ -2653,6 +2662,12 @@ int ksys_unshare(unsigned long unshare_flags) - if (unshare_flags & CLONE_NEWNS) - unshare_flags |= CLONE_FS; - -+ if ((unshare_flags & CLONE_NEWUSER) && !unprivileged_userns_clone) { -+ err = -EPERM; -+ if (!capable(CAP_SYS_ADMIN)) -+ goto bad_unshare_out; -+ } -+ - err = check_unshare_flags(unshare_flags); - if (err) - goto bad_unshare_out; -diff --git a/kernel/iomem.c b/kernel/iomem.c -index 93c264444510..62c92e43aa0d 100644 ---- a/kernel/iomem.c -+++ b/kernel/iomem.c -@@ -121,7 +121,7 @@ EXPORT_SYMBOL(memremap); - - void memunmap(void *addr) - { -- if (is_vmalloc_addr(addr)) -+ if (is_ioremap_addr(addr)) - iounmap((void __iomem *) addr); - } - EXPORT_SYMBOL(memunmap); -diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c -index f18cd5aa33e8..656c14333613 100644 ---- a/kernel/irq/affinity.c -+++ b/kernel/irq/affinity.c -@@ -253,11 +253,9 @@ irq_create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd) - * Determine the number of vectors which need interrupt affinities - * assigned. If the pre/post request exhausts the available vectors - * then nothing to do here except for invoking the calc_sets() -- * callback so the device driver can adjust to the situation. If there -- * is only a single vector, then managing the queue is pointless as -- * well. -+ * callback so the device driver can adjust to the situation. - */ -- if (nvecs > 1 && nvecs > affd->pre_vectors + affd->post_vectors) -+ if (nvecs > affd->pre_vectors + affd->post_vectors) - affvecs = nvecs - affd->pre_vectors - affd->post_vectors; - else - affvecs = 0; -diff --git a/kernel/irq/autoprobe.c b/kernel/irq/autoprobe.c -index 16cbf6beb276..ae60cae24e9a 100644 ---- a/kernel/irq/autoprobe.c -+++ b/kernel/irq/autoprobe.c -@@ -90,7 +90,7 @@ unsigned long probe_irq_on(void) - /* It triggered already - consider it spurious. */ - if (!(desc->istate & IRQS_WAITING)) { - desc->istate &= ~IRQS_AUTODETECT; -- irq_shutdown(desc); -+ irq_shutdown_and_deactivate(desc); - } else - if (i < 32) - mask |= 1 << i; -@@ -127,7 +127,7 @@ unsigned int probe_irq_mask(unsigned long val) - mask |= 1 << i; - - desc->istate &= ~IRQS_AUTODETECT; -- irq_shutdown(desc); -+ irq_shutdown_and_deactivate(desc); - } - raw_spin_unlock_irq(&desc->lock); - } -@@ -169,7 +169,7 @@ int probe_irq_off(unsigned long val) - nr_of_irqs++; - } - desc->istate &= ~IRQS_AUTODETECT; -- irq_shutdown(desc); -+ irq_shutdown_and_deactivate(desc); - } - raw_spin_unlock_irq(&desc->lock); - } -diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c -index 29d6c7d070b4..b76703b2c0af 100644 ---- a/kernel/irq/chip.c -+++ b/kernel/irq/chip.c -@@ -314,6 +314,12 @@ void irq_shutdown(struct irq_desc *desc) - } - irq_state_clr_started(desc); - } -+} -+ -+ -+void irq_shutdown_and_deactivate(struct irq_desc *desc) -+{ -+ irq_shutdown(desc); - /* - * This must be called even if the interrupt was never started up, - * because the activation can happen before the interrupt is -@@ -748,6 +754,8 @@ void handle_fasteoi_nmi(struct irq_desc *desc) - unsigned int irq = irq_desc_get_irq(desc); - irqreturn_t res; - -+ __kstat_incr_irqs_this_cpu(desc); -+ - trace_irq_handler_entry(irq, action); - /* - * NMIs cannot be shared, there is only one action. -@@ -962,6 +970,8 @@ void handle_percpu_devid_fasteoi_nmi(struct irq_desc *desc) - unsigned int irq = irq_desc_get_irq(desc); - irqreturn_t res; - -+ __kstat_incr_irqs_this_cpu(desc); -+ - trace_irq_handler_entry(irq, action); - res = action->handler(irq, raw_cpu_ptr(action->percpu_dev_id)); - trace_irq_handler_exit(irq, action, res); -diff --git a/kernel/irq/cpuhotplug.c b/kernel/irq/cpuhotplug.c -index 5b1072e394b2..6c7ca2e983a5 100644 ---- a/kernel/irq/cpuhotplug.c -+++ b/kernel/irq/cpuhotplug.c -@@ -116,7 +116,7 @@ static bool migrate_one_irq(struct irq_desc *desc) - */ - if (irqd_affinity_is_managed(d)) { - irqd_set_managed_shutdown(d); -- irq_shutdown(desc); -+ irq_shutdown_and_deactivate(desc); - return false; - } - affinity = cpu_online_mask; -diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h -index 70c3053bc1f6..3a948f41ab00 100644 ---- a/kernel/irq/internals.h -+++ b/kernel/irq/internals.h -@@ -82,6 +82,7 @@ extern int irq_activate_and_startup(struct irq_desc *desc, bool resend); - extern int irq_startup(struct irq_desc *desc, bool resend, bool force); - - extern void irq_shutdown(struct irq_desc *desc); -+extern void irq_shutdown_and_deactivate(struct irq_desc *desc); - extern void irq_enable(struct irq_desc *desc); - extern void irq_disable(struct irq_desc *desc); - extern void irq_percpu_enable(struct irq_desc *desc, unsigned int cpu); -@@ -96,6 +97,10 @@ static inline void irq_mark_irq(unsigned int irq) { } - extern void irq_mark_irq(unsigned int irq); - #endif - -+extern int __irq_get_irqchip_state(struct irq_data *data, -+ enum irqchip_irq_state which, -+ bool *state); -+ - extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr); - - irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc, unsigned int *flags); -diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c -index c52b737ab8e3..9484e88dabc2 100644 ---- a/kernel/irq/irqdesc.c -+++ b/kernel/irq/irqdesc.c -@@ -680,6 +680,8 @@ int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq, - * @hwirq: The HW irq number to convert to a logical one - * @regs: Register file coming from the low-level handling code - * -+ * This function must be called from an NMI context. -+ * - * Returns: 0 on success, or -EINVAL if conversion has failed - */ - int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq, -@@ -689,7 +691,10 @@ int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq, - unsigned int irq; - int ret = 0; - -- nmi_enter(); -+ /* -+ * NMI context needs to be setup earlier in order to deal with tracing. -+ */ -+ WARN_ON(!in_nmi()); - - irq = irq_find_mapping(domain, hwirq); - -@@ -702,7 +707,6 @@ int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq, - else - ret = -EINVAL; - -- nmi_exit(); - set_irq_regs(old_regs); - return ret; - } -@@ -946,6 +950,11 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) - *per_cpu_ptr(desc->kstat_irqs, cpu) : 0; - } - -+static bool irq_is_nmi(struct irq_desc *desc) -+{ -+ return desc->istate & IRQS_NMI; -+} -+ - /** - * kstat_irqs - Get the statistics for an interrupt - * @irq: The interrupt number -@@ -963,7 +972,8 @@ unsigned int kstat_irqs(unsigned int irq) - if (!desc || !desc->kstat_irqs) - return 0; - if (!irq_settings_is_per_cpu_devid(desc) && -- !irq_settings_is_per_cpu(desc)) -+ !irq_settings_is_per_cpu(desc) && -+ !irq_is_nmi(desc)) - return desc->tot_count; - - for_each_possible_cpu(cpu) -diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c -index 78f3ddeb7fe4..e8f7f179bf77 100644 ---- a/kernel/irq/manage.c -+++ b/kernel/irq/manage.c -@@ -13,6 +13,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -34,8 +35,9 @@ static int __init setup_forced_irqthreads(char *arg) - early_param("threadirqs", setup_forced_irqthreads); - #endif - --static void __synchronize_hardirq(struct irq_desc *desc) -+static void __synchronize_hardirq(struct irq_desc *desc, bool sync_chip) - { -+ struct irq_data *irqd = irq_desc_get_irq_data(desc); - bool inprogress; - - do { -@@ -51,6 +53,20 @@ static void __synchronize_hardirq(struct irq_desc *desc) - /* Ok, that indicated we're done: double-check carefully. */ - raw_spin_lock_irqsave(&desc->lock, flags); - inprogress = irqd_irq_inprogress(&desc->irq_data); -+ -+ /* -+ * If requested and supported, check at the chip whether it -+ * is in flight at the hardware level, i.e. already pending -+ * in a CPU and waiting for service and acknowledge. -+ */ -+ if (!inprogress && sync_chip) { -+ /* -+ * Ignore the return code. inprogress is only updated -+ * when the chip supports it. -+ */ -+ __irq_get_irqchip_state(irqd, IRQCHIP_STATE_ACTIVE, -+ &inprogress); -+ } - raw_spin_unlock_irqrestore(&desc->lock, flags); - - /* Oops, that failed? */ -@@ -73,13 +89,18 @@ static void __synchronize_hardirq(struct irq_desc *desc) - * Returns: false if a threaded handler is active. - * - * This function may be called - with care - from IRQ context. -+ * -+ * It does not check whether there is an interrupt in flight at the -+ * hardware level, but not serviced yet, as this might deadlock when -+ * called with interrupts disabled and the target CPU of the interrupt -+ * is the current CPU. - */ - bool synchronize_hardirq(unsigned int irq) - { - struct irq_desc *desc = irq_to_desc(irq); - - if (desc) { -- __synchronize_hardirq(desc); -+ __synchronize_hardirq(desc, false); - return !atomic_read(&desc->threads_active); - } - -@@ -95,14 +116,19 @@ EXPORT_SYMBOL(synchronize_hardirq); - * to complete before returning. If you use this function while - * holding a resource the IRQ handler may need you will deadlock. - * -- * This function may be called - with care - from IRQ context. -+ * Can only be called from preemptible code as it might sleep when -+ * an interrupt thread is associated to @irq. -+ * -+ * It optionally makes sure (when the irq chip supports that method) -+ * that the interrupt is not pending in any CPU and waiting for -+ * service. - */ - void synchronize_irq(unsigned int irq) - { - struct irq_desc *desc = irq_to_desc(irq); - - if (desc) { -- __synchronize_hardirq(desc); -+ __synchronize_hardirq(desc, true); - /* - * We made sure that no hardirq handler is - * running. Now verify that no threaded handlers are -@@ -1699,6 +1725,7 @@ static struct irqaction *__free_irq(struct irq_desc *desc, void *dev_id) - /* If this was the last handler, shut down the IRQ line: */ - if (!desc->action) { - irq_settings_clr_disable_unlazy(desc); -+ /* Only shutdown. Deactivate after synchronize_hardirq() */ - irq_shutdown(desc); - } - -@@ -1727,8 +1754,12 @@ static struct irqaction *__free_irq(struct irq_desc *desc, void *dev_id) - - unregister_handler_proc(irq, action); - -- /* Make sure it's not being used on another CPU: */ -- synchronize_hardirq(irq); -+ /* -+ * Make sure it's not being used on another CPU and if the chip -+ * supports it also make sure that there is no (not yet serviced) -+ * interrupt in flight at the hardware level. -+ */ -+ __synchronize_hardirq(desc, true); - - #ifdef CONFIG_DEBUG_SHIRQ - /* -@@ -1768,6 +1799,14 @@ static struct irqaction *__free_irq(struct irq_desc *desc, void *dev_id) - * require it to deallocate resources over the slow bus. - */ - chip_bus_lock(desc); -+ /* -+ * There is no interrupt on the fly anymore. Deactivate it -+ * completely. -+ */ -+ raw_spin_lock_irqsave(&desc->lock, flags); -+ irq_domain_deactivate_irq(&desc->irq_data); -+ raw_spin_unlock_irqrestore(&desc->lock, flags); -+ - irq_release_resources(desc); - chip_bus_sync_unlock(desc); - irq_remove_timings(desc); -@@ -1855,7 +1894,7 @@ static const void *__cleanup_nmi(unsigned int irq, struct irq_desc *desc) - } - - irq_settings_clr_disable_unlazy(desc); -- irq_shutdown(desc); -+ irq_shutdown_and_deactivate(desc); - - irq_release_resources(desc); - -@@ -2578,6 +2617,28 @@ void teardown_percpu_nmi(unsigned int irq) - irq_put_desc_unlock(desc, flags); - } - -+int __irq_get_irqchip_state(struct irq_data *data, enum irqchip_irq_state which, -+ bool *state) -+{ -+ struct irq_chip *chip; -+ int err = -EINVAL; -+ -+ do { -+ chip = irq_data_get_irq_chip(data); -+ if (chip->irq_get_irqchip_state) -+ break; -+#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY -+ data = data->parent_data; -+#else -+ data = NULL; -+#endif -+ } while (data); -+ -+ if (data) -+ err = chip->irq_get_irqchip_state(data, which, state); -+ return err; -+} -+ - /** - * irq_get_irqchip_state - returns the irqchip state of a interrupt. - * @irq: Interrupt line that is forwarded to a VM -@@ -2596,7 +2657,6 @@ int irq_get_irqchip_state(unsigned int irq, enum irqchip_irq_state which, - { - struct irq_desc *desc; - struct irq_data *data; -- struct irq_chip *chip; - unsigned long flags; - int err = -EINVAL; - -@@ -2606,19 +2666,7 @@ int irq_get_irqchip_state(unsigned int irq, enum irqchip_irq_state which, - - data = irq_desc_get_irq_data(desc); - -- do { -- chip = irq_data_get_irq_chip(data); -- if (chip->irq_get_irqchip_state) -- break; --#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY -- data = data->parent_data; --#else -- data = NULL; --#endif -- } while (data); -- -- if (data) -- err = chip->irq_get_irqchip_state(data, which, state); -+ err = __irq_get_irqchip_state(data, which, state); - - irq_put_desc_busunlock(desc, flags); - return err; -diff --git a/kernel/kthread.c b/kernel/kthread.c -index 621467c33fef..561a8f8be68d 100644 ---- a/kernel/kthread.c -+++ b/kernel/kthread.c -@@ -433,6 +433,34 @@ void kthread_bind(struct task_struct *p, unsigned int cpu) - } - EXPORT_SYMBOL(kthread_bind); - -+#if defined(CONFIG_SCHED_MUQSS) && defined(CONFIG_SMP) -+extern void __do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask); -+ -+/* -+ * new_kthread_bind is a special variant of __kthread_bind_mask. -+ * For new threads to work on muqss we want to call do_set_cpus_allowed -+ * without the task_cpu being set and the task rescheduled until they're -+ * rescheduled on their own so we call __do_set_cpus_allowed directly which -+ * only changes the cpumask. This is particularly important for smpboot threads -+ * to work. -+ */ -+static void new_kthread_bind(struct task_struct *p, unsigned int cpu) -+{ -+ unsigned long flags; -+ -+ if (WARN_ON(!wait_task_inactive(p, TASK_UNINTERRUPTIBLE))) -+ return; -+ -+ /* It's safe because the task is inactive. */ -+ raw_spin_lock_irqsave(&p->pi_lock, flags); -+ __do_set_cpus_allowed(p, cpumask_of(cpu)); -+ p->flags |= PF_NO_SETAFFINITY; -+ raw_spin_unlock_irqrestore(&p->pi_lock, flags); -+} -+#else -+#define new_kthread_bind(p, cpu) kthread_bind(p, cpu) -+#endif -+ - /** - * kthread_create_on_cpu - Create a cpu bound kthread - * @threadfn: the function to run until signal_pending(current). -@@ -454,7 +482,7 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data), - cpu); - if (IS_ERR(p)) - return p; -- kthread_bind(p, cpu); -+ new_kthread_bind(p, cpu); - /* CPU hotplug need to bind once again when unparking the thread. */ - set_bit(KTHREAD_IS_PER_CPU, &to_kthread(p)->flags); - to_kthread(p)->cpu = cpu; -diff --git a/kernel/livepatch/transition.c b/kernel/livepatch/transition.c -index abb2a4a2cbb2..7b2f72a24039 100644 ---- a/kernel/livepatch/transition.c -+++ b/kernel/livepatch/transition.c -@@ -282,7 +282,7 @@ static int klp_check_stack(struct task_struct *task, char *err_buf) - static bool klp_try_switch_task(struct task_struct *task) - { - struct rq *rq; -- struct rq_flags flags; -+ struct rq_flags rf; - int ret; - bool success = false; - char err_buf[STACK_ERR_BUF_SIZE]; -@@ -298,7 +298,7 @@ static bool klp_try_switch_task(struct task_struct *task) - * functions. If all goes well, switch the task to the target patch - * state. - */ -- rq = task_rq_lock(task, &flags); -+ rq = task_rq_lock(task, &rf); - - if (task_running(rq, task) && task != current) { - snprintf(err_buf, STACK_ERR_BUF_SIZE, -@@ -317,7 +317,7 @@ static bool klp_try_switch_task(struct task_struct *task) - task->patch_state = klp_target_state; - - done: -- task_rq_unlock(rq, task, &flags); -+ task_rq_unlock(rq, task, &rf); - - /* - * Due to console deadlock issues, pr_debug() can't be used while -diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c -index c47788fa85f9..dbc936ccf149 100644 ---- a/kernel/locking/lockdep.c -+++ b/kernel/locking/lockdep.c -@@ -3703,19 +3703,19 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, - if (depth) { - hlock = curr->held_locks + depth - 1; - if (hlock->class_idx == class_idx && nest_lock) { -- if (hlock->references) { -- /* -- * Check: unsigned int references:12, overflow. -- */ -- if (DEBUG_LOCKS_WARN_ON(hlock->references == (1 << 12)-1)) -- return 0; -+ if (!references) -+ references++; - -+ if (!hlock->references) - hlock->references++; -- } else { -- hlock->references = 2; -- } - -- return 1; -+ hlock->references += references; -+ -+ /* Overflow */ -+ if (DEBUG_LOCKS_WARN_ON(hlock->references < references)) -+ return 0; -+ -+ return 2; - } - } - -@@ -3921,22 +3921,33 @@ static struct held_lock *find_held_lock(struct task_struct *curr, - } - - static int reacquire_held_locks(struct task_struct *curr, unsigned int depth, -- int idx) -+ int idx, unsigned int *merged) - { - struct held_lock *hlock; -+ int first_idx = idx; - - if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) - return 0; - - for (hlock = curr->held_locks + idx; idx < depth; idx++, hlock++) { -- if (!__lock_acquire(hlock->instance, -+ switch (__lock_acquire(hlock->instance, - hlock_class(hlock)->subclass, - hlock->trylock, - hlock->read, hlock->check, - hlock->hardirqs_off, - hlock->nest_lock, hlock->acquire_ip, -- hlock->references, hlock->pin_count)) -+ hlock->references, hlock->pin_count)) { -+ case 0: - return 1; -+ case 1: -+ break; -+ case 2: -+ *merged += (idx == first_idx); -+ break; -+ default: -+ WARN_ON(1); -+ return 0; -+ } - } - return 0; - } -@@ -3947,9 +3958,9 @@ __lock_set_class(struct lockdep_map *lock, const char *name, - unsigned long ip) - { - struct task_struct *curr = current; -+ unsigned int depth, merged = 0; - struct held_lock *hlock; - struct lock_class *class; -- unsigned int depth; - int i; - - if (unlikely(!debug_locks)) -@@ -3974,14 +3985,14 @@ __lock_set_class(struct lockdep_map *lock, const char *name, - curr->lockdep_depth = i; - curr->curr_chain_key = hlock->prev_chain_key; - -- if (reacquire_held_locks(curr, depth, i)) -+ if (reacquire_held_locks(curr, depth, i, &merged)) - return 0; - - /* - * I took it apart and put it back together again, except now I have - * these 'spare' parts.. where shall I put them. - */ -- if (DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth)) -+ if (DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth - merged)) - return 0; - return 1; - } -@@ -3989,8 +4000,8 @@ __lock_set_class(struct lockdep_map *lock, const char *name, - static int __lock_downgrade(struct lockdep_map *lock, unsigned long ip) - { - struct task_struct *curr = current; -+ unsigned int depth, merged = 0; - struct held_lock *hlock; -- unsigned int depth; - int i; - - if (unlikely(!debug_locks)) -@@ -4015,7 +4026,11 @@ static int __lock_downgrade(struct lockdep_map *lock, unsigned long ip) - hlock->read = 1; - hlock->acquire_ip = ip; - -- if (reacquire_held_locks(curr, depth, i)) -+ if (reacquire_held_locks(curr, depth, i, &merged)) -+ return 0; -+ -+ /* Merging can't happen with unchanged classes.. */ -+ if (DEBUG_LOCKS_WARN_ON(merged)) - return 0; - - /* -@@ -4024,6 +4039,7 @@ static int __lock_downgrade(struct lockdep_map *lock, unsigned long ip) - */ - if (DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth)) - return 0; -+ - return 1; - } - -@@ -4038,8 +4054,8 @@ static int - __lock_release(struct lockdep_map *lock, int nested, unsigned long ip) - { - struct task_struct *curr = current; -+ unsigned int depth, merged = 1; - struct held_lock *hlock; -- unsigned int depth; - int i; - - if (unlikely(!debug_locks)) -@@ -4094,14 +4110,15 @@ __lock_release(struct lockdep_map *lock, int nested, unsigned long ip) - if (i == depth-1) - return 1; - -- if (reacquire_held_locks(curr, depth, i + 1)) -+ if (reacquire_held_locks(curr, depth, i + 1, &merged)) - return 0; - - /* - * We had N bottles of beer on the wall, we drank one, but now - * there's not N-1 bottles of beer left on the wall... -+ * Pouring two of the bottles together is acceptable. - */ -- DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth-1); -+ DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth - merged); - - /* - * Since reacquire_held_locks() would have called check_chain_key() -diff --git a/kernel/locking/lockdep_proc.c b/kernel/locking/lockdep_proc.c -index 9c49ec645d8b..bda006f8a88b 100644 ---- a/kernel/locking/lockdep_proc.c -+++ b/kernel/locking/lockdep_proc.c -@@ -200,7 +200,6 @@ static void lockdep_stats_debug_show(struct seq_file *m) - - static int lockdep_stats_show(struct seq_file *m, void *v) - { -- struct lock_class *class; - unsigned long nr_unused = 0, nr_uncategorized = 0, - nr_irq_safe = 0, nr_irq_unsafe = 0, - nr_softirq_safe = 0, nr_softirq_unsafe = 0, -@@ -210,6 +209,9 @@ static int lockdep_stats_show(struct seq_file *m, void *v) - nr_hardirq_read_safe = 0, nr_hardirq_read_unsafe = 0, - sum_forward_deps = 0; - -+#ifdef CONFIG_PROVE_LOCKING -+ struct lock_class *class; -+ - list_for_each_entry(class, &all_lock_classes, lock_entry) { - - if (class->usage_mask == 0) -@@ -241,12 +243,12 @@ static int lockdep_stats_show(struct seq_file *m, void *v) - if (class->usage_mask & LOCKF_ENABLED_HARDIRQ_READ) - nr_hardirq_read_unsafe++; - --#ifdef CONFIG_PROVE_LOCKING - sum_forward_deps += lockdep_count_forward_deps(class); --#endif - } - #ifdef CONFIG_DEBUG_LOCKDEP - DEBUG_LOCKS_WARN_ON(debug_atomic_read(nr_unused_locks) != nr_unused); -+#endif -+ - #endif - seq_printf(m, " lock-classes: %11lu [max: %lu]\n", - nr_lock_classes, MAX_LOCKDEP_KEYS); -diff --git a/kernel/module.c b/kernel/module.c -index 80c7c09584cf..8431c3d47c97 100644 ---- a/kernel/module.c -+++ b/kernel/module.c -@@ -3385,8 +3385,7 @@ static bool finished_loading(const char *name) - sched_annotate_sleep(); - mutex_lock(&module_mutex); - mod = find_module_all(name, strlen(name), true); -- ret = !mod || mod->state == MODULE_STATE_LIVE -- || mod->state == MODULE_STATE_GOING; -+ ret = !mod || mod->state == MODULE_STATE_LIVE; - mutex_unlock(&module_mutex); - - return ret; -@@ -3576,8 +3575,7 @@ static int add_unformed_module(struct module *mod) - mutex_lock(&module_mutex); - old = find_module_all(mod->name, strlen(mod->name), true); - if (old != NULL) { -- if (old->state == MODULE_STATE_COMING -- || old->state == MODULE_STATE_UNFORMED) { -+ if (old->state != MODULE_STATE_LIVE) { - /* Wait in case it fails to load. */ - mutex_unlock(&module_mutex); - err = wait_event_interruptible(module_wq, -diff --git a/kernel/padata.c b/kernel/padata.c -index 2d2fddbb7a4c..15a8ad63f4ff 100644 ---- a/kernel/padata.c -+++ b/kernel/padata.c -@@ -267,7 +267,12 @@ static void padata_reorder(struct parallel_data *pd) - * The next object that needs serialization might have arrived to - * the reorder queues in the meantime, we will be called again - * from the timer function if no one else cares for it. -+ * -+ * Ensure reorder_objects is read after pd->lock is dropped so we see -+ * an increment from another task in padata_do_serial. Pairs with -+ * smp_mb__after_atomic in padata_do_serial. - */ -+ smp_mb(); - if (atomic_read(&pd->reorder_objects) - && !(pinst->flags & PADATA_RESET)) - mod_timer(&pd->timer, jiffies + HZ); -@@ -387,6 +392,13 @@ void padata_do_serial(struct padata_priv *padata) - list_add_tail(&padata->list, &pqueue->reorder.list); - spin_unlock(&pqueue->reorder.lock); - -+ /* -+ * Ensure the atomic_inc of reorder_objects above is ordered correctly -+ * with the trylock of pd->lock in padata_reorder. Pairs with smp_mb -+ * in padata_reorder. -+ */ -+ smp_mb__after_atomic(); -+ - put_cpu(); - - /* If we're running on the wrong CPU, call padata_reorder() via a -diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c -index f54bc7cb6c2d..6d726cef241c 100644 ---- a/kernel/pid_namespace.c -+++ b/kernel/pid_namespace.c -@@ -326,7 +326,7 @@ int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd) - } - - read_lock(&tasklist_lock); -- force_sig(SIGKILL, pid_ns->child_reaper); -+ send_sig(SIGKILL, pid_ns->child_reaper, 1); - read_unlock(&tasklist_lock); - - do_exit(0); -diff --git a/kernel/resource.c b/kernel/resource.c -index 158f04ec1d4f..c3cc6d85ec52 100644 ---- a/kernel/resource.c -+++ b/kernel/resource.c -@@ -326,7 +326,7 @@ EXPORT_SYMBOL(release_resource); - * - * If a resource is found, returns 0 and @*res is overwritten with the part - * of the resource that's within [@start..@end]; if none is found, returns -- * -1 or -EINVAL for other invalid parameters. -+ * -ENODEV. Returns -EINVAL for invalid parameters. - * - * This function walks the whole tree and not just first level children - * unless @first_lvl is true. -@@ -365,16 +365,16 @@ static int find_next_iomem_res(resource_size_t start, resource_size_t end, - break; - } - -+ if (p) { -+ /* copy data */ -+ res->start = max(start, p->start); -+ res->end = min(end, p->end); -+ res->flags = p->flags; -+ res->desc = p->desc; -+ } -+ - read_unlock(&resource_lock); -- if (!p) -- return -1; -- -- /* copy data */ -- res->start = max(start, p->start); -- res->end = min(end, p->end); -- res->flags = p->flags; -- res->desc = p->desc; -- return 0; -+ return p ? 0 : -ENODEV; - } - - static int __walk_iomem_res_desc(resource_size_t start, resource_size_t end, -diff --git a/kernel/sched/Makefile b/kernel/sched/Makefile -index 21fb5a5662b5..a04ffebc6b7a 100644 ---- a/kernel/sched/Makefile -+++ b/kernel/sched/Makefile -@@ -16,15 +16,23 @@ ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER),y) - CFLAGS_core.o := $(PROFILING) -fno-omit-frame-pointer - endif - -+ifdef CONFIG_SCHED_MUQSS -+obj-y += MuQSS.o clock.o cputime.o -+obj-y += idle.o -+obj-y += wait.o wait_bit.o swait.o completion.o -+ -+obj-$(CONFIG_SMP) += topology.o -+else - obj-y += core.o loadavg.o clock.o cputime.o - obj-y += idle.o fair.o rt.o deadline.o - obj-y += wait.o wait_bit.o swait.o completion.o - - obj-$(CONFIG_SMP) += cpupri.o cpudeadline.o topology.o stop_task.o pelt.o - obj-$(CONFIG_SCHED_AUTOGROUP) += autogroup.o --obj-$(CONFIG_SCHEDSTATS) += stats.o - obj-$(CONFIG_SCHED_DEBUG) += debug.o - obj-$(CONFIG_CGROUP_CPUACCT) += cpuacct.o -+endif -+obj-$(CONFIG_SCHEDSTATS) += stats.o - obj-$(CONFIG_CPU_FREQ) += cpufreq.o - obj-$(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) += cpufreq_schedutil.o - obj-$(CONFIG_MEMBARRIER) += membarrier.o -diff --git a/kernel/sched/MuQSS.c b/kernel/sched/MuQSS.c -new file mode 100644 -index 000000000000..822be3de611f ---- /dev/null -+++ b/kernel/sched/MuQSS.c -@@ -0,0 +1,7453 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * kernel/sched/MuQSS.c, was kernel/sched.c -+ * -+ * Kernel scheduler and related syscalls -+ * -+ * Copyright (C) 1991-2002 Linus Torvalds -+ * -+ * 1996-12-23 Modified by Dave Grothe to fix bugs in semaphores and -+ * make semaphores SMP safe -+ * 1998-11-19 Implemented schedule_timeout() and related stuff -+ * by Andrea Arcangeli -+ * 2002-01-04 New ultra-scalable O(1) scheduler by Ingo Molnar: -+ * hybrid priority-list and round-robin design with -+ * an array-switch method of distributing timeslices -+ * and per-CPU runqueues. Cleanups and useful suggestions -+ * by Davide Libenzi, preemptible kernel bits by Robert Love. -+ * 2003-09-03 Interactivity tuning by Con Kolivas. -+ * 2004-04-02 Scheduler domains code by Nick Piggin -+ * 2007-04-15 Work begun on replacing all interactivity tuning with a -+ * fair scheduling design by Con Kolivas. -+ * 2007-05-05 Load balancing (smp-nice) and other improvements -+ * by Peter Williams -+ * 2007-05-06 Interactivity improvements to CFS by Mike Galbraith -+ * 2007-07-01 Group scheduling enhancements by Srivatsa Vaddagiri -+ * 2007-11-29 RT balancing improvements by Steven Rostedt, Gregory Haskins, -+ * Thomas Gleixner, Mike Kravetz -+ * 2009-08-13 Brainfuck deadline scheduling policy by Con Kolivas deletes -+ * a whole lot of those previous things. -+ * 2016-10-01 Multiple Queue Skiplist Scheduler scalable evolution of BFS -+ * scheduler by Con Kolivas. -+ */ -+ -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+#include -+#include -+ -+#include "../workqueue_internal.h" -+#include "../smpboot.h" -+ -+#define CREATE_TRACE_POINTS -+#include -+ -+#include "MuQSS.h" -+ -+#define rt_prio(prio) unlikely((prio) < MAX_RT_PRIO) -+#define rt_task(p) rt_prio((p)->prio) -+#define batch_task(p) (unlikely((p)->policy == SCHED_BATCH)) -+#define is_rt_policy(policy) ((policy) == SCHED_FIFO || \ -+ (policy) == SCHED_RR) -+#define has_rt_policy(p) unlikely(is_rt_policy((p)->policy)) -+ -+#define is_idle_policy(policy) ((policy) == SCHED_IDLEPRIO) -+#define idleprio_task(p) unlikely(is_idle_policy((p)->policy)) -+#define task_running_idle(p) unlikely((p)->prio == IDLE_PRIO) -+ -+#define is_iso_policy(policy) ((policy) == SCHED_ISO) -+#define iso_task(p) unlikely(is_iso_policy((p)->policy)) -+#define task_running_iso(p) unlikely((p)->prio == ISO_PRIO) -+ -+#define rq_idle(rq) ((rq)->rq_prio == PRIO_LIMIT) -+ -+#define ISO_PERIOD (5 * HZ) -+ -+#define STOP_PRIO (MAX_RT_PRIO - 1) -+ -+/* -+ * Some helpers for converting to/from various scales. Use shifts to get -+ * approximate multiples of ten for less overhead. -+ */ -+#define APPROX_NS_PS (1073741824) /* Approximate ns per second */ -+#define JIFFIES_TO_NS(TIME) ((TIME) * (APPROX_NS_PS / HZ)) -+#define JIFFY_NS (APPROX_NS_PS / HZ) -+#define JIFFY_US (1048576 / HZ) -+#define NS_TO_JIFFIES(TIME) ((TIME) / JIFFY_NS) -+#define HALF_JIFFY_NS (APPROX_NS_PS / HZ / 2) -+#define HALF_JIFFY_US (1048576 / HZ / 2) -+#define MS_TO_NS(TIME) ((TIME) << 20) -+#define MS_TO_US(TIME) ((TIME) << 10) -+#define NS_TO_MS(TIME) ((TIME) >> 20) -+#define NS_TO_US(TIME) ((TIME) >> 10) -+#define US_TO_NS(TIME) ((TIME) << 10) -+#define TICK_APPROX_NS ((APPROX_NS_PS+HZ/2)/HZ) -+ -+#define RESCHED_US (100) /* Reschedule if less than this many μs left */ -+ -+void print_scheduler_version(void) -+{ -+ printk(KERN_INFO "MuQSS CPU scheduler v0.193 by Con Kolivas.\n"); -+} -+ -+#define RQSHARE_NONE 0 -+#define RQSHARE_SMT 1 -+#define RQSHARE_MC 2 -+#define RQSHARE_SMP 3 -+#define RQSHARE_ALL 4 -+ -+/* -+ * This determines what level of runqueue sharing will be done and is -+ * configurable at boot time with the bootparam rqshare = -+ */ -+static int rqshare __read_mostly = CONFIG_SHARERQ; /* Default RQSHARE_MC */ -+ -+static int __init set_rqshare(char *str) -+{ -+ if (!strncmp(str, "none", 4)) { -+ rqshare = RQSHARE_NONE; -+ return 0; -+ } -+ if (!strncmp(str, "smt", 3)) { -+ rqshare = RQSHARE_SMT; -+ return 0; -+ } -+ if (!strncmp(str, "mc", 2)) { -+ rqshare = RQSHARE_MC; -+ return 0; -+ } -+ if (!strncmp(str, "smp", 3)) { -+ rqshare = RQSHARE_SMP; -+ return 0; -+ } -+ if (!strncmp(str, "all", 3)) { -+ rqshare = RQSHARE_ALL; -+ return 0; -+ } -+ return 1; -+} -+__setup("rqshare=", set_rqshare); -+ -+/* -+ * This is the time all tasks within the same priority round robin. -+ * Value is in ms and set to a minimum of 6ms. -+ * Tunable via /proc interface. -+ */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+int rr_interval __read_mostly = 2; -+#else -+int rr_interval __read_mostly = 6; -+#endif -+ -+/* -+ * Tunable to choose whether to prioritise latency or throughput, simple -+ * binary yes or no -+ */ -+int sched_interactive __read_mostly = 1; -+ -+/* -+ * sched_iso_cpu - sysctl which determines the cpu percentage SCHED_ISO tasks -+ * are allowed to run five seconds as real time tasks. This is the total over -+ * all online cpus. -+ */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+int sched_iso_cpu __read_mostly = 25; -+#else -+int sched_iso_cpu __read_mostly = 70; -+#endif -+ -+/* -+ * sched_yield_type - Choose what sort of yield sched_yield will perform. -+ * 0: No yield. -+ * 1: Yield only to better priority/deadline tasks. (default) -+ * 2: Expire timeslice and recalculate deadline. -+ */ -+ -+#ifdef CONFIG_ZEN_INTERACTIVE -+int sched_yield_type __read_mostly = 2; -+#else -+int sched_yield_type __read_mostly = 1; -+#endif -+ -+/* -+ * The relative length of deadline for each priority(nice) level. -+ */ -+static int prio_ratios[NICE_WIDTH] __read_mostly; -+ -+ -+/* -+ * The quota handed out to tasks of all priority levels when refilling their -+ * time_slice. -+ */ -+static inline int timeslice(void) -+{ -+ return MS_TO_US(rr_interval); -+} -+ -+DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); -+ -+#ifdef CONFIG_SMP -+/* -+ * Total number of runqueues. Equals number of CPUs when there is no runqueue -+ * sharing but is usually less with SMT/MC sharing of runqueues. -+ */ -+static int total_runqueues __read_mostly = 1; -+ -+static cpumask_t cpu_idle_map ____cacheline_aligned_in_smp; -+ -+struct rq *cpu_rq(int cpu) -+{ -+ return &per_cpu(runqueues, (cpu)); -+} -+#define cpu_curr(cpu) (cpu_rq(cpu)->curr) -+ -+/* -+ * For asym packing, by default the lower numbered cpu has higher priority. -+ */ -+int __weak arch_asym_cpu_priority(int cpu) -+{ -+ return -cpu; -+} -+ -+int __weak arch_sd_sibling_asym_packing(void) -+{ -+ return 0*SD_ASYM_PACKING; -+} -+ -+#ifdef CONFIG_SCHED_SMT -+DEFINE_STATIC_KEY_FALSE(sched_smt_present); -+EXPORT_SYMBOL_GPL(sched_smt_present); -+#endif -+ -+#else -+struct rq *uprq; -+#endif /* CONFIG_SMP */ -+ -+#include "stats.h" -+ -+/* -+ * All common locking functions performed on rq->lock. rq->clock is local to -+ * the CPU accessing it so it can be modified just with interrupts disabled -+ * when we're not updating niffies. -+ * Looking up task_rq must be done under rq->lock to be safe. -+ */ -+ -+/* -+ * RQ-clock updating methods: -+ */ -+ -+#ifdef HAVE_SCHED_AVG_IRQ -+static void update_irq_load_avg(struct rq *rq, long delta); -+#else -+static inline void update_irq_load_avg(struct rq *rq, long delta) {} -+#endif -+ -+static void update_rq_clock_task(struct rq *rq, s64 delta) -+{ -+/* -+ * In theory, the compile should just see 0 here, and optimize out the call -+ * to sched_rt_avg_update. But I don't trust it... -+ */ -+ s64 __maybe_unused steal = 0, irq_delta = 0; -+#ifdef CONFIG_IRQ_TIME_ACCOUNTING -+ irq_delta = irq_time_read(cpu_of(rq)) - rq->prev_irq_time; -+ -+ /* -+ * Since irq_time is only updated on {soft,}irq_exit, we might run into -+ * this case when a previous update_rq_clock() happened inside a -+ * {soft,}irq region. -+ * -+ * When this happens, we stop ->clock_task and only update the -+ * prev_irq_time stamp to account for the part that fit, so that a next -+ * update will consume the rest. This ensures ->clock_task is -+ * monotonic. -+ * -+ * It does however cause some slight miss-attribution of {soft,}irq -+ * time, a more accurate solution would be to update the irq_time using -+ * the current rq->clock timestamp, except that would require using -+ * atomic ops. -+ */ -+ if (irq_delta > delta) -+ irq_delta = delta; -+ -+ rq->prev_irq_time += irq_delta; -+ delta -= irq_delta; -+#endif -+#ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING -+ if (static_key_false((¶virt_steal_rq_enabled))) { -+ steal = paravirt_steal_clock(cpu_of(rq)); -+ steal -= rq->prev_steal_time_rq; -+ -+ if (unlikely(steal > delta)) -+ steal = delta; -+ -+ rq->prev_steal_time_rq += steal; -+ delta -= steal; -+ } -+#endif -+ rq->clock_task += delta; -+ -+#ifdef CONFIG_HAVE_SCHED_AVG_IRQ -+ if (irq_delta + steal) -+ update_irq_load_avg(rq, irq_delta + steal); -+#endif -+} -+ -+static inline void update_rq_clock(struct rq *rq) -+{ -+ s64 delta = sched_clock_cpu(cpu_of(rq)) - rq->clock; -+ -+ if (unlikely(delta < 0)) -+ return; -+ rq->clock += delta; -+ update_rq_clock_task(rq, delta); -+} -+ -+/* -+ * Niffies are a globally increasing nanosecond counter. They're only used by -+ * update_load_avg and time_slice_expired, however deadlines are based on them -+ * across CPUs. Update them whenever we will call one of those functions, and -+ * synchronise them across CPUs whenever we hold both runqueue locks. -+ */ -+static inline void update_clocks(struct rq *rq) -+{ -+ s64 ndiff, minndiff; -+ long jdiff; -+ -+ update_rq_clock(rq); -+ ndiff = rq->clock - rq->old_clock; -+ rq->old_clock = rq->clock; -+ jdiff = jiffies - rq->last_jiffy; -+ -+ /* Subtract any niffies added by balancing with other rqs */ -+ ndiff -= rq->niffies - rq->last_niffy; -+ minndiff = JIFFIES_TO_NS(jdiff) - rq->niffies + rq->last_jiffy_niffies; -+ if (minndiff < 0) -+ minndiff = 0; -+ ndiff = max(ndiff, minndiff); -+ rq->niffies += ndiff; -+ rq->last_niffy = rq->niffies; -+ if (jdiff) { -+ rq->last_jiffy += jdiff; -+ rq->last_jiffy_niffies = rq->niffies; -+ } -+} -+ -+/* -+ * Any time we have two runqueues locked we use that as an opportunity to -+ * synchronise niffies to the highest value as idle ticks may have artificially -+ * kept niffies low on one CPU and the truth can only be later. -+ */ -+static inline void synchronise_niffies(struct rq *rq1, struct rq *rq2) -+{ -+ if (rq1->niffies > rq2->niffies) -+ rq2->niffies = rq1->niffies; -+ else -+ rq1->niffies = rq2->niffies; -+} -+ -+/* -+ * double_rq_lock - safely lock two runqueues -+ * -+ * Note this does not disable interrupts like task_rq_lock, -+ * you need to do so manually before calling. -+ */ -+ -+/* For when we know rq1 != rq2 */ -+static inline void __double_rq_lock(struct rq *rq1, struct rq *rq2) -+ __acquires(rq1->lock) -+ __acquires(rq2->lock) -+{ -+ if (rq1 < rq2) { -+ raw_spin_lock(rq1->lock); -+ raw_spin_lock_nested(rq2->lock, SINGLE_DEPTH_NESTING); -+ } else { -+ raw_spin_lock(rq2->lock); -+ raw_spin_lock_nested(rq1->lock, SINGLE_DEPTH_NESTING); -+ } -+} -+ -+static inline void double_rq_lock(struct rq *rq1, struct rq *rq2) -+ __acquires(rq1->lock) -+ __acquires(rq2->lock) -+{ -+ BUG_ON(!irqs_disabled()); -+ if (rq1->lock == rq2->lock) { -+ raw_spin_lock(rq1->lock); -+ __acquire(rq2->lock); /* Fake it out ;) */ -+ } else -+ __double_rq_lock(rq1, rq2); -+ synchronise_niffies(rq1, rq2); -+} -+ -+/* -+ * double_rq_unlock - safely unlock two runqueues -+ * -+ * Note this does not restore interrupts like task_rq_unlock, -+ * you need to do so manually after calling. -+ */ -+static inline void double_rq_unlock(struct rq *rq1, struct rq *rq2) -+ __releases(rq1->lock) -+ __releases(rq2->lock) -+{ -+ raw_spin_unlock(rq1->lock); -+ if (rq1->lock != rq2->lock) -+ raw_spin_unlock(rq2->lock); -+ else -+ __release(rq2->lock); -+} -+ -+static inline void lock_all_rqs(void) -+{ -+ int cpu; -+ -+ preempt_disable(); -+ for_each_possible_cpu(cpu) { -+ struct rq *rq = cpu_rq(cpu); -+ -+ do_raw_spin_lock(rq->lock); -+ } -+} -+ -+static inline void unlock_all_rqs(void) -+{ -+ int cpu; -+ -+ for_each_possible_cpu(cpu) { -+ struct rq *rq = cpu_rq(cpu); -+ -+ do_raw_spin_unlock(rq->lock); -+ } -+ preempt_enable(); -+} -+ -+/* Specially nest trylock an rq */ -+static inline bool trylock_rq(struct rq *this_rq, struct rq *rq) -+{ -+ if (unlikely(!do_raw_spin_trylock(rq->lock))) -+ return false; -+ spin_acquire(&rq->lock->dep_map, SINGLE_DEPTH_NESTING, 1, _RET_IP_); -+ synchronise_niffies(this_rq, rq); -+ return true; -+} -+ -+/* Unlock a specially nested trylocked rq */ -+static inline void unlock_rq(struct rq *rq) -+{ -+ spin_release(&rq->lock->dep_map, 1, _RET_IP_); -+ do_raw_spin_unlock(rq->lock); -+} -+ -+/* -+ * cmpxchg based fetch_or, macro so it works for different integer types -+ */ -+#define fetch_or(ptr, mask) \ -+ ({ \ -+ typeof(ptr) _ptr = (ptr); \ -+ typeof(mask) _mask = (mask); \ -+ typeof(*_ptr) _old, _val = *_ptr; \ -+ \ -+ for (;;) { \ -+ _old = cmpxchg(_ptr, _val, _val | _mask); \ -+ if (_old == _val) \ -+ break; \ -+ _val = _old; \ -+ } \ -+ _old; \ -+}) -+ -+#if defined(CONFIG_SMP) && defined(TIF_POLLING_NRFLAG) -+/* -+ * Atomically set TIF_NEED_RESCHED and test for TIF_POLLING_NRFLAG, -+ * this avoids any races wrt polling state changes and thereby avoids -+ * spurious IPIs. -+ */ -+static bool set_nr_and_not_polling(struct task_struct *p) -+{ -+ struct thread_info *ti = task_thread_info(p); -+ return !(fetch_or(&ti->flags, _TIF_NEED_RESCHED) & _TIF_POLLING_NRFLAG); -+} -+ -+/* -+ * Atomically set TIF_NEED_RESCHED if TIF_POLLING_NRFLAG is set. -+ * -+ * If this returns true, then the idle task promises to call -+ * sched_ttwu_pending() and reschedule soon. -+ */ -+static bool set_nr_if_polling(struct task_struct *p) -+{ -+ struct thread_info *ti = task_thread_info(p); -+ typeof(ti->flags) old, val = READ_ONCE(ti->flags); -+ -+ for (;;) { -+ if (!(val & _TIF_POLLING_NRFLAG)) -+ return false; -+ if (val & _TIF_NEED_RESCHED) -+ return true; -+ old = cmpxchg(&ti->flags, val, val | _TIF_NEED_RESCHED); -+ if (old == val) -+ break; -+ val = old; -+ } -+ return true; -+} -+ -+#else -+static bool set_nr_and_not_polling(struct task_struct *p) -+{ -+ set_tsk_need_resched(p); -+ return true; -+} -+ -+#ifdef CONFIG_SMP -+static bool set_nr_if_polling(struct task_struct *p) -+{ -+ return false; -+} -+#endif -+#endif -+ -+static bool __wake_q_add(struct wake_q_head *head, struct task_struct *task) -+{ -+ struct wake_q_node *node = &task->wake_q; -+ -+ /* -+ * Atomically grab the task, if ->wake_q is !nil already it means -+ * its already queued (either by us or someone else) and will get the -+ * wakeup due to that. -+ * -+ * In order to ensure that a pending wakeup will observe our pending -+ * state, even in the failed case, an explicit smp_mb() must be used. -+ */ -+ smp_mb__before_atomic(); -+ if (unlikely(cmpxchg_relaxed(&node->next, NULL, WAKE_Q_TAIL))) -+ return false; -+ -+ /* -+ * The head is context local, there can be no concurrency. -+ */ -+ *head->lastp = node; -+ head->lastp = &node->next; -+ return true; -+} -+ -+/** -+ * wake_q_add() - queue a wakeup for 'later' waking. -+ * @head: the wake_q_head to add @task to -+ * @task: the task to queue for 'later' wakeup -+ * -+ * Queue a task for later wakeup, most likely by the wake_up_q() call in the -+ * same context, _HOWEVER_ this is not guaranteed, the wakeup can come -+ * instantly. -+ * -+ * This function must be used as-if it were wake_up_process(); IOW the task -+ * must be ready to be woken at this location. -+ */ -+void wake_q_add(struct wake_q_head *head, struct task_struct *task) -+{ -+ if (__wake_q_add(head, task)) -+ get_task_struct(task); -+} -+ -+/** -+ * wake_q_add_safe() - safely queue a wakeup for 'later' waking. -+ * @head: the wake_q_head to add @task to -+ * @task: the task to queue for 'later' wakeup -+ * -+ * Queue a task for later wakeup, most likely by the wake_up_q() call in the -+ * same context, _HOWEVER_ this is not guaranteed, the wakeup can come -+ * instantly. -+ * -+ * This function must be used as-if it were wake_up_process(); IOW the task -+ * must be ready to be woken at this location. -+ * -+ * This function is essentially a task-safe equivalent to wake_q_add(). Callers -+ * that already hold reference to @task can call the 'safe' version and trust -+ * wake_q to do the right thing depending whether or not the @task is already -+ * queued for wakeup. -+ */ -+void wake_q_add_safe(struct wake_q_head *head, struct task_struct *task) -+{ -+ if (!__wake_q_add(head, task)) -+ put_task_struct(task); -+} -+ -+void wake_up_q(struct wake_q_head *head) -+{ -+ struct wake_q_node *node = head->first; -+ -+ while (node != WAKE_Q_TAIL) { -+ struct task_struct *task; -+ -+ task = container_of(node, struct task_struct, wake_q); -+ BUG_ON(!task); -+ /* Task can safely be re-inserted now */ -+ node = node->next; -+ task->wake_q.next = NULL; -+ -+ /* -+ * wake_up_process() executes a full barrier, which pairs with -+ * the queueing in wake_q_add() so as not to miss wakeups. -+ */ -+ wake_up_process(task); -+ put_task_struct(task); -+ } -+} -+ -+static inline void smp_sched_reschedule(int cpu) -+{ -+ if (likely(cpu_online(cpu))) -+ smp_send_reschedule(cpu); -+} -+ -+/* -+ * resched_task - mark a task 'to be rescheduled now'. -+ * -+ * On UP this means the setting of the need_resched flag, on SMP it -+ * might also involve a cross-CPU call to trigger the scheduler on -+ * the target CPU. -+ */ -+void resched_task(struct task_struct *p) -+{ -+ int cpu; -+#ifdef CONFIG_LOCKDEP -+ /* Kernel threads call this when creating workqueues while still -+ * inactive from __kthread_bind_mask, holding only the pi_lock */ -+ if (!(p->flags & PF_KTHREAD)) { -+ struct rq *rq = task_rq(p); -+ -+ lockdep_assert_held(rq->lock); -+ } -+#endif -+ if (test_tsk_need_resched(p)) -+ return; -+ -+ cpu = task_cpu(p); -+ if (cpu == smp_processor_id()) { -+ set_tsk_need_resched(p); -+ set_preempt_need_resched(); -+ return; -+ } -+ -+ if (set_nr_and_not_polling(p)) -+ smp_sched_reschedule(cpu); -+ else -+ trace_sched_wake_idle_without_ipi(cpu); -+} -+ -+/* -+ * A task that is not running or queued will not have a node set. -+ * A task that is queued but not running will have a node set. -+ * A task that is currently running will have ->on_cpu set but no node set. -+ */ -+static inline bool task_queued(struct task_struct *p) -+{ -+ return !skiplist_node_empty(&p->node); -+} -+ -+static void enqueue_task(struct rq *rq, struct task_struct *p, int flags); -+static inline void resched_if_idle(struct rq *rq); -+ -+/* Dodgy workaround till we figure out where the softirqs are going */ -+static inline void do_pending_softirq(struct rq *rq, struct task_struct *next) -+{ -+ if (unlikely(next == rq->idle && local_softirq_pending() && !in_interrupt())) -+ do_softirq_own_stack(); -+} -+ -+static inline bool deadline_before(u64 deadline, u64 time) -+{ -+ return (deadline < time); -+} -+ -+/* -+ * Deadline is "now" in niffies + (offset by priority). Setting the deadline -+ * is the key to everything. It distributes cpu fairly amongst tasks of the -+ * same nice value, it proportions cpu according to nice level, it means the -+ * task that last woke up the longest ago has the earliest deadline, thus -+ * ensuring that interactive tasks get low latency on wake up. The CPU -+ * proportion works out to the square of the virtual deadline difference, so -+ * this equation will give nice 19 3% CPU compared to nice 0. -+ */ -+static inline u64 prio_deadline_diff(int user_prio) -+{ -+ return (prio_ratios[user_prio] * rr_interval * (MS_TO_NS(1) / 128)); -+} -+ -+static inline u64 task_deadline_diff(struct task_struct *p) -+{ -+ return prio_deadline_diff(TASK_USER_PRIO(p)); -+} -+ -+static inline u64 static_deadline_diff(int static_prio) -+{ -+ return prio_deadline_diff(USER_PRIO(static_prio)); -+} -+ -+static inline int longest_deadline_diff(void) -+{ -+ return prio_deadline_diff(39); -+} -+ -+static inline int ms_longest_deadline_diff(void) -+{ -+ return NS_TO_MS(longest_deadline_diff()); -+} -+ -+static inline bool rq_local(struct rq *rq); -+ -+#ifndef SCHED_CAPACITY_SCALE -+#define SCHED_CAPACITY_SCALE 1024 -+#endif -+ -+static inline int rq_load(struct rq *rq) -+{ -+ return rq->nr_running; -+} -+ -+/* -+ * Update the load average for feeding into cpu frequency governors. Use a -+ * rough estimate of a rolling average with ~ time constant of 32ms. -+ * 80/128 ~ 0.63. * 80 / 32768 / 128 == * 5 / 262144 -+ * Make sure a call to update_clocks has been made before calling this to get -+ * an updated rq->niffies. -+ */ -+static void update_load_avg(struct rq *rq, unsigned int flags) -+{ -+ long us_interval, load; -+ unsigned long curload; -+ -+ us_interval = NS_TO_US(rq->niffies - rq->load_update); -+ if (unlikely(us_interval <= 0)) -+ return; -+ -+ curload = rq_load(rq); -+ load = rq->load_avg - (rq->load_avg * us_interval * 5 / 262144); -+ if (unlikely(load < 0)) -+ load = 0; -+ load += curload * curload * SCHED_CAPACITY_SCALE * us_interval * 5 / 262144; -+ rq->load_avg = load; -+ -+ rq->load_update = rq->niffies; -+ update_irq_load_avg(rq, 0); -+ if (likely(rq_local(rq))) -+ cpufreq_trigger(rq, flags); -+} -+ -+#ifdef HAVE_SCHED_AVG_IRQ -+/* -+ * IRQ variant of update_load_avg below. delta is actually time in nanoseconds -+ * here so we scale curload to how long it's been since the last update. -+ */ -+static void update_irq_load_avg(struct rq *rq, long delta) -+{ -+ long us_interval, load; -+ unsigned long curload; -+ -+ us_interval = NS_TO_US(rq->niffies - rq->irq_load_update); -+ if (unlikely(us_interval <= 0)) -+ return; -+ -+ curload = NS_TO_US(delta) / us_interval; -+ load = rq->irq_load_avg - (rq->irq_load_avg * us_interval * 5 / 262144); -+ if (unlikely(load < 0)) -+ load = 0; -+ load += curload * curload * SCHED_CAPACITY_SCALE * us_interval * 5 / 262144; -+ rq->irq_load_avg = load; -+ -+ rq->irq_load_update = rq->niffies; -+} -+#endif -+ -+/* -+ * Removing from the runqueue. Enter with rq locked. Deleting a task -+ * from the skip list is done via the stored node reference in the task struct -+ * and does not require a full look up. Thus it occurs in O(k) time where k -+ * is the "level" of the list the task was stored at - usually < 4, max 8. -+ */ -+static void dequeue_task(struct rq *rq, struct task_struct *p, int flags) -+{ -+ skiplist_delete(rq->sl, &p->node); -+ rq->best_key = rq->node->next[0]->key; -+ update_clocks(rq); -+ -+ if (!(flags & DEQUEUE_SAVE)) { -+ sched_info_dequeued(rq, p); -+ psi_dequeue(p, flags & DEQUEUE_SLEEP); -+ } -+ rq->nr_running--; -+ if (rt_task(p)) -+ rq->rt_nr_running--; -+ update_load_avg(rq, flags); -+} -+ -+#ifdef CONFIG_PREEMPT_RCU -+static bool rcu_read_critical(struct task_struct *p) -+{ -+ return p->rcu_read_unlock_special.b.blocked; -+} -+#else /* CONFIG_PREEMPT_RCU */ -+#define rcu_read_critical(p) (false) -+#endif /* CONFIG_PREEMPT_RCU */ -+ -+/* -+ * To determine if it's safe for a task of SCHED_IDLEPRIO to actually run as -+ * an idle task, we ensure none of the following conditions are met. -+ */ -+static bool idleprio_suitable(struct task_struct *p) -+{ -+ return (!(task_contributes_to_load(p)) && !(p->flags & (PF_EXITING)) && -+ !signal_pending(p) && !rcu_read_critical(p) && !freezing(p)); -+} -+ -+/* -+ * To determine if a task of SCHED_ISO can run in pseudo-realtime, we check -+ * that the iso_refractory flag is not set. -+ */ -+static inline bool isoprio_suitable(struct rq *rq) -+{ -+ return !rq->iso_refractory; -+} -+ -+/* -+ * Adding to the runqueue. Enter with rq locked. -+ */ -+static void enqueue_task(struct rq *rq, struct task_struct *p, int flags) -+{ -+ unsigned int randseed, cflags = 0; -+ u64 sl_id; -+ -+ if (!rt_task(p)) { -+ /* Check it hasn't gotten rt from PI */ -+ if ((idleprio_task(p) && idleprio_suitable(p)) || -+ (iso_task(p) && isoprio_suitable(rq))) -+ p->prio = p->normal_prio; -+ else -+ p->prio = NORMAL_PRIO; -+ } else -+ rq->rt_nr_running++; -+ /* -+ * The sl_id key passed to the skiplist generates a sorted list. -+ * Realtime and sched iso tasks run FIFO so they only need be sorted -+ * according to priority. The skiplist will put tasks of the same -+ * key inserted later in FIFO order. Tasks of sched normal, batch -+ * and idleprio are sorted according to their deadlines. Idleprio -+ * tasks are offset by an impossibly large deadline value ensuring -+ * they get sorted into last positions, but still according to their -+ * own deadlines. This creates a "landscape" of skiplists running -+ * from priority 0 realtime in first place to the lowest priority -+ * idleprio tasks last. Skiplist insertion is an O(log n) process. -+ */ -+ if (p->prio <= ISO_PRIO) { -+ sl_id = p->prio; -+ } else { -+ sl_id = p->deadline; -+ if (idleprio_task(p)) { -+ if (p->prio == IDLE_PRIO) -+ sl_id |= 0xF000000000000000; -+ else -+ sl_id += longest_deadline_diff(); -+ } -+ } -+ /* -+ * Some architectures don't have better than microsecond resolution -+ * so mask out ~microseconds as the random seed for skiplist insertion. -+ */ -+ update_clocks(rq); -+ if (!(flags & ENQUEUE_RESTORE)) { -+ sched_info_queued(rq, p); -+ psi_enqueue(p, flags & ENQUEUE_WAKEUP); -+ } -+ -+ randseed = (rq->niffies >> 10) & 0xFFFFFFFF; -+ skiplist_insert(rq->sl, &p->node, sl_id, p, randseed); -+ rq->best_key = rq->node->next[0]->key; -+ if (p->in_iowait) -+ cflags |= SCHED_CPUFREQ_IOWAIT; -+ rq->nr_running++; -+ update_load_avg(rq, cflags); -+} -+ -+/* -+ * Returns the relative length of deadline all compared to the shortest -+ * deadline which is that of nice -20. -+ */ -+static inline int task_prio_ratio(struct task_struct *p) -+{ -+ return prio_ratios[TASK_USER_PRIO(p)]; -+} -+ -+/* -+ * task_timeslice - all tasks of all priorities get the exact same timeslice -+ * length. CPU distribution is handled by giving different deadlines to -+ * tasks of different priorities. Use 128 as the base value for fast shifts. -+ */ -+static inline int task_timeslice(struct task_struct *p) -+{ -+ return (rr_interval * task_prio_ratio(p) / 128); -+} -+ -+#ifdef CONFIG_SMP -+/* Entered with rq locked */ -+static inline void resched_if_idle(struct rq *rq) -+{ -+ if (rq_idle(rq)) -+ resched_task(rq->curr); -+} -+ -+static inline bool rq_local(struct rq *rq) -+{ -+ return (rq->cpu == smp_processor_id()); -+} -+#ifdef CONFIG_SMT_NICE -+static const cpumask_t *thread_cpumask(int cpu); -+ -+/* Find the best real time priority running on any SMT siblings of cpu and if -+ * none are running, the static priority of the best deadline task running. -+ * The lookups to the other runqueues is done lockless as the occasional wrong -+ * value would be harmless. */ -+static int best_smt_bias(struct rq *this_rq) -+{ -+ int other_cpu, best_bias = 0; -+ -+ for_each_cpu(other_cpu, &this_rq->thread_mask) { -+ struct rq *rq = cpu_rq(other_cpu); -+ -+ if (rq_idle(rq)) -+ continue; -+ if (unlikely(!rq->online)) -+ continue; -+ if (!rq->rq_mm) -+ continue; -+ if (likely(rq->rq_smt_bias > best_bias)) -+ best_bias = rq->rq_smt_bias; -+ } -+ return best_bias; -+} -+ -+static int task_prio_bias(struct task_struct *p) -+{ -+ if (rt_task(p)) -+ return 1 << 30; -+ else if (task_running_iso(p)) -+ return 1 << 29; -+ else if (task_running_idle(p)) -+ return 0; -+ return MAX_PRIO - p->static_prio; -+} -+ -+static bool smt_always_schedule(struct task_struct __maybe_unused *p, struct rq __maybe_unused *this_rq) -+{ -+ return true; -+} -+ -+static bool (*smt_schedule)(struct task_struct *p, struct rq *this_rq) = &smt_always_schedule; -+ -+/* We've already decided p can run on CPU, now test if it shouldn't for SMT -+ * nice reasons. */ -+static bool smt_should_schedule(struct task_struct *p, struct rq *this_rq) -+{ -+ int best_bias, task_bias; -+ -+ /* Kernel threads always run */ -+ if (unlikely(!p->mm)) -+ return true; -+ if (rt_task(p)) -+ return true; -+ if (!idleprio_suitable(p)) -+ return true; -+ best_bias = best_smt_bias(this_rq); -+ /* The smt siblings are all idle or running IDLEPRIO */ -+ if (best_bias < 1) -+ return true; -+ task_bias = task_prio_bias(p); -+ if (task_bias < 1) -+ return false; -+ if (task_bias >= best_bias) -+ return true; -+ /* Dither 25% cpu of normal tasks regardless of nice difference */ -+ if (best_bias % 4 == 1) -+ return true; -+ /* Sorry, you lose */ -+ return false; -+} -+#else /* CONFIG_SMT_NICE */ -+#define smt_schedule(p, this_rq) (true) -+#endif /* CONFIG_SMT_NICE */ -+ -+static inline void atomic_set_cpu(int cpu, cpumask_t *cpumask) -+{ -+ set_bit(cpu, (volatile unsigned long *)cpumask); -+} -+ -+/* -+ * The cpu_idle_map stores a bitmap of all the CPUs currently idle to -+ * allow easy lookup of whether any suitable idle CPUs are available. -+ * It's cheaper to maintain a binary yes/no if there are any idle CPUs on the -+ * idle_cpus variable than to do a full bitmask check when we are busy. The -+ * bits are set atomically but read locklessly as occasional false positive / -+ * negative is harmless. -+ */ -+static inline void set_cpuidle_map(int cpu) -+{ -+ if (likely(cpu_online(cpu))) -+ atomic_set_cpu(cpu, &cpu_idle_map); -+} -+ -+static inline void atomic_clear_cpu(int cpu, cpumask_t *cpumask) -+{ -+ clear_bit(cpu, (volatile unsigned long *)cpumask); -+} -+ -+static inline void clear_cpuidle_map(int cpu) -+{ -+ atomic_clear_cpu(cpu, &cpu_idle_map); -+} -+ -+static bool suitable_idle_cpus(struct task_struct *p) -+{ -+ return (cpumask_intersects(&p->cpus_allowed, &cpu_idle_map)); -+} -+ -+/* -+ * Resched current on rq. We don't know if rq is local to this CPU nor if it -+ * is locked so we do not use an intermediate variable for the task to avoid -+ * having it dereferenced. -+ */ -+static void resched_curr(struct rq *rq) -+{ -+ int cpu; -+ -+ if (test_tsk_need_resched(rq->curr)) -+ return; -+ -+ rq->preempt = rq->curr; -+ cpu = rq->cpu; -+ -+ /* We're doing this without holding the rq lock if it's not task_rq */ -+ -+ if (cpu == smp_processor_id()) { -+ set_tsk_need_resched(rq->curr); -+ set_preempt_need_resched(); -+ return; -+ } -+ -+ if (set_nr_and_not_polling(rq->curr)) -+ smp_sched_reschedule(cpu); -+ else -+ trace_sched_wake_idle_without_ipi(cpu); -+} -+ -+#define CPUIDLE_DIFF_THREAD (1) -+#define CPUIDLE_DIFF_CORE (2) -+#define CPUIDLE_CACHE_BUSY (4) -+#define CPUIDLE_DIFF_CPU (8) -+#define CPUIDLE_THREAD_BUSY (16) -+#define CPUIDLE_DIFF_NODE (32) -+ -+/* -+ * The best idle CPU is chosen according to the CPUIDLE ranking above where the -+ * lowest value would give the most suitable CPU to schedule p onto next. The -+ * order works out to be the following: -+ * -+ * Same thread, idle or busy cache, idle or busy threads -+ * Other core, same cache, idle or busy cache, idle threads. -+ * Same node, other CPU, idle cache, idle threads. -+ * Same node, other CPU, busy cache, idle threads. -+ * Other core, same cache, busy threads. -+ * Same node, other CPU, busy threads. -+ * Other node, other CPU, idle cache, idle threads. -+ * Other node, other CPU, busy cache, idle threads. -+ * Other node, other CPU, busy threads. -+ */ -+static int best_mask_cpu(int best_cpu, struct rq *rq, cpumask_t *tmpmask) -+{ -+ int best_ranking = CPUIDLE_DIFF_NODE | CPUIDLE_THREAD_BUSY | -+ CPUIDLE_DIFF_CPU | CPUIDLE_CACHE_BUSY | CPUIDLE_DIFF_CORE | -+ CPUIDLE_DIFF_THREAD; -+ int cpu_tmp; -+ -+ if (cpumask_test_cpu(best_cpu, tmpmask)) -+ goto out; -+ -+ for_each_cpu(cpu_tmp, tmpmask) { -+ int ranking, locality; -+ struct rq *tmp_rq; -+ -+ ranking = 0; -+ tmp_rq = cpu_rq(cpu_tmp); -+ -+ locality = rq->cpu_locality[cpu_tmp]; -+#ifdef CONFIG_NUMA -+ if (locality > 3) -+ ranking |= CPUIDLE_DIFF_NODE; -+ else -+#endif -+ if (locality > 2) -+ ranking |= CPUIDLE_DIFF_CPU; -+#ifdef CONFIG_SCHED_MC -+ else if (locality == 2) -+ ranking |= CPUIDLE_DIFF_CORE; -+ else if (!(tmp_rq->cache_idle(tmp_rq))) -+ ranking |= CPUIDLE_CACHE_BUSY; -+#endif -+#ifdef CONFIG_SCHED_SMT -+ if (locality == 1) -+ ranking |= CPUIDLE_DIFF_THREAD; -+ if (!(tmp_rq->siblings_idle(tmp_rq))) -+ ranking |= CPUIDLE_THREAD_BUSY; -+#endif -+ if (ranking < best_ranking) { -+ best_cpu = cpu_tmp; -+ best_ranking = ranking; -+ } -+ } -+out: -+ return best_cpu; -+} -+ -+bool cpus_share_cache(int this_cpu, int that_cpu) -+{ -+ struct rq *this_rq = cpu_rq(this_cpu); -+ -+ return (this_rq->cpu_locality[that_cpu] < 3); -+} -+ -+/* As per resched_curr but only will resched idle task */ -+static inline void resched_idle(struct rq *rq) -+{ -+ if (test_tsk_need_resched(rq->idle)) -+ return; -+ -+ rq->preempt = rq->idle; -+ -+ set_tsk_need_resched(rq->idle); -+ -+ if (rq_local(rq)) { -+ set_preempt_need_resched(); -+ return; -+ } -+ -+ smp_sched_reschedule(rq->cpu); -+} -+ -+static struct rq *resched_best_idle(struct task_struct *p, int cpu) -+{ -+ cpumask_t tmpmask; -+ struct rq *rq; -+ int best_cpu; -+ -+ cpumask_and(&tmpmask, &p->cpus_allowed, &cpu_idle_map); -+ best_cpu = best_mask_cpu(cpu, task_rq(p), &tmpmask); -+ rq = cpu_rq(best_cpu); -+ if (!smt_schedule(p, rq)) -+ return NULL; -+ rq->preempt = p; -+ resched_idle(rq); -+ return rq; -+} -+ -+static inline void resched_suitable_idle(struct task_struct *p) -+{ -+ if (suitable_idle_cpus(p)) -+ resched_best_idle(p, task_cpu(p)); -+} -+ -+static inline struct rq *rq_order(struct rq *rq, int cpu) -+{ -+ return rq->rq_order[cpu]; -+} -+#else /* CONFIG_SMP */ -+static inline void set_cpuidle_map(int cpu) -+{ -+} -+ -+static inline void clear_cpuidle_map(int cpu) -+{ -+} -+ -+static inline bool suitable_idle_cpus(struct task_struct *p) -+{ -+ return uprq->curr == uprq->idle; -+} -+ -+static inline void resched_suitable_idle(struct task_struct *p) -+{ -+} -+ -+static inline void resched_curr(struct rq *rq) -+{ -+ resched_task(rq->curr); -+} -+ -+static inline void resched_if_idle(struct rq *rq) -+{ -+} -+ -+static inline bool rq_local(struct rq *rq) -+{ -+ return true; -+} -+ -+static inline struct rq *rq_order(struct rq *rq, int cpu) -+{ -+ return rq; -+} -+ -+static inline bool smt_schedule(struct task_struct *p, struct rq *rq) -+{ -+ return true; -+} -+#endif /* CONFIG_SMP */ -+ -+static inline int normal_prio(struct task_struct *p) -+{ -+ if (has_rt_policy(p)) -+ return MAX_RT_PRIO - 1 - p->rt_priority; -+ if (idleprio_task(p)) -+ return IDLE_PRIO; -+ if (iso_task(p)) -+ return ISO_PRIO; -+ return NORMAL_PRIO; -+} -+ -+/* -+ * Calculate the current priority, i.e. the priority -+ * taken into account by the scheduler. This value might -+ * be boosted by RT tasks as it will be RT if the task got -+ * RT-boosted. If not then it returns p->normal_prio. -+ */ -+static int effective_prio(struct task_struct *p) -+{ -+ p->normal_prio = normal_prio(p); -+ /* -+ * If we are RT tasks or we were boosted to RT priority, -+ * keep the priority unchanged. Otherwise, update priority -+ * to the normal priority: -+ */ -+ if (!rt_prio(p->prio)) -+ return p->normal_prio; -+ return p->prio; -+} -+ -+/* -+ * activate_task - move a task to the runqueue. Enter with rq locked. -+ */ -+static void activate_task(struct rq *rq, struct task_struct *p, int flags) -+{ -+ resched_if_idle(rq); -+ -+ /* -+ * Sleep time is in units of nanosecs, so shift by 20 to get a -+ * milliseconds-range estimation of the amount of time that the task -+ * spent sleeping: -+ */ -+ if (unlikely(prof_on == SLEEP_PROFILING)) { -+ if (p->state == TASK_UNINTERRUPTIBLE) -+ profile_hits(SLEEP_PROFILING, (void *)get_wchan(p), -+ (rq->niffies - p->last_ran) >> 20); -+ } -+ -+ p->prio = effective_prio(p); -+ if (task_contributes_to_load(p)) -+ rq->nr_uninterruptible--; -+ -+ enqueue_task(rq, p, flags); -+ p->on_rq = TASK_ON_RQ_QUEUED; -+} -+ -+/* -+ * deactivate_task - If it's running, it's not on the runqueue and we can just -+ * decrement the nr_running. Enter with rq locked. -+ */ -+static inline void deactivate_task(struct task_struct *p, struct rq *rq) -+{ -+ if (task_contributes_to_load(p)) -+ rq->nr_uninterruptible++; -+ -+ p->on_rq = 0; -+ sched_info_dequeued(rq, p); -+ /* deactivate_task is always DEQUEUE_SLEEP in muqss */ -+ psi_dequeue(p, DEQUEUE_SLEEP); -+} -+ -+#ifdef CONFIG_SMP -+void set_task_cpu(struct task_struct *p, unsigned int new_cpu) -+{ -+ struct rq *rq; -+ -+ if (task_cpu(p) == new_cpu) -+ return; -+ -+ /* Do NOT call set_task_cpu on a currently queued task as we will not -+ * be reliably holding the rq lock after changing CPU. */ -+ BUG_ON(task_queued(p)); -+ rq = task_rq(p); -+ -+#ifdef CONFIG_LOCKDEP -+ /* -+ * The caller should hold either p->pi_lock or rq->lock, when changing -+ * a task's CPU. ->pi_lock for waking tasks, rq->lock for runnable tasks. -+ * -+ * Furthermore, all task_rq users should acquire both locks, see -+ * task_rq_lock(). -+ */ -+ WARN_ON_ONCE(debug_locks && !(lockdep_is_held(&p->pi_lock) || -+ lockdep_is_held(rq->lock))); -+#endif -+ -+ trace_sched_migrate_task(p, new_cpu); -+ rseq_migrate(p); -+ perf_event_task_migrate(p); -+ -+ /* -+ * After ->cpu is set up to a new value, task_rq_lock(p, ...) can be -+ * successfully executed on another CPU. We must ensure that updates of -+ * per-task data have been completed by this moment. -+ */ -+ smp_wmb(); -+ -+ p->wake_cpu = new_cpu; -+ -+ if (task_running(rq, p)) { -+ /* -+ * We should only be calling this on a running task if we're -+ * holding rq lock. -+ */ -+ lockdep_assert_held(rq->lock); -+ -+ /* -+ * We can't change the task_thread_info CPU on a running task -+ * as p will still be protected by the rq lock of the CPU it -+ * is still running on so we only set the wake_cpu for it to be -+ * lazily updated once off the CPU. -+ */ -+ return; -+ } -+ -+#ifdef CONFIG_THREAD_INFO_IN_TASK -+ WRITE_ONCE(p->cpu, new_cpu); -+#else -+ WRITE_ONCE(task_thread_info(p)->cpu, new_cpu); -+#endif -+ /* We're no longer protecting p after this point since we're holding -+ * the wrong runqueue lock. */ -+} -+#endif /* CONFIG_SMP */ -+ -+/* -+ * Move a task off the runqueue and take it to a cpu for it will -+ * become the running task. -+ */ -+static inline void take_task(struct rq *rq, int cpu, struct task_struct *p) -+{ -+ struct rq *p_rq = task_rq(p); -+ -+ dequeue_task(p_rq, p, DEQUEUE_SAVE); -+ if (p_rq != rq) { -+ sched_info_dequeued(p_rq, p); -+ sched_info_queued(rq, p); -+ } -+ set_task_cpu(p, cpu); -+} -+ -+/* -+ * Returns a descheduling task to the runqueue unless it is being -+ * deactivated. -+ */ -+static inline void return_task(struct task_struct *p, struct rq *rq, -+ int cpu, bool deactivate) -+{ -+ if (deactivate) -+ deactivate_task(p, rq); -+ else { -+#ifdef CONFIG_SMP -+ /* -+ * set_task_cpu was called on the running task that doesn't -+ * want to deactivate so it has to be enqueued to a different -+ * CPU and we need its lock. Tag it to be moved with as the -+ * lock is dropped in finish_lock_switch. -+ */ -+ if (unlikely(p->wake_cpu != cpu)) -+ WRITE_ONCE(p->on_rq, TASK_ON_RQ_MIGRATING); -+ else -+#endif -+ enqueue_task(rq, p, ENQUEUE_RESTORE); -+ } -+} -+ -+/* Enter with rq lock held. We know p is on the local cpu */ -+static inline void __set_tsk_resched(struct task_struct *p) -+{ -+ set_tsk_need_resched(p); -+ set_preempt_need_resched(); -+} -+ -+/** -+ * task_curr - is this task currently executing on a CPU? -+ * @p: the task in question. -+ * -+ * Return: 1 if the task is currently executing. 0 otherwise. -+ */ -+inline int task_curr(const struct task_struct *p) -+{ -+ return cpu_curr(task_cpu(p)) == p; -+} -+ -+#ifdef CONFIG_SMP -+/* -+ * wait_task_inactive - wait for a thread to unschedule. -+ * -+ * If @match_state is nonzero, it's the @p->state value just checked and -+ * not expected to change. If it changes, i.e. @p might have woken up, -+ * then return zero. When we succeed in waiting for @p to be off its CPU, -+ * we return a positive number (its total switch count). If a second call -+ * a short while later returns the same number, the caller can be sure that -+ * @p has remained unscheduled the whole time. -+ * -+ * The caller must ensure that the task *will* unschedule sometime soon, -+ * else this function might spin for a *long* time. This function can't -+ * be called with interrupts off, or it may introduce deadlock with -+ * smp_call_function() if an IPI is sent by the same process we are -+ * waiting to become inactive. -+ */ -+unsigned long wait_task_inactive(struct task_struct *p, long match_state) -+{ -+ int running, queued; -+ struct rq_flags rf; -+ unsigned long ncsw; -+ struct rq *rq; -+ -+ for (;;) { -+ rq = task_rq(p); -+ -+ /* -+ * If the task is actively running on another CPU -+ * still, just relax and busy-wait without holding -+ * any locks. -+ * -+ * NOTE! Since we don't hold any locks, it's not -+ * even sure that "rq" stays as the right runqueue! -+ * But we don't care, since this will return false -+ * if the runqueue has changed and p is actually now -+ * running somewhere else! -+ */ -+ while (task_running(rq, p)) { -+ if (match_state && unlikely(p->state != match_state)) -+ return 0; -+ cpu_relax(); -+ } -+ -+ /* -+ * Ok, time to look more closely! We need the rq -+ * lock now, to be *sure*. If we're wrong, we'll -+ * just go back and repeat. -+ */ -+ rq = task_rq_lock(p, &rf); -+ trace_sched_wait_task(p); -+ running = task_running(rq, p); -+ queued = task_on_rq_queued(p); -+ ncsw = 0; -+ if (!match_state || p->state == match_state) -+ ncsw = p->nvcsw | LONG_MIN; /* sets MSB */ -+ task_rq_unlock(rq, p, &rf); -+ -+ /* -+ * If it changed from the expected state, bail out now. -+ */ -+ if (unlikely(!ncsw)) -+ break; -+ -+ /* -+ * Was it really running after all now that we -+ * checked with the proper locks actually held? -+ * -+ * Oops. Go back and try again.. -+ */ -+ if (unlikely(running)) { -+ cpu_relax(); -+ continue; -+ } -+ -+ /* -+ * It's not enough that it's not actively running, -+ * it must be off the runqueue _entirely_, and not -+ * preempted! -+ * -+ * So if it was still runnable (but just not actively -+ * running right now), it's preempted, and we should -+ * yield - it could be a while. -+ */ -+ if (unlikely(queued)) { -+ ktime_t to = NSEC_PER_SEC / HZ; -+ -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ schedule_hrtimeout(&to, HRTIMER_MODE_REL); -+ continue; -+ } -+ -+ /* -+ * Ahh, all good. It wasn't running, and it wasn't -+ * runnable, which means that it will never become -+ * running in the future either. We're all done! -+ */ -+ break; -+ } -+ -+ return ncsw; -+} -+ -+/*** -+ * kick_process - kick a running thread to enter/exit the kernel -+ * @p: the to-be-kicked thread -+ * -+ * Cause a process which is running on another CPU to enter -+ * kernel-mode, without any delay. (to get signals handled.) -+ * -+ * NOTE: this function doesn't have to take the runqueue lock, -+ * because all it wants to ensure is that the remote task enters -+ * the kernel. If the IPI races and the task has been migrated -+ * to another CPU then no harm is done and the purpose has been -+ * achieved as well. -+ */ -+void kick_process(struct task_struct *p) -+{ -+ int cpu; -+ -+ preempt_disable(); -+ cpu = task_cpu(p); -+ if ((cpu != smp_processor_id()) && task_curr(p)) -+ smp_sched_reschedule(cpu); -+ preempt_enable(); -+} -+EXPORT_SYMBOL_GPL(kick_process); -+#endif -+ -+/* -+ * RT tasks preempt purely on priority. SCHED_NORMAL tasks preempt on the -+ * basis of earlier deadlines. SCHED_IDLEPRIO don't preempt anything else or -+ * between themselves, they cooperatively multitask. An idle rq scores as -+ * prio PRIO_LIMIT so it is always preempted. -+ */ -+static inline bool -+can_preempt(struct task_struct *p, int prio, u64 deadline) -+{ -+ /* Better static priority RT task or better policy preemption */ -+ if (p->prio < prio) -+ return true; -+ if (p->prio > prio) -+ return false; -+ if (p->policy == SCHED_BATCH) -+ return false; -+ /* SCHED_NORMAL and ISO will preempt based on deadline */ -+ if (!deadline_before(p->deadline, deadline)) -+ return false; -+ return true; -+} -+ -+#ifdef CONFIG_SMP -+ -+static inline bool is_per_cpu_kthread(struct task_struct *p) -+{ -+ if (!(p->flags & PF_KTHREAD)) -+ return false; -+ -+ if (p->nr_cpus_allowed != 1) -+ return false; -+ -+ return true; -+} -+ -+/* -+ * Per-CPU kthreads are allowed to run on !active && online CPUs, see -+ * __set_cpus_allowed_ptr(). -+ */ -+static inline bool is_cpu_allowed(struct task_struct *p, int cpu) -+{ -+ if (!cpumask_test_cpu(cpu, &p->cpus_allowed)) -+ return false; -+ -+ if (is_per_cpu_kthread(p)) -+ return cpu_online(cpu); -+ -+ return cpu_active(cpu); -+} -+ -+/* -+ * Check to see if p can run on cpu, and if not, whether there are any online -+ * CPUs it can run on instead. This only happens with the hotplug threads that -+ * bring up the CPUs. -+ */ -+static inline bool sched_other_cpu(struct task_struct *p, int cpu) -+{ -+ if (likely(cpumask_test_cpu(cpu, &p->cpus_allowed))) -+ return false; -+ if (p->nr_cpus_allowed == 1) { -+ cpumask_t valid_mask; -+ -+ cpumask_and(&valid_mask, &p->cpus_allowed, cpu_online_mask); -+ if (unlikely(cpumask_empty(&valid_mask))) -+ return false; -+ } -+ return true; -+} -+ -+static inline bool needs_other_cpu(struct task_struct *p, int cpu) -+{ -+ if (cpumask_test_cpu(cpu, &p->cpus_allowed)) -+ return false; -+ return true; -+} -+ -+#define cpu_online_map (*(cpumask_t *)cpu_online_mask) -+ -+static void try_preempt(struct task_struct *p, struct rq *this_rq) -+{ -+ int i, this_entries = rq_load(this_rq); -+ cpumask_t tmp; -+ -+ if (suitable_idle_cpus(p) && resched_best_idle(p, task_cpu(p))) -+ return; -+ -+ /* IDLEPRIO tasks never preempt anything but idle */ -+ if (p->policy == SCHED_IDLEPRIO) -+ return; -+ -+ cpumask_and(&tmp, &cpu_online_map, &p->cpus_allowed); -+ -+ for (i = 0; i < num_possible_cpus(); i++) { -+ struct rq *rq = this_rq->cpu_order[i]; -+ -+ if (!cpumask_test_cpu(rq->cpu, &tmp)) -+ continue; -+ -+ if (!sched_interactive && rq != this_rq && rq_load(rq) <= this_entries) -+ continue; -+ if (smt_schedule(p, rq) && can_preempt(p, rq->rq_prio, rq->rq_deadline)) { -+ /* We set rq->preempting lockless, it's a hint only */ -+ rq->preempting = p; -+ resched_curr(rq); -+ return; -+ } -+ } -+} -+ -+static int __set_cpus_allowed_ptr(struct task_struct *p, -+ const struct cpumask *new_mask, bool check); -+#else /* CONFIG_SMP */ -+static inline bool needs_other_cpu(struct task_struct *p, int cpu) -+{ -+ return false; -+} -+ -+static void try_preempt(struct task_struct *p, struct rq *this_rq) -+{ -+ if (p->policy == SCHED_IDLEPRIO) -+ return; -+ if (can_preempt(p, uprq->rq_prio, uprq->rq_deadline)) -+ resched_curr(uprq); -+} -+ -+static inline int __set_cpus_allowed_ptr(struct task_struct *p, -+ const struct cpumask *new_mask, bool check) -+{ -+ return set_cpus_allowed_ptr(p, new_mask); -+} -+#endif /* CONFIG_SMP */ -+ -+/* -+ * wake flags -+ */ -+#define WF_SYNC 0x01 /* waker goes to sleep after wakeup */ -+#define WF_FORK 0x02 /* child wakeup after fork */ -+#define WF_MIGRATED 0x04 /* internal use, task got migrated */ -+ -+static void -+ttwu_stat(struct task_struct *p, int cpu, int wake_flags) -+{ -+ struct rq *rq; -+ -+ if (!schedstat_enabled()) -+ return; -+ -+ rq = this_rq(); -+ -+#ifdef CONFIG_SMP -+ if (cpu == rq->cpu) { -+ __schedstat_inc(rq->ttwu_local); -+ } else { -+ struct sched_domain *sd; -+ -+ rcu_read_lock(); -+ for_each_domain(rq->cpu, sd) { -+ if (cpumask_test_cpu(cpu, sched_domain_span(sd))) { -+ __schedstat_inc(sd->ttwu_wake_remote); -+ break; -+ } -+ } -+ rcu_read_unlock(); -+ } -+ -+#endif /* CONFIG_SMP */ -+ -+ __schedstat_inc(rq->ttwu_count); -+} -+ -+/* -+ * Mark the task runnable and perform wakeup-preemption. -+ */ -+static void ttwu_do_wakeup(struct rq *rq, struct task_struct *p, int wake_flags) -+{ -+ /* -+ * Sync wakeups (i.e. those types of wakeups where the waker -+ * has indicated that it will leave the CPU in short order) -+ * don't trigger a preemption if there are no idle cpus, -+ * instead waiting for current to deschedule. -+ */ -+ if (wake_flags & WF_SYNC) -+ resched_suitable_idle(p); -+ else -+ try_preempt(p, rq); -+ p->state = TASK_RUNNING; -+ trace_sched_wakeup(p); -+} -+ -+static void -+ttwu_do_activate(struct rq *rq, struct task_struct *p, int wake_flags) -+{ -+ int en_flags = ENQUEUE_WAKEUP; -+ -+ lockdep_assert_held(rq->lock); -+ -+#ifdef CONFIG_SMP -+ if (p->sched_contributes_to_load) -+ rq->nr_uninterruptible--; -+ -+ if (wake_flags & WF_MIGRATED) -+ en_flags |= ENQUEUE_MIGRATED; -+#endif -+ -+ activate_task(rq, p, en_flags); -+ ttwu_do_wakeup(rq, p, wake_flags); -+} -+ -+/* -+ * Called in case the task @p isn't fully descheduled from its runqueue, -+ * in this case we must do a remote wakeup. Its a 'light' wakeup though, -+ * since all we need to do is flip p->state to TASK_RUNNING, since -+ * the task is still ->on_rq. -+ */ -+static int ttwu_remote(struct task_struct *p, int wake_flags) -+{ -+ struct rq *rq; -+ int ret = 0; -+ -+ rq = __task_rq_lock(p, NULL); -+ if (likely(task_on_rq_queued(p))) { -+ ttwu_do_wakeup(rq, p, wake_flags); -+ ret = 1; -+ } -+ __task_rq_unlock(rq, NULL); -+ -+ return ret; -+} -+ -+#ifdef CONFIG_SMP -+void sched_ttwu_pending(void) -+{ -+ struct rq *rq = this_rq(); -+ struct llist_node *llist = llist_del_all(&rq->wake_list); -+ struct task_struct *p, *t; -+ struct rq_flags rf; -+ -+ if (!llist) -+ return; -+ -+ rq_lock_irqsave(rq, &rf); -+ -+ llist_for_each_entry_safe(p, t, llist, wake_entry) -+ ttwu_do_activate(rq, p, 0); -+ -+ rq_unlock_irqrestore(rq, &rf); -+} -+ -+void scheduler_ipi(void) -+{ -+ /* -+ * Fold TIF_NEED_RESCHED into the preempt_count; anybody setting -+ * TIF_NEED_RESCHED remotely (for the first time) will also send -+ * this IPI. -+ */ -+ preempt_fold_need_resched(); -+ -+ if (llist_empty(&this_rq()->wake_list) && (!idle_cpu(smp_processor_id()) || need_resched())) -+ return; -+ -+ /* -+ * Not all reschedule IPI handlers call irq_enter/irq_exit, since -+ * traditionally all their work was done from the interrupt return -+ * path. Now that we actually do some work, we need to make sure -+ * we do call them. -+ * -+ * Some archs already do call them, luckily irq_enter/exit nest -+ * properly. -+ * -+ * Arguably we should visit all archs and update all handlers, -+ * however a fair share of IPIs are still resched only so this would -+ * somewhat pessimize the simple resched case. -+ */ -+ irq_enter(); -+ sched_ttwu_pending(); -+ irq_exit(); -+} -+ -+static void ttwu_queue_remote(struct task_struct *p, int cpu, int wake_flags) -+{ -+ struct rq *rq = cpu_rq(cpu); -+ -+ if (llist_add(&p->wake_entry, &cpu_rq(cpu)->wake_list)) { -+ if (!set_nr_if_polling(rq->idle)) -+ smp_sched_reschedule(cpu); -+ else -+ trace_sched_wake_idle_without_ipi(cpu); -+ } -+} -+ -+void wake_up_if_idle(int cpu) -+{ -+ struct rq *rq = cpu_rq(cpu); -+ struct rq_flags rf; -+ -+ rcu_read_lock(); -+ -+ if (!is_idle_task(rcu_dereference(rq->curr))) -+ goto out; -+ -+ if (set_nr_if_polling(rq->idle)) { -+ trace_sched_wake_idle_without_ipi(cpu); -+ } else { -+ rq_lock_irqsave(rq, &rf); -+ if (likely(is_idle_task(rq->curr))) -+ smp_sched_reschedule(cpu); -+ /* Else cpu is not in idle, do nothing here */ -+ rq_unlock_irqrestore(rq, &rf); -+ } -+ -+out: -+ rcu_read_unlock(); -+} -+ -+static int valid_task_cpu(struct task_struct *p) -+{ -+ cpumask_t valid_mask; -+ -+ if (p->flags & PF_KTHREAD) -+ cpumask_and(&valid_mask, &p->cpus_allowed, cpu_all_mask); -+ else -+ cpumask_and(&valid_mask, &p->cpus_allowed, cpu_active_mask); -+ -+ if (unlikely(!cpumask_weight(&valid_mask))) { -+ /* We shouldn't be hitting this any more */ -+ printk(KERN_WARNING "SCHED: No cpumask for %s/%d weight %d\n", p->comm, -+ p->pid, cpumask_weight(&p->cpus_allowed)); -+ return cpumask_any(&p->cpus_allowed); -+ } -+ return cpumask_any(&valid_mask); -+} -+ -+/* -+ * For a task that's just being woken up we have a valuable balancing -+ * opportunity so choose the nearest cache most lightly loaded runqueue. -+ * Entered with rq locked and returns with the chosen runqueue locked. -+ */ -+static inline int select_best_cpu(struct task_struct *p) -+{ -+ unsigned int idlest = ~0U; -+ struct rq *rq = NULL; -+ int i; -+ -+ if (suitable_idle_cpus(p)) { -+ int cpu = task_cpu(p); -+ -+ if (unlikely(needs_other_cpu(p, cpu))) -+ cpu = valid_task_cpu(p); -+ rq = resched_best_idle(p, cpu); -+ if (likely(rq)) -+ return rq->cpu; -+ } -+ -+ for (i = 0; i < num_possible_cpus(); i++) { -+ struct rq *other_rq = task_rq(p)->cpu_order[i]; -+ int entries; -+ -+ if (!other_rq->online) -+ continue; -+ if (needs_other_cpu(p, other_rq->cpu)) -+ continue; -+ entries = rq_load(other_rq); -+ if (entries >= idlest) -+ continue; -+ idlest = entries; -+ rq = other_rq; -+ } -+ if (unlikely(!rq)) -+ return task_cpu(p); -+ return rq->cpu; -+} -+#else /* CONFIG_SMP */ -+static int valid_task_cpu(struct task_struct *p) -+{ -+ return 0; -+} -+ -+static inline int select_best_cpu(struct task_struct *p) -+{ -+ return 0; -+} -+ -+static struct rq *resched_best_idle(struct task_struct *p, int cpu) -+{ -+ return NULL; -+} -+#endif /* CONFIG_SMP */ -+ -+static void ttwu_queue(struct task_struct *p, int cpu, int wake_flags) -+{ -+ struct rq *rq = cpu_rq(cpu); -+ -+#if defined(CONFIG_SMP) -+ if (!cpus_share_cache(smp_processor_id(), cpu)) { -+ sched_clock_cpu(cpu); /* Sync clocks across CPUs */ -+ ttwu_queue_remote(p, cpu, wake_flags); -+ return; -+ } -+#endif -+ rq_lock(rq); -+ ttwu_do_activate(rq, p, wake_flags); -+ rq_unlock(rq); -+} -+ -+/*** -+ * try_to_wake_up - wake up a thread -+ * @p: the thread to be awakened -+ * @state: the mask of task states that can be woken -+ * @wake_flags: wake modifier flags (WF_*) -+ * -+ * Put it on the run-queue if it's not already there. The "current" -+ * thread is always on the run-queue (except when the actual -+ * re-schedule is in progress), and as such you're allowed to do -+ * the simpler "current->state = TASK_RUNNING" to mark yourself -+ * runnable without the overhead of this. -+ * -+ * Return: %true if @p was woken up, %false if it was already running. -+ * or @state didn't match @p's state. -+ */ -+static int -+try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) -+{ -+ unsigned long flags; -+ int cpu, success = 0; -+ -+ /* -+ * If we are going to wake up a thread waiting for CONDITION we -+ * need to ensure that CONDITION=1 done by the caller can not be -+ * reordered with p->state check below. This pairs with mb() in -+ * set_current_state() the waiting thread does. -+ */ -+ raw_spin_lock_irqsave(&p->pi_lock, flags); -+ smp_mb__after_spinlock(); -+ /* state is a volatile long, どうして、分からない */ -+ if (!((unsigned int)p->state & state)) -+ goto out; -+ -+ trace_sched_waking(p); -+ -+ /* We're going to change ->state: */ -+ success = 1; -+ cpu = task_cpu(p); -+ -+ /* -+ * Ensure we load p->on_rq _after_ p->state, otherwise it would -+ * be possible to, falsely, observe p->on_rq == 0 and get stuck -+ * in smp_cond_load_acquire() below. -+ * -+ * sched_ttwu_pending() try_to_wake_up() -+ * STORE p->on_rq = 1 LOAD p->state -+ * UNLOCK rq->lock -+ * -+ * __schedule() (switch to task 'p') -+ * LOCK rq->lock smp_rmb(); -+ * smp_mb__after_spinlock(); -+ * UNLOCK rq->lock -+ * -+ * [task p] -+ * STORE p->state = UNINTERRUPTIBLE LOAD p->on_rq -+ * -+ * Pairs with the LOCK+smp_mb__after_spinlock() on rq->lock in -+ * __schedule(). See the comment for smp_mb__after_spinlock(). -+ */ -+ smp_rmb(); -+ if (p->on_rq && ttwu_remote(p, wake_flags)) -+ goto stat; -+ -+#ifdef CONFIG_SMP -+ /* -+ * Ensure we load p->on_cpu _after_ p->on_rq, otherwise it would be -+ * possible to, falsely, observe p->on_cpu == 0. -+ * -+ * One must be running (->on_cpu == 1) in order to remove oneself -+ * from the runqueue. -+ * -+ * __schedule() (switch to task 'p') try_to_wake_up() -+ * STORE p->on_cpu = 1 LOAD p->on_rq -+ * UNLOCK rq->lock -+ * -+ * __schedule() (put 'p' to sleep) -+ * LOCK rq->lock smp_rmb(); -+ * smp_mb__after_spinlock(); -+ * STORE p->on_rq = 0 LOAD p->on_cpu -+ * -+ * Pairs with the LOCK+smp_mb__after_spinlock() on rq->lock in -+ * __schedule(). See the comment for smp_mb__after_spinlock(). -+ */ -+ smp_rmb(); -+ -+ /* -+ * If the owning (remote) CPU is still in the middle of schedule() with -+ * this task as prev, wait until its done referencing the task. -+ * -+ * Pairs with the smp_store_release() in finish_task(). -+ * -+ * This ensures that tasks getting woken will be fully ordered against -+ * their previous state and preserve Program Order. -+ */ -+ smp_cond_load_acquire(&p->on_cpu, !VAL); -+ -+ p->sched_contributes_to_load = !!task_contributes_to_load(p); -+ p->state = TASK_WAKING; -+ -+ if (p->in_iowait) { -+ delayacct_blkio_end(p); -+ atomic_dec(&task_rq(p)->nr_iowait); -+ } -+ -+ cpu = select_best_cpu(p); -+ if (task_cpu(p) != cpu) { -+ wake_flags |= WF_MIGRATED; -+ psi_ttwu_dequeue(p); -+ set_task_cpu(p, cpu); -+ } -+ -+#else /* CONFIG_SMP */ -+ -+ if (p->in_iowait) { -+ delayacct_blkio_end(p); -+ atomic_dec(&task_rq(p)->nr_iowait); -+ } -+ -+#endif /* CONFIG_SMP */ -+ -+ ttwu_queue(p, cpu, wake_flags); -+stat: -+ ttwu_stat(p, cpu, wake_flags); -+out: -+ raw_spin_unlock_irqrestore(&p->pi_lock, flags); -+ -+ return success; -+} -+ -+/** -+ * wake_up_process - Wake up a specific process -+ * @p: The process to be woken up. -+ * -+ * Attempt to wake up the nominated process and move it to the set of runnable -+ * processes. -+ * -+ * Return: 1 if the process was woken up, 0 if it was already running. -+ * -+ * This function executes a full memory barrier before accessing the task state. -+ */ -+int wake_up_process(struct task_struct *p) -+{ -+ return try_to_wake_up(p, TASK_NORMAL, 0); -+} -+EXPORT_SYMBOL(wake_up_process); -+ -+int wake_up_state(struct task_struct *p, unsigned int state) -+{ -+ return try_to_wake_up(p, state, 0); -+} -+ -+static void time_slice_expired(struct task_struct *p, struct rq *rq); -+ -+/* -+ * Perform scheduler related setup for a newly forked process p. -+ * p is forked by current. -+ */ -+int sched_fork(unsigned long __maybe_unused clone_flags, struct task_struct *p) -+{ -+ unsigned long flags; -+ -+#ifdef CONFIG_PREEMPT_NOTIFIERS -+ INIT_HLIST_HEAD(&p->preempt_notifiers); -+#endif -+ -+#ifdef CONFIG_COMPACTION -+ p->capture_control = NULL; -+#endif -+ -+ /* -+ * We mark the process as NEW here. This guarantees that -+ * nobody will actually run it, and a signal or other external -+ * event cannot wake it up and insert it on the runqueue either. -+ */ -+ p->state = TASK_NEW; -+ -+ /* -+ * The process state is set to the same value of the process executing -+ * do_fork() code. That is running. This guarantees that nobody will -+ * actually run it, and a signal or other external event cannot wake -+ * it up and insert it on the runqueue either. -+ */ -+ -+ /* Should be reset in fork.c but done here for ease of MuQSS patching */ -+ p->on_cpu = -+ p->on_rq = -+ p->utime = -+ p->stime = -+ p->sched_time = -+ p->stime_ns = -+ p->utime_ns = 0; -+ skiplist_node_init(&p->node); -+ -+ /* -+ * Revert to default priority/policy on fork if requested. -+ */ -+ if (unlikely(p->sched_reset_on_fork)) { -+ if (p->policy == SCHED_FIFO || p->policy == SCHED_RR) { -+ p->policy = SCHED_NORMAL; -+ p->normal_prio = normal_prio(p); -+ } -+ -+ if (PRIO_TO_NICE(p->static_prio) < 0) { -+ p->static_prio = NICE_TO_PRIO(0); -+ p->normal_prio = p->static_prio; -+ } -+ -+ /* -+ * We don't need the reset flag anymore after the fork. It has -+ * fulfilled its duty: -+ */ -+ p->sched_reset_on_fork = 0; -+ } -+ -+ /* -+ * Silence PROVE_RCU. -+ */ -+ raw_spin_lock_irqsave(&p->pi_lock, flags); -+ set_task_cpu(p, smp_processor_id()); -+ raw_spin_unlock_irqrestore(&p->pi_lock, flags); -+ -+#ifdef CONFIG_SCHED_INFO -+ if (unlikely(sched_info_on())) -+ memset(&p->sched_info, 0, sizeof(p->sched_info)); -+#endif -+ init_task_preempt_count(p); -+ -+ return 0; -+} -+ -+#ifdef CONFIG_SCHEDSTATS -+ -+DEFINE_STATIC_KEY_FALSE(sched_schedstats); -+static bool __initdata __sched_schedstats = false; -+ -+static void set_schedstats(bool enabled) -+{ -+ if (enabled) -+ static_branch_enable(&sched_schedstats); -+ else -+ static_branch_disable(&sched_schedstats); -+} -+ -+void force_schedstat_enabled(void) -+{ -+ if (!schedstat_enabled()) { -+ pr_info("kernel profiling enabled schedstats, disable via kernel.sched_schedstats.\n"); -+ static_branch_enable(&sched_schedstats); -+ } -+} -+ -+static int __init setup_schedstats(char *str) -+{ -+ int ret = 0; -+ if (!str) -+ goto out; -+ -+ /* -+ * This code is called before jump labels have been set up, so we can't -+ * change the static branch directly just yet. Instead set a temporary -+ * variable so init_schedstats() can do it later. -+ */ -+ if (!strcmp(str, "enable")) { -+ __sched_schedstats = true; -+ ret = 1; -+ } else if (!strcmp(str, "disable")) { -+ __sched_schedstats = false; -+ ret = 1; -+ } -+out: -+ if (!ret) -+ pr_warn("Unable to parse schedstats=\n"); -+ -+ return ret; -+} -+__setup("schedstats=", setup_schedstats); -+ -+static void __init init_schedstats(void) -+{ -+ set_schedstats(__sched_schedstats); -+} -+ -+#ifdef CONFIG_PROC_SYSCTL -+int sysctl_schedstats(struct ctl_table *table, int write, -+ void __user *buffer, size_t *lenp, loff_t *ppos) -+{ -+ struct ctl_table t; -+ int err; -+ int state = static_branch_likely(&sched_schedstats); -+ -+ if (write && !capable(CAP_SYS_ADMIN)) -+ return -EPERM; -+ -+ t = *table; -+ t.data = &state; -+ err = proc_dointvec_minmax(&t, write, buffer, lenp, ppos); -+ if (err < 0) -+ return err; -+ if (write) -+ set_schedstats(state); -+ return err; -+} -+#endif /* CONFIG_PROC_SYSCTL */ -+#else /* !CONFIG_SCHEDSTATS */ -+static inline void init_schedstats(void) {} -+#endif /* CONFIG_SCHEDSTATS */ -+ -+static void update_cpu_clock_switch(struct rq *rq, struct task_struct *p); -+ -+static void account_task_cpu(struct rq *rq, struct task_struct *p) -+{ -+ update_clocks(rq); -+ /* This isn't really a context switch but accounting is the same */ -+ update_cpu_clock_switch(rq, p); -+ p->last_ran = rq->niffies; -+} -+ -+bool sched_smp_initialized __read_mostly; -+ -+static inline int hrexpiry_enabled(struct rq *rq) -+{ -+ if (unlikely(!cpu_active(cpu_of(rq)) || !sched_smp_initialized)) -+ return 0; -+ return hrtimer_is_hres_active(&rq->hrexpiry_timer); -+} -+ -+/* -+ * Use HR-timers to deliver accurate preemption points. -+ */ -+static inline void hrexpiry_clear(struct rq *rq) -+{ -+ if (!hrexpiry_enabled(rq)) -+ return; -+ if (hrtimer_active(&rq->hrexpiry_timer)) -+ hrtimer_cancel(&rq->hrexpiry_timer); -+} -+ -+/* -+ * High-resolution time_slice expiry. -+ * Runs from hardirq context with interrupts disabled. -+ */ -+static enum hrtimer_restart hrexpiry(struct hrtimer *timer) -+{ -+ struct rq *rq = container_of(timer, struct rq, hrexpiry_timer); -+ struct task_struct *p; -+ -+ /* This can happen during CPU hotplug / resume */ -+ if (unlikely(cpu_of(rq) != smp_processor_id())) -+ goto out; -+ -+ /* -+ * We're doing this without the runqueue lock but this should always -+ * be run on the local CPU. Time slice should run out in __schedule -+ * but we set it to zero here in case niffies is slightly less. -+ */ -+ p = rq->curr; -+ p->time_slice = 0; -+ __set_tsk_resched(p); -+out: -+ return HRTIMER_NORESTART; -+} -+ -+/* -+ * Called to set the hrexpiry timer state. -+ * -+ * called with irqs disabled from the local CPU only -+ */ -+static void hrexpiry_start(struct rq *rq, u64 delay) -+{ -+ if (!hrexpiry_enabled(rq)) -+ return; -+ -+ hrtimer_start(&rq->hrexpiry_timer, ns_to_ktime(delay), -+ HRTIMER_MODE_REL_PINNED); -+} -+ -+static void init_rq_hrexpiry(struct rq *rq) -+{ -+ hrtimer_init(&rq->hrexpiry_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -+ rq->hrexpiry_timer.function = hrexpiry; -+} -+ -+static inline int rq_dither(struct rq *rq) -+{ -+ if (!hrexpiry_enabled(rq)) -+ return HALF_JIFFY_US; -+ return 0; -+} -+ -+/* -+ * wake_up_new_task - wake up a newly created task for the first time. -+ * -+ * This function will do some initial scheduler statistics housekeeping -+ * that must be done for every newly created context, then puts the task -+ * on the runqueue and wakes it. -+ */ -+void wake_up_new_task(struct task_struct *p) -+{ -+ struct task_struct *parent, *rq_curr; -+ struct rq *rq, *new_rq; -+ unsigned long flags; -+ -+ parent = p->parent; -+ -+ raw_spin_lock_irqsave(&p->pi_lock, flags); -+ p->state = TASK_RUNNING; -+ /* Task_rq can't change yet on a new task */ -+ new_rq = rq = task_rq(p); -+ if (unlikely(needs_other_cpu(p, task_cpu(p)))) { -+ set_task_cpu(p, valid_task_cpu(p)); -+ new_rq = task_rq(p); -+ } -+ -+ double_rq_lock(rq, new_rq); -+ rq_curr = rq->curr; -+ -+ /* -+ * Make sure we do not leak PI boosting priority to the child. -+ */ -+ p->prio = rq_curr->normal_prio; -+ -+ trace_sched_wakeup_new(p); -+ -+ /* -+ * Share the timeslice between parent and child, thus the -+ * total amount of pending timeslices in the system doesn't change, -+ * resulting in more scheduling fairness. If it's negative, it won't -+ * matter since that's the same as being 0. rq->rq_deadline is only -+ * modified within schedule() so it is always equal to -+ * current->deadline. -+ */ -+ account_task_cpu(rq, rq_curr); -+ p->last_ran = rq_curr->last_ran; -+ if (likely(rq_curr->policy != SCHED_FIFO)) { -+ rq_curr->time_slice /= 2; -+ if (rq_curr->time_slice < RESCHED_US) { -+ /* -+ * Forking task has run out of timeslice. Reschedule it and -+ * start its child with a new time slice and deadline. The -+ * child will end up running first because its deadline will -+ * be slightly earlier. -+ */ -+ __set_tsk_resched(rq_curr); -+ time_slice_expired(p, new_rq); -+ if (suitable_idle_cpus(p)) -+ resched_best_idle(p, task_cpu(p)); -+ else if (unlikely(rq != new_rq)) -+ try_preempt(p, new_rq); -+ } else { -+ p->time_slice = rq_curr->time_slice; -+ if (rq_curr == parent && rq == new_rq && !suitable_idle_cpus(p)) { -+ /* -+ * The VM isn't cloned, so we're in a good position to -+ * do child-runs-first in anticipation of an exec. This -+ * usually avoids a lot of COW overhead. -+ */ -+ __set_tsk_resched(rq_curr); -+ } else { -+ /* -+ * Adjust the hrexpiry since rq_curr will keep -+ * running and its timeslice has been shortened. -+ */ -+ hrexpiry_start(rq, US_TO_NS(rq_curr->time_slice)); -+ try_preempt(p, new_rq); -+ } -+ } -+ } else { -+ time_slice_expired(p, new_rq); -+ try_preempt(p, new_rq); -+ } -+ activate_task(new_rq, p, 0); -+ double_rq_unlock(rq, new_rq); -+ raw_spin_unlock_irqrestore(&p->pi_lock, flags); -+} -+ -+#ifdef CONFIG_PREEMPT_NOTIFIERS -+ -+static DEFINE_STATIC_KEY_FALSE(preempt_notifier_key); -+ -+void preempt_notifier_inc(void) -+{ -+ static_branch_inc(&preempt_notifier_key); -+} -+EXPORT_SYMBOL_GPL(preempt_notifier_inc); -+ -+void preempt_notifier_dec(void) -+{ -+ static_branch_dec(&preempt_notifier_key); -+} -+EXPORT_SYMBOL_GPL(preempt_notifier_dec); -+ -+/** -+ * preempt_notifier_register - tell me when current is being preempted & rescheduled -+ * @notifier: notifier struct to register -+ */ -+void preempt_notifier_register(struct preempt_notifier *notifier) -+{ -+ if (!static_branch_unlikely(&preempt_notifier_key)) -+ WARN(1, "registering preempt_notifier while notifiers disabled\n"); -+ -+ hlist_add_head(¬ifier->link, ¤t->preempt_notifiers); -+} -+EXPORT_SYMBOL_GPL(preempt_notifier_register); -+ -+/** -+ * preempt_notifier_unregister - no longer interested in preemption notifications -+ * @notifier: notifier struct to unregister -+ * -+ * This is *not* safe to call from within a preemption notifier. -+ */ -+void preempt_notifier_unregister(struct preempt_notifier *notifier) -+{ -+ hlist_del(¬ifier->link); -+} -+EXPORT_SYMBOL_GPL(preempt_notifier_unregister); -+ -+static void __fire_sched_in_preempt_notifiers(struct task_struct *curr) -+{ -+ struct preempt_notifier *notifier; -+ -+ hlist_for_each_entry(notifier, &curr->preempt_notifiers, link) -+ notifier->ops->sched_in(notifier, raw_smp_processor_id()); -+} -+ -+static __always_inline void fire_sched_in_preempt_notifiers(struct task_struct *curr) -+{ -+ if (static_branch_unlikely(&preempt_notifier_key)) -+ __fire_sched_in_preempt_notifiers(curr); -+} -+ -+static void -+__fire_sched_out_preempt_notifiers(struct task_struct *curr, -+ struct task_struct *next) -+{ -+ struct preempt_notifier *notifier; -+ -+ hlist_for_each_entry(notifier, &curr->preempt_notifiers, link) -+ notifier->ops->sched_out(notifier, next); -+} -+ -+static __always_inline void -+fire_sched_out_preempt_notifiers(struct task_struct *curr, -+ struct task_struct *next) -+{ -+ if (static_branch_unlikely(&preempt_notifier_key)) -+ __fire_sched_out_preempt_notifiers(curr, next); -+} -+ -+#else /* !CONFIG_PREEMPT_NOTIFIERS */ -+ -+static inline void fire_sched_in_preempt_notifiers(struct task_struct *curr) -+{ -+} -+ -+static inline void -+fire_sched_out_preempt_notifiers(struct task_struct *curr, -+ struct task_struct *next) -+{ -+} -+ -+#endif /* CONFIG_PREEMPT_NOTIFIERS */ -+ -+static inline void prepare_task(struct task_struct *next) -+{ -+ /* -+ * Claim the task as running, we do this before switching to it -+ * such that any running task will have this set. -+ */ -+ next->on_cpu = 1; -+} -+ -+static inline void finish_task(struct task_struct *prev) -+{ -+#ifdef CONFIG_SMP -+ /* -+ * After ->on_cpu is cleared, the task can be moved to a different CPU. -+ * We must ensure this doesn't happen until the switch is completely -+ * finished. -+ * -+ * In particular, the load of prev->state in finish_task_switch() must -+ * happen before this. -+ * -+ * Pairs with the smp_cond_load_acquire() in try_to_wake_up(). -+ */ -+ smp_store_release(&prev->on_cpu, 0); -+#endif -+} -+ -+static inline void -+prepare_lock_switch(struct rq *rq, struct task_struct *next) -+{ -+ /* -+ * Since the runqueue lock will be released by the next -+ * task (which is an invalid locking op but in the case -+ * of the scheduler it's an obvious special-case), so we -+ * do an early lockdep release here: -+ */ -+ spin_release(&rq->lock->dep_map, 1, _THIS_IP_); -+#ifdef CONFIG_DEBUG_SPINLOCK -+ /* this is a valid case when another task releases the spinlock */ -+ rq->lock->owner = next; -+#endif -+} -+ -+static inline void finish_lock_switch(struct rq *rq, struct task_struct *prev) -+{ -+ /* -+ * If we are tracking spinlock dependencies then we have to -+ * fix up the runqueue lock - which gets 'carried over' from -+ * prev into current: -+ */ -+ spin_acquire(&rq->lock->dep_map, 0, 0, _THIS_IP_); -+ -+#ifdef CONFIG_SMP -+ /* -+ * If prev was marked as migrating to another CPU in return_task, drop -+ * the local runqueue lock but leave interrupts disabled and grab the -+ * remote lock we're migrating it to before enabling them. -+ */ -+ if (unlikely(task_on_rq_migrating(prev))) { -+ sched_info_dequeued(rq, prev); -+ /* -+ * We move the ownership of prev to the new cpu now. ttwu can't -+ * activate prev to the wrong cpu since it has to grab this -+ * runqueue in ttwu_remote. -+ */ -+#ifdef CONFIG_THREAD_INFO_IN_TASK -+ prev->cpu = prev->wake_cpu; -+#else -+ task_thread_info(prev)->cpu = prev->wake_cpu; -+#endif -+ raw_spin_unlock(rq->lock); -+ -+ raw_spin_lock(&prev->pi_lock); -+ rq = __task_rq_lock(prev, NULL); -+ /* Check that someone else hasn't already queued prev */ -+ if (likely(!task_queued(prev))) { -+ enqueue_task(rq, prev, 0); -+ prev->on_rq = TASK_ON_RQ_QUEUED; -+ /* Wake up the CPU if it's not already running */ -+ resched_if_idle(rq); -+ } -+ raw_spin_unlock(&prev->pi_lock); -+ } -+#endif -+ rq_unlock(rq); -+ -+ do_pending_softirq(rq, current); -+ -+ local_irq_enable(); -+} -+ -+#ifndef prepare_arch_switch -+# define prepare_arch_switch(next) do { } while (0) -+#endif -+#ifndef finish_arch_switch -+# define finish_arch_switch(prev) do { } while (0) -+#endif -+#ifndef finish_arch_post_lock_switch -+# define finish_arch_post_lock_switch() do { } while (0) -+#endif -+ -+/** -+ * prepare_task_switch - prepare to switch tasks -+ * @rq: the runqueue preparing to switch -+ * @next: the task we are going to switch to. -+ * -+ * This is called with the rq lock held and interrupts off. It must -+ * be paired with a subsequent finish_task_switch after the context -+ * switch. -+ * -+ * prepare_task_switch sets up locking and calls architecture specific -+ * hooks. -+ */ -+static inline void -+prepare_task_switch(struct rq *rq, struct task_struct *prev, -+ struct task_struct *next) -+{ -+ kcov_prepare_switch(prev); -+ sched_info_switch(rq, prev, next); -+ perf_event_task_sched_out(prev, next); -+ rseq_preempt(prev); -+ fire_sched_out_preempt_notifiers(prev, next); -+ prepare_task(next); -+ prepare_arch_switch(next); -+} -+ -+/** -+ * finish_task_switch - clean up after a task-switch -+ * @rq: runqueue associated with task-switch -+ * @prev: the thread we just switched away from. -+ * -+ * finish_task_switch must be called after the context switch, paired -+ * with a prepare_task_switch call before the context switch. -+ * finish_task_switch will reconcile locking set up by prepare_task_switch, -+ * and do any other architecture-specific cleanup actions. -+ * -+ * Note that we may have delayed dropping an mm in context_switch(). If -+ * so, we finish that here outside of the runqueue lock. (Doing it -+ * with the lock held can cause deadlocks; see schedule() for -+ * details.) -+ * -+ * The context switch have flipped the stack from under us and restored the -+ * local variables which were saved when this task called schedule() in the -+ * past. prev == current is still correct but we need to recalculate this_rq -+ * because prev may have moved to another CPU. -+ */ -+static void finish_task_switch(struct task_struct *prev) -+ __releases(rq->lock) -+{ -+ struct rq *rq = this_rq(); -+ struct mm_struct *mm = rq->prev_mm; -+ long prev_state; -+ -+ /* -+ * The previous task will have left us with a preempt_count of 2 -+ * because it left us after: -+ * -+ * schedule() -+ * preempt_disable(); // 1 -+ * __schedule() -+ * raw_spin_lock_irq(rq->lock) // 2 -+ * -+ * Also, see FORK_PREEMPT_COUNT. -+ */ -+ if (WARN_ONCE(preempt_count() != 2*PREEMPT_DISABLE_OFFSET, -+ "corrupted preempt_count: %s/%d/0x%x\n", -+ current->comm, current->pid, preempt_count())) -+ preempt_count_set(FORK_PREEMPT_COUNT); -+ -+ rq->prev_mm = NULL; -+ -+ /* -+ * A task struct has one reference for the use as "current". -+ * If a task dies, then it sets TASK_DEAD in tsk->state and calls -+ * schedule one last time. The schedule call will never return, and -+ * the scheduled task must drop that reference. -+ * -+ * We must observe prev->state before clearing prev->on_cpu (in -+ * finish_task), otherwise a concurrent wakeup can get prev -+ * running on another CPU and we could rave with its RUNNING -> DEAD -+ * transition, resulting in a double drop. -+ */ -+ prev_state = prev->state; -+ vtime_task_switch(prev); -+ perf_event_task_sched_in(prev, current); -+ finish_task(prev); -+ finish_lock_switch(rq, prev); -+ finish_arch_post_lock_switch(); -+ kcov_finish_switch(current); -+ -+ fire_sched_in_preempt_notifiers(current); -+ /* -+ * When switching through a kernel thread, the loop in -+ * membarrier_{private,global}_expedited() may have observed that -+ * kernel thread and not issued an IPI. It is therefore possible to -+ * schedule between user->kernel->user threads without passing though -+ * switch_mm(). Membarrier requires a barrier after storing to -+ * rq->curr, before returning to userspace, so provide them here: -+ * -+ * - a full memory barrier for {PRIVATE,GLOBAL}_EXPEDITED, implicitly -+ * provided by mmdrop(), -+ * - a sync_core for SYNC_CORE. -+ */ -+ if (mm) { -+ membarrier_mm_sync_core_before_usermode(mm); -+ mmdrop(mm); -+ } -+ if (unlikely(prev_state == TASK_DEAD)) { -+ /* -+ * Remove function-return probe instances associated with this -+ * task and put them back on the free list. -+ */ -+ kprobe_flush_task(prev); -+ -+ /* Task is done with its stack. */ -+ put_task_stack(prev); -+ -+ put_task_struct(prev); -+ } -+} -+ -+/** -+ * schedule_tail - first thing a freshly forked thread must call. -+ * @prev: the thread we just switched away from. -+ */ -+asmlinkage __visible void schedule_tail(struct task_struct *prev) -+{ -+ /* -+ * New tasks start with FORK_PREEMPT_COUNT, see there and -+ * finish_task_switch() for details. -+ * -+ * finish_task_switch() will drop rq->lock() and lower preempt_count -+ * and the preempt_enable() will end up enabling preemption (on -+ * PREEMPT_COUNT kernels). -+ */ -+ -+ finish_task_switch(prev); -+ preempt_enable(); -+ -+ if (current->set_child_tid) -+ put_user(task_pid_vnr(current), current->set_child_tid); -+ -+ calculate_sigpending(); -+} -+ -+/* -+ * context_switch - switch to the new MM and the new thread's register state. -+ */ -+static __always_inline void -+context_switch(struct rq *rq, struct task_struct *prev, -+ struct task_struct *next) -+{ -+ struct mm_struct *mm, *oldmm; -+ -+ prepare_task_switch(rq, prev, next); -+ -+ mm = next->mm; -+ oldmm = prev->active_mm; -+ /* -+ * For paravirt, this is coupled with an exit in switch_to to -+ * combine the page table reload and the switch backend into -+ * one hypercall. -+ */ -+ arch_start_context_switch(prev); -+ -+ /* -+ * If mm is non-NULL, we pass through switch_mm(). If mm is -+ * NULL, we will pass through mmdrop() in finish_task_switch(). -+ * Both of these contain the full memory barrier required by -+ * membarrier after storing to rq->curr, before returning to -+ * user-space. -+ */ -+ if (!mm) { -+ next->active_mm = oldmm; -+ mmgrab(oldmm); -+ enter_lazy_tlb(oldmm, next); -+ } else -+ switch_mm_irqs_off(oldmm, mm, next); -+ -+ if (!prev->mm) { -+ prev->active_mm = NULL; -+ rq->prev_mm = oldmm; -+ } -+ prepare_lock_switch(rq, next); -+ -+ /* Here we just switch the register state and the stack. */ -+ switch_to(prev, next, prev); -+ barrier(); -+ -+ finish_task_switch(prev); -+} -+ -+/* -+ * nr_running, nr_uninterruptible and nr_context_switches: -+ * -+ * externally visible scheduler statistics: current number of runnable -+ * threads, total number of context switches performed since bootup. -+ */ -+unsigned long nr_running(void) -+{ -+ unsigned long i, sum = 0; -+ -+ for_each_online_cpu(i) -+ sum += cpu_rq(i)->nr_running; -+ -+ return sum; -+} -+ -+static unsigned long nr_uninterruptible(void) -+{ -+ unsigned long i, sum = 0; -+ -+ for_each_online_cpu(i) -+ sum += cpu_rq(i)->nr_uninterruptible; -+ -+ return sum; -+} -+ -+/* -+ * Check if only the current task is running on the CPU. -+ * -+ * Caution: this function does not check that the caller has disabled -+ * preemption, thus the result might have a time-of-check-to-time-of-use -+ * race. The caller is responsible to use it correctly, for example: -+ * -+ * - from a non-preemptible section (of course) -+ * -+ * - from a thread that is bound to a single CPU -+ * -+ * - in a loop with very short iterations (e.g. a polling loop) -+ */ -+bool single_task_running(void) -+{ -+ struct rq *rq = cpu_rq(smp_processor_id()); -+ -+ if (rq_load(rq) == 1) -+ return true; -+ else -+ return false; -+} -+EXPORT_SYMBOL(single_task_running); -+ -+unsigned long long nr_context_switches(void) -+{ -+ int i; -+ unsigned long long sum = 0; -+ -+ for_each_possible_cpu(i) -+ sum += cpu_rq(i)->nr_switches; -+ -+ return sum; -+} -+ -+/* -+ * Consumers of these two interfaces, like for example the cpufreq menu -+ * governor are using nonsensical data. Boosting frequency for a CPU that has -+ * IO-wait which might not even end up running the task when it does become -+ * runnable. -+ */ -+ -+unsigned long nr_iowait_cpu(int cpu) -+{ -+ return atomic_read(&cpu_rq(cpu)->nr_iowait); -+} -+ -+/* -+ * IO-wait accounting, and how its mostly bollocks (on SMP). -+ * -+ * The idea behind IO-wait account is to account the idle time that we could -+ * have spend running if it were not for IO. That is, if we were to improve the -+ * storage performance, we'd have a proportional reduction in IO-wait time. -+ * -+ * This all works nicely on UP, where, when a task blocks on IO, we account -+ * idle time as IO-wait, because if the storage were faster, it could've been -+ * running and we'd not be idle. -+ * -+ * This has been extended to SMP, by doing the same for each CPU. This however -+ * is broken. -+ * -+ * Imagine for instance the case where two tasks block on one CPU, only the one -+ * CPU will have IO-wait accounted, while the other has regular idle. Even -+ * though, if the storage were faster, both could've ran at the same time, -+ * utilising both CPUs. -+ * -+ * This means, that when looking globally, the current IO-wait accounting on -+ * SMP is a lower bound, by reason of under accounting. -+ * -+ * Worse, since the numbers are provided per CPU, they are sometimes -+ * interpreted per CPU, and that is nonsensical. A blocked task isn't strictly -+ * associated with any one particular CPU, it can wake to another CPU than it -+ * blocked on. This means the per CPU IO-wait number is meaningless. -+ * -+ * Task CPU affinities can make all that even more 'interesting'. -+ */ -+ -+unsigned long nr_iowait(void) -+{ -+ unsigned long i, sum = 0; -+ -+ for_each_possible_cpu(i) -+ sum += nr_iowait_cpu(i); -+ -+ return sum; -+} -+ -+unsigned long nr_active(void) -+{ -+ return nr_running() + nr_uninterruptible(); -+} -+ -+/* Variables and functions for calc_load */ -+static unsigned long calc_load_update; -+unsigned long avenrun[3]; -+EXPORT_SYMBOL(avenrun); -+ -+/** -+ * get_avenrun - get the load average array -+ * @loads: pointer to dest load array -+ * @offset: offset to add -+ * @shift: shift count to shift the result left -+ * -+ * These values are estimates at best, so no need for locking. -+ */ -+void get_avenrun(unsigned long *loads, unsigned long offset, int shift) -+{ -+ loads[0] = (avenrun[0] + offset) << shift; -+ loads[1] = (avenrun[1] + offset) << shift; -+ loads[2] = (avenrun[2] + offset) << shift; -+} -+ -+/* -+ * calc_load - update the avenrun load estimates every LOAD_FREQ seconds. -+ */ -+void calc_global_load(unsigned long ticks) -+{ -+ long active; -+ -+ if (time_before(jiffies, READ_ONCE(calc_load_update))) -+ return; -+ active = nr_active() * FIXED_1; -+ -+ avenrun[0] = calc_load(avenrun[0], EXP_1, active); -+ avenrun[1] = calc_load(avenrun[1], EXP_5, active); -+ avenrun[2] = calc_load(avenrun[2], EXP_15, active); -+ -+ calc_load_update = jiffies + LOAD_FREQ; -+} -+ -+/** -+ * fixed_power_int - compute: x^n, in O(log n) time -+ * -+ * @x: base of the power -+ * @frac_bits: fractional bits of @x -+ * @n: power to raise @x to. -+ * -+ * By exploiting the relation between the definition of the natural power -+ * function: x^n := x*x*...*x (x multiplied by itself for n times), and -+ * the binary encoding of numbers used by computers: n := \Sum n_i * 2^i, -+ * (where: n_i \elem {0, 1}, the binary vector representing n), -+ * we find: x^n := x^(\Sum n_i * 2^i) := \Prod x^(n_i * 2^i), which is -+ * of course trivially computable in O(log_2 n), the length of our binary -+ * vector. -+ */ -+static unsigned long -+fixed_power_int(unsigned long x, unsigned int frac_bits, unsigned int n) -+{ -+ unsigned long result = 1UL << frac_bits; -+ -+ if (n) { -+ for (;;) { -+ if (n & 1) { -+ result *= x; -+ result += 1UL << (frac_bits - 1); -+ result >>= frac_bits; -+ } -+ n >>= 1; -+ if (!n) -+ break; -+ x *= x; -+ x += 1UL << (frac_bits - 1); -+ x >>= frac_bits; -+ } -+ } -+ -+ return result; -+} -+ -+/* -+ * a1 = a0 * e + a * (1 - e) -+ * -+ * a2 = a1 * e + a * (1 - e) -+ * = (a0 * e + a * (1 - e)) * e + a * (1 - e) -+ * = a0 * e^2 + a * (1 - e) * (1 + e) -+ * -+ * a3 = a2 * e + a * (1 - e) -+ * = (a0 * e^2 + a * (1 - e) * (1 + e)) * e + a * (1 - e) -+ * = a0 * e^3 + a * (1 - e) * (1 + e + e^2) -+ * -+ * ... -+ * -+ * an = a0 * e^n + a * (1 - e) * (1 + e + ... + e^n-1) [1] -+ * = a0 * e^n + a * (1 - e) * (1 - e^n)/(1 - e) -+ * = a0 * e^n + a * (1 - e^n) -+ * -+ * [1] application of the geometric series: -+ * -+ * n 1 - x^(n+1) -+ * S_n := \Sum x^i = ------------- -+ * i=0 1 - x -+ */ -+unsigned long -+calc_load_n(unsigned long load, unsigned long exp, -+ unsigned long active, unsigned int n) -+{ -+ return calc_load(load, fixed_power_int(exp, FSHIFT, n), active); -+} -+ -+DEFINE_PER_CPU(struct kernel_stat, kstat); -+DEFINE_PER_CPU(struct kernel_cpustat, kernel_cpustat); -+ -+EXPORT_PER_CPU_SYMBOL(kstat); -+EXPORT_PER_CPU_SYMBOL(kernel_cpustat); -+ -+#ifdef CONFIG_PARAVIRT -+static inline u64 steal_ticks(u64 steal) -+{ -+ if (unlikely(steal > NSEC_PER_SEC)) -+ return div_u64(steal, TICK_NSEC); -+ -+ return __iter_div_u64_rem(steal, TICK_NSEC, &steal); -+} -+#endif -+ -+#ifndef nsecs_to_cputime -+# define nsecs_to_cputime(__nsecs) nsecs_to_jiffies(__nsecs) -+#endif -+ -+/* -+ * On each tick, add the number of nanoseconds to the unbanked variables and -+ * once one tick's worth has accumulated, account it allowing for accurate -+ * sub-tick accounting and totals. Use the TICK_APPROX_NS to match the way we -+ * deduct nanoseconds. -+ */ -+static void pc_idle_time(struct rq *rq, struct task_struct *idle, unsigned long ns) -+{ -+ u64 *cpustat = kcpustat_this_cpu->cpustat; -+ unsigned long ticks; -+ -+ if (atomic_read(&rq->nr_iowait) > 0) { -+ rq->iowait_ns += ns; -+ if (rq->iowait_ns >= JIFFY_NS) { -+ ticks = NS_TO_JIFFIES(rq->iowait_ns); -+ cpustat[CPUTIME_IOWAIT] += (__force u64)TICK_APPROX_NS * ticks; -+ rq->iowait_ns %= JIFFY_NS; -+ } -+ } else { -+ rq->idle_ns += ns; -+ if (rq->idle_ns >= JIFFY_NS) { -+ ticks = NS_TO_JIFFIES(rq->idle_ns); -+ cpustat[CPUTIME_IDLE] += (__force u64)TICK_APPROX_NS * ticks; -+ rq->idle_ns %= JIFFY_NS; -+ } -+ } -+ acct_update_integrals(idle); -+} -+ -+static void pc_system_time(struct rq *rq, struct task_struct *p, -+ int hardirq_offset, unsigned long ns) -+{ -+ u64 *cpustat = kcpustat_this_cpu->cpustat; -+ unsigned long ticks; -+ -+ p->stime_ns += ns; -+ if (p->stime_ns >= JIFFY_NS) { -+ ticks = NS_TO_JIFFIES(p->stime_ns); -+ p->stime_ns %= JIFFY_NS; -+ p->stime += (__force u64)TICK_APPROX_NS * ticks; -+ account_group_system_time(p, TICK_APPROX_NS * ticks); -+ } -+ p->sched_time += ns; -+ account_group_exec_runtime(p, ns); -+ -+ if (hardirq_count() - hardirq_offset) { -+ rq->irq_ns += ns; -+ if (rq->irq_ns >= JIFFY_NS) { -+ ticks = NS_TO_JIFFIES(rq->irq_ns); -+ cpustat[CPUTIME_IRQ] += (__force u64)TICK_APPROX_NS * ticks; -+ rq->irq_ns %= JIFFY_NS; -+ } -+ } else if (in_serving_softirq()) { -+ rq->softirq_ns += ns; -+ if (rq->softirq_ns >= JIFFY_NS) { -+ ticks = NS_TO_JIFFIES(rq->softirq_ns); -+ cpustat[CPUTIME_SOFTIRQ] += (__force u64)TICK_APPROX_NS * ticks; -+ rq->softirq_ns %= JIFFY_NS; -+ } -+ } else { -+ rq->system_ns += ns; -+ if (rq->system_ns >= JIFFY_NS) { -+ ticks = NS_TO_JIFFIES(rq->system_ns); -+ cpustat[CPUTIME_SYSTEM] += (__force u64)TICK_APPROX_NS * ticks; -+ rq->system_ns %= JIFFY_NS; -+ } -+ } -+ acct_update_integrals(p); -+} -+ -+static void pc_user_time(struct rq *rq, struct task_struct *p, unsigned long ns) -+{ -+ u64 *cpustat = kcpustat_this_cpu->cpustat; -+ unsigned long ticks; -+ -+ p->utime_ns += ns; -+ if (p->utime_ns >= JIFFY_NS) { -+ ticks = NS_TO_JIFFIES(p->utime_ns); -+ p->utime_ns %= JIFFY_NS; -+ p->utime += (__force u64)TICK_APPROX_NS * ticks; -+ account_group_user_time(p, TICK_APPROX_NS * ticks); -+ } -+ p->sched_time += ns; -+ account_group_exec_runtime(p, ns); -+ -+ if (this_cpu_ksoftirqd() == p) { -+ /* -+ * ksoftirqd time do not get accounted in cpu_softirq_time. -+ * So, we have to handle it separately here. -+ */ -+ rq->softirq_ns += ns; -+ if (rq->softirq_ns >= JIFFY_NS) { -+ ticks = NS_TO_JIFFIES(rq->softirq_ns); -+ cpustat[CPUTIME_SOFTIRQ] += (__force u64)TICK_APPROX_NS * ticks; -+ rq->softirq_ns %= JIFFY_NS; -+ } -+ } -+ -+ if (task_nice(p) > 0 || idleprio_task(p)) { -+ rq->nice_ns += ns; -+ if (rq->nice_ns >= JIFFY_NS) { -+ ticks = NS_TO_JIFFIES(rq->nice_ns); -+ cpustat[CPUTIME_NICE] += (__force u64)TICK_APPROX_NS * ticks; -+ rq->nice_ns %= JIFFY_NS; -+ } -+ } else { -+ rq->user_ns += ns; -+ if (rq->user_ns >= JIFFY_NS) { -+ ticks = NS_TO_JIFFIES(rq->user_ns); -+ cpustat[CPUTIME_USER] += (__force u64)TICK_APPROX_NS * ticks; -+ rq->user_ns %= JIFFY_NS; -+ } -+ } -+ acct_update_integrals(p); -+} -+ -+/* -+ * This is called on clock ticks. -+ * Bank in p->sched_time the ns elapsed since the last tick or switch. -+ * CPU scheduler quota accounting is also performed here in microseconds. -+ */ -+static void update_cpu_clock_tick(struct rq *rq, struct task_struct *p) -+{ -+ s64 account_ns = rq->niffies - p->last_ran; -+ struct task_struct *idle = rq->idle; -+ -+ /* Accurate tick timekeeping */ -+ if (user_mode(get_irq_regs())) -+ pc_user_time(rq, p, account_ns); -+ else if (p != idle || (irq_count() != HARDIRQ_OFFSET)) { -+ pc_system_time(rq, p, HARDIRQ_OFFSET, account_ns); -+ } else -+ pc_idle_time(rq, idle, account_ns); -+ -+ /* time_slice accounting is done in usecs to avoid overflow on 32bit */ -+ if (p->policy != SCHED_FIFO && p != idle) -+ p->time_slice -= NS_TO_US(account_ns); -+ -+ p->last_ran = rq->niffies; -+} -+ -+/* -+ * This is called on context switches. -+ * Bank in p->sched_time the ns elapsed since the last tick or switch. -+ * CPU scheduler quota accounting is also performed here in microseconds. -+ */ -+static void update_cpu_clock_switch(struct rq *rq, struct task_struct *p) -+{ -+ s64 account_ns = rq->niffies - p->last_ran; -+ struct task_struct *idle = rq->idle; -+ -+ /* Accurate subtick timekeeping */ -+ if (p != idle) -+ pc_user_time(rq, p, account_ns); -+ else -+ pc_idle_time(rq, idle, account_ns); -+ -+ /* time_slice accounting is done in usecs to avoid overflow on 32bit */ -+ if (p->policy != SCHED_FIFO && p != idle) -+ p->time_slice -= NS_TO_US(account_ns); -+} -+ -+/* -+ * Return any ns on the sched_clock that have not yet been accounted in -+ * @p in case that task is currently running. -+ * -+ * Called with task_rq_lock(p) held. -+ */ -+static inline u64 do_task_delta_exec(struct task_struct *p, struct rq *rq) -+{ -+ u64 ns = 0; -+ -+ /* -+ * Must be ->curr _and_ ->on_rq. If dequeued, we would -+ * project cycles that may never be accounted to this -+ * thread, breaking clock_gettime(). -+ */ -+ if (p == rq->curr && task_on_rq_queued(p)) { -+ update_clocks(rq); -+ ns = rq->niffies - p->last_ran; -+ } -+ -+ return ns; -+} -+ -+/* -+ * Return accounted runtime for the task. -+ * Return separately the current's pending runtime that have not been -+ * accounted yet. -+ * -+ */ -+unsigned long long task_sched_runtime(struct task_struct *p) -+{ -+ struct rq_flags rf; -+ struct rq *rq; -+ u64 ns; -+ -+#if defined(CONFIG_64BIT) && defined(CONFIG_SMP) -+ /* -+ * 64-bit doesn't need locks to atomically read a 64-bit value. -+ * So we have a optimisation chance when the task's delta_exec is 0. -+ * Reading ->on_cpu is racy, but this is ok. -+ * -+ * If we race with it leaving CPU, we'll take a lock. So we're correct. -+ * If we race with it entering CPU, unaccounted time is 0. This is -+ * indistinguishable from the read occurring a few cycles earlier. -+ * If we see ->on_cpu without ->on_rq, the task is leaving, and has -+ * been accounted, so we're correct here as well. -+ */ -+ if (!p->on_cpu || !task_on_rq_queued(p)) -+ return tsk_seruntime(p); -+#endif -+ -+ rq = task_rq_lock(p, &rf); -+ ns = p->sched_time + do_task_delta_exec(p, rq); -+ task_rq_unlock(rq, p, &rf); -+ -+ return ns; -+} -+ -+/* -+ * Functions to test for when SCHED_ISO tasks have used their allocated -+ * quota as real time scheduling and convert them back to SCHED_NORMAL. All -+ * data is modified only by the local runqueue during scheduler_tick with -+ * interrupts disabled. -+ */ -+ -+/* -+ * Test if SCHED_ISO tasks have run longer than their alloted period as RT -+ * tasks and set the refractory flag if necessary. There is 10% hysteresis -+ * for unsetting the flag. 115/128 is ~90/100 as a fast shift instead of a -+ * slow division. -+ */ -+static inline void iso_tick(struct rq *rq) -+{ -+ rq->iso_ticks = rq->iso_ticks * (ISO_PERIOD - 1) / ISO_PERIOD; -+ rq->iso_ticks += 100; -+ if (rq->iso_ticks > ISO_PERIOD * sched_iso_cpu) { -+ rq->iso_refractory = true; -+ if (unlikely(rq->iso_ticks > ISO_PERIOD * 100)) -+ rq->iso_ticks = ISO_PERIOD * 100; -+ } -+} -+ -+/* No SCHED_ISO task was running so decrease rq->iso_ticks */ -+static inline void no_iso_tick(struct rq *rq, int ticks) -+{ -+ if (rq->iso_ticks > 0 || rq->iso_refractory) { -+ rq->iso_ticks = rq->iso_ticks * (ISO_PERIOD - ticks) / ISO_PERIOD; -+ if (rq->iso_ticks < ISO_PERIOD * (sched_iso_cpu * 115 / 128)) { -+ rq->iso_refractory = false; -+ if (unlikely(rq->iso_ticks < 0)) -+ rq->iso_ticks = 0; -+ } -+ } -+} -+ -+/* This manages tasks that have run out of timeslice during a scheduler_tick */ -+static void task_running_tick(struct rq *rq) -+{ -+ struct task_struct *p = rq->curr; -+ -+ /* -+ * If a SCHED_ISO task is running we increment the iso_ticks. In -+ * order to prevent SCHED_ISO tasks from causing starvation in the -+ * presence of true RT tasks we account those as iso_ticks as well. -+ */ -+ if (rt_task(p) || task_running_iso(p)) -+ iso_tick(rq); -+ else -+ no_iso_tick(rq, 1); -+ -+ /* SCHED_FIFO tasks never run out of timeslice. */ -+ if (p->policy == SCHED_FIFO) -+ return; -+ -+ if (iso_task(p)) { -+ if (task_running_iso(p)) { -+ if (rq->iso_refractory) { -+ /* -+ * SCHED_ISO task is running as RT and limit -+ * has been hit. Force it to reschedule as -+ * SCHED_NORMAL by zeroing its time_slice -+ */ -+ p->time_slice = 0; -+ } -+ } else if (!rq->iso_refractory) { -+ /* Can now run again ISO. Reschedule to pick up prio */ -+ goto out_resched; -+ } -+ } -+ -+ /* -+ * Tasks that were scheduled in the first half of a tick are not -+ * allowed to run into the 2nd half of the next tick if they will -+ * run out of time slice in the interim. Otherwise, if they have -+ * less than RESCHED_US μs of time slice left they will be rescheduled. -+ * Dither is used as a backup for when hrexpiry is disabled or high res -+ * timers not configured in. -+ */ -+ if (p->time_slice - rq->dither >= RESCHED_US) -+ return; -+out_resched: -+ rq_lock(rq); -+ __set_tsk_resched(p); -+ rq_unlock(rq); -+} -+ -+static inline void task_tick(struct rq *rq) -+{ -+ if (!rq_idle(rq)) -+ task_running_tick(rq); -+ else if (rq->last_jiffy > rq->last_scheduler_tick) -+ no_iso_tick(rq, rq->last_jiffy - rq->last_scheduler_tick); -+} -+ -+#ifdef CONFIG_NO_HZ_FULL -+/* -+ * We can stop the timer tick any time highres timers are active since -+ * we rely entirely on highres timeouts for task expiry rescheduling. -+ */ -+static void sched_stop_tick(struct rq *rq, int cpu) -+{ -+ if (!hrexpiry_enabled(rq)) -+ return; -+ if (!tick_nohz_full_enabled()) -+ return; -+ if (!tick_nohz_full_cpu(cpu)) -+ return; -+ tick_nohz_dep_clear_cpu(cpu, TICK_DEP_BIT_SCHED); -+} -+ -+static inline void sched_start_tick(struct rq *rq, int cpu) -+{ -+ tick_nohz_dep_set_cpu(cpu, TICK_DEP_BIT_SCHED); -+} -+ -+struct tick_work { -+ int cpu; -+ struct delayed_work work; -+}; -+ -+static struct tick_work __percpu *tick_work_cpu; -+ -+static void sched_tick_remote(struct work_struct *work) -+{ -+ struct delayed_work *dwork = to_delayed_work(work); -+ struct tick_work *twork = container_of(dwork, struct tick_work, work); -+ int cpu = twork->cpu; -+ struct rq *rq = cpu_rq(cpu); -+ struct task_struct *curr; -+ u64 delta; -+ -+ /* -+ * Handle the tick only if it appears the remote CPU is running in full -+ * dynticks mode. The check is racy by nature, but missing a tick or -+ * having one too much is no big deal because the scheduler tick updates -+ * statistics and checks timeslices in a time-independent way, regardless -+ * of when exactly it is running. -+ */ -+ if (idle_cpu(cpu) || !tick_nohz_tick_stopped_cpu(cpu)) -+ goto out_requeue; -+ -+ rq_lock_irq(rq); -+ curr = rq->curr; -+ if (is_idle_task(curr)) -+ goto out_unlock; -+ -+ update_rq_clock(rq); -+ delta = rq_clock_task(rq) - curr->last_ran; -+ -+ /* -+ * Make sure the next tick runs within a reasonable -+ * amount of time. -+ */ -+ WARN_ON_ONCE(delta > (u64)NSEC_PER_SEC * 3); -+ task_tick(rq); -+ -+out_unlock: -+ rq_unlock_irq(rq, NULL); -+ -+out_requeue: -+ /* -+ * Run the remote tick once per second (1Hz). This arbitrary -+ * frequency is large enough to avoid overload but short enough -+ * to keep scheduler internal stats reasonably up to date. -+ */ -+ queue_delayed_work(system_unbound_wq, dwork, HZ); -+} -+ -+static void sched_tick_start(int cpu) -+{ -+ struct tick_work *twork; -+ -+ if (housekeeping_cpu(cpu, HK_FLAG_TICK)) -+ return; -+ -+ WARN_ON_ONCE(!tick_work_cpu); -+ -+ twork = per_cpu_ptr(tick_work_cpu, cpu); -+ twork->cpu = cpu; -+ INIT_DELAYED_WORK(&twork->work, sched_tick_remote); -+ queue_delayed_work(system_unbound_wq, &twork->work, HZ); -+} -+ -+#ifdef CONFIG_HOTPLUG_CPU -+static void sched_tick_stop(int cpu) -+{ -+ struct tick_work *twork; -+ -+ if (housekeeping_cpu(cpu, HK_FLAG_TICK)) -+ return; -+ -+ WARN_ON_ONCE(!tick_work_cpu); -+ -+ twork = per_cpu_ptr(tick_work_cpu, cpu); -+ cancel_delayed_work_sync(&twork->work); -+} -+#endif /* CONFIG_HOTPLUG_CPU */ -+ -+int __init sched_tick_offload_init(void) -+{ -+ tick_work_cpu = alloc_percpu(struct tick_work); -+ BUG_ON(!tick_work_cpu); -+ -+ return 0; -+} -+ -+#else /* !CONFIG_NO_HZ_FULL */ -+static inline void sched_stop_tick(struct rq *rq, int cpu) {} -+static inline void sched_start_tick(struct rq *rq, int cpu) {} -+static inline void sched_tick_start(int cpu) { } -+static inline void sched_tick_stop(int cpu) { } -+#endif -+ -+/* -+ * This function gets called by the timer code, with HZ frequency. -+ * We call it with interrupts disabled. -+ */ -+void scheduler_tick(void) -+{ -+ int cpu __maybe_unused = smp_processor_id(); -+ struct rq *rq = cpu_rq(cpu); -+ -+ sched_clock_tick(); -+ update_clocks(rq); -+ update_load_avg(rq, 0); -+ update_cpu_clock_tick(rq, rq->curr); -+ task_tick(rq); -+ rq->last_scheduler_tick = rq->last_jiffy; -+ rq->last_tick = rq->clock; -+ psi_task_tick(rq); -+ perf_event_task_tick(); -+ sched_stop_tick(rq, cpu); -+} -+ -+#if defined(CONFIG_PREEMPT) && (defined(CONFIG_DEBUG_PREEMPT) || \ -+ defined(CONFIG_TRACE_PREEMPT_TOGGLE)) -+/* -+ * If the value passed in is equal to the current preempt count -+ * then we just disabled preemption. Start timing the latency. -+ */ -+static inline void preempt_latency_start(int val) -+{ -+ if (preempt_count() == val) { -+ unsigned long ip = get_lock_parent_ip(); -+#ifdef CONFIG_DEBUG_PREEMPT -+ current->preempt_disable_ip = ip; -+#endif -+ trace_preempt_off(CALLER_ADDR0, ip); -+ } -+} -+ -+void preempt_count_add(int val) -+{ -+#ifdef CONFIG_DEBUG_PREEMPT -+ /* -+ * Underflow? -+ */ -+ if (DEBUG_LOCKS_WARN_ON((preempt_count() < 0))) -+ return; -+#endif -+ __preempt_count_add(val); -+#ifdef CONFIG_DEBUG_PREEMPT -+ /* -+ * Spinlock count overflowing soon? -+ */ -+ DEBUG_LOCKS_WARN_ON((preempt_count() & PREEMPT_MASK) >= -+ PREEMPT_MASK - 10); -+#endif -+ preempt_latency_start(val); -+} -+EXPORT_SYMBOL(preempt_count_add); -+NOKPROBE_SYMBOL(preempt_count_add); -+ -+/* -+ * If the value passed in equals to the current preempt count -+ * then we just enabled preemption. Stop timing the latency. -+ */ -+static inline void preempt_latency_stop(int val) -+{ -+ if (preempt_count() == val) -+ trace_preempt_on(CALLER_ADDR0, get_lock_parent_ip()); -+} -+ -+void preempt_count_sub(int val) -+{ -+#ifdef CONFIG_DEBUG_PREEMPT -+ /* -+ * Underflow? -+ */ -+ if (DEBUG_LOCKS_WARN_ON(val > preempt_count())) -+ return; -+ /* -+ * Is the spinlock portion underflowing? -+ */ -+ if (DEBUG_LOCKS_WARN_ON((val < PREEMPT_MASK) && -+ !(preempt_count() & PREEMPT_MASK))) -+ return; -+#endif -+ -+ preempt_latency_stop(val); -+ __preempt_count_sub(val); -+} -+EXPORT_SYMBOL(preempt_count_sub); -+NOKPROBE_SYMBOL(preempt_count_sub); -+ -+#else -+static inline void preempt_latency_start(int val) { } -+static inline void preempt_latency_stop(int val) { } -+#endif -+ -+static inline unsigned long get_preempt_disable_ip(struct task_struct *p) -+{ -+#ifdef CONFIG_DEBUG_PREEMPT -+ return p->preempt_disable_ip; -+#else -+ return 0; -+#endif -+} -+ -+/* -+ * The time_slice is only refilled when it is empty and that is when we set a -+ * new deadline. Make sure update_clocks has been called recently to update -+ * rq->niffies. -+ */ -+static void time_slice_expired(struct task_struct *p, struct rq *rq) -+{ -+ p->time_slice = timeslice(); -+ p->deadline = rq->niffies + task_deadline_diff(p); -+#ifdef CONFIG_SMT_NICE -+ if (!p->mm) -+ p->smt_bias = 0; -+ else if (rt_task(p)) -+ p->smt_bias = 1 << 30; -+ else if (task_running_iso(p)) -+ p->smt_bias = 1 << 29; -+ else if (idleprio_task(p)) { -+ if (task_running_idle(p)) -+ p->smt_bias = 0; -+ else -+ p->smt_bias = 1; -+ } else if (--p->smt_bias < 1) -+ p->smt_bias = MAX_PRIO - p->static_prio; -+#endif -+} -+ -+/* -+ * Timeslices below RESCHED_US are considered as good as expired as there's no -+ * point rescheduling when there's so little time left. SCHED_BATCH tasks -+ * have been flagged be not latency sensitive and likely to be fully CPU -+ * bound so every time they're rescheduled they have their time_slice -+ * refilled, but get a new later deadline to have little effect on -+ * SCHED_NORMAL tasks. -+ -+ */ -+static inline void check_deadline(struct task_struct *p, struct rq *rq) -+{ -+ if (p->time_slice < RESCHED_US || batch_task(p)) -+ time_slice_expired(p, rq); -+} -+ -+/* -+ * Task selection with skiplists is a simple matter of picking off the first -+ * task in the sorted list, an O(1) operation. The lookup is amortised O(1) -+ * being bound to the number of processors. -+ * -+ * Runqueues are selectively locked based on their unlocked data and then -+ * unlocked if not needed. At most 3 locks will be held at any time and are -+ * released as soon as they're no longer needed. All balancing between CPUs -+ * is thus done here in an extremely simple first come best fit manner. -+ * -+ * This iterates over runqueues in cache locality order. In interactive mode -+ * it iterates over all CPUs and finds the task with the best key/deadline. -+ * In non-interactive mode it will only take a task if it's from the current -+ * runqueue or a runqueue with more tasks than the current one with a better -+ * key/deadline. -+ */ -+#ifdef CONFIG_SMP -+static inline struct task_struct -+*earliest_deadline_task(struct rq *rq, int cpu, struct task_struct *idle) -+{ -+ struct rq *locked = NULL, *chosen = NULL; -+ struct task_struct *edt = idle; -+ int i, best_entries = 0; -+ u64 best_key = ~0ULL; -+ -+ for (i = 0; i < total_runqueues; i++) { -+ struct rq *other_rq = rq_order(rq, i); -+ skiplist_node *next; -+ int entries; -+ -+ entries = other_rq->sl->entries; -+ /* -+ * Check for queued entres lockless first. The local runqueue -+ * is locked so entries will always be accurate. -+ */ -+ if (!sched_interactive) { -+ /* -+ * Don't reschedule balance across nodes unless the CPU -+ * is idle. -+ */ -+ if (edt != idle && rq->cpu_locality[other_rq->cpu] > 3) -+ break; -+ if (entries <= best_entries) -+ continue; -+ } else if (!entries) -+ continue; -+ -+ /* if (i) implies other_rq != rq */ -+ if (i) { -+ /* Check for best id queued lockless first */ -+ if (other_rq->best_key >= best_key) -+ continue; -+ -+ if (unlikely(!trylock_rq(rq, other_rq))) -+ continue; -+ -+ /* Need to reevaluate entries after locking */ -+ entries = other_rq->sl->entries; -+ if (unlikely(!entries)) { -+ unlock_rq(other_rq); -+ continue; -+ } -+ } -+ -+ next = other_rq->node; -+ /* -+ * In interactive mode we check beyond the best entry on other -+ * runqueues if we can't get the best for smt or affinity -+ * reasons. -+ */ -+ while ((next = next->next[0]) != other_rq->node) { -+ struct task_struct *p; -+ u64 key = next->key; -+ -+ /* Reevaluate key after locking */ -+ if (key >= best_key) -+ break; -+ -+ p = next->value; -+ if (!smt_schedule(p, rq)) { -+ if (i && !sched_interactive) -+ break; -+ continue; -+ } -+ -+ if (sched_other_cpu(p, cpu)) { -+ if (sched_interactive || !i) -+ continue; -+ break; -+ } -+ /* Make sure affinity is ok */ -+ if (i) { -+ /* From this point on p is the best so far */ -+ if (locked) -+ unlock_rq(locked); -+ chosen = locked = other_rq; -+ } -+ best_entries = entries; -+ best_key = key; -+ edt = p; -+ break; -+ } -+ /* rq->preempting is a hint only as the state may have changed -+ * since it was set with the resched call but if we have met -+ * the condition we can break out here. */ -+ if (edt == rq->preempting) -+ break; -+ if (i && other_rq != chosen) -+ unlock_rq(other_rq); -+ } -+ -+ if (likely(edt != idle)) -+ take_task(rq, cpu, edt); -+ -+ if (locked) -+ unlock_rq(locked); -+ -+ rq->preempting = NULL; -+ -+ return edt; -+} -+#else /* CONFIG_SMP */ -+static inline struct task_struct -+*earliest_deadline_task(struct rq *rq, int cpu, struct task_struct *idle) -+{ -+ struct task_struct *edt; -+ -+ if (unlikely(!rq->sl->entries)) -+ return idle; -+ edt = rq->node->next[0]->value; -+ take_task(rq, cpu, edt); -+ return edt; -+} -+#endif /* CONFIG_SMP */ -+ -+/* -+ * Print scheduling while atomic bug: -+ */ -+static noinline void __schedule_bug(struct task_struct *prev) -+{ -+ /* Save this before calling printk(), since that will clobber it */ -+ unsigned long preempt_disable_ip = get_preempt_disable_ip(current); -+ -+ if (oops_in_progress) -+ return; -+ -+ printk(KERN_ERR "BUG: scheduling while atomic: %s/%d/0x%08x\n", -+ prev->comm, prev->pid, preempt_count()); -+ -+ debug_show_held_locks(prev); -+ print_modules(); -+ if (irqs_disabled()) -+ print_irqtrace_events(prev); -+ if (IS_ENABLED(CONFIG_DEBUG_PREEMPT) -+ && in_atomic_preempt_off()) { -+ pr_err("Preemption disabled at:"); -+ print_ip_sym(preempt_disable_ip); -+ pr_cont("\n"); -+ } -+ dump_stack(); -+ add_taint(TAINT_WARN, LOCKDEP_STILL_OK); -+} -+ -+/* -+ * Various schedule()-time debugging checks and statistics: -+ */ -+static inline void schedule_debug(struct task_struct *prev) -+{ -+#ifdef CONFIG_SCHED_STACK_END_CHECK -+ if (task_stack_end_corrupted(prev)) -+ panic("corrupted stack end detected inside scheduler\n"); -+#endif -+ -+ if (unlikely(in_atomic_preempt_off())) { -+ __schedule_bug(prev); -+ preempt_count_set(PREEMPT_DISABLED); -+ } -+ rcu_sleep_check(); -+ -+ profile_hit(SCHED_PROFILING, __builtin_return_address(0)); -+ -+ schedstat_inc(this_rq()->sched_count); -+} -+ -+/* -+ * The currently running task's information is all stored in rq local data -+ * which is only modified by the local CPU. -+ */ -+static inline void set_rq_task(struct rq *rq, struct task_struct *p) -+{ -+ if (p == rq->idle || p->policy == SCHED_FIFO) -+ hrexpiry_clear(rq); -+ else -+ hrexpiry_start(rq, US_TO_NS(p->time_slice)); -+ if (rq->clock - rq->last_tick > HALF_JIFFY_NS) -+ rq->dither = 0; -+ else -+ rq->dither = rq_dither(rq); -+ -+ rq->rq_deadline = p->deadline; -+ rq->rq_prio = p->prio; -+#ifdef CONFIG_SMT_NICE -+ rq->rq_mm = p->mm; -+ rq->rq_smt_bias = p->smt_bias; -+#endif -+} -+ -+#ifdef CONFIG_SMT_NICE -+static void check_no_siblings(struct rq __maybe_unused *this_rq) {} -+static void wake_no_siblings(struct rq __maybe_unused *this_rq) {} -+static void (*check_siblings)(struct rq *this_rq) = &check_no_siblings; -+static void (*wake_siblings)(struct rq *this_rq) = &wake_no_siblings; -+ -+/* Iterate over smt siblings when we've scheduled a process on cpu and decide -+ * whether they should continue running or be descheduled. */ -+static void check_smt_siblings(struct rq *this_rq) -+{ -+ int other_cpu; -+ -+ for_each_cpu(other_cpu, &this_rq->thread_mask) { -+ struct task_struct *p; -+ struct rq *rq; -+ -+ rq = cpu_rq(other_cpu); -+ if (rq_idle(rq)) -+ continue; -+ p = rq->curr; -+ if (!smt_schedule(p, this_rq)) -+ resched_curr(rq); -+ } -+} -+ -+static void wake_smt_siblings(struct rq *this_rq) -+{ -+ int other_cpu; -+ -+ for_each_cpu(other_cpu, &this_rq->thread_mask) { -+ struct rq *rq; -+ -+ rq = cpu_rq(other_cpu); -+ if (rq_idle(rq)) -+ resched_idle(rq); -+ } -+} -+#else -+static void check_siblings(struct rq __maybe_unused *this_rq) {} -+static void wake_siblings(struct rq __maybe_unused *this_rq) {} -+#endif -+ -+/* -+ * schedule() is the main scheduler function. -+ * -+ * The main means of driving the scheduler and thus entering this function are: -+ * -+ * 1. Explicit blocking: mutex, semaphore, waitqueue, etc. -+ * -+ * 2. TIF_NEED_RESCHED flag is checked on interrupt and userspace return -+ * paths. For example, see arch/x86/entry_64.S. -+ * -+ * To drive preemption between tasks, the scheduler sets the flag in timer -+ * interrupt handler scheduler_tick(). -+ * -+ * 3. Wakeups don't really cause entry into schedule(). They add a -+ * task to the run-queue and that's it. -+ * -+ * Now, if the new task added to the run-queue preempts the current -+ * task, then the wakeup sets TIF_NEED_RESCHED and schedule() gets -+ * called on the nearest possible occasion: -+ * -+ * - If the kernel is preemptible (CONFIG_PREEMPT=y): -+ * -+ * - in syscall or exception context, at the next outmost -+ * preempt_enable(). (this might be as soon as the wake_up()'s -+ * spin_unlock()!) -+ * -+ * - in IRQ context, return from interrupt-handler to -+ * preemptible context -+ * -+ * - If the kernel is not preemptible (CONFIG_PREEMPT is not set) -+ * then at the next: -+ * -+ * - cond_resched() call -+ * - explicit schedule() call -+ * - return from syscall or exception to user-space -+ * - return from interrupt-handler to user-space -+ * -+ * WARNING: must be called with preemption disabled! -+ */ -+static void __sched notrace __schedule(bool preempt) -+{ -+ struct task_struct *prev, *next, *idle; -+ unsigned long *switch_count; -+ bool deactivate = false; -+ struct rq *rq; -+ u64 niffies; -+ int cpu; -+ -+ cpu = smp_processor_id(); -+ rq = cpu_rq(cpu); -+ prev = rq->curr; -+ idle = rq->idle; -+ -+ schedule_debug(prev); -+ -+ local_irq_disable(); -+ rcu_note_context_switch(preempt); -+ -+ /* -+ * Make sure that signal_pending_state()->signal_pending() below -+ * can't be reordered with __set_current_state(TASK_INTERRUPTIBLE) -+ * done by the caller to avoid the race with signal_wake_up(). -+ * -+ * The membarrier system call requires a full memory barrier -+ * after coming from user-space, before storing to rq->curr. -+ */ -+ rq_lock(rq); -+ smp_mb__after_spinlock(); -+#ifdef CONFIG_SMP -+ if (rq->preempt) { -+ /* -+ * Make sure resched_curr hasn't triggered a preemption -+ * locklessly on a task that has since scheduled away. Spurious -+ * wakeup of idle is okay though. -+ */ -+ if (unlikely(preempt && prev != idle && !test_tsk_need_resched(prev))) { -+ rq->preempt = NULL; -+ clear_preempt_need_resched(); -+ rq_unlock_irq(rq, NULL); -+ return; -+ } -+ rq->preempt = NULL; -+ } -+#endif -+ -+ switch_count = &prev->nivcsw; -+ if (!preempt && prev->state) { -+ if (signal_pending_state(prev->state, prev)) { -+ prev->state = TASK_RUNNING; -+ } else { -+ deactivate = true; -+ -+ if (prev->in_iowait) { -+ atomic_inc(&rq->nr_iowait); -+ delayacct_blkio_start(); -+ } -+ } -+ switch_count = &prev->nvcsw; -+ } -+ -+ /* -+ * Store the niffy value here for use by the next task's last_ran -+ * below to avoid losing niffies due to update_clocks being called -+ * again after this point. -+ */ -+ update_clocks(rq); -+ niffies = rq->niffies; -+ update_cpu_clock_switch(rq, prev); -+ -+ clear_tsk_need_resched(prev); -+ clear_preempt_need_resched(); -+ -+ if (idle != prev) { -+ check_deadline(prev, rq); -+ return_task(prev, rq, cpu, deactivate); -+ } -+ -+ next = earliest_deadline_task(rq, cpu, idle); -+ if (likely(next->prio != PRIO_LIMIT)) -+ clear_cpuidle_map(cpu); -+ else { -+ set_cpuidle_map(cpu); -+ update_load_avg(rq, 0); -+ } -+ -+ set_rq_task(rq, next); -+ next->last_ran = niffies; -+ -+ if (likely(prev != next)) { -+ /* -+ * Don't reschedule an idle task or deactivated tasks -+ */ -+ if (prev == idle) { -+ rq->nr_running++; -+ if (rt_task(next)) -+ rq->rt_nr_running++; -+ } else if (!deactivate) -+ resched_suitable_idle(prev); -+ if (unlikely(next == idle)) { -+ rq->nr_running--; -+ if (rt_task(prev)) -+ rq->rt_nr_running--; -+ wake_siblings(rq); -+ } else -+ check_siblings(rq); -+ rq->nr_switches++; -+ rq->curr = next; -+ /* -+ * The membarrier system call requires each architecture -+ * to have a full memory barrier after updating -+ * rq->curr, before returning to user-space. -+ * -+ * Here are the schemes providing that barrier on the -+ * various architectures: -+ * - mm ? switch_mm() : mmdrop() for x86, s390, sparc, PowerPC. -+ * switch_mm() rely on membarrier_arch_switch_mm() on PowerPC. -+ * - finish_lock_switch() for weakly-ordered -+ * architectures where spin_unlock is a full barrier, -+ * - switch_to() for arm64 (weakly-ordered, spin_unlock -+ * is a RELEASE barrier), -+ */ -+ ++*switch_count; -+ -+ trace_sched_switch(preempt, prev, next); -+ context_switch(rq, prev, next); /* unlocks the rq */ -+ } else { -+ check_siblings(rq); -+ rq_unlock(rq); -+ do_pending_softirq(rq, next); -+ local_irq_enable(); -+ } -+} -+ -+void __noreturn do_task_dead(void) -+{ -+ /* Causes final put_task_struct in finish_task_switch(). */ -+ set_special_state(TASK_DEAD); -+ -+ /* Tell freezer to ignore us: */ -+ current->flags |= PF_NOFREEZE; -+ __schedule(false); -+ BUG(); -+ -+ /* Avoid "noreturn function does return" - but don't continue if BUG() is a NOP: */ -+ for (;;) -+ cpu_relax(); -+} -+ -+static inline void sched_submit_work(struct task_struct *tsk) -+{ -+ if (!tsk->state || tsk_is_pi_blocked(tsk)) -+ return; -+ -+ /* -+ * If a worker went to sleep, notify and ask workqueue whether -+ * it wants to wake up a task to maintain concurrency. -+ * As this function is called inside the schedule() context, -+ * we disable preemption to avoid it calling schedule() again -+ * in the possible wakeup of a kworker. -+ */ -+ if (tsk->flags & PF_WQ_WORKER) { -+ preempt_disable(); -+ wq_worker_sleeping(tsk); -+ preempt_enable_no_resched(); -+ } -+ -+ /* -+ * If we are going to sleep and we have plugged IO queued, -+ * make sure to submit it to avoid deadlocks. -+ */ -+ if (blk_needs_flush_plug(tsk)) -+ blk_schedule_flush_plug(tsk); -+} -+ -+static inline void sched_update_worker(struct task_struct *tsk) -+{ -+ if (tsk->flags & PF_WQ_WORKER) -+ wq_worker_running(tsk); -+} -+ -+asmlinkage __visible void __sched schedule(void) -+{ -+ struct task_struct *tsk = current; -+ -+ sched_submit_work(tsk); -+ do { -+ preempt_disable(); -+ __schedule(false); -+ sched_preempt_enable_no_resched(); -+ } while (need_resched()); -+ sched_update_worker(tsk); -+} -+ -+EXPORT_SYMBOL(schedule); -+ -+/* -+ * synchronize_rcu_tasks() makes sure that no task is stuck in preempted -+ * state (have scheduled out non-voluntarily) by making sure that all -+ * tasks have either left the run queue or have gone into user space. -+ * As idle tasks do not do either, they must not ever be preempted -+ * (schedule out non-voluntarily). -+ * -+ * schedule_idle() is similar to schedule_preempt_disable() except that it -+ * never enables preemption because it does not call sched_submit_work(). -+ */ -+void __sched schedule_idle(void) -+{ -+ /* -+ * As this skips calling sched_submit_work(), which the idle task does -+ * regardless because that function is a nop when the task is in a -+ * TASK_RUNNING state, make sure this isn't used someplace that the -+ * current task can be in any other state. Note, idle is always in the -+ * TASK_RUNNING state. -+ */ -+ WARN_ON_ONCE(current->state); -+ do { -+ __schedule(false); -+ } while (need_resched()); -+} -+ -+#ifdef CONFIG_CONTEXT_TRACKING -+asmlinkage __visible void __sched schedule_user(void) -+{ -+ /* -+ * If we come here after a random call to set_need_resched(), -+ * or we have been woken up remotely but the IPI has not yet arrived, -+ * we haven't yet exited the RCU idle mode. Do it here manually until -+ * we find a better solution. -+ * -+ * NB: There are buggy callers of this function. Ideally we -+ * should warn if prev_state != IN_USER, but that will trigger -+ * too frequently to make sense yet. -+ */ -+ enum ctx_state prev_state = exception_enter(); -+ schedule(); -+ exception_exit(prev_state); -+} -+#endif -+ -+/** -+ * schedule_preempt_disabled - called with preemption disabled -+ * -+ * Returns with preemption disabled. Note: preempt_count must be 1 -+ */ -+void __sched schedule_preempt_disabled(void) -+{ -+ sched_preempt_enable_no_resched(); -+ schedule(); -+ preempt_disable(); -+} -+ -+static void __sched notrace preempt_schedule_common(void) -+{ -+ do { -+ /* -+ * Because the function tracer can trace preempt_count_sub() -+ * and it also uses preempt_enable/disable_notrace(), if -+ * NEED_RESCHED is set, the preempt_enable_notrace() called -+ * by the function tracer will call this function again and -+ * cause infinite recursion. -+ * -+ * Preemption must be disabled here before the function -+ * tracer can trace. Break up preempt_disable() into two -+ * calls. One to disable preemption without fear of being -+ * traced. The other to still record the preemption latency, -+ * which can also be traced by the function tracer. -+ */ -+ preempt_disable_notrace(); -+ preempt_latency_start(1); -+ __schedule(true); -+ preempt_latency_stop(1); -+ preempt_enable_no_resched_notrace(); -+ -+ /* -+ * Check again in case we missed a preemption opportunity -+ * between schedule and now. -+ */ -+ } while (need_resched()); -+} -+ -+#ifdef CONFIG_PREEMPT -+/* -+ * this is the entry point to schedule() from in-kernel preemption -+ * off of preempt_enable. Kernel preemptions off return from interrupt -+ * occur there and call schedule directly. -+ */ -+asmlinkage __visible void __sched notrace preempt_schedule(void) -+{ -+ /* -+ * If there is a non-zero preempt_count or interrupts are disabled, -+ * we do not want to preempt the current task. Just return.. -+ */ -+ if (likely(!preemptible())) -+ return; -+ -+ preempt_schedule_common(); -+} -+NOKPROBE_SYMBOL(preempt_schedule); -+EXPORT_SYMBOL(preempt_schedule); -+ -+/** -+ * preempt_schedule_notrace - preempt_schedule called by tracing -+ * -+ * The tracing infrastructure uses preempt_enable_notrace to prevent -+ * recursion and tracing preempt enabling caused by the tracing -+ * infrastructure itself. But as tracing can happen in areas coming -+ * from userspace or just about to enter userspace, a preempt enable -+ * can occur before user_exit() is called. This will cause the scheduler -+ * to be called when the system is still in usermode. -+ * -+ * To prevent this, the preempt_enable_notrace will use this function -+ * instead of preempt_schedule() to exit user context if needed before -+ * calling the scheduler. -+ */ -+asmlinkage __visible void __sched notrace preempt_schedule_notrace(void) -+{ -+ enum ctx_state prev_ctx; -+ -+ if (likely(!preemptible())) -+ return; -+ -+ do { -+ /* -+ * Because the function tracer can trace preempt_count_sub() -+ * and it also uses preempt_enable/disable_notrace(), if -+ * NEED_RESCHED is set, the preempt_enable_notrace() called -+ * by the function tracer will call this function again and -+ * cause infinite recursion. -+ * -+ * Preemption must be disabled here before the function -+ * tracer can trace. Break up preempt_disable() into two -+ * calls. One to disable preemption without fear of being -+ * traced. The other to still record the preemption latency, -+ * which can also be traced by the function tracer. -+ */ -+ preempt_disable_notrace(); -+ preempt_latency_start(1); -+ /* -+ * Needs preempt disabled in case user_exit() is traced -+ * and the tracer calls preempt_enable_notrace() causing -+ * an infinite recursion. -+ */ -+ prev_ctx = exception_enter(); -+ __schedule(true); -+ exception_exit(prev_ctx); -+ -+ preempt_latency_stop(1); -+ preempt_enable_no_resched_notrace(); -+ } while (need_resched()); -+} -+EXPORT_SYMBOL_GPL(preempt_schedule_notrace); -+ -+#endif /* CONFIG_PREEMPT */ -+ -+/* -+ * this is the entry point to schedule() from kernel preemption -+ * off of irq context. -+ * Note, that this is called and return with irqs disabled. This will -+ * protect us against recursive calling from irq. -+ */ -+asmlinkage __visible void __sched preempt_schedule_irq(void) -+{ -+ enum ctx_state prev_state; -+ -+ /* Catch callers which need to be fixed */ -+ BUG_ON(preempt_count() || !irqs_disabled()); -+ -+ prev_state = exception_enter(); -+ -+ do { -+ preempt_disable(); -+ local_irq_enable(); -+ __schedule(true); -+ local_irq_disable(); -+ sched_preempt_enable_no_resched(); -+ } while (need_resched()); -+ -+ exception_exit(prev_state); -+} -+ -+int default_wake_function(wait_queue_entry_t *curr, unsigned mode, int wake_flags, -+ void *key) -+{ -+ return try_to_wake_up(curr->private, mode, wake_flags); -+} -+EXPORT_SYMBOL(default_wake_function); -+ -+#ifdef CONFIG_RT_MUTEXES -+ -+static inline int __rt_effective_prio(struct task_struct *pi_task, int prio) -+{ -+ if (pi_task) -+ prio = min(prio, pi_task->prio); -+ -+ return prio; -+} -+ -+static inline int rt_effective_prio(struct task_struct *p, int prio) -+{ -+ struct task_struct *pi_task = rt_mutex_get_top_task(p); -+ -+ return __rt_effective_prio(pi_task, prio); -+} -+ -+/* -+ * rt_mutex_setprio - set the current priority of a task -+ * @p: task to boost -+ * @pi_task: donor task -+ * -+ * This function changes the 'effective' priority of a task. It does -+ * not touch ->normal_prio like __setscheduler(). -+ * -+ * Used by the rt_mutex code to implement priority inheritance -+ * logic. Call site only calls if the priority of the task changed. -+ */ -+void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task) -+{ -+ int prio, oldprio; -+ struct rq *rq; -+ -+ /* XXX used to be waiter->prio, not waiter->task->prio */ -+ prio = __rt_effective_prio(pi_task, p->normal_prio); -+ -+ /* -+ * If nothing changed; bail early. -+ */ -+ if (p->pi_top_task == pi_task && prio == p->prio) -+ return; -+ -+ rq = __task_rq_lock(p, NULL); -+ update_rq_clock(rq); -+ /* -+ * Set under pi_lock && rq->lock, such that the value can be used under -+ * either lock. -+ * -+ * Note that there is loads of tricky to make this pointer cache work -+ * right. rt_mutex_slowunlock()+rt_mutex_postunlock() work together to -+ * ensure a task is de-boosted (pi_task is set to NULL) before the -+ * task is allowed to run again (and can exit). This ensures the pointer -+ * points to a blocked task -- which guaratees the task is present. -+ */ -+ p->pi_top_task = pi_task; -+ -+ /* -+ * For FIFO/RR we only need to set prio, if that matches we're done. -+ */ -+ if (prio == p->prio) -+ goto out_unlock; -+ -+ /* -+ * Idle task boosting is a nono in general. There is one -+ * exception, when PREEMPT_RT and NOHZ is active: -+ * -+ * The idle task calls get_next_timer_interrupt() and holds -+ * the timer wheel base->lock on the CPU and another CPU wants -+ * to access the timer (probably to cancel it). We can safely -+ * ignore the boosting request, as the idle CPU runs this code -+ * with interrupts disabled and will complete the lock -+ * protected section without being interrupted. So there is no -+ * real need to boost. -+ */ -+ if (unlikely(p == rq->idle)) { -+ WARN_ON(p != rq->curr); -+ WARN_ON(p->pi_blocked_on); -+ goto out_unlock; -+ } -+ -+ trace_sched_pi_setprio(p, pi_task); -+ oldprio = p->prio; -+ p->prio = prio; -+ if (task_running(rq, p)){ -+ if (prio > oldprio) -+ resched_task(p); -+ } else if (task_queued(p)) { -+ dequeue_task(rq, p, DEQUEUE_SAVE); -+ enqueue_task(rq, p, ENQUEUE_RESTORE); -+ if (prio < oldprio) -+ try_preempt(p, rq); -+ } -+out_unlock: -+ __task_rq_unlock(rq, NULL); -+} -+#else -+static inline int rt_effective_prio(struct task_struct *p, int prio) -+{ -+ return prio; -+} -+#endif -+ -+/* -+ * Adjust the deadline for when the priority is to change, before it's -+ * changed. -+ */ -+static inline void adjust_deadline(struct task_struct *p, int new_prio) -+{ -+ p->deadline += static_deadline_diff(new_prio) - task_deadline_diff(p); -+} -+ -+void set_user_nice(struct task_struct *p, long nice) -+{ -+ int new_static, old_static; -+ struct rq_flags rf; -+ struct rq *rq; -+ -+ if (task_nice(p) == nice || nice < MIN_NICE || nice > MAX_NICE) -+ return; -+ new_static = NICE_TO_PRIO(nice); -+ /* -+ * We have to be careful, if called from sys_setpriority(), -+ * the task might be in the middle of scheduling on another CPU. -+ */ -+ rq = task_rq_lock(p, &rf); -+ update_rq_clock(rq); -+ -+ /* -+ * The RT priorities are set via sched_setscheduler(), but we still -+ * allow the 'normal' nice value to be set - but as expected -+ * it wont have any effect on scheduling until the task is -+ * not SCHED_NORMAL/SCHED_BATCH: -+ */ -+ if (has_rt_policy(p)) { -+ p->static_prio = new_static; -+ goto out_unlock; -+ } -+ -+ adjust_deadline(p, new_static); -+ old_static = p->static_prio; -+ p->static_prio = new_static; -+ p->prio = effective_prio(p); -+ -+ if (task_queued(p)) { -+ dequeue_task(rq, p, DEQUEUE_SAVE); -+ enqueue_task(rq, p, ENQUEUE_RESTORE); -+ if (new_static < old_static) -+ try_preempt(p, rq); -+ } else if (task_running(rq, p)) { -+ set_rq_task(rq, p); -+ if (old_static < new_static) -+ resched_task(p); -+ } -+out_unlock: -+ task_rq_unlock(rq, p, &rf); -+} -+EXPORT_SYMBOL(set_user_nice); -+ -+/* -+ * can_nice - check if a task can reduce its nice value -+ * @p: task -+ * @nice: nice value -+ */ -+int can_nice(const struct task_struct *p, const int nice) -+{ -+ /* Convert nice value [19,-20] to rlimit style value [1,40] */ -+ int nice_rlim = nice_to_rlimit(nice); -+ -+ return (nice_rlim <= task_rlimit(p, RLIMIT_NICE) || -+ capable(CAP_SYS_NICE)); -+} -+ -+#ifdef __ARCH_WANT_SYS_NICE -+ -+/* -+ * sys_nice - change the priority of the current process. -+ * @increment: priority increment -+ * -+ * sys_setpriority is a more generic, but much slower function that -+ * does similar things. -+ */ -+SYSCALL_DEFINE1(nice, int, increment) -+{ -+ long nice, retval; -+ -+ /* -+ * Setpriority might change our priority at the same moment. -+ * We don't have to worry. Conceptually one call occurs first -+ * and we have a single winner. -+ */ -+ -+ increment = clamp(increment, -NICE_WIDTH, NICE_WIDTH); -+ nice = task_nice(current) + increment; -+ -+ nice = clamp_val(nice, MIN_NICE, MAX_NICE); -+ if (increment < 0 && !can_nice(current, nice)) -+ return -EPERM; -+ -+ retval = security_task_setnice(current, nice); -+ if (retval) -+ return retval; -+ -+ set_user_nice(current, nice); -+ return 0; -+} -+ -+#endif -+ -+/** -+ * task_prio - return the priority value of a given task. -+ * @p: the task in question. -+ * -+ * Return: The priority value as seen by users in /proc. -+ * RT tasks are offset by -100. Normal tasks are centered around 1, value goes -+ * from 0 (SCHED_ISO) up to 82 (nice +19 SCHED_IDLEPRIO). -+ */ -+int task_prio(const struct task_struct *p) -+{ -+ int delta, prio = p->prio - MAX_RT_PRIO; -+ -+ /* rt tasks and iso tasks */ -+ if (prio <= 0) -+ goto out; -+ -+ /* Convert to ms to avoid overflows */ -+ delta = NS_TO_MS(p->deadline - task_rq(p)->niffies); -+ if (unlikely(delta < 0)) -+ delta = 0; -+ delta = delta * 40 / ms_longest_deadline_diff(); -+ if (delta <= 80) -+ prio += delta; -+ if (idleprio_task(p)) -+ prio += 40; -+out: -+ return prio; -+} -+ -+/** -+ * idle_cpu - is a given CPU idle currently? -+ * @cpu: the processor in question. -+ * -+ * Return: 1 if the CPU is currently idle. 0 otherwise. -+ */ -+int idle_cpu(int cpu) -+{ -+ return cpu_curr(cpu) == cpu_rq(cpu)->idle; -+} -+ -+/** -+ * available_idle_cpu - is a given CPU idle for enqueuing work. -+ * @cpu: the CPU in question. -+ * -+ * Return: 1 if the CPU is currently idle. 0 otherwise. -+ */ -+int available_idle_cpu(int cpu) -+{ -+ if (!idle_cpu(cpu)) -+ return 0; -+ -+ if (vcpu_is_preempted(cpu)) -+ return 0; -+ -+ return 1; -+} -+ -+/** -+ * idle_task - return the idle task for a given CPU. -+ * @cpu: the processor in question. -+ * -+ * Return: The idle task for the CPU @cpu. -+ */ -+struct task_struct *idle_task(int cpu) -+{ -+ return cpu_rq(cpu)->idle; -+} -+ -+/** -+ * find_process_by_pid - find a process with a matching PID value. -+ * @pid: the pid in question. -+ * -+ * The task of @pid, if found. %NULL otherwise. -+ */ -+static inline struct task_struct *find_process_by_pid(pid_t pid) -+{ -+ return pid ? find_task_by_vpid(pid) : current; -+} -+ -+/* Actually do priority change: must hold rq lock. */ -+static void __setscheduler(struct task_struct *p, struct rq *rq, int policy, -+ int prio, bool keep_boost) -+{ -+ int oldrtprio, oldprio; -+ -+ p->policy = policy; -+ oldrtprio = p->rt_priority; -+ p->rt_priority = prio; -+ p->normal_prio = normal_prio(p); -+ oldprio = p->prio; -+ /* -+ * Keep a potential priority boosting if called from -+ * sched_setscheduler(). -+ */ -+ p->prio = normal_prio(p); -+ if (keep_boost) -+ p->prio = rt_effective_prio(p, p->prio); -+ -+ if (task_running(rq, p)) { -+ set_rq_task(rq, p); -+ resched_task(p); -+ } else if (task_queued(p)) { -+ dequeue_task(rq, p, DEQUEUE_SAVE); -+ enqueue_task(rq, p, ENQUEUE_RESTORE); -+ if (p->prio < oldprio || p->rt_priority > oldrtprio) -+ try_preempt(p, rq); -+ } -+} -+ -+/* -+ * Check the target process has a UID that matches the current process's -+ */ -+static bool check_same_owner(struct task_struct *p) -+{ -+ const struct cred *cred = current_cred(), *pcred; -+ bool match; -+ -+ rcu_read_lock(); -+ pcred = __task_cred(p); -+ match = (uid_eq(cred->euid, pcred->euid) || -+ uid_eq(cred->euid, pcred->uid)); -+ rcu_read_unlock(); -+ return match; -+} -+ -+static int __sched_setscheduler(struct task_struct *p, -+ const struct sched_attr *attr, -+ bool user, bool pi) -+{ -+ int retval, policy = attr->sched_policy, oldpolicy = -1, priority = attr->sched_priority; -+ unsigned long rlim_rtprio = 0; -+ struct rq_flags rf; -+ int reset_on_fork; -+ struct rq *rq; -+ -+ /* The pi code expects interrupts enabled */ -+ BUG_ON(pi && in_interrupt()); -+ -+ if (is_rt_policy(policy) && !capable(CAP_SYS_NICE)) { -+ unsigned long lflags; -+ -+ if (!lock_task_sighand(p, &lflags)) -+ return -ESRCH; -+ rlim_rtprio = task_rlimit(p, RLIMIT_RTPRIO); -+ unlock_task_sighand(p, &lflags); -+ if (rlim_rtprio) -+ goto recheck; -+ /* -+ * If the caller requested an RT policy without having the -+ * necessary rights, we downgrade the policy to SCHED_ISO. -+ * We also set the parameter to zero to pass the checks. -+ */ -+ policy = SCHED_ISO; -+ priority = 0; -+ } -+recheck: -+ /* Double check policy once rq lock held */ -+ if (policy < 0) { -+ reset_on_fork = p->sched_reset_on_fork; -+ policy = oldpolicy = p->policy; -+ } else { -+ reset_on_fork = !!(policy & SCHED_RESET_ON_FORK); -+ policy &= ~SCHED_RESET_ON_FORK; -+ -+ if (!SCHED_RANGE(policy)) -+ return -EINVAL; -+ } -+ -+ if (attr->sched_flags & ~(SCHED_FLAG_ALL | SCHED_FLAG_SUGOV)) -+ return -EINVAL; -+ -+ /* -+ * Valid priorities for SCHED_FIFO and SCHED_RR are -+ * 1..MAX_USER_RT_PRIO-1, valid priority for SCHED_NORMAL and -+ * SCHED_BATCH is 0. -+ */ -+ if (priority < 0 || -+ (p->mm && priority > MAX_USER_RT_PRIO - 1) || -+ (!p->mm && priority > MAX_RT_PRIO - 1)) -+ return -EINVAL; -+ if (is_rt_policy(policy) != (priority != 0)) -+ return -EINVAL; -+ -+ /* -+ * Allow unprivileged RT tasks to decrease priority: -+ */ -+ if (user && !capable(CAP_SYS_NICE)) { -+ if (is_rt_policy(policy)) { -+ unsigned long rlim_rtprio = -+ task_rlimit(p, RLIMIT_RTPRIO); -+ -+ /* Can't set/change the rt policy */ -+ if (policy != p->policy && !rlim_rtprio) -+ return -EPERM; -+ -+ /* Can't increase priority */ -+ if (priority > p->rt_priority && -+ priority > rlim_rtprio) -+ return -EPERM; -+ } else { -+ switch (p->policy) { -+ /* -+ * Can only downgrade policies but not back to -+ * SCHED_NORMAL -+ */ -+ case SCHED_ISO: -+ if (policy == SCHED_ISO) -+ goto out; -+ if (policy != SCHED_NORMAL) -+ return -EPERM; -+ break; -+ case SCHED_BATCH: -+ if (policy == SCHED_BATCH) -+ goto out; -+ if (policy != SCHED_IDLEPRIO) -+ return -EPERM; -+ break; -+ case SCHED_IDLEPRIO: -+ if (policy == SCHED_IDLEPRIO) -+ goto out; -+ return -EPERM; -+ default: -+ break; -+ } -+ } -+ -+ /* Can't change other user's priorities */ -+ if (!check_same_owner(p)) -+ return -EPERM; -+ -+ /* Normal users shall not reset the sched_reset_on_fork flag: */ -+ if (p->sched_reset_on_fork && !reset_on_fork) -+ return -EPERM; -+ } -+ -+ if (user) { -+ retval = security_task_setscheduler(p); -+ if (retval) -+ return retval; -+ } -+ -+ /* -+ * Make sure no PI-waiters arrive (or leave) while we are -+ * changing the priority of the task: -+ * -+ * To be able to change p->policy safely, the runqueue lock must be -+ * held. -+ */ -+ rq = task_rq_lock(p, &rf); -+ update_rq_clock(rq); -+ -+ /* -+ * Changing the policy of the stop threads its a very bad idea: -+ */ -+ if (p == rq->stop) { -+ task_rq_unlock(rq, p, &rf); -+ return -EINVAL; -+ } -+ -+ /* -+ * If not changing anything there's no need to proceed further: -+ */ -+ if (unlikely(policy == p->policy && (!is_rt_policy(policy) || -+ priority == p->rt_priority))) { -+ task_rq_unlock(rq, p, &rf); -+ return 0; -+ } -+ -+ /* Re-check policy now with rq lock held */ -+ if (unlikely(oldpolicy != -1 && oldpolicy != p->policy)) { -+ policy = oldpolicy = -1; -+ task_rq_unlock(rq, p, &rf); -+ goto recheck; -+ } -+ p->sched_reset_on_fork = reset_on_fork; -+ -+ __setscheduler(p, rq, policy, priority, pi); -+ task_rq_unlock(rq, p, &rf); -+ -+ if (pi) -+ rt_mutex_adjust_pi(p); -+out: -+ return 0; -+} -+ -+static int _sched_setscheduler(struct task_struct *p, int policy, -+ const struct sched_param *param, bool check) -+{ -+ struct sched_attr attr = { -+ .sched_policy = policy, -+ .sched_priority = param->sched_priority, -+ .sched_nice = PRIO_TO_NICE(p->static_prio), -+ }; -+ -+ return __sched_setscheduler(p, &attr, check, true); -+} -+/** -+ * sched_setscheduler - change the scheduling policy and/or RT priority of a thread. -+ * @p: the task in question. -+ * @policy: new policy. -+ * @param: structure containing the new RT priority. -+ * -+ * Return: 0 on success. An error code otherwise. -+ * -+ * NOTE that the task may be already dead. -+ */ -+int sched_setscheduler(struct task_struct *p, int policy, -+ const struct sched_param *param) -+{ -+ return _sched_setscheduler(p, policy, param, true); -+} -+ -+EXPORT_SYMBOL_GPL(sched_setscheduler); -+ -+int sched_setattr(struct task_struct *p, const struct sched_attr *attr) -+{ -+ return __sched_setscheduler(p, attr, true, true); -+} -+EXPORT_SYMBOL_GPL(sched_setattr); -+ -+int sched_setattr_nocheck(struct task_struct *p, const struct sched_attr *attr) -+{ -+ return __sched_setscheduler(p, attr, false, true); -+} -+ -+/** -+ * sched_setscheduler_nocheck - change the scheduling policy and/or RT priority of a thread from kernelspace. -+ * @p: the task in question. -+ * @policy: new policy. -+ * @param: structure containing the new RT priority. -+ * -+ * Just like sched_setscheduler, only don't bother checking if the -+ * current context has permission. For example, this is needed in -+ * stop_machine(): we create temporary high priority worker threads, -+ * but our caller might not have that capability. -+ * -+ * Return: 0 on success. An error code otherwise. -+ */ -+int sched_setscheduler_nocheck(struct task_struct *p, int policy, -+ const struct sched_param *param) -+{ -+ return _sched_setscheduler(p, policy, param, false); -+} -+EXPORT_SYMBOL_GPL(sched_setscheduler_nocheck); -+ -+static int -+do_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param) -+{ -+ struct sched_param lparam; -+ struct task_struct *p; -+ int retval; -+ -+ if (!param || pid < 0) -+ return -EINVAL; -+ if (copy_from_user(&lparam, param, sizeof(struct sched_param))) -+ return -EFAULT; -+ -+ rcu_read_lock(); -+ retval = -ESRCH; -+ p = find_process_by_pid(pid); -+ if (p != NULL) -+ retval = sched_setscheduler(p, policy, &lparam); -+ rcu_read_unlock(); -+ -+ return retval; -+} -+ -+/* -+ * Mimics kernel/events/core.c perf_copy_attr(). -+ */ -+static int sched_copy_attr(struct sched_attr __user *uattr, -+ struct sched_attr *attr) -+{ -+ u32 size; -+ int ret; -+ -+ if (!access_ok(uattr, SCHED_ATTR_SIZE_VER0)) -+ return -EFAULT; -+ -+ /* Zero the full structure, so that a short copy will be nice: */ -+ memset(attr, 0, sizeof(*attr)); -+ -+ ret = get_user(size, &uattr->size); -+ if (ret) -+ return ret; -+ -+ /* Bail out on silly large: */ -+ if (size > PAGE_SIZE) -+ goto err_size; -+ -+ /* ABI compatibility quirk: */ -+ if (!size) -+ size = SCHED_ATTR_SIZE_VER0; -+ -+ if (size < SCHED_ATTR_SIZE_VER0) -+ goto err_size; -+ -+ /* -+ * If we're handed a bigger struct than we know of, -+ * ensure all the unknown bits are 0 - i.e. new -+ * user-space does not rely on any kernel feature -+ * extensions we dont know about yet. -+ */ -+ if (size > sizeof(*attr)) { -+ unsigned char __user *addr; -+ unsigned char __user *end; -+ unsigned char val; -+ -+ addr = (void __user *)uattr + sizeof(*attr); -+ end = (void __user *)uattr + size; -+ -+ for (; addr < end; addr++) { -+ ret = get_user(val, addr); -+ if (ret) -+ return ret; -+ if (val) -+ goto err_size; -+ } -+ size = sizeof(*attr); -+ } -+ -+ ret = copy_from_user(attr, uattr, size); -+ if (ret) -+ return -EFAULT; -+ -+ /* -+ * XXX: Do we want to be lenient like existing syscalls; or do we want -+ * to be strict and return an error on out-of-bounds values? -+ */ -+ attr->sched_nice = clamp(attr->sched_nice, -20, 19); -+ -+ /* sched/core.c uses zero here but we already know ret is zero */ -+ return 0; -+ -+err_size: -+ put_user(sizeof(*attr), &uattr->size); -+ return -E2BIG; -+} -+ -+/* -+ * sched_setparam() passes in -1 for its policy, to let the functions -+ * it calls know not to change it. -+ */ -+#define SETPARAM_POLICY -1 -+ -+/** -+ * sys_sched_setscheduler - set/change the scheduler policy and RT priority -+ * @pid: the pid in question. -+ * @policy: new policy. -+ * @param: structure containing the new RT priority. -+ * -+ * Return: 0 on success. An error code otherwise. -+ */ -+SYSCALL_DEFINE3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param) -+{ -+ if (policy < 0) -+ return -EINVAL; -+ -+ return do_sched_setscheduler(pid, policy, param); -+} -+ -+/** -+ * sys_sched_setparam - set/change the RT priority of a thread -+ * @pid: the pid in question. -+ * @param: structure containing the new RT priority. -+ * -+ * Return: 0 on success. An error code otherwise. -+ */ -+SYSCALL_DEFINE2(sched_setparam, pid_t, pid, struct sched_param __user *, param) -+{ -+ return do_sched_setscheduler(pid, SETPARAM_POLICY, param); -+} -+ -+/** -+ * sys_sched_setattr - same as above, but with extended sched_attr -+ * @pid: the pid in question. -+ * @uattr: structure containing the extended parameters. -+ */ -+SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr, -+ unsigned int, flags) -+{ -+ struct sched_attr attr; -+ struct task_struct *p; -+ int retval; -+ -+ if (!uattr || pid < 0 || flags) -+ return -EINVAL; -+ -+ retval = sched_copy_attr(uattr, &attr); -+ if (retval) -+ return retval; -+ -+ if ((int)attr.sched_policy < 0) -+ return -EINVAL; -+ -+ rcu_read_lock(); -+ retval = -ESRCH; -+ p = find_process_by_pid(pid); -+ if (p != NULL) -+ retval = sched_setattr(p, &attr); -+ rcu_read_unlock(); -+ -+ return retval; -+} -+ -+/** -+ * sys_sched_getscheduler - get the policy (scheduling class) of a thread -+ * @pid: the pid in question. -+ * -+ * Return: On success, the policy of the thread. Otherwise, a negative error -+ * code. -+ */ -+SYSCALL_DEFINE1(sched_getscheduler, pid_t, pid) -+{ -+ struct task_struct *p; -+ int retval = -EINVAL; -+ -+ if (pid < 0) -+ goto out_nounlock; -+ -+ retval = -ESRCH; -+ rcu_read_lock(); -+ p = find_process_by_pid(pid); -+ if (p) { -+ retval = security_task_getscheduler(p); -+ if (!retval) -+ retval = p->policy; -+ } -+ rcu_read_unlock(); -+ -+out_nounlock: -+ return retval; -+} -+ -+/** -+ * sys_sched_getscheduler - get the RT priority of a thread -+ * @pid: the pid in question. -+ * @param: structure containing the RT priority. -+ * -+ * Return: On success, 0 and the RT priority is in @param. Otherwise, an error -+ * code. -+ */ -+SYSCALL_DEFINE2(sched_getparam, pid_t, pid, struct sched_param __user *, param) -+{ -+ struct sched_param lp = { .sched_priority = 0 }; -+ struct task_struct *p; -+ int retval = -EINVAL; -+ -+ if (!param || pid < 0) -+ goto out_nounlock; -+ -+ rcu_read_lock(); -+ p = find_process_by_pid(pid); -+ retval = -ESRCH; -+ if (!p) -+ goto out_unlock; -+ -+ retval = security_task_getscheduler(p); -+ if (retval) -+ goto out_unlock; -+ -+ if (has_rt_policy(p)) -+ lp.sched_priority = p->rt_priority; -+ rcu_read_unlock(); -+ -+ /* -+ * This one might sleep, we cannot do it with a spinlock held ... -+ */ -+ retval = copy_to_user(param, &lp, sizeof(*param)) ? -EFAULT : 0; -+ -+out_nounlock: -+ return retval; -+ -+out_unlock: -+ rcu_read_unlock(); -+ return retval; -+} -+ -+static int sched_read_attr(struct sched_attr __user *uattr, -+ struct sched_attr *attr, -+ unsigned int usize) -+{ -+ int ret; -+ -+ if (!access_ok(uattr, usize)) -+ return -EFAULT; -+ -+ /* -+ * If we're handed a smaller struct than we know of, -+ * ensure all the unknown bits are 0 - i.e. old -+ * user-space does not get uncomplete information. -+ */ -+ if (usize < sizeof(*attr)) { -+ unsigned char *addr; -+ unsigned char *end; -+ -+ addr = (void *)attr + usize; -+ end = (void *)attr + sizeof(*attr); -+ -+ for (; addr < end; addr++) { -+ if (*addr) -+ return -EFBIG; -+ } -+ -+ attr->size = usize; -+ } -+ -+ ret = copy_to_user(uattr, attr, attr->size); -+ if (ret) -+ return -EFAULT; -+ -+ /* sched/core.c uses zero here but we already know ret is zero */ -+ return ret; -+} -+ -+/** -+ * sys_sched_getattr - similar to sched_getparam, but with sched_attr -+ * @pid: the pid in question. -+ * @uattr: structure containing the extended parameters. -+ * @size: sizeof(attr) for fwd/bwd comp. -+ * @flags: for future extension. -+ */ -+SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr, -+ unsigned int, size, unsigned int, flags) -+{ -+ struct sched_attr attr = { -+ .size = sizeof(struct sched_attr), -+ }; -+ struct task_struct *p; -+ int retval; -+ -+ if (!uattr || pid < 0 || size > PAGE_SIZE || -+ size < SCHED_ATTR_SIZE_VER0 || flags) -+ return -EINVAL; -+ -+ rcu_read_lock(); -+ p = find_process_by_pid(pid); -+ retval = -ESRCH; -+ if (!p) -+ goto out_unlock; -+ -+ retval = security_task_getscheduler(p); -+ if (retval) -+ goto out_unlock; -+ -+ attr.sched_policy = p->policy; -+ if (rt_task(p)) -+ attr.sched_priority = p->rt_priority; -+ else -+ attr.sched_nice = task_nice(p); -+ -+ rcu_read_unlock(); -+ -+ retval = sched_read_attr(uattr, &attr, size); -+ return retval; -+ -+out_unlock: -+ rcu_read_unlock(); -+ return retval; -+} -+ -+long sched_setaffinity(pid_t pid, const struct cpumask *in_mask) -+{ -+ cpumask_var_t cpus_allowed, new_mask; -+ struct task_struct *p; -+ int retval; -+ -+ rcu_read_lock(); -+ -+ p = find_process_by_pid(pid); -+ if (!p) { -+ rcu_read_unlock(); -+ return -ESRCH; -+ } -+ -+ /* Prevent p going away */ -+ get_task_struct(p); -+ rcu_read_unlock(); -+ -+ if (p->flags & PF_NO_SETAFFINITY) { -+ retval = -EINVAL; -+ goto out_put_task; -+ } -+ if (!alloc_cpumask_var(&cpus_allowed, GFP_KERNEL)) { -+ retval = -ENOMEM; -+ goto out_put_task; -+ } -+ if (!alloc_cpumask_var(&new_mask, GFP_KERNEL)) { -+ retval = -ENOMEM; -+ goto out_free_cpus_allowed; -+ } -+ retval = -EPERM; -+ if (!check_same_owner(p)) { -+ rcu_read_lock(); -+ if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE)) { -+ rcu_read_unlock(); -+ goto out_unlock; -+ } -+ rcu_read_unlock(); -+ } -+ -+ retval = security_task_setscheduler(p); -+ if (retval) -+ goto out_unlock; -+ -+ cpuset_cpus_allowed(p, cpus_allowed); -+ cpumask_and(new_mask, in_mask, cpus_allowed); -+again: -+ retval = __set_cpus_allowed_ptr(p, new_mask, true); -+ -+ if (!retval) { -+ cpuset_cpus_allowed(p, cpus_allowed); -+ if (!cpumask_subset(new_mask, cpus_allowed)) { -+ /* -+ * We must have raced with a concurrent cpuset -+ * update. Just reset the cpus_allowed to the -+ * cpuset's cpus_allowed -+ */ -+ cpumask_copy(new_mask, cpus_allowed); -+ goto again; -+ } -+ } -+out_unlock: -+ free_cpumask_var(new_mask); -+out_free_cpus_allowed: -+ free_cpumask_var(cpus_allowed); -+out_put_task: -+ put_task_struct(p); -+ return retval; -+} -+ -+static int get_user_cpu_mask(unsigned long __user *user_mask_ptr, unsigned len, -+ cpumask_t *new_mask) -+{ -+ if (len < cpumask_size()) -+ cpumask_clear(new_mask); -+ else if (len > cpumask_size()) -+ len = cpumask_size(); -+ -+ return copy_from_user(new_mask, user_mask_ptr, len) ? -EFAULT : 0; -+} -+ -+ -+/** -+ * sys_sched_setaffinity - set the CPU affinity of a process -+ * @pid: pid of the process -+ * @len: length in bytes of the bitmask pointed to by user_mask_ptr -+ * @user_mask_ptr: user-space pointer to the new CPU mask -+ * -+ * Return: 0 on success. An error code otherwise. -+ */ -+SYSCALL_DEFINE3(sched_setaffinity, pid_t, pid, unsigned int, len, -+ unsigned long __user *, user_mask_ptr) -+{ -+ cpumask_var_t new_mask; -+ int retval; -+ -+ if (!alloc_cpumask_var(&new_mask, GFP_KERNEL)) -+ return -ENOMEM; -+ -+ retval = get_user_cpu_mask(user_mask_ptr, len, new_mask); -+ if (retval == 0) -+ retval = sched_setaffinity(pid, new_mask); -+ free_cpumask_var(new_mask); -+ return retval; -+} -+ -+long sched_getaffinity(pid_t pid, cpumask_t *mask) -+{ -+ struct task_struct *p; -+ unsigned long flags; -+ int retval; -+ -+ get_online_cpus(); -+ rcu_read_lock(); -+ -+ retval = -ESRCH; -+ p = find_process_by_pid(pid); -+ if (!p) -+ goto out_unlock; -+ -+ retval = security_task_getscheduler(p); -+ if (retval) -+ goto out_unlock; -+ -+ raw_spin_lock_irqsave(&p->pi_lock, flags); -+ cpumask_and(mask, &p->cpus_allowed, cpu_active_mask); -+ raw_spin_unlock_irqrestore(&p->pi_lock, flags); -+ -+out_unlock: -+ rcu_read_unlock(); -+ put_online_cpus(); -+ -+ return retval; -+} -+ -+/** -+ * sys_sched_getaffinity - get the CPU affinity of a process -+ * @pid: pid of the process -+ * @len: length in bytes of the bitmask pointed to by user_mask_ptr -+ * @user_mask_ptr: user-space pointer to hold the current CPU mask -+ * -+ * Return: 0 on success. An error code otherwise. -+ */ -+SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len, -+ unsigned long __user *, user_mask_ptr) -+{ -+ int ret; -+ cpumask_var_t mask; -+ -+ if ((len * BITS_PER_BYTE) < nr_cpu_ids) -+ return -EINVAL; -+ if (len & (sizeof(unsigned long)-1)) -+ return -EINVAL; -+ -+ if (!alloc_cpumask_var(&mask, GFP_KERNEL)) -+ return -ENOMEM; -+ -+ ret = sched_getaffinity(pid, mask); -+ if (ret == 0) { -+ unsigned int retlen = min(len, cpumask_size()); -+ -+ if (copy_to_user(user_mask_ptr, mask, retlen)) -+ ret = -EFAULT; -+ else -+ ret = retlen; -+ } -+ free_cpumask_var(mask); -+ -+ return ret; -+} -+ -+/** -+ * sys_sched_yield - yield the current processor to other threads. -+ * -+ * This function yields the current CPU to other tasks. It does this by -+ * scheduling away the current task. If it still has the earliest deadline -+ * it will be scheduled again as the next task. -+ * -+ * Return: 0. -+ */ -+static void do_sched_yield(void) -+{ -+ struct rq *rq; -+ -+ if (!sched_yield_type) -+ return; -+ -+ local_irq_disable(); -+ rq = this_rq(); -+ rq_lock(rq); -+ -+ if (sched_yield_type > 1) -+ time_slice_expired(current, rq); -+ schedstat_inc(rq->yld_count); -+ -+ /* -+ * Since we are going to call schedule() anyway, there's -+ * no need to preempt or enable interrupts: -+ */ -+ preempt_disable(); -+ rq_unlock(rq); -+ sched_preempt_enable_no_resched(); -+ -+ schedule(); -+} -+ -+SYSCALL_DEFINE0(sched_yield) -+{ -+ do_sched_yield(); -+ return 0; -+} -+ -+#ifndef CONFIG_PREEMPT -+int __sched _cond_resched(void) -+{ -+ if (should_resched(0)) { -+ preempt_schedule_common(); -+ return 1; -+ } -+ rcu_all_qs(); -+ return 0; -+} -+EXPORT_SYMBOL(_cond_resched); -+#endif -+ -+/* -+ * __cond_resched_lock() - if a reschedule is pending, drop the given lock, -+ * call schedule, and on return reacquire the lock. -+ * -+ * This works OK both with and without CONFIG_PREEMPT. We do strange low-level -+ * operations here to prevent schedule() from being called twice (once via -+ * spin_unlock(), once by hand). -+ */ -+int __cond_resched_lock(spinlock_t *lock) -+{ -+ int resched = should_resched(PREEMPT_LOCK_OFFSET); -+ int ret = 0; -+ -+ lockdep_assert_held(lock); -+ -+ if (spin_needbreak(lock) || resched) { -+ spin_unlock(lock); -+ if (resched) -+ preempt_schedule_common(); -+ else -+ cpu_relax(); -+ ret = 1; -+ spin_lock(lock); -+ } -+ return ret; -+} -+EXPORT_SYMBOL(__cond_resched_lock); -+ -+/** -+ * yield - yield the current processor to other threads. -+ * -+ * Do not ever use this function, there's a 99% chance you're doing it wrong. -+ * -+ * The scheduler is at all times free to pick the calling task as the most -+ * eligible task to run, if removing the yield() call from your code breaks -+ * it, its already broken. -+ * -+ * Typical broken usage is: -+ * -+ * while (!event) -+ * yield(); -+ * -+ * where one assumes that yield() will let 'the other' process run that will -+ * make event true. If the current task is a SCHED_FIFO task that will never -+ * happen. Never use yield() as a progress guarantee!! -+ * -+ * If you want to use yield() to wait for something, use wait_event(). -+ * If you want to use yield() to be 'nice' for others, use cond_resched(). -+ * If you still want to use yield(), do not! -+ */ -+void __sched yield(void) -+{ -+ set_current_state(TASK_RUNNING); -+ do_sched_yield(); -+} -+EXPORT_SYMBOL(yield); -+ -+/** -+ * yield_to - yield the current processor to another thread in -+ * your thread group, or accelerate that thread toward the -+ * processor it's on. -+ * @p: target task -+ * @preempt: whether task preemption is allowed or not -+ * -+ * It's the caller's job to ensure that the target task struct -+ * can't go away on us before we can do any checks. -+ * -+ * Return: -+ * true (>0) if we indeed boosted the target task. -+ * false (0) if we failed to boost the target. -+ * -ESRCH if there's no task to yield to. -+ */ -+int __sched yield_to(struct task_struct *p, bool preempt) -+{ -+ struct task_struct *rq_p; -+ struct rq *rq, *p_rq; -+ unsigned long flags; -+ int yielded = 0; -+ -+ local_irq_save(flags); -+ rq = this_rq(); -+ -+again: -+ p_rq = task_rq(p); -+ /* -+ * If we're the only runnable task on the rq and target rq also -+ * has only one task, there's absolutely no point in yielding. -+ */ -+ if (task_running(p_rq, p) || p->state) { -+ yielded = -ESRCH; -+ goto out_irq; -+ } -+ -+ double_rq_lock(rq, p_rq); -+ if (unlikely(task_rq(p) != p_rq)) { -+ double_rq_unlock(rq, p_rq); -+ goto again; -+ } -+ -+ yielded = 1; -+ schedstat_inc(rq->yld_count); -+ rq_p = rq->curr; -+ if (p->deadline > rq_p->deadline) -+ p->deadline = rq_p->deadline; -+ p->time_slice += rq_p->time_slice; -+ if (p->time_slice > timeslice()) -+ p->time_slice = timeslice(); -+ time_slice_expired(rq_p, rq); -+ if (preempt && rq != p_rq) -+ resched_task(p_rq->curr); -+ double_rq_unlock(rq, p_rq); -+out_irq: -+ local_irq_restore(flags); -+ -+ if (yielded > 0) -+ schedule(); -+ return yielded; -+} -+EXPORT_SYMBOL_GPL(yield_to); -+ -+int io_schedule_prepare(void) -+{ -+ int old_iowait = current->in_iowait; -+ -+ current->in_iowait = 1; -+ blk_schedule_flush_plug(current); -+ -+ return old_iowait; -+} -+ -+void io_schedule_finish(int token) -+{ -+ current->in_iowait = token; -+} -+ -+/* -+ * This task is about to go to sleep on IO. Increment rq->nr_iowait so -+ * that process accounting knows that this is a task in IO wait state. -+ * -+ * But don't do that if it is a deliberate, throttling IO wait (this task -+ * has set its backing_dev_info: the queue against which it should throttle) -+ */ -+ -+long __sched io_schedule_timeout(long timeout) -+{ -+ int token; -+ long ret; -+ -+ token = io_schedule_prepare(); -+ ret = schedule_timeout(timeout); -+ io_schedule_finish(token); -+ -+ return ret; -+} -+EXPORT_SYMBOL(io_schedule_timeout); -+ -+void io_schedule(void) -+{ -+ int token; -+ -+ token = io_schedule_prepare(); -+ schedule(); -+ io_schedule_finish(token); -+} -+EXPORT_SYMBOL(io_schedule); -+ -+/** -+ * sys_sched_get_priority_max - return maximum RT priority. -+ * @policy: scheduling class. -+ * -+ * Return: On success, this syscall returns the maximum -+ * rt_priority that can be used by a given scheduling class. -+ * On failure, a negative error code is returned. -+ */ -+SYSCALL_DEFINE1(sched_get_priority_max, int, policy) -+{ -+ int ret = -EINVAL; -+ -+ switch (policy) { -+ case SCHED_FIFO: -+ case SCHED_RR: -+ ret = MAX_USER_RT_PRIO-1; -+ break; -+ case SCHED_NORMAL: -+ case SCHED_BATCH: -+ case SCHED_ISO: -+ case SCHED_IDLEPRIO: -+ ret = 0; -+ break; -+ } -+ return ret; -+} -+ -+/** -+ * sys_sched_get_priority_min - return minimum RT priority. -+ * @policy: scheduling class. -+ * -+ * Return: On success, this syscall returns the minimum -+ * rt_priority that can be used by a given scheduling class. -+ * On failure, a negative error code is returned. -+ */ -+SYSCALL_DEFINE1(sched_get_priority_min, int, policy) -+{ -+ int ret = -EINVAL; -+ -+ switch (policy) { -+ case SCHED_FIFO: -+ case SCHED_RR: -+ ret = 1; -+ break; -+ case SCHED_NORMAL: -+ case SCHED_BATCH: -+ case SCHED_ISO: -+ case SCHED_IDLEPRIO: -+ ret = 0; -+ break; -+ } -+ return ret; -+} -+ -+static int sched_rr_get_interval(pid_t pid, struct timespec64 *t) -+{ -+ struct task_struct *p; -+ unsigned int time_slice; -+ struct rq_flags rf; -+ struct rq *rq; -+ int retval; -+ -+ if (pid < 0) -+ return -EINVAL; -+ -+ retval = -ESRCH; -+ rcu_read_lock(); -+ p = find_process_by_pid(pid); -+ if (!p) -+ goto out_unlock; -+ -+ retval = security_task_getscheduler(p); -+ if (retval) -+ goto out_unlock; -+ -+ rq = task_rq_lock(p, &rf); -+ time_slice = p->policy == SCHED_FIFO ? 0 : MS_TO_NS(task_timeslice(p)); -+ task_rq_unlock(rq, p, &rf); -+ -+ rcu_read_unlock(); -+ *t = ns_to_timespec64(time_slice); -+ return 0; -+ -+out_unlock: -+ rcu_read_unlock(); -+ return retval; -+} -+ -+/** -+ * sys_sched_rr_get_interval - return the default timeslice of a process. -+ * @pid: pid of the process. -+ * @interval: userspace pointer to the timeslice value. -+ * -+ * this syscall writes the default timeslice value of a given process -+ * into the user-space timespec buffer. A value of '0' means infinity. -+ * -+ * Return: On success, 0 and the timeslice is in @interval. Otherwise, -+ * an error code. -+ */ -+SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid, -+ struct __kernel_timespec __user *, interval) -+{ -+ struct timespec64 t; -+ int retval = sched_rr_get_interval(pid, &t); -+ -+ if (retval == 0) -+ retval = put_timespec64(&t, interval); -+ -+ return retval; -+} -+ -+#ifdef CONFIG_COMPAT_32BIT_TIME -+SYSCALL_DEFINE2(sched_rr_get_interval_time32, pid_t, pid, -+ struct old_timespec32 __user *, interval) -+{ -+ struct timespec64 t; -+ int retval = sched_rr_get_interval(pid, &t); -+ -+ if (retval == 0) -+ retval = put_old_timespec32(&t, interval); -+ return retval; -+} -+#endif -+ -+void sched_show_task(struct task_struct *p) -+{ -+ unsigned long free = 0; -+ int ppid; -+ -+ if (!try_get_task_stack(p)) -+ return; -+ -+ printk(KERN_INFO "%-15.15s %c", p->comm, task_state_to_char(p)); -+ -+ if (p->state == TASK_RUNNING) -+ printk(KERN_CONT " running task "); -+#ifdef CONFIG_DEBUG_STACK_USAGE -+ free = stack_not_used(p); -+#endif -+ ppid = 0; -+ rcu_read_lock(); -+ if (pid_alive(p)) -+ ppid = task_pid_nr(rcu_dereference(p->real_parent)); -+ rcu_read_unlock(); -+ printk(KERN_CONT "%5lu %5d %6d 0x%08lx\n", free, -+ task_pid_nr(p), ppid, -+ (unsigned long)task_thread_info(p)->flags); -+ -+ print_worker_info(KERN_INFO, p); -+ show_stack(p, NULL); -+ put_task_stack(p); -+} -+EXPORT_SYMBOL_GPL(sched_show_task); -+ -+static inline bool -+state_filter_match(unsigned long state_filter, struct task_struct *p) -+{ -+ /* no filter, everything matches */ -+ if (!state_filter) -+ return true; -+ -+ /* filter, but doesn't match */ -+ if (!(p->state & state_filter)) -+ return false; -+ -+ /* -+ * When looking for TASK_UNINTERRUPTIBLE skip TASK_IDLE (allows -+ * TASK_KILLABLE). -+ */ -+ if (state_filter == TASK_UNINTERRUPTIBLE && p->state == TASK_IDLE) -+ return false; -+ -+ return true; -+} -+ -+void show_state_filter(unsigned long state_filter) -+{ -+ struct task_struct *g, *p; -+ -+#if BITS_PER_LONG == 32 -+ printk(KERN_INFO -+ " task PC stack pid father\n"); -+#else -+ printk(KERN_INFO -+ " task PC stack pid father\n"); -+#endif -+ rcu_read_lock(); -+ for_each_process_thread(g, p) { -+ /* -+ * reset the NMI-timeout, listing all files on a slow -+ * console might take a lot of time: -+ * Also, reset softlockup watchdogs on all CPUs, because -+ * another CPU might be blocked waiting for us to process -+ * an IPI. -+ */ -+ touch_nmi_watchdog(); -+ touch_all_softlockup_watchdogs(); -+ if (state_filter_match(state_filter, p)) -+ sched_show_task(p); -+ } -+ -+ rcu_read_unlock(); -+ /* -+ * Only show locks if all tasks are dumped: -+ */ -+ if (!state_filter) -+ debug_show_all_locks(); -+} -+ -+void dump_cpu_task(int cpu) -+{ -+ pr_info("Task dump for CPU %d:\n", cpu); -+ sched_show_task(cpu_curr(cpu)); -+} -+ -+#ifdef CONFIG_SMP -+void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask) -+{ -+ cpumask_copy(&p->cpus_allowed, new_mask); -+ p->nr_cpus_allowed = cpumask_weight(new_mask); -+} -+ -+void __do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) -+{ -+ struct rq *rq = task_rq(p); -+ -+ lockdep_assert_held(&p->pi_lock); -+ -+ cpumask_copy(&p->cpus_allowed, new_mask); -+ -+ if (task_queued(p)) { -+ /* -+ * Because __kthread_bind() calls this on blocked tasks without -+ * holding rq->lock. -+ */ -+ lockdep_assert_held(rq->lock); -+ } -+} -+ -+/* -+ * Calling do_set_cpus_allowed from outside the scheduler code should not be -+ * called on a running or queued task. We should be holding pi_lock. -+ */ -+void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) -+{ -+ __do_set_cpus_allowed(p, new_mask); -+ if (needs_other_cpu(p, task_cpu(p))) { -+ struct rq *rq; -+ -+ rq = __task_rq_lock(p, NULL); -+ set_task_cpu(p, valid_task_cpu(p)); -+ resched_task(p); -+ __task_rq_unlock(rq, NULL); -+ } -+} -+#endif -+ -+/** -+ * init_idle - set up an idle thread for a given CPU -+ * @idle: task in question -+ * @cpu: cpu the idle task belongs to -+ * -+ * NOTE: this function does not set the idle thread's NEED_RESCHED -+ * flag, to make booting more robust. -+ */ -+void init_idle(struct task_struct *idle, int cpu) -+{ -+ struct rq *rq = cpu_rq(cpu); -+ unsigned long flags; -+ -+ raw_spin_lock_irqsave(&idle->pi_lock, flags); -+ raw_spin_lock(rq->lock); -+ idle->last_ran = rq->niffies; -+ time_slice_expired(idle, rq); -+ idle->state = TASK_RUNNING; -+ /* Setting prio to illegal value shouldn't matter when never queued */ -+ idle->prio = PRIO_LIMIT; -+ -+ kasan_unpoison_task_stack(idle); -+ -+#ifdef CONFIG_SMP -+ /* -+ * It's possible that init_idle() gets called multiple times on a task, -+ * in that case do_set_cpus_allowed() will not do the right thing. -+ * -+ * And since this is boot we can forgo the serialisation. -+ */ -+ set_cpus_allowed_common(idle, cpumask_of(cpu)); -+#ifdef CONFIG_SMT_NICE -+ idle->smt_bias = 0; -+#endif -+#endif -+ set_rq_task(rq, idle); -+ -+ /* Silence PROVE_RCU */ -+ rcu_read_lock(); -+ set_task_cpu(idle, cpu); -+ rcu_read_unlock(); -+ -+ rq->curr = rq->idle = idle; -+ idle->on_rq = TASK_ON_RQ_QUEUED; -+ raw_spin_unlock(rq->lock); -+ raw_spin_unlock_irqrestore(&idle->pi_lock, flags); -+ -+ /* Set the preempt count _outside_ the spinlocks! */ -+ init_idle_preempt_count(idle, cpu); -+ -+ ftrace_graph_init_idle_task(idle, cpu); -+ vtime_init_idle(idle, cpu); -+#ifdef CONFIG_SMP -+ sprintf(idle->comm, "%s/%d", INIT_TASK_COMM, cpu); -+#endif -+} -+ -+int cpuset_cpumask_can_shrink(const struct cpumask __maybe_unused *cur, -+ const struct cpumask __maybe_unused *trial) -+{ -+ return 1; -+} -+ -+int task_can_attach(struct task_struct *p, -+ const struct cpumask *cs_cpus_allowed) -+{ -+ int ret = 0; -+ -+ /* -+ * Kthreads which disallow setaffinity shouldn't be moved -+ * to a new cpuset; we don't want to change their CPU -+ * affinity and isolating such threads by their set of -+ * allowed nodes is unnecessary. Thus, cpusets are not -+ * applicable for such threads. This prevents checking for -+ * success of set_cpus_allowed_ptr() on all attached tasks -+ * before cpus_allowed may be changed. -+ */ -+ if (p->flags & PF_NO_SETAFFINITY) -+ ret = -EINVAL; -+ -+ return ret; -+} -+ -+void resched_cpu(int cpu) -+{ -+ struct rq *rq = cpu_rq(cpu); -+ struct rq_flags rf; -+ -+ rq_lock_irqsave(rq, &rf); -+ if (cpu_online(cpu) || cpu == smp_processor_id()) -+ resched_curr(rq); -+ rq_unlock_irqrestore(rq, &rf); -+} -+ -+#ifdef CONFIG_SMP -+#ifdef CONFIG_NO_HZ_COMMON -+void nohz_balance_enter_idle(int cpu) -+{ -+} -+ -+void select_nohz_load_balancer(int stop_tick) -+{ -+} -+ -+void set_cpu_sd_state_idle(void) {} -+ -+/* -+ * In the semi idle case, use the nearest busy CPU for migrating timers -+ * from an idle CPU. This is good for power-savings. -+ * -+ * We don't do similar optimization for completely idle system, as -+ * selecting an idle CPU will add more delays to the timers than intended -+ * (as that CPU's timer base may not be uptodate wrt jiffies etc). -+ */ -+int get_nohz_timer_target(void) -+{ -+ int i, cpu = smp_processor_id(); -+ struct sched_domain *sd; -+ -+ if (!idle_cpu(cpu) && housekeeping_cpu(cpu, HK_FLAG_TIMER)) -+ return cpu; -+ -+ rcu_read_lock(); -+ for_each_domain(cpu, sd) { -+ for_each_cpu(i, sched_domain_span(sd)) { -+ if (cpu == i) -+ continue; -+ -+ if (!idle_cpu(i) && housekeeping_cpu(i, HK_FLAG_TIMER)) { -+ cpu = i; -+ cpu = i; -+ goto unlock; -+ } -+ } -+ } -+ -+ if (!housekeeping_cpu(cpu, HK_FLAG_TIMER)) -+ cpu = housekeeping_any_cpu(HK_FLAG_TIMER); -+unlock: -+ rcu_read_unlock(); -+ return cpu; -+} -+ -+/* -+ * When add_timer_on() enqueues a timer into the timer wheel of an -+ * idle CPU then this timer might expire before the next timer event -+ * which is scheduled to wake up that CPU. In case of a completely -+ * idle system the next event might even be infinite time into the -+ * future. wake_up_idle_cpu() ensures that the CPU is woken up and -+ * leaves the inner idle loop so the newly added timer is taken into -+ * account when the CPU goes back to idle and evaluates the timer -+ * wheel for the next timer event. -+ */ -+void wake_up_idle_cpu(int cpu) -+{ -+ if (cpu == smp_processor_id()) -+ return; -+ -+ if (set_nr_and_not_polling(cpu_rq(cpu)->idle)) -+ smp_sched_reschedule(cpu); -+ else -+ trace_sched_wake_idle_without_ipi(cpu); -+} -+ -+static bool wake_up_full_nohz_cpu(int cpu) -+{ -+ /* -+ * We just need the target to call irq_exit() and re-evaluate -+ * the next tick. The nohz full kick at least implies that. -+ * If needed we can still optimize that later with an -+ * empty IRQ. -+ */ -+ if (cpu_is_offline(cpu)) -+ return true; /* Don't try to wake offline CPUs. */ -+ if (tick_nohz_full_cpu(cpu)) { -+ if (cpu != smp_processor_id() || -+ tick_nohz_tick_stopped()) -+ tick_nohz_full_kick_cpu(cpu); -+ return true; -+ } -+ -+ return false; -+} -+ -+/* -+ * Wake up the specified CPU. If the CPU is going offline, it is the -+ * caller's responsibility to deal with the lost wakeup, for example, -+ * by hooking into the CPU_DEAD notifier like timers and hrtimers do. -+ */ -+void wake_up_nohz_cpu(int cpu) -+{ -+ if (!wake_up_full_nohz_cpu(cpu)) -+ wake_up_idle_cpu(cpu); -+} -+#endif /* CONFIG_NO_HZ_COMMON */ -+ -+/* -+ * Change a given task's CPU affinity. Migrate the thread to a -+ * proper CPU and schedule it away if the CPU it's executing on -+ * is removed from the allowed bitmask. -+ * -+ * NOTE: the caller must have a valid reference to the task, the -+ * task must not exit() & deallocate itself prematurely. The -+ * call is not atomic; no spinlocks may be held. -+ */ -+static int __set_cpus_allowed_ptr(struct task_struct *p, -+ const struct cpumask *new_mask, bool check) -+{ -+ const struct cpumask *cpu_valid_mask = cpu_active_mask; -+ bool queued = false, running_wrong = false, kthread; -+ struct cpumask old_mask; -+ struct rq_flags rf; -+ int cpu, ret = 0; -+ struct rq *rq; -+ -+ rq = task_rq_lock(p, &rf); -+ update_rq_clock(rq); -+ -+ kthread = !!(p->flags & PF_KTHREAD); -+ if (kthread) { -+ /* -+ * Kernel threads are allowed on online && !active CPUs -+ */ -+ cpu_valid_mask = cpu_online_mask; -+ } -+ -+ /* -+ * Must re-check here, to close a race against __kthread_bind(), -+ * sched_setaffinity() is not guaranteed to observe the flag. -+ */ -+ if (check && (p->flags & PF_NO_SETAFFINITY)) { -+ ret = -EINVAL; -+ goto out; -+ } -+ -+ cpumask_copy(&old_mask, &p->cpus_allowed); -+ if (cpumask_equal(&old_mask, new_mask)) -+ goto out; -+ -+ if (!cpumask_intersects(new_mask, cpu_valid_mask)) { -+ ret = -EINVAL; -+ goto out; -+ } -+ -+ queued = task_queued(p); -+ __do_set_cpus_allowed(p, new_mask); -+ -+ if (kthread) { -+ /* -+ * For kernel threads that do indeed end up on online && -+ * !active we want to ensure they are strict per-CPU threads. -+ */ -+ WARN_ON(cpumask_intersects(new_mask, cpu_online_mask) && -+ !cpumask_intersects(new_mask, cpu_active_mask) && -+ p->nr_cpus_allowed != 1); -+ } -+ -+ /* Can the task run on the task's current CPU? If so, we're done */ -+ if (cpumask_test_cpu(task_cpu(p), new_mask)) -+ goto out; -+ -+ if (task_running(rq, p)) { -+ /* Task is running on the wrong cpu now, reschedule it. */ -+ if (rq == this_rq()) { -+ cpu = cpumask_any_and(cpu_valid_mask, new_mask); -+ set_task_cpu(p, cpu); -+ set_tsk_need_resched(p); -+ running_wrong = true; -+ } else -+ resched_task(p); -+ } else { -+ cpu = cpumask_any_and(cpu_valid_mask, new_mask); -+ if (queued) { -+ /* -+ * Switch runqueue locks after dequeueing the task -+ * here while still holding the pi_lock to be holding -+ * the correct lock for enqueueing. -+ */ -+ dequeue_task(rq, p, 0); -+ rq_unlock(rq); -+ -+ rq = cpu_rq(cpu); -+ rq_lock(rq); -+ } -+ set_task_cpu(p, cpu); -+ if (queued) -+ enqueue_task(rq, p, 0); -+ } -+ if (queued) -+ try_preempt(p, rq); -+ if (running_wrong) -+ preempt_disable(); -+out: -+ task_rq_unlock(rq, p, &rf); -+ -+ if (running_wrong) { -+ __schedule(true); -+ preempt_enable(); -+ } -+ -+ return ret; -+} -+ -+int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask) -+{ -+ return __set_cpus_allowed_ptr(p, new_mask, false); -+} -+EXPORT_SYMBOL_GPL(set_cpus_allowed_ptr); -+ -+#ifdef CONFIG_HOTPLUG_CPU -+/* -+ * Run through task list and find tasks affined to the dead cpu, then remove -+ * that cpu from the list, enable cpu0 and set the zerobound flag. Must hold -+ * cpu 0 and src_cpu's runqueue locks. -+ */ -+static void bind_zero(int src_cpu) -+{ -+ struct task_struct *p, *t; -+ struct rq *rq0; -+ int bound = 0; -+ -+ if (src_cpu == 0) -+ return; -+ -+ rq0 = cpu_rq(0); -+ -+ do_each_thread(t, p) { -+ if (cpumask_test_cpu(src_cpu, &p->cpus_allowed)) { -+ bool local = (task_cpu(p) == src_cpu); -+ struct rq *rq = task_rq(p); -+ -+ /* task_running is the cpu stopper thread */ -+ if (local && task_running(rq, p)) -+ continue; -+ atomic_clear_cpu(src_cpu, &p->cpus_allowed); -+ atomic_set_cpu(0, &p->cpus_allowed); -+ p->zerobound = true; -+ bound++; -+ if (local) { -+ bool queued = task_queued(p); -+ -+ if (queued) -+ dequeue_task(rq, p, 0); -+ set_task_cpu(p, 0); -+ if (queued) -+ enqueue_task(rq0, p, 0); -+ } -+ } -+ } while_each_thread(t, p); -+ -+ if (bound) { -+ printk(KERN_INFO "Removed affinity for %d processes to cpu %d\n", -+ bound, src_cpu); -+ } -+} -+ -+/* Find processes with the zerobound flag and reenable their affinity for the -+ * CPU coming alive. */ -+static void unbind_zero(int src_cpu) -+{ -+ int unbound = 0, zerobound = 0; -+ struct task_struct *p, *t; -+ -+ if (src_cpu == 0) -+ return; -+ -+ do_each_thread(t, p) { -+ if (!p->mm) -+ p->zerobound = false; -+ if (p->zerobound) { -+ unbound++; -+ cpumask_set_cpu(src_cpu, &p->cpus_allowed); -+ /* Once every CPU affinity has been re-enabled, remove -+ * the zerobound flag */ -+ if (cpumask_subset(cpu_possible_mask, &p->cpus_allowed)) { -+ p->zerobound = false; -+ zerobound++; -+ } -+ } -+ } while_each_thread(t, p); -+ -+ if (unbound) { -+ printk(KERN_INFO "Added affinity for %d processes to cpu %d\n", -+ unbound, src_cpu); -+ } -+ if (zerobound) { -+ printk(KERN_INFO "Released forced binding to cpu0 for %d processes\n", -+ zerobound); -+ } -+} -+ -+/* -+ * Ensure that the idle task is using init_mm right before its cpu goes -+ * offline. -+ */ -+void idle_task_exit(void) -+{ -+ struct mm_struct *mm = current->active_mm; -+ -+ BUG_ON(cpu_online(smp_processor_id())); -+ -+ if (mm != &init_mm) { -+ switch_mm(mm, &init_mm, current); -+ current->active_mm = &init_mm; -+ finish_arch_post_lock_switch(); -+ } -+ mmdrop(mm); -+} -+#else /* CONFIG_HOTPLUG_CPU */ -+static void unbind_zero(int src_cpu) {} -+#endif /* CONFIG_HOTPLUG_CPU */ -+ -+void sched_set_stop_task(int cpu, struct task_struct *stop) -+{ -+ struct sched_param stop_param = { .sched_priority = STOP_PRIO }; -+ struct sched_param start_param = { .sched_priority = 0 }; -+ struct task_struct *old_stop = cpu_rq(cpu)->stop; -+ -+ if (stop) { -+ /* -+ * Make it appear like a SCHED_FIFO task, its something -+ * userspace knows about and won't get confused about. -+ * -+ * Also, it will make PI more or less work without too -+ * much confusion -- but then, stop work should not -+ * rely on PI working anyway. -+ */ -+ sched_setscheduler_nocheck(stop, SCHED_FIFO, &stop_param); -+ } -+ -+ cpu_rq(cpu)->stop = stop; -+ -+ if (old_stop) { -+ /* -+ * Reset it back to a normal scheduling policy so that -+ * it can die in pieces. -+ */ -+ sched_setscheduler_nocheck(old_stop, SCHED_NORMAL, &start_param); -+ } -+} -+ -+#if defined(CONFIG_SCHED_DEBUG) && defined(CONFIG_SYSCTL) -+ -+static struct ctl_table sd_ctl_dir[] = { -+ { -+ .procname = "sched_domain", -+ .mode = 0555, -+ }, -+ {} -+}; -+ -+static struct ctl_table sd_ctl_root[] = { -+ { -+ .procname = "kernel", -+ .mode = 0555, -+ .child = sd_ctl_dir, -+ }, -+ {} -+}; -+ -+static struct ctl_table *sd_alloc_ctl_entry(int n) -+{ -+ struct ctl_table *entry = -+ kcalloc(n, sizeof(struct ctl_table), GFP_KERNEL); -+ -+ return entry; -+} -+ -+static void sd_free_ctl_entry(struct ctl_table **tablep) -+{ -+ struct ctl_table *entry; -+ -+ /* -+ * In the intermediate directories, both the child directory and -+ * procname are dynamically allocated and could fail but the mode -+ * will always be set. In the lowest directory the names are -+ * static strings and all have proc handlers. -+ */ -+ for (entry = *tablep; entry->mode; entry++) { -+ if (entry->child) -+ sd_free_ctl_entry(&entry->child); -+ if (entry->proc_handler == NULL) -+ kfree(entry->procname); -+ } -+ -+ kfree(*tablep); -+ *tablep = NULL; -+} -+ -+#define CPU_LOAD_IDX_MAX 5 -+static int min_load_idx = 0; -+static int max_load_idx = CPU_LOAD_IDX_MAX-1; -+ -+static void -+set_table_entry(struct ctl_table *entry, -+ const char *procname, void *data, int maxlen, -+ umode_t mode, proc_handler *proc_handler, -+ bool load_idx) -+{ -+ entry->procname = procname; -+ entry->data = data; -+ entry->maxlen = maxlen; -+ entry->mode = mode; -+ entry->proc_handler = proc_handler; -+ -+ if (load_idx) { -+ entry->extra1 = &min_load_idx; -+ entry->extra2 = &max_load_idx; -+ } -+} -+ -+static struct ctl_table * -+sd_alloc_ctl_domain_table(struct sched_domain *sd) -+{ -+ struct ctl_table *table = sd_alloc_ctl_entry(14); -+ -+ if (table == NULL) -+ return NULL; -+ -+ set_table_entry(&table[0], "min_interval", &sd->min_interval, -+ sizeof(long), 0644, proc_doulongvec_minmax, false); -+ set_table_entry(&table[1], "max_interval", &sd->max_interval, -+ sizeof(long), 0644, proc_doulongvec_minmax, false); -+ set_table_entry(&table[2], "busy_idx", &sd->busy_idx, -+ sizeof(int), 0644, proc_dointvec_minmax, true); -+ set_table_entry(&table[3], "idle_idx", &sd->idle_idx, -+ sizeof(int), 0644, proc_dointvec_minmax, true); -+ set_table_entry(&table[4], "newidle_idx", &sd->newidle_idx, -+ sizeof(int), 0644, proc_dointvec_minmax, true); -+ set_table_entry(&table[5], "wake_idx", &sd->wake_idx, -+ sizeof(int), 0644, proc_dointvec_minmax, true); -+ set_table_entry(&table[6], "forkexec_idx", &sd->forkexec_idx, -+ sizeof(int), 0644, proc_dointvec_minmax, true); -+ set_table_entry(&table[7], "busy_factor", &sd->busy_factor, -+ sizeof(int), 0644, proc_dointvec_minmax, false); -+ set_table_entry(&table[8], "imbalance_pct", &sd->imbalance_pct, -+ sizeof(int), 0644, proc_dointvec_minmax, false); -+ set_table_entry(&table[9], "cache_nice_tries", -+ &sd->cache_nice_tries, -+ sizeof(int), 0644, proc_dointvec_minmax, false); -+ set_table_entry(&table[10], "flags", &sd->flags, -+ sizeof(int), 0644, proc_dointvec_minmax, false); -+ set_table_entry(&table[11], "max_newidle_lb_cost", -+ &sd->max_newidle_lb_cost, -+ sizeof(long), 0644, proc_doulongvec_minmax, false); -+ set_table_entry(&table[12], "name", sd->name, -+ CORENAME_MAX_SIZE, 0444, proc_dostring, false); -+ /* &table[13] is terminator */ -+ -+ return table; -+} -+ -+static struct ctl_table *sd_alloc_ctl_cpu_table(int cpu) -+{ -+ struct ctl_table *entry, *table; -+ struct sched_domain *sd; -+ int domain_num = 0, i; -+ char buf[32]; -+ -+ for_each_domain(cpu, sd) -+ domain_num++; -+ entry = table = sd_alloc_ctl_entry(domain_num + 1); -+ if (table == NULL) -+ return NULL; -+ -+ i = 0; -+ for_each_domain(cpu, sd) { -+ snprintf(buf, 32, "domain%d", i); -+ entry->procname = kstrdup(buf, GFP_KERNEL); -+ entry->mode = 0555; -+ entry->child = sd_alloc_ctl_domain_table(sd); -+ entry++; -+ i++; -+ } -+ return table; -+} -+ -+static cpumask_var_t sd_sysctl_cpus; -+static struct ctl_table_header *sd_sysctl_header; -+ -+void register_sched_domain_sysctl(void) -+{ -+ static struct ctl_table *cpu_entries; -+ static struct ctl_table **cpu_idx; -+ char buf[32]; -+ int i; -+ -+ if (!cpu_entries) { -+ cpu_entries = sd_alloc_ctl_entry(num_possible_cpus() + 1); -+ if (!cpu_entries) -+ return; -+ -+ WARN_ON(sd_ctl_dir[0].child); -+ sd_ctl_dir[0].child = cpu_entries; -+ } -+ -+ if (!cpu_idx) { -+ struct ctl_table *e = cpu_entries; -+ -+ cpu_idx = kcalloc(nr_cpu_ids, sizeof(struct ctl_table*), GFP_KERNEL); -+ if (!cpu_idx) -+ return; -+ -+ /* deal with sparse possible map */ -+ for_each_possible_cpu(i) { -+ cpu_idx[i] = e; -+ e++; -+ } -+ } -+ -+ if (!cpumask_available(sd_sysctl_cpus)) { -+ if (!alloc_cpumask_var(&sd_sysctl_cpus, GFP_KERNEL)) -+ return; -+ -+ /* init to possible to not have holes in @cpu_entries */ -+ cpumask_copy(sd_sysctl_cpus, cpu_possible_mask); -+ } -+ -+ for_each_cpu(i, sd_sysctl_cpus) { -+ struct ctl_table *e = cpu_idx[i]; -+ -+ if (e->child) -+ sd_free_ctl_entry(&e->child); -+ -+ if (!e->procname) { -+ snprintf(buf, 32, "cpu%d", i); -+ e->procname = kstrdup(buf, GFP_KERNEL); -+ } -+ e->mode = 0555; -+ e->child = sd_alloc_ctl_cpu_table(i); -+ -+ __cpumask_clear_cpu(i, sd_sysctl_cpus); -+ } -+ -+ WARN_ON(sd_sysctl_header); -+ sd_sysctl_header = register_sysctl_table(sd_ctl_root); -+} -+ -+void dirty_sched_domain_sysctl(int cpu) -+{ -+ if (cpumask_available(sd_sysctl_cpus)) -+ __cpumask_set_cpu(cpu, sd_sysctl_cpus); -+} -+ -+/* may be called multiple times per register */ -+void unregister_sched_domain_sysctl(void) -+{ -+ unregister_sysctl_table(sd_sysctl_header); -+ sd_sysctl_header = NULL; -+} -+#endif /* CONFIG_SYSCTL */ -+ -+void set_rq_online(struct rq *rq) -+{ -+ if (!rq->online) { -+ cpumask_set_cpu(cpu_of(rq), rq->rd->online); -+ rq->online = true; -+ } -+} -+ -+void set_rq_offline(struct rq *rq) -+{ -+ if (rq->online) { -+ int cpu = cpu_of(rq); -+ -+ cpumask_clear_cpu(cpu, rq->rd->online); -+ rq->online = false; -+ clear_cpuidle_map(cpu); -+ } -+} -+ -+/* -+ * used to mark begin/end of suspend/resume: -+ */ -+static int num_cpus_frozen; -+ -+/* -+ * Update cpusets according to cpu_active mask. If cpusets are -+ * disabled, cpuset_update_active_cpus() becomes a simple wrapper -+ * around partition_sched_domains(). -+ * -+ * If we come here as part of a suspend/resume, don't touch cpusets because we -+ * want to restore it back to its original state upon resume anyway. -+ */ -+static void cpuset_cpu_active(void) -+{ -+ if (cpuhp_tasks_frozen) { -+ /* -+ * num_cpus_frozen tracks how many CPUs are involved in suspend -+ * resume sequence. As long as this is not the last online -+ * operation in the resume sequence, just build a single sched -+ * domain, ignoring cpusets. -+ */ -+ partition_sched_domains(1, NULL, NULL); -+ if (--num_cpus_frozen) -+ return; -+ /* -+ * This is the last CPU online operation. So fall through and -+ * restore the original sched domains by considering the -+ * cpuset configurations. -+ */ -+ cpuset_force_rebuild(); -+ } -+ -+ cpuset_update_active_cpus(); -+} -+ -+static int cpuset_cpu_inactive(unsigned int cpu) -+{ -+ if (!cpuhp_tasks_frozen) { -+ cpuset_update_active_cpus(); -+ } else { -+ num_cpus_frozen++; -+ partition_sched_domains(1, NULL, NULL); -+ } -+ return 0; -+} -+ -+int sched_cpu_activate(unsigned int cpu) -+{ -+ struct rq *rq = cpu_rq(cpu); -+ struct rq_flags rf; -+ -+ set_cpu_active(cpu, true); -+ -+ if (sched_smp_initialized) { -+ sched_domains_numa_masks_set(cpu); -+ cpuset_cpu_active(); -+ } -+ -+ /* -+ * Put the rq online, if not already. This happens: -+ * -+ * 1) In the early boot process, because we build the real domains -+ * after all CPUs have been brought up. -+ * -+ * 2) At runtime, if cpuset_cpu_active() fails to rebuild the -+ * domains. -+ */ -+ rq_lock_irqsave(rq, &rf); -+ if (rq->rd) { -+ BUG_ON(!cpumask_test_cpu(cpu, rq->rd->span)); -+ set_rq_online(rq); -+ } -+ unbind_zero(cpu); -+ rq_unlock_irqrestore(rq, &rf); -+ -+ return 0; -+} -+ -+int sched_cpu_deactivate(unsigned int cpu) -+{ -+ int ret; -+ -+ set_cpu_active(cpu, false); -+ /* -+ * We've cleared cpu_active_mask, wait for all preempt-disabled and RCU -+ * users of this state to go away such that all new such users will -+ * observe it. -+ * -+ * Do sync before park smpboot threads to take care the rcu boost case. -+ */ -+ synchronize_rcu(); -+ -+ if (!sched_smp_initialized) -+ return 0; -+ -+ ret = cpuset_cpu_inactive(cpu); -+ if (ret) { -+ set_cpu_active(cpu, true); -+ return ret; -+ } -+ sched_domains_numa_masks_clear(cpu); -+ return 0; -+} -+ -+int sched_cpu_starting(unsigned int cpu) -+{ -+ sched_tick_start(cpu); -+ return 0; -+} -+ -+#ifdef CONFIG_HOTPLUG_CPU -+int sched_cpu_dying(unsigned int cpu) -+{ -+ struct rq *rq = cpu_rq(cpu); -+ unsigned long flags; -+ -+ /* Handle pending wakeups and then migrate everything off */ -+ sched_ttwu_pending(); -+ sched_tick_stop(cpu); -+ -+ local_irq_save(flags); -+ double_rq_lock(rq, cpu_rq(0)); -+ if (rq->rd) { -+ BUG_ON(!cpumask_test_cpu(cpu, rq->rd->span)); -+ set_rq_offline(rq); -+ } -+ bind_zero(cpu); -+ double_rq_unlock(rq, cpu_rq(0)); -+ sched_start_tick(rq, cpu); -+ hrexpiry_clear(rq); -+ local_irq_restore(flags); -+ -+ return 0; -+} -+#endif -+ -+#if defined(CONFIG_SCHED_SMT) || defined(CONFIG_SCHED_MC) -+/* -+ * Cheaper version of the below functions in case support for SMT and MC is -+ * compiled in but CPUs have no siblings. -+ */ -+static bool sole_cpu_idle(struct rq *rq) -+{ -+ return rq_idle(rq); -+} -+#endif -+#ifdef CONFIG_SCHED_SMT -+static const cpumask_t *thread_cpumask(int cpu) -+{ -+ return topology_sibling_cpumask(cpu); -+} -+/* All this CPU's SMT siblings are idle */ -+static bool siblings_cpu_idle(struct rq *rq) -+{ -+ return cpumask_subset(&rq->thread_mask, &cpu_idle_map); -+} -+#endif -+#ifdef CONFIG_SCHED_MC -+static const cpumask_t *core_cpumask(int cpu) -+{ -+ return topology_core_cpumask(cpu); -+} -+/* All this CPU's shared cache siblings are idle */ -+static bool cache_cpu_idle(struct rq *rq) -+{ -+ return cpumask_subset(&rq->core_mask, &cpu_idle_map); -+} -+#endif -+ -+enum sched_domain_level { -+ SD_LV_NONE = 0, -+ SD_LV_SIBLING, -+ SD_LV_MC, -+ SD_LV_BOOK, -+ SD_LV_CPU, -+ SD_LV_NODE, -+ SD_LV_ALLNODES, -+ SD_LV_MAX -+}; -+ -+void __init sched_init_smp(void) -+{ -+ struct rq *rq, *other_rq, *leader = cpu_rq(0); -+ struct sched_domain *sd; -+ int cpu, other_cpu, i; -+#ifdef CONFIG_SCHED_SMT -+ bool smt_threads = false; -+#endif -+ sched_init_numa(); -+ -+ /* -+ * There's no userspace yet to cause hotplug operations; hence all the -+ * cpu masks are stable and all blatant races in the below code cannot -+ * happen. -+ */ -+ mutex_lock(&sched_domains_mutex); -+ sched_init_domains(cpu_active_mask); -+ mutex_unlock(&sched_domains_mutex); -+ -+ /* Move init over to a non-isolated CPU */ -+ if (set_cpus_allowed_ptr(current, housekeeping_cpumask(HK_FLAG_DOMAIN)) < 0) -+ BUG(); -+ -+ local_irq_disable(); -+ mutex_lock(&sched_domains_mutex); -+ lock_all_rqs(); -+ /* -+ * Set up the relative cache distance of each online cpu from each -+ * other in a simple array for quick lookup. Locality is determined -+ * by the closest sched_domain that CPUs are separated by. CPUs with -+ * shared cache in SMT and MC are treated as local. Separate CPUs -+ * (within the same package or physically) within the same node are -+ * treated as not local. CPUs not even in the same domain (different -+ * nodes) are treated as very distant. -+ */ -+ for_each_online_cpu(cpu) { -+ rq = cpu_rq(cpu); -+ -+ /* First check if this cpu is in the same node */ -+ for_each_domain(cpu, sd) { -+ if (sd->level > SD_LV_MC) -+ continue; -+ if (rqshare != RQSHARE_ALL) -+ leader = NULL; -+ /* Set locality to local node if not already found lower */ -+ for_each_cpu(other_cpu, sched_domain_span(sd)) { -+ if (rqshare >= RQSHARE_SMP) { -+ other_rq = cpu_rq(other_cpu); -+ -+ /* Set the smp_leader to the first CPU */ -+ if (!leader) -+ leader = rq; -+ other_rq->smp_leader = leader; -+ } -+ -+ if (rq->cpu_locality[other_cpu] > 3) -+ rq->cpu_locality[other_cpu] = 3; -+ } -+ } -+ -+ /* -+ * Each runqueue has its own function in case it doesn't have -+ * siblings of its own allowing mixed topologies. -+ */ -+#ifdef CONFIG_SCHED_MC -+ leader = NULL; -+ if (cpumask_weight(core_cpumask(cpu)) > 1) { -+ cpumask_copy(&rq->core_mask, core_cpumask(cpu)); -+ cpumask_clear_cpu(cpu, &rq->core_mask); -+ for_each_cpu(other_cpu, core_cpumask(cpu)) { -+ if (rqshare == RQSHARE_MC) { -+ other_rq = cpu_rq(other_cpu); -+ -+ /* Set the mc_leader to the first CPU */ -+ if (!leader) -+ leader = rq; -+ other_rq->mc_leader = leader; -+ } -+ if (rq->cpu_locality[other_cpu] > 2) -+ rq->cpu_locality[other_cpu] = 2; -+ } -+ rq->cache_idle = cache_cpu_idle; -+ } -+#endif -+#ifdef CONFIG_SCHED_SMT -+ leader = NULL; -+ if (cpumask_weight(thread_cpumask(cpu)) > 1) { -+ cpumask_copy(&rq->thread_mask, thread_cpumask(cpu)); -+ cpumask_clear_cpu(cpu, &rq->thread_mask); -+ for_each_cpu(other_cpu, thread_cpumask(cpu)) { -+ if (rqshare == RQSHARE_SMT) { -+ other_rq = cpu_rq(other_cpu); -+ -+ /* Set the smt_leader to the first CPU */ -+ if (!leader) -+ leader = rq; -+ other_rq->smt_leader = leader; -+ } -+ if (rq->cpu_locality[other_cpu] > 1) -+ rq->cpu_locality[other_cpu] = 1; -+ } -+ rq->siblings_idle = siblings_cpu_idle; -+ smt_threads = true; -+ } -+#endif -+ } -+ -+#ifdef CONFIG_SMT_NICE -+ if (smt_threads) { -+ check_siblings = &check_smt_siblings; -+ wake_siblings = &wake_smt_siblings; -+ smt_schedule = &smt_should_schedule; -+ } -+#endif -+ unlock_all_rqs(); -+ mutex_unlock(&sched_domains_mutex); -+ -+ for_each_online_cpu(cpu) { -+ rq = cpu_rq(cpu); -+ -+ for_each_online_cpu(other_cpu) { -+ if (other_cpu <= cpu) -+ continue; -+ printk(KERN_DEBUG "MuQSS locality CPU %d to %d: %d\n", cpu, other_cpu, rq->cpu_locality[other_cpu]); -+ } -+ } -+ -+ for_each_online_cpu(cpu) { -+ rq = cpu_rq(cpu); -+ leader = rq->smp_leader; -+ -+ rq_lock(rq); -+ if (leader && rq != leader) { -+ printk(KERN_INFO "Sharing SMP runqueue from CPU %d to CPU %d\n", -+ leader->cpu, rq->cpu); -+ kfree(rq->node); -+ kfree(rq->sl); -+ kfree(rq->lock); -+ rq->node = leader->node; -+ rq->sl = leader->sl; -+ rq->lock = leader->lock; -+ barrier(); -+ /* To make up for not unlocking the freed runlock */ -+ preempt_enable(); -+ } else -+ rq_unlock(rq); -+ } -+ -+#ifdef CONFIG_SCHED_MC -+ for_each_online_cpu(cpu) { -+ rq = cpu_rq(cpu); -+ leader = rq->mc_leader; -+ -+ rq_lock(rq); -+ if (leader && rq != leader) { -+ printk(KERN_INFO "Sharing MC runqueue from CPU %d to CPU %d\n", -+ leader->cpu, rq->cpu); -+ kfree(rq->node); -+ kfree(rq->sl); -+ kfree(rq->lock); -+ rq->node = leader->node; -+ rq->sl = leader->sl; -+ rq->lock = leader->lock; -+ barrier(); -+ /* To make up for not unlocking the freed runlock */ -+ preempt_enable(); -+ } else -+ rq_unlock(rq); -+ } -+#endif /* CONFIG_SCHED_MC */ -+ -+#ifdef CONFIG_SCHED_SMT -+ for_each_online_cpu(cpu) { -+ rq = cpu_rq(cpu); -+ -+ leader = rq->smt_leader; -+ -+ rq_lock(rq); -+ if (leader && rq != leader) { -+ printk(KERN_INFO "Sharing SMT runqueue from CPU %d to CPU %d\n", -+ leader->cpu, rq->cpu); -+ kfree(rq->node); -+ kfree(rq->sl); -+ kfree(rq->lock); -+ rq->node = leader->node; -+ rq->sl = leader->sl; -+ rq->lock = leader->lock; -+ barrier(); -+ /* To make up for not unlocking the freed runlock */ -+ preempt_enable(); -+ } else -+ rq_unlock(rq); -+ } -+#endif /* CONFIG_SCHED_SMT */ -+ -+ local_irq_enable(); -+ -+ total_runqueues = 0; -+ for_each_possible_cpu(cpu) { -+ int locality, total_rqs = 0, total_cpus = 0; -+ -+ rq = cpu_rq(cpu); -+ if ( -+#ifdef CONFIG_SCHED_MC -+ (rq->mc_leader == rq) && -+#endif -+#ifdef CONFIG_SCHED_SMT -+ (rq->smt_leader == rq) && -+#endif -+ (rq->smp_leader == rq)) -+ total_runqueues++; -+ -+ for (locality = 0; locality <= 4; locality++) { -+ int test_cpu; -+ -+ for_each_possible_cpu(test_cpu) { -+ /* Work from each CPU up instead of every rq -+ * starting at CPU 0. Orders are better matched -+ * if the top half CPUs count down instead. */ -+ if (cpu < num_possible_cpus() / 2) -+ other_cpu = cpu + test_cpu; -+ else -+ other_cpu = cpu - test_cpu; -+ if (other_cpu < 0) -+ other_cpu += num_possible_cpus(); -+ else -+ other_cpu %= num_possible_cpus(); -+ other_rq = cpu_rq(other_cpu); -+ -+ if (rq->cpu_locality[other_cpu] == locality) { -+ rq->cpu_order[total_cpus++] = other_rq; -+ if ( -+ -+#ifdef CONFIG_SCHED_MC -+ (other_rq->mc_leader == other_rq) && -+#endif -+#ifdef CONFIG_SCHED_SMT -+ (other_rq->smt_leader == other_rq) && -+#endif -+ (other_rq->smp_leader == other_rq)) -+ rq->rq_order[total_rqs++] = other_rq; -+ } -+ } -+ } -+ } -+ -+ for_each_possible_cpu(cpu) { -+ rq = cpu_rq(cpu); -+ for (i = 0; i < total_runqueues; i++) { -+ printk(KERN_DEBUG "CPU %d RQ order %d RQ %d\n", cpu, i, -+ rq->rq_order[i]->cpu); -+ } -+ } -+ for_each_possible_cpu(cpu) { -+ rq = cpu_rq(cpu); -+ for (i = 0; i < num_possible_cpus(); i++) { -+ printk(KERN_DEBUG "CPU %d CPU order %d RQ %d\n", cpu, i, -+ rq->cpu_order[i]->cpu); -+ } -+ } -+ switch (rqshare) { -+ case RQSHARE_ALL: -+ /* This should only ever read 1 */ -+ printk(KERN_INFO "MuQSS runqueue share type ALL total runqueues: %d\n", -+ total_runqueues); -+ break; -+ case RQSHARE_SMP: -+ printk(KERN_INFO "MuQSS runqueue share type SMP total runqueues: %d\n", -+ total_runqueues); -+ break; -+ case RQSHARE_MC: -+ printk(KERN_INFO "MuQSS runqueue share type MC total runqueues: %d\n", -+ total_runqueues); -+ break; -+ case RQSHARE_SMT: -+ printk(KERN_INFO "MuQSS runqueue share type SMT total runqueues: %d\n", -+ total_runqueues); -+ break; -+ case RQSHARE_NONE: -+ printk(KERN_INFO "MuQSS runqueue share type NONE total runqueues: %d\n", -+ total_runqueues); -+ break; -+ } -+ -+ sched_smp_initialized = true; -+} -+#else -+void __init sched_init_smp(void) -+{ -+ sched_smp_initialized = true; -+} -+#endif /* CONFIG_SMP */ -+ -+int in_sched_functions(unsigned long addr) -+{ -+ return in_lock_functions(addr) || -+ (addr >= (unsigned long)__sched_text_start -+ && addr < (unsigned long)__sched_text_end); -+} -+ -+#ifdef CONFIG_CGROUP_SCHED -+/* task group related information */ -+struct task_group { -+ struct cgroup_subsys_state css; -+ -+ struct rcu_head rcu; -+ struct list_head list; -+ -+ struct task_group *parent; -+ struct list_head siblings; -+ struct list_head children; -+}; -+ -+/* -+ * Default task group. -+ * Every task in system belongs to this group at bootup. -+ */ -+struct task_group root_task_group; -+LIST_HEAD(task_groups); -+ -+/* Cacheline aligned slab cache for task_group */ -+static struct kmem_cache *task_group_cache __read_mostly; -+#endif /* CONFIG_CGROUP_SCHED */ -+ -+void __init sched_init(void) -+{ -+#ifdef CONFIG_SMP -+ int cpu_ids; -+#endif -+ int i; -+ struct rq *rq; -+ -+ wait_bit_init(); -+ -+ prio_ratios[0] = 128; -+ for (i = 1 ; i < NICE_WIDTH ; i++) -+ prio_ratios[i] = prio_ratios[i - 1] * 11 / 10; -+ -+ skiplist_node_init(&init_task.node); -+ -+#ifdef CONFIG_SMP -+ init_defrootdomain(); -+ cpumask_clear(&cpu_idle_map); -+#else -+ uprq = &per_cpu(runqueues, 0); -+#endif -+ -+#ifdef CONFIG_CGROUP_SCHED -+ task_group_cache = KMEM_CACHE(task_group, 0); -+ -+ list_add(&root_task_group.list, &task_groups); -+ INIT_LIST_HEAD(&root_task_group.children); -+ INIT_LIST_HEAD(&root_task_group.siblings); -+#endif /* CONFIG_CGROUP_SCHED */ -+ for_each_possible_cpu(i) { -+ rq = cpu_rq(i); -+ rq->node = kmalloc(sizeof(skiplist_node), GFP_ATOMIC); -+ skiplist_init(rq->node); -+ rq->sl = new_skiplist(rq->node); -+ rq->lock = kmalloc(sizeof(raw_spinlock_t), GFP_ATOMIC); -+ raw_spin_lock_init(rq->lock); -+ rq->nr_running = 0; -+ rq->nr_uninterruptible = 0; -+ rq->nr_switches = 0; -+ rq->clock = rq->old_clock = rq->last_niffy = rq->niffies = 0; -+ rq->last_jiffy = jiffies; -+ rq->user_ns = rq->nice_ns = rq->softirq_ns = rq->system_ns = -+ rq->iowait_ns = rq->idle_ns = 0; -+ rq->dither = 0; -+ set_rq_task(rq, &init_task); -+ rq->iso_ticks = 0; -+ rq->iso_refractory = false; -+#ifdef CONFIG_SMP -+ rq->smp_leader = rq; -+#ifdef CONFIG_SCHED_MC -+ rq->mc_leader = rq; -+#endif -+#ifdef CONFIG_SCHED_SMT -+ rq->smt_leader = rq; -+#endif -+ rq->sd = NULL; -+ rq->rd = NULL; -+ rq->online = false; -+ rq->cpu = i; -+ rq_attach_root(rq, &def_root_domain); -+#endif -+ init_rq_hrexpiry(rq); -+ atomic_set(&rq->nr_iowait, 0); -+ } -+ -+#ifdef CONFIG_SMP -+ cpu_ids = i; -+ /* -+ * Set the base locality for cpu cache distance calculation to -+ * "distant" (3). Make sure the distance from a CPU to itself is 0. -+ */ -+ for_each_possible_cpu(i) { -+ int j; -+ -+ rq = cpu_rq(i); -+#ifdef CONFIG_SCHED_SMT -+ rq->siblings_idle = sole_cpu_idle; -+#endif -+#ifdef CONFIG_SCHED_MC -+ rq->cache_idle = sole_cpu_idle; -+#endif -+ rq->cpu_locality = kmalloc(cpu_ids * sizeof(int *), GFP_ATOMIC); -+ for_each_possible_cpu(j) { -+ if (i == j) -+ rq->cpu_locality[j] = 0; -+ else -+ rq->cpu_locality[j] = 4; -+ } -+ rq->rq_order = kmalloc(cpu_ids * sizeof(struct rq *), GFP_ATOMIC); -+ rq->cpu_order = kmalloc(cpu_ids * sizeof(struct rq *), GFP_ATOMIC); -+ rq->rq_order[0] = rq->cpu_order[0] = rq; -+ for (j = 1; j < cpu_ids; j++) -+ rq->rq_order[j] = rq->cpu_order[j] = cpu_rq(j); -+ } -+#endif -+ -+ /* -+ * The boot idle thread does lazy MMU switching as well: -+ */ -+ mmgrab(&init_mm); -+ enter_lazy_tlb(&init_mm, current); -+ -+ /* -+ * Make us the idle thread. Technically, schedule() should not be -+ * called from this thread, however somewhere below it might be, -+ * but because we are the idle thread, we just pick up running again -+ * when this runqueue becomes "idle". -+ */ -+ init_idle(current, smp_processor_id()); -+ -+#ifdef CONFIG_SMP -+ idle_thread_set_boot_cpu(); -+#endif /* SMP */ -+ -+ init_schedstats(); -+ -+ psi_init(); -+} -+ -+#ifdef CONFIG_DEBUG_ATOMIC_SLEEP -+static inline int preempt_count_equals(int preempt_offset) -+{ -+ int nested = preempt_count() + rcu_preempt_depth(); -+ -+ return (nested == preempt_offset); -+} -+ -+void __might_sleep(const char *file, int line, int preempt_offset) -+{ -+ /* -+ * Blocking primitives will set (and therefore destroy) current->state, -+ * since we will exit with TASK_RUNNING make sure we enter with it, -+ * otherwise we will destroy state. -+ */ -+ WARN_ONCE(current->state != TASK_RUNNING && current->task_state_change, -+ "do not call blocking ops when !TASK_RUNNING; " -+ "state=%lx set at [<%p>] %pS\n", -+ current->state, -+ (void *)current->task_state_change, -+ (void *)current->task_state_change); -+ -+ ___might_sleep(file, line, preempt_offset); -+} -+EXPORT_SYMBOL(__might_sleep); -+ -+void __cant_sleep(const char *file, int line, int preempt_offset) -+{ -+ static unsigned long prev_jiffy; -+ -+ if (irqs_disabled()) -+ return; -+ -+ if (!IS_ENABLED(CONFIG_PREEMPT_COUNT)) -+ return; -+ -+ if (preempt_count() > preempt_offset) -+ return; -+ -+ if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy) -+ return; -+ prev_jiffy = jiffies; -+ -+ printk(KERN_ERR "BUG: assuming atomic context at %s:%d\n", file, line); -+ printk(KERN_ERR "in_atomic(): %d, irqs_disabled(): %d, pid: %d, name: %s\n", -+ in_atomic(), irqs_disabled(), -+ current->pid, current->comm); -+ -+ debug_show_held_locks(current); -+ dump_stack(); -+ add_taint(TAINT_WARN, LOCKDEP_STILL_OK); -+} -+EXPORT_SYMBOL_GPL(__cant_sleep); -+ -+void ___might_sleep(const char *file, int line, int preempt_offset) -+{ -+ /* Ratelimiting timestamp: */ -+ static unsigned long prev_jiffy; -+ -+ unsigned long preempt_disable_ip; -+ -+ /* WARN_ON_ONCE() by default, no rate limit required: */ -+ rcu_sleep_check(); -+ -+ if ((preempt_count_equals(preempt_offset) && !irqs_disabled() && -+ !is_idle_task(current)) || -+ system_state == SYSTEM_BOOTING || system_state > SYSTEM_RUNNING || -+ oops_in_progress) -+ return; -+ -+ if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy) -+ return; -+ prev_jiffy = jiffies; -+ -+ /* Save this before calling printk(), since that will clobber it: */ -+ preempt_disable_ip = get_preempt_disable_ip(current); -+ -+ printk(KERN_ERR -+ "BUG: sleeping function called from invalid context at %s:%d\n", -+ file, line); -+ printk(KERN_ERR -+ "in_atomic(): %d, irqs_disabled(): %d, pid: %d, name: %s\n", -+ in_atomic(), irqs_disabled(), -+ current->pid, current->comm); -+ -+ if (task_stack_end_corrupted(current)) -+ printk(KERN_EMERG "Thread overran stack, or stack corrupted\n"); -+ -+ debug_show_held_locks(current); -+ if (irqs_disabled()) -+ print_irqtrace_events(current); -+ if (IS_ENABLED(CONFIG_DEBUG_PREEMPT) -+ && !preempt_count_equals(preempt_offset)) { -+ pr_err("Preemption disabled at:"); -+ print_ip_sym(preempt_disable_ip); -+ pr_cont("\n"); -+ } -+ dump_stack(); -+ add_taint(TAINT_WARN, LOCKDEP_STILL_OK); -+} -+EXPORT_SYMBOL(___might_sleep); -+#endif -+ -+#ifdef CONFIG_MAGIC_SYSRQ -+static inline void normalise_rt_tasks(void) -+{ -+ struct task_struct *g, *p; -+ struct rq_flags rf; -+ struct rq *rq; -+ -+ read_lock(&tasklist_lock); -+ for_each_process_thread(g, p) { -+ /* -+ * Only normalize user tasks: -+ */ -+ if (p->flags & PF_KTHREAD) -+ continue; -+ -+ if (!rt_task(p) && !iso_task(p)) -+ continue; -+ -+ rq = task_rq_lock(p, &rf); -+ __setscheduler(p, rq, SCHED_NORMAL, 0, false); -+ task_rq_unlock(rq, p, &rf); -+ } -+ read_unlock(&tasklist_lock); -+} -+ -+void normalize_rt_tasks(void) -+{ -+ normalise_rt_tasks(); -+} -+#endif /* CONFIG_MAGIC_SYSRQ */ -+ -+#if defined(CONFIG_IA64) || defined(CONFIG_KGDB_KDB) -+/* -+ * These functions are only useful for the IA64 MCA handling, or kdb. -+ * -+ * They can only be called when the whole system has been -+ * stopped - every CPU needs to be quiescent, and no scheduling -+ * activity can take place. Using them for anything else would -+ * be a serious bug, and as a result, they aren't even visible -+ * under any other configuration. -+ */ -+ -+/** -+ * curr_task - return the current task for a given CPU. -+ * @cpu: the processor in question. -+ * -+ * ONLY VALID WHEN THE WHOLE SYSTEM IS STOPPED! -+ * -+ * Return: The current task for @cpu. -+ */ -+struct task_struct *curr_task(int cpu) -+{ -+ return cpu_curr(cpu); -+} -+ -+#endif /* defined(CONFIG_IA64) || defined(CONFIG_KGDB_KDB) */ -+ -+#ifdef CONFIG_IA64 -+/** -+ * set_curr_task - set the current task for a given CPU. -+ * @cpu: the processor in question. -+ * @p: the task pointer to set. -+ * -+ * Description: This function must only be used when non-maskable interrupts -+ * are serviced on a separate stack. It allows the architecture to switch the -+ * notion of the current task on a CPU in a non-blocking manner. This function -+ * must be called with all CPU's synchronised, and interrupts disabled, the -+ * and caller must save the original value of the current task (see -+ * curr_task() above) and restore that value before reenabling interrupts and -+ * re-starting the system. -+ * -+ * ONLY VALID WHEN THE WHOLE SYSTEM IS STOPPED! -+ */ -+void ia64_set_curr_task(int cpu, struct task_struct *p) -+{ -+ cpu_curr(cpu) = p; -+} -+ -+#endif -+ -+void init_idle_bootup_task(struct task_struct *idle) -+{} -+ -+#ifdef CONFIG_SCHED_DEBUG -+__read_mostly bool sched_debug_enabled; -+ -+void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns, -+ struct seq_file *m) -+{} -+ -+void proc_sched_set_task(struct task_struct *p) -+{} -+#endif -+ -+#ifdef CONFIG_CGROUP_SCHED -+static void sched_free_group(struct task_group *tg) -+{ -+ kmem_cache_free(task_group_cache, tg); -+} -+ -+/* allocate runqueue etc for a new task group */ -+struct task_group *sched_create_group(struct task_group *parent) -+{ -+ struct task_group *tg; -+ -+ tg = kmem_cache_alloc(task_group_cache, GFP_KERNEL | __GFP_ZERO); -+ if (!tg) -+ return ERR_PTR(-ENOMEM); -+ -+ return tg; -+} -+ -+void sched_online_group(struct task_group *tg, struct task_group *parent) -+{ -+} -+ -+/* rcu callback to free various structures associated with a task group */ -+static void sched_free_group_rcu(struct rcu_head *rhp) -+{ -+ /* Now it should be safe to free those cfs_rqs */ -+ sched_free_group(container_of(rhp, struct task_group, rcu)); -+} -+ -+void sched_destroy_group(struct task_group *tg) -+{ -+ /* Wait for possible concurrent references to cfs_rqs complete */ -+ call_rcu(&tg->rcu, sched_free_group_rcu); -+} -+ -+void sched_offline_group(struct task_group *tg) -+{ -+} -+ -+static inline struct task_group *css_tg(struct cgroup_subsys_state *css) -+{ -+ return css ? container_of(css, struct task_group, css) : NULL; -+} -+ -+static struct cgroup_subsys_state * -+cpu_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) -+{ -+ struct task_group *parent = css_tg(parent_css); -+ struct task_group *tg; -+ -+ if (!parent) { -+ /* This is early initialization for the top cgroup */ -+ return &root_task_group.css; -+ } -+ -+ tg = sched_create_group(parent); -+ if (IS_ERR(tg)) -+ return ERR_PTR(-ENOMEM); -+ return &tg->css; -+} -+ -+/* Expose task group only after completing cgroup initialization */ -+static int cpu_cgroup_css_online(struct cgroup_subsys_state *css) -+{ -+ struct task_group *tg = css_tg(css); -+ struct task_group *parent = css_tg(css->parent); -+ -+ if (parent) -+ sched_online_group(tg, parent); -+ return 0; -+} -+ -+static void cpu_cgroup_css_released(struct cgroup_subsys_state *css) -+{ -+ struct task_group *tg = css_tg(css); -+ -+ sched_offline_group(tg); -+} -+ -+static void cpu_cgroup_css_free(struct cgroup_subsys_state *css) -+{ -+ struct task_group *tg = css_tg(css); -+ -+ /* -+ * Relies on the RCU grace period between css_released() and this. -+ */ -+ sched_free_group(tg); -+} -+ -+static void cpu_cgroup_fork(struct task_struct *task) -+{ -+} -+ -+static int cpu_cgroup_can_attach(struct cgroup_taskset *tset) -+{ -+ return 0; -+} -+ -+static void cpu_cgroup_attach(struct cgroup_taskset *tset) -+{ -+} -+ -+static struct cftype cpu_legacy_files[] = { -+ { } /* Terminate */ -+}; -+ -+static struct cftype cpu_files[] = { -+ { } /* terminate */ -+}; -+ -+static int cpu_extra_stat_show(struct seq_file *sf, -+ struct cgroup_subsys_state *css) -+{ -+ return 0; -+} -+ -+struct cgroup_subsys cpu_cgrp_subsys = { -+ .css_alloc = cpu_cgroup_css_alloc, -+ .css_online = cpu_cgroup_css_online, -+ .css_released = cpu_cgroup_css_released, -+ .css_free = cpu_cgroup_css_free, -+ .css_extra_stat_show = cpu_extra_stat_show, -+ .fork = cpu_cgroup_fork, -+ .can_attach = cpu_cgroup_can_attach, -+ .attach = cpu_cgroup_attach, -+ .legacy_cftypes = cpu_files, -+ .legacy_cftypes = cpu_legacy_files, -+ .dfl_cftypes = cpu_files, -+ .early_init = true, -+ .threaded = true, -+}; -+#endif /* CONFIG_CGROUP_SCHED */ -+ -+#undef CREATE_TRACE_POINTS -diff --git a/kernel/sched/MuQSS.h b/kernel/sched/MuQSS.h -new file mode 100644 -index 000000000000..0237ac382643 ---- /dev/null -+++ b/kernel/sched/MuQSS.h -@@ -0,0 +1,957 @@ -+/* SPDX-License-Identifier: GPL-2.0 */ -+#ifndef MUQSS_SCHED_H -+#define MUQSS_SCHED_H -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#ifdef CONFIG_PARAVIRT -+#include -+#endif -+ -+#include "cpupri.h" -+ -+#ifdef CONFIG_SCHED_DEBUG -+# define SCHED_WARN_ON(x) WARN_ONCE(x, #x) -+#else -+# define SCHED_WARN_ON(x) ((void)(x)) -+#endif -+ -+/* task_struct::on_rq states: */ -+#define TASK_ON_RQ_QUEUED 1 -+#define TASK_ON_RQ_MIGRATING 2 -+ -+struct rq; -+ -+#ifdef CONFIG_SMP -+ -+static inline bool sched_asym_prefer(int a, int b) -+{ -+ return arch_asym_cpu_priority(a) > arch_asym_cpu_priority(b); -+} -+ -+struct perf_domain { -+ struct em_perf_domain *em_pd; -+ struct perf_domain *next; -+ struct rcu_head rcu; -+}; -+ -+/* Scheduling group status flags */ -+#define SG_OVERLOAD 0x1 /* More than one runnable task on a CPU. */ -+#define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */ -+ -+/* -+ * We add the notion of a root-domain which will be used to define per-domain -+ * variables. Each exclusive cpuset essentially defines an island domain by -+ * fully partitioning the member cpus from any other cpuset. Whenever a new -+ * exclusive cpuset is created, we also create and attach a new root-domain -+ * object. -+ * -+ */ -+struct root_domain { -+ atomic_t refcount; -+ atomic_t rto_count; -+ struct rcu_head rcu; -+ cpumask_var_t span; -+ cpumask_var_t online; -+ -+ /* -+ * Indicate pullable load on at least one CPU, e.g: -+ * - More than one runnable task -+ * - Running task is misfit -+ */ -+ int overload; -+ -+ /* Indicate one or more cpus over-utilized (tipping point) */ -+ int overutilized; -+ -+ /* -+ * The bit corresponding to a CPU gets set here if such CPU has more -+ * than one runnable -deadline task (as it is below for RT tasks). -+ */ -+ cpumask_var_t dlo_mask; -+ atomic_t dlo_count; -+ /* Replace unused CFS structures with void */ -+ //struct dl_bw dl_bw; -+ //struct cpudl cpudl; -+ void *dl_bw; -+ void *cpudl; -+ -+ /* -+ * The "RT overload" flag: it gets set if a CPU has more than -+ * one runnable RT task. -+ */ -+ cpumask_var_t rto_mask; -+ //struct cpupri cpupri; -+ void *cpupri; -+ -+ unsigned long max_cpu_capacity; -+ -+ /* -+ * NULL-terminated list of performance domains intersecting with the -+ * CPUs of the rd. Protected by RCU. -+ */ -+ struct perf_domain *pd; -+}; -+ -+extern struct root_domain def_root_domain; -+extern struct mutex sched_domains_mutex; -+ -+extern void init_defrootdomain(void); -+extern int sched_init_domains(const struct cpumask *cpu_map); -+extern void rq_attach_root(struct rq *rq, struct root_domain *rd); -+ -+static inline void cpupri_cleanup(void __maybe_unused *cpupri) -+{ -+} -+ -+static inline void cpudl_cleanup(void __maybe_unused *cpudl) -+{ -+} -+ -+static inline void init_dl_bw(void __maybe_unused *dl_bw) -+{ -+} -+ -+static inline int cpudl_init(void __maybe_unused *dl_bw) -+{ -+ return 0; -+} -+ -+static inline int cpupri_init(void __maybe_unused *cpupri) -+{ -+ return 0; -+} -+#endif /* CONFIG_SMP */ -+ -+/* -+ * This is the main, per-CPU runqueue data structure. -+ * This data should only be modified by the local cpu. -+ */ -+struct rq { -+ raw_spinlock_t *lock; -+ raw_spinlock_t *orig_lock; -+ -+ struct task_struct *curr, *idle, *stop; -+ struct mm_struct *prev_mm; -+ -+ unsigned int nr_running; -+ /* -+ * This is part of a global counter where only the total sum -+ * over all CPUs matters. A task can increase this counter on -+ * one CPU and if it got migrated afterwards it may decrease -+ * it on another CPU. Always updated under the runqueue lock: -+ */ -+ unsigned long nr_uninterruptible; -+ u64 nr_switches; -+ -+ /* Stored data about rq->curr to work outside rq lock */ -+ u64 rq_deadline; -+ int rq_prio; -+ -+ /* Best queued id for use outside lock */ -+ u64 best_key; -+ -+ unsigned long last_scheduler_tick; /* Last jiffy this RQ ticked */ -+ unsigned long last_jiffy; /* Last jiffy this RQ updated rq clock */ -+ u64 niffies; /* Last time this RQ updated rq clock */ -+ u64 last_niffy; /* Last niffies as updated by local clock */ -+ u64 last_jiffy_niffies; /* Niffies @ last_jiffy */ -+ -+ u64 load_update; /* When we last updated load */ -+ unsigned long load_avg; /* Rolling load average */ -+#ifdef CONFIG_HAVE_SCHED_AVG_IRQ -+ u64 irq_load_update; /* When we last updated IRQ load */ -+ unsigned long irq_load_avg; /* Rolling IRQ load average */ -+#endif -+#ifdef CONFIG_SMT_NICE -+ struct mm_struct *rq_mm; -+ int rq_smt_bias; /* Policy/nice level bias across smt siblings */ -+#endif -+ /* Accurate timekeeping data */ -+ unsigned long user_ns, nice_ns, irq_ns, softirq_ns, system_ns, -+ iowait_ns, idle_ns; -+ atomic_t nr_iowait; -+ -+ skiplist_node *node; -+ skiplist *sl; -+#ifdef CONFIG_SMP -+ struct task_struct *preempt; /* Preempt triggered on this task */ -+ struct task_struct *preempting; /* Hint only, what task is preempting */ -+ -+ int cpu; /* cpu of this runqueue */ -+ bool online; -+ -+ struct root_domain *rd; -+ struct sched_domain *sd; -+ -+ unsigned long cpu_capacity_orig; -+ -+ int *cpu_locality; /* CPU relative cache distance */ -+ struct rq **rq_order; /* Shared RQs ordered by relative cache distance */ -+ struct rq **cpu_order; /* RQs of discrete CPUs ordered by distance */ -+ -+ struct rq *smp_leader; /* First physical CPU per node */ -+#ifdef CONFIG_SCHED_SMT -+ struct rq *smt_leader; /* First logical CPU in SMT siblings */ -+ cpumask_t thread_mask; -+ bool (*siblings_idle)(struct rq *rq); -+ /* See if all smt siblings are idle */ -+#endif /* CONFIG_SCHED_SMT */ -+#ifdef CONFIG_SCHED_MC -+ struct rq *mc_leader; /* First logical CPU in MC siblings */ -+ cpumask_t core_mask; -+ bool (*cache_idle)(struct rq *rq); -+ /* See if all cache siblings are idle */ -+#endif /* CONFIG_SCHED_MC */ -+#endif /* CONFIG_SMP */ -+#ifdef CONFIG_IRQ_TIME_ACCOUNTING -+ u64 prev_irq_time; -+#endif /* CONFIG_IRQ_TIME_ACCOUNTING */ -+#ifdef CONFIG_PARAVIRT -+ u64 prev_steal_time; -+#endif /* CONFIG_PARAVIRT */ -+#ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING -+ u64 prev_steal_time_rq; -+#endif /* CONFIG_PARAVIRT_TIME_ACCOUNTING */ -+ -+ u64 clock, old_clock, last_tick; -+ /* Ensure that all clocks are in the same cache line */ -+ u64 clock_task ____cacheline_aligned; -+ int dither; -+ -+ int iso_ticks; -+ bool iso_refractory; -+ -+#ifdef CONFIG_HIGH_RES_TIMERS -+ struct hrtimer hrexpiry_timer; -+#endif -+ -+ int rt_nr_running; /* Number real time tasks running */ -+#ifdef CONFIG_SCHEDSTATS -+ -+ /* latency stats */ -+ struct sched_info rq_sched_info; -+ unsigned long long rq_cpu_time; -+ /* could above be rq->cfs_rq.exec_clock + rq->rt_rq.rt_runtime ? */ -+ -+ /* sys_sched_yield() stats */ -+ unsigned int yld_count; -+ -+ /* schedule() stats */ -+ unsigned int sched_switch; -+ unsigned int sched_count; -+ unsigned int sched_goidle; -+ -+ /* try_to_wake_up() stats */ -+ unsigned int ttwu_count; -+ unsigned int ttwu_local; -+#endif /* CONFIG_SCHEDSTATS */ -+ -+#ifdef CONFIG_SMP -+ struct llist_head wake_list; -+#endif -+ -+#ifdef CONFIG_CPU_IDLE -+ /* Must be inspected within a rcu lock section */ -+ struct cpuidle_state *idle_state; -+#endif -+}; -+ -+struct rq_flags { -+ unsigned long flags; -+}; -+ -+#ifdef CONFIG_SMP -+struct rq *cpu_rq(int cpu); -+#endif -+ -+#ifndef CONFIG_SMP -+extern struct rq *uprq; -+#define cpu_rq(cpu) (uprq) -+#define this_rq() (uprq) -+#define raw_rq() (uprq) -+#define task_rq(p) (uprq) -+#define cpu_curr(cpu) ((uprq)->curr) -+#else /* CONFIG_SMP */ -+DECLARE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); -+#define this_rq() this_cpu_ptr(&runqueues) -+#define raw_rq() raw_cpu_ptr(&runqueues) -+#define task_rq(p) cpu_rq(task_cpu(p)) -+#endif /* CONFIG_SMP */ -+ -+static inline int task_current(struct rq *rq, struct task_struct *p) -+{ -+ return rq->curr == p; -+} -+ -+static inline int task_running(struct rq *rq, struct task_struct *p) -+{ -+#ifdef CONFIG_SMP -+ return p->on_cpu; -+#else -+ return task_current(rq, p); -+#endif -+} -+ -+static inline int task_on_rq_queued(struct task_struct *p) -+{ -+ return p->on_rq == TASK_ON_RQ_QUEUED; -+} -+ -+static inline int task_on_rq_migrating(struct task_struct *p) -+{ -+ return READ_ONCE(p->on_rq) == TASK_ON_RQ_MIGRATING; -+} -+ -+static inline void rq_lock(struct rq *rq) -+ __acquires(rq->lock) -+{ -+ raw_spin_lock(rq->lock); -+} -+ -+static inline void rq_unlock(struct rq *rq) -+ __releases(rq->lock) -+{ -+ raw_spin_unlock(rq->lock); -+} -+ -+static inline void rq_lock_irq(struct rq *rq) -+ __acquires(rq->lock) -+{ -+ raw_spin_lock_irq(rq->lock); -+} -+ -+static inline void rq_unlock_irq(struct rq *rq, struct rq_flags __always_unused *rf) -+ __releases(rq->lock) -+{ -+ raw_spin_unlock_irq(rq->lock); -+} -+ -+static inline void rq_lock_irqsave(struct rq *rq, struct rq_flags *rf) -+ __acquires(rq->lock) -+{ -+ raw_spin_lock_irqsave(rq->lock, rf->flags); -+} -+ -+static inline void rq_unlock_irqrestore(struct rq *rq, struct rq_flags *rf) -+ __releases(rq->lock) -+{ -+ raw_spin_unlock_irqrestore(rq->lock, rf->flags); -+} -+ -+static inline struct rq *task_rq_lock(struct task_struct *p, struct rq_flags *rf) -+ __acquires(p->pi_lock) -+ __acquires(rq->lock) -+{ -+ struct rq *rq; -+ -+ while (42) { -+ raw_spin_lock_irqsave(&p->pi_lock, rf->flags); -+ rq = task_rq(p); -+ raw_spin_lock(rq->lock); -+ if (likely(rq == task_rq(p))) -+ break; -+ raw_spin_unlock(rq->lock); -+ raw_spin_unlock_irqrestore(&p->pi_lock, rf->flags); -+ } -+ return rq; -+} -+ -+static inline void task_rq_unlock(struct rq *rq, struct task_struct *p, struct rq_flags *rf) -+ __releases(rq->lock) -+ __releases(p->pi_lock) -+{ -+ rq_unlock(rq); -+ raw_spin_unlock_irqrestore(&p->pi_lock, rf->flags); -+} -+ -+static inline struct rq *__task_rq_lock(struct task_struct *p, struct rq_flags __always_unused *rf) -+ __acquires(rq->lock) -+{ -+ struct rq *rq; -+ -+ lockdep_assert_held(&p->pi_lock); -+ -+ while (42) { -+ rq = task_rq(p); -+ raw_spin_lock(rq->lock); -+ if (likely(rq == task_rq(p))) -+ break; -+ raw_spin_unlock(rq->lock); -+ } -+ return rq; -+} -+ -+static inline void __task_rq_unlock(struct rq *rq, struct rq_flags __always_unused *rf) -+{ -+ rq_unlock(rq); -+} -+ -+static inline struct rq * -+this_rq_lock_irq(struct rq_flags *rf) -+ __acquires(rq->lock) -+{ -+ struct rq *rq; -+ -+ local_irq_disable(); -+ rq = this_rq(); -+ rq_lock(rq); -+ return rq; -+} -+ -+/* -+ * {de,en}queue flags: Most not used on MuQSS. -+ * -+ * DEQUEUE_SLEEP - task is no longer runnable -+ * ENQUEUE_WAKEUP - task just became runnable -+ * -+ * SAVE/RESTORE - an otherwise spurious dequeue/enqueue, done to ensure tasks -+ * are in a known state which allows modification. Such pairs -+ * should preserve as much state as possible. -+ * -+ * MOVE - paired with SAVE/RESTORE, explicitly does not preserve the location -+ * in the runqueue. -+ * -+ * ENQUEUE_HEAD - place at front of runqueue (tail if not specified) -+ * ENQUEUE_REPLENISH - CBS (replenish runtime and postpone deadline) -+ * ENQUEUE_MIGRATED - the task was migrated during wakeup -+ * -+ */ -+ -+#define DEQUEUE_SLEEP 0x01 -+#define DEQUEUE_SAVE 0x02 /* matches ENQUEUE_RESTORE */ -+ -+#define ENQUEUE_WAKEUP 0x01 -+#define ENQUEUE_RESTORE 0x02 -+ -+#ifdef CONFIG_SMP -+#define ENQUEUE_MIGRATED 0x40 -+#else -+#define ENQUEUE_MIGRATED 0x00 -+#endif -+ -+static inline u64 __rq_clock_broken(struct rq *rq) -+{ -+ return READ_ONCE(rq->clock); -+} -+ -+static inline u64 rq_clock(struct rq *rq) -+{ -+ lockdep_assert_held(rq->lock); -+ -+ return rq->clock; -+} -+ -+static inline u64 rq_clock_task(struct rq *rq) -+{ -+ lockdep_assert_held(rq->lock); -+ -+ return rq->clock_task; -+} -+ -+#ifdef CONFIG_NUMA -+enum numa_topology_type { -+ NUMA_DIRECT, -+ NUMA_GLUELESS_MESH, -+ NUMA_BACKPLANE, -+}; -+extern enum numa_topology_type sched_numa_topology_type; -+extern int sched_max_numa_distance; -+extern bool find_numa_distance(int distance); -+ -+extern void sched_init_numa(void); -+extern void sched_domains_numa_masks_set(unsigned int cpu); -+extern void sched_domains_numa_masks_clear(unsigned int cpu); -+#else -+static inline void sched_init_numa(void) { } -+static inline void sched_domains_numa_masks_set(unsigned int cpu) { } -+static inline void sched_domains_numa_masks_clear(unsigned int cpu) { } -+#endif -+ -+extern struct mutex sched_domains_mutex; -+extern struct static_key_false sched_schedstats; -+ -+#define rcu_dereference_check_sched_domain(p) \ -+ rcu_dereference_check((p), \ -+ lockdep_is_held(&sched_domains_mutex)) -+ -+#ifdef CONFIG_SMP -+ -+/* -+ * The domain tree (rq->sd) is protected by RCU's quiescent state transition. -+ * See destroy_sched_domains: call_rcu for details. -+ * -+ * The domain tree of any CPU may only be accessed from within -+ * preempt-disabled sections. -+ */ -+#define for_each_domain(cpu, __sd) \ -+ for (__sd = rcu_dereference_check_sched_domain(cpu_rq(cpu)->sd); \ -+ __sd; __sd = __sd->parent) -+ -+#define for_each_lower_domain(sd) for (; sd; sd = sd->child) -+ -+/** -+ * highest_flag_domain - Return highest sched_domain containing flag. -+ * @cpu: The cpu whose highest level of sched domain is to -+ * be returned. -+ * @flag: The flag to check for the highest sched_domain -+ * for the given cpu. -+ * -+ * Returns the highest sched_domain of a cpu which contains the given flag. -+ */ -+static inline struct sched_domain *highest_flag_domain(int cpu, int flag) -+{ -+ struct sched_domain *sd, *hsd = NULL; -+ -+ for_each_domain(cpu, sd) { -+ if (!(sd->flags & flag)) -+ break; -+ hsd = sd; -+ } -+ -+ return hsd; -+} -+ -+static inline struct sched_domain *lowest_flag_domain(int cpu, int flag) -+{ -+ struct sched_domain *sd; -+ -+ for_each_domain(cpu, sd) { -+ if (sd->flags & flag) -+ break; -+ } -+ -+ return sd; -+} -+ -+DECLARE_PER_CPU(struct sched_domain *, sd_llc); -+DECLARE_PER_CPU(int, sd_llc_size); -+DECLARE_PER_CPU(int, sd_llc_id); -+DECLARE_PER_CPU(struct sched_domain_shared *, sd_llc_shared); -+DECLARE_PER_CPU(struct sched_domain *, sd_numa); -+DECLARE_PER_CPU(struct sched_domain *, sd_asym_packing); -+DECLARE_PER_CPU(struct sched_domain *, sd_asym_cpucapacity); -+ -+struct sched_group_capacity { -+ atomic_t ref; -+ /* -+ * CPU capacity of this group, SCHED_CAPACITY_SCALE being max capacity -+ * for a single CPU. -+ */ -+ unsigned long capacity; -+ unsigned long min_capacity; /* Min per-CPU capacity in group */ -+ unsigned long max_capacity; /* Max per-CPU capacity in group */ -+ unsigned long next_update; -+ int imbalance; /* XXX unrelated to capacity but shared group state */ -+ -+#ifdef CONFIG_SCHED_DEBUG -+ int id; -+#endif -+ -+ unsigned long cpumask[0]; /* balance mask */ -+}; -+ -+struct sched_group { -+ struct sched_group *next; /* Must be a circular list */ -+ atomic_t ref; -+ -+ unsigned int group_weight; -+ struct sched_group_capacity *sgc; -+ int asym_prefer_cpu; /* cpu of highest priority in group */ -+ -+ /* -+ * The CPUs this group covers. -+ * -+ * NOTE: this field is variable length. (Allocated dynamically -+ * by attaching extra space to the end of the structure, -+ * depending on how many CPUs the kernel has booted up with) -+ */ -+ unsigned long cpumask[0]; -+}; -+ -+static inline struct cpumask *sched_group_span(struct sched_group *sg) -+{ -+ return to_cpumask(sg->cpumask); -+} -+ -+/* -+ * See build_balance_mask(). -+ */ -+static inline struct cpumask *group_balance_mask(struct sched_group *sg) -+{ -+ return to_cpumask(sg->sgc->cpumask); -+} -+ -+/** -+ * group_first_cpu - Returns the first cpu in the cpumask of a sched_group. -+ * @group: The group whose first cpu is to be returned. -+ */ -+static inline unsigned int group_first_cpu(struct sched_group *group) -+{ -+ return cpumask_first(sched_group_span(group)); -+} -+ -+ -+#if defined(CONFIG_SCHED_DEBUG) && defined(CONFIG_SYSCTL) -+void register_sched_domain_sysctl(void); -+void dirty_sched_domain_sysctl(int cpu); -+void unregister_sched_domain_sysctl(void); -+#else -+static inline void register_sched_domain_sysctl(void) -+{ -+} -+static inline void dirty_sched_domain_sysctl(int cpu) -+{ -+} -+static inline void unregister_sched_domain_sysctl(void) -+{ -+} -+#endif -+ -+extern void sched_ttwu_pending(void); -+extern void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask); -+extern void set_rq_online (struct rq *rq); -+extern void set_rq_offline(struct rq *rq); -+extern bool sched_smp_initialized; -+ -+static inline void update_group_capacity(struct sched_domain *sd, int cpu) -+{ -+} -+ -+static inline void trigger_load_balance(struct rq *rq) -+{ -+} -+ -+#define sched_feat(x) 0 -+ -+#else /* CONFIG_SMP */ -+ -+static inline void sched_ttwu_pending(void) { } -+ -+#endif /* CONFIG_SMP */ -+ -+#ifdef CONFIG_CPU_IDLE -+static inline void idle_set_state(struct rq *rq, -+ struct cpuidle_state *idle_state) -+{ -+ rq->idle_state = idle_state; -+} -+ -+static inline struct cpuidle_state *idle_get_state(struct rq *rq) -+{ -+ SCHED_WARN_ON(!rcu_read_lock_held()); -+ return rq->idle_state; -+} -+#else -+static inline void idle_set_state(struct rq *rq, -+ struct cpuidle_state *idle_state) -+{ -+} -+ -+static inline struct cpuidle_state *idle_get_state(struct rq *rq) -+{ -+ return NULL; -+} -+#endif -+ -+#ifdef CONFIG_SCHED_DEBUG -+extern bool sched_debug_enabled; -+#endif -+ -+extern void schedule_idle(void); -+ -+#ifdef CONFIG_IRQ_TIME_ACCOUNTING -+struct irqtime { -+ u64 total; -+ u64 tick_delta; -+ u64 irq_start_time; -+ struct u64_stats_sync sync; -+}; -+ -+DECLARE_PER_CPU(struct irqtime, cpu_irqtime); -+ -+/* -+ * Returns the irqtime minus the softirq time computed by ksoftirqd. -+ * Otherwise ksoftirqd's sum_exec_runtime is substracted its own runtime -+ * and never move forward. -+ */ -+static inline u64 irq_time_read(int cpu) -+{ -+ struct irqtime *irqtime = &per_cpu(cpu_irqtime, cpu); -+ unsigned int seq; -+ u64 total; -+ -+ do { -+ seq = __u64_stats_fetch_begin(&irqtime->sync); -+ total = irqtime->total; -+ } while (__u64_stats_fetch_retry(&irqtime->sync, seq)); -+ -+ return total; -+} -+#endif /* CONFIG_IRQ_TIME_ACCOUNTING */ -+ -+#ifdef CONFIG_SMP -+static inline int cpu_of(struct rq *rq) -+{ -+ return rq->cpu; -+} -+#else /* CONFIG_SMP */ -+static inline int cpu_of(struct rq *rq) -+{ -+ return 0; -+} -+#endif -+ -+#ifdef CONFIG_CPU_FREQ -+DECLARE_PER_CPU(struct update_util_data *, cpufreq_update_util_data); -+ -+static inline void cpufreq_trigger(struct rq *rq, unsigned int flags) -+{ -+ struct update_util_data *data; -+ -+ data = rcu_dereference_sched(*per_cpu_ptr(&cpufreq_update_util_data, -+ cpu_of(rq))); -+ -+ if (data) -+ data->func(data, rq->niffies, flags); -+} -+#else -+static inline void cpufreq_trigger(struct rq *rq, unsigned int flag) -+{ -+} -+#endif /* CONFIG_CPU_FREQ */ -+ -+#ifdef arch_scale_freq_capacity -+#ifndef arch_scale_freq_invariant -+#define arch_scale_freq_invariant() (true) -+#endif -+#else /* arch_scale_freq_capacity */ -+#define arch_scale_freq_invariant() (false) -+#endif -+ -+/* -+ * This should only be called when current == rq->idle. Dodgy workaround for -+ * when softirqs are pending and we are in the idle loop. Setting current to -+ * resched will kick us out of the idle loop and the softirqs will be serviced -+ * on our next pass through schedule(). -+ */ -+static inline bool softirq_pending(int cpu) -+{ -+ if (likely(!local_softirq_pending())) -+ return false; -+ set_tsk_need_resched(current); -+ return true; -+} -+ -+#ifdef CONFIG_64BIT -+static inline u64 read_sum_exec_runtime(struct task_struct *t) -+{ -+ return tsk_seruntime(t); -+} -+#else -+static inline u64 read_sum_exec_runtime(struct task_struct *t) -+{ -+ struct rq_flags rf; -+ u64 ns; -+ struct rq *rq; -+ -+ rq = task_rq_lock(t, &rf); -+ ns = tsk_seruntime(t); -+ task_rq_unlock(rq, t, &rf); -+ -+ return ns; -+} -+#endif -+ -+#ifndef arch_scale_freq_capacity -+static __always_inline -+unsigned long arch_scale_freq_capacity(int cpu) -+{ -+ return SCHED_CAPACITY_SCALE; -+} -+#endif -+ -+#ifdef CONFIG_NO_HZ_FULL -+extern bool sched_can_stop_tick(struct rq *rq); -+extern int __init sched_tick_offload_init(void); -+ -+/* -+ * Tick may be needed by tasks in the runqueue depending on their policy and -+ * requirements. If tick is needed, lets send the target an IPI to kick it out of -+ * nohz mode if necessary. -+ */ -+static inline void sched_update_tick_dependency(struct rq *rq) -+{ -+ int cpu; -+ -+ if (!tick_nohz_full_enabled()) -+ return; -+ -+ cpu = cpu_of(rq); -+ -+ if (!tick_nohz_full_cpu(cpu)) -+ return; -+ -+ if (sched_can_stop_tick(rq)) -+ tick_nohz_dep_clear_cpu(cpu, TICK_DEP_BIT_SCHED); -+ else -+ tick_nohz_dep_set_cpu(cpu, TICK_DEP_BIT_SCHED); -+} -+#else -+static inline int sched_tick_offload_init(void) { return 0; } -+static inline void sched_update_tick_dependency(struct rq *rq) { } -+#endif -+ -+#define SCHED_FLAG_SUGOV 0x10000000 -+ -+static inline bool rt_rq_is_runnable(struct rq *rt_rq) -+{ -+ return rt_rq->rt_nr_running; -+} -+ -+#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL -+/** -+ * enum schedutil_type - CPU utilization type -+ * @FREQUENCY_UTIL: Utilization used to select frequency -+ * @ENERGY_UTIL: Utilization used during energy calculation -+ * -+ * The utilization signals of all scheduling classes (CFS/RT/DL) and IRQ time -+ * need to be aggregated differently depending on the usage made of them. This -+ * enum is used within schedutil_freq_util() to differentiate the types of -+ * utilization expected by the callers, and adjust the aggregation accordingly. -+ */ -+enum schedutil_type { -+ FREQUENCY_UTIL, -+ ENERGY_UTIL, -+}; -+ -+unsigned long schedutil_freq_util(int cpu, unsigned long util_cfs, -+ unsigned long max, enum schedutil_type type); -+ -+static inline unsigned long schedutil_energy_util(int cpu, unsigned long cfs) -+{ -+ unsigned long max = arch_scale_cpu_capacity(NULL, cpu); -+ -+ return schedutil_freq_util(cpu, cfs, max, ENERGY_UTIL); -+} -+ -+static inline unsigned long cpu_bw_dl(struct rq *rq) -+{ -+ return 0; -+} -+ -+static inline unsigned long cpu_util_dl(struct rq *rq) -+{ -+ return 0; -+} -+ -+static inline unsigned long cpu_util_cfs(struct rq *rq) -+{ -+ unsigned long ret = READ_ONCE(rq->load_avg); -+ -+ if (ret > SCHED_CAPACITY_SCALE) -+ ret = SCHED_CAPACITY_SCALE; -+ return ret; -+} -+ -+static inline unsigned long cpu_util_rt(struct rq *rq) -+{ -+ unsigned long ret = READ_ONCE(rq->rt_nr_running); -+ -+ if (ret > SCHED_CAPACITY_SCALE) -+ ret = SCHED_CAPACITY_SCALE; -+ return ret; -+} -+ -+#ifdef CONFIG_HAVE_SCHED_AVG_IRQ -+static inline unsigned long cpu_util_irq(struct rq *rq) -+{ -+ unsigned long ret = READ_ONCE(rq->irq_load_avg); -+ -+ if (ret > SCHED_CAPACITY_SCALE) -+ ret = SCHED_CAPACITY_SCALE; -+ return ret; -+} -+ -+static inline -+unsigned long scale_irq_capacity(unsigned long util, unsigned long irq, unsigned long max) -+{ -+ util *= (max - irq); -+ util /= max; -+ -+ return util; -+ -+} -+#else -+static inline unsigned long cpu_util_irq(struct rq *rq) -+{ -+ return 0; -+} -+ -+static inline -+unsigned long scale_irq_capacity(unsigned long util, unsigned long irq, unsigned long max) -+{ -+ return util; -+} -+#endif -+#endif -+ -+#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) -+#define perf_domain_span(pd) (to_cpumask(((pd)->em_pd->cpus))) -+ -+DECLARE_STATIC_KEY_FALSE(sched_energy_present); -+ -+static inline bool sched_energy_enabled(void) -+{ -+ return static_branch_unlikely(&sched_energy_present); -+} -+ -+#else /* ! (CONFIG_ENERGY_MODEL && CONFIG_CPU_FREQ_GOV_SCHEDUTIL) */ -+ -+#define perf_domain_span(pd) NULL -+static inline bool sched_energy_enabled(void) { return false; } -+ -+#endif /* CONFIG_ENERGY_MODEL && CONFIG_CPU_FREQ_GOV_SCHEDUTIL */ -+#endif /* MUQSS_SCHED_H */ -diff --git a/kernel/sched/core.c b/kernel/sched/core.c -index 874c427742a9..4d5962232a55 100644 ---- a/kernel/sched/core.c -+++ b/kernel/sched/core.c -@@ -5123,7 +5123,7 @@ long __sched io_schedule_timeout(long timeout) - } - EXPORT_SYMBOL(io_schedule_timeout); - --void io_schedule(void) -+void __sched io_schedule(void) - { - int token; - -diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c -index 962cf343f798..e17624efd86c 100644 ---- a/kernel/sched/cpufreq_schedutil.c -+++ b/kernel/sched/cpufreq_schedutil.c -@@ -176,6 +176,12 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy, - return cpufreq_driver_resolve_freq(policy, freq); - } - -+#ifdef CONFIG_SCHED_MUQSS -+#define rt_rq_runnable(rq_rt) rt_rq_is_runnable(rq) -+#else -+#define rt_rq_runnable(rq_rt) rt_rq_is_runnable(&rq->rt) -+#endif -+ - /* - * This function computes an effective utilization for the given CPU, to be - * used for frequency selection given the linear relation: f = u * f_max. -@@ -202,7 +208,7 @@ unsigned long schedutil_freq_util(int cpu, unsigned long util_cfs, - unsigned long dl_util, util, irq; - struct rq *rq = cpu_rq(cpu); - -- if (type == FREQUENCY_UTIL && rt_rq_is_runnable(&rq->rt)) -+ if (type == FREQUENCY_UTIL && rt_rq_runnable(rq)) - return max; - - /* -@@ -638,7 +644,11 @@ static int sugov_kthread_create(struct sugov_policy *sg_policy) - struct task_struct *thread; - struct sched_attr attr = { - .size = sizeof(struct sched_attr), -+#ifdef CONFIG_SCHED_MUQSS -+ .sched_policy = SCHED_RR, -+#else - .sched_policy = SCHED_DEADLINE, -+#endif - .sched_flags = SCHED_FLAG_SUGOV, - .sched_nice = 0, - .sched_priority = 0, -diff --git a/kernel/sched/cpupri.h b/kernel/sched/cpupri.h -index 7dc20a3232e7..e733a0a53b0a 100644 ---- a/kernel/sched/cpupri.h -+++ b/kernel/sched/cpupri.h -@@ -17,9 +17,11 @@ struct cpupri { - int *cpu_to_pri; - }; - -+#ifndef CONFIG_SCHED_MUQSS - #ifdef CONFIG_SMP - int cpupri_find(struct cpupri *cp, struct task_struct *p, struct cpumask *lowest_mask); - void cpupri_set(struct cpupri *cp, int cpu, int pri); - int cpupri_init(struct cpupri *cp); - void cpupri_cleanup(struct cpupri *cp); - #endif -+#endif -diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c -index 2305ce89a26c..7a4be7d3ce41 100644 ---- a/kernel/sched/cputime.c -+++ b/kernel/sched/cputime.c -@@ -266,26 +266,6 @@ static inline u64 account_other_time(u64 max) - return accounted; - } - --#ifdef CONFIG_64BIT --static inline u64 read_sum_exec_runtime(struct task_struct *t) --{ -- return t->se.sum_exec_runtime; --} --#else --static u64 read_sum_exec_runtime(struct task_struct *t) --{ -- u64 ns; -- struct rq_flags rf; -- struct rq *rq; -- -- rq = task_rq_lock(t, &rf); -- ns = t->se.sum_exec_runtime; -- task_rq_unlock(rq, t, &rf); -- -- return ns; --} --#endif -- - /* - * Accumulate raw cputime values of dead tasks (sig->[us]time) and live - * tasks (sum on group iteration) belonging to @tsk's group. -@@ -663,7 +643,7 @@ void cputime_adjust(struct task_cputime *curr, struct prev_cputime *prev, - void task_cputime_adjusted(struct task_struct *p, u64 *ut, u64 *st) - { - struct task_cputime cputime = { -- .sum_exec_runtime = p->se.sum_exec_runtime, -+ .sum_exec_runtime = tsk_seruntime(p), - }; - - task_cputime(p, &cputime.utime, &cputime.stime); -diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c -index f35930f5e528..dc5ad9a14c37 100644 ---- a/kernel/sched/fair.c -+++ b/kernel/sched/fair.c -@@ -37,8 +37,13 @@ - * - * (default: 6ms * (1 + ilog(ncpus)), units: nanoseconds) - */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+unsigned int sysctl_sched_latency = 4000000ULL; -+static unsigned int normalized_sysctl_sched_latency = 4000000ULL; -+#else - unsigned int sysctl_sched_latency = 6000000ULL; - static unsigned int normalized_sysctl_sched_latency = 6000000ULL; -+#endif - - /* - * The initial- and re-scaling of tunables is configurable -@@ -58,13 +63,22 @@ enum sched_tunable_scaling sysctl_sched_tunable_scaling = SCHED_TUNABLESCALING_L - * - * (default: 0.75 msec * (1 + ilog(ncpus)), units: nanoseconds) - */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+unsigned int sysctl_sched_min_granularity = 400000ULL; -+static unsigned int normalized_sysctl_sched_min_granularity = 400000ULL; -+#else - unsigned int sysctl_sched_min_granularity = 750000ULL; - static unsigned int normalized_sysctl_sched_min_granularity = 750000ULL; -+#endif - - /* - * This value is kept at sysctl_sched_latency/sysctl_sched_min_granularity - */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+static unsigned int sched_nr_latency = 10; -+#else - static unsigned int sched_nr_latency = 8; -+#endif - - /* - * After fork, child runs first. If set to 0 (default) then -@@ -81,10 +95,17 @@ unsigned int sysctl_sched_child_runs_first __read_mostly; - * - * (default: 1 msec * (1 + ilog(ncpus)), units: nanoseconds) - */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+unsigned int sysctl_sched_wakeup_granularity = 500000UL; -+static unsigned int normalized_sysctl_sched_wakeup_granularity = 500000UL; -+ -+const_debug unsigned int sysctl_sched_migration_cost = 250000UL; -+#else - unsigned int sysctl_sched_wakeup_granularity = 1000000UL; - static unsigned int normalized_sysctl_sched_wakeup_granularity = 1000000UL; - - const_debug unsigned int sysctl_sched_migration_cost = 500000UL; -+#endif - - #ifdef CONFIG_SMP - /* -@@ -115,8 +136,12 @@ static unsigned int capacity_margin = 1280; - * - * (default: 5 msec, units: microseconds) - */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+unsigned int sysctl_sched_cfs_bandwidth_slice = 3000UL; -+#else - unsigned int sysctl_sched_cfs_bandwidth_slice = 5000UL; - #endif -+#endif - - static inline void update_load_add(struct load_weight *lw, unsigned long inc) - { -@@ -1067,6 +1092,21 @@ struct numa_group { - unsigned long faults[0]; - }; - -+/* -+ * For functions that can be called in multiple contexts that permit reading -+ * ->numa_group (see struct task_struct for locking rules). -+ */ -+static struct numa_group *deref_task_numa_group(struct task_struct *p) -+{ -+ return rcu_dereference_check(p->numa_group, p == current || -+ (lockdep_is_held(&task_rq(p)->lock) && !READ_ONCE(p->on_cpu))); -+} -+ -+static struct numa_group *deref_curr_numa_group(struct task_struct *p) -+{ -+ return rcu_dereference_protected(p->numa_group, p == current); -+} -+ - static inline unsigned long group_faults_priv(struct numa_group *ng); - static inline unsigned long group_faults_shared(struct numa_group *ng); - -@@ -1110,10 +1150,12 @@ static unsigned int task_scan_start(struct task_struct *p) - { - unsigned long smin = task_scan_min(p); - unsigned long period = smin; -+ struct numa_group *ng; - - /* Scale the maximum scan period with the amount of shared memory. */ -- if (p->numa_group) { -- struct numa_group *ng = p->numa_group; -+ rcu_read_lock(); -+ ng = rcu_dereference(p->numa_group); -+ if (ng) { - unsigned long shared = group_faults_shared(ng); - unsigned long private = group_faults_priv(ng); - -@@ -1121,6 +1163,7 @@ static unsigned int task_scan_start(struct task_struct *p) - period *= shared + 1; - period /= private + shared + 1; - } -+ rcu_read_unlock(); - - return max(smin, period); - } -@@ -1129,13 +1172,14 @@ static unsigned int task_scan_max(struct task_struct *p) - { - unsigned long smin = task_scan_min(p); - unsigned long smax; -+ struct numa_group *ng; - - /* Watch for min being lower than max due to floor calculations */ - smax = sysctl_numa_balancing_scan_period_max / task_nr_scan_windows(p); - - /* Scale the maximum scan period with the amount of shared memory. */ -- if (p->numa_group) { -- struct numa_group *ng = p->numa_group; -+ ng = deref_curr_numa_group(p); -+ if (ng) { - unsigned long shared = group_faults_shared(ng); - unsigned long private = group_faults_priv(ng); - unsigned long period = smax; -@@ -1167,7 +1211,7 @@ void init_numa_balancing(unsigned long clone_flags, struct task_struct *p) - p->numa_scan_period = sysctl_numa_balancing_scan_delay; - p->numa_work.next = &p->numa_work; - p->numa_faults = NULL; -- p->numa_group = NULL; -+ RCU_INIT_POINTER(p->numa_group, NULL); - p->last_task_numa_placement = 0; - p->last_sum_exec_runtime = 0; - -@@ -1214,7 +1258,16 @@ static void account_numa_dequeue(struct rq *rq, struct task_struct *p) - - pid_t task_numa_group_id(struct task_struct *p) - { -- return p->numa_group ? p->numa_group->gid : 0; -+ struct numa_group *ng; -+ pid_t gid = 0; -+ -+ rcu_read_lock(); -+ ng = rcu_dereference(p->numa_group); -+ if (ng) -+ gid = ng->gid; -+ rcu_read_unlock(); -+ -+ return gid; - } - - /* -@@ -1239,11 +1292,13 @@ static inline unsigned long task_faults(struct task_struct *p, int nid) - - static inline unsigned long group_faults(struct task_struct *p, int nid) - { -- if (!p->numa_group) -+ struct numa_group *ng = deref_task_numa_group(p); -+ -+ if (!ng) - return 0; - -- return p->numa_group->faults[task_faults_idx(NUMA_MEM, nid, 0)] + -- p->numa_group->faults[task_faults_idx(NUMA_MEM, nid, 1)]; -+ return ng->faults[task_faults_idx(NUMA_MEM, nid, 0)] + -+ ng->faults[task_faults_idx(NUMA_MEM, nid, 1)]; - } - - static inline unsigned long group_faults_cpu(struct numa_group *group, int nid) -@@ -1381,12 +1436,13 @@ static inline unsigned long task_weight(struct task_struct *p, int nid, - static inline unsigned long group_weight(struct task_struct *p, int nid, - int dist) - { -+ struct numa_group *ng = deref_task_numa_group(p); - unsigned long faults, total_faults; - -- if (!p->numa_group) -+ if (!ng) - return 0; - -- total_faults = p->numa_group->total_faults; -+ total_faults = ng->total_faults; - - if (!total_faults) - return 0; -@@ -1400,7 +1456,7 @@ static inline unsigned long group_weight(struct task_struct *p, int nid, - bool should_numa_migrate_memory(struct task_struct *p, struct page * page, - int src_nid, int dst_cpu) - { -- struct numa_group *ng = p->numa_group; -+ struct numa_group *ng = deref_curr_numa_group(p); - int dst_nid = cpu_to_node(dst_cpu); - int last_cpupid, this_cpupid; - -@@ -1583,13 +1639,14 @@ static bool load_too_imbalanced(long src_load, long dst_load, - static void task_numa_compare(struct task_numa_env *env, - long taskimp, long groupimp, bool maymove) - { -+ struct numa_group *cur_ng, *p_ng = deref_curr_numa_group(env->p); - struct rq *dst_rq = cpu_rq(env->dst_cpu); -+ long imp = p_ng ? groupimp : taskimp; - struct task_struct *cur; - long src_load, dst_load; -- long load; -- long imp = env->p->numa_group ? groupimp : taskimp; -- long moveimp = imp; - int dist = env->dist; -+ long moveimp = imp; -+ long load; - - if (READ_ONCE(dst_rq->numa_migrate_on)) - return; -@@ -1628,21 +1685,22 @@ static void task_numa_compare(struct task_numa_env *env, - * If dst and source tasks are in the same NUMA group, or not - * in any group then look only at task weights. - */ -- if (cur->numa_group == env->p->numa_group) { -+ cur_ng = rcu_dereference(cur->numa_group); -+ if (cur_ng == p_ng) { - imp = taskimp + task_weight(cur, env->src_nid, dist) - - task_weight(cur, env->dst_nid, dist); - /* - * Add some hysteresis to prevent swapping the - * tasks within a group over tiny differences. - */ -- if (cur->numa_group) -+ if (cur_ng) - imp -= imp / 16; - } else { - /* - * Compare the group weights. If a task is all by itself - * (not part of a group), use the task weight instead. - */ -- if (cur->numa_group && env->p->numa_group) -+ if (cur_ng && p_ng) - imp += group_weight(cur, env->src_nid, dist) - - group_weight(cur, env->dst_nid, dist); - else -@@ -1740,11 +1798,12 @@ static int task_numa_migrate(struct task_struct *p) - .best_imp = 0, - .best_cpu = -1, - }; -+ unsigned long taskweight, groupweight; - struct sched_domain *sd; -+ long taskimp, groupimp; -+ struct numa_group *ng; - struct rq *best_rq; -- unsigned long taskweight, groupweight; - int nid, ret, dist; -- long taskimp, groupimp; - - /* - * Pick the lowest SD_NUMA domain, as that would have the smallest -@@ -1790,7 +1849,8 @@ static int task_numa_migrate(struct task_struct *p) - * multiple NUMA nodes; in order to better consolidate the group, - * we need to check other locations. - */ -- if (env.best_cpu == -1 || (p->numa_group && p->numa_group->active_nodes > 1)) { -+ ng = deref_curr_numa_group(p); -+ if (env.best_cpu == -1 || (ng && ng->active_nodes > 1)) { - for_each_online_node(nid) { - if (nid == env.src_nid || nid == p->numa_preferred_nid) - continue; -@@ -1823,7 +1883,7 @@ static int task_numa_migrate(struct task_struct *p) - * A task that migrated to a second choice node will be better off - * trying for a better one later. Do not set the preferred node here. - */ -- if (p->numa_group) { -+ if (ng) { - if (env.best_cpu == -1) - nid = env.src_nid; - else -@@ -2118,6 +2178,7 @@ static void task_numa_placement(struct task_struct *p) - unsigned long total_faults; - u64 runtime, period; - spinlock_t *group_lock = NULL; -+ struct numa_group *ng; - - /* - * The p->mm->numa_scan_seq field gets updated without -@@ -2135,8 +2196,9 @@ static void task_numa_placement(struct task_struct *p) - runtime = numa_get_avg_runtime(p, &period); - - /* If the task is part of a group prevent parallel updates to group stats */ -- if (p->numa_group) { -- group_lock = &p->numa_group->lock; -+ ng = deref_curr_numa_group(p); -+ if (ng) { -+ group_lock = &ng->lock; - spin_lock_irq(group_lock); - } - -@@ -2177,7 +2239,7 @@ static void task_numa_placement(struct task_struct *p) - p->numa_faults[cpu_idx] += f_diff; - faults += p->numa_faults[mem_idx]; - p->total_numa_faults += diff; -- if (p->numa_group) { -+ if (ng) { - /* - * safe because we can only change our own group - * -@@ -2185,14 +2247,14 @@ static void task_numa_placement(struct task_struct *p) - * nid and priv in a specific region because it - * is at the beginning of the numa_faults array. - */ -- p->numa_group->faults[mem_idx] += diff; -- p->numa_group->faults_cpu[mem_idx] += f_diff; -- p->numa_group->total_faults += diff; -- group_faults += p->numa_group->faults[mem_idx]; -+ ng->faults[mem_idx] += diff; -+ ng->faults_cpu[mem_idx] += f_diff; -+ ng->total_faults += diff; -+ group_faults += ng->faults[mem_idx]; - } - } - -- if (!p->numa_group) { -+ if (!ng) { - if (faults > max_faults) { - max_faults = faults; - max_nid = nid; -@@ -2203,8 +2265,8 @@ static void task_numa_placement(struct task_struct *p) - } - } - -- if (p->numa_group) { -- numa_group_count_active_nodes(p->numa_group); -+ if (ng) { -+ numa_group_count_active_nodes(ng); - spin_unlock_irq(group_lock); - max_nid = preferred_group_nid(p, max_nid); - } -@@ -2238,7 +2300,7 @@ static void task_numa_group(struct task_struct *p, int cpupid, int flags, - int cpu = cpupid_to_cpu(cpupid); - int i; - -- if (unlikely(!p->numa_group)) { -+ if (unlikely(!deref_curr_numa_group(p))) { - unsigned int size = sizeof(struct numa_group) + - 4*nr_node_ids*sizeof(unsigned long); - -@@ -2274,7 +2336,7 @@ static void task_numa_group(struct task_struct *p, int cpupid, int flags, - if (!grp) - goto no_join; - -- my_grp = p->numa_group; -+ my_grp = deref_curr_numa_group(p); - if (grp == my_grp) - goto no_join; - -@@ -2336,13 +2398,24 @@ static void task_numa_group(struct task_struct *p, int cpupid, int flags, - return; - } - --void task_numa_free(struct task_struct *p) -+/* -+ * Get rid of NUMA staticstics associated with a task (either current or dead). -+ * If @final is set, the task is dead and has reached refcount zero, so we can -+ * safely free all relevant data structures. Otherwise, there might be -+ * concurrent reads from places like load balancing and procfs, and we should -+ * reset the data back to default state without freeing ->numa_faults. -+ */ -+void task_numa_free(struct task_struct *p, bool final) - { -- struct numa_group *grp = p->numa_group; -- void *numa_faults = p->numa_faults; -+ /* safe: p either is current or is being freed by current */ -+ struct numa_group *grp = rcu_dereference_raw(p->numa_group); -+ unsigned long *numa_faults = p->numa_faults; - unsigned long flags; - int i; - -+ if (!numa_faults) -+ return; -+ - if (grp) { - spin_lock_irqsave(&grp->lock, flags); - for (i = 0; i < NR_NUMA_HINT_FAULT_STATS * nr_node_ids; i++) -@@ -2355,8 +2428,14 @@ void task_numa_free(struct task_struct *p) - put_numa_group(grp); - } - -- p->numa_faults = NULL; -- kfree(numa_faults); -+ if (final) { -+ p->numa_faults = NULL; -+ kfree(numa_faults); -+ } else { -+ p->total_numa_faults = 0; -+ for (i = 0; i < NR_NUMA_HINT_FAULT_STATS * nr_node_ids; i++) -+ numa_faults[i] = 0; -+ } - } - - /* -@@ -2409,7 +2488,7 @@ void task_numa_fault(int last_cpupid, int mem_node, int pages, int flags) - * actively using should be counted as local. This allows the - * scan rate to slow down when a workload has settled down. - */ -- ng = p->numa_group; -+ ng = deref_curr_numa_group(p); - if (!priv && !local && ng && ng->active_nodes > 1 && - numa_is_active_node(cpu_node, ng) && - numa_is_active_node(mem_node, ng)) -@@ -10708,18 +10787,22 @@ void show_numa_stats(struct task_struct *p, struct seq_file *m) - { - int node; - unsigned long tsf = 0, tpf = 0, gsf = 0, gpf = 0; -+ struct numa_group *ng; - -+ rcu_read_lock(); -+ ng = rcu_dereference(p->numa_group); - for_each_online_node(node) { - if (p->numa_faults) { - tsf = p->numa_faults[task_faults_idx(NUMA_MEM, node, 0)]; - tpf = p->numa_faults[task_faults_idx(NUMA_MEM, node, 1)]; - } -- if (p->numa_group) { -- gsf = p->numa_group->faults[task_faults_idx(NUMA_MEM, node, 0)], -- gpf = p->numa_group->faults[task_faults_idx(NUMA_MEM, node, 1)]; -+ if (ng) { -+ gsf = ng->faults[task_faults_idx(NUMA_MEM, node, 0)], -+ gpf = ng->faults[task_faults_idx(NUMA_MEM, node, 1)]; - } - print_numa_stats(m, node, tsf, tpf, gsf, gpf); - } -+ rcu_read_unlock(); - } - #endif /* CONFIG_NUMA_BALANCING */ - #endif /* CONFIG_SCHED_DEBUG */ -diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c -index 80940939b733..de58611b232f 100644 ---- a/kernel/sched/idle.c -+++ b/kernel/sched/idle.c -@@ -225,6 +225,8 @@ static void cpuidle_idle_call(void) - static void do_idle(void) - { - int cpu = smp_processor_id(); -+ bool pending = false; -+ - /* - * If the arch has a polling bit, we maintain an invariant: - * -@@ -235,7 +237,10 @@ static void do_idle(void) - */ - - __current_set_polling(); -- tick_nohz_idle_enter(); -+ if (unlikely(softirq_pending(cpu))) -+ pending = true; -+ else -+ tick_nohz_idle_enter(); - - while (!need_resched()) { - check_pgt_cache(); -@@ -273,7 +278,8 @@ static void do_idle(void) - * an IPI to fold the state for us. - */ - preempt_set_need_resched(); -- tick_nohz_idle_exit(); -+ if (!pending) -+ tick_nohz_idle_exit(); - __current_clr_polling(); - - /* -@@ -354,6 +360,7 @@ void cpu_startup_entry(enum cpuhp_state state) - do_idle(); - } - -+#ifndef CONFIG_SCHED_MUQSS - /* - * idle-task scheduling class. - */ -@@ -466,3 +473,4 @@ const struct sched_class idle_sched_class = { - .switched_to = switched_to_idle, - .update_curr = update_curr_idle, - }; -+#endif /* CONFIG_SCHED_MUQSS */ -diff --git a/kernel/sched/sched-pelt.h b/kernel/sched/sched-pelt.h -index a26473674fb7..c529706bed11 100644 ---- a/kernel/sched/sched-pelt.h -+++ b/kernel/sched/sched-pelt.h -@@ -1,7 +1,7 @@ - /* SPDX-License-Identifier: GPL-2.0 */ - /* Generated by Documentation/scheduler/sched-pelt; do not modify. */ - --static const u32 runnable_avg_yN_inv[] = { -+static const u32 runnable_avg_yN_inv[] __maybe_unused = { - 0xffffffff, 0xfa83b2da, 0xf5257d14, 0xefe4b99a, 0xeac0c6e6, 0xe5b906e6, - 0xe0ccdeeb, 0xdbfbb796, 0xd744fcc9, 0xd2a81d91, 0xce248c14, 0xc9b9bd85, - 0xc5672a10, 0xc12c4cc9, 0xbd08a39e, 0xb8fbaf46, 0xb504f333, 0xb123f581, -diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h -index b52ed1ada0be..d0dbd27db435 100644 ---- a/kernel/sched/sched.h -+++ b/kernel/sched/sched.h -@@ -2,6 +2,19 @@ - /* - * Scheduler internal types and methods: - */ -+#ifdef CONFIG_SCHED_MUQSS -+#include "MuQSS.h" -+ -+/* Begin compatibility wrappers for MuQSS/CFS differences */ -+#define rq_rt_nr_running(rq) ((rq)->rt_nr_running) -+#define rq_h_nr_running(rq) ((rq)->nr_running) -+ -+#else /* CONFIG_SCHED_MUQSS */ -+ -+#define rq_rt_nr_running(rq) ((rq)->rt.rt_nr_running) -+#define rq_h_nr_running(rq) ((rq)->cfs.h_nr_running) -+ -+ - #include - - #include -@@ -2341,3 +2354,30 @@ static inline bool sched_energy_enabled(void) - static inline bool sched_energy_enabled(void) { return false; } - - #endif /* CONFIG_ENERGY_MODEL && CONFIG_CPU_FREQ_GOV_SCHEDUTIL */ -+ -+/* MuQSS compatibility functions */ -+static inline bool softirq_pending(int cpu) -+{ -+ return false; -+} -+ -+#ifdef CONFIG_64BIT -+static inline u64 read_sum_exec_runtime(struct task_struct *t) -+{ -+ return t->se.sum_exec_runtime; -+} -+#else -+static inline u64 read_sum_exec_runtime(struct task_struct *t) -+{ -+ u64 ns; -+ struct rq_flags rf; -+ struct rq *rq; -+ -+ rq = task_rq_lock(t, &rf); -+ ns = t->se.sum_exec_runtime; -+ task_rq_unlock(rq, t, &rf); -+ -+ return ns; -+} -+#endif -+#endif /* CONFIG_SCHED_MUQSS */ -diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c -index f53f89df837d..76dfb1c936ec 100644 ---- a/kernel/sched/topology.c -+++ b/kernel/sched/topology.c -@@ -442,7 +442,11 @@ void rq_attach_root(struct rq *rq, struct root_domain *rd) - struct root_domain *old_rd = NULL; - unsigned long flags; - -+#ifdef CONFIG_SCHED_MUQSS -+ raw_spin_lock_irqsave(rq->lock, flags); -+#else - raw_spin_lock_irqsave(&rq->lock, flags); -+#endif - - if (rq->rd) { - old_rd = rq->rd; -@@ -468,7 +472,11 @@ void rq_attach_root(struct rq *rq, struct root_domain *rd) - if (cpumask_test_cpu(rq->cpu, cpu_active_mask)) - set_rq_online(rq); - -+#ifdef CONFIG_SCHED_MUQSS -+ raw_spin_unlock_irqrestore(rq->lock, flags); -+#else - raw_spin_unlock_irqrestore(&rq->lock, flags); -+#endif - - if (old_rd) - call_rcu(&old_rd->rcu, free_rootdomain); -diff --git a/kernel/signal.c b/kernel/signal.c -index edf8915ddd54..8aad311cbd59 100644 ---- a/kernel/signal.c -+++ b/kernel/signal.c -@@ -1057,27 +1057,6 @@ static inline bool legacy_queue(struct sigpending *signals, int sig) - return (sig < SIGRTMIN) && sigismember(&signals->signal, sig); - } - --#ifdef CONFIG_USER_NS --static inline void userns_fixup_signal_uid(struct kernel_siginfo *info, struct task_struct *t) --{ -- if (current_user_ns() == task_cred_xxx(t, user_ns)) -- return; -- -- if (SI_FROMKERNEL(info)) -- return; -- -- rcu_read_lock(); -- info->si_uid = from_kuid_munged(task_cred_xxx(t, user_ns), -- make_kuid(current_user_ns(), info->si_uid)); -- rcu_read_unlock(); --} --#else --static inline void userns_fixup_signal_uid(struct kernel_siginfo *info, struct task_struct *t) --{ -- return; --} --#endif -- - static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struct *t, - enum pid_type type, int from_ancestor_ns) - { -@@ -1135,7 +1114,11 @@ static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struc - q->info.si_code = SI_USER; - q->info.si_pid = task_tgid_nr_ns(current, - task_active_pid_ns(t)); -- q->info.si_uid = from_kuid_munged(current_user_ns(), current_uid()); -+ rcu_read_lock(); -+ q->info.si_uid = -+ from_kuid_munged(task_cred_xxx(t, user_ns), -+ current_uid()); -+ rcu_read_unlock(); - break; - case (unsigned long) SEND_SIG_PRIV: - clear_siginfo(&q->info); -@@ -1147,13 +1130,8 @@ static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struc - break; - default: - copy_siginfo(&q->info, info); -- if (from_ancestor_ns) -- q->info.si_pid = 0; - break; - } -- -- userns_fixup_signal_uid(&q->info, t); -- - } else if (!is_si_special(info)) { - if (sig >= SIGRTMIN && info->si_code != SI_USER) { - /* -@@ -1197,6 +1175,28 @@ static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struc - return ret; - } - -+static inline bool has_si_pid_and_uid(struct kernel_siginfo *info) -+{ -+ bool ret = false; -+ switch (siginfo_layout(info->si_signo, info->si_code)) { -+ case SIL_KILL: -+ case SIL_CHLD: -+ case SIL_RT: -+ ret = true; -+ break; -+ case SIL_TIMER: -+ case SIL_POLL: -+ case SIL_FAULT: -+ case SIL_FAULT_MCEERR: -+ case SIL_FAULT_BNDERR: -+ case SIL_FAULT_PKUERR: -+ case SIL_SYS: -+ ret = false; -+ break; -+ } -+ return ret; -+} -+ - static int send_signal(int sig, struct kernel_siginfo *info, struct task_struct *t, - enum pid_type type) - { -@@ -1206,7 +1206,20 @@ static int send_signal(int sig, struct kernel_siginfo *info, struct task_struct - from_ancestor_ns = si_fromuser(info) && - !task_pid_nr_ns(current, task_active_pid_ns(t)); - #endif -+ if (!is_si_special(info) && has_si_pid_and_uid(info)) { -+ struct user_namespace *t_user_ns; -+ -+ rcu_read_lock(); -+ t_user_ns = task_cred_xxx(t, user_ns); -+ if (current_user_ns() != t_user_ns) { -+ kuid_t uid = make_kuid(current_user_ns(), info->si_uid); -+ info->si_uid = from_kuid_munged(t_user_ns, uid); -+ } -+ rcu_read_unlock(); - -+ if (!task_pid_nr_ns(current, task_active_pid_ns(t))) -+ info->si_pid = 0; -+ } - return __send_signal(sig, info, t, type, from_ancestor_ns); - } - -@@ -1440,13 +1453,44 @@ static inline bool kill_as_cred_perm(const struct cred *cred, - uid_eq(cred->uid, pcred->uid); - } - --/* like kill_pid_info(), but doesn't use uid/euid of "current" */ --int kill_pid_info_as_cred(int sig, struct kernel_siginfo *info, struct pid *pid, -- const struct cred *cred) -+/* -+ * The usb asyncio usage of siginfo is wrong. The glibc support -+ * for asyncio which uses SI_ASYNCIO assumes the layout is SIL_RT. -+ * AKA after the generic fields: -+ * kernel_pid_t si_pid; -+ * kernel_uid32_t si_uid; -+ * sigval_t si_value; -+ * -+ * Unfortunately when usb generates SI_ASYNCIO it assumes the layout -+ * after the generic fields is: -+ * void __user *si_addr; -+ * -+ * This is a practical problem when there is a 64bit big endian kernel -+ * and a 32bit userspace. As the 32bit address will encoded in the low -+ * 32bits of the pointer. Those low 32bits will be stored at higher -+ * address than appear in a 32 bit pointer. So userspace will not -+ * see the address it was expecting for it's completions. -+ * -+ * There is nothing in the encoding that can allow -+ * copy_siginfo_to_user32 to detect this confusion of formats, so -+ * handle this by requiring the caller of kill_pid_usb_asyncio to -+ * notice when this situration takes place and to store the 32bit -+ * pointer in sival_int, instead of sival_addr of the sigval_t addr -+ * parameter. -+ */ -+int kill_pid_usb_asyncio(int sig, int errno, sigval_t addr, -+ struct pid *pid, const struct cred *cred) - { -- int ret = -EINVAL; -+ struct kernel_siginfo info; - struct task_struct *p; - unsigned long flags; -+ int ret = -EINVAL; -+ -+ clear_siginfo(&info); -+ info.si_signo = sig; -+ info.si_errno = errno; -+ info.si_code = SI_ASYNCIO; -+ *((sigval_t *)&info.si_pid) = addr; - - if (!valid_signal(sig)) - return ret; -@@ -1457,17 +1501,17 @@ int kill_pid_info_as_cred(int sig, struct kernel_siginfo *info, struct pid *pid, - ret = -ESRCH; - goto out_unlock; - } -- if (si_fromuser(info) && !kill_as_cred_perm(cred, p)) { -+ if (!kill_as_cred_perm(cred, p)) { - ret = -EPERM; - goto out_unlock; - } -- ret = security_task_kill(p, info, sig, cred); -+ ret = security_task_kill(p, &info, sig, cred); - if (ret) - goto out_unlock; - - if (sig) { - if (lock_task_sighand(p, &flags)) { -- ret = __send_signal(sig, info, p, PIDTYPE_TGID, 0); -+ ret = __send_signal(sig, &info, p, PIDTYPE_TGID, 0); - unlock_task_sighand(p, &flags); - } else - ret = -ESRCH; -@@ -1476,7 +1520,7 @@ int kill_pid_info_as_cred(int sig, struct kernel_siginfo *info, struct pid *pid, - rcu_read_unlock(); - return ret; - } --EXPORT_SYMBOL_GPL(kill_pid_info_as_cred); -+EXPORT_SYMBOL_GPL(kill_pid_usb_asyncio); - - /* - * kill_something_info() interprets pid in interesting ways just like kill(2). -@@ -4477,6 +4521,28 @@ static inline void siginfo_buildtime_checks(void) - CHECK_OFFSET(si_syscall); - CHECK_OFFSET(si_arch); - #undef CHECK_OFFSET -+ -+ /* usb asyncio */ -+ BUILD_BUG_ON(offsetof(struct siginfo, si_pid) != -+ offsetof(struct siginfo, si_addr)); -+ if (sizeof(int) == sizeof(void __user *)) { -+ BUILD_BUG_ON(sizeof_field(struct siginfo, si_pid) != -+ sizeof(void __user *)); -+ } else { -+ BUILD_BUG_ON((sizeof_field(struct siginfo, si_pid) + -+ sizeof_field(struct siginfo, si_uid)) != -+ sizeof(void __user *)); -+ BUILD_BUG_ON(offsetofend(struct siginfo, si_pid) != -+ offsetof(struct siginfo, si_uid)); -+ } -+#ifdef CONFIG_COMPAT -+ BUILD_BUG_ON(offsetof(struct compat_siginfo, si_pid) != -+ offsetof(struct compat_siginfo, si_addr)); -+ BUILD_BUG_ON(sizeof_field(struct compat_siginfo, si_pid) != -+ sizeof(compat_uptr_t)); -+ BUILD_BUG_ON(sizeof_field(struct compat_siginfo, si_pid) != -+ sizeof_field(struct siginfo, si_pid)); -+#endif - } - - void __init signals_init(void) -diff --git a/kernel/skip_list.c b/kernel/skip_list.c -new file mode 100644 -index 000000000000..bf5c6e97e139 ---- /dev/null -+++ b/kernel/skip_list.c -@@ -0,0 +1,148 @@ -+/* -+ Copyright (C) 2011,2016 Con Kolivas. -+ -+ Code based on example originally by William Pugh. -+ -+Skip Lists are a probabilistic alternative to balanced trees, as -+described in the June 1990 issue of CACM and were invented by -+William Pugh in 1987. -+ -+A couple of comments about this implementation: -+The routine randomLevel has been hard-coded to generate random -+levels using p=0.25. It can be easily changed. -+ -+The insertion routine has been implemented so as to use the -+dirty hack described in the CACM paper: if a random level is -+generated that is more than the current maximum level, the -+current maximum level plus one is used instead. -+ -+Levels start at zero and go up to MaxLevel (which is equal to -+MaxNumberOfLevels-1). -+ -+The routines defined in this file are: -+ -+init: defines slnode -+ -+new_skiplist: returns a new, empty list -+ -+randomLevel: Returns a random level based on a u64 random seed passed to it. -+In MuQSS, the "niffy" time is used for this purpose. -+ -+insert(l,key, value): inserts the binding (key, value) into l. This operation -+occurs in O(log n) time. -+ -+delnode(slnode, l, node): deletes any binding of key from the l based on the -+actual node value. This operation occurs in O(k) time where k is the -+number of levels of the node in question (max 8). The original delete -+function occurred in O(log n) time and involved a search. -+ -+MuQSS Notes: In this implementation of skiplists, there are bidirectional -+next/prev pointers and the insert function returns a pointer to the actual -+node the value is stored. The key here is chosen by the scheduler so as to -+sort tasks according to the priority list requirements and is no longer used -+by the scheduler after insertion. The scheduler lookup, however, occurs in -+O(1) time because it is always the first item in the level 0 linked list. -+Since the task struct stores a copy of the node pointer upon skiplist_insert, -+it can also remove it much faster than the original implementation with the -+aid of prev<->next pointer manipulation and no searching. -+ -+*/ -+ -+#include -+#include -+ -+#define MaxNumberOfLevels 8 -+#define MaxLevel (MaxNumberOfLevels - 1) -+ -+void skiplist_init(skiplist_node *slnode) -+{ -+ int i; -+ -+ slnode->key = 0xFFFFFFFFFFFFFFFF; -+ slnode->level = 0; -+ slnode->value = NULL; -+ for (i = 0; i < MaxNumberOfLevels; i++) -+ slnode->next[i] = slnode->prev[i] = slnode; -+} -+ -+skiplist *new_skiplist(skiplist_node *slnode) -+{ -+ skiplist *l = kzalloc(sizeof(skiplist), GFP_ATOMIC); -+ -+ BUG_ON(!l); -+ l->header = slnode; -+ return l; -+} -+ -+void free_skiplist(skiplist *l) -+{ -+ skiplist_node *p, *q; -+ -+ p = l->header; -+ do { -+ q = p->next[0]; -+ p->next[0]->prev[0] = q->prev[0]; -+ skiplist_node_init(p); -+ p = q; -+ } while (p != l->header); -+ kfree(l); -+} -+ -+void skiplist_node_init(skiplist_node *node) -+{ -+ memset(node, 0, sizeof(skiplist_node)); -+} -+ -+static inline unsigned int randomLevel(const long unsigned int randseed) -+{ -+ return find_first_bit(&randseed, MaxLevel) / 2; -+} -+ -+void skiplist_insert(skiplist *l, skiplist_node *node, keyType key, valueType value, unsigned int randseed) -+{ -+ skiplist_node *update[MaxNumberOfLevels]; -+ skiplist_node *p, *q; -+ int k = l->level; -+ -+ p = l->header; -+ do { -+ while (q = p->next[k], q->key <= key) -+ p = q; -+ update[k] = p; -+ } while (--k >= 0); -+ -+ ++l->entries; -+ k = randomLevel(randseed); -+ if (k > l->level) { -+ k = ++l->level; -+ update[k] = l->header; -+ } -+ -+ node->level = k; -+ node->key = key; -+ node->value = value; -+ do { -+ p = update[k]; -+ node->next[k] = p->next[k]; -+ p->next[k] = node; -+ node->prev[k] = p; -+ node->next[k]->prev[k] = node; -+ } while (--k >= 0); -+} -+ -+void skiplist_delete(skiplist *l, skiplist_node *node) -+{ -+ int k, m = node->level; -+ -+ for (k = 0; k <= m; k++) { -+ node->prev[k]->next[k] = node->next[k]; -+ node->next[k]->prev[k] = node->prev[k]; -+ } -+ skiplist_node_init(node); -+ if (m == l->level) { -+ while (l->header->next[m] == l->header && l->header->prev[m] == l->header && m > 0) -+ m--; -+ l->level = m; -+ } -+ l->entries--; -+} -diff --git a/kernel/stacktrace.c b/kernel/stacktrace.c -index 36139de0a3c4..899b726c9e98 100644 ---- a/kernel/stacktrace.c -+++ b/kernel/stacktrace.c -@@ -226,12 +226,17 @@ unsigned int stack_trace_save_user(unsigned long *store, unsigned int size) - .store = store, - .size = size, - }; -+ mm_segment_t fs; - - /* Trace user stack if not a kernel thread */ - if (!current->mm) - return 0; - -+ fs = get_fs(); -+ set_fs(USER_DS); - arch_stack_walk_user(consume_entry, &c, task_pt_regs(current)); -+ set_fs(fs); -+ - return c.len; - } - #endif -diff --git a/kernel/sysctl.c b/kernel/sysctl.c -index 1beca96fb625..460f9b1d44d7 100644 ---- a/kernel/sysctl.c -+++ b/kernel/sysctl.c -@@ -110,6 +110,9 @@ extern int core_uses_pid; - extern char core_pattern[]; - extern unsigned int core_pipe_limit; - #endif -+#ifdef CONFIG_USER_NS -+extern int unprivileged_userns_clone; -+#endif - extern int pid_max; - extern int pid_max_min, pid_max_max; - extern int percpu_pagelist_fraction; -@@ -135,7 +138,15 @@ static unsigned long one_ul = 1; - static unsigned long long_max = LONG_MAX; - static int one_hundred = 100; - static int one_thousand = 1000; --#ifdef CONFIG_PRINTK -+#ifdef CONFIG_SCHED_MUQSS -+extern int rr_interval; -+extern int sched_interactive; -+extern int sched_iso_cpu; -+extern int sched_yield_type; -+extern int hrtimer_granularity_us; -+extern int hrtimeout_min_us; -+#endif -+#if defined(CONFIG_PRINTK) || defined(CONFIG_SCHED_MUQSS) - static int ten_thousand = 10000; - #endif - #ifdef CONFIG_PERF_EVENTS -@@ -302,7 +313,7 @@ static struct ctl_table sysctl_base_table[] = { - { } - }; - --#ifdef CONFIG_SCHED_DEBUG -+#if defined(CONFIG_SCHED_DEBUG) && !defined(CONFIG_SCHED_MUQSS) - static int min_sched_granularity_ns = 100000; /* 100 usecs */ - static int max_sched_granularity_ns = NSEC_PER_SEC; /* 1 second */ - static int min_wakeup_granularity_ns; /* 0 usecs */ -@@ -319,6 +330,7 @@ static int max_extfrag_threshold = 1000; - #endif - - static struct ctl_table kern_table[] = { -+#ifndef CONFIG_SCHED_MUQSS - { - .procname = "sched_child_runs_first", - .data = &sysctl_sched_child_runs_first, -@@ -484,6 +496,7 @@ static struct ctl_table kern_table[] = { - .extra2 = &one, - }, - #endif -+#endif /* !CONFIG_SCHED_MUQSS */ - #ifdef CONFIG_PROVE_LOCKING - { - .procname = "prove_locking", -@@ -532,6 +545,15 @@ static struct ctl_table kern_table[] = { - .proc_handler = proc_dointvec, - }, - #endif -+#ifdef CONFIG_USER_NS -+ { -+ .procname = "unprivileged_userns_clone", -+ .data = &unprivileged_userns_clone, -+ .maxlen = sizeof(int), -+ .mode = 0644, -+ .proc_handler = proc_dointvec, -+ }, -+#endif - #ifdef CONFIG_PROC_SYSCTL - { - .procname = "tainted", -@@ -1056,6 +1078,62 @@ static struct ctl_table kern_table[] = { - .proc_handler = proc_dointvec, - }, - #endif -+#ifdef CONFIG_SCHED_MUQSS -+ { -+ .procname = "rr_interval", -+ .data = &rr_interval, -+ .maxlen = sizeof (int), -+ .mode = 0644, -+ .proc_handler = &proc_dointvec_minmax, -+ .extra1 = &one, -+ .extra2 = &one_thousand, -+ }, -+ { -+ .procname = "interactive", -+ .data = &sched_interactive, -+ .maxlen = sizeof(int), -+ .mode = 0644, -+ .proc_handler = &proc_dointvec_minmax, -+ .extra1 = &zero, -+ .extra2 = &one, -+ }, -+ { -+ .procname = "iso_cpu", -+ .data = &sched_iso_cpu, -+ .maxlen = sizeof (int), -+ .mode = 0644, -+ .proc_handler = &proc_dointvec_minmax, -+ .extra1 = &zero, -+ .extra2 = &one_hundred, -+ }, -+ { -+ .procname = "yield_type", -+ .data = &sched_yield_type, -+ .maxlen = sizeof (int), -+ .mode = 0644, -+ .proc_handler = &proc_dointvec_minmax, -+ .extra1 = &zero, -+ .extra2 = &two, -+ }, -+ { -+ .procname = "hrtimer_granularity_us", -+ .data = &hrtimer_granularity_us, -+ .maxlen = sizeof(int), -+ .mode = 0644, -+ .proc_handler = &proc_dointvec_minmax, -+ .extra1 = &one, -+ .extra2 = &ten_thousand, -+ }, -+ { -+ .procname = "hrtimeout_min_us", -+ .data = &hrtimeout_min_us, -+ .maxlen = sizeof(int), -+ .mode = 0644, -+ .proc_handler = &proc_dointvec_minmax, -+ .extra1 = &one, -+ .extra2 = &ten_thousand, -+ }, -+#endif - #if defined(CONFIG_S390) && defined(CONFIG_SMP) - { - .procname = "spin_retry", -diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c -index f5490222e134..3b3bf431f14e 100644 ---- a/kernel/time/clockevents.c -+++ b/kernel/time/clockevents.c -@@ -190,8 +190,14 @@ int clockevents_tick_resume(struct clock_event_device *dev) - - #ifdef CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST - -+#ifdef CONFIG_SCHED_MUQSS -+int __read_mostly hrtimer_granularity_us = 100; -+/* Limit min_delta to 100us */ -+#define MIN_DELTA_LIMIT (hrtimer_granularity_us * NSEC_PER_USEC) -+#else - /* Limit min_delta to a jiffie */ - #define MIN_DELTA_LIMIT (NSEC_PER_SEC / HZ) -+#endif - - /** - * clockevents_increase_min_delta - raise minimum delta of a clock event device -diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c -index 41dfff23c1f9..6cffbb50aaf5 100644 ---- a/kernel/time/hrtimer.c -+++ b/kernel/time/hrtimer.c -@@ -2017,3 +2017,119 @@ int __sched schedule_hrtimeout(ktime_t *expires, - return schedule_hrtimeout_range(expires, 0, mode); - } - EXPORT_SYMBOL_GPL(schedule_hrtimeout); -+ -+#ifdef CONFIG_SCHED_MUQSS -+/* -+ * As per schedule_hrtimeout but taskes a millisecond value and returns how -+ * many milliseconds are left. -+ */ -+long __sched schedule_msec_hrtimeout(long timeout) -+{ -+ struct hrtimer_sleeper t; -+ int delta, jiffs; -+ ktime_t expires; -+ -+ if (!timeout) { -+ __set_current_state(TASK_RUNNING); -+ return 0; -+ } -+ -+ jiffs = msecs_to_jiffies(timeout); -+ /* -+ * If regular timer resolution is adequate or hrtimer resolution is not -+ * (yet) better than Hz, as would occur during startup, use regular -+ * timers. -+ */ -+ if (jiffs > 4 || hrtimer_resolution >= NSEC_PER_SEC / HZ || pm_freezing) -+ return schedule_timeout(jiffs); -+ -+ delta = (timeout % 1000) * NSEC_PER_MSEC; -+ expires = ktime_set(0, delta); -+ -+ hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -+ hrtimer_set_expires_range_ns(&t.timer, expires, delta); -+ -+ hrtimer_init_sleeper(&t, current); -+ -+ hrtimer_start_expires(&t.timer, HRTIMER_MODE_REL); -+ -+ if (likely(t.task)) -+ schedule(); -+ -+ hrtimer_cancel(&t.timer); -+ destroy_hrtimer_on_stack(&t.timer); -+ -+ __set_current_state(TASK_RUNNING); -+ -+ expires = hrtimer_expires_remaining(&t.timer); -+ timeout = ktime_to_ms(expires); -+ return timeout < 0 ? 0 : timeout; -+} -+ -+EXPORT_SYMBOL(schedule_msec_hrtimeout); -+ -+#define USECS_PER_SEC 1000000 -+extern int hrtimer_granularity_us; -+ -+static inline long schedule_usec_hrtimeout(long timeout) -+{ -+ struct hrtimer_sleeper t; -+ ktime_t expires; -+ int delta; -+ -+ if (!timeout) { -+ __set_current_state(TASK_RUNNING); -+ return 0; -+ } -+ -+ if (hrtimer_resolution >= NSEC_PER_SEC / HZ) -+ return schedule_timeout(usecs_to_jiffies(timeout)); -+ -+ if (timeout < hrtimer_granularity_us) -+ timeout = hrtimer_granularity_us; -+ delta = (timeout % USECS_PER_SEC) * NSEC_PER_USEC; -+ expires = ktime_set(0, delta); -+ -+ hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); -+ hrtimer_set_expires_range_ns(&t.timer, expires, delta); -+ -+ hrtimer_init_sleeper(&t, current); -+ -+ hrtimer_start_expires(&t.timer, HRTIMER_MODE_REL); -+ -+ if (likely(t.task)) -+ schedule(); -+ -+ hrtimer_cancel(&t.timer); -+ destroy_hrtimer_on_stack(&t.timer); -+ -+ __set_current_state(TASK_RUNNING); -+ -+ expires = hrtimer_expires_remaining(&t.timer); -+ timeout = ktime_to_us(expires); -+ return timeout < 0 ? 0 : timeout; -+} -+ -+int __read_mostly hrtimeout_min_us = 500; -+ -+long __sched schedule_min_hrtimeout(void) -+{ -+ return usecs_to_jiffies(schedule_usec_hrtimeout(hrtimeout_min_us)); -+} -+ -+EXPORT_SYMBOL(schedule_min_hrtimeout); -+ -+long __sched schedule_msec_hrtimeout_interruptible(long timeout) -+{ -+ __set_current_state(TASK_INTERRUPTIBLE); -+ return schedule_msec_hrtimeout(timeout); -+} -+EXPORT_SYMBOL(schedule_msec_hrtimeout_interruptible); -+ -+long __sched schedule_msec_hrtimeout_uninterruptible(long timeout) -+{ -+ __set_current_state(TASK_UNINTERRUPTIBLE); -+ return schedule_msec_hrtimeout(timeout); -+} -+EXPORT_SYMBOL(schedule_msec_hrtimeout_uninterruptible); -+#endif /* CONFIG_SCHED_MUQSS */ -diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c -index 8de4f789dc1b..65eb796610dc 100644 ---- a/kernel/time/ntp.c -+++ b/kernel/time/ntp.c -@@ -43,6 +43,7 @@ static u64 tick_length_base; - #define MAX_TICKADJ 500LL /* usecs */ - #define MAX_TICKADJ_SCALED \ - (((MAX_TICKADJ * NSEC_PER_USEC) << NTP_SCALE_SHIFT) / NTP_INTERVAL_FREQ) -+#define MAX_TAI_OFFSET 100000 - - /* - * phase-lock loop variables -@@ -691,7 +692,8 @@ static inline void process_adjtimex_modes(const struct __kernel_timex *txc, - time_constant = max(time_constant, 0l); - } - -- if (txc->modes & ADJ_TAI && txc->constant >= 0) -+ if (txc->modes & ADJ_TAI && -+ txc->constant >= 0 && txc->constant <= MAX_TAI_OFFSET) - *time_tai = txc->constant; - - if (txc->modes & ADJ_OFFSET) -diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c -index 0a426f4e3125..bdd0a5c1811e 100644 ---- a/kernel/time/posix-cpu-timers.c -+++ b/kernel/time/posix-cpu-timers.c -@@ -829,7 +829,7 @@ static void check_thread_timers(struct task_struct *tsk, - tsk_expires->virt_exp = expires; - - tsk_expires->sched_exp = check_timers_list(++timers, firing, -- tsk->se.sum_exec_runtime); -+ tsk_seruntime(tsk)); - - /* - * Check for the special case thread timers. -@@ -839,7 +839,7 @@ static void check_thread_timers(struct task_struct *tsk, - unsigned long hard = task_rlimit_max(tsk, RLIMIT_RTTIME); - - if (hard != RLIM_INFINITY && -- tsk->rt.timeout > DIV_ROUND_UP(hard, USEC_PER_SEC/HZ)) { -+ tsk_rttimeout(tsk) > DIV_ROUND_UP(hard, USEC_PER_SEC/HZ)) { - /* - * At the hard limit, we just die. - * No need to calculate anything else now. -@@ -851,7 +851,7 @@ static void check_thread_timers(struct task_struct *tsk, - __group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk); - return; - } -- if (tsk->rt.timeout > DIV_ROUND_UP(soft, USEC_PER_SEC/HZ)) { -+ if (tsk_rttimeout(tsk) > DIV_ROUND_UP(soft, USEC_PER_SEC/HZ)) { - /* - * At the soft limit, send a SIGXCPU every second. - */ -@@ -1091,7 +1091,7 @@ static inline int fastpath_timer_check(struct task_struct *tsk) - struct task_cputime task_sample; - - task_cputime(tsk, &task_sample.utime, &task_sample.stime); -- task_sample.sum_exec_runtime = tsk->se.sum_exec_runtime; -+ task_sample.sum_exec_runtime = tsk_seruntime(tsk); - if (task_cputime_expired(&task_sample, &tsk->cputime_expires)) - return 1; - } -diff --git a/kernel/time/timer.c b/kernel/time/timer.c -index 343c7ba33b1c..1f5009f69da1 100644 ---- a/kernel/time/timer.c -+++ b/kernel/time/timer.c -@@ -43,6 +43,7 @@ - #include - #include - #include -+#include - - #include - #include -@@ -1482,7 +1483,7 @@ static unsigned long __next_timer_interrupt(struct timer_base *base) - * Check, if the next hrtimer event is before the next timer wheel - * event: - */ --static u64 cmp_next_hrtimer_event(u64 basem, u64 expires) -+static u64 cmp_next_hrtimer_event(struct timer_base *base, u64 basem, u64 expires) - { - u64 nextevt = hrtimer_get_next_event(); - -@@ -1500,6 +1501,11 @@ static u64 cmp_next_hrtimer_event(u64 basem, u64 expires) - if (nextevt <= basem) - return basem; - -+#ifdef CONFIG_SCHED_MUQSS -+ if (nextevt < expires && nextevt - basem <= TICK_NSEC) -+ base->is_idle = false; -+#endif -+ - /* - * Round up to the next jiffie. High resolution timers are - * off, so the hrtimers are expired in the tick and we need to -@@ -1569,7 +1575,7 @@ u64 get_next_timer_interrupt(unsigned long basej, u64 basem) - } - raw_spin_unlock(&base->lock); - -- return cmp_next_hrtimer_event(basem, expires); -+ return cmp_next_hrtimer_event(base, basem, expires); - } - - /** -@@ -1801,6 +1807,18 @@ signed long __sched schedule_timeout(signed long timeout) - - expire = timeout + jiffies; - -+#if defined(CONFIG_HIGH_RES_TIMERS) && defined(CONFIG_SCHED_MUQSS) -+ if (timeout == 1 && hrtimer_resolution < NSEC_PER_SEC / HZ) { -+ /* -+ * Special case 1 as being a request for the minimum timeout -+ * and use highres timers to timeout after 1ms to workaround -+ * the granularity of low Hz tick timers. -+ */ -+ if (!schedule_min_hrtimeout()) -+ return 0; -+ goto out_timeout; -+ } -+#endif - timer.task = current; - timer_setup_on_stack(&timer.timer, process_timeout, 0); - __mod_timer(&timer.timer, expire, 0); -@@ -1810,6 +1828,7 @@ signed long __sched schedule_timeout(signed long timeout) - /* Remove the timer from the object tracker */ - destroy_timer_on_stack(&timer.timer); - -+out_timeout: - timeout = expire - jiffies; - - out: -@@ -1955,6 +1974,18 @@ void msleep(unsigned int msecs) - { - unsigned long timeout = msecs_to_jiffies(msecs) + 1; - -+#ifdef CONFIG_SCHED_MUQSS -+ /* -+ * Use high resolution timers where the resolution of tick based -+ * timers is inadequate. -+ */ -+ if (timeout < 6 && hrtimer_resolution < NSEC_PER_SEC / HZ && !pm_freezing) { -+ while (msecs) -+ msecs = schedule_msec_hrtimeout_uninterruptible(msecs); -+ return; -+ } -+#endif -+ - while (timeout) - timeout = schedule_timeout_uninterruptible(timeout); - } -@@ -1969,6 +2000,14 @@ unsigned long msleep_interruptible(unsigned int msecs) - { - unsigned long timeout = msecs_to_jiffies(msecs) + 1; - -+#ifdef CONFIG_SCHED_MUQSS -+ if (timeout < 6 && hrtimer_resolution < NSEC_PER_SEC / HZ && !pm_freezing) { -+ while (msecs && !signal_pending(current)) -+ msecs = schedule_msec_hrtimeout_interruptible(msecs); -+ return msecs; -+ } -+#endif -+ - while (timeout && !signal_pending(current)) - timeout = schedule_timeout_interruptible(timeout); - return jiffies_to_msecs(timeout); -diff --git a/kernel/time/timer_list.c b/kernel/time/timer_list.c -index 98ba50dcb1b2..acb326f5f50a 100644 ---- a/kernel/time/timer_list.c -+++ b/kernel/time/timer_list.c -@@ -282,23 +282,6 @@ static inline void timer_list_header(struct seq_file *m, u64 now) - SEQ_printf(m, "\n"); - } - --static int timer_list_show(struct seq_file *m, void *v) --{ -- struct timer_list_iter *iter = v; -- -- if (iter->cpu == -1 && !iter->second_pass) -- timer_list_header(m, iter->now); -- else if (!iter->second_pass) -- print_cpu(m, iter->cpu, iter->now); --#ifdef CONFIG_GENERIC_CLOCKEVENTS -- else if (iter->cpu == -1 && iter->second_pass) -- timer_list_show_tickdevices_header(m); -- else -- print_tickdevice(m, tick_get_device(iter->cpu), iter->cpu); --#endif -- return 0; --} -- - void sysrq_timer_list_show(void) - { - u64 now = ktime_to_ns(ktime_get()); -@@ -317,6 +300,24 @@ void sysrq_timer_list_show(void) - return; - } - -+#ifdef CONFIG_PROC_FS -+static int timer_list_show(struct seq_file *m, void *v) -+{ -+ struct timer_list_iter *iter = v; -+ -+ if (iter->cpu == -1 && !iter->second_pass) -+ timer_list_header(m, iter->now); -+ else if (!iter->second_pass) -+ print_cpu(m, iter->cpu, iter->now); -+#ifdef CONFIG_GENERIC_CLOCKEVENTS -+ else if (iter->cpu == -1 && iter->second_pass) -+ timer_list_show_tickdevices_header(m); -+ else -+ print_tickdevice(m, tick_get_device(iter->cpu), iter->cpu); -+#endif -+ return 0; -+} -+ - static void *move_iter(struct timer_list_iter *iter, loff_t offset) - { - for (; offset; offset--) { -@@ -376,3 +377,4 @@ static int __init init_timer_list_procfs(void) - return 0; - } - __initcall(init_timer_list_procfs); -+#endif -diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c -index 576c41644e77..208220d526e8 100644 ---- a/kernel/trace/ftrace.c -+++ b/kernel/trace/ftrace.c -@@ -1622,6 +1622,11 @@ static bool test_rec_ops_needs_regs(struct dyn_ftrace *rec) - return keep_regs; - } - -+static struct ftrace_ops * -+ftrace_find_tramp_ops_any(struct dyn_ftrace *rec); -+static struct ftrace_ops * -+ftrace_find_tramp_ops_next(struct dyn_ftrace *rec, struct ftrace_ops *ops); -+ - static bool __ftrace_hash_rec_update(struct ftrace_ops *ops, - int filter_hash, - bool inc) -@@ -1750,15 +1755,17 @@ static bool __ftrace_hash_rec_update(struct ftrace_ops *ops, - } - - /* -- * If the rec had TRAMP enabled, then it needs to -- * be cleared. As TRAMP can only be enabled iff -- * there is only a single ops attached to it. -- * In otherwords, always disable it on decrementing. -- * In the future, we may set it if rec count is -- * decremented to one, and the ops that is left -- * has a trampoline. -+ * The TRAMP needs to be set only if rec count -+ * is decremented to one, and the ops that is -+ * left has a trampoline. As TRAMP can only be -+ * enabled if there is only a single ops attached -+ * to it. - */ -- rec->flags &= ~FTRACE_FL_TRAMP; -+ if (ftrace_rec_count(rec) == 1 && -+ ftrace_find_tramp_ops_any(rec)) -+ rec->flags |= FTRACE_FL_TRAMP; -+ else -+ rec->flags &= ~FTRACE_FL_TRAMP; - - /* - * flags will be cleared in ftrace_check_record() -@@ -1951,11 +1958,6 @@ static void print_ip_ins(const char *fmt, const unsigned char *p) - printk(KERN_CONT "%s%02x", i ? ":" : "", p[i]); - } - --static struct ftrace_ops * --ftrace_find_tramp_ops_any(struct dyn_ftrace *rec); --static struct ftrace_ops * --ftrace_find_tramp_ops_next(struct dyn_ftrace *rec, struct ftrace_ops *ops); -- - enum ftrace_bug_type ftrace_bug_type; - const void *ftrace_expected; - -diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c -index 69ebf3c2f1b5..78af97163147 100644 ---- a/kernel/trace/trace_functions_graph.c -+++ b/kernel/trace/trace_functions_graph.c -@@ -137,6 +137,13 @@ int trace_graph_entry(struct ftrace_graph_ent *trace) - if (trace_recursion_test(TRACE_GRAPH_NOTRACE_BIT)) - return 0; - -+ /* -+ * Do not trace a function if it's filtered by set_graph_notrace. -+ * Make the index of ret stack negative to indicate that it should -+ * ignore further functions. But it needs its own ret stack entry -+ * to recover the original index in order to continue tracing after -+ * returning from the function. -+ */ - if (ftrace_graph_notrace_addr(trace->func)) { - trace_recursion_set(TRACE_GRAPH_NOTRACE_BIT); - /* -@@ -155,16 +162,6 @@ int trace_graph_entry(struct ftrace_graph_ent *trace) - if (ftrace_graph_ignore_irqs()) - return 0; - -- /* -- * Do not trace a function if it's filtered by set_graph_notrace. -- * Make the index of ret stack negative to indicate that it should -- * ignore further functions. But it needs its own ret stack entry -- * to recover the original index in order to continue tracing after -- * returning from the function. -- */ -- if (ftrace_graph_notrace_addr(trace->func)) -- return 1; -- - /* - * Stop here if tracing_threshold is set. We only write function return - * events to the ring buffer. -diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c -index ba751f993c3b..cab4a5398f1d 100644 ---- a/kernel/trace/trace_output.c -+++ b/kernel/trace/trace_output.c -@@ -1109,17 +1109,10 @@ static enum print_line_t trace_user_stack_print(struct trace_iterator *iter, - for (i = 0; i < FTRACE_STACK_ENTRIES; i++) { - unsigned long ip = field->caller[i]; - -- if (ip == ULONG_MAX || trace_seq_has_overflowed(s)) -+ if (!ip || trace_seq_has_overflowed(s)) - break; - - trace_seq_puts(s, " => "); -- -- if (!ip) { -- trace_seq_puts(s, "??"); -- trace_seq_putc(s, '\n'); -- continue; -- } -- - seq_print_user_ip(s, mm, ip, flags); - trace_seq_putc(s, '\n'); - } -diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c -index 69ee8ef12cee..6edb01f2fd81 100644 ---- a/kernel/trace/trace_selftest.c -+++ b/kernel/trace/trace_selftest.c -@@ -1048,10 +1048,15 @@ static int trace_wakeup_test_thread(void *data) - { - /* Make this a -deadline thread */ - static const struct sched_attr attr = { -+#ifdef CONFIG_SCHED_MUQSS -+ /* No deadline on MuQSS, use RR */ -+ .sched_policy = SCHED_RR, -+#else - .sched_policy = SCHED_DEADLINE, - .sched_runtime = 100000ULL, - .sched_deadline = 10000000ULL, - .sched_period = 10000000ULL -+#endif - }; - struct wakeup_test_data *x = data; - -diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c -index 0eff45ce7703..aa27ecacfb1e 100644 ---- a/kernel/user_namespace.c -+++ b/kernel/user_namespace.c -@@ -21,6 +21,13 @@ - #include - #include - -+/* sysctl */ -+#ifdef CONFIG_USER_NS_UNPRIVILEGED -+int unprivileged_userns_clone = 1; -+#else -+int unprivileged_userns_clone; -+#endif -+ - static struct kmem_cache *user_ns_cachep __read_mostly; - static DEFINE_MUTEX(userns_state_mutex); - -diff --git a/lib/Makefile b/lib/Makefile -index fb7697031a79..7c3c1ad21afc 100644 ---- a/lib/Makefile -+++ b/lib/Makefile -@@ -278,7 +278,8 @@ obj-$(CONFIG_UCS2_STRING) += ucs2_string.o - obj-$(CONFIG_UBSAN) += ubsan.o - - UBSAN_SANITIZE_ubsan.o := n --CFLAGS_ubsan.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) -+KASAN_SANITIZE_ubsan.o := n -+CFLAGS_ubsan.o := $(call cc-option, -fno-stack-protector) $(DISABLE_STACKLEAK_PLUGIN) - - obj-$(CONFIG_SBITMAP) += sbitmap.o - -diff --git a/lib/ioremap.c b/lib/ioremap.c -index 063213685563..a95161d9c883 100644 ---- a/lib/ioremap.c -+++ b/lib/ioremap.c -@@ -86,6 +86,9 @@ static int ioremap_try_huge_pmd(pmd_t *pmd, unsigned long addr, - if ((end - addr) != PMD_SIZE) - return 0; - -+ if (!IS_ALIGNED(addr, PMD_SIZE)) -+ return 0; -+ - if (!IS_ALIGNED(phys_addr, PMD_SIZE)) - return 0; - -@@ -126,6 +129,9 @@ static int ioremap_try_huge_pud(pud_t *pud, unsigned long addr, - if ((end - addr) != PUD_SIZE) - return 0; - -+ if (!IS_ALIGNED(addr, PUD_SIZE)) -+ return 0; -+ - if (!IS_ALIGNED(phys_addr, PUD_SIZE)) - return 0; - -@@ -166,6 +172,9 @@ static int ioremap_try_huge_p4d(p4d_t *p4d, unsigned long addr, - if ((end - addr) != P4D_SIZE) - return 0; - -+ if (!IS_ALIGNED(addr, P4D_SIZE)) -+ return 0; -+ - if (!IS_ALIGNED(phys_addr, P4D_SIZE)) - return 0; - -diff --git a/lib/reed_solomon/decode_rs.c b/lib/reed_solomon/decode_rs.c -index 1db74eb098d0..121beb2f0930 100644 ---- a/lib/reed_solomon/decode_rs.c -+++ b/lib/reed_solomon/decode_rs.c -@@ -42,8 +42,18 @@ - BUG_ON(pad < 0 || pad >= nn); - - /* Does the caller provide the syndrome ? */ -- if (s != NULL) -- goto decode; -+ if (s != NULL) { -+ for (i = 0; i < nroots; i++) { -+ /* The syndrome is in index form, -+ * so nn represents zero -+ */ -+ if (s[i] != nn) -+ goto decode; -+ } -+ -+ /* syndrome is zero, no errors to correct */ -+ return 0; -+ } - - /* form the syndromes; i.e., evaluate data(x) at roots of - * g(x) */ -@@ -99,9 +109,9 @@ - if (no_eras > 0) { - /* Init lambda to be the erasure locator polynomial */ - lambda[1] = alpha_to[rs_modnn(rs, -- prim * (nn - 1 - eras_pos[0]))]; -+ prim * (nn - 1 - (eras_pos[0] + pad)))]; - for (i = 1; i < no_eras; i++) { -- u = rs_modnn(rs, prim * (nn - 1 - eras_pos[i])); -+ u = rs_modnn(rs, prim * (nn - 1 - (eras_pos[i] + pad))); - for (j = i + 1; j > 0; j--) { - tmp = index_of[lambda[j - 1]]; - if (tmp != nn) { -diff --git a/lib/scatterlist.c b/lib/scatterlist.c -index 2882d9ba6607..eacb82468437 100644 ---- a/lib/scatterlist.c -+++ b/lib/scatterlist.c -@@ -676,17 +676,18 @@ static bool sg_miter_get_next_page(struct sg_mapping_iter *miter) - { - if (!miter->__remaining) { - struct scatterlist *sg; -- unsigned long pgoffset; - - if (!__sg_page_iter_next(&miter->piter)) - return false; - - sg = miter->piter.sg; -- pgoffset = miter->piter.sg_pgoffset; - -- miter->__offset = pgoffset ? 0 : sg->offset; -+ miter->__offset = miter->piter.sg_pgoffset ? 0 : sg->offset; -+ miter->piter.sg_pgoffset += miter->__offset >> PAGE_SHIFT; -+ miter->__offset &= PAGE_SIZE - 1; - miter->__remaining = sg->offset + sg->length - -- (pgoffset << PAGE_SHIFT) - miter->__offset; -+ (miter->piter.sg_pgoffset << PAGE_SHIFT) - -+ miter->__offset; - miter->__remaining = min_t(unsigned long, miter->__remaining, - PAGE_SIZE - miter->__offset); - } -diff --git a/lib/test_overflow.c b/lib/test_overflow.c -index fc680562d8b6..7a4b6f6c5473 100644 ---- a/lib/test_overflow.c -+++ b/lib/test_overflow.c -@@ -486,16 +486,17 @@ static int __init test_overflow_shift(void) - * Deal with the various forms of allocator arguments. See comments above - * the DEFINE_TEST_ALLOC() instances for mapping of the "bits". - */ --#define alloc010(alloc, arg, sz) alloc(sz, GFP_KERNEL) --#define alloc011(alloc, arg, sz) alloc(sz, GFP_KERNEL, NUMA_NO_NODE) -+#define alloc_GFP (GFP_KERNEL | __GFP_NOWARN) -+#define alloc010(alloc, arg, sz) alloc(sz, alloc_GFP) -+#define alloc011(alloc, arg, sz) alloc(sz, alloc_GFP, NUMA_NO_NODE) - #define alloc000(alloc, arg, sz) alloc(sz) - #define alloc001(alloc, arg, sz) alloc(sz, NUMA_NO_NODE) --#define alloc110(alloc, arg, sz) alloc(arg, sz, GFP_KERNEL) -+#define alloc110(alloc, arg, sz) alloc(arg, sz, alloc_GFP) - #define free0(free, arg, ptr) free(ptr) - #define free1(free, arg, ptr) free(arg, ptr) - --/* Wrap around to 8K */ --#define TEST_SIZE (9 << PAGE_SHIFT) -+/* Wrap around to 16K */ -+#define TEST_SIZE (5 * 4096) - - #define DEFINE_TEST_ALLOC(func, free_func, want_arg, want_gfp, want_node)\ - static int __init test_ ## func (void *arg) \ -diff --git a/lib/test_string.c b/lib/test_string.c -index bf8def01ed20..b5117ae59693 100644 ---- a/lib/test_string.c -+++ b/lib/test_string.c -@@ -36,7 +36,7 @@ static __init int memset16_selftest(void) - fail: - kfree(p); - if (i < 256) -- return (i << 24) | (j << 16) | k; -+ return (i << 24) | (j << 16) | k | 0x8000; - return 0; - } - -@@ -72,7 +72,7 @@ static __init int memset32_selftest(void) - fail: - kfree(p); - if (i < 256) -- return (i << 24) | (j << 16) | k; -+ return (i << 24) | (j << 16) | k | 0x8000; - return 0; - } - -@@ -108,7 +108,7 @@ static __init int memset64_selftest(void) - fail: - kfree(p); - if (i < 256) -- return (i << 24) | (j << 16) | k; -+ return (i << 24) | (j << 16) | k | 0x8000; - return 0; - } - -diff --git a/mm/Kconfig b/mm/Kconfig -index f0c76ba47695..e028ed47861e 100644 ---- a/mm/Kconfig -+++ b/mm/Kconfig -@@ -529,8 +529,10 @@ config MEM_SOFT_DIRTY - config ZSWAP - bool "Compressed cache for swap pages (EXPERIMENTAL)" - depends on FRONTSWAP && CRYPTO=y -- select CRYPTO_LZO -+ select CRYPTO_LZO if !ZEN_INTERACTIVE - select ZPOOL -+ select CRYPTO_LZ4 if ZEN_INTERACTIVE -+ select Z3FOLD if ZEN_INTERACTIVE - help - A lightweight compressed cache for swap pages. It takes - pages that are in the process of being swapped out and attempts to -diff --git a/mm/cma.c b/mm/cma.c -index 3340ef34c154..4973d253dc83 100644 ---- a/mm/cma.c -+++ b/mm/cma.c -@@ -278,6 +278,12 @@ int __init cma_declare_contiguous(phys_addr_t base, - */ - alignment = max(alignment, (phys_addr_t)PAGE_SIZE << - max_t(unsigned long, MAX_ORDER - 1, pageblock_order)); -+ if (fixed && base & (alignment - 1)) { -+ ret = -EINVAL; -+ pr_err("Region at %pa must be aligned to %pa bytes\n", -+ &base, &alignment); -+ goto err; -+ } - base = ALIGN(base, alignment); - size = ALIGN(size, alignment); - limit &= ~(alignment - 1); -@@ -308,6 +314,13 @@ int __init cma_declare_contiguous(phys_addr_t base, - if (limit == 0 || limit > memblock_end) - limit = memblock_end; - -+ if (base + size > limit) { -+ ret = -EINVAL; -+ pr_err("Size (%pa) of region at %pa exceeds limit (%pa)\n", -+ &size, &base, &limit); -+ goto err; -+ } -+ - /* Reserve memory */ - if (fixed) { - if (memblock_is_region_reserved(base, size) || -diff --git a/mm/compaction.c b/mm/compaction.c -index 9e1b9acb116b..952dc2fb24e5 100644 ---- a/mm/compaction.c -+++ b/mm/compaction.c -@@ -842,13 +842,15 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, - - /* - * Periodically drop the lock (if held) regardless of its -- * contention, to give chance to IRQs. Abort async compaction -- * if contended. -+ * contention, to give chance to IRQs. Abort completely if -+ * a fatal signal is pending. - */ - if (!(low_pfn % SWAP_CLUSTER_MAX) - && compact_unlock_should_abort(&pgdat->lru_lock, -- flags, &locked, cc)) -- break; -+ flags, &locked, cc)) { -+ low_pfn = 0; -+ goto fatal_pending; -+ } - - if (!pfn_valid_within(low_pfn)) - goto isolate_fail; -@@ -1060,6 +1062,7 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, - trace_mm_compaction_isolate_migratepages(start_pfn, low_pfn, - nr_scanned, nr_isolated); - -+fatal_pending: - cc->total_migrate_scanned += nr_scanned; - if (nr_isolated) - count_compact_events(COMPACTISOLATED, nr_isolated); -diff --git a/mm/filemap.c b/mm/filemap.c -index 6dd9a2274c80..861e26ee4c72 100644 ---- a/mm/filemap.c -+++ b/mm/filemap.c -@@ -549,6 +549,28 @@ int filemap_fdatawait_range(struct address_space *mapping, loff_t start_byte, - } - EXPORT_SYMBOL(filemap_fdatawait_range); - -+/** -+ * filemap_fdatawait_range_keep_errors - wait for writeback to complete -+ * @mapping: address space structure to wait for -+ * @start_byte: offset in bytes where the range starts -+ * @end_byte: offset in bytes where the range ends (inclusive) -+ * -+ * Walk the list of under-writeback pages of the given address space in the -+ * given range and wait for all of them. Unlike filemap_fdatawait_range(), -+ * this function does not clear error status of the address space. -+ * -+ * Use this function if callers don't handle errors themselves. Expected -+ * call sites are system-wide / filesystem-wide data flushers: e.g. sync(2), -+ * fsfreeze(8) -+ */ -+int filemap_fdatawait_range_keep_errors(struct address_space *mapping, -+ loff_t start_byte, loff_t end_byte) -+{ -+ __filemap_fdatawait_range(mapping, start_byte, end_byte); -+ return filemap_check_and_keep_errors(mapping); -+} -+EXPORT_SYMBOL(filemap_fdatawait_range_keep_errors); -+ - /** - * file_fdatawait_range - wait for writeback to complete - * @file: file pointing to address space structure to wait for -diff --git a/mm/gup.c b/mm/gup.c -index ddde097cf9e4..d2c14fc4b5d4 100644 ---- a/mm/gup.c -+++ b/mm/gup.c -@@ -585,11 +585,14 @@ static int get_gate_page(struct mm_struct *mm, unsigned long address, - pgd = pgd_offset_k(address); - else - pgd = pgd_offset_gate(mm, address); -- BUG_ON(pgd_none(*pgd)); -+ if (pgd_none(*pgd)) -+ return -EFAULT; - p4d = p4d_offset(pgd, address); -- BUG_ON(p4d_none(*p4d)); -+ if (p4d_none(*p4d)) -+ return -EFAULT; - pud = pud_offset(p4d, address); -- BUG_ON(pud_none(*pud)); -+ if (pud_none(*pud)) -+ return -EFAULT; - pmd = pmd_offset(pud, address); - if (!pmd_present(*pmd)) - return -EFAULT; -@@ -1696,7 +1699,8 @@ static inline pte_t gup_get_pte(pte_t *ptep) - } - #endif - --static void undo_dev_pagemap(int *nr, int nr_start, struct page **pages) -+static void __maybe_unused undo_dev_pagemap(int *nr, int nr_start, -+ struct page **pages) - { - while ((*nr) - nr_start) { - struct page *page = pages[--(*nr)]; -diff --git a/mm/hmm.c b/mm/hmm.c -index f702a3895d05..4c405dfbd2b3 100644 ---- a/mm/hmm.c -+++ b/mm/hmm.c -@@ -104,6 +104,11 @@ static struct hmm *hmm_get_or_create(struct mm_struct *mm) - return NULL; - } - -+static void hmm_free_rcu(struct rcu_head *rcu) -+{ -+ kfree(container_of(rcu, struct hmm, rcu)); -+} -+ - static void hmm_free(struct kref *kref) - { - struct hmm *hmm = container_of(kref, struct hmm, kref); -@@ -116,7 +121,7 @@ static void hmm_free(struct kref *kref) - mm->hmm = NULL; - spin_unlock(&mm->page_table_lock); - -- kfree(hmm); -+ mmu_notifier_call_srcu(&hmm->rcu, hmm_free_rcu); - } - - static inline void hmm_put(struct hmm *hmm) -@@ -144,10 +149,14 @@ void hmm_mm_destroy(struct mm_struct *mm) - - static void hmm_release(struct mmu_notifier *mn, struct mm_struct *mm) - { -- struct hmm *hmm = mm_get_hmm(mm); -+ struct hmm *hmm = container_of(mn, struct hmm, mmu_notifier); - struct hmm_mirror *mirror; - struct hmm_range *range; - -+ /* Bail out if hmm is in the process of being freed */ -+ if (!kref_get_unless_zero(&hmm->kref)) -+ return; -+ - /* Report this HMM as dying. */ - hmm->dead = true; - -@@ -185,13 +194,14 @@ static void hmm_release(struct mmu_notifier *mn, struct mm_struct *mm) - static int hmm_invalidate_range_start(struct mmu_notifier *mn, - const struct mmu_notifier_range *nrange) - { -- struct hmm *hmm = mm_get_hmm(nrange->mm); -+ struct hmm *hmm = container_of(mn, struct hmm, mmu_notifier); - struct hmm_mirror *mirror; - struct hmm_update update; - struct hmm_range *range; - int ret = 0; - -- VM_BUG_ON(!hmm); -+ if (!kref_get_unless_zero(&hmm->kref)) -+ return 0; - - update.start = nrange->start; - update.end = nrange->end; -@@ -239,9 +249,10 @@ static int hmm_invalidate_range_start(struct mmu_notifier *mn, - static void hmm_invalidate_range_end(struct mmu_notifier *mn, - const struct mmu_notifier_range *nrange) - { -- struct hmm *hmm = mm_get_hmm(nrange->mm); -+ struct hmm *hmm = container_of(mn, struct hmm, mmu_notifier); - -- VM_BUG_ON(!hmm); -+ if (!kref_get_unless_zero(&hmm->kref)) -+ return; - - mutex_lock(&hmm->lock); - hmm->notifiers--; -diff --git a/mm/huge_memory.c b/mm/huge_memory.c -index 885642c82aaa..e93fbb66b4d5 100644 ---- a/mm/huge_memory.c -+++ b/mm/huge_memory.c -@@ -52,7 +52,11 @@ unsigned long transparent_hugepage_flags __read_mostly = - #ifdef CONFIG_TRANSPARENT_HUGEPAGE_MADVISE - (1<pid = 0; - strncpy(object->comm, "hardirq", sizeof(object->comm)); -- } else if (in_softirq()) { -+ } else if (in_serving_softirq()) { - object->pid = 0; - strncpy(object->comm, "softirq", sizeof(object->comm)); - } else { -diff --git a/mm/memcontrol.c b/mm/memcontrol.c -index ba9138a4a1de..902d020aa70e 100644 ---- a/mm/memcontrol.c -+++ b/mm/memcontrol.c -@@ -691,12 +691,15 @@ void __mod_memcg_state(struct mem_cgroup *memcg, int idx, int val) - if (mem_cgroup_disabled()) - return; - -- __this_cpu_add(memcg->vmstats_local->stat[idx], val); -- - x = val + __this_cpu_read(memcg->vmstats_percpu->stat[idx]); - if (unlikely(abs(x) > MEMCG_CHARGE_BATCH)) { - struct mem_cgroup *mi; - -+ /* -+ * Batch local counters to keep them in sync with -+ * the hierarchical ones. -+ */ -+ __this_cpu_add(memcg->vmstats_local->stat[idx], x); - for (mi = memcg; mi; mi = parent_mem_cgroup(mi)) - atomic_long_add(x, &mi->vmstats[idx]); - x = 0; -@@ -745,13 +748,15 @@ void __mod_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx, - /* Update memcg */ - __mod_memcg_state(memcg, idx, val); - -- /* Update lruvec */ -- __this_cpu_add(pn->lruvec_stat_local->count[idx], val); -- - x = val + __this_cpu_read(pn->lruvec_stat_cpu->count[idx]); - if (unlikely(abs(x) > MEMCG_CHARGE_BATCH)) { - struct mem_cgroup_per_node *pi; - -+ /* -+ * Batch local counters to keep them in sync with -+ * the hierarchical ones. -+ */ -+ __this_cpu_add(pn->lruvec_stat_local->count[idx], x); - for (pi = pn; pi; pi = parent_nodeinfo(pi, pgdat->node_id)) - atomic_long_add(x, &pi->lruvec_stat[idx]); - x = 0; -@@ -773,12 +778,15 @@ void __count_memcg_events(struct mem_cgroup *memcg, enum vm_event_item idx, - if (mem_cgroup_disabled()) - return; - -- __this_cpu_add(memcg->vmstats_local->events[idx], count); -- - x = count + __this_cpu_read(memcg->vmstats_percpu->events[idx]); - if (unlikely(x > MEMCG_CHARGE_BATCH)) { - struct mem_cgroup *mi; - -+ /* -+ * Batch local counters to keep them in sync with -+ * the hierarchical ones. -+ */ -+ __this_cpu_add(memcg->vmstats_local->events[idx], x); - for (mi = memcg; mi; mi = parent_mem_cgroup(mi)) - atomic_long_add(x, &mi->vmevents[idx]); - x = 0; -@@ -3530,12 +3538,13 @@ static int memcg_stat_show(struct seq_file *m, void *v) - if (memcg1_stats[i] == MEMCG_SWAP && !do_memsw_account()) - continue; - seq_printf(m, "total_%s %llu\n", memcg1_stat_names[i], -- (u64)memcg_page_state(memcg, i) * PAGE_SIZE); -+ (u64)memcg_page_state(memcg, memcg1_stats[i]) * -+ PAGE_SIZE); - } - - for (i = 0; i < ARRAY_SIZE(memcg1_events); i++) - seq_printf(m, "total_%s %llu\n", memcg1_event_names[i], -- (u64)memcg_events(memcg, i)); -+ (u64)memcg_events(memcg, memcg1_events[i])); - - for (i = 0; i < NR_LRU_LISTS; i++) - seq_printf(m, "total_%s %llu\n", mem_cgroup_lru_names[i], -diff --git a/mm/memory.c b/mm/memory.c -index ddf20bd0c317..b0efc69b2634 100644 ---- a/mm/memory.c -+++ b/mm/memory.c -@@ -2807,7 +2807,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) - struct swap_info_struct *si = swp_swap_info(entry); - - if (si->flags & SWP_SYNCHRONOUS_IO && -- __swap_count(si, entry) == 1) { -+ __swap_count(entry) == 1) { - /* skip swapcache */ - page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, - vmf->address); -@@ -4349,7 +4349,9 @@ int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, - void *old_buf = buf; - int write = gup_flags & FOLL_WRITE; - -- down_read(&mm->mmap_sem); -+ if (down_read_killable(&mm->mmap_sem)) -+ return 0; -+ - /* ignore errors, just check how much was successfully transferred */ - while (len) { - int bytes, ret, offset; -diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c -index e096c987d261..77d1f69cdead 100644 ---- a/mm/memory_hotplug.c -+++ b/mm/memory_hotplug.c -@@ -1736,9 +1736,10 @@ static int check_memblock_offlined_cb(struct memory_block *mem, void *arg) - endpa = PFN_PHYS(section_nr_to_pfn(mem->end_section_nr + 1))-1; - pr_warn("removing memory fails, because memory [%pa-%pa] is onlined\n", - &beginpa, &endpa); -- } - -- return ret; -+ return -EBUSY; -+ } -+ return 0; - } - - static int check_cpu_on_node(pg_data_t *pgdat) -@@ -1821,19 +1822,9 @@ static void __release_memory_resource(resource_size_t start, - } - } - --/** -- * remove_memory -- * @nid: the node ID -- * @start: physical address of the region to remove -- * @size: size of the region to remove -- * -- * NOTE: The caller must call lock_device_hotplug() to serialize hotplug -- * and online/offline operations before this call, as required by -- * try_offline_node(). -- */ --void __ref __remove_memory(int nid, u64 start, u64 size) -+static int __ref try_remove_memory(int nid, u64 start, u64 size) - { -- int ret; -+ int rc = 0; - - BUG_ON(check_hotplug_memory_range(start, size)); - -@@ -1841,13 +1832,13 @@ void __ref __remove_memory(int nid, u64 start, u64 size) - - /* - * All memory blocks must be offlined before removing memory. Check -- * whether all memory blocks in question are offline and trigger a BUG() -+ * whether all memory blocks in question are offline and return error - * if this is not the case. - */ -- ret = walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), NULL, -- check_memblock_offlined_cb); -- if (ret) -- BUG(); -+ rc = walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), NULL, -+ check_memblock_offlined_cb); -+ if (rc) -+ goto done; - - /* remove memmap entry */ - firmware_map_remove(start, start + size, "System RAM"); -@@ -1859,14 +1850,45 @@ void __ref __remove_memory(int nid, u64 start, u64 size) - - try_offline_node(nid); - -+done: - mem_hotplug_done(); -+ return rc; - } - --void remove_memory(int nid, u64 start, u64 size) -+/** -+ * remove_memory -+ * @nid: the node ID -+ * @start: physical address of the region to remove -+ * @size: size of the region to remove -+ * -+ * NOTE: The caller must call lock_device_hotplug() to serialize hotplug -+ * and online/offline operations before this call, as required by -+ * try_offline_node(). -+ */ -+void __remove_memory(int nid, u64 start, u64 size) -+{ -+ -+ /* -+ * trigger BUG() is some memory is not offlined prior to calling this -+ * function -+ */ -+ if (try_remove_memory(nid, start, size)) -+ BUG(); -+} -+ -+/* -+ * Remove memory if every memory block is offline, otherwise return -EBUSY is -+ * some memory is not offline -+ */ -+int remove_memory(int nid, u64 start, u64 size) - { -+ int rc; -+ - lock_device_hotplug(); -- __remove_memory(nid, start, size); -+ rc = try_remove_memory(nid, start, size); - unlock_device_hotplug(); -+ -+ return rc; - } - EXPORT_SYMBOL_GPL(remove_memory); - #endif /* CONFIG_MEMORY_HOTREMOVE */ -diff --git a/mm/migrate.c b/mm/migrate.c -index e9594bc0d406..dbb3b5bee4ee 100644 ---- a/mm/migrate.c -+++ b/mm/migrate.c -@@ -771,12 +771,12 @@ static int __buffer_migrate_page(struct address_space *mapping, - } - bh = bh->b_this_page; - } while (bh != head); -- spin_unlock(&mapping->private_lock); - if (busy) { - if (invalidated) { - rc = -EAGAIN; - goto unlock_buffers; - } -+ spin_unlock(&mapping->private_lock); - invalidate_bh_lrus(); - invalidated = true; - goto recheck_buffers; -@@ -809,6 +809,8 @@ static int __buffer_migrate_page(struct address_space *mapping, - - rc = MIGRATEPAGE_SUCCESS; - unlock_buffers: -+ if (check_refs) -+ spin_unlock(&mapping->private_lock); - bh = head; - do { - unlock_buffer(bh); -@@ -2345,16 +2347,13 @@ static int migrate_vma_collect_pmd(pmd_t *pmdp, - static void migrate_vma_collect(struct migrate_vma *migrate) - { - struct mmu_notifier_range range; -- struct mm_walk mm_walk; -- -- mm_walk.pmd_entry = migrate_vma_collect_pmd; -- mm_walk.pte_entry = NULL; -- mm_walk.pte_hole = migrate_vma_collect_hole; -- mm_walk.hugetlb_entry = NULL; -- mm_walk.test_walk = NULL; -- mm_walk.vma = migrate->vma; -- mm_walk.mm = migrate->vma->vm_mm; -- mm_walk.private = migrate; -+ struct mm_walk mm_walk = { -+ .pmd_entry = migrate_vma_collect_pmd, -+ .pte_hole = migrate_vma_collect_hole, -+ .vma = migrate->vma, -+ .mm = migrate->vma->vm_mm, -+ .private = migrate, -+ }; - - mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, NULL, mm_walk.mm, - migrate->start, -diff --git a/mm/mincore.c b/mm/mincore.c -index c3f058bd0faf..4fe91d497436 100644 ---- a/mm/mincore.c -+++ b/mm/mincore.c -@@ -68,8 +68,16 @@ static unsigned char mincore_page(struct address_space *mapping, pgoff_t pgoff) - */ - if (xa_is_value(page)) { - swp_entry_t swp = radix_to_swp_entry(page); -- page = find_get_page(swap_address_space(swp), -- swp_offset(swp)); -+ struct swap_info_struct *si; -+ -+ /* Prevent swap device to being swapoff under us */ -+ si = get_swap_device(swp); -+ if (si) { -+ page = find_get_page(swap_address_space(swp), -+ swp_offset(swp)); -+ put_swap_device(si); -+ } else -+ page = NULL; - } - } else - page = find_get_page(mapping, pgoff); -diff --git a/mm/mmu_notifier.c b/mm/mmu_notifier.c -index 513b9607409d..b5670620aea0 100644 ---- a/mm/mmu_notifier.c -+++ b/mm/mmu_notifier.c -@@ -274,7 +274,7 @@ static int do_mmu_notifier_register(struct mmu_notifier *mn, - * thanks to mm_take_all_locks(). - */ - spin_lock(&mm->mmu_notifier_mm->lock); -- hlist_add_head(&mn->hlist, &mm->mmu_notifier_mm->list); -+ hlist_add_head_rcu(&mn->hlist, &mm->mmu_notifier_mm->list); - spin_unlock(&mm->mmu_notifier_mm->lock); - - mm_drop_all_locks(mm); -diff --git a/mm/nommu.c b/mm/nommu.c -index d8c02fbe03b5..b2823519f8cd 100644 ---- a/mm/nommu.c -+++ b/mm/nommu.c -@@ -1792,7 +1792,8 @@ int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, - struct vm_area_struct *vma; - int write = gup_flags & FOLL_WRITE; - -- down_read(&mm->mmap_sem); -+ if (down_read_killable(&mm->mmap_sem)) -+ return 0; - - /* the access must start within one of the target process's mappings */ - vma = find_vma(mm, addr); -diff --git a/mm/page-writeback.c b/mm/page-writeback.c -index bdbe8b6b1225..a64eb88c0b83 100644 ---- a/mm/page-writeback.c -+++ b/mm/page-writeback.c -@@ -71,7 +71,11 @@ static long ratelimit_pages = 32; - /* - * Start background writeback (via writeback threads) at this percentage - */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+int dirty_background_ratio = 20; -+#else - int dirty_background_ratio = 10; -+#endif - - /* - * dirty_background_bytes starts at 0 (disabled) so that it is a function of -@@ -88,7 +92,11 @@ int vm_highmem_is_dirtyable; - /* - * The generator of dirty data starts writeback at this percentage - */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+int vm_dirty_ratio = 50; -+#else - int vm_dirty_ratio = 20; -+#endif - - /* - * vm_dirty_bytes starts at 0 (disabled) so that it is a function of -diff --git a/mm/slab_common.c b/mm/slab_common.c -index 58251ba63e4a..cbd3411f644e 100644 ---- a/mm/slab_common.c -+++ b/mm/slab_common.c -@@ -1003,7 +1003,8 @@ struct kmem_cache *__init create_kmalloc_cache(const char *name, - } - - struct kmem_cache * --kmalloc_caches[NR_KMALLOC_TYPES][KMALLOC_SHIFT_HIGH + 1] __ro_after_init; -+kmalloc_caches[NR_KMALLOC_TYPES][KMALLOC_SHIFT_HIGH + 1] __ro_after_init = -+{ /* initialization for https://bugs.llvm.org/show_bug.cgi?id=42570 */ }; - EXPORT_SYMBOL(kmalloc_caches); - - /* -diff --git a/mm/swap.c b/mm/swap.c -index 7ede3eddc12a..607c48229a1d 100644 ---- a/mm/swap.c -+++ b/mm/swap.c -@@ -740,15 +740,20 @@ void release_pages(struct page **pages, int nr) - if (is_huge_zero_page(page)) - continue; - -- /* Device public page can not be huge page */ -- if (is_device_public_page(page)) { -+ if (is_zone_device_page(page)) { - if (locked_pgdat) { - spin_unlock_irqrestore(&locked_pgdat->lru_lock, - flags); - locked_pgdat = NULL; - } -- put_devmap_managed_page(page); -- continue; -+ /* -+ * ZONE_DEVICE pages that return 'false' from -+ * put_devmap_managed_page() do not require special -+ * processing, and instead, expect a call to -+ * put_page_testzero(). -+ */ -+ if (put_devmap_managed_page(page)) -+ continue; - } - - page = compound_head(page); -diff --git a/mm/swap_state.c b/mm/swap_state.c -index 85245fdec8d9..61453f1faf72 100644 ---- a/mm/swap_state.c -+++ b/mm/swap_state.c -@@ -310,8 +310,13 @@ struct page *lookup_swap_cache(swp_entry_t entry, struct vm_area_struct *vma, - unsigned long addr) - { - struct page *page; -+ struct swap_info_struct *si; - -+ si = get_swap_device(entry); -+ if (!si) -+ return NULL; - page = find_get_page(swap_address_space(entry), swp_offset(entry)); -+ put_swap_device(si); - - INC_CACHE_INFO(find_total); - if (page) { -@@ -354,8 +359,8 @@ struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, - struct vm_area_struct *vma, unsigned long addr, - bool *new_page_allocated) - { -- struct page *found_page, *new_page = NULL; -- struct address_space *swapper_space = swap_address_space(entry); -+ struct page *found_page = NULL, *new_page = NULL; -+ struct swap_info_struct *si; - int err; - *new_page_allocated = false; - -@@ -365,7 +370,12 @@ struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, - * called after lookup_swap_cache() failed, re-calling - * that would confuse statistics. - */ -- found_page = find_get_page(swapper_space, swp_offset(entry)); -+ si = get_swap_device(entry); -+ if (!si) -+ break; -+ found_page = find_get_page(swap_address_space(entry), -+ swp_offset(entry)); -+ put_swap_device(si); - if (found_page) - break; - -diff --git a/mm/swapfile.c b/mm/swapfile.c -index 596ac98051c5..dbab16ddefa6 100644 ---- a/mm/swapfile.c -+++ b/mm/swapfile.c -@@ -1079,12 +1079,11 @@ swp_entry_t get_swap_page_of_type(int type) - static struct swap_info_struct *__swap_info_get(swp_entry_t entry) - { - struct swap_info_struct *p; -- unsigned long offset, type; -+ unsigned long offset; - - if (!entry.val) - goto out; -- type = swp_type(entry); -- p = swap_type_to_swap_info(type); -+ p = swp_swap_info(entry); - if (!p) - goto bad_nofile; - if (!(p->flags & SWP_USED)) -@@ -1187,6 +1186,69 @@ static unsigned char __swap_entry_free_locked(struct swap_info_struct *p, - return usage; - } - -+/* -+ * Check whether swap entry is valid in the swap device. If so, -+ * return pointer to swap_info_struct, and keep the swap entry valid -+ * via preventing the swap device from being swapoff, until -+ * put_swap_device() is called. Otherwise return NULL. -+ * -+ * The entirety of the RCU read critical section must come before the -+ * return from or after the call to synchronize_rcu() in -+ * enable_swap_info() or swapoff(). So if "si->flags & SWP_VALID" is -+ * true, the si->map, si->cluster_info, etc. must be valid in the -+ * critical section. -+ * -+ * Notice that swapoff or swapoff+swapon can still happen before the -+ * rcu_read_lock() in get_swap_device() or after the rcu_read_unlock() -+ * in put_swap_device() if there isn't any other way to prevent -+ * swapoff, such as page lock, page table lock, etc. The caller must -+ * be prepared for that. For example, the following situation is -+ * possible. -+ * -+ * CPU1 CPU2 -+ * do_swap_page() -+ * ... swapoff+swapon -+ * __read_swap_cache_async() -+ * swapcache_prepare() -+ * __swap_duplicate() -+ * // check swap_map -+ * // verify PTE not changed -+ * -+ * In __swap_duplicate(), the swap_map need to be checked before -+ * changing partly because the specified swap entry may be for another -+ * swap device which has been swapoff. And in do_swap_page(), after -+ * the page is read from the swap device, the PTE is verified not -+ * changed with the page table locked to check whether the swap device -+ * has been swapoff or swapoff+swapon. -+ */ -+struct swap_info_struct *get_swap_device(swp_entry_t entry) -+{ -+ struct swap_info_struct *si; -+ unsigned long offset; -+ -+ if (!entry.val) -+ goto out; -+ si = swp_swap_info(entry); -+ if (!si) -+ goto bad_nofile; -+ -+ rcu_read_lock(); -+ if (!(si->flags & SWP_VALID)) -+ goto unlock_out; -+ offset = swp_offset(entry); -+ if (offset >= si->max) -+ goto unlock_out; -+ -+ return si; -+bad_nofile: -+ pr_err("%s: %s%08lx\n", __func__, Bad_file, entry.val); -+out: -+ return NULL; -+unlock_out: -+ rcu_read_unlock(); -+ return NULL; -+} -+ - static unsigned char __swap_entry_free(struct swap_info_struct *p, - swp_entry_t entry, unsigned char usage) - { -@@ -1358,11 +1420,18 @@ int page_swapcount(struct page *page) - return count; - } - --int __swap_count(struct swap_info_struct *si, swp_entry_t entry) -+int __swap_count(swp_entry_t entry) - { -+ struct swap_info_struct *si; - pgoff_t offset = swp_offset(entry); -+ int count = 0; - -- return swap_count(si->swap_map[offset]); -+ si = get_swap_device(entry); -+ if (si) { -+ count = swap_count(si->swap_map[offset]); -+ put_swap_device(si); -+ } -+ return count; - } - - static int swap_swapcount(struct swap_info_struct *si, swp_entry_t entry) -@@ -1387,9 +1456,11 @@ int __swp_swapcount(swp_entry_t entry) - int count = 0; - struct swap_info_struct *si; - -- si = __swap_info_get(entry); -- if (si) -+ si = get_swap_device(entry); -+ if (si) { - count = swap_swapcount(si, entry); -+ put_swap_device(si); -+ } - return count; - } - -@@ -2335,9 +2406,9 @@ static int swap_node(struct swap_info_struct *p) - return bdev ? bdev->bd_disk->node_id : NUMA_NO_NODE; - } - --static void _enable_swap_info(struct swap_info_struct *p, int prio, -- unsigned char *swap_map, -- struct swap_cluster_info *cluster_info) -+static void setup_swap_info(struct swap_info_struct *p, int prio, -+ unsigned char *swap_map, -+ struct swap_cluster_info *cluster_info) - { - int i; - -@@ -2362,7 +2433,11 @@ static void _enable_swap_info(struct swap_info_struct *p, int prio, - } - p->swap_map = swap_map; - p->cluster_info = cluster_info; -- p->flags |= SWP_WRITEOK; -+} -+ -+static void _enable_swap_info(struct swap_info_struct *p) -+{ -+ p->flags |= SWP_WRITEOK | SWP_VALID; - atomic_long_add(p->pages, &nr_swap_pages); - total_swap_pages += p->pages; - -@@ -2389,7 +2464,17 @@ static void enable_swap_info(struct swap_info_struct *p, int prio, - frontswap_init(p->type, frontswap_map); - spin_lock(&swap_lock); - spin_lock(&p->lock); -- _enable_swap_info(p, prio, swap_map, cluster_info); -+ setup_swap_info(p, prio, swap_map, cluster_info); -+ spin_unlock(&p->lock); -+ spin_unlock(&swap_lock); -+ /* -+ * Guarantee swap_map, cluster_info, etc. fields are valid -+ * between get/put_swap_device() if SWP_VALID bit is set -+ */ -+ synchronize_rcu(); -+ spin_lock(&swap_lock); -+ spin_lock(&p->lock); -+ _enable_swap_info(p); - spin_unlock(&p->lock); - spin_unlock(&swap_lock); - } -@@ -2398,7 +2483,8 @@ static void reinsert_swap_info(struct swap_info_struct *p) - { - spin_lock(&swap_lock); - spin_lock(&p->lock); -- _enable_swap_info(p, p->prio, p->swap_map, p->cluster_info); -+ setup_swap_info(p, p->prio, p->swap_map, p->cluster_info); -+ _enable_swap_info(p); - spin_unlock(&p->lock); - spin_unlock(&swap_lock); - } -@@ -2501,6 +2587,17 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile) - - reenable_swap_slots_cache_unlock(); - -+ spin_lock(&swap_lock); -+ spin_lock(&p->lock); -+ p->flags &= ~SWP_VALID; /* mark swap device as invalid */ -+ spin_unlock(&p->lock); -+ spin_unlock(&swap_lock); -+ /* -+ * wait for swap operations protected by get/put_swap_device() -+ * to complete -+ */ -+ synchronize_rcu(); -+ - flush_work(&p->discard_work); - - destroy_swap_extents(p); -@@ -3265,17 +3362,11 @@ static int __swap_duplicate(swp_entry_t entry, unsigned char usage) - unsigned char has_cache; - int err = -EINVAL; - -- if (non_swap_entry(entry)) -- goto out; -- -- p = swp_swap_info(entry); -+ p = get_swap_device(entry); - if (!p) -- goto bad_file; -- -- offset = swp_offset(entry); -- if (unlikely(offset >= p->max)) - goto out; - -+ offset = swp_offset(entry); - ci = lock_cluster_or_swap_info(p, offset); - - count = p->swap_map[offset]; -@@ -3321,11 +3412,9 @@ static int __swap_duplicate(swp_entry_t entry, unsigned char usage) - unlock_out: - unlock_cluster_or_swap_info(p, ci); - out: -+ if (p) -+ put_swap_device(p); - return err; -- --bad_file: -- pr_err("swap_dup: %s%08lx\n", Bad_file, entry.val); -- goto out; - } - - /* -@@ -3417,6 +3506,7 @@ int add_swap_count_continuation(swp_entry_t entry, gfp_t gfp_mask) - struct page *list_page; - pgoff_t offset; - unsigned char count; -+ int ret = 0; - - /* - * When debugging, it's easier to use __GFP_ZERO here; but it's better -@@ -3424,15 +3514,15 @@ int add_swap_count_continuation(swp_entry_t entry, gfp_t gfp_mask) - */ - page = alloc_page(gfp_mask | __GFP_HIGHMEM); - -- si = swap_info_get(entry); -+ si = get_swap_device(entry); - if (!si) { - /* - * An acceptable race has occurred since the failing -- * __swap_duplicate(): the swap entry has been freed, -- * perhaps even the whole swap_map cleared for swapoff. -+ * __swap_duplicate(): the swap device may be swapoff - */ - goto outer; - } -+ spin_lock(&si->lock); - - offset = swp_offset(entry); - -@@ -3450,9 +3540,8 @@ int add_swap_count_continuation(swp_entry_t entry, gfp_t gfp_mask) - } - - if (!page) { -- unlock_cluster(ci); -- spin_unlock(&si->lock); -- return -ENOMEM; -+ ret = -ENOMEM; -+ goto out; - } - - /* -@@ -3504,10 +3593,11 @@ int add_swap_count_continuation(swp_entry_t entry, gfp_t gfp_mask) - out: - unlock_cluster(ci); - spin_unlock(&si->lock); -+ put_swap_device(si); - outer: - if (page) - __free_page(page); -- return 0; -+ return ret; - } - - /* -diff --git a/mm/vmalloc.c b/mm/vmalloc.c -index 0f76cca32a1c..080d30408ce3 100644 ---- a/mm/vmalloc.c -+++ b/mm/vmalloc.c -@@ -1213,6 +1213,12 @@ static bool __purge_vmap_area_lazy(unsigned long start, unsigned long end) - if (unlikely(valist == NULL)) - return false; - -+ /* -+ * First make sure the mappings are removed from all page-tables -+ * before they are freed. -+ */ -+ vmalloc_sync_all(); -+ - /* - * TODO: to calculate a flush range without looping. - * The list can be up to lazy_max_pages() elements. -@@ -3001,6 +3007,9 @@ EXPORT_SYMBOL(remap_vmalloc_range); - /* - * Implement a stub for vmalloc_sync_all() if the architecture chose not to - * have one. -+ * -+ * The purpose of this function is to make sure the vmalloc area -+ * mappings are identical in all page-tables in the system. - */ - void __weak vmalloc_sync_all(void) - { -diff --git a/mm/vmscan.c b/mm/vmscan.c -index 910e02c793ff..4ebf20152328 100644 ---- a/mm/vmscan.c -+++ b/mm/vmscan.c -@@ -684,7 +684,14 @@ static unsigned long shrink_slab(gfp_t gfp_mask, int nid, - unsigned long ret, freed = 0; - struct shrinker *shrinker; - -- if (!mem_cgroup_is_root(memcg)) -+ /* -+ * The root memcg might be allocated even though memcg is disabled -+ * via "cgroup_disable=memory" boot parameter. This could make -+ * mem_cgroup_is_root() return false, then just run memcg slab -+ * shrink, but skip global shrink. This may result in premature -+ * oom. -+ */ -+ if (!mem_cgroup_disabled() && !mem_cgroup_is_root(memcg)) - return shrink_slab_memcg(gfp_mask, nid, memcg, priority); - - if (!down_read_trylock(&shrinker_rwsem)) -@@ -2125,7 +2132,7 @@ static void shrink_active_list(unsigned long nr_to_scan, - * 10TB 320 32GB - */ - static bool inactive_list_is_low(struct lruvec *lruvec, bool file, -- struct scan_control *sc, bool actual_reclaim) -+ struct scan_control *sc, bool trace) - { - enum lru_list active_lru = file * LRU_FILE + LRU_ACTIVE; - struct pglist_data *pgdat = lruvec_pgdat(lruvec); -@@ -2151,7 +2158,7 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file, - * rid of the stale workingset quickly. - */ - refaults = lruvec_page_state_local(lruvec, WORKINGSET_ACTIVATE); -- if (file && actual_reclaim && lruvec->refaults != refaults) { -+ if (file && lruvec->refaults != refaults) { - inactive_ratio = 0; - } else { - gb = (inactive + active) >> (30 - PAGE_SHIFT); -@@ -2161,7 +2168,7 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file, - inactive_ratio = 1; - } - -- if (actual_reclaim) -+ if (trace) - trace_mm_vmscan_inactive_list_is_low(pgdat->node_id, sc->reclaim_idx, - lruvec_lru_size(lruvec, inactive_lru, MAX_NR_ZONES), inactive, - lruvec_lru_size(lruvec, active_lru, MAX_NR_ZONES), active, -diff --git a/mm/z3fold.c b/mm/z3fold.c -index 985732c8b025..3b27094dc42e 100644 ---- a/mm/z3fold.c -+++ b/mm/z3fold.c -@@ -101,6 +101,7 @@ struct z3fold_buddy_slots { - * @refcount: reference count for the z3fold page - * @work: work_struct for page layout optimization - * @slots: pointer to the structure holding buddy slots -+ * @pool: pointer to the containing pool - * @cpu: CPU which this page "belongs" to - * @first_chunks: the size of the first buddy in chunks, 0 if free - * @middle_chunks: the size of the middle buddy in chunks, 0 if free -@@ -114,6 +115,7 @@ struct z3fold_header { - struct kref refcount; - struct work_struct work; - struct z3fold_buddy_slots *slots; -+ struct z3fold_pool *pool; - short cpu; - unsigned short first_chunks; - unsigned short middle_chunks; -@@ -320,6 +322,7 @@ static struct z3fold_header *init_z3fold_page(struct page *page, - zhdr->start_middle = 0; - zhdr->cpu = -1; - zhdr->slots = slots; -+ zhdr->pool = pool; - INIT_LIST_HEAD(&zhdr->buddy); - INIT_WORK(&zhdr->work, compact_page_work); - return zhdr; -@@ -426,7 +429,7 @@ static enum buddy handle_to_buddy(unsigned long handle) - - static inline struct z3fold_pool *zhdr_to_pool(struct z3fold_header *zhdr) - { -- return slots_to_pool(zhdr->slots); -+ return zhdr->pool; - } - - static void __release_z3fold_page(struct z3fold_header *zhdr, bool locked) -@@ -924,7 +927,16 @@ static int z3fold_alloc(struct z3fold_pool *pool, size_t size, gfp_t gfp, - set_bit(PAGE_HEADLESS, &page->private); - goto headless; - } -- __SetPageMovable(page, pool->inode->i_mapping); -+ if (can_sleep) { -+ lock_page(page); -+ __SetPageMovable(page, pool->inode->i_mapping); -+ unlock_page(page); -+ } else { -+ if (trylock_page(page)) { -+ __SetPageMovable(page, pool->inode->i_mapping); -+ unlock_page(page); -+ } -+ } - z3fold_page_lock(zhdr); - - found: -@@ -1331,6 +1343,7 @@ static int z3fold_page_migrate(struct address_space *mapping, struct page *newpa - - VM_BUG_ON_PAGE(!PageMovable(page), page); - VM_BUG_ON_PAGE(!PageIsolated(page), page); -+ VM_BUG_ON_PAGE(!PageLocked(newpage), newpage); - - zhdr = page_address(page); - pool = zhdr_to_pool(zhdr); -@@ -1347,12 +1360,22 @@ static int z3fold_page_migrate(struct address_space *mapping, struct page *newpa - unlock_page(page); - return -EBUSY; - } -+ if (work_pending(&zhdr->work)) { -+ z3fold_page_unlock(zhdr); -+ return -EAGAIN; -+ } - new_zhdr = page_address(newpage); - memcpy(new_zhdr, zhdr, PAGE_SIZE); - newpage->private = page->private; - page->private = 0; - z3fold_page_unlock(zhdr); - spin_lock_init(&new_zhdr->page_lock); -+ INIT_WORK(&new_zhdr->work, compact_page_work); -+ /* -+ * z3fold_page_isolate() ensures that new_zhdr->buddy is empty, -+ * so we only have to reinitialize it. -+ */ -+ INIT_LIST_HEAD(&new_zhdr->buddy); - new_mapping = page_mapping(page); - __ClearPageMovable(page); - ClearPagePrivate(page); -diff --git a/mm/zswap.c b/mm/zswap.c -index 2412042f5550..ca9682f1a66a 100644 ---- a/mm/zswap.c -+++ b/mm/zswap.c -@@ -72,7 +72,11 @@ static u64 zswap_duplicate_entry; - #define ZSWAP_PARAM_UNSET "" - - /* Enable/disable zswap (disabled by default) */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+static bool zswap_enabled = true; -+#else - static bool zswap_enabled; -+#endif - static int zswap_enabled_param_set(const char *, - const struct kernel_param *); - static struct kernel_param_ops zswap_enabled_param_ops = { -@@ -82,7 +86,11 @@ static struct kernel_param_ops zswap_enabled_param_ops = { - module_param_cb(enabled, &zswap_enabled_param_ops, &zswap_enabled, 0644); - - /* Crypto compressor to use */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+#define ZSWAP_COMPRESSOR_DEFAULT "lz4" -+#else - #define ZSWAP_COMPRESSOR_DEFAULT "lzo" -+#endif - static char *zswap_compressor = ZSWAP_COMPRESSOR_DEFAULT; - static int zswap_compressor_param_set(const char *, - const struct kernel_param *); -@@ -95,7 +103,11 @@ module_param_cb(compressor, &zswap_compressor_param_ops, - &zswap_compressor, 0644); - - /* Compressed storage zpool to use */ -+#ifdef CONFIG_ZEN_INTERACTIVE -+#define ZSWAP_ZPOOL_DEFAULT "z3fold" -+#else - #define ZSWAP_ZPOOL_DEFAULT "zbud" -+#endif - static char *zswap_zpool_type = ZSWAP_ZPOOL_DEFAULT; - static int zswap_zpool_param_set(const char *, const struct kernel_param *); - static struct kernel_param_ops zswap_zpool_param_ops = { -diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c -index 549938af02e7..a3cd90a74012 100644 ---- a/net/9p/trans_virtio.c -+++ b/net/9p/trans_virtio.c -@@ -767,10 +767,16 @@ static struct p9_trans_module p9_virtio_trans = { - /* The standard init function */ - static int __init p9_virtio_init(void) - { -+ int rc; -+ - INIT_LIST_HEAD(&virtio_chan_list); - - v9fs_register_trans(&p9_virtio_trans); -- return register_virtio_driver(&p9_virtio_drv); -+ rc = register_virtio_driver(&p9_virtio_drv); -+ if (rc) -+ v9fs_unregister_trans(&p9_virtio_trans); -+ -+ return rc; - } - - static void __exit p9_virtio_cleanup(void) -diff --git a/net/9p/trans_xen.c b/net/9p/trans_xen.c -index 29420ebb8f07..3963eb11c3fb 100644 ---- a/net/9p/trans_xen.c -+++ b/net/9p/trans_xen.c -@@ -530,13 +530,19 @@ static struct xenbus_driver xen_9pfs_front_driver = { - - static int p9_trans_xen_init(void) - { -+ int rc; -+ - if (!xen_domain()) - return -ENODEV; - - pr_info("Initialising Xen transport for 9pfs\n"); - - v9fs_register_trans(&p9_xen_trans); -- return xenbus_register_frontend(&xen_9pfs_front_driver); -+ rc = xenbus_register_frontend(&xen_9pfs_front_driver); -+ if (rc) -+ v9fs_unregister_trans(&p9_xen_trans); -+ -+ return rc; - } - module_init(p9_trans_xen_init); - -diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c -index bd4138ddf7e0..240ed70912d6 100644 ---- a/net/batman-adv/bat_iv_ogm.c -+++ b/net/batman-adv/bat_iv_ogm.c -@@ -2337,7 +2337,7 @@ batadv_iv_ogm_neigh_is_sob(struct batadv_neigh_node *neigh1, - return ret; - } - --static void batadv_iv_iface_activate(struct batadv_hard_iface *hard_iface) -+static void batadv_iv_iface_enabled(struct batadv_hard_iface *hard_iface) - { - /* begin scheduling originator messages on that interface */ - batadv_iv_ogm_schedule(hard_iface); -@@ -2683,8 +2683,8 @@ static void batadv_iv_gw_dump(struct sk_buff *msg, struct netlink_callback *cb, - static struct batadv_algo_ops batadv_batman_iv __read_mostly = { - .name = "BATMAN_IV", - .iface = { -- .activate = batadv_iv_iface_activate, - .enable = batadv_iv_ogm_iface_enable, -+ .enabled = batadv_iv_iface_enabled, - .disable = batadv_iv_ogm_iface_disable, - .update_mac = batadv_iv_ogm_iface_update_mac, - .primary_set = batadv_iv_ogm_primary_iface_set, -diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c -index 79d1731b8306..3719cfd026f0 100644 ---- a/net/batman-adv/hard-interface.c -+++ b/net/batman-adv/hard-interface.c -@@ -795,6 +795,9 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface, - - batadv_hardif_recalc_extra_skbroom(soft_iface); - -+ if (bat_priv->algo_ops->iface.enabled) -+ bat_priv->algo_ops->iface.enabled(hard_iface); -+ - out: - return 0; - -diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c -index 1ddfd5e011ee..8a482c5ec67b 100644 ---- a/net/batman-adv/translation-table.c -+++ b/net/batman-adv/translation-table.c -@@ -3813,6 +3813,8 @@ static void batadv_tt_purge(struct work_struct *work) - */ - void batadv_tt_free(struct batadv_priv *bat_priv) - { -+ batadv_tvlv_handler_unregister(bat_priv, BATADV_TVLV_ROAM, 1); -+ - batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_TT, 1); - batadv_tvlv_handler_unregister(bat_priv, BATADV_TVLV_TT, 1); - -diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h -index 74b644738a36..e0b25104cbfa 100644 ---- a/net/batman-adv/types.h -+++ b/net/batman-adv/types.h -@@ -2129,6 +2129,9 @@ struct batadv_algo_iface_ops { - /** @enable: init routing info when hard-interface is enabled */ - int (*enable)(struct batadv_hard_iface *hard_iface); - -+ /** @enabled: notification when hard-interface was enabled (optional) */ -+ void (*enabled)(struct batadv_hard_iface *hard_iface); -+ - /** @disable: de-init routing info when hard-interface is disabled */ - void (*disable)(struct batadv_hard_iface *hard_iface); - -diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c -index 1555b0c6f7ec..9001bf331d56 100644 ---- a/net/bluetooth/6lowpan.c -+++ b/net/bluetooth/6lowpan.c -@@ -180,10 +180,16 @@ static inline struct lowpan_peer *peer_lookup_dst(struct lowpan_btle_dev *dev, - } - - if (!rt) { -- nexthop = &lowpan_cb(skb)->gw; -- -- if (ipv6_addr_any(nexthop)) -- return NULL; -+ if (ipv6_addr_any(&lowpan_cb(skb)->gw)) { -+ /* There is neither route nor gateway, -+ * probably the destination is a direct peer. -+ */ -+ nexthop = daddr; -+ } else { -+ /* There is a known gateway -+ */ -+ nexthop = &lowpan_cb(skb)->gw; -+ } - } else { - nexthop = rt6_nexthop(rt, daddr); - -diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c -index 9e4fcf406d9c..17c50a98e7f7 100644 ---- a/net/bluetooth/hci_event.c -+++ b/net/bluetooth/hci_event.c -@@ -5588,6 +5588,11 @@ static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev, - return send_conn_param_neg_reply(hdev, handle, - HCI_ERROR_UNKNOWN_CONN_ID); - -+ if (min < hcon->le_conn_min_interval || -+ max > hcon->le_conn_max_interval) -+ return send_conn_param_neg_reply(hdev, handle, -+ HCI_ERROR_INVALID_LL_PARAMS); -+ - if (hci_check_conn_params(min, max, latency, timeout)) - return send_conn_param_neg_reply(hdev, handle, - HCI_ERROR_INVALID_LL_PARAMS); -diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c -index a442e21f3894..5abd423b55fa 100644 ---- a/net/bluetooth/hidp/core.c -+++ b/net/bluetooth/hidp/core.c -@@ -775,7 +775,7 @@ static int hidp_setup_hid(struct hidp_session *session, - hid->version = req->version; - hid->country = req->country; - -- strncpy(hid->name, req->name, sizeof(hid->name)); -+ strscpy(hid->name, req->name, sizeof(hid->name)); - - snprintf(hid->phys, sizeof(hid->phys), "%pMR", - &l2cap_pi(session->ctrl_sock->sk)->chan->src); -diff --git a/net/bluetooth/hidp/sock.c b/net/bluetooth/hidp/sock.c -index 2151913892ce..03be6a4baef3 100644 ---- a/net/bluetooth/hidp/sock.c -+++ b/net/bluetooth/hidp/sock.c -@@ -192,6 +192,7 @@ static int hidp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne - ca.version = ca32.version; - ca.flags = ca32.flags; - ca.idle_to = ca32.idle_to; -+ ca32.name[sizeof(ca32.name) - 1] = '\0'; - memcpy(ca.name, ca32.name, 128); - - csock = sockfd_lookup(ca.ctrl_sock, &err); -diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c -index 5406d7cd46ad..32d2be9d6858 100644 ---- a/net/bluetooth/l2cap_core.c -+++ b/net/bluetooth/l2cap_core.c -@@ -4394,6 +4394,12 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, - - l2cap_chan_lock(chan); - -+ if (chan->state != BT_DISCONN) { -+ l2cap_chan_unlock(chan); -+ mutex_unlock(&conn->chan_lock); -+ return 0; -+ } -+ - l2cap_chan_hold(chan); - l2cap_chan_del(chan, 0); - -@@ -5291,7 +5297,14 @@ static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn, - - memset(&rsp, 0, sizeof(rsp)); - -- err = hci_check_conn_params(min, max, latency, to_multiplier); -+ if (min < hcon->le_conn_min_interval || -+ max > hcon->le_conn_max_interval) { -+ BT_DBG("requested connection interval exceeds current bounds."); -+ err = -EINVAL; -+ } else { -+ err = hci_check_conn_params(min, max, latency, to_multiplier); -+ } -+ - if (err) - rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED); - else -diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c -index e68c715f8d37..6c2b4e6e87ba 100644 ---- a/net/bluetooth/smp.c -+++ b/net/bluetooth/smp.c -@@ -2579,6 +2579,19 @@ static int smp_cmd_ident_addr_info(struct l2cap_conn *conn, - goto distribute; - } - -+ /* Drop IRK if peer is using identity address during pairing but is -+ * providing different address as identity information. -+ * -+ * Microsoft Surface Precision Mouse is known to have this bug. -+ */ -+ if (hci_is_identity_address(&hcon->dst, hcon->dst_type) && -+ (bacmp(&info->bdaddr, &hcon->dst) || -+ info->addr_type != hcon->dst_type)) { -+ bt_dev_err(hcon->hdev, -+ "ignoring IRK with invalid identity address"); -+ goto distribute; -+ } -+ - bacpy(&smp->id_addr, &info->bdaddr); - smp->id_addr_type = info->addr_type; - -diff --git a/net/bridge/br.c b/net/bridge/br.c -index d164f63a4345..8a8f9e5f264f 100644 ---- a/net/bridge/br.c -+++ b/net/bridge/br.c -@@ -37,12 +37,15 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v - int err; - - if (dev->priv_flags & IFF_EBRIDGE) { -+ err = br_vlan_bridge_event(dev, event, ptr); -+ if (err) -+ return notifier_from_errno(err); -+ - if (event == NETDEV_REGISTER) { - /* register of bridge completed, add sysfs entries */ - br_sysfs_addbr(dev); - return NOTIFY_DONE; - } -- br_vlan_bridge_event(dev, event, ptr); - } - - /* not a port of a bridge */ -diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c -index 21b74e7a7b2f..52c712984cc7 100644 ---- a/net/bridge/br_input.c -+++ b/net/bridge/br_input.c -@@ -74,7 +74,6 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb - struct net_bridge_fdb_entry *dst = NULL; - struct net_bridge_mdb_entry *mdst; - bool local_rcv, mcast_hit = false; -- const unsigned char *dest; - struct net_bridge *br; - u16 vid = 0; - -@@ -92,10 +91,9 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb - br_fdb_update(br, p, eth_hdr(skb)->h_source, vid, false); - - local_rcv = !!(br->dev->flags & IFF_PROMISC); -- dest = eth_hdr(skb)->h_dest; -- if (is_multicast_ether_addr(dest)) { -+ if (is_multicast_ether_addr(eth_hdr(skb)->h_dest)) { - /* by definition the broadcast is also a multicast address */ -- if (is_broadcast_ether_addr(dest)) { -+ if (is_broadcast_ether_addr(eth_hdr(skb)->h_dest)) { - pkt_type = BR_PKT_BROADCAST; - local_rcv = true; - } else { -@@ -145,7 +143,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb - } - break; - case BR_PKT_UNICAST: -- dst = br_fdb_find_rcu(br, dest, vid); -+ dst = br_fdb_find_rcu(br, eth_hdr(skb)->h_dest, vid); - default: - break; - } -diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c -index de22c8fbbb15..f8cac3702712 100644 ---- a/net/bridge/br_multicast.c -+++ b/net/bridge/br_multicast.c -@@ -911,6 +911,7 @@ static int br_ip4_multicast_igmp3_report(struct net_bridge *br, - int type; - int err = 0; - __be32 group; -+ u16 nsrcs; - - ih = igmpv3_report_hdr(skb); - num = ntohs(ih->ngrec); -@@ -924,8 +925,9 @@ static int br_ip4_multicast_igmp3_report(struct net_bridge *br, - grec = (void *)(skb->data + len - sizeof(*grec)); - group = grec->grec_mca; - type = grec->grec_type; -+ nsrcs = ntohs(grec->grec_nsrcs); - -- len += ntohs(grec->grec_nsrcs) * 4; -+ len += nsrcs * 4; - if (!ip_mc_may_pull(skb, len)) - return -EINVAL; - -@@ -946,7 +948,7 @@ static int br_ip4_multicast_igmp3_report(struct net_bridge *br, - src = eth_hdr(skb)->h_source; - if ((type == IGMPV3_CHANGE_TO_INCLUDE || - type == IGMPV3_MODE_IS_INCLUDE) && -- ntohs(grec->grec_nsrcs) == 0) { -+ nsrcs == 0) { - br_ip4_multicast_leave_group(br, port, group, vid, src); - } else { - err = br_ip4_multicast_add_group(br, port, group, vid, -@@ -983,7 +985,8 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, - len = skb_transport_offset(skb) + sizeof(*icmp6h); - - for (i = 0; i < num; i++) { -- __be16 *nsrcs, _nsrcs; -+ __be16 *_nsrcs, __nsrcs; -+ u16 nsrcs; - - nsrcs_offset = len + offsetof(struct mld2_grec, grec_nsrcs); - -@@ -991,12 +994,13 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, - nsrcs_offset + sizeof(_nsrcs)) - return -EINVAL; - -- nsrcs = skb_header_pointer(skb, nsrcs_offset, -- sizeof(_nsrcs), &_nsrcs); -- if (!nsrcs) -+ _nsrcs = skb_header_pointer(skb, nsrcs_offset, -+ sizeof(__nsrcs), &__nsrcs); -+ if (!_nsrcs) - return -EINVAL; - -- grec_len = struct_size(grec, grec_src, ntohs(*nsrcs)); -+ nsrcs = ntohs(*_nsrcs); -+ grec_len = struct_size(grec, grec_src, nsrcs); - - if (!ipv6_mc_may_pull(skb, len + grec_len)) - return -EINVAL; -@@ -1021,7 +1025,7 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, - src = eth_hdr(skb)->h_source; - if ((grec->grec_type == MLD2_CHANGE_TO_INCLUDE || - grec->grec_type == MLD2_MODE_IS_INCLUDE) && -- ntohs(*nsrcs) == 0) { -+ nsrcs == 0) { - br_ip6_multicast_leave_group(br, port, &grec->grec_mca, - vid, src); - } else { -@@ -1275,7 +1279,6 @@ static int br_ip6_multicast_query(struct net_bridge *br, - u16 vid) - { - unsigned int transport_len = ipv6_transport_len(skb); -- const struct ipv6hdr *ip6h = ipv6_hdr(skb); - struct mld_msg *mld; - struct net_bridge_mdb_entry *mp; - struct mld2_query *mld2q; -@@ -1319,7 +1322,7 @@ static int br_ip6_multicast_query(struct net_bridge *br, - - if (is_general_query) { - saddr.proto = htons(ETH_P_IPV6); -- saddr.u.ip6 = ip6h->saddr; -+ saddr.u.ip6 = ipv6_hdr(skb)->saddr; - - br_multicast_query_received(br, port, &br->ip6_other_query, - &saddr, max_delay); -@@ -1385,6 +1388,9 @@ br_multicast_leave_group(struct net_bridge *br, - if (!br_port_group_equal(p, port, src)) - continue; - -+ if (p->flags & MDB_PG_FLAGS_PERMANENT) -+ break; -+ - rcu_assign_pointer(*pp, p->next); - hlist_del_init(&p->mglist); - del_timer(&p->timer); -diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h -index 159a0e2cb0f6..9564a953bdf9 100644 ---- a/net/bridge/br_private.h -+++ b/net/bridge/br_private.h -@@ -893,8 +893,8 @@ int nbp_get_num_vlan_infos(struct net_bridge_port *p, u32 filter_mask); - void br_vlan_get_stats(const struct net_bridge_vlan *v, - struct br_vlan_stats *stats); - void br_vlan_port_event(struct net_bridge_port *p, unsigned long event); --void br_vlan_bridge_event(struct net_device *dev, unsigned long event, -- void *ptr); -+int br_vlan_bridge_event(struct net_device *dev, unsigned long event, -+ void *ptr); - - static inline struct net_bridge_vlan_group *br_vlan_group( - const struct net_bridge *br) -@@ -1084,9 +1084,10 @@ static inline void br_vlan_port_event(struct net_bridge_port *p, - { - } - --static inline void br_vlan_bridge_event(struct net_device *dev, -- unsigned long event, void *ptr) -+static inline int br_vlan_bridge_event(struct net_device *dev, -+ unsigned long event, void *ptr) - { -+ return 0; - } - #endif - -diff --git a/net/bridge/br_stp_bpdu.c b/net/bridge/br_stp_bpdu.c -index 68a6922b4141..7796dd9d42d7 100644 ---- a/net/bridge/br_stp_bpdu.c -+++ b/net/bridge/br_stp_bpdu.c -@@ -143,7 +143,6 @@ void br_send_tcn_bpdu(struct net_bridge_port *p) - void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb, - struct net_device *dev) - { -- const unsigned char *dest = eth_hdr(skb)->h_dest; - struct net_bridge_port *p; - struct net_bridge *br; - const unsigned char *buf; -@@ -172,7 +171,7 @@ void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb, - if (p->state == BR_STATE_DISABLED) - goto out; - -- if (!ether_addr_equal(dest, br->group_addr)) -+ if (!ether_addr_equal(eth_hdr(skb)->h_dest, br->group_addr)) - goto out; - - if (p->flags & BR_BPDU_GUARD) { -diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c -index f47f526b4f19..6b2c48b07e04 100644 ---- a/net/bridge/br_vlan.c -+++ b/net/bridge/br_vlan.c -@@ -1043,7 +1043,6 @@ int br_vlan_init(struct net_bridge *br) - { - struct net_bridge_vlan_group *vg; - int ret = -ENOMEM; -- bool changed; - - vg = kzalloc(sizeof(*vg), GFP_KERNEL); - if (!vg) -@@ -1058,17 +1057,10 @@ int br_vlan_init(struct net_bridge *br) - br->vlan_proto = htons(ETH_P_8021Q); - br->default_pvid = 1; - rcu_assign_pointer(br->vlgrp, vg); -- ret = br_vlan_add(br, 1, -- BRIDGE_VLAN_INFO_PVID | BRIDGE_VLAN_INFO_UNTAGGED | -- BRIDGE_VLAN_INFO_BRENTRY, &changed, NULL); -- if (ret) -- goto err_vlan_add; - - out: - return ret; - --err_vlan_add: -- vlan_tunnel_deinit(vg); - err_tunnel_init: - rhashtable_destroy(&vg->vlan_hash); - err_rhtbl: -@@ -1443,13 +1435,23 @@ static void nbp_vlan_set_vlan_dev_state(struct net_bridge_port *p, u16 vid) - } - - /* Must be protected by RTNL. */ --void br_vlan_bridge_event(struct net_device *dev, unsigned long event, -- void *ptr) -+int br_vlan_bridge_event(struct net_device *dev, unsigned long event, void *ptr) - { - struct netdev_notifier_changeupper_info *info; -- struct net_bridge *br; -+ struct net_bridge *br = netdev_priv(dev); -+ bool changed; -+ int ret = 0; - - switch (event) { -+ case NETDEV_REGISTER: -+ ret = br_vlan_add(br, br->default_pvid, -+ BRIDGE_VLAN_INFO_PVID | -+ BRIDGE_VLAN_INFO_UNTAGGED | -+ BRIDGE_VLAN_INFO_BRENTRY, &changed, NULL); -+ break; -+ case NETDEV_UNREGISTER: -+ br_vlan_delete(br, br->default_pvid); -+ break; - case NETDEV_CHANGEUPPER: - info = ptr; - br_vlan_upper_change(dev, info->upper_dev, info->linking); -@@ -1457,12 +1459,13 @@ void br_vlan_bridge_event(struct net_device *dev, unsigned long event, - - case NETDEV_CHANGE: - case NETDEV_UP: -- br = netdev_priv(dev); - if (!br_opt_get(br, BROPT_VLAN_BRIDGE_BINDING)) -- return; -+ break; - br_vlan_link_state_change(dev, br); - break; - } -+ -+ return ret; - } - - /* Must be protected by RTNL. */ -diff --git a/net/core/dev.c b/net/core/dev.c -index d6edd218babd..29fcff2c3d51 100644 ---- a/net/core/dev.c -+++ b/net/core/dev.c -@@ -4382,12 +4382,17 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, - - act = bpf_prog_run_xdp(xdp_prog, xdp); - -+ /* check if bpf_xdp_adjust_head was used */ - off = xdp->data - orig_data; -- if (off > 0) -- __skb_pull(skb, off); -- else if (off < 0) -- __skb_push(skb, -off); -- skb->mac_header += off; -+ if (off) { -+ if (off > 0) -+ __skb_pull(skb, off); -+ else if (off < 0) -+ __skb_push(skb, -off); -+ -+ skb->mac_header += off; -+ skb_reset_network_header(skb); -+ } - - /* check if bpf_xdp_adjust_tail was used. it can only "shrink" - * pckt. -@@ -9711,6 +9716,8 @@ static void __net_exit default_device_exit(struct net *net) - - /* Push remaining network devices to init_net */ - snprintf(fb_name, IFNAMSIZ, "dev%d", dev->ifindex); -+ if (__dev_get_by_name(&init_net, fb_name)) -+ snprintf(fb_name, IFNAMSIZ, "dev%%d"); - err = dev_change_net_namespace(dev, &init_net, fb_name); - if (err) { - pr_emerg("%s: failed to move %s to init_net: %d\n", -diff --git a/net/core/filter.c b/net/core/filter.c -index f615e42cf4ef..f681fb772940 100644 ---- a/net/core/filter.c -+++ b/net/core/filter.c -@@ -4332,7 +4332,7 @@ BPF_CALL_5(bpf_setsockopt, struct bpf_sock_ops_kern *, bpf_sock, - TCP_CA_NAME_MAX-1)); - name[TCP_CA_NAME_MAX-1] = 0; - ret = tcp_set_congestion_control(sk, name, false, -- reinit); -+ reinit, true); - } else { - struct tcp_sock *tp = tcp_sk(sk); - -diff --git a/net/core/neighbour.c b/net/core/neighbour.c -index 9e7fc929bc50..5bb0a1aee50e 100644 ---- a/net/core/neighbour.c -+++ b/net/core/neighbour.c -@@ -1122,6 +1122,7 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) - - atomic_set(&neigh->probes, - NEIGH_VAR(neigh->parms, UCAST_PROBES)); -+ neigh_del_timer(neigh); - neigh->nud_state = NUD_INCOMPLETE; - neigh->updated = now; - next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME), -@@ -1138,6 +1139,7 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) - } - } else if (neigh->nud_state & NUD_STALE) { - neigh_dbg(2, "neigh %p is delayed\n", neigh); -+ neigh_del_timer(neigh); - neigh->nud_state = NUD_DELAY; - neigh->updated = jiffies; - neigh_add_timer(neigh, jiffies + -diff --git a/net/core/pktgen.c b/net/core/pktgen.c -index f975c5e2a369..2a1705d2b31a 100644 ---- a/net/core/pktgen.c -+++ b/net/core/pktgen.c -@@ -1894,7 +1894,7 @@ static void pktgen_mark_device(const struct pktgen_net *pn, const char *ifname) - mutex_unlock(&pktgen_thread_lock); - pr_debug("%s: waiting for %s to disappear....\n", - __func__, ifname); -- schedule_timeout_interruptible(msecs_to_jiffies(msec_per_try)); -+ schedule_msec_hrtimeout_interruptible((msec_per_try)); - mutex_lock(&pktgen_thread_lock); - - if (++i >= max_tries) { -diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig -index 974de4d20f25..c893bf91e7cb 100644 ---- a/net/ipv4/Kconfig -+++ b/net/ipv4/Kconfig -@@ -676,6 +676,9 @@ choice - config DEFAULT_VEGAS - bool "Vegas" if TCP_CONG_VEGAS=y - -+ config DEFAULT_YEAH -+ bool "YeAH" if TCP_CONG_YEAH=y -+ - config DEFAULT_VENO - bool "Veno" if TCP_CONG_VENO=y - -@@ -709,6 +712,7 @@ config DEFAULT_TCP_CONG - default "htcp" if DEFAULT_HTCP - default "hybla" if DEFAULT_HYBLA - default "vegas" if DEFAULT_VEGAS -+ default "yeah" if DEFAULT_YEAH - default "westwood" if DEFAULT_WESTWOOD - default "veno" if DEFAULT_VENO - default "reno" if DEFAULT_RENO -diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c -index c6bd0f7a020a..c5ebfa199794 100644 ---- a/net/ipv4/devinet.c -+++ b/net/ipv4/devinet.c -@@ -62,6 +62,11 @@ - #include - #include - -+#define IPV6ONLY_FLAGS \ -+ (IFA_F_NODAD | IFA_F_OPTIMISTIC | IFA_F_DADFAILED | \ -+ IFA_F_HOMEADDRESS | IFA_F_TENTATIVE | \ -+ IFA_F_MANAGETEMPADDR | IFA_F_STABLE_PRIVACY) -+ - static struct ipv4_devconf ipv4_devconf = { - .data = { - [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1, -@@ -468,6 +473,9 @@ static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh, - ifa->ifa_flags &= ~IFA_F_SECONDARY; - last_primary = &in_dev->ifa_list; - -+ /* Don't set IPv6 only flags to IPv4 addresses */ -+ ifa->ifa_flags &= ~IPV6ONLY_FLAGS; -+ - for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL; - ifap = &ifa1->ifa_next) { - if (!(ifa1->ifa_flags & IFA_F_SECONDARY) && -diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c -index a57f0d69eadb..85107bf812f2 100644 ---- a/net/ipv4/igmp.c -+++ b/net/ipv4/igmp.c -@@ -1228,12 +1228,8 @@ static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im) - if (pmc) { - im->interface = pmc->interface; - if (im->sfmode == MCAST_INCLUDE) { -- im->tomb = pmc->tomb; -- pmc->tomb = NULL; -- -- im->sources = pmc->sources; -- pmc->sources = NULL; -- -+ swap(im->tomb, pmc->tomb); -+ swap(im->sources, pmc->sources); - for (psf = im->sources; psf; psf = psf->sf_next) - psf->sf_crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; - } else { -diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c -index 43adfc1641ba..2f01cf6fa0de 100644 ---- a/net/ipv4/ipip.c -+++ b/net/ipv4/ipip.c -@@ -275,6 +275,9 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, - const struct iphdr *tiph = &tunnel->parms.iph; - u8 ipproto; - -+ if (!pskb_inet_may_pull(skb)) -+ goto tx_error; -+ - switch (skb->protocol) { - case htons(ETH_P_IP): - ipproto = IPPROTO_IPIP; -diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c -index 7dc9ab84bb69..5264f064a87e 100644 ---- a/net/ipv4/tcp.c -+++ b/net/ipv4/tcp.c -@@ -2614,6 +2614,8 @@ int tcp_disconnect(struct sock *sk, int flags) - tcp_saved_syn_free(tp); - tp->compressed_ack = 0; - tp->bytes_sent = 0; -+ tp->bytes_acked = 0; -+ tp->bytes_received = 0; - tp->bytes_retrans = 0; - tp->duplicate_sack[0].start_seq = 0; - tp->duplicate_sack[0].end_seq = 0; -@@ -2768,7 +2770,9 @@ static int do_tcp_setsockopt(struct sock *sk, int level, - name[val] = 0; - - lock_sock(sk); -- err = tcp_set_congestion_control(sk, name, true, true); -+ err = tcp_set_congestion_control(sk, name, true, true, -+ ns_capable(sock_net(sk)->user_ns, -+ CAP_NET_ADMIN)); - release_sock(sk); - return err; - } -diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c -index e1862b64a90f..c445a81d144e 100644 ---- a/net/ipv4/tcp_cong.c -+++ b/net/ipv4/tcp_cong.c -@@ -333,7 +333,8 @@ int tcp_set_allowed_congestion_control(char *val) - * tcp_reinit_congestion_control (if the current congestion control was - * already initialized. - */ --int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, bool reinit) -+int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, -+ bool reinit, bool cap_net_admin) - { - struct inet_connection_sock *icsk = inet_csk(sk); - const struct tcp_congestion_ops *ca; -@@ -369,8 +370,7 @@ int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, boo - } else { - err = -EBUSY; - } -- } else if (!((ca->flags & TCP_CONG_NON_RESTRICTED) || -- ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN))) { -+ } else if (!((ca->flags & TCP_CONG_NON_RESTRICTED) || cap_net_admin)) { - err = -EPERM; - } else if (!try_module_get(ca->owner)) { - err = -EBUSY; -diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c -index 0ebc33d1c9e5..7d0be046cbc1 100644 ---- a/net/ipv4/tcp_output.c -+++ b/net/ipv4/tcp_output.c -@@ -1286,6 +1286,7 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue, - struct tcp_sock *tp = tcp_sk(sk); - struct sk_buff *buff; - int nsize, old_factor; -+ long limit; - int nlen; - u8 flags; - -@@ -1296,8 +1297,16 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue, - if (nsize < 0) - nsize = 0; - -- if (unlikely((sk->sk_wmem_queued >> 1) > sk->sk_sndbuf && -- tcp_queue != TCP_FRAG_IN_WRITE_QUEUE)) { -+ /* tcp_sendmsg() can overshoot sk_wmem_queued by one full size skb. -+ * We need some allowance to not penalize applications setting small -+ * SO_SNDBUF values. -+ * Also allow first and last skb in retransmit queue to be split. -+ */ -+ limit = sk->sk_sndbuf + 2 * SKB_TRUESIZE(GSO_MAX_SIZE); -+ if (unlikely((sk->sk_wmem_queued >> 1) > limit && -+ tcp_queue != TCP_FRAG_IN_WRITE_QUEUE && -+ skb != tcp_rtx_queue_head(sk) && -+ skb != tcp_rtx_queue_tail(sk))) { - NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPWQUEUETOOBIG); - return -ENOMEM; - } -diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c -index 9180c8b6f764..455f1292e479 100644 ---- a/net/ipv6/ip6_fib.c -+++ b/net/ipv6/ip6_fib.c -@@ -1104,8 +1104,24 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt, - err = call_fib6_entry_notifiers(info->nl_net, - FIB_EVENT_ENTRY_ADD, - rt, extack); -- if (err) -+ if (err) { -+ struct fib6_info *sibling, *next_sibling; -+ -+ /* If the route has siblings, then it first -+ * needs to be unlinked from them. -+ */ -+ if (!rt->fib6_nsiblings) -+ return err; -+ -+ list_for_each_entry_safe(sibling, next_sibling, -+ &rt->fib6_siblings, -+ fib6_siblings) -+ sibling->fib6_nsiblings--; -+ rt->fib6_nsiblings = 0; -+ list_del_init(&rt->fib6_siblings); -+ rt6_multipath_rebalance(next_sibling); - return err; -+ } - - rcu_assign_pointer(rt->fib6_next, iter); - fib6_info_hold(rt); -diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c -index c2049c72f3e5..dd2d0b963260 100644 ---- a/net/ipv6/ip6_gre.c -+++ b/net/ipv6/ip6_gre.c -@@ -660,12 +660,13 @@ static int prepare_ip6gre_xmit_ipv6(struct sk_buff *skb, - struct flowi6 *fl6, __u8 *dsfield, - int *encap_limit) - { -- struct ipv6hdr *ipv6h = ipv6_hdr(skb); -+ struct ipv6hdr *ipv6h; - struct ip6_tnl *t = netdev_priv(dev); - __u16 offset; - - offset = ip6_tnl_parse_tlv_enc_lim(skb, skb_network_header(skb)); - /* ip6_tnl_parse_tlv_enc_lim() might have reallocated skb->head */ -+ ipv6h = ipv6_hdr(skb); - - if (offset > 0) { - struct ipv6_tlv_tnl_enc_lim *tel; -diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c -index b80fde1bc005..d10a9e40729f 100644 ---- a/net/ipv6/ip6_tunnel.c -+++ b/net/ipv6/ip6_tunnel.c -@@ -1278,12 +1278,11 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) - } - - fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL); -+ dsfield = INET_ECN_encapsulate(dsfield, ipv4_get_dsfield(iph)); - - if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) - return -1; - -- dsfield = INET_ECN_encapsulate(dsfield, ipv4_get_dsfield(iph)); -- - skb_set_inner_ipproto(skb, IPPROTO_IPIP); - - err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu, -@@ -1367,12 +1366,11 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) - } - - fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL); -+ dsfield = INET_ECN_encapsulate(dsfield, ipv6_get_dsfield(ipv6h)); - - if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) - return -1; - -- dsfield = INET_ECN_encapsulate(dsfield, ipv6_get_dsfield(ipv6h)); -- - skb_set_inner_ipproto(skb, IPPROTO_IPV6); - - err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu, -diff --git a/net/ipv6/route.c b/net/ipv6/route.c -index 97a843cf164c..5f5a0a42ce60 100644 ---- a/net/ipv6/route.c -+++ b/net/ipv6/route.c -@@ -2215,7 +2215,7 @@ static struct dst_entry *rt6_check(struct rt6_info *rt, - { - u32 rt_cookie = 0; - -- if ((from && !fib6_get_cookie_safe(from, &rt_cookie)) || -+ if (!from || !fib6_get_cookie_safe(from, &rt_cookie) || - rt_cookie != cookie) - return NULL; - -diff --git a/net/key/af_key.c b/net/key/af_key.c -index a50dd6f34b91..fe5fc4bab7ee 100644 ---- a/net/key/af_key.c -+++ b/net/key/af_key.c -@@ -2438,8 +2438,10 @@ static int key_pol_get_resp(struct sock *sk, struct xfrm_policy *xp, const struc - goto out; - } - err = pfkey_xfrm_policy2msg(out_skb, xp, dir); -- if (err < 0) -+ if (err < 0) { -+ kfree_skb(out_skb); - goto out; -+ } - - out_hdr = (struct sadb_msg *) out_skb->data; - out_hdr->sadb_msg_version = hdr->sadb_msg_version; -@@ -2690,8 +2692,10 @@ static int dump_sp(struct xfrm_policy *xp, int dir, int count, void *ptr) - return PTR_ERR(out_skb); - - err = pfkey_xfrm_policy2msg(out_skb, xp, dir); -- if (err < 0) -+ if (err < 0) { -+ kfree_skb(out_skb); - return err; -+ } - - out_hdr = (struct sadb_msg *) out_skb->data; - out_hdr->sadb_msg_version = pfk->dump.msg_version; -diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c -index 1d0e5904dedf..c54cb59593ef 100644 ---- a/net/l2tp/l2tp_ppp.c -+++ b/net/l2tp/l2tp_ppp.c -@@ -1681,6 +1681,9 @@ static const struct proto_ops pppol2tp_ops = { - .recvmsg = pppol2tp_recvmsg, - .mmap = sock_no_mmap, - .ioctl = pppox_ioctl, -+#ifdef CONFIG_COMPAT -+ .compat_ioctl = pppox_compat_ioctl, -+#endif - }; - - static const struct pppox_proto pppol2tp_proto = { -diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c -index 06aac0aaae64..8dc6580e1787 100644 ---- a/net/mac80211/iface.c -+++ b/net/mac80211/iface.c -@@ -1222,7 +1222,6 @@ static void ieee80211_if_setup(struct net_device *dev) - static void ieee80211_if_setup_no_queue(struct net_device *dev) - { - ieee80211_if_setup(dev); -- dev->features |= NETIF_F_LLTX; - dev->priv_flags |= IFF_NO_QUEUE; - } - -diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c -index 3cdf171cd468..16afa0df4004 100644 ---- a/net/netfilter/ipset/ip_set_core.c -+++ b/net/netfilter/ipset/ip_set_core.c -@@ -1541,10 +1541,14 @@ call_ad(struct sock *ctnl, struct sk_buff *skb, struct ip_set *set, - memcpy(&errmsg->msg, nlh, nlh->nlmsg_len); - cmdattr = (void *)&errmsg->msg + min_len; - -- nla_parse_deprecated(cda, IPSET_ATTR_CMD_MAX, cmdattr, -- nlh->nlmsg_len - min_len, -- ip_set_adt_policy, NULL); -+ ret = nla_parse_deprecated(cda, IPSET_ATTR_CMD_MAX, cmdattr, -+ nlh->nlmsg_len - min_len, -+ ip_set_adt_policy, NULL); - -+ if (ret) { -+ nlmsg_free(skb2); -+ return ret; -+ } - errline = nla_data(cda[IPSET_ATTR_LINENO]); - - *errline = lineno; -diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h -index 10f619625abd..175f8fedcfaf 100644 ---- a/net/netfilter/ipset/ip_set_hash_gen.h -+++ b/net/netfilter/ipset/ip_set_hash_gen.h -@@ -622,7 +622,7 @@ mtype_resize(struct ip_set *set, bool retried) - goto cleanup; - } - m->size = AHASH_INIT_SIZE; -- extsize = ext_size(AHASH_INIT_SIZE, dsize); -+ extsize += ext_size(AHASH_INIT_SIZE, dsize); - RCU_INIT_POINTER(hbucket(t, key), m); - } else if (m->pos >= m->size) { - struct hbucket *ht; -diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c -index 7138556b206b..d5103a9eb302 100644 ---- a/net/netfilter/ipvs/ip_vs_core.c -+++ b/net/netfilter/ipvs/ip_vs_core.c -@@ -2245,7 +2245,6 @@ static const struct nf_hook_ops ip_vs_ops[] = { - static int __net_init __ip_vs_init(struct net *net) - { - struct netns_ipvs *ipvs; -- int ret; - - ipvs = net_generic(net, ip_vs_net_id); - if (ipvs == NULL) -@@ -2277,17 +2276,11 @@ static int __net_init __ip_vs_init(struct net *net) - if (ip_vs_sync_net_init(ipvs) < 0) - goto sync_fail; - -- ret = nf_register_net_hooks(net, ip_vs_ops, ARRAY_SIZE(ip_vs_ops)); -- if (ret < 0) -- goto hook_fail; -- - return 0; - /* - * Error handling - */ - --hook_fail: -- ip_vs_sync_net_cleanup(ipvs); - sync_fail: - ip_vs_conn_net_cleanup(ipvs); - conn_fail: -@@ -2317,6 +2310,19 @@ static void __net_exit __ip_vs_cleanup(struct net *net) - net->ipvs = NULL; - } - -+static int __net_init __ip_vs_dev_init(struct net *net) -+{ -+ int ret; -+ -+ ret = nf_register_net_hooks(net, ip_vs_ops, ARRAY_SIZE(ip_vs_ops)); -+ if (ret < 0) -+ goto hook_fail; -+ return 0; -+ -+hook_fail: -+ return ret; -+} -+ - static void __net_exit __ip_vs_dev_cleanup(struct net *net) - { - struct netns_ipvs *ipvs = net_ipvs(net); -@@ -2336,6 +2342,7 @@ static struct pernet_operations ipvs_core_ops = { - }; - - static struct pernet_operations ipvs_core_dev_ops = { -+ .init = __ip_vs_dev_init, - .exit = __ip_vs_dev_cleanup, - }; - -diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c -index 776c87ed4813..741d91aa4a8d 100644 ---- a/net/netfilter/ipvs/ip_vs_ctl.c -+++ b/net/netfilter/ipvs/ip_vs_ctl.c -@@ -2396,9 +2396,7 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) - cfg.syncid = dm->syncid; - ret = start_sync_thread(ipvs, &cfg, dm->state); - } else { -- mutex_lock(&ipvs->sync_mutex); - ret = stop_sync_thread(ipvs, dm->state); -- mutex_unlock(&ipvs->sync_mutex); - } - goto out_dec; - } -@@ -3515,10 +3513,8 @@ static int ip_vs_genl_del_daemon(struct netns_ipvs *ipvs, struct nlattr **attrs) - if (!attrs[IPVS_DAEMON_ATTR_STATE]) - return -EINVAL; - -- mutex_lock(&ipvs->sync_mutex); - ret = stop_sync_thread(ipvs, - nla_get_u32(attrs[IPVS_DAEMON_ATTR_STATE])); -- mutex_unlock(&ipvs->sync_mutex); - return ret; - } - -diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c -index 2526be6b3d90..a4a78c4b06de 100644 ---- a/net/netfilter/ipvs/ip_vs_sync.c -+++ b/net/netfilter/ipvs/ip_vs_sync.c -@@ -195,6 +195,7 @@ union ip_vs_sync_conn { - #define IPVS_OPT_F_PARAM (1 << (IPVS_OPT_PARAM-1)) - - struct ip_vs_sync_thread_data { -+ struct task_struct *task; - struct netns_ipvs *ipvs; - struct socket *sock; - char *buf; -@@ -374,8 +375,11 @@ static inline void sb_queue_tail(struct netns_ipvs *ipvs, - max(IPVS_SYNC_SEND_DELAY, 1)); - ms->sync_queue_len++; - list_add_tail(&sb->list, &ms->sync_queue); -- if ((++ms->sync_queue_delay) == IPVS_SYNC_WAKEUP_RATE) -- wake_up_process(ms->master_thread); -+ if ((++ms->sync_queue_delay) == IPVS_SYNC_WAKEUP_RATE) { -+ int id = (int)(ms - ipvs->ms); -+ -+ wake_up_process(ipvs->master_tinfo[id].task); -+ } - } else - ip_vs_sync_buff_release(sb); - spin_unlock(&ipvs->sync_lock); -@@ -1636,8 +1640,10 @@ static void master_wakeup_work_handler(struct work_struct *work) - spin_lock_bh(&ipvs->sync_lock); - if (ms->sync_queue_len && - ms->sync_queue_delay < IPVS_SYNC_WAKEUP_RATE) { -+ int id = (int)(ms - ipvs->ms); -+ - ms->sync_queue_delay = IPVS_SYNC_WAKEUP_RATE; -- wake_up_process(ms->master_thread); -+ wake_up_process(ipvs->master_tinfo[id].task); - } - spin_unlock_bh(&ipvs->sync_lock); - } -@@ -1703,10 +1709,6 @@ static int sync_thread_master(void *data) - if (sb) - ip_vs_sync_buff_release(sb); - -- /* release the sending multicast socket */ -- sock_release(tinfo->sock); -- kfree(tinfo); -- - return 0; - } - -@@ -1740,11 +1742,6 @@ static int sync_thread_backup(void *data) - } - } - -- /* release the sending multicast socket */ -- sock_release(tinfo->sock); -- kfree(tinfo->buf); -- kfree(tinfo); -- - return 0; - } - -@@ -1752,8 +1749,8 @@ static int sync_thread_backup(void *data) - int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, - int state) - { -- struct ip_vs_sync_thread_data *tinfo = NULL; -- struct task_struct **array = NULL, *task; -+ struct ip_vs_sync_thread_data *ti = NULL, *tinfo; -+ struct task_struct *task; - struct net_device *dev; - char *name; - int (*threadfn)(void *data); -@@ -1822,7 +1819,7 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, - threadfn = sync_thread_master; - } else if (state == IP_VS_STATE_BACKUP) { - result = -EEXIST; -- if (ipvs->backup_threads) -+ if (ipvs->backup_tinfo) - goto out_early; - - ipvs->bcfg = *c; -@@ -1849,28 +1846,22 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, - master_wakeup_work_handler); - ms->ipvs = ipvs; - } -- } else { -- array = kcalloc(count, sizeof(struct task_struct *), -- GFP_KERNEL); -- result = -ENOMEM; -- if (!array) -- goto out; - } -+ result = -ENOMEM; -+ ti = kcalloc(count, sizeof(struct ip_vs_sync_thread_data), -+ GFP_KERNEL); -+ if (!ti) -+ goto out; - - for (id = 0; id < count; id++) { -- result = -ENOMEM; -- tinfo = kmalloc(sizeof(*tinfo), GFP_KERNEL); -- if (!tinfo) -- goto out; -+ tinfo = &ti[id]; - tinfo->ipvs = ipvs; -- tinfo->sock = NULL; - if (state == IP_VS_STATE_BACKUP) { -+ result = -ENOMEM; - tinfo->buf = kmalloc(ipvs->bcfg.sync_maxlen, - GFP_KERNEL); - if (!tinfo->buf) - goto out; -- } else { -- tinfo->buf = NULL; - } - tinfo->id = id; - if (state == IP_VS_STATE_MASTER) -@@ -1885,17 +1876,15 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, - result = PTR_ERR(task); - goto out; - } -- tinfo = NULL; -- if (state == IP_VS_STATE_MASTER) -- ipvs->ms[id].master_thread = task; -- else -- array[id] = task; -+ tinfo->task = task; - } - - /* mark as active */ - -- if (state == IP_VS_STATE_BACKUP) -- ipvs->backup_threads = array; -+ if (state == IP_VS_STATE_MASTER) -+ ipvs->master_tinfo = ti; -+ else -+ ipvs->backup_tinfo = ti; - spin_lock_bh(&ipvs->sync_buff_lock); - ipvs->sync_state |= state; - spin_unlock_bh(&ipvs->sync_buff_lock); -@@ -1910,29 +1899,31 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, - - out: - /* We do not need RTNL lock anymore, release it here so that -- * sock_release below and in the kthreads can use rtnl_lock -- * to leave the mcast group. -+ * sock_release below can use rtnl_lock to leave the mcast group. - */ - rtnl_unlock(); -- count = id; -- while (count-- > 0) { -- if (state == IP_VS_STATE_MASTER) -- kthread_stop(ipvs->ms[count].master_thread); -- else -- kthread_stop(array[count]); -+ id = min(id, count - 1); -+ if (ti) { -+ for (tinfo = ti + id; tinfo >= ti; tinfo--) { -+ if (tinfo->task) -+ kthread_stop(tinfo->task); -+ } - } - if (!(ipvs->sync_state & IP_VS_STATE_MASTER)) { - kfree(ipvs->ms); - ipvs->ms = NULL; - } - mutex_unlock(&ipvs->sync_mutex); -- if (tinfo) { -- if (tinfo->sock) -- sock_release(tinfo->sock); -- kfree(tinfo->buf); -- kfree(tinfo); -+ -+ /* No more mutexes, release socks */ -+ if (ti) { -+ for (tinfo = ti + id; tinfo >= ti; tinfo--) { -+ if (tinfo->sock) -+ sock_release(tinfo->sock); -+ kfree(tinfo->buf); -+ } -+ kfree(ti); - } -- kfree(array); - return result; - - out_early: -@@ -1944,15 +1935,18 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, - - int stop_sync_thread(struct netns_ipvs *ipvs, int state) - { -- struct task_struct **array; -+ struct ip_vs_sync_thread_data *ti, *tinfo; - int id; - int retc = -EINVAL; - - IP_VS_DBG(7, "%s(): pid %d\n", __func__, task_pid_nr(current)); - -+ mutex_lock(&ipvs->sync_mutex); - if (state == IP_VS_STATE_MASTER) { -+ retc = -ESRCH; - if (!ipvs->ms) -- return -ESRCH; -+ goto err; -+ ti = ipvs->master_tinfo; - - /* - * The lock synchronizes with sb_queue_tail(), so that we don't -@@ -1971,38 +1965,56 @@ int stop_sync_thread(struct netns_ipvs *ipvs, int state) - struct ipvs_master_sync_state *ms = &ipvs->ms[id]; - int ret; - -+ tinfo = &ti[id]; - pr_info("stopping master sync thread %d ...\n", -- task_pid_nr(ms->master_thread)); -+ task_pid_nr(tinfo->task)); - cancel_delayed_work_sync(&ms->master_wakeup_work); -- ret = kthread_stop(ms->master_thread); -+ ret = kthread_stop(tinfo->task); - if (retc >= 0) - retc = ret; - } - kfree(ipvs->ms); - ipvs->ms = NULL; -+ ipvs->master_tinfo = NULL; - } else if (state == IP_VS_STATE_BACKUP) { -- if (!ipvs->backup_threads) -- return -ESRCH; -+ retc = -ESRCH; -+ if (!ipvs->backup_tinfo) -+ goto err; -+ ti = ipvs->backup_tinfo; - - ipvs->sync_state &= ~IP_VS_STATE_BACKUP; -- array = ipvs->backup_threads; - retc = 0; - for (id = ipvs->threads_mask; id >= 0; id--) { - int ret; - -+ tinfo = &ti[id]; - pr_info("stopping backup sync thread %d ...\n", -- task_pid_nr(array[id])); -- ret = kthread_stop(array[id]); -+ task_pid_nr(tinfo->task)); -+ ret = kthread_stop(tinfo->task); - if (retc >= 0) - retc = ret; - } -- kfree(array); -- ipvs->backup_threads = NULL; -+ ipvs->backup_tinfo = NULL; -+ } else { -+ goto err; - } -+ id = ipvs->threads_mask; -+ mutex_unlock(&ipvs->sync_mutex); -+ -+ /* No more mutexes, release socks */ -+ for (tinfo = ti + id; tinfo >= ti; tinfo--) { -+ if (tinfo->sock) -+ sock_release(tinfo->sock); -+ kfree(tinfo->buf); -+ } -+ kfree(ti); - - /* decrease the module use count */ - ip_vs_use_count_dec(); -+ return retc; - -+err: -+ mutex_unlock(&ipvs->sync_mutex); - return retc; - } - -@@ -2021,7 +2033,6 @@ void ip_vs_sync_net_cleanup(struct netns_ipvs *ipvs) - { - int retc; - -- mutex_lock(&ipvs->sync_mutex); - retc = stop_sync_thread(ipvs, IP_VS_STATE_MASTER); - if (retc && retc != -ESRCH) - pr_err("Failed to stop Master Daemon\n"); -@@ -2029,5 +2040,4 @@ void ip_vs_sync_net_cleanup(struct netns_ipvs *ipvs) - retc = stop_sync_thread(ipvs, IP_VS_STATE_BACKUP); - if (retc && retc != -ESRCH) - pr_err("Failed to stop Backup Daemon\n"); -- mutex_unlock(&ipvs->sync_mutex); - } -diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c -index 7db79c1b8084..1b77444d5b52 100644 ---- a/net/netfilter/nf_conntrack_netlink.c -+++ b/net/netfilter/nf_conntrack_netlink.c -@@ -1256,7 +1256,6 @@ static int ctnetlink_del_conntrack(struct net *net, struct sock *ctnl, - struct nf_conntrack_tuple tuple; - struct nf_conn *ct; - struct nfgenmsg *nfmsg = nlmsg_data(nlh); -- u_int8_t u3 = nfmsg->version ? nfmsg->nfgen_family : AF_UNSPEC; - struct nf_conntrack_zone zone; - int err; - -@@ -1266,11 +1265,13 @@ static int ctnetlink_del_conntrack(struct net *net, struct sock *ctnl, - - if (cda[CTA_TUPLE_ORIG]) - err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG, -- u3, &zone); -+ nfmsg->nfgen_family, &zone); - else if (cda[CTA_TUPLE_REPLY]) - err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_REPLY, -- u3, &zone); -+ nfmsg->nfgen_family, &zone); - else { -+ u_int8_t u3 = nfmsg->version ? nfmsg->nfgen_family : AF_UNSPEC; -+ - return ctnetlink_flush_conntrack(net, cda, - NETLINK_CB(skb).portid, - nlmsg_report(nlh), u3); -diff --git a/net/netfilter/nf_conntrack_proto_icmp.c b/net/netfilter/nf_conntrack_proto_icmp.c -index a824367ed518..dd53e2b20f6b 100644 ---- a/net/netfilter/nf_conntrack_proto_icmp.c -+++ b/net/netfilter/nf_conntrack_proto_icmp.c -@@ -218,7 +218,7 @@ int nf_conntrack_icmpv4_error(struct nf_conn *tmpl, - /* See ip_conntrack_proto_tcp.c */ - if (state->net->ct.sysctl_checksum && - state->hook == NF_INET_PRE_ROUTING && -- nf_ip_checksum(skb, state->hook, dataoff, 0)) { -+ nf_ip_checksum(skb, state->hook, dataoff, IPPROTO_ICMP)) { - icmp_error_log(skb, state, "bad hw icmp checksum"); - return -NF_ACCEPT; - } -diff --git a/net/netfilter/nf_nat_proto.c b/net/netfilter/nf_nat_proto.c -index 07da07788f6b..83a24cc5753b 100644 ---- a/net/netfilter/nf_nat_proto.c -+++ b/net/netfilter/nf_nat_proto.c -@@ -564,7 +564,7 @@ int nf_nat_icmp_reply_translation(struct sk_buff *skb, - - if (!skb_make_writable(skb, hdrlen + sizeof(*inside))) - return 0; -- if (nf_ip_checksum(skb, hooknum, hdrlen, 0)) -+ if (nf_ip_checksum(skb, hooknum, hdrlen, IPPROTO_ICMP)) - return 0; - - inside = (void *)skb->data + hdrlen; -diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c -index b5b2be55ca82..2c440015ff0c 100644 ---- a/net/netfilter/nf_queue.c -+++ b/net/netfilter/nf_queue.c -@@ -190,6 +190,11 @@ static int __nf_queue(struct sk_buff *skb, const struct nf_hook_state *state, - goto err; - } - -+ if (!skb_dst_force(skb) && state->hook != NF_INET_PRE_ROUTING) { -+ status = -ENETDOWN; -+ goto err; -+ } -+ - *entry = (struct nf_queue_entry) { - .skb = skb, - .state = *state, -@@ -198,7 +203,6 @@ static int __nf_queue(struct sk_buff *skb, const struct nf_hook_state *state, - }; - - nf_queue_entry_get_refs(entry); -- skb_dst_force(skb); - - switch (entry->state.pf) { - case AF_INET: -diff --git a/net/netfilter/nft_redir.c b/net/netfilter/nft_redir.c -index 8487eeff5c0e..43eeb1f609f1 100644 ---- a/net/netfilter/nft_redir.c -+++ b/net/netfilter/nft_redir.c -@@ -291,4 +291,4 @@ module_exit(nft_redir_module_exit); - - MODULE_LICENSE("GPL"); - MODULE_AUTHOR("Arturo Borrero Gonzalez "); --MODULE_ALIAS_NFT_EXPR("nat"); -+MODULE_ALIAS_NFT_EXPR("redir"); -diff --git a/net/netfilter/utils.c b/net/netfilter/utils.c -index 06dc55590441..51b454d8fa9c 100644 ---- a/net/netfilter/utils.c -+++ b/net/netfilter/utils.c -@@ -17,7 +17,8 @@ __sum16 nf_ip_checksum(struct sk_buff *skb, unsigned int hook, - case CHECKSUM_COMPLETE: - if (hook != NF_INET_PRE_ROUTING && hook != NF_INET_LOCAL_IN) - break; -- if ((protocol == 0 && !csum_fold(skb->csum)) || -+ if ((protocol != IPPROTO_TCP && protocol != IPPROTO_UDP && -+ !csum_fold(skb->csum)) || - !csum_tcpudp_magic(iph->saddr, iph->daddr, - skb->len - dataoff, protocol, - skb->csum)) { -@@ -26,7 +27,7 @@ __sum16 nf_ip_checksum(struct sk_buff *skb, unsigned int hook, - } - /* fall through */ - case CHECKSUM_NONE: -- if (protocol == 0) -+ if (protocol != IPPROTO_TCP && protocol != IPPROTO_UDP) - skb->csum = 0; - else - skb->csum = csum_tcpudp_nofold(iph->saddr, iph->daddr, -diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c -index 86b87925ef34..c4f54ad2b98a 100644 ---- a/net/netrom/af_netrom.c -+++ b/net/netrom/af_netrom.c -@@ -869,7 +869,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev) - unsigned short frametype, flags, window, timeout; - int ret; - -- skb->sk = NULL; /* Initially we don't know who it's for */ -+ skb_orphan(skb); - - /* - * skb->data points to the netrom frame start -@@ -967,7 +967,9 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev) - - window = skb->data[20]; - -+ sock_hold(make); - skb->sk = make; -+ skb->destructor = sock_efree; - make->sk_state = TCP_ESTABLISHED; - - /* Fill in his circuit details */ -diff --git a/net/nfc/nci/data.c b/net/nfc/nci/data.c -index 0a0c265baaa4..ce3382be937f 100644 ---- a/net/nfc/nci/data.c -+++ b/net/nfc/nci/data.c -@@ -107,7 +107,7 @@ static int nci_queue_tx_data_frags(struct nci_dev *ndev, - conn_info = nci_get_conn_info_by_conn_id(ndev, conn_id); - if (!conn_info) { - rc = -EPROTO; -- goto free_exit; -+ goto exit; - } - - __skb_queue_head_init(&frags_q); -diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c -index 151518dbabad..bd131469e4ca 100644 ---- a/net/openvswitch/actions.c -+++ b/net/openvswitch/actions.c -@@ -166,8 +166,7 @@ static void update_ethertype(struct sk_buff *skb, struct ethhdr *hdr, - if (skb->ip_summed == CHECKSUM_COMPLETE) { - __be16 diff[] = { ~(hdr->h_proto), ethertype }; - -- skb->csum = ~csum_partial((char *)diff, sizeof(diff), -- ~skb->csum); -+ skb->csum = csum_partial((char *)diff, sizeof(diff), skb->csum); - } - - hdr->h_proto = ethertype; -@@ -259,8 +258,7 @@ static int set_mpls(struct sk_buff *skb, struct sw_flow_key *flow_key, - if (skb->ip_summed == CHECKSUM_COMPLETE) { - __be32 diff[] = { ~(stack->label_stack_entry), lse }; - -- skb->csum = ~csum_partial((char *)diff, sizeof(diff), -- ~skb->csum); -+ skb->csum = csum_partial((char *)diff, sizeof(diff), skb->csum); - } - - stack->label_stack_entry = lse; -diff --git a/net/rds/rdma_transport.c b/net/rds/rdma_transport.c -index 46bce8389066..9db455d02255 100644 ---- a/net/rds/rdma_transport.c -+++ b/net/rds/rdma_transport.c -@@ -112,7 +112,9 @@ static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id, - if (!conn) - break; - err = (int *)rdma_consumer_reject_data(cm_id, event, &len); -- if (!err || (err && ((*err) == RDS_RDMA_REJ_INCOMPAT))) { -+ if (!err || -+ (err && len >= sizeof(*err) && -+ ((*err) <= RDS_RDMA_REJ_INCOMPAT))) { - pr_warn("RDS/RDMA: conn <%pI6c, %pI6c> rejected, dropping connection\n", - &conn->c_laddr, &conn->c_faddr); - conn->c_proposed_version = RDS_PROTOCOL_COMPAT_VERSION; -@@ -122,7 +124,6 @@ static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id, - rdsdebug("Connection rejected: %s\n", - rdma_reject_msg(cm_id, event->status)); - break; -- /* FALLTHROUGH */ - case RDMA_CM_EVENT_ADDR_ERROR: - case RDMA_CM_EVENT_ROUTE_ERROR: - case RDMA_CM_EVENT_CONNECT_ERROR: -diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c -index f9f4721cdfa7..d09eaf153544 100644 ---- a/net/rxrpc/af_rxrpc.c -+++ b/net/rxrpc/af_rxrpc.c -@@ -545,6 +545,7 @@ static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len) - - switch (rx->sk.sk_state) { - case RXRPC_UNBOUND: -+ case RXRPC_CLIENT_UNBOUND: - rx->srx.srx_family = AF_RXRPC; - rx->srx.srx_service = 0; - rx->srx.transport_type = SOCK_DGRAM; -@@ -569,10 +570,9 @@ static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len) - } - - rx->local = local; -- rx->sk.sk_state = RXRPC_CLIENT_UNBOUND; -+ rx->sk.sk_state = RXRPC_CLIENT_BOUND; - /* Fall through */ - -- case RXRPC_CLIENT_UNBOUND: - case RXRPC_CLIENT_BOUND: - if (!m->msg_name && - test_bit(RXRPC_SOCK_CONNECTED, &rx->flags)) { -diff --git a/net/sched/act_bpf.c b/net/sched/act_bpf.c -index 8126b26f125e..fd1f7e799e23 100644 ---- a/net/sched/act_bpf.c -+++ b/net/sched/act_bpf.c -@@ -285,6 +285,7 @@ static int tcf_bpf_init(struct net *net, struct nlattr *nla, - struct tcf_bpf *prog; - bool is_bpf, is_ebpf; - int ret, res = 0; -+ u32 index; - - if (!nla) - return -EINVAL; -@@ -298,13 +299,13 @@ static int tcf_bpf_init(struct net *net, struct nlattr *nla, - return -EINVAL; - - parm = nla_data(tb[TCA_ACT_BPF_PARMS]); -- -- ret = tcf_idr_check_alloc(tn, &parm->index, act, bind); -+ index = parm->index; -+ ret = tcf_idr_check_alloc(tn, &index, act, bind); - if (!ret) { -- ret = tcf_idr_create(tn, parm->index, est, act, -+ ret = tcf_idr_create(tn, index, est, act, - &act_bpf_ops, bind, true); - if (ret < 0) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - -diff --git a/net/sched/act_connmark.c b/net/sched/act_connmark.c -index ce36b0f7e1dc..32ac04d77a45 100644 ---- a/net/sched/act_connmark.c -+++ b/net/sched/act_connmark.c -@@ -103,6 +103,7 @@ static int tcf_connmark_init(struct net *net, struct nlattr *nla, - struct tcf_connmark_info *ci; - struct tc_connmark *parm; - int ret = 0, err; -+ u32 index; - - if (!nla) - return -EINVAL; -@@ -116,13 +117,13 @@ static int tcf_connmark_init(struct net *net, struct nlattr *nla, - return -EINVAL; - - parm = nla_data(tb[TCA_CONNMARK_PARMS]); -- -- ret = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ ret = tcf_idr_check_alloc(tn, &index, a, bind); - if (!ret) { -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_connmark_ops, bind, false); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - -diff --git a/net/sched/act_csum.c b/net/sched/act_csum.c -index 621fb22ce2a9..9b9288267a54 100644 ---- a/net/sched/act_csum.c -+++ b/net/sched/act_csum.c -@@ -52,6 +52,7 @@ static int tcf_csum_init(struct net *net, struct nlattr *nla, - struct tc_csum *parm; - struct tcf_csum *p; - int ret = 0, err; -+ u32 index; - - if (nla == NULL) - return -EINVAL; -@@ -64,13 +65,13 @@ static int tcf_csum_init(struct net *net, struct nlattr *nla, - if (tb[TCA_CSUM_PARMS] == NULL) - return -EINVAL; - parm = nla_data(tb[TCA_CSUM_PARMS]); -- -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (!err) { -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_csum_ops, bind, true); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - ret = ACT_P_CREATED; -diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c -index b2380c5284e6..8f0140c6ca58 100644 ---- a/net/sched/act_gact.c -+++ b/net/sched/act_gact.c -@@ -61,6 +61,7 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla, - struct tc_gact *parm; - struct tcf_gact *gact; - int ret = 0; -+ u32 index; - int err; - #ifdef CONFIG_GACT_PROB - struct tc_gact_p *p_parm = NULL; -@@ -77,6 +78,7 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla, - if (tb[TCA_GACT_PARMS] == NULL) - return -EINVAL; - parm = nla_data(tb[TCA_GACT_PARMS]); -+ index = parm->index; - - #ifndef CONFIG_GACT_PROB - if (tb[TCA_GACT_PROB] != NULL) -@@ -94,12 +96,12 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla, - } - #endif - -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (!err) { -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_gact_ops, bind, true); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - ret = ACT_P_CREATED; -diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c -index 41d5398dd2f2..92ee853d43e6 100644 ---- a/net/sched/act_ife.c -+++ b/net/sched/act_ife.c -@@ -479,8 +479,14 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla, - u8 *saddr = NULL; - bool exists = false; - int ret = 0; -+ u32 index; - int err; - -+ if (!nla) { -+ NL_SET_ERR_MSG_MOD(extack, "IFE requires attributes to be passed"); -+ return -EINVAL; -+ } -+ - err = nla_parse_nested_deprecated(tb, TCA_IFE_MAX, nla, ife_policy, - NULL); - if (err < 0) -@@ -502,7 +508,8 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla, - if (!p) - return -ENOMEM; - -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (err < 0) { - kfree(p); - return err; -@@ -514,10 +521,10 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla, - } - - if (!exists) { -- ret = tcf_idr_create(tn, parm->index, est, a, &act_ife_ops, -+ ret = tcf_idr_create(tn, index, est, a, &act_ife_ops, - bind, true); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - kfree(p); - return ret; - } -diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c -index 58e7573dded4..d10dca7a13e1 100644 ---- a/net/sched/act_mirred.c -+++ b/net/sched/act_mirred.c -@@ -101,6 +101,7 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla, - struct net_device *dev; - bool exists = false; - int ret, err; -+ u32 index; - - if (!nla) { - NL_SET_ERR_MSG_MOD(extack, "Mirred requires attributes to be passed"); -@@ -115,8 +116,8 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla, - return -EINVAL; - } - parm = nla_data(tb[TCA_MIRRED_PARMS]); -- -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (err < 0) - return err; - exists = err; -@@ -133,21 +134,21 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla, - if (exists) - tcf_idr_release(*a, bind); - else -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - NL_SET_ERR_MSG_MOD(extack, "Unknown mirred option"); - return -EINVAL; - } - - if (!exists) { - if (!parm->ifindex) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - NL_SET_ERR_MSG_MOD(extack, "Specified device does not exist"); - return -EINVAL; - } -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_mirred_ops, bind, true); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - ret = ACT_P_CREATED; -diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c -index 45923ebb7a4f..7b858c11b1b5 100644 ---- a/net/sched/act_nat.c -+++ b/net/sched/act_nat.c -@@ -44,6 +44,7 @@ static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est, - struct tc_nat *parm; - int ret = 0, err; - struct tcf_nat *p; -+ u32 index; - - if (nla == NULL) - return -EINVAL; -@@ -56,13 +57,13 @@ static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est, - if (tb[TCA_NAT_PARMS] == NULL) - return -EINVAL; - parm = nla_data(tb[TCA_NAT_PARMS]); -- -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (!err) { -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_nat_ops, bind, false); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - ret = ACT_P_CREATED; -diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c -index 45e9d6bfddb3..17360c6faeaa 100644 ---- a/net/sched/act_pedit.c -+++ b/net/sched/act_pedit.c -@@ -149,6 +149,7 @@ static int tcf_pedit_init(struct net *net, struct nlattr *nla, - struct tcf_pedit *p; - int ret = 0, err; - int ksize; -+ u32 index; - - if (!nla) { - NL_SET_ERR_MSG_MOD(extack, "Pedit requires attributes to be passed"); -@@ -179,18 +180,19 @@ static int tcf_pedit_init(struct net *net, struct nlattr *nla, - if (IS_ERR(keys_ex)) - return PTR_ERR(keys_ex); - -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (!err) { - if (!parm->nkeys) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - NL_SET_ERR_MSG_MOD(extack, "Pedit requires keys to be passed"); - ret = -EINVAL; - goto out_free; - } -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_pedit_ops, bind, false); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - goto out_free; - } - ret = ACT_P_CREATED; -diff --git a/net/sched/act_police.c b/net/sched/act_police.c -index a065f62fa79c..49cec3e64a4d 100644 ---- a/net/sched/act_police.c -+++ b/net/sched/act_police.c -@@ -57,6 +57,7 @@ static int tcf_police_init(struct net *net, struct nlattr *nla, - struct tc_action_net *tn = net_generic(net, police_net_id); - struct tcf_police_params *new; - bool exists = false; -+ u32 index; - - if (nla == NULL) - return -EINVAL; -@@ -73,7 +74,8 @@ static int tcf_police_init(struct net *net, struct nlattr *nla, - return -EINVAL; - - parm = nla_data(tb[TCA_POLICE_TBF]); -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (err < 0) - return err; - exists = err; -@@ -81,10 +83,10 @@ static int tcf_police_init(struct net *net, struct nlattr *nla, - return 0; - - if (!exists) { -- ret = tcf_idr_create(tn, parm->index, NULL, a, -+ ret = tcf_idr_create(tn, index, NULL, a, - &act_police_ops, bind, true); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - ret = ACT_P_CREATED; -diff --git a/net/sched/act_sample.c b/net/sched/act_sample.c -index 274d7a0c0e25..595308d60133 100644 ---- a/net/sched/act_sample.c -+++ b/net/sched/act_sample.c -@@ -41,8 +41,8 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, - struct tc_action_net *tn = net_generic(net, sample_net_id); - struct nlattr *tb[TCA_SAMPLE_MAX + 1]; - struct psample_group *psample_group; -+ u32 psample_group_num, rate, index; - struct tcf_chain *goto_ch = NULL; -- u32 psample_group_num, rate; - struct tc_sample *parm; - struct tcf_sample *s; - bool exists = false; -@@ -59,8 +59,8 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, - return -EINVAL; - - parm = nla_data(tb[TCA_SAMPLE_PARMS]); -- -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (err < 0) - return err; - exists = err; -@@ -68,10 +68,10 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, - return 0; - - if (!exists) { -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_sample_ops, bind, true); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - ret = ACT_P_CREATED; -diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c -index f28ddbabff76..33aefa25b545 100644 ---- a/net/sched/act_simple.c -+++ b/net/sched/act_simple.c -@@ -95,6 +95,7 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla, - struct tcf_defact *d; - bool exists = false; - int ret = 0, err; -+ u32 index; - - if (nla == NULL) - return -EINVAL; -@@ -108,7 +109,8 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla, - return -EINVAL; - - parm = nla_data(tb[TCA_DEF_PARMS]); -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (err < 0) - return err; - exists = err; -@@ -119,15 +121,15 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla, - if (exists) - tcf_idr_release(*a, bind); - else -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return -EINVAL; - } - - if (!exists) { -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_simp_ops, bind, false); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - -diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c -index 215a06705cef..b100870f02a6 100644 ---- a/net/sched/act_skbedit.c -+++ b/net/sched/act_skbedit.c -@@ -99,6 +99,7 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla, - u16 *queue_mapping = NULL, *ptype = NULL; - bool exists = false; - int ret = 0, err; -+ u32 index; - - if (nla == NULL) - return -EINVAL; -@@ -146,8 +147,8 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla, - } - - parm = nla_data(tb[TCA_SKBEDIT_PARMS]); -- -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (err < 0) - return err; - exists = err; -@@ -158,15 +159,15 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla, - if (exists) - tcf_idr_release(*a, bind); - else -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return -EINVAL; - } - - if (!exists) { -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_skbedit_ops, bind, true); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - -diff --git a/net/sched/act_skbmod.c b/net/sched/act_skbmod.c -index 4f07706eff07..7da3518e18ef 100644 ---- a/net/sched/act_skbmod.c -+++ b/net/sched/act_skbmod.c -@@ -87,12 +87,12 @@ static int tcf_skbmod_init(struct net *net, struct nlattr *nla, - struct tcf_skbmod_params *p, *p_old; - struct tcf_chain *goto_ch = NULL; - struct tc_skbmod *parm; -+ u32 lflags = 0, index; - struct tcf_skbmod *d; - bool exists = false; - u8 *daddr = NULL; - u8 *saddr = NULL; - u16 eth_type = 0; -- u32 lflags = 0; - int ret = 0, err; - - if (!nla) -@@ -122,10 +122,11 @@ static int tcf_skbmod_init(struct net *net, struct nlattr *nla, - } - - parm = nla_data(tb[TCA_SKBMOD_PARMS]); -+ index = parm->index; - if (parm->flags & SKBMOD_F_SWAPMAC) - lflags = SKBMOD_F_SWAPMAC; - -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (err < 0) - return err; - exists = err; -@@ -136,15 +137,15 @@ static int tcf_skbmod_init(struct net *net, struct nlattr *nla, - if (exists) - tcf_idr_release(*a, bind); - else -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return -EINVAL; - } - - if (!exists) { -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_skbmod_ops, bind, true); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - -diff --git a/net/sched/act_tunnel_key.c b/net/sched/act_tunnel_key.c -index 10dffda1d5cc..6d0debdc9b97 100644 ---- a/net/sched/act_tunnel_key.c -+++ b/net/sched/act_tunnel_key.c -@@ -225,6 +225,7 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, - __be16 flags = 0; - u8 tos, ttl; - int ret = 0; -+ u32 index; - int err; - - if (!nla) { -@@ -245,7 +246,8 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, - } - - parm = nla_data(tb[TCA_TUNNEL_KEY_PARMS]); -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (err < 0) - return err; - exists = err; -@@ -345,7 +347,7 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, - } - - if (!exists) { -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_tunnel_key_ops, bind, true); - if (ret) { - NL_SET_ERR_MSG(extack, "Cannot create TC IDR"); -@@ -403,7 +405,7 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, - if (exists) - tcf_idr_release(*a, bind); - else -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - -diff --git a/net/sched/act_vlan.c b/net/sched/act_vlan.c -index 9269d350fb8a..a3c9eea1ee8a 100644 ---- a/net/sched/act_vlan.c -+++ b/net/sched/act_vlan.c -@@ -116,6 +116,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, - u8 push_prio = 0; - bool exists = false; - int ret = 0, err; -+ u32 index; - - if (!nla) - return -EINVAL; -@@ -128,7 +129,8 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, - if (!tb[TCA_VLAN_PARMS]) - return -EINVAL; - parm = nla_data(tb[TCA_VLAN_PARMS]); -- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); -+ index = parm->index; -+ err = tcf_idr_check_alloc(tn, &index, a, bind); - if (err < 0) - return err; - exists = err; -@@ -144,7 +146,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, - if (exists) - tcf_idr_release(*a, bind); - else -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return -EINVAL; - } - push_vid = nla_get_u16(tb[TCA_VLAN_PUSH_VLAN_ID]); -@@ -152,7 +154,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, - if (exists) - tcf_idr_release(*a, bind); - else -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return -ERANGE; - } - -@@ -166,7 +168,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, - if (exists) - tcf_idr_release(*a, bind); - else -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return -EPROTONOSUPPORT; - } - } else { -@@ -180,16 +182,16 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, - if (exists) - tcf_idr_release(*a, bind); - else -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return -EINVAL; - } - action = parm->v_action; - - if (!exists) { -- ret = tcf_idr_create(tn, parm->index, est, a, -+ ret = tcf_idr_create(tn, index, est, a, - &act_vlan_ops, bind, true); - if (ret) { -- tcf_idr_cleanup(tn, parm->index); -+ tcf_idr_cleanup(tn, index); - return ret; - } - -@@ -306,6 +308,14 @@ static int tcf_vlan_search(struct net *net, struct tc_action **a, u32 index) - return tcf_idr_search(tn, a, index); - } - -+static size_t tcf_vlan_get_fill_size(const struct tc_action *act) -+{ -+ return nla_total_size(sizeof(struct tc_vlan)) -+ + nla_total_size(sizeof(u16)) /* TCA_VLAN_PUSH_VLAN_ID */ -+ + nla_total_size(sizeof(u16)) /* TCA_VLAN_PUSH_VLAN_PROTOCOL */ -+ + nla_total_size(sizeof(u8)); /* TCA_VLAN_PUSH_VLAN_PRIORITY */ -+} -+ - static struct tc_action_ops act_vlan_ops = { - .kind = "vlan", - .id = TCA_ID_VLAN, -@@ -315,6 +325,7 @@ static struct tc_action_ops act_vlan_ops = { - .init = tcf_vlan_init, - .cleanup = tcf_vlan_cleanup, - .walk = tcf_vlan_walker, -+ .get_fill_size = tcf_vlan_get_fill_size, - .lookup = tcf_vlan_search, - .size = sizeof(struct tcf_vlan), - }; -diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c -index ad36bbcc583e..b67c456f26aa 100644 ---- a/net/sched/cls_api.c -+++ b/net/sched/cls_api.c -@@ -2160,6 +2160,9 @@ static int tc_new_tfilter(struct sk_buff *skb, struct nlmsghdr *n, - tfilter_notify(net, skb, n, tp, block, q, parent, fh, - RTM_NEWTFILTER, false, rtnl_held); - tfilter_put(tp, fh); -+ /* q pointer is NULL for shared blocks */ -+ if (q) -+ q->flags &= ~TCQ_F_CAN_BYPASS; - } - - errout: -diff --git a/net/sched/sch_codel.c b/net/sched/sch_codel.c -index 25ef172c23df..30169b3adbbb 100644 ---- a/net/sched/sch_codel.c -+++ b/net/sched/sch_codel.c -@@ -71,10 +71,10 @@ static struct sk_buff *dequeue_func(struct codel_vars *vars, void *ctx) - struct Qdisc *sch = ctx; - struct sk_buff *skb = __qdisc_dequeue_head(&sch->q); - -- if (skb) -+ if (skb) { - sch->qstats.backlog -= qdisc_pkt_len(skb); -- -- prefetch(&skb->end); /* we'll need skb_shinfo() */ -+ prefetch(&skb->end); /* we'll need skb_shinfo() */ -+ } - return skb; - } - -diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c -index e2faf33d282b..d59fbcc745d1 100644 ---- a/net/sched/sch_fq_codel.c -+++ b/net/sched/sch_fq_codel.c -@@ -596,8 +596,6 @@ static unsigned long fq_codel_find(struct Qdisc *sch, u32 classid) - static unsigned long fq_codel_bind(struct Qdisc *sch, unsigned long parent, - u32 classid) - { -- /* we cannot bypass queue discipline anymore */ -- sch->flags &= ~TCQ_F_CAN_BYPASS; - return 0; - } - -diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c -index 420bd8411677..68404a9d2ce4 100644 ---- a/net/sched/sch_sfq.c -+++ b/net/sched/sch_sfq.c -@@ -824,8 +824,6 @@ static unsigned long sfq_find(struct Qdisc *sch, u32 classid) - static unsigned long sfq_bind(struct Qdisc *sch, unsigned long parent, - u32 classid) - { -- /* we cannot bypass queue discipline anymore */ -- sch->flags &= ~TCQ_F_CAN_BYPASS; - return 0; - } - -diff --git a/net/sctp/socket.c b/net/sctp/socket.c -index 39ea0a37af09..f33aa9ee9e27 100644 ---- a/net/sctp/socket.c -+++ b/net/sctp/socket.c -@@ -4816,35 +4816,17 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname, - static int sctp_connect(struct sock *sk, struct sockaddr *addr, - int addr_len, int flags) - { -- struct inet_sock *inet = inet_sk(sk); - struct sctp_af *af; -- int err = 0; -+ int err = -EINVAL; - - lock_sock(sk); -- - pr_debug("%s: sk:%p, sockaddr:%p, addr_len:%d\n", __func__, sk, - addr, addr_len); - -- /* We may need to bind the socket. */ -- if (!inet->inet_num) { -- if (sk->sk_prot->get_port(sk, 0)) { -- release_sock(sk); -- return -EAGAIN; -- } -- inet->inet_sport = htons(inet->inet_num); -- } -- - /* Validate addr_len before calling common connect/connectx routine. */ -- af = addr_len < offsetofend(struct sockaddr, sa_family) ? NULL : -- sctp_get_af_specific(addr->sa_family); -- if (!af || addr_len < af->sockaddr_len) { -- err = -EINVAL; -- } else { -- /* Pass correct addr len to common routine (so it knows there -- * is only one address being passed. -- */ -+ af = sctp_get_af_specific(addr->sa_family); -+ if (af && addr_len >= af->sockaddr_len) - err = __sctp_connect(sk, addr, af->sockaddr_len, flags, NULL); -- } - - release_sock(sk); - return err; -diff --git a/net/sctp/stream.c b/net/sctp/stream.c -index 93ed07877337..25946604af85 100644 ---- a/net/sctp/stream.c -+++ b/net/sctp/stream.c -@@ -153,13 +153,20 @@ int sctp_stream_init(struct sctp_stream *stream, __u16 outcnt, __u16 incnt, - int sctp_stream_init_ext(struct sctp_stream *stream, __u16 sid) - { - struct sctp_stream_out_ext *soute; -+ int ret; - - soute = kzalloc(sizeof(*soute), GFP_KERNEL); - if (!soute) - return -ENOMEM; - SCTP_SO(stream, sid)->ext = soute; - -- return sctp_sched_init_sid(stream, sid, GFP_KERNEL); -+ ret = sctp_sched_init_sid(stream, sid, GFP_KERNEL); -+ if (ret) { -+ kfree(SCTP_SO(stream, sid)->ext); -+ SCTP_SO(stream, sid)->ext = NULL; -+ } -+ -+ return ret; - } - - void sctp_stream_free(struct sctp_stream *stream) -diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c -index 7621ec2f539c..a3cc879d2589 100644 ---- a/net/smc/af_smc.c -+++ b/net/smc/af_smc.c -@@ -253,7 +253,7 @@ static int smc_bind(struct socket *sock, struct sockaddr *uaddr, - - /* Check if socket is already active */ - rc = -EINVAL; -- if (sk->sk_state != SMC_INIT) -+ if (sk->sk_state != SMC_INIT || smc->connect_nonblock) - goto out_rel; - - smc->clcsock->sk->sk_reuse = sk->sk_reuse; -@@ -1399,7 +1399,8 @@ static int smc_listen(struct socket *sock, int backlog) - lock_sock(sk); - - rc = -EINVAL; -- if ((sk->sk_state != SMC_INIT) && (sk->sk_state != SMC_LISTEN)) -+ if ((sk->sk_state != SMC_INIT && sk->sk_state != SMC_LISTEN) || -+ smc->connect_nonblock) - goto out; - - rc = 0; -@@ -1527,7 +1528,7 @@ static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) - goto out; - - if (msg->msg_flags & MSG_FASTOPEN) { -- if (sk->sk_state == SMC_INIT) { -+ if (sk->sk_state == SMC_INIT && !smc->connect_nonblock) { - smc_switch_to_fallback(smc); - smc->fallback_rsn = SMC_CLC_DECL_OPTUNSUPP; - } else { -@@ -1741,14 +1742,18 @@ static int smc_setsockopt(struct socket *sock, int level, int optname, - } - break; - case TCP_NODELAY: -- if (sk->sk_state != SMC_INIT && sk->sk_state != SMC_LISTEN) { -+ if (sk->sk_state != SMC_INIT && -+ sk->sk_state != SMC_LISTEN && -+ sk->sk_state != SMC_CLOSED) { - if (val && !smc->use_fallback) - mod_delayed_work(system_wq, &smc->conn.tx_work, - 0); - } - break; - case TCP_CORK: -- if (sk->sk_state != SMC_INIT && sk->sk_state != SMC_LISTEN) { -+ if (sk->sk_state != SMC_INIT && -+ sk->sk_state != SMC_LISTEN && -+ sk->sk_state != SMC_CLOSED) { - if (!val && !smc->use_fallback) - mod_delayed_work(system_wq, &smc->conn.tx_work, - 0); -diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c -index b03bfa055c08..9e1743b364ec 100644 ---- a/net/sunrpc/clnt.c -+++ b/net/sunrpc/clnt.c -@@ -1788,6 +1788,7 @@ rpc_xdr_encode(struct rpc_task *task) - req->rq_snd_buf.head[0].iov_len = 0; - xdr_init_encode(&xdr, &req->rq_snd_buf, - req->rq_snd_buf.head[0].iov_base, req); -+ xdr_free_bvec(&req->rq_snd_buf); - if (rpc_encode_header(task, &xdr)) - return; - -@@ -1827,8 +1828,6 @@ call_encode(struct rpc_task *task) - rpc_call_rpcerror(task, task->tk_status); - } - return; -- } else { -- xprt_request_prepare(task->tk_rqstp); - } - - /* Add task to reply queue before transmission to avoid races */ -diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c -index f6c82b1651e7..5ddd34ad64b9 100644 ---- a/net/sunrpc/xprt.c -+++ b/net/sunrpc/xprt.c -@@ -1013,6 +1013,8 @@ xprt_request_enqueue_receive(struct rpc_task *task) - - if (!xprt_request_need_enqueue_receive(task, req)) - return; -+ -+ xprt_request_prepare(task->tk_rqstp); - spin_lock(&xprt->queue_lock); - - /* Update the softirq receive buffer */ -diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c -index 36652352a38c..85166c552542 100644 ---- a/net/sunrpc/xprtsock.c -+++ b/net/sunrpc/xprtsock.c -@@ -909,6 +909,7 @@ static int xs_nospace(struct rpc_rqst *req) - static void - xs_stream_prepare_request(struct rpc_rqst *req) - { -+ xdr_free_bvec(&req->rq_rcv_buf); - req->rq_task->tk_status = xdr_alloc_bvec(&req->rq_rcv_buf, GFP_KERNEL); - } - -diff --git a/net/tipc/netlink_compat.c b/net/tipc/netlink_compat.c -index cf155061c472..acd8a72169c1 100644 ---- a/net/tipc/netlink_compat.c -+++ b/net/tipc/netlink_compat.c -@@ -55,6 +55,7 @@ struct tipc_nl_compat_msg { - int rep_type; - int rep_size; - int req_type; -+ int req_size; - struct net *net; - struct sk_buff *rep; - struct tlv_desc *req; -@@ -257,7 +258,8 @@ static int tipc_nl_compat_dumpit(struct tipc_nl_compat_cmd_dump *cmd, - int err; - struct sk_buff *arg; - -- if (msg->req_type && !TLV_CHECK_TYPE(msg->req, msg->req_type)) -+ if (msg->req_type && (!msg->req_size || -+ !TLV_CHECK_TYPE(msg->req, msg->req_type))) - return -EINVAL; - - msg->rep = tipc_tlv_alloc(msg->rep_size); -@@ -354,7 +356,8 @@ static int tipc_nl_compat_doit(struct tipc_nl_compat_cmd_doit *cmd, - { - int err; - -- if (msg->req_type && !TLV_CHECK_TYPE(msg->req, msg->req_type)) -+ if (msg->req_type && (!msg->req_size || -+ !TLV_CHECK_TYPE(msg->req, msg->req_type))) - return -EINVAL; - - err = __tipc_nl_compat_doit(cmd, msg); -@@ -1288,8 +1291,8 @@ static int tipc_nl_compat_recv(struct sk_buff *skb, struct genl_info *info) - goto send; - } - -- len = nlmsg_attrlen(req_nlh, GENL_HDRLEN + TIPC_GENL_HDRLEN); -- if (!len || !TLV_OK(msg.req, len)) { -+ msg.req_size = nlmsg_attrlen(req_nlh, GENL_HDRLEN + TIPC_GENL_HDRLEN); -+ if (msg.req_size && !TLV_OK(msg.req, msg.req_size)) { - msg.rep = tipc_get_err_tlv(TIPC_CFG_NOT_SUPPORTED); - err = -EOPNOTSUPP; - goto send; -diff --git a/net/tipc/socket.c b/net/tipc/socket.c -index dd8537f988c4..83ae41d7e554 100644 ---- a/net/tipc/socket.c -+++ b/net/tipc/socket.c -@@ -485,9 +485,8 @@ static int tipc_sk_create(struct net *net, struct socket *sock, - tsk_set_unreturnable(tsk, true); - if (sock->type == SOCK_DGRAM) - tsk_set_unreliable(tsk, true); -- __skb_queue_head_init(&tsk->mc_method.deferredq); - } -- -+ __skb_queue_head_init(&tsk->mc_method.deferredq); - trace_tipc_sk_create(sk, NULL, TIPC_DUMP_NONE, " "); - return 0; - } -diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c -index 1f9cf57d9754..eb8f24f420f0 100644 ---- a/net/tls/tls_device.c -+++ b/net/tls/tls_device.c -@@ -61,7 +61,7 @@ static void tls_device_free_ctx(struct tls_context *ctx) - if (ctx->rx_conf == TLS_HW) - kfree(tls_offload_ctx_rx(ctx)); - -- kfree(ctx); -+ tls_ctx_free(ctx); - } - - static void tls_device_gc_task(struct work_struct *work) -@@ -742,6 +742,11 @@ int tls_set_device_offload(struct sock *sk, struct tls_context *ctx) - } - - crypto_info = &ctx->crypto_send.info; -+ if (crypto_info->version != TLS_1_2_VERSION) { -+ rc = -EOPNOTSUPP; -+ goto free_offload_ctx; -+ } -+ - switch (crypto_info->cipher_type) { - case TLS_CIPHER_AES_GCM_128: - nonce_size = TLS_CIPHER_AES_GCM_128_IV_SIZE; -@@ -876,6 +881,9 @@ int tls_set_device_offload_rx(struct sock *sk, struct tls_context *ctx) - struct net_device *netdev; - int rc = 0; - -+ if (ctx->crypto_recv.info.version != TLS_1_2_VERSION) -+ return -EOPNOTSUPP; -+ - /* We support starting offload on multiple sockets - * concurrently, so we only need a read lock here. - * This lock must precede get_netdev_for_sock to prevent races between -diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c -index e2b69e805d46..4674e57e66b0 100644 ---- a/net/tls/tls_main.c -+++ b/net/tls/tls_main.c -@@ -251,7 +251,7 @@ static void tls_write_space(struct sock *sk) - ctx->sk_write_space(sk); - } - --static void tls_ctx_free(struct tls_context *ctx) -+void tls_ctx_free(struct tls_context *ctx) - { - if (!ctx) - return; -@@ -643,7 +643,7 @@ static void tls_hw_sk_destruct(struct sock *sk) - - ctx->sk_destruct(sk); - /* Free ctx */ -- kfree(ctx); -+ tls_ctx_free(ctx); - icsk->icsk_ulp_data = NULL; - } - -diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c -index 455a782c7658..e2385183526e 100644 ---- a/net/tls/tls_sw.c -+++ b/net/tls/tls_sw.c -@@ -1958,7 +1958,8 @@ bool tls_sw_stream_read(const struct sock *sk) - ingress_empty = list_empty(&psock->ingress_msg); - rcu_read_unlock(); - -- return !ingress_empty || ctx->recv_pkt; -+ return !ingress_empty || ctx->recv_pkt || -+ !skb_queue_empty(&ctx->rx_list); - } - - static int tls_read_size(struct strparser *strp, struct sk_buff *skb) -diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c -index 169112f8aa1e..ab47bf3ab66e 100644 ---- a/net/vmw_vsock/af_vsock.c -+++ b/net/vmw_vsock/af_vsock.c -@@ -274,7 +274,8 @@ EXPORT_SYMBOL_GPL(vsock_insert_connected); - void vsock_remove_bound(struct vsock_sock *vsk) - { - spin_lock_bh(&vsock_table_lock); -- __vsock_remove_bound(vsk); -+ if (__vsock_in_bound_table(vsk)) -+ __vsock_remove_bound(vsk); - spin_unlock_bh(&vsock_table_lock); - } - EXPORT_SYMBOL_GPL(vsock_remove_bound); -@@ -282,7 +283,8 @@ EXPORT_SYMBOL_GPL(vsock_remove_bound); - void vsock_remove_connected(struct vsock_sock *vsk) - { - spin_lock_bh(&vsock_table_lock); -- __vsock_remove_connected(vsk); -+ if (__vsock_in_connected_table(vsk)) -+ __vsock_remove_connected(vsk); - spin_unlock_bh(&vsock_table_lock); - } - EXPORT_SYMBOL_GPL(vsock_remove_connected); -@@ -318,35 +320,10 @@ struct sock *vsock_find_connected_socket(struct sockaddr_vm *src, - } - EXPORT_SYMBOL_GPL(vsock_find_connected_socket); - --static bool vsock_in_bound_table(struct vsock_sock *vsk) --{ -- bool ret; -- -- spin_lock_bh(&vsock_table_lock); -- ret = __vsock_in_bound_table(vsk); -- spin_unlock_bh(&vsock_table_lock); -- -- return ret; --} -- --static bool vsock_in_connected_table(struct vsock_sock *vsk) --{ -- bool ret; -- -- spin_lock_bh(&vsock_table_lock); -- ret = __vsock_in_connected_table(vsk); -- spin_unlock_bh(&vsock_table_lock); -- -- return ret; --} -- - void vsock_remove_sock(struct vsock_sock *vsk) - { -- if (vsock_in_bound_table(vsk)) -- vsock_remove_bound(vsk); -- -- if (vsock_in_connected_table(vsk)) -- vsock_remove_connected(vsk); -+ vsock_remove_bound(vsk); -+ vsock_remove_connected(vsk); - } - EXPORT_SYMBOL_GPL(vsock_remove_sock); - -@@ -477,8 +454,7 @@ static void vsock_pending_work(struct work_struct *work) - * incoming packets can't find this socket, and to reduce the reference - * count. - */ -- if (vsock_in_connected_table(vsk)) -- vsock_remove_connected(vsk); -+ vsock_remove_connected(vsk); - - sk->sk_state = TCP_CLOSE; - -diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c -index 62dcdf082349..6c81a911fc02 100644 ---- a/net/vmw_vsock/hyperv_transport.c -+++ b/net/vmw_vsock/hyperv_transport.c -@@ -311,6 +311,11 @@ static void hvs_close_connection(struct vmbus_channel *chan) - lock_sock(sk); - hvs_do_close_lock_held(vsock_sk(sk), true); - release_sock(sk); -+ -+ /* Release the refcnt for the channel that's opened in -+ * hvs_open_connection(). -+ */ -+ sock_put(sk); - } - - static void hvs_open_connection(struct vmbus_channel *chan) -@@ -378,6 +383,9 @@ static void hvs_open_connection(struct vmbus_channel *chan) - } - - set_per_channel_state(chan, conn_from_host ? new : sk); -+ -+ /* This reference will be dropped by hvs_close_connection(). */ -+ sock_hold(conn_from_host ? new : sk); - vmbus_set_chn_rescind_callback(chan, hvs_close_connection); - - /* Set the pending send size to max packet size to always get -diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c -index a14e8864e4fa..5e0637db92ea 100644 ---- a/net/xdp/xsk.c -+++ b/net/xdp/xsk.c -@@ -123,13 +123,17 @@ int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) - u64 addr; - int err; - -- if (xs->dev != xdp->rxq->dev || xs->queue_id != xdp->rxq->queue_index) -- return -EINVAL; -+ spin_lock_bh(&xs->rx_lock); -+ -+ if (xs->dev != xdp->rxq->dev || xs->queue_id != xdp->rxq->queue_index) { -+ err = -EINVAL; -+ goto out_unlock; -+ } - - if (!xskq_peek_addr(xs->umem->fq, &addr) || - len > xs->umem->chunk_size_nohr - XDP_PACKET_HEADROOM) { -- xs->rx_dropped++; -- return -ENOSPC; -+ err = -ENOSPC; -+ goto out_drop; - } - - addr += xs->umem->headroom; -@@ -138,13 +142,21 @@ int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) - memcpy(buffer, xdp->data_meta, len + metalen); - addr += metalen; - err = xskq_produce_batch_desc(xs->rx, addr, len); -- if (!err) { -- xskq_discard_addr(xs->umem->fq); -- xsk_flush(xs); -- return 0; -- } -+ if (err) -+ goto out_drop; -+ -+ xskq_discard_addr(xs->umem->fq); -+ xskq_produce_flush_desc(xs->rx); - -+ spin_unlock_bh(&xs->rx_lock); -+ -+ xs->sk.sk_data_ready(&xs->sk); -+ return 0; -+ -+out_drop: - xs->rx_dropped++; -+out_unlock: -+ spin_unlock_bh(&xs->rx_lock); - return err; - } - -@@ -765,6 +777,7 @@ static int xsk_create(struct net *net, struct socket *sock, int protocol, - - xs = xdp_sk(sk); - mutex_init(&xs->mutex); -+ spin_lock_init(&xs->rx_lock); - spin_lock_init(&xs->tx_completion_lock); - - mutex_lock(&net->xdp.lock); -diff --git a/net/xdp/xsk_queue.h b/net/xdp/xsk_queue.h -index 88b9ae24658d..cba4a640d5e8 100644 ---- a/net/xdp/xsk_queue.h -+++ b/net/xdp/xsk_queue.h -@@ -288,7 +288,7 @@ static inline void xskq_produce_flush_desc(struct xsk_queue *q) - /* Order producer and data */ - smp_wmb(); /* B, matches C */ - -- q->prod_tail = q->prod_head, -+ q->prod_tail = q->prod_head; - WRITE_ONCE(q->ring->producer, q->prod_tail); - } - -diff --git a/net/xfrm/Kconfig b/net/xfrm/Kconfig -index c967fc3c38c8..51bb6018f3bf 100644 ---- a/net/xfrm/Kconfig -+++ b/net/xfrm/Kconfig -@@ -15,6 +15,8 @@ config XFRM_ALGO - tristate - select XFRM - select CRYPTO -+ select CRYPTO_HASH -+ select CRYPTO_BLKCIPHER - - if INET - config XFRM_USER -diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c -index b1694d5d15d3..82be7780bbe8 100644 ---- a/net/xfrm/xfrm_policy.c -+++ b/net/xfrm/xfrm_policy.c -@@ -1280,13 +1280,17 @@ static void xfrm_hash_rebuild(struct work_struct *work) - - hlist_for_each_entry_safe(policy, n, - &net->xfrm.policy_inexact[dir], -- bydst_inexact_list) -+ bydst_inexact_list) { -+ hlist_del_rcu(&policy->bydst); - hlist_del_init(&policy->bydst_inexact_list); -+ } - - hmask = net->xfrm.policy_bydst[dir].hmask; - odst = net->xfrm.policy_bydst[dir].table; -- for (i = hmask; i >= 0; i--) -- INIT_HLIST_HEAD(odst + i); -+ for (i = hmask; i >= 0; i--) { -+ hlist_for_each_entry_safe(policy, n, odst + i, bydst) -+ hlist_del_rcu(&policy->bydst); -+ } - if ((dir & XFRM_POLICY_MASK) == XFRM_POLICY_OUT) { - /* dir out => dst = remote, src = local */ - net->xfrm.policy_bydst[dir].dbits4 = rbits4; -@@ -1315,8 +1319,6 @@ static void xfrm_hash_rebuild(struct work_struct *work) - chain = policy_hash_bysel(net, &policy->selector, - policy->family, dir); - -- hlist_del_rcu(&policy->bydst); -- - if (!chain) { - void *p = xfrm_policy_inexact_insert(policy, dir, 0); - -diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c -index 173477211e40..b88ba45ff1ac 100644 ---- a/net/xfrm/xfrm_user.c -+++ b/net/xfrm/xfrm_user.c -@@ -151,6 +151,25 @@ static int verify_newsa_info(struct xfrm_usersa_info *p, - - err = -EINVAL; - switch (p->family) { -+ case AF_INET: -+ break; -+ -+ case AF_INET6: -+#if IS_ENABLED(CONFIG_IPV6) -+ break; -+#else -+ err = -EAFNOSUPPORT; -+ goto out; -+#endif -+ -+ default: -+ goto out; -+ } -+ -+ switch (p->sel.family) { -+ case AF_UNSPEC: -+ break; -+ - case AF_INET: - if (p->sel.prefixlen_d > 32 || p->sel.prefixlen_s > 32) - goto out; -diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost -index fec6ec2ffa47..38d77353c66a 100644 ---- a/scripts/Makefile.modpost -+++ b/scripts/Makefile.modpost -@@ -142,10 +142,8 @@ FORCE: - # optimization, we don't need to read them if the target does not - # exist, we will rebuild anyway in that case. - --cmd_files := $(wildcard $(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd)) -+existing-targets := $(wildcard $(sort $(targets))) - --ifneq ($(cmd_files),) -- include $(cmd_files) --endif -+-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) - - .PHONY: $(PHONY) -diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c -index facbd603adf6..9ba47b0a47b9 100644 ---- a/scripts/basic/fixdep.c -+++ b/scripts/basic/fixdep.c -@@ -99,6 +99,7 @@ - #include - #include - #include -+#include - #include - #include - #include -@@ -109,6 +110,36 @@ static void usage(void) - exit(1); - } - -+/* -+ * In the intended usage of this program, the stdout is redirected to .*.cmd -+ * files. The return value of printf() and putchar() must be checked to catch -+ * any error, e.g. "No space left on device". -+ */ -+static void xprintf(const char *format, ...) -+{ -+ va_list ap; -+ int ret; -+ -+ va_start(ap, format); -+ ret = vprintf(format, ap); -+ if (ret < 0) { -+ perror("fixdep"); -+ exit(1); -+ } -+ va_end(ap); -+} -+ -+static void xputchar(int c) -+{ -+ int ret; -+ -+ ret = putchar(c); -+ if (ret == EOF) { -+ perror("fixdep"); -+ exit(1); -+ } -+} -+ - /* - * Print out a dependency path from a symbol name - */ -@@ -116,7 +147,7 @@ static void print_dep(const char *m, int slen, const char *dir) - { - int c, prev_c = '/', i; - -- printf(" $(wildcard %s/", dir); -+ xprintf(" $(wildcard %s/", dir); - for (i = 0; i < slen; i++) { - c = m[i]; - if (c == '_') -@@ -124,10 +155,10 @@ static void print_dep(const char *m, int slen, const char *dir) - else - c = tolower(c); - if (c != '/' || prev_c != '/') -- putchar(c); -+ xputchar(c); - prev_c = c; - } -- printf(".h) \\\n"); -+ xprintf(".h) \\\n"); - } - - struct item { -@@ -324,13 +355,13 @@ static void parse_dep_file(char *m, const char *target) - */ - if (!saw_any_target) { - saw_any_target = 1; -- printf("source_%s := %s\n\n", -- target, m); -- printf("deps_%s := \\\n", target); -+ xprintf("source_%s := %s\n\n", -+ target, m); -+ xprintf("deps_%s := \\\n", target); - } - is_first_dep = 0; - } else { -- printf(" %s \\\n", m); -+ xprintf(" %s \\\n", m); - } - - buf = read_file(m); -@@ -353,8 +384,8 @@ static void parse_dep_file(char *m, const char *target) - exit(1); - } - -- printf("\n%s: $(deps_%s)\n\n", target, target); -- printf("$(deps_%s):\n", target); -+ xprintf("\n%s: $(deps_%s)\n\n", target, target); -+ xprintf("$(deps_%s):\n", target); - } - - int main(int argc, char *argv[]) -@@ -369,7 +400,7 @@ int main(int argc, char *argv[]) - target = argv[2]; - cmdline = argv[3]; - -- printf("cmd_%s := %s\n\n", target, cmdline); -+ xprintf("cmd_%s := %s\n\n", target, cmdline); - - buf = read_file(depfile); - parse_dep_file(buf, target); -diff --git a/scripts/genksyms/keywords.c b/scripts/genksyms/keywords.c -index e93336baaaed..c586d32dd2c3 100644 ---- a/scripts/genksyms/keywords.c -+++ b/scripts/genksyms/keywords.c -@@ -25,6 +25,10 @@ static struct resword { - { "__volatile__", VOLATILE_KEYW }, - { "__builtin_va_list", VA_LIST_KEYW }, - -+ { "__int128", BUILTIN_INT_KEYW }, -+ { "__int128_t", BUILTIN_INT_KEYW }, -+ { "__uint128_t", BUILTIN_INT_KEYW }, -+ - // According to rth, c99 defines "_Bool", __restrict", __restrict__", "restrict". KAO - { "_Bool", BOOL_KEYW }, - { "_restrict", RESTRICT_KEYW }, -diff --git a/scripts/genksyms/parse.y b/scripts/genksyms/parse.y -index 00a6d7e54971..1ebcf52cd0f9 100644 ---- a/scripts/genksyms/parse.y -+++ b/scripts/genksyms/parse.y -@@ -76,6 +76,7 @@ static void record_compound(struct string_list **keyw, - %token ATTRIBUTE_KEYW - %token AUTO_KEYW - %token BOOL_KEYW -+%token BUILTIN_INT_KEYW - %token CHAR_KEYW - %token CONST_KEYW - %token DOUBLE_KEYW -@@ -263,6 +264,7 @@ simple_type_specifier: - | VOID_KEYW - | BOOL_KEYW - | VA_LIST_KEYW -+ | BUILTIN_INT_KEYW - | TYPE { (*$1)->tag = SYM_TYPEDEF; $$ = $1; } - ; - -diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c -index e17837f1d3f2..ae6504d07fd6 100644 ---- a/scripts/kallsyms.c -+++ b/scripts/kallsyms.c -@@ -150,6 +150,9 @@ static int read_symbol(FILE *in, struct sym_entry *s) - /* exclude debugging symbols */ - else if (stype == 'N' || stype == 'n') - return -1; -+ /* exclude s390 kasan local symbols */ -+ else if (!strncmp(sym, ".LASANPC", 8)) -+ return -1; - - /* include the type field in the symbol name, so that it gets - * compressed together */ -diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c -index 6006154d36bd..27964917cbfd 100644 ---- a/scripts/kconfig/confdata.c -+++ b/scripts/kconfig/confdata.c -@@ -867,6 +867,7 @@ int conf_write(const char *name) - const char *str; - char tmpname[PATH_MAX + 1], oldname[PATH_MAX + 1]; - char *env; -+ int i; - bool need_newline = false; - - if (!name) -@@ -914,7 +915,8 @@ int conf_write(const char *name) - "# %s\n" - "#\n", str); - need_newline = false; -- } else if (!(sym->flags & SYMBOL_CHOICE)) { -+ } else if (!(sym->flags & SYMBOL_CHOICE) && -+ !(sym->flags & SYMBOL_WRITTEN)) { - sym_calc_value(sym); - if (!(sym->flags & SYMBOL_WRITE)) - goto next; -@@ -922,7 +924,7 @@ int conf_write(const char *name) - fprintf(out, "\n"); - need_newline = false; - } -- sym->flags &= ~SYMBOL_WRITE; -+ sym->flags |= SYMBOL_WRITTEN; - conf_write_symbol(out, sym, &kconfig_printer_cb, NULL); - } - -@@ -948,6 +950,9 @@ int conf_write(const char *name) - } - fclose(out); - -+ for_all_symbols(i, sym) -+ sym->flags &= ~SYMBOL_WRITTEN; -+ - if (*tmpname) { - if (is_same(name, tmpname)) { - conf_message("No change to %s", name); -@@ -1082,8 +1087,6 @@ int conf_write_autoconf(int overwrite) - if (!overwrite && is_present(autoconf_name)) - return 0; - -- sym_clear_all_valid(); -- - conf_write_dep("include/config/auto.conf.cmd"); - - if (conf_touch_deps()) -diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h -index 8dde65bc3165..017843c9a4f4 100644 ---- a/scripts/kconfig/expr.h -+++ b/scripts/kconfig/expr.h -@@ -141,6 +141,7 @@ struct symbol { - #define SYMBOL_OPTIONAL 0x0100 /* choice is optional - values can be 'n' */ - #define SYMBOL_WRITE 0x0200 /* write symbol to file (KCONFIG_CONFIG) */ - #define SYMBOL_CHANGED 0x0400 /* ? */ -+#define SYMBOL_WRITTEN 0x0800 /* track info to avoid double-write to .config */ - #define SYMBOL_NO_WRITE 0x1000 /* Symbol for internal use only; it will not be written */ - #define SYMBOL_CHECKED 0x2000 /* used during dependency checking */ - #define SYMBOL_WARNED 0x8000 /* warning has been issued */ -diff --git a/scripts/mkcompile_h b/scripts/mkcompile_h -index 2339f86126cb..0c0179cce09c 100755 ---- a/scripts/mkcompile_h -+++ b/scripts/mkcompile_h -@@ -50,8 +50,8 @@ else - fi - - UTS_VERSION="#$VERSION" --CONFIG_FLAGS="" --if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi -+CONFIG_FLAGS="ZEN" -+if [ -n "$SMP" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS SMP"; fi - if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi - UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP" - -diff --git a/scripts/recordmcount.h b/scripts/recordmcount.h -index 13c5e6c8829c..47fca2c69a73 100644 ---- a/scripts/recordmcount.h -+++ b/scripts/recordmcount.h -@@ -325,7 +325,8 @@ static uint_t *sift_rel_mcount(uint_t *mlocp, - if (!mcountsym) - mcountsym = get_mcountsym(sym0, relp, str0); - -- if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp)) { -+ if (mcountsym && mcountsym == Elf_r_sym(relp) && -+ !is_fake_mcount(relp)) { - uint_t const addend = - _w(_w(relp->r_offset) - recval + mcount_adjust); - mrelp->r_offset = _w(offbase -diff --git a/security/Kconfig.hardening b/security/Kconfig.hardening -index c6cb2d9b2905..107176069af3 100644 ---- a/security/Kconfig.hardening -+++ b/security/Kconfig.hardening -@@ -61,6 +61,7 @@ choice - config GCC_PLUGIN_STRUCTLEAK_BYREF - bool "zero-init structs passed by reference (strong)" - depends on GCC_PLUGINS -+ depends on !(KASAN && KASAN_STACK=1) - select GCC_PLUGIN_STRUCTLEAK - help - Zero-initialize any structures on the stack that may -@@ -70,9 +71,15 @@ choice - exposures, like CVE-2017-1000410: - https://git.kernel.org/linus/06e7e776ca4d3654 - -+ As a side-effect, this keeps a lot of variables on the -+ stack that can otherwise be optimized out, so combining -+ this with CONFIG_KASAN_STACK can lead to a stack overflow -+ and is disallowed. -+ - config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL - bool "zero-init anything passed by reference (very strong)" - depends on GCC_PLUGINS -+ depends on !(KASAN && KASAN_STACK=1) - select GCC_PLUGIN_STRUCTLEAK - help - Zero-initialize any stack variables that may be passed -diff --git a/security/integrity/digsig.c b/security/integrity/digsig.c -index 4582bc26770a..868ade3e8970 100644 ---- a/security/integrity/digsig.c -+++ b/security/integrity/digsig.c -@@ -69,8 +69,9 @@ int integrity_digsig_verify(const unsigned int id, const char *sig, int siglen, - return -EOPNOTSUPP; - } - --static int __integrity_init_keyring(const unsigned int id, key_perm_t perm, -- struct key_restriction *restriction) -+static int __init __integrity_init_keyring(const unsigned int id, -+ key_perm_t perm, -+ struct key_restriction *restriction) - { - const struct cred *cred = current_cred(); - int err = 0; -diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c -index 94de51628fdc..3ec7ac70c313 100644 ---- a/security/selinux/hooks.c -+++ b/security/selinux/hooks.c -@@ -6351,11 +6351,12 @@ static int selinux_setprocattr(const char *name, void *value, size_t size) - } else if (!strcmp(name, "fscreate")) { - tsec->create_sid = sid; - } else if (!strcmp(name, "keycreate")) { -- error = avc_has_perm(&selinux_state, -- mysid, sid, SECCLASS_KEY, KEY__CREATE, -- NULL); -- if (error) -- goto abort_change; -+ if (sid) { -+ error = avc_has_perm(&selinux_state, mysid, sid, -+ SECCLASS_KEY, KEY__CREATE, NULL); -+ if (error) -+ goto abort_change; -+ } - tsec->keycreate_sid = sid; - } else if (!strcmp(name, "sockcreate")) { - tsec->sockcreate_sid = sid; -diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c -index 624ccc6ac744..f8efaa9f647c 100644 ---- a/security/selinux/ss/policydb.c -+++ b/security/selinux/ss/policydb.c -@@ -272,6 +272,8 @@ static int rangetr_cmp(struct hashtab *h, const void *k1, const void *k2) - return v; - } - -+static int (*destroy_f[SYM_NUM]) (void *key, void *datum, void *datap); -+ - /* - * Initialize a policy database structure. - */ -@@ -319,8 +321,10 @@ static int policydb_init(struct policydb *p) - out: - hashtab_destroy(p->filename_trans); - hashtab_destroy(p->range_tr); -- for (i = 0; i < SYM_NUM; i++) -+ for (i = 0; i < SYM_NUM; i++) { -+ hashtab_map(p->symtab[i].table, destroy_f[i], NULL); - hashtab_destroy(p->symtab[i].table); -+ } - return rc; - } - -diff --git a/security/selinux/ss/sidtab.c b/security/selinux/ss/sidtab.c -index e63a90ff2728..1f0a6eaa2d6a 100644 ---- a/security/selinux/ss/sidtab.c -+++ b/security/selinux/ss/sidtab.c -@@ -286,6 +286,11 @@ static int sidtab_reverse_lookup(struct sidtab *s, struct context *context, - ++count; - } - -+ /* bail out if we already reached max entries */ -+ rc = -EOVERFLOW; -+ if (count >= SIDTAB_MAX) -+ goto out_unlock; -+ - /* insert context into new entry */ - rc = -ENOMEM; - dst = sidtab_do_lookup(s, count, 1); -diff --git a/sound/ac97/bus.c b/sound/ac97/bus.c -index 7b977b753a03..7985dd8198b6 100644 ---- a/sound/ac97/bus.c -+++ b/sound/ac97/bus.c -@@ -122,17 +122,12 @@ static int ac97_codec_add(struct ac97_controller *ac97_ctrl, int idx, - vendor_id); - - ret = device_add(&codec->dev); -- if (ret) -- goto err_free_codec; -+ if (ret) { -+ put_device(&codec->dev); -+ return ret; -+ } - - return 0; --err_free_codec: -- of_node_put(codec->dev.of_node); -- put_device(&codec->dev); -- kfree(codec); -- ac97_ctrl->codecs[idx] = NULL; -- -- return ret; - } - - unsigned int snd_ac97_bus_scan_one(struct ac97_controller *adrv, -diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c -index 860543a4c840..12dd9b318db1 100644 ---- a/sound/core/pcm_native.c -+++ b/sound/core/pcm_native.c -@@ -77,7 +77,7 @@ void snd_pcm_group_init(struct snd_pcm_group *group) - spin_lock_init(&group->lock); - mutex_init(&group->mutex); - INIT_LIST_HEAD(&group->substreams); -- refcount_set(&group->refs, 0); -+ refcount_set(&group->refs, 1); - } - - /* define group lock helpers */ -@@ -1096,8 +1096,7 @@ static void snd_pcm_group_unref(struct snd_pcm_group *group, - - if (!group) - return; -- do_free = refcount_dec_and_test(&group->refs) && -- list_empty(&group->substreams); -+ do_free = refcount_dec_and_test(&group->refs); - snd_pcm_group_unlock(group, substream->pcm->nonatomic); - if (do_free) - kfree(group); -@@ -2020,6 +2019,7 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd) - snd_pcm_group_lock_irq(target_group, nonatomic); - snd_pcm_stream_lock(substream1); - snd_pcm_group_assign(substream1, target_group); -+ refcount_inc(&target_group->refs); - snd_pcm_stream_unlock(substream1); - snd_pcm_group_unlock_irq(target_group, nonatomic); - _end: -@@ -2056,13 +2056,14 @@ static int snd_pcm_unlink(struct snd_pcm_substream *substream) - snd_pcm_group_lock_irq(group, nonatomic); - - relink_to_local(substream); -+ refcount_dec(&group->refs); - - /* detach the last stream, too */ - if (list_is_singular(&group->substreams)) { - relink_to_local(list_first_entry(&group->substreams, - struct snd_pcm_substream, - link_list)); -- do_free = !refcount_read(&group->refs); -+ do_free = refcount_dec_and_test(&group->refs); - } - - snd_pcm_group_unlock_irq(group, nonatomic); -diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c -index a60e7a17f0b8..7737b2670064 100644 ---- a/sound/core/seq/seq_clientmgr.c -+++ b/sound/core/seq/seq_clientmgr.c -@@ -1021,7 +1021,7 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, - { - struct snd_seq_client *client = file->private_data; - int written = 0, len; -- int err; -+ int err, handled; - struct snd_seq_event event; - - if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT)) -@@ -1034,6 +1034,8 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, - if (!client->accept_output || client->pool == NULL) - return -ENXIO; - -+ repeat: -+ handled = 0; - /* allocate the pool now if the pool is not allocated yet */ - mutex_lock(&client->ioctl_mutex); - if (client->pool->size > 0 && !snd_seq_write_pool_allocated(client)) { -@@ -1093,12 +1095,19 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, - 0, 0, &client->ioctl_mutex); - if (err < 0) - break; -+ handled++; - - __skip_event: - /* Update pointers and counts */ - count -= len; - buf += len; - written += len; -+ -+ /* let's have a coffee break if too many events are queued */ -+ if (++handled >= 200) { -+ mutex_unlock(&client->ioctl_mutex); -+ goto repeat; -+ } - } - - out: -diff --git a/sound/hda/ext/hdac_ext_bus.c b/sound/hda/ext/hdac_ext_bus.c -index a3a113ef5d56..4f9f1d2a2ec5 100644 ---- a/sound/hda/ext/hdac_ext_bus.c -+++ b/sound/hda/ext/hdac_ext_bus.c -@@ -85,7 +85,6 @@ int snd_hdac_ext_bus_init(struct hdac_bus *bus, struct device *dev, - const struct hdac_ext_bus_ops *ext_ops) - { - int ret; -- static int idx; - - /* check if io ops are provided, if not load the defaults */ - if (io_ops == NULL) -@@ -96,7 +95,12 @@ int snd_hdac_ext_bus_init(struct hdac_bus *bus, struct device *dev, - return ret; - - bus->ext_ops = ext_ops; -- bus->idx = idx++; -+ /* FIXME: -+ * Currently only one bus is supported, if there is device with more -+ * buses, bus->idx should be greater than 0, but there needs to be a -+ * reliable way to always assign same number. -+ */ -+ bus->idx = 0; - bus->cmd_dma_state = true; - - return 0; -diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c -index b02f74528b66..812dc144fb5b 100644 ---- a/sound/hda/hdac_controller.c -+++ b/sound/hda/hdac_controller.c -@@ -79,6 +79,8 @@ void snd_hdac_bus_init_cmd_io(struct hdac_bus *bus) - snd_hdac_chip_writew(bus, RINTCNT, 1); - /* enable rirb dma and response irq */ - snd_hdac_chip_writeb(bus, RIRBCTL, AZX_RBCTL_DMA_EN | AZX_RBCTL_IRQ_EN); -+ /* Accept unsolicited responses */ -+ snd_hdac_chip_updatel(bus, GCTL, AZX_GCTL_UNSOL, AZX_GCTL_UNSOL); - spin_unlock_irq(&bus->reg_lock); - } - EXPORT_SYMBOL_GPL(snd_hdac_bus_init_cmd_io); -@@ -415,9 +417,6 @@ int snd_hdac_bus_reset_link(struct hdac_bus *bus, bool full_reset) - return -EBUSY; - } - -- /* Accept unsolicited responses */ -- snd_hdac_chip_updatel(bus, GCTL, AZX_GCTL_UNSOL, AZX_GCTL_UNSOL); -- - /* detect codecs */ - if (!bus->codec_mask) { - bus->codec_mask = snd_hdac_chip_readw(bus, STATESTS); -diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c -index 1192c7561d62..3c2db3816029 100644 ---- a/sound/hda/hdac_i915.c -+++ b/sound/hda/hdac_i915.c -@@ -136,10 +136,12 @@ int snd_hdac_i915_init(struct hdac_bus *bus) - if (!acomp) - return -ENODEV; - if (!acomp->ops) { -- request_module("i915"); -- /* 60s timeout */ -- wait_for_completion_timeout(&bind_complete, -- msecs_to_jiffies(60 * 1000)); -+ if (!IS_ENABLED(CONFIG_MODULES) || -+ !request_module("i915")) { -+ /* 60s timeout */ -+ wait_for_completion_timeout(&bind_complete, -+ msecs_to_jiffies(60 * 1000)); -+ } - } - if (!acomp->ops) { - dev_info(bus->dev, "couldn't bind with audio component\n"); -diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c -index 6c51b8363f8b..106328584998 100644 ---- a/sound/pci/hda/hda_codec.c -+++ b/sound/pci/hda/hda_codec.c -@@ -2941,15 +2941,19 @@ static int hda_codec_runtime_resume(struct device *dev) - #ifdef CONFIG_PM_SLEEP - static int hda_codec_force_resume(struct device *dev) - { -+ struct hda_codec *codec = dev_to_hda_codec(dev); -+ bool forced_resume = !codec->relaxed_resume; - int ret; - - /* The get/put pair below enforces the runtime resume even if the - * device hasn't been used at suspend time. This trick is needed to - * update the jack state change during the sleep. - */ -- pm_runtime_get_noresume(dev); -+ if (forced_resume) -+ pm_runtime_get_noresume(dev); - ret = pm_runtime_force_resume(dev); -- pm_runtime_put(dev); -+ if (forced_resume) -+ pm_runtime_put(dev); - return ret; - } - -diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c -index 50f86f458918..d438c450f04d 100644 ---- a/sound/pci/hda/hda_intel.c -+++ b/sound/pci/hda/hda_intel.c -@@ -313,11 +313,10 @@ enum { - - #define AZX_DCAPS_INTEL_SKYLAKE \ - (AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME |\ -+ AZX_DCAPS_SYNC_WRITE |\ - AZX_DCAPS_SEPARATE_STREAM_TAG | AZX_DCAPS_I915_COMPONENT) - --#define AZX_DCAPS_INTEL_BROXTON \ -- (AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME |\ -- AZX_DCAPS_SEPARATE_STREAM_TAG | AZX_DCAPS_I915_COMPONENT) -+#define AZX_DCAPS_INTEL_BROXTON AZX_DCAPS_INTEL_SKYLAKE - - /* quirks for ATI SB / AMD Hudson */ - #define AZX_DCAPS_PRESET_ATI_SB \ -diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c -index 4f8d0845ee1e..f299f137eaea 100644 ---- a/sound/pci/hda/patch_conexant.c -+++ b/sound/pci/hda/patch_conexant.c -@@ -1083,6 +1083,7 @@ static int patch_conexant_auto(struct hda_codec *codec) - */ - - static const struct hda_device_id snd_hda_id_conexant[] = { -+ HDA_CODEC_ENTRY(0x14f11f86, "CX8070", patch_conexant_auto), - HDA_CODEC_ENTRY(0x14f12008, "CX8200", patch_conexant_auto), - HDA_CODEC_ENTRY(0x14f15045, "CX20549 (Venice)", patch_conexant_auto), - HDA_CODEC_ENTRY(0x14f15047, "CX20551 (Waikiki)", patch_conexant_auto), -diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c -index b7bde55b6adf..e49c1c00f5ce 100644 ---- a/sound/pci/hda/patch_hdmi.c -+++ b/sound/pci/hda/patch_hdmi.c -@@ -2291,8 +2291,10 @@ static void generic_hdmi_free(struct hda_codec *codec) - struct hdmi_spec *spec = codec->spec; - int pin_idx, pcm_idx; - -- if (codec_has_acomp(codec)) -+ if (codec_has_acomp(codec)) { - snd_hdac_acomp_register_notifier(&codec->bus->core, NULL); -+ codec->relaxed_resume = 0; -+ } - - for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { - struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); -@@ -2415,7 +2417,6 @@ static void intel_haswell_fixup_connect_list(struct hda_codec *codec, - snd_hda_override_conn_list(codec, nid, spec->num_cvts, spec->cvt_nids); - } - --#define INTEL_GET_VENDOR_VERB 0xf81 - #define INTEL_GET_VENDOR_VERB 0xf81 - #define INTEL_SET_VENDOR_VERB 0x781 - #define INTEL_EN_DP12 0x02 /* enable DP 1.2 features */ -@@ -2524,18 +2525,32 @@ static int intel_pin2port(void *audio_ptr, int pin_nid) - return -1; - } - -+static int intel_port2pin(struct hda_codec *codec, int port) -+{ -+ struct hdmi_spec *spec = codec->spec; -+ -+ if (!spec->port_num) { -+ /* we assume only from port-B to port-D */ -+ if (port < 1 || port > 3) -+ return 0; -+ /* intel port is 1-based */ -+ return port + intel_base_nid(codec) - 1; -+ } -+ -+ if (port < 1 || port > spec->port_num) -+ return 0; -+ return spec->port_map[port - 1]; -+} -+ - static void intel_pin_eld_notify(void *audio_ptr, int port, int pipe) - { - struct hda_codec *codec = audio_ptr; - int pin_nid; - int dev_id = pipe; - -- /* we assume only from port-B to port-D */ -- if (port < 1 || port > 3) -+ pin_nid = intel_port2pin(codec, port); -+ if (!pin_nid) - return; -- -- pin_nid = port + intel_base_nid(codec) - 1; /* intel port is 1-based */ -- - /* skip notification during system suspend (but not in runtime PM); - * the state will be updated at resume - */ -@@ -2565,6 +2580,8 @@ static void register_i915_notifier(struct hda_codec *codec) - spec->drm_audio_ops.pin_eld_notify = intel_pin_eld_notify; - snd_hdac_acomp_register_notifier(&codec->bus->core, - &spec->drm_audio_ops); -+ /* no need for forcible resume for jack check thanks to notifier */ -+ codec->relaxed_resume = 1; - } - - /* setup_stream ops override for HSW+ */ -diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c -index 6f3a35949cdd..de224cbea7a0 100644 ---- a/sound/pci/hda/patch_realtek.c -+++ b/sound/pci/hda/patch_realtek.c -@@ -3255,6 +3255,7 @@ static void alc256_init(struct hda_codec *codec) - alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ - alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */ - alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15); -+ alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ - } - - static void alc256_shutup(struct hda_codec *codec) -@@ -7656,9 +7657,12 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { - {0x12, 0x90a60130}, - {0x17, 0x90170110}, - {0x21, 0x03211020}), -- SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, -+ SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, - {0x14, 0x90170110}, - {0x21, 0x04211020}), -+ SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, -+ {0x14, 0x90170110}, -+ {0x21, 0x04211030}), - SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, - ALC295_STANDARD_PINS, - {0x17, 0x21014020}, -@@ -7825,7 +7829,6 @@ static int patch_alc269(struct hda_codec *codec) - spec->shutup = alc256_shutup; - spec->init_hook = alc256_init; - spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */ -- alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ - break; - case 0x10ec0257: - spec->codec_variant = ALC269_TYPE_ALC257; -@@ -8800,6 +8803,11 @@ static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = { - {0x18, 0x01a19030}, - {0x1a, 0x01813040}, - {0x21, 0x01014020}), -+ SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE, -+ {0x16, 0x01813030}, -+ {0x17, 0x02211010}, -+ {0x18, 0x01a19040}, -+ {0x21, 0x01014020}), - SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE, - {0x14, 0x01014010}, - {0x18, 0x01a19020}, -diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c -index 19fa73df0846..46caed9b924d 100644 ---- a/sound/pci/maestro3.c -+++ b/sound/pci/maestro3.c -@@ -2001,7 +2001,7 @@ static void snd_m3_ac97_reset(struct snd_m3 *chip) - outw(0, io + GPIO_DATA); - outw(dir | GPO_PRIMARY_AC97, io + GPIO_DIRECTION); - -- schedule_timeout_uninterruptible(msecs_to_jiffies(delay1)); -+ schedule_msec_hrtimeout_uninterruptible((delay1)); - - outw(GPO_PRIMARY_AC97, io + GPIO_DATA); - udelay(5); -@@ -2009,7 +2009,7 @@ static void snd_m3_ac97_reset(struct snd_m3 *chip) - outw(IO_SRAM_ENABLE | SERIAL_AC_LINK_ENABLE, io + RING_BUS_CTRL_A); - outw(~0, io + GPIO_MASK); - -- schedule_timeout_uninterruptible(msecs_to_jiffies(delay2)); -+ schedule_msec_hrtimeout_uninterruptible((delay2)); - - if (! snd_m3_try_read_vendor(chip)) - break; -diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c -index 1f57126708e7..c9f9820968bb 100644 ---- a/sound/soc/codecs/hdac_hdmi.c -+++ b/sound/soc/codecs/hdac_hdmi.c -@@ -1859,6 +1859,12 @@ static void hdmi_codec_remove(struct snd_soc_component *component) - { - struct hdac_hdmi_priv *hdmi = snd_soc_component_get_drvdata(component); - struct hdac_device *hdev = hdmi->hdev; -+ int ret; -+ -+ ret = snd_hdac_acomp_register_notifier(hdev->bus, NULL); -+ if (ret < 0) -+ dev_err(&hdev->dev, "notifier unregister failed: err: %d\n", -+ ret); - - pm_runtime_disable(&hdev->dev); - } -diff --git a/sound/soc/codecs/rt5631.c b/sound/soc/codecs/rt5631.c -index f70b9f7e68bb..77b65398ca07 100644 ---- a/sound/soc/codecs/rt5631.c -+++ b/sound/soc/codecs/rt5631.c -@@ -415,7 +415,7 @@ static void onebit_depop_mute_stage(struct snd_soc_component *component, int ena - hp_zc = snd_soc_component_read32(component, RT5631_INT_ST_IRQ_CTRL_2); - snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); - if (enable) { -- schedule_timeout_uninterruptible(msecs_to_jiffies(10)); -+ schedule_msec_hrtimeout_uninterruptible((10)); - /* config one-bit depop parameter */ - rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x307f); - snd_soc_component_update_bits(component, RT5631_HP_OUT_VOL, -@@ -525,7 +525,7 @@ static void depop_seq_mute_stage(struct snd_soc_component *component, int enable - hp_zc = snd_soc_component_read32(component, RT5631_INT_ST_IRQ_CTRL_2); - snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); - if (enable) { -- schedule_timeout_uninterruptible(msecs_to_jiffies(10)); -+ schedule_msec_hrtimeout_uninterruptible((10)); - - /* config depop sequence parameter */ - rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x302f); -diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c -index fe99584c917f..f1344d532a13 100644 ---- a/sound/soc/codecs/wm8350.c -+++ b/sound/soc/codecs/wm8350.c -@@ -233,10 +233,10 @@ static void wm8350_pga_work(struct work_struct *work) - out2->ramp == WM8350_RAMP_UP) { - /* delay is longer over 0dB as increases are larger */ - if (i >= WM8350_OUTn_0dB) -- schedule_timeout_interruptible(msecs_to_jiffies -+ schedule_msec_hrtimeout_interruptible( - (2)); - else -- schedule_timeout_interruptible(msecs_to_jiffies -+ schedule_msec_hrtimeout_interruptible( - (1)); - } else - udelay(50); /* doesn't matter if we delay longer */ -@@ -1120,7 +1120,7 @@ static int wm8350_set_bias_level(struct snd_soc_component *component, - (platform->dis_out4 << 6)); - - /* wait for discharge */ -- schedule_timeout_interruptible(msecs_to_jiffies -+ schedule_msec_hrtimeout_interruptible( - (platform-> - cap_discharge_msecs)); - -@@ -1136,7 +1136,7 @@ static int wm8350_set_bias_level(struct snd_soc_component *component, - WM8350_VBUFEN); - - /* wait for vmid */ -- schedule_timeout_interruptible(msecs_to_jiffies -+ schedule_msec_hrtimeout_interruptible( - (platform-> - vmid_charge_msecs)); - -@@ -1187,7 +1187,7 @@ static int wm8350_set_bias_level(struct snd_soc_component *component, - wm8350_reg_write(wm8350, WM8350_POWER_MGMT_1, pm1); - - /* wait */ -- schedule_timeout_interruptible(msecs_to_jiffies -+ schedule_msec_hrtimeout_interruptible( - (platform-> - vmid_discharge_msecs)); - -@@ -1205,7 +1205,7 @@ static int wm8350_set_bias_level(struct snd_soc_component *component, - pm1 | WM8350_OUTPUT_DRAIN_EN); - - /* wait */ -- schedule_timeout_interruptible(msecs_to_jiffies -+ schedule_msec_hrtimeout_interruptible( - (platform->drain_msecs)); - - pm1 &= ~WM8350_BIASEN; -diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c -index 271235a69c01..3ec90e1b1eb4 100644 ---- a/sound/soc/codecs/wm8900.c -+++ b/sound/soc/codecs/wm8900.c -@@ -1109,7 +1109,7 @@ static int wm8900_set_bias_level(struct snd_soc_component *component, - /* Need to let things settle before stopping the clock - * to ensure that restart works, see "Stopping the - * master clock" in the datasheet. */ -- schedule_timeout_interruptible(msecs_to_jiffies(1)); -+ schedule_msec_hrtimeout_interruptible(1); - snd_soc_component_write(component, WM8900_REG_POWER2, - WM8900_REG_POWER2_SYSCLK_ENA); - break; -diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c -index 6497c1ea6228..08fefeca9d82 100644 ---- a/sound/soc/codecs/wm9713.c -+++ b/sound/soc/codecs/wm9713.c -@@ -199,7 +199,7 @@ static int wm9713_voice_shutdown(struct snd_soc_dapm_widget *w, - - /* Gracefully shut down the voice interface. */ - snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x0f00, 0x0200); -- schedule_timeout_interruptible(msecs_to_jiffies(1)); -+ schedule_msec_hrtimeout_interruptible(1); - snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x0f00, 0x0f00); - snd_soc_component_update_bits(component, AC97_EXTENDED_MID, 0x1000, 0x1000); - -@@ -868,7 +868,7 @@ static int wm9713_set_pll(struct snd_soc_component *component, - wm9713->pll_in = freq_in; - - /* wait 10ms AC97 link frames for the link to stabilise */ -- schedule_timeout_interruptible(msecs_to_jiffies(10)); -+ schedule_msec_hrtimeout_interruptible((10)); - return 0; - } - -diff --git a/sound/soc/generic/audio-graph-card.c b/sound/soc/generic/audio-graph-card.c -index ec7e673ba475..70ed28d97d49 100644 ---- a/sound/soc/generic/audio-graph-card.c -+++ b/sound/soc/generic/audio-graph-card.c -@@ -435,9 +435,6 @@ static int graph_for_each_link(struct asoc_simple_priv *priv, - codec_ep = of_graph_get_remote_endpoint(cpu_ep); - codec_port = of_get_parent(codec_ep); - -- of_node_put(codec_ep); -- of_node_put(codec_port); -- - /* get convert-xxx property */ - memset(&adata, 0, sizeof(adata)); - graph_parse_convert(dev, codec_ep, &adata); -@@ -457,6 +454,9 @@ static int graph_for_each_link(struct asoc_simple_priv *priv, - else - ret = func_noml(priv, cpu_ep, codec_ep, li); - -+ of_node_put(codec_ep); -+ of_node_put(codec_port); -+ - if (ret < 0) - return ret; - -diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig -index 5407d217228e..c0aef45d335a 100644 ---- a/sound/soc/intel/boards/Kconfig -+++ b/sound/soc/intel/boards/Kconfig -@@ -392,7 +392,7 @@ config SND_SOC_INTEL_SOF_RT5682_MACH - (SND_SOC_SOF_BAYTRAIL && X86_INTEL_LPSS) - select SND_SOC_RT5682 - select SND_SOC_DMIC -- select SND_SOC_HDAC_HDMI if SND_SOC_SOF_HDA_COMMON -+ select SND_SOC_HDAC_HDMI - help - This adds support for ASoC machine driver for SOF platforms - with rt5682 codec. -diff --git a/sound/soc/meson/axg-tdm.h b/sound/soc/meson/axg-tdm.h -index e578b6f40a07..5774ce0916d4 100644 ---- a/sound/soc/meson/axg-tdm.h -+++ b/sound/soc/meson/axg-tdm.h -@@ -40,7 +40,7 @@ struct axg_tdm_iface { - - static inline bool axg_tdm_lrclk_invert(unsigned int fmt) - { -- return (fmt & SND_SOC_DAIFMT_I2S) ^ -+ return ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S) ^ - !!(fmt & (SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_NB_IF)); - } - -diff --git a/sound/soc/sh/rcar/ctu.c b/sound/soc/sh/rcar/ctu.c -index 8cb06dab234e..7647b3d4c0ba 100644 ---- a/sound/soc/sh/rcar/ctu.c -+++ b/sound/soc/sh/rcar/ctu.c -@@ -108,7 +108,7 @@ static int rsnd_ctu_probe_(struct rsnd_mod *mod, - struct rsnd_dai_stream *io, - struct rsnd_priv *priv) - { -- return rsnd_cmd_attach(io, rsnd_mod_id(mod) / 4); -+ return rsnd_cmd_attach(io, rsnd_mod_id(mod)); - } - - static void rsnd_ctu_value_init(struct rsnd_dai_stream *io, -diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c -index 41c0cfaf2db5..6aeba0d66ec5 100644 ---- a/sound/soc/soc-core.c -+++ b/sound/soc/soc-core.c -@@ -158,9 +158,10 @@ static void soc_init_component_debugfs(struct snd_soc_component *component) - component->card->debugfs_card_root); - } - -- if (!component->debugfs_root) { -+ if (IS_ERR(component->debugfs_root)) { - dev_warn(component->dev, -- "ASoC: Failed to create component debugfs directory\n"); -+ "ASoC: Failed to create component debugfs directory: %ld\n", -+ PTR_ERR(component->debugfs_root)); - return; - } - -@@ -212,18 +213,21 @@ static void soc_init_card_debugfs(struct snd_soc_card *card) - - card->debugfs_card_root = debugfs_create_dir(card->name, - snd_soc_debugfs_root); -- if (!card->debugfs_card_root) { -+ if (IS_ERR(card->debugfs_card_root)) { - dev_warn(card->dev, -- "ASoC: Failed to create card debugfs directory\n"); -+ "ASoC: Failed to create card debugfs directory: %ld\n", -+ PTR_ERR(card->debugfs_card_root)); -+ card->debugfs_card_root = NULL; - return; - } - - card->debugfs_pop_time = debugfs_create_u32("dapm_pop_time", 0644, - card->debugfs_card_root, - &card->pop_time); -- if (!card->debugfs_pop_time) -+ if (IS_ERR(card->debugfs_pop_time)) - dev_warn(card->dev, -- "ASoC: Failed to create pop time debugfs file\n"); -+ "ASoC: Failed to create pop time debugfs file: %ld\n", -+ PTR_ERR(card->debugfs_pop_time)); - } - - static void soc_cleanup_card_debugfs(struct snd_soc_card *card) -@@ -2837,14 +2841,12 @@ static void snd_soc_unbind_card(struct snd_soc_card *card, bool unregister) - snd_soc_dapm_shutdown(card); - snd_soc_flush_all_delayed_work(card); - -- mutex_lock(&client_mutex); - /* remove all components used by DAI links on this card */ - for_each_comp_order(order) { - for_each_card_rtds(card, rtd) { - soc_remove_link_components(card, rtd, order); - } - } -- mutex_unlock(&client_mutex); - - soc_cleanup_card_resources(card); - if (!unregister) -@@ -2863,7 +2865,9 @@ static void snd_soc_unbind_card(struct snd_soc_card *card, bool unregister) - */ - int snd_soc_unregister_card(struct snd_soc_card *card) - { -+ mutex_lock(&client_mutex); - snd_soc_unbind_card(card, true); -+ mutex_unlock(&client_mutex); - dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name); - - return 0; -diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c -index 55f8278077f4..d28f220b2836 100644 ---- a/sound/soc/soc-dapm.c -+++ b/sound/soc/soc-dapm.c -@@ -154,7 +154,7 @@ static void dapm_assert_locked(struct snd_soc_dapm_context *dapm) - static void pop_wait(u32 pop_time) - { - if (pop_time) -- schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time)); -+ schedule_msec_hrtimeout_uninterruptible((pop_time)); - } - - __printf(3, 4) -@@ -2155,23 +2155,25 @@ void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm, - { - struct dentry *d; - -- if (!parent) -+ if (!parent || IS_ERR(parent)) - return; - - dapm->debugfs_dapm = debugfs_create_dir("dapm", parent); - -- if (!dapm->debugfs_dapm) { -+ if (IS_ERR(dapm->debugfs_dapm)) { - dev_warn(dapm->dev, -- "ASoC: Failed to create DAPM debugfs directory\n"); -+ "ASoC: Failed to create DAPM debugfs directory %ld\n", -+ PTR_ERR(dapm->debugfs_dapm)); - return; - } - - d = debugfs_create_file("bias_level", 0444, - dapm->debugfs_dapm, dapm, - &dapm_bias_fops); -- if (!d) -+ if (IS_ERR(d)) - dev_warn(dapm->dev, -- "ASoC: Failed to create bias level debugfs file\n"); -+ "ASoC: Failed to create bias level debugfs file: %ld\n", -+ PTR_ERR(d)); - } - - static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w) -@@ -2185,10 +2187,10 @@ static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w) - d = debugfs_create_file(w->name, 0444, - dapm->debugfs_dapm, w, - &dapm_widget_power_fops); -- if (!d) -+ if (IS_ERR(d)) - dev_warn(w->dapm->dev, -- "ASoC: Failed to create %s debugfs file\n", -- w->name); -+ "ASoC: Failed to create %s debugfs file: %ld\n", -+ w->name, PTR_ERR(d)); - } - - static void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm) -diff --git a/sound/sound_core.c b/sound/sound_core.c -index b730d97c4de6..90d118cd9164 100644 ---- a/sound/sound_core.c -+++ b/sound/sound_core.c -@@ -275,7 +275,8 @@ static int sound_insert_unit(struct sound_unit **list, const struct file_operati - goto retry; - } - spin_unlock(&sound_loader_lock); -- return -EBUSY; -+ r = -EBUSY; -+ goto fail; - } - } - -diff --git a/sound/usb/helper.c b/sound/usb/helper.c -index 84aa265dd802..4c12cc5b53fd 100644 ---- a/sound/usb/helper.c -+++ b/sound/usb/helper.c -@@ -63,6 +63,20 @@ void *snd_usb_find_csint_desc(void *buffer, int buflen, void *after, u8 dsubtype - return NULL; - } - -+/* check the validity of pipe and EP types */ -+int snd_usb_pipe_sanity_check(struct usb_device *dev, unsigned int pipe) -+{ -+ static const int pipetypes[4] = { -+ PIPE_CONTROL, PIPE_ISOCHRONOUS, PIPE_BULK, PIPE_INTERRUPT -+ }; -+ struct usb_host_endpoint *ep; -+ -+ ep = usb_pipe_endpoint(dev, pipe); -+ if (!ep || usb_pipetype(pipe) != pipetypes[usb_endpoint_type(&ep->desc)]) -+ return -EINVAL; -+ return 0; -+} -+ - /* - * Wrapper for usb_control_msg(). - * Allocates a temp buffer to prevent dmaing from/to the stack. -@@ -75,6 +89,9 @@ int snd_usb_ctl_msg(struct usb_device *dev, unsigned int pipe, __u8 request, - void *buf = NULL; - int timeout; - -+ if (snd_usb_pipe_sanity_check(dev, pipe)) -+ return -EINVAL; -+ - if (size > 0) { - buf = kmemdup(data, size, GFP_KERNEL); - if (!buf) -diff --git a/sound/usb/helper.h b/sound/usb/helper.h -index d338bd0e0ca6..6afb70156ec4 100644 ---- a/sound/usb/helper.h -+++ b/sound/usb/helper.h -@@ -7,6 +7,7 @@ unsigned int snd_usb_combine_bytes(unsigned char *bytes, int size); - void *snd_usb_find_desc(void *descstart, int desclen, void *after, u8 dtype); - void *snd_usb_find_csint_desc(void *descstart, int desclen, void *after, u8 dsubtype); - -+int snd_usb_pipe_sanity_check(struct usb_device *dev, unsigned int pipe); - int snd_usb_ctl_msg(struct usb_device *dev, unsigned int pipe, - __u8 request, __u8 requesttype, __u16 value, __u16 index, - void *data, __u16 size); -diff --git a/sound/usb/line6/pcm.c b/sound/usb/line6/pcm.c -index 2c03e0f6bf72..fde9ee3db78e 100644 ---- a/sound/usb/line6/pcm.c -+++ b/sound/usb/line6/pcm.c -@@ -127,7 +127,7 @@ static void line6_wait_clear_audio_urbs(struct snd_line6_pcm *line6pcm, - if (!alive) - break; - set_current_state(TASK_UNINTERRUPTIBLE); -- schedule_timeout(1); -+ schedule_min_hrtimeout(); - } while (--timeout > 0); - if (alive) - dev_err(line6pcm->line6->ifcdev, -diff --git a/sound/usb/line6/podhd.c b/sound/usb/line6/podhd.c -index 77a1d55334bb..53b53a9a4c6f 100644 ---- a/sound/usb/line6/podhd.c -+++ b/sound/usb/line6/podhd.c -@@ -413,7 +413,7 @@ static const struct line6_properties podhd_properties_table[] = { - .name = "POD HD500", - .capabilities = LINE6_CAP_PCM - | LINE6_CAP_HWMON, -- .altsetting = 1, -+ .altsetting = 0, - .ep_ctrl_r = 0x81, - .ep_ctrl_w = 0x01, - .ep_audio_r = 0x86, -diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c -index c703f8534b07..7498b5191b68 100644 ---- a/sound/usb/mixer.c -+++ b/sound/usb/mixer.c -@@ -2303,7 +2303,7 @@ static struct procunit_info extunits[] = { - */ - static int build_audio_procunit(struct mixer_build *state, int unitid, - void *raw_desc, struct procunit_info *list, -- char *name) -+ bool extension_unit) - { - struct uac_processing_unit_descriptor *desc = raw_desc; - int num_ins; -@@ -2320,6 +2320,8 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, - static struct procunit_info default_info = { - 0, NULL, default_value_info - }; -+ const char *name = extension_unit ? -+ "Extension Unit" : "Processing Unit"; - - if (desc->bLength < 13) { - usb_audio_err(state->chip, "invalid %s descriptor (id %d)\n", name, unitid); -@@ -2433,7 +2435,10 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, - } else if (info->name) { - strlcpy(kctl->id.name, info->name, sizeof(kctl->id.name)); - } else { -- nameid = uac_processing_unit_iProcessing(desc, state->mixer->protocol); -+ if (extension_unit) -+ nameid = uac_extension_unit_iExtension(desc, state->mixer->protocol); -+ else -+ nameid = uac_processing_unit_iProcessing(desc, state->mixer->protocol); - len = 0; - if (nameid) - len = snd_usb_copy_string_desc(state->chip, -@@ -2466,10 +2471,10 @@ static int parse_audio_processing_unit(struct mixer_build *state, int unitid, - case UAC_VERSION_2: - default: - return build_audio_procunit(state, unitid, raw_desc, -- procunits, "Processing Unit"); -+ procunits, false); - case UAC_VERSION_3: - return build_audio_procunit(state, unitid, raw_desc, -- uac3_procunits, "Processing Unit"); -+ uac3_procunits, false); - } - } - -@@ -2480,8 +2485,7 @@ static int parse_audio_extension_unit(struct mixer_build *state, int unitid, - * Note that we parse extension units with processing unit descriptors. - * That's ok as the layout is the same. - */ -- return build_audio_procunit(state, unitid, raw_desc, -- extunits, "Extension Unit"); -+ return build_audio_procunit(state, unitid, raw_desc, extunits, true); - } - - /* -diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c -index cf5cff10c08e..78858918cbc1 100644 ---- a/sound/usb/quirks.c -+++ b/sound/usb/quirks.c -@@ -828,11 +828,13 @@ static int snd_usb_novation_boot_quirk(struct usb_device *dev) - static int snd_usb_accessmusic_boot_quirk(struct usb_device *dev) - { - int err, actual_length; -- - /* "midi send" enable */ - static const u8 seq[] = { 0x4e, 0x73, 0x52, 0x01 }; -+ void *buf; - -- void *buf = kmemdup(seq, ARRAY_SIZE(seq), GFP_KERNEL); -+ if (snd_usb_pipe_sanity_check(dev, usb_sndintpipe(dev, 0x05))) -+ return -EINVAL; -+ buf = kmemdup(seq, ARRAY_SIZE(seq), GFP_KERNEL); - if (!buf) - return -ENOMEM; - err = usb_interrupt_msg(dev, usb_sndintpipe(dev, 0x05), buf, -@@ -857,7 +859,11 @@ static int snd_usb_accessmusic_boot_quirk(struct usb_device *dev) - - static int snd_usb_nativeinstruments_boot_quirk(struct usb_device *dev) - { -- int ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), -+ int ret; -+ -+ if (snd_usb_pipe_sanity_check(dev, usb_sndctrlpipe(dev, 0))) -+ return -EINVAL; -+ ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), - 0xaf, USB_TYPE_VENDOR | USB_RECIP_DEVICE, - 1, 0, NULL, 0, 1000); - -@@ -964,6 +970,8 @@ static int snd_usb_axefx3_boot_quirk(struct usb_device *dev) - - dev_dbg(&dev->dev, "Waiting for Axe-Fx III to boot up...\n"); - -+ if (snd_usb_pipe_sanity_check(dev, usb_sndctrlpipe(dev, 0))) -+ return -EINVAL; - /* If the Axe-Fx III has not fully booted, it will timeout when trying - * to enable the audio streaming interface. A more generous timeout is - * used here to detect when the Axe-Fx III has finished booting as the -@@ -996,6 +1004,8 @@ static int snd_usb_motu_microbookii_communicate(struct usb_device *dev, u8 *buf, - { - int err, actual_length; - -+ if (snd_usb_pipe_sanity_check(dev, usb_sndintpipe(dev, 0x01))) -+ return -EINVAL; - err = usb_interrupt_msg(dev, usb_sndintpipe(dev, 0x01), buf, *length, - &actual_length, 1000); - if (err < 0) -@@ -1006,6 +1016,8 @@ static int snd_usb_motu_microbookii_communicate(struct usb_device *dev, u8 *buf, - - memset(buf, 0, buf_size); - -+ if (snd_usb_pipe_sanity_check(dev, usb_rcvintpipe(dev, 0x82))) -+ return -EINVAL; - err = usb_interrupt_msg(dev, usb_rcvintpipe(dev, 0x82), buf, buf_size, - &actual_length, 1000); - if (err < 0) -diff --git a/tools/bpf/bpftool/jit_disasm.c b/tools/bpf/bpftool/jit_disasm.c -index 3ef3093560ba..bfed711258ce 100644 ---- a/tools/bpf/bpftool/jit_disasm.c -+++ b/tools/bpf/bpftool/jit_disasm.c -@@ -11,6 +11,8 @@ - * Licensed under the GNU General Public License, version 2.0 (GPLv2) - */ - -+#define _GNU_SOURCE -+#include - #include - #include - #include -@@ -44,11 +46,13 @@ static int fprintf_json(void *out, const char *fmt, ...) - char *s; - - va_start(ap, fmt); -+ if (vasprintf(&s, fmt, ap) < 0) -+ return -1; -+ va_end(ap); -+ - if (!oper_count) { - int i; - -- s = va_arg(ap, char *); -- - /* Strip trailing spaces */ - i = strlen(s) - 1; - while (s[i] == ' ') -@@ -61,11 +65,10 @@ static int fprintf_json(void *out, const char *fmt, ...) - } else if (!strcmp(fmt, ",")) { - /* Skip */ - } else { -- s = va_arg(ap, char *); - jsonw_string(json_wtr, s); - oper_count++; - } -- va_end(ap); -+ free(s); - return 0; - } - -diff --git a/tools/build/feature/test-all.c b/tools/build/feature/test-all.c -index a59c53705093..939ac2fcc783 100644 ---- a/tools/build/feature/test-all.c -+++ b/tools/build/feature/test-all.c -@@ -182,7 +182,7 @@ - # include "test-disassembler-four-args.c" - #undef main - --#define main main_test_zstd -+#define main main_test_libzstd - # include "test-libzstd.c" - #undef main - -diff --git a/tools/iio/iio_utils.c b/tools/iio/iio_utils.c -index a22b6e8fad46..7399eb7f1378 100644 ---- a/tools/iio/iio_utils.c -+++ b/tools/iio/iio_utils.c -@@ -156,9 +156,9 @@ int iioutils_get_type(unsigned *is_signed, unsigned *bytes, unsigned *bits_used, - *be = (endianchar == 'b'); - *bytes = padint / 8; - if (*bits_used == 64) -- *mask = ~0; -+ *mask = ~(0ULL); - else -- *mask = (1ULL << *bits_used) - 1; -+ *mask = (1ULL << *bits_used) - 1ULL; - - *is_signed = (signchar == 's'); - if (fclose(sysfsfp)) { -diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h -index a8b823c30b43..29a5bc3d5c66 100644 ---- a/tools/include/uapi/linux/bpf.h -+++ b/tools/include/uapi/linux/bpf.h -@@ -3143,6 +3143,7 @@ struct bpf_prog_info { - char name[BPF_OBJ_NAME_LEN]; - __u32 ifindex; - __u32 gpl_compatible:1; -+ __u32 :31; /* alignment pad */ - __u64 netns_dev; - __u64 netns_ino; - __u32 nr_jited_ksyms; -diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c -index 151f7ac1882e..3865a5d27251 100644 ---- a/tools/lib/bpf/libbpf.c -+++ b/tools/lib/bpf/libbpf.c -@@ -3487,10 +3487,7 @@ int bpf_prog_load(const char *file, enum bpf_prog_type type, - int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr, - struct bpf_object **pobj, int *prog_fd) - { -- struct bpf_object_open_attr open_attr = { -- .file = attr->file, -- .prog_type = attr->prog_type, -- }; -+ struct bpf_object_open_attr open_attr = {}; - struct bpf_program *prog, *first_prog = NULL; - enum bpf_attach_type expected_attach_type; - enum bpf_prog_type prog_type; -@@ -3503,6 +3500,9 @@ int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr, - if (!attr->file) - return -EINVAL; - -+ open_attr.file = attr->file; -+ open_attr.prog_type = attr->prog_type; -+ - obj = bpf_object__open_xattr(&open_attr); - if (IS_ERR_OR_NULL(obj)) - return -ENOENT; -diff --git a/tools/lib/bpf/xsk.c b/tools/lib/bpf/xsk.c -index 38667b62f1fe..ca272c5b67f4 100644 ---- a/tools/lib/bpf/xsk.c -+++ b/tools/lib/bpf/xsk.c -@@ -337,7 +337,8 @@ static int xsk_get_max_queues(struct xsk_socket *xsk) - - channels.cmd = ETHTOOL_GCHANNELS; - ifr.ifr_data = (void *)&channels; -- strncpy(ifr.ifr_name, xsk->ifname, IFNAMSIZ); -+ strncpy(ifr.ifr_name, xsk->ifname, IFNAMSIZ - 1); -+ ifr.ifr_name[IFNAMSIZ - 1] = '\0'; - err = ioctl(fd, SIOCETHTOOL, &ifr); - if (err && errno != EOPNOTSUPP) { - ret = -errno; -@@ -561,7 +562,8 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname, - err = -errno; - goto out_socket; - } -- strncpy(xsk->ifname, ifname, IFNAMSIZ); -+ strncpy(xsk->ifname, ifname, IFNAMSIZ - 1); -+ xsk->ifname[IFNAMSIZ - 1] = '\0'; - - err = xsk_set_xdp_socket_config(&xsk->config, usr_config); - if (err) -diff --git a/tools/pci/pcitest.c b/tools/pci/pcitest.c -index cb7a47dfd8b6..49ddfa6f5a8c 100644 ---- a/tools/pci/pcitest.c -+++ b/tools/pci/pcitest.c -@@ -36,15 +36,15 @@ struct pci_test { - unsigned long size; - }; - --static void run_test(struct pci_test *test) -+static int run_test(struct pci_test *test) - { -- long ret; -+ int ret = -EINVAL; - int fd; - - fd = open(test->device, O_RDWR); - if (fd < 0) { - perror("can't open PCI Endpoint Test device"); -- return; -+ return -ENODEV; - } - - if (test->barnum >= 0 && test->barnum <= 5) { -diff --git a/tools/perf/Documentation/intel-pt.txt b/tools/perf/Documentation/intel-pt.txt -index 115eaacc455f..60d99e5e7921 100644 ---- a/tools/perf/Documentation/intel-pt.txt -+++ b/tools/perf/Documentation/intel-pt.txt -@@ -88,16 +88,16 @@ smaller. - - To represent software control flow, "branches" samples are produced. By default - a branch sample is synthesized for every single branch. To get an idea what --data is available you can use the 'perf script' tool with no parameters, which --will list all the samples. -+data is available you can use the 'perf script' tool with all itrace sampling -+options, which will list all the samples. - - perf record -e intel_pt//u ls -- perf script -+ perf script --itrace=ibxwpe - - An interesting field that is not printed by default is 'flags' which can be - displayed as follows: - -- perf script -Fcomm,tid,pid,time,cpu,event,trace,ip,sym,dso,addr,symoff,flags -+ perf script --itrace=ibxwpe -F+flags - - The flags are "bcrosyiABEx" which stand for branch, call, return, conditional, - system, asynchronous, interrupt, transaction abort, trace begin, trace end, and -@@ -713,7 +713,7 @@ Having no option is the same as - - which, in turn, is the same as - -- --itrace=ibxwpe -+ --itrace=cepwx - - The letters are: - -diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config -index 85fbcd265351..17b81bc403e4 100644 ---- a/tools/perf/Makefile.config -+++ b/tools/perf/Makefile.config -@@ -637,9 +637,14 @@ endif - - ifndef NO_SLANG - ifneq ($(feature-libslang), 1) -- msg := $(warning slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev); -- NO_SLANG := 1 -- else -+ ifneq ($(feature-libslang-include-subdir), 1) -+ msg := $(warning slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev); -+ NO_SLANG := 1 -+ else -+ CFLAGS += -DHAVE_SLANG_INCLUDE_SUBDIR -+ endif -+ endif -+ ifndef NO_SLANG - # Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h - CFLAGS += -I/usr/include/slang - CFLAGS += -DHAVE_SLANG_SUPPORT -diff --git a/tools/perf/arch/arm/util/cs-etm.c b/tools/perf/arch/arm/util/cs-etm.c -index 911426721170..0a278bbcaba6 100644 ---- a/tools/perf/arch/arm/util/cs-etm.c -+++ b/tools/perf/arch/arm/util/cs-etm.c -@@ -31,6 +31,8 @@ struct cs_etm_recording { - struct auxtrace_record itr; - struct perf_pmu *cs_etm_pmu; - struct perf_evlist *evlist; -+ int wrapped_cnt; -+ bool *wrapped; - bool snapshot_mode; - size_t snapshot_size; - }; -@@ -536,16 +538,131 @@ static int cs_etm_info_fill(struct auxtrace_record *itr, - return 0; - } - --static int cs_etm_find_snapshot(struct auxtrace_record *itr __maybe_unused, -+static int cs_etm_alloc_wrapped_array(struct cs_etm_recording *ptr, int idx) -+{ -+ bool *wrapped; -+ int cnt = ptr->wrapped_cnt; -+ -+ /* Make @ptr->wrapped as big as @idx */ -+ while (cnt <= idx) -+ cnt++; -+ -+ /* -+ * Free'ed in cs_etm_recording_free(). Using realloc() to avoid -+ * cross compilation problems where the host's system supports -+ * reallocarray() but not the target. -+ */ -+ wrapped = realloc(ptr->wrapped, cnt * sizeof(bool)); -+ if (!wrapped) -+ return -ENOMEM; -+ -+ wrapped[cnt - 1] = false; -+ ptr->wrapped_cnt = cnt; -+ ptr->wrapped = wrapped; -+ -+ return 0; -+} -+ -+static bool cs_etm_buffer_has_wrapped(unsigned char *buffer, -+ size_t buffer_size, u64 head) -+{ -+ u64 i, watermark; -+ u64 *buf = (u64 *)buffer; -+ size_t buf_size = buffer_size; -+ -+ /* -+ * We want to look the very last 512 byte (chosen arbitrarily) in -+ * the ring buffer. -+ */ -+ watermark = buf_size - 512; -+ -+ /* -+ * @head is continuously increasing - if its value is equal or greater -+ * than the size of the ring buffer, it has wrapped around. -+ */ -+ if (head >= buffer_size) -+ return true; -+ -+ /* -+ * The value of @head is somewhere within the size of the ring buffer. -+ * This can be that there hasn't been enough data to fill the ring -+ * buffer yet or the trace time was so long that @head has numerically -+ * wrapped around. To find we need to check if we have data at the very -+ * end of the ring buffer. We can reliably do this because mmap'ed -+ * pages are zeroed out and there is a fresh mapping with every new -+ * session. -+ */ -+ -+ /* @head is less than 512 byte from the end of the ring buffer */ -+ if (head > watermark) -+ watermark = head; -+ -+ /* -+ * Speed things up by using 64 bit transactions (see "u64 *buf" above) -+ */ -+ watermark >>= 3; -+ buf_size >>= 3; -+ -+ /* -+ * If we find trace data at the end of the ring buffer, @head has -+ * been there and has numerically wrapped around at least once. -+ */ -+ for (i = watermark; i < buf_size; i++) -+ if (buf[i]) -+ return true; -+ -+ return false; -+} -+ -+static int cs_etm_find_snapshot(struct auxtrace_record *itr, - int idx, struct auxtrace_mmap *mm, -- unsigned char *data __maybe_unused, -+ unsigned char *data, - u64 *head, u64 *old) - { -+ int err; -+ bool wrapped; -+ struct cs_etm_recording *ptr = -+ container_of(itr, struct cs_etm_recording, itr); -+ -+ /* -+ * Allocate memory to keep track of wrapping if this is the first -+ * time we deal with this *mm. -+ */ -+ if (idx >= ptr->wrapped_cnt) { -+ err = cs_etm_alloc_wrapped_array(ptr, idx); -+ if (err) -+ return err; -+ } -+ -+ /* -+ * Check to see if *head has wrapped around. If it hasn't only the -+ * amount of data between *head and *old is snapshot'ed to avoid -+ * bloating the perf.data file with zeros. But as soon as *head has -+ * wrapped around the entire size of the AUX ring buffer it taken. -+ */ -+ wrapped = ptr->wrapped[idx]; -+ if (!wrapped && cs_etm_buffer_has_wrapped(data, mm->len, *head)) { -+ wrapped = true; -+ ptr->wrapped[idx] = true; -+ } -+ - pr_debug3("%s: mmap index %d old head %zu new head %zu size %zu\n", - __func__, idx, (size_t)*old, (size_t)*head, mm->len); - -- *old = *head; -- *head += mm->len; -+ /* No wrap has occurred, we can just use *head and *old. */ -+ if (!wrapped) -+ return 0; -+ -+ /* -+ * *head has wrapped around - adjust *head and *old to pickup the -+ * entire content of the AUX buffer. -+ */ -+ if (*head >= mm->len) { -+ *old = *head - mm->len; -+ } else { -+ *head += mm->len; -+ *old = *head - mm->len; -+ } - - return 0; - } -@@ -586,6 +703,8 @@ static void cs_etm_recording_free(struct auxtrace_record *itr) - { - struct cs_etm_recording *ptr = - container_of(itr, struct cs_etm_recording, itr); -+ -+ zfree(&ptr->wrapped); - free(ptr); - } - -diff --git a/tools/perf/arch/s390/util/machine.c b/tools/perf/arch/s390/util/machine.c -index a19690a17291..c8c86a0c9b79 100644 ---- a/tools/perf/arch/s390/util/machine.c -+++ b/tools/perf/arch/s390/util/machine.c -@@ -6,8 +6,9 @@ - #include "machine.h" - #include "api/fs/fs.h" - #include "debug.h" -+#include "symbol.h" - --int arch__fix_module_text_start(u64 *start, const char *name) -+int arch__fix_module_text_start(u64 *start, u64 *size, const char *name) - { - u64 m_start = *start; - char path[PATH_MAX]; -@@ -17,7 +18,35 @@ int arch__fix_module_text_start(u64 *start, const char *name) - if (sysfs__read_ull(path, (unsigned long long *)start) < 0) { - pr_debug2("Using module %s start:%#lx\n", path, m_start); - *start = m_start; -+ } else { -+ /* Successful read of the modules segment text start address. -+ * Calculate difference between module start address -+ * in memory and module text segment start address. -+ * For example module load address is 0x3ff8011b000 -+ * (from /proc/modules) and module text segment start -+ * address is 0x3ff8011b870 (from file above). -+ * -+ * Adjust the module size and subtract the GOT table -+ * size located at the beginning of the module. -+ */ -+ *size -= (*start - m_start); - } - - return 0; - } -+ -+/* On s390 kernel text segment start is located at very low memory addresses, -+ * for example 0x10000. Modules are located at very high memory addresses, -+ * for example 0x3ff xxxx xxxx. The gap between end of kernel text segment -+ * and beginning of first module's text segment is very big. -+ * Therefore do not fill this gap and do not assign it to the kernel dso map. -+ */ -+void arch__symbols__fixup_end(struct symbol *p, struct symbol *c) -+{ -+ if (strchr(p->name, '[') == NULL && strchr(c->name, '[')) -+ /* Last kernel symbol mapped to end of page */ -+ p->end = roundup(p->end, page_size); -+ else -+ p->end = c->start; -+ pr_debug4("%s sym:%s end:%#lx\n", __func__, p->name, p->end); -+} -diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c -index 61cfd8f70989..d089eb706d18 100644 ---- a/tools/perf/builtin-script.c -+++ b/tools/perf/builtin-script.c -@@ -3669,7 +3669,8 @@ int cmd_script(int argc, const char **argv) - goto out_delete; - - uname(&uts); -- if (!strcmp(uts.machine, session->header.env.arch) || -+ if (data.is_pipe || /* assume pipe_mode indicates native_arch */ -+ !strcmp(uts.machine, session->header.env.arch) || - (!strcmp(uts.machine, "x86_64") && - !strcmp(session->header.env.arch, "i386"))) - native_arch = true; -diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c -index 1ae66f09dc7d..e28002d90573 100644 ---- a/tools/perf/builtin-stat.c -+++ b/tools/perf/builtin-stat.c -@@ -1276,8 +1276,8 @@ static int add_default_attributes(void) - fprintf(stderr, - "Cannot set up top down events %s: %d\n", - str, err); -- free(str); - parse_events_print_error(&errinfo, str); -+ free(str); - return -1; - } - } else { -diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c -index 466621cd1017..8a9ff4b11df0 100644 ---- a/tools/perf/builtin-top.c -+++ b/tools/perf/builtin-top.c -@@ -100,7 +100,7 @@ static void perf_top__resize(struct perf_top *top) - - static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he) - { -- struct perf_evsel *evsel = hists_to_evsel(he->hists); -+ struct perf_evsel *evsel; - struct symbol *sym; - struct annotation *notes; - struct map *map; -@@ -109,6 +109,8 @@ static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he) - if (!he || !he->ms.sym) - return -1; - -+ evsel = hists_to_evsel(he->hists); -+ - sym = he->ms.sym; - map = he->ms.map; - -@@ -225,7 +227,7 @@ static void perf_top__record_precise_ip(struct perf_top *top, - static void perf_top__show_details(struct perf_top *top) - { - struct hist_entry *he = top->sym_filter_entry; -- struct perf_evsel *evsel = hists_to_evsel(he->hists); -+ struct perf_evsel *evsel; - struct annotation *notes; - struct symbol *symbol; - int more; -@@ -233,6 +235,8 @@ static void perf_top__show_details(struct perf_top *top) - if (!he) - return; - -+ evsel = hists_to_evsel(he->hists); -+ - symbol = he->ms.sym; - notes = symbol__annotation(symbol); - -diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c -index 52fadc858ef0..909e68545bb8 100644 ---- a/tools/perf/builtin-trace.c -+++ b/tools/perf/builtin-trace.c -@@ -997,10 +997,10 @@ static struct thread_trace *thread_trace__new(void) - { - struct thread_trace *ttrace = zalloc(sizeof(struct thread_trace)); - -- if (ttrace) -+ if (ttrace) { - ttrace->files.max = -1; -- -- ttrace->syscall_stats = intlist__new(NULL); -+ ttrace->syscall_stats = intlist__new(NULL); -+ } - - return ttrace; - } -diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c -index f470144d1a70..bf114ca9ca87 100644 ---- a/tools/perf/builtin-version.c -+++ b/tools/perf/builtin-version.c -@@ -19,6 +19,7 @@ static struct version version; - static struct option version_options[] = { - OPT_BOOLEAN(0, "build-options", &version.build_options, - "display the build options"), -+ OPT_END(), - }; - - static const char * const version_usage[] = { -diff --git a/tools/perf/jvmti/libjvmti.c b/tools/perf/jvmti/libjvmti.c -index aea7b1fe85aa..c441a34cb1c0 100644 ---- a/tools/perf/jvmti/libjvmti.c -+++ b/tools/perf/jvmti/libjvmti.c -@@ -1,5 +1,6 @@ - // SPDX-License-Identifier: GPL-2.0 - #include -+#include - #include - #include - #include -@@ -162,8 +163,7 @@ copy_class_filename(const char * class_sign, const char * file_name, char * resu - result[i] = '\0'; - } else { - /* fallback case */ -- size_t file_name_len = strlen(file_name); -- strncpy(result, file_name, file_name_len < max_length ? file_name_len : max_length); -+ strlcpy(result, file_name, max_length); - } - } - -diff --git a/tools/perf/perf.h b/tools/perf/perf.h -index d59dee61b64d..a26555baf692 100644 ---- a/tools/perf/perf.h -+++ b/tools/perf/perf.h -@@ -26,7 +26,7 @@ static inline unsigned long long rdclock(void) - } - - #ifndef MAX_NR_CPUS --#define MAX_NR_CPUS 1024 -+#define MAX_NR_CPUS 2048 - #endif - - extern const char *input_name; -diff --git a/tools/perf/tests/mmap-thread-lookup.c b/tools/perf/tests/mmap-thread-lookup.c -index ba87e6e8d18c..0a4301a5155c 100644 ---- a/tools/perf/tests/mmap-thread-lookup.c -+++ b/tools/perf/tests/mmap-thread-lookup.c -@@ -53,7 +53,7 @@ static void *thread_fn(void *arg) - { - struct thread_data *td = arg; - ssize_t ret; -- int go; -+ int go = 0; - - if (thread_init(td)) - return NULL; -diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c -index 4a69c07f4101..8f3c80e13584 100644 ---- a/tools/perf/tests/parse-events.c -+++ b/tools/perf/tests/parse-events.c -@@ -18,6 +18,32 @@ - #define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \ - PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD) - -+#if defined(__s390x__) -+/* Return true if kvm module is available and loaded. Test this -+ * and retun success when trace point kvm_s390_create_vm -+ * exists. Otherwise this test always fails. -+ */ -+static bool kvm_s390_create_vm_valid(void) -+{ -+ char *eventfile; -+ bool rc = false; -+ -+ eventfile = get_events_file("kvm-s390"); -+ -+ if (eventfile) { -+ DIR *mydir = opendir(eventfile); -+ -+ if (mydir) { -+ rc = true; -+ closedir(mydir); -+ } -+ put_events_file(eventfile); -+ } -+ -+ return rc; -+} -+#endif -+ - static int test__checkevent_tracepoint(struct perf_evlist *evlist) - { - struct perf_evsel *evsel = perf_evlist__first(evlist); -@@ -1642,6 +1668,7 @@ static struct evlist_test test__events[] = { - { - .name = "kvm-s390:kvm_s390_create_vm", - .check = test__checkevent_tracepoint, -+ .valid = kvm_s390_create_vm_valid, - .id = 100, - }, - #endif -diff --git a/tools/perf/tests/shell/record+probe_libc_inet_pton.sh b/tools/perf/tests/shell/record+probe_libc_inet_pton.sh -index 61c9f8fc6fa1..58a99a292930 100755 ---- a/tools/perf/tests/shell/record+probe_libc_inet_pton.sh -+++ b/tools/perf/tests/shell/record+probe_libc_inet_pton.sh -@@ -44,7 +44,7 @@ trace_libc_inet_pton_backtrace() { - eventattr='max-stack=4' - echo "gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected - echo "getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected -- echo ".*\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$" >> $expected -+ echo ".*(\+0x[[:xdigit:]]+|\[unknown\])[[:space:]]\(.*/bin/ping.*\)$" >> $expected - ;; - *) - eventattr='max-stack=3' -diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c -index 98d934a36d86..b0d089a95dac 100644 ---- a/tools/perf/ui/browsers/annotate.c -+++ b/tools/perf/ui/browsers/annotate.c -@@ -97,11 +97,12 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int - struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); - struct annotation *notes = browser__annotation(browser); - struct annotation_line *al = list_entry(entry, struct annotation_line, node); -+ const bool is_current_entry = ui_browser__is_current_entry(browser, row); - struct annotation_write_ops ops = { - .first_line = row == 0, -- .current_entry = ui_browser__is_current_entry(browser, row), -+ .current_entry = is_current_entry, - .change_color = (!notes->options->hide_src_code && -- (!ops.current_entry || -+ (!is_current_entry || - (browser->use_navkeypressed && - !browser->navkeypressed))), - .width = browser->width, -diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c -index 3421ecbdd3f0..c1dd9b54dc6e 100644 ---- a/tools/perf/ui/browsers/hists.c -+++ b/tools/perf/ui/browsers/hists.c -@@ -638,7 +638,11 @@ int hist_browser__run(struct hist_browser *browser, const char *help, - switch (key) { - case K_TIMER: { - u64 nr_entries; -- hbt->timer(hbt->arg); -+ -+ WARN_ON_ONCE(!hbt); -+ -+ if (hbt) -+ hbt->timer(hbt->arg); - - if (hist_browser__has_filter(browser) || - symbol_conf.report_hierarchy) -@@ -2819,7 +2823,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, - { - struct hists *hists = evsel__hists(evsel); - struct hist_browser *browser = perf_evsel_browser__new(evsel, hbt, env, annotation_opts); -- struct branch_info *bi; -+ struct branch_info *bi = NULL; - #define MAX_OPTIONS 16 - char *options[MAX_OPTIONS]; - struct popup_action actions[MAX_OPTIONS]; -@@ -3085,7 +3089,9 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, - goto skip_annotation; - - if (sort__mode == SORT_MODE__BRANCH) { -- bi = browser->he_selection->branch_info; -+ -+ if (browser->he_selection) -+ bi = browser->he_selection->branch_info; - - if (bi == NULL) - goto skip_annotation; -@@ -3269,7 +3275,8 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu, - - switch (key) { - case K_TIMER: -- hbt->timer(hbt->arg); -+ if (hbt) -+ hbt->timer(hbt->arg); - - if (!menu->lost_events_warned && - menu->lost_events && -diff --git a/tools/perf/ui/libslang.h b/tools/perf/ui/libslang.h -index c0686cda39a5..991e692b9b46 100644 ---- a/tools/perf/ui/libslang.h -+++ b/tools/perf/ui/libslang.h -@@ -10,7 +10,12 @@ - #ifndef HAVE_LONG_LONG - #define HAVE_LONG_LONG __GLIBC_HAVE_LONG_LONG - #endif -+ -+#ifdef HAVE_SLANG_INCLUDE_SUBDIR -+#include -+#else - #include -+#endif - - #if SLANG_VERSION < 20104 - #define slsmg_printf(msg, args...) \ -diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c -index 79db038b56f2..b8dfcfe08bb1 100644 ---- a/tools/perf/util/annotate.c -+++ b/tools/perf/util/annotate.c -@@ -931,9 +931,8 @@ static int symbol__inc_addr_samples(struct symbol *sym, struct map *map, - if (sym == NULL) - return 0; - src = symbol__hists(sym, evsel->evlist->nr_entries); -- if (src == NULL) -- return -ENOMEM; -- return __symbol__inc_addr_samples(sym, map, src, evsel->idx, addr, sample); -+ return (src) ? __symbol__inc_addr_samples(sym, map, src, evsel->idx, -+ addr, sample) : 0; - } - - static int symbol__account_cycles(u64 addr, u64 start, -@@ -1114,16 +1113,14 @@ static int disasm_line__parse(char *line, const char **namep, char **rawp) - *namep = strdup(name); - - if (*namep == NULL) -- goto out_free_name; -+ goto out; - - (*rawp)[0] = tmp; - *rawp = ltrim(*rawp); - - return 0; - --out_free_name: -- free((void *)namep); -- *namep = NULL; -+out: - return -1; - } - -diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c -index 66e82bd0683e..cfdbf65f1e02 100644 ---- a/tools/perf/util/auxtrace.c -+++ b/tools/perf/util/auxtrace.c -@@ -1001,7 +1001,8 @@ int itrace_parse_synth_opts(const struct option *opt, const char *str, - } - - if (!str) { -- itrace_synth_opts__set_default(synth_opts, false); -+ itrace_synth_opts__set_default(synth_opts, -+ synth_opts->default_no_sample); - return 0; - } - -diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c -index 4a5947625c5c..2c46f9aa416c 100644 ---- a/tools/perf/util/evsel.c -+++ b/tools/perf/util/evsel.c -@@ -589,6 +589,9 @@ const char *perf_evsel__name(struct perf_evsel *evsel) - { - char bf[128]; - -+ if (!evsel) -+ goto out_unknown; -+ - if (evsel->name) - return evsel->name; - -@@ -628,7 +631,10 @@ const char *perf_evsel__name(struct perf_evsel *evsel) - - evsel->name = strdup(bf); - -- return evsel->name ?: "unknown"; -+ if (evsel->name) -+ return evsel->name; -+out_unknown: -+ return "unknown"; - } - - const char *perf_evsel__group_name(struct perf_evsel *evsel) -diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c -index 847ae51a524b..b82d4577d969 100644 ---- a/tools/perf/util/header.c -+++ b/tools/perf/util/header.c -@@ -1100,7 +1100,7 @@ static int build_caches(struct cpu_cache_level caches[], u32 size, u32 *cntp) - return 0; - } - --#define MAX_CACHES 2000 -+#define MAX_CACHES (MAX_NR_CPUS * 4) - - static int write_cache(struct feat_fd *ff, - struct perf_evlist *evlist __maybe_unused) -@@ -3602,6 +3602,7 @@ int perf_event__synthesize_features(struct perf_tool *tool, - return -ENOMEM; - - ff.size = sz - sz_hdr; -+ ff.ph = &session->header; - - for_each_set_bit(feat, header->adds_features, HEADER_FEAT_BITS) { - if (!feat_ops[feat].synthesize) { -diff --git a/tools/perf/util/intel-bts.c b/tools/perf/util/intel-bts.c -index e32dbffebb2f..625ad3639a7e 100644 ---- a/tools/perf/util/intel-bts.c -+++ b/tools/perf/util/intel-bts.c -@@ -891,13 +891,12 @@ int intel_bts_process_auxtrace_info(union perf_event *event, - if (dump_trace) - return 0; - -- if (session->itrace_synth_opts && session->itrace_synth_opts->set) { -+ if (session->itrace_synth_opts->set) { - bts->synth_opts = *session->itrace_synth_opts; - } else { - itrace_synth_opts__set_default(&bts->synth_opts, - session->itrace_synth_opts->default_no_sample); -- if (session->itrace_synth_opts) -- bts->synth_opts.thread_stack = -+ bts->synth_opts.thread_stack = - session->itrace_synth_opts->thread_stack; - } - -diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c -index d6f1b2a03f9b..f7dd4657535d 100644 ---- a/tools/perf/util/intel-pt.c -+++ b/tools/perf/util/intel-pt.c -@@ -2579,7 +2579,8 @@ int intel_pt_process_auxtrace_info(union perf_event *event, - } else { - itrace_synth_opts__set_default(&pt->synth_opts, - session->itrace_synth_opts->default_no_sample); -- if (use_browser != -1) { -+ if (!session->itrace_synth_opts->default_no_sample && -+ !session->itrace_synth_opts->inject) { - pt->synth_opts.branches = false; - pt->synth_opts.callchain = true; - } -diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c -index dc7aafe45a2b..081fe4bdebaa 100644 ---- a/tools/perf/util/machine.c -+++ b/tools/perf/util/machine.c -@@ -1365,6 +1365,7 @@ static int machine__set_modules_path(struct machine *machine) - return map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0); - } - int __weak arch__fix_module_text_start(u64 *start __maybe_unused, -+ u64 *size __maybe_unused, - const char *name __maybe_unused) - { - return 0; -@@ -1376,7 +1377,7 @@ static int machine__create_module(void *arg, const char *name, u64 start, - struct machine *machine = arg; - struct map *map; - -- if (arch__fix_module_text_start(&start, name) < 0) -+ if (arch__fix_module_text_start(&start, &size, name) < 0) - return -1; - - map = machine__findnew_module_map(machine, start, name); -diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h -index f70ab98a7bde..7aa38da26427 100644 ---- a/tools/perf/util/machine.h -+++ b/tools/perf/util/machine.h -@@ -222,7 +222,7 @@ struct symbol *machine__find_kernel_symbol_by_name(struct machine *machine, - - struct map *machine__findnew_module_map(struct machine *machine, u64 start, - const char *filename); --int arch__fix_module_text_start(u64 *start, const char *name); -+int arch__fix_module_text_start(u64 *start, u64 *size, const char *name); - - int machine__load_kallsyms(struct machine *machine, const char *filename); - -diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c -index ee71efb9db62..9c81ee092784 100644 ---- a/tools/perf/util/map.c -+++ b/tools/perf/util/map.c -@@ -470,8 +470,11 @@ int map__fprintf_srccode(struct map *map, u64 addr, - goto out_free_line; - - ret = fprintf(fp, "|%-8d %.*s", line, len, srccode); -- state->srcfile = srcfile; -- state->line = line; -+ -+ if (state) { -+ state->srcfile = srcfile; -+ state->line = line; -+ } - return ret; - - out_free_line: -diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c -index 699e020737d9..fabdb6dde88e 100644 ---- a/tools/perf/util/metricgroup.c -+++ b/tools/perf/util/metricgroup.c -@@ -85,26 +85,49 @@ struct egroup { - const char *metric_expr; - }; - --static struct perf_evsel *find_evsel(struct perf_evlist *perf_evlist, -- const char **ids, -- int idnum, -- struct perf_evsel **metric_events) -+static bool record_evsel(int *ind, struct perf_evsel **start, -+ int idnum, -+ struct perf_evsel **metric_events, -+ struct perf_evsel *ev) -+{ -+ metric_events[*ind] = ev; -+ if (*ind == 0) -+ *start = ev; -+ if (++*ind == idnum) { -+ metric_events[*ind] = NULL; -+ return true; -+ } -+ return false; -+} -+ -+static struct perf_evsel *find_evsel_group(struct perf_evlist *perf_evlist, -+ const char **ids, -+ int idnum, -+ struct perf_evsel **metric_events) - { - struct perf_evsel *ev, *start = NULL; - int ind = 0; - - evlist__for_each_entry (perf_evlist, ev) { -+ if (ev->collect_stat) -+ continue; - if (!strcmp(ev->name, ids[ind])) { -- metric_events[ind] = ev; -- if (ind == 0) -- start = ev; -- if (++ind == idnum) { -- metric_events[ind] = NULL; -+ if (record_evsel(&ind, &start, idnum, -+ metric_events, ev)) - return start; -- } - } else { -+ /* -+ * We saw some other event that is not -+ * in our list of events. Discard -+ * the whole match and start again. -+ */ - ind = 0; - start = NULL; -+ if (!strcmp(ev->name, ids[ind])) { -+ if (record_evsel(&ind, &start, idnum, -+ metric_events, ev)) -+ return start; -+ } - } - } - /* -@@ -134,8 +157,8 @@ static int metricgroup__setup_events(struct list_head *groups, - ret = -ENOMEM; - break; - } -- evsel = find_evsel(perf_evlist, eg->ids, eg->idnum, -- metric_events); -+ evsel = find_evsel_group(perf_evlist, eg->ids, eg->idnum, -+ metric_events); - if (!evsel) { - pr_debug("Cannot resolve %s: %s\n", - eg->metric_name, eg->metric_expr); -diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c -index e0429f4ef335..faa8eb231e1b 100644 ---- a/tools/perf/util/pmu.c -+++ b/tools/perf/util/pmu.c -@@ -709,9 +709,7 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu) - { - int i; - struct pmu_events_map *map; -- struct pmu_event *pe; - const char *name = pmu->name; -- const char *pname; - - map = perf_pmu__find_map(pmu); - if (!map) -@@ -722,28 +720,26 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu) - */ - i = 0; - while (1) { -+ const char *cpu_name = is_arm_pmu_core(name) ? name : "cpu"; -+ struct pmu_event *pe = &map->table[i++]; -+ const char *pname = pe->pmu ? pe->pmu : cpu_name; - -- pe = &map->table[i++]; - if (!pe->name) { - if (pe->metric_group || pe->metric_name) - continue; - break; - } - -- if (!is_arm_pmu_core(name)) { -- pname = pe->pmu ? pe->pmu : "cpu"; -- -- /* -- * uncore alias may be from different PMU -- * with common prefix -- */ -- if (pmu_is_uncore(name) && -- !strncmp(pname, name, strlen(pname))) -- goto new_alias; -+ /* -+ * uncore alias may be from different PMU -+ * with common prefix -+ */ -+ if (pmu_is_uncore(name) && -+ !strncmp(pname, name, strlen(pname))) -+ goto new_alias; - -- if (strcmp(pname, name)) -- continue; -- } -+ if (strcmp(pname, name)) -+ continue; - - new_alias: - /* need type casts to override 'const' */ -diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c -index 54cf163347f7..2e61dd6a3574 100644 ---- a/tools/perf/util/session.c -+++ b/tools/perf/util/session.c -@@ -1249,6 +1249,9 @@ static void dump_read(struct perf_evsel *evsel, union perf_event *event) - evsel ? perf_evsel__name(evsel) : "FAIL", - event->read.value); - -+ if (!evsel) -+ return; -+ - read_format = evsel->attr.read_format; - - if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) -diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c -index 4c53bae5644b..94bed4031def 100644 ---- a/tools/perf/util/stat-display.c -+++ b/tools/perf/util/stat-display.c -@@ -542,7 +542,8 @@ static void collect_all_aliases(struct perf_stat_config *config, struct perf_evs - alias->scale != counter->scale || - alias->cgrp != counter->cgrp || - strcmp(alias->unit, counter->unit) || -- perf_evsel__is_clock(alias) != perf_evsel__is_clock(counter)) -+ perf_evsel__is_clock(alias) != perf_evsel__is_clock(counter) || -+ !strcmp(alias->pmu_name, counter->pmu_name)) - break; - alias->merged_stat = true; - cb(config, alias, data, false); -diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c -index 83d8094be4fe..0ef98e991ade 100644 ---- a/tools/perf/util/stat-shadow.c -+++ b/tools/perf/util/stat-shadow.c -@@ -303,7 +303,7 @@ static struct perf_evsel *perf_stat__find_event(struct perf_evlist *evsel_list, - struct perf_evsel *c2; - - evlist__for_each_entry (evsel_list, c2) { -- if (!strcasecmp(c2->name, name)) -+ if (!strcasecmp(c2->name, name) && !c2->collect_stat) - return c2; - } - return NULL; -@@ -342,7 +342,8 @@ void perf_stat__collect_metric_expr(struct perf_evlist *evsel_list) - if (leader) { - /* Search in group */ - for_each_group_member (oc, leader) { -- if (!strcasecmp(oc->name, metric_names[i])) { -+ if (!strcasecmp(oc->name, metric_names[i]) && -+ !oc->collect_stat) { - found = true; - break; - } -@@ -722,6 +723,7 @@ static void generic_metric(struct perf_stat_config *config, - double ratio; - int i; - void *ctxp = out->ctx; -+ char *n, *pn; - - expr__ctx_init(&pctx); - expr__add_id(&pctx, name, avg); -@@ -741,7 +743,19 @@ static void generic_metric(struct perf_stat_config *config, - stats = &v->stats; - scale = 1.0; - } -- expr__add_id(&pctx, metric_events[i]->name, avg_stats(stats)*scale); -+ -+ n = strdup(metric_events[i]->name); -+ if (!n) -+ return; -+ /* -+ * This display code with --no-merge adds [cpu] postfixes. -+ * These are not supported by the parser. Remove everything -+ * after the space. -+ */ -+ pn = strchr(n, ' '); -+ if (pn) -+ *pn = 0; -+ expr__add_id(&pctx, n, avg_stats(stats)*scale); - } - if (!metric_events[i]) { - const char *p = metric_expr; -@@ -758,6 +772,9 @@ static void generic_metric(struct perf_stat_config *config, - (metric_name ? metric_name : name) : "", 0); - } else - print_metric(config, ctxp, NULL, NULL, "", 0); -+ -+ for (i = 1; i < pctx.num_ids; i++) -+ free((void *)pctx.ids[i].name); - } - - void perf_stat__print_shadow_stats(struct perf_stat_config *config, -diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c -index 5cbad55cd99d..3b49eb4e3ed9 100644 ---- a/tools/perf/util/symbol.c -+++ b/tools/perf/util/symbol.c -@@ -91,6 +91,11 @@ static int prefix_underscores_count(const char *str) - return tail - str; - } - -+void __weak arch__symbols__fixup_end(struct symbol *p, struct symbol *c) -+{ -+ p->end = c->start; -+} -+ - const char * __weak arch__normalize_symbol_name(const char *name) - { - return name; -@@ -217,7 +222,7 @@ void symbols__fixup_end(struct rb_root_cached *symbols) - curr = rb_entry(nd, struct symbol, rb_node); - - if (prev->end == prev->start && prev->end != curr->start) -- prev->end = curr->start; -+ arch__symbols__fixup_end(prev, curr); - } - - /* Last entry */ -diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h -index 9a8fe012910a..f30ab608ea54 100644 ---- a/tools/perf/util/symbol.h -+++ b/tools/perf/util/symbol.h -@@ -277,6 +277,7 @@ const char *arch__normalize_symbol_name(const char *name); - #define SYMBOL_A 0 - #define SYMBOL_B 1 - -+void arch__symbols__fixup_end(struct symbol *p, struct symbol *c); - int arch__compare_symbol_names(const char *namea, const char *nameb); - int arch__compare_symbol_names_n(const char *namea, const char *nameb, - unsigned int n); -diff --git a/tools/perf/util/thread-stack.c b/tools/perf/util/thread-stack.c -index 4ba9e866b076..60c9d955c4d7 100644 ---- a/tools/perf/util/thread-stack.c -+++ b/tools/perf/util/thread-stack.c -@@ -616,6 +616,23 @@ static int thread_stack__bottom(struct thread_stack *ts, - true, false); - } - -+static int thread_stack__pop_ks(struct thread *thread, struct thread_stack *ts, -+ struct perf_sample *sample, u64 ref) -+{ -+ u64 tm = sample->time; -+ int err; -+ -+ /* Return to userspace, so pop all kernel addresses */ -+ while (thread_stack__in_kernel(ts)) { -+ err = thread_stack__call_return(thread, ts, --ts->cnt, -+ tm, ref, true); -+ if (err) -+ return err; -+ } -+ -+ return 0; -+} -+ - static int thread_stack__no_call_return(struct thread *thread, - struct thread_stack *ts, - struct perf_sample *sample, -@@ -896,7 +913,18 @@ int thread_stack__process(struct thread *thread, struct comm *comm, - ts->rstate = X86_RETPOLINE_DETECTED; - - } else if (sample->flags & PERF_IP_FLAG_RETURN) { -- if (!sample->ip || !sample->addr) -+ if (!sample->addr) { -+ u32 return_from_kernel = PERF_IP_FLAG_SYSCALLRET | -+ PERF_IP_FLAG_INTERRUPT; -+ -+ if (!(sample->flags & return_from_kernel)) -+ return 0; -+ -+ /* Pop kernel stack */ -+ return thread_stack__pop_ks(thread, ts, sample, ref); -+ } -+ -+ if (!sample->ip) - return 0; - - /* x86 retpoline 'return' doesn't match the stack */ -diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c -index b413ba5b9835..4a9f88d9b7ab 100644 ---- a/tools/perf/util/thread.c -+++ b/tools/perf/util/thread.c -@@ -197,14 +197,24 @@ struct comm *thread__comm(const struct thread *thread) - - struct comm *thread__exec_comm(const struct thread *thread) - { -- struct comm *comm, *last = NULL; -+ struct comm *comm, *last = NULL, *second_last = NULL; - - list_for_each_entry(comm, &thread->comm_list, list) { - if (comm->exec) - return comm; -+ second_last = last; - last = comm; - } - -+ /* -+ * 'last' with no start time might be the parent's comm of a synthesized -+ * thread (created by processing a synthesized fork event). For a main -+ * thread, that is very probably wrong. Prefer a later comm to avoid -+ * that case. -+ */ -+ if (second_last && !last->start && thread->pid_ == thread->tid) -+ return second_last; -+ - return last; - } - -diff --git a/tools/power/cpupower/utils/cpufreq-set.c b/tools/power/cpupower/utils/cpufreq-set.c -index f49bc4aa2a08..6ed82fba5aaa 100644 ---- a/tools/power/cpupower/utils/cpufreq-set.c -+++ b/tools/power/cpupower/utils/cpufreq-set.c -@@ -305,6 +305,8 @@ int cmd_freq_set(int argc, char **argv) - bitmask_setbit(cpus_chosen, cpus->cpu); - cpus = cpus->next; - } -+ /* Set the last cpu in related cpus list */ -+ bitmask_setbit(cpus_chosen, cpus->cpu); - cpufreq_put_related_cpus(cpus); - } - } -diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile -index e36356e2377e..b9e88ccc289b 100644 ---- a/tools/testing/selftests/bpf/Makefile -+++ b/tools/testing/selftests/bpf/Makefile -@@ -1,4 +1,5 @@ - # SPDX-License-Identifier: GPL-2.0 -+include ../../../../scripts/Kbuild.include - - LIBDIR := ../../../lib - BPFDIR := $(LIBDIR)/bpf -@@ -50,7 +51,8 @@ TEST_PROGS := test_kmod.sh \ - test_lirc_mode2.sh \ - test_skb_cgroup_id.sh \ - test_flow_dissector.sh \ -- test_xdp_vlan.sh \ -+ test_xdp_vlan_mode_generic.sh \ -+ test_xdp_vlan_mode_native.sh \ - test_lwt_ip_encap.sh \ - test_tcp_check_syncookie.sh \ - test_tc_tunnel.sh \ -@@ -185,8 +187,8 @@ $(ALU32_BUILD_DIR)/test_progs_32: prog_tests/*.c - - $(ALU32_BUILD_DIR)/%.o: progs/%.c $(ALU32_BUILD_DIR) \ - $(ALU32_BUILD_DIR)/test_progs_32 -- $(CLANG) $(CLANG_FLAGS) \ -- -O2 -target bpf -emit-llvm -c $< -o - | \ -+ ($(CLANG) $(CLANG_FLAGS) -O2 -target bpf -emit-llvm -c $< -o - || \ -+ echo "clang failed") | \ - $(LLC) -march=bpf -mattr=+alu32 -mcpu=$(CPU) $(LLC_FLAGS) \ - -filetype=obj -o $@ - ifeq ($(DWARF2BTF),y) -@@ -197,16 +199,16 @@ endif - # Have one program compiled without "-target bpf" to test whether libbpf loads - # it successfully - $(OUTPUT)/test_xdp.o: progs/test_xdp.c -- $(CLANG) $(CLANG_FLAGS) \ -- -O2 -emit-llvm -c $< -o - | \ -+ ($(CLANG) $(CLANG_FLAGS) -O2 -emit-llvm -c $< -o - || \ -+ echo "clang failed") | \ - $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ - ifeq ($(DWARF2BTF),y) - $(BTF_PAHOLE) -J $@ - endif - - $(OUTPUT)/%.o: progs/%.c -- $(CLANG) $(CLANG_FLAGS) \ -- -O2 -target bpf -emit-llvm -c $< -o - | \ -+ ($(CLANG) $(CLANG_FLAGS) -O2 -target bpf -emit-llvm -c $< -o - || \ -+ echo "clang failed") | \ - $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ - ifeq ($(DWARF2BTF),y) - $(BTF_PAHOLE) -J $@ -@@ -275,4 +277,5 @@ $(OUTPUT)/verifier/tests.h: $(VERIFIER_TESTS_DIR) $(VERIFIER_TEST_FILES) - ) > $(VERIFIER_TESTS_H)) - - EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(ALU32_BUILD_DIR) \ -- $(VERIFIER_TESTS_H) $(PROG_TESTS_H) $(MAP_TESTS_H) -+ $(VERIFIER_TESTS_H) $(PROG_TESTS_H) $(MAP_TESTS_H) \ -+ feature -diff --git a/tools/testing/selftests/bpf/progs/test_lwt_seg6local.c b/tools/testing/selftests/bpf/progs/test_lwt_seg6local.c -index 0575751bc1bc..e2f6ed0a583d 100644 ---- a/tools/testing/selftests/bpf/progs/test_lwt_seg6local.c -+++ b/tools/testing/selftests/bpf/progs/test_lwt_seg6local.c -@@ -61,7 +61,7 @@ struct sr6_tlv_t { - unsigned char value[0]; - } BPF_PACKET_HEADER; - --__attribute__((always_inline)) struct ip6_srh_t *get_srh(struct __sk_buff *skb) -+static __always_inline struct ip6_srh_t *get_srh(struct __sk_buff *skb) - { - void *cursor, *data_end; - struct ip6_srh_t *srh; -@@ -95,7 +95,7 @@ __attribute__((always_inline)) struct ip6_srh_t *get_srh(struct __sk_buff *skb) - return srh; - } - --__attribute__((always_inline)) -+static __always_inline - int update_tlv_pad(struct __sk_buff *skb, uint32_t new_pad, - uint32_t old_pad, uint32_t pad_off) - { -@@ -125,7 +125,7 @@ int update_tlv_pad(struct __sk_buff *skb, uint32_t new_pad, - return 0; - } - --__attribute__((always_inline)) -+static __always_inline - int is_valid_tlv_boundary(struct __sk_buff *skb, struct ip6_srh_t *srh, - uint32_t *tlv_off, uint32_t *pad_size, - uint32_t *pad_off) -@@ -184,7 +184,7 @@ int is_valid_tlv_boundary(struct __sk_buff *skb, struct ip6_srh_t *srh, - return 0; - } - --__attribute__((always_inline)) -+static __always_inline - int add_tlv(struct __sk_buff *skb, struct ip6_srh_t *srh, uint32_t tlv_off, - struct sr6_tlv_t *itlv, uint8_t tlv_size) - { -@@ -228,7 +228,7 @@ int add_tlv(struct __sk_buff *skb, struct ip6_srh_t *srh, uint32_t tlv_off, - return update_tlv_pad(skb, new_pad, pad_size, pad_off); - } - --__attribute__((always_inline)) -+static __always_inline - int delete_tlv(struct __sk_buff *skb, struct ip6_srh_t *srh, - uint32_t tlv_off) - { -@@ -266,7 +266,7 @@ int delete_tlv(struct __sk_buff *skb, struct ip6_srh_t *srh, - return update_tlv_pad(skb, new_pad, pad_size, pad_off); - } - --__attribute__((always_inline)) -+static __always_inline - int has_egr_tlv(struct __sk_buff *skb, struct ip6_srh_t *srh) - { - int tlv_offset = sizeof(struct ip6_t) + sizeof(struct ip6_srh_t) + -diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c -index 288cb740e005..6438d4dc8ae1 100644 ---- a/tools/testing/selftests/bpf/test_verifier.c -+++ b/tools/testing/selftests/bpf/test_verifier.c -@@ -207,33 +207,35 @@ static void bpf_fill_rand_ld_dw(struct bpf_test *self) - self->retval = (uint32_t)res; - } - --/* test the sequence of 1k jumps */ -+#define MAX_JMP_SEQ 8192 -+ -+/* test the sequence of 8k jumps */ - static void bpf_fill_scale1(struct bpf_test *self) - { - struct bpf_insn *insn = self->fill_insns; - int i = 0, k = 0; - - insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); -- /* test to check that the sequence of 1024 jumps is acceptable */ -- while (k++ < 1024) { -+ /* test to check that the long sequence of jumps is acceptable */ -+ while (k++ < MAX_JMP_SEQ) { - insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, - BPF_FUNC_get_prandom_u32); -- insn[i++] = BPF_JMP_IMM(BPF_JGT, BPF_REG_0, bpf_semi_rand_get(), 2); -+ insn[i++] = BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, bpf_semi_rand_get(), 2); - insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_10); - insn[i++] = BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, - -8 * (k % 64 + 1)); - } -- /* every jump adds 1024 steps to insn_processed, so to stay exactly -- * within 1m limit add MAX_TEST_INSNS - 1025 MOVs and 1 EXIT -+ /* every jump adds 1 step to insn_processed, so to stay exactly -+ * within 1m limit add MAX_TEST_INSNS - MAX_JMP_SEQ - 1 MOVs and 1 EXIT - */ -- while (i < MAX_TEST_INSNS - 1025) -+ while (i < MAX_TEST_INSNS - MAX_JMP_SEQ - 1) - insn[i++] = BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 42); - insn[i] = BPF_EXIT_INSN(); - self->prog_len = i + 1; - self->retval = 42; - } - --/* test the sequence of 1k jumps in inner most function (function depth 8)*/ -+/* test the sequence of 8k jumps in inner most function (function depth 8)*/ - static void bpf_fill_scale2(struct bpf_test *self) - { - struct bpf_insn *insn = self->fill_insns; -@@ -245,19 +247,20 @@ static void bpf_fill_scale2(struct bpf_test *self) - insn[i++] = BPF_EXIT_INSN(); - } - insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); -- /* test to check that the sequence of 1024 jumps is acceptable */ -- while (k++ < 1024) { -+ /* test to check that the long sequence of jumps is acceptable */ -+ k = 0; -+ while (k++ < MAX_JMP_SEQ) { - insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, - BPF_FUNC_get_prandom_u32); -- insn[i++] = BPF_JMP_IMM(BPF_JGT, BPF_REG_0, bpf_semi_rand_get(), 2); -+ insn[i++] = BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, bpf_semi_rand_get(), 2); - insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_10); - insn[i++] = BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, - -8 * (k % (64 - 4 * FUNC_NEST) + 1)); - } -- /* every jump adds 1024 steps to insn_processed, so to stay exactly -- * within 1m limit add MAX_TEST_INSNS - 1025 MOVs and 1 EXIT -+ /* every jump adds 1 step to insn_processed, so to stay exactly -+ * within 1m limit add MAX_TEST_INSNS - MAX_JMP_SEQ - 1 MOVs and 1 EXIT - */ -- while (i < MAX_TEST_INSNS - 1025) -+ while (i < MAX_TEST_INSNS - MAX_JMP_SEQ - 1) - insn[i++] = BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 42); - insn[i] = BPF_EXIT_INSN(); - self->prog_len = i + 1; -diff --git a/tools/testing/selftests/bpf/test_xdp_vlan.sh b/tools/testing/selftests/bpf/test_xdp_vlan.sh -index 51a3a31d1aac..bb8b0da91686 100755 ---- a/tools/testing/selftests/bpf/test_xdp_vlan.sh -+++ b/tools/testing/selftests/bpf/test_xdp_vlan.sh -@@ -1,6 +1,14 @@ - #!/bin/bash -+# SPDX-License-Identifier: GPL-2.0 -+# Author: Jesper Dangaard Brouer - --TESTNAME=xdp_vlan -+# Allow wrapper scripts to name test -+if [ -z "$TESTNAME" ]; then -+ TESTNAME=xdp_vlan -+fi -+ -+# Default XDP mode -+XDP_MODE=xdpgeneric - - usage() { - echo "Testing XDP + TC eBPF VLAN manipulations: $TESTNAME" -@@ -9,9 +17,23 @@ usage() { - echo " -v | --verbose : Verbose" - echo " --flush : Flush before starting (e.g. after --interactive)" - echo " --interactive : Keep netns setup running after test-run" -+ echo " --mode=XXX : Choose XDP mode (xdp | xdpgeneric | xdpdrv)" - echo "" - } - -+valid_xdp_mode() -+{ -+ local mode=$1 -+ -+ case "$mode" in -+ xdpgeneric | xdpdrv | xdp) -+ return 0 -+ ;; -+ *) -+ return 1 -+ esac -+} -+ - cleanup() - { - local status=$? -@@ -37,7 +59,7 @@ cleanup() - - # Using external program "getopt" to get --long-options - OPTIONS=$(getopt -o hvfi: \ -- --long verbose,flush,help,interactive,debug -- "$@") -+ --long verbose,flush,help,interactive,debug,mode: -- "$@") - if (( $? != 0 )); then - usage - echo "selftests: $TESTNAME [FAILED] Error calling getopt, unknown option?" -@@ -60,6 +82,11 @@ while true; do - cleanup - shift - ;; -+ --mode ) -+ shift -+ XDP_MODE=$1 -+ shift -+ ;; - -- ) - shift - break -@@ -81,8 +108,14 @@ if [ "$EUID" -ne 0 ]; then - exit 1 - fi - --ip link set dev lo xdp off 2>/dev/null > /dev/null --if [ $? -ne 0 ];then -+valid_xdp_mode $XDP_MODE -+if [ $? -ne 0 ]; then -+ echo "selftests: $TESTNAME [FAILED] unknown XDP mode ($XDP_MODE)" -+ exit 1 -+fi -+ -+ip link set dev lo xdpgeneric off 2>/dev/null > /dev/null -+if [ $? -ne 0 ]; then - echo "selftests: $TESTNAME [SKIP] need ip xdp support" - exit 0 - fi -@@ -155,7 +188,7 @@ ip netns exec ns2 ip link set lo up - # At this point, the hosts cannot reach each-other, - # because ns2 are using VLAN tags on the packets. - --ip netns exec ns2 sh -c 'ping -W 1 -c 1 100.64.41.1 || echo "Okay ping fails"' -+ip netns exec ns2 sh -c 'ping -W 1 -c 1 100.64.41.1 || echo "Success: First ping must fail"' - - - # Now we can use the test_xdp_vlan.c program to pop/push these VLAN tags -@@ -166,7 +199,7 @@ export FILE=test_xdp_vlan.o - - # First test: Remove VLAN by setting VLAN ID 0, using "xdp_vlan_change" - export XDP_PROG=xdp_vlan_change --ip netns exec ns1 ip link set $DEVNS1 xdp object $FILE section $XDP_PROG -+ip netns exec ns1 ip link set $DEVNS1 $XDP_MODE object $FILE section $XDP_PROG - - # In ns1: egress use TC to add back VLAN tag 4011 - # (del cmd) -@@ -177,8 +210,8 @@ ip netns exec ns1 tc filter add dev $DEVNS1 egress \ - prio 1 handle 1 bpf da obj $FILE sec tc_vlan_push - - # Now the namespaces can reach each-other, test with ping: --ip netns exec ns2 ping -W 2 -c 3 $IPADDR1 --ip netns exec ns1 ping -W 2 -c 3 $IPADDR2 -+ip netns exec ns2 ping -i 0.2 -W 2 -c 2 $IPADDR1 -+ip netns exec ns1 ping -i 0.2 -W 2 -c 2 $IPADDR2 - - # Second test: Replace xdp prog, that fully remove vlan header - # -@@ -187,9 +220,9 @@ ip netns exec ns1 ping -W 2 -c 3 $IPADDR2 - # ETH_P_8021Q indication, and this cause overwriting of our changes. - # - export XDP_PROG=xdp_vlan_remove_outer2 --ip netns exec ns1 ip link set $DEVNS1 xdp off --ip netns exec ns1 ip link set $DEVNS1 xdp object $FILE section $XDP_PROG -+ip netns exec ns1 ip link set $DEVNS1 $XDP_MODE off -+ip netns exec ns1 ip link set $DEVNS1 $XDP_MODE object $FILE section $XDP_PROG - - # Now the namespaces should still be able reach each-other, test with ping: --ip netns exec ns2 ping -W 2 -c 3 $IPADDR1 --ip netns exec ns1 ping -W 2 -c 3 $IPADDR2 -+ip netns exec ns2 ping -i 0.2 -W 2 -c 2 $IPADDR1 -+ip netns exec ns1 ping -i 0.2 -W 2 -c 2 $IPADDR2 -diff --git a/tools/testing/selftests/bpf/test_xdp_vlan_mode_generic.sh b/tools/testing/selftests/bpf/test_xdp_vlan_mode_generic.sh -new file mode 100644 -index 000000000000..c515326d6d59 ---- /dev/null -+++ b/tools/testing/selftests/bpf/test_xdp_vlan_mode_generic.sh -@@ -0,0 +1,9 @@ -+#!/bin/bash -+# SPDX-License-Identifier: GPL-2.0 -+ -+# Exit on failure -+set -e -+ -+# Wrapper script to test generic-XDP -+export TESTNAME=xdp_vlan_mode_generic -+./test_xdp_vlan.sh --mode=xdpgeneric -diff --git a/tools/testing/selftests/bpf/test_xdp_vlan_mode_native.sh b/tools/testing/selftests/bpf/test_xdp_vlan_mode_native.sh -new file mode 100644 -index 000000000000..5cf7ce1f16c1 ---- /dev/null -+++ b/tools/testing/selftests/bpf/test_xdp_vlan_mode_native.sh -@@ -0,0 +1,9 @@ -+#!/bin/bash -+# SPDX-License-Identifier: GPL-2.0 -+ -+# Exit on failure -+set -e -+ -+# Wrapper script to test native-XDP -+export TESTNAME=xdp_vlan_mode_native -+./test_xdp_vlan.sh --mode=xdpdrv -diff --git a/tools/testing/selftests/cgroup/cgroup_util.c b/tools/testing/selftests/cgroup/cgroup_util.c -index 4c223266299a..bdb69599c4bd 100644 ---- a/tools/testing/selftests/cgroup/cgroup_util.c -+++ b/tools/testing/selftests/cgroup/cgroup_util.c -@@ -191,8 +191,7 @@ int cg_find_unified_root(char *root, size_t len) - strtok(NULL, delim); - strtok(NULL, delim); - -- if (strcmp(fs, "cgroup") == 0 && -- strcmp(type, "cgroup2") == 0) { -+ if (strcmp(type, "cgroup2") == 0) { - strncpy(root, mount, len); - return 0; - } -diff --git a/tools/testing/selftests/net/txring_overwrite.c b/tools/testing/selftests/net/txring_overwrite.c -index fd8b1c663c39..7d9ea039450a 100644 ---- a/tools/testing/selftests/net/txring_overwrite.c -+++ b/tools/testing/selftests/net/txring_overwrite.c -@@ -113,7 +113,7 @@ static int setup_tx(char **ring) - - *ring = mmap(0, req.tp_block_size * req.tp_block_nr, - PROT_READ | PROT_WRITE, MAP_SHARED, fdt, 0); -- if (!*ring) -+ if (*ring == MAP_FAILED) - error(1, errno, "mmap"); - - return fdt; -diff --git a/tools/testing/selftests/net/xfrm_policy.sh b/tools/testing/selftests/net/xfrm_policy.sh -index 71d7fdc513c1..5445943bf07f 100755 ---- a/tools/testing/selftests/net/xfrm_policy.sh -+++ b/tools/testing/selftests/net/xfrm_policy.sh -@@ -257,6 +257,29 @@ check_exceptions() - return $lret - } - -+check_hthresh_repeat() -+{ -+ local log=$1 -+ i=0 -+ -+ for i in $(seq 1 10);do -+ ip -net ns1 xfrm policy update src e000:0001::0000 dst ff01::0014:0000:0001 dir in tmpl src :: dst :: proto esp mode tunnel priority 100 action allow || break -+ ip -net ns1 xfrm policy set hthresh6 0 28 || break -+ -+ ip -net ns1 xfrm policy update src e000:0001::0000 dst ff01::01 dir in tmpl src :: dst :: proto esp mode tunnel priority 100 action allow || break -+ ip -net ns1 xfrm policy set hthresh6 0 28 || break -+ done -+ -+ if [ $i -ne 10 ] ;then -+ echo "FAIL: $log" 1>&2 -+ ret=1 -+ return 1 -+ fi -+ -+ echo "PASS: $log" -+ return 0 -+} -+ - #check for needed privileges - if [ "$(id -u)" -ne 0 ];then - echo "SKIP: Need root privileges" -@@ -404,7 +427,9 @@ for n in ns3 ns4;do - ip -net $n xfrm policy set hthresh4 32 32 hthresh6 128 128 - sleep $((RANDOM%5)) - done --check_exceptions "exceptions and block policies after hresh change to normal" -+check_exceptions "exceptions and block policies after htresh change to normal" -+ -+check_hthresh_repeat "policies with repeated htresh change" - - for i in 1 2 3 4;do ip netns del ns$i;done - -diff --git a/tools/testing/selftests/rseq/rseq-arm.h b/tools/testing/selftests/rseq/rseq-arm.h -index 84f28f147fb6..5943c816c07c 100644 ---- a/tools/testing/selftests/rseq/rseq-arm.h -+++ b/tools/testing/selftests/rseq/rseq-arm.h -@@ -6,6 +6,8 @@ - */ - - /* -+ * - ARM little endian -+ * - * RSEQ_SIG uses the udf A32 instruction with an uncommon immediate operand - * value 0x5de3. This traps if user-space reaches this instruction by mistake, - * and the uncommon operand ensures the kernel does not move the instruction -@@ -22,36 +24,40 @@ - * def3 udf #243 ; 0xf3 - * e7f5 b.n <7f5> - * -- * pre-ARMv6 big endian code: -- * e7f5 b.n <7f5> -- * def3 udf #243 ; 0xf3 -+ * - ARMv6+ big endian (BE8): - * - * ARMv6+ -mbig-endian generates mixed endianness code vs data: little-endian -- * code and big-endian data. Ensure the RSEQ_SIG data signature matches code -- * endianness. Prior to ARMv6, -mbig-endian generates big-endian code and data -- * (which match), so there is no need to reverse the endianness of the data -- * representation of the signature. However, the choice between BE32 and BE8 -- * is done by the linker, so we cannot know whether code and data endianness -- * will be mixed before the linker is invoked. -+ * code and big-endian data. The data value of the signature needs to have its -+ * byte order reversed to generate the trap instruction: -+ * -+ * Data: 0xf3def5e7 -+ * -+ * Translates to this A32 instruction pattern: -+ * -+ * e7f5def3 udf #24035 ; 0x5de3 -+ * -+ * Translates to this T16 instruction pattern: -+ * -+ * def3 udf #243 ; 0xf3 -+ * e7f5 b.n <7f5> -+ * -+ * - Prior to ARMv6 big endian (BE32): -+ * -+ * Prior to ARMv6, -mbig-endian generates big-endian code and data -+ * (which match), so the endianness of the data representation of the -+ * signature should not be reversed. However, the choice between BE32 -+ * and BE8 is done by the linker, so we cannot know whether code and -+ * data endianness will be mixed before the linker is invoked. So rather -+ * than try to play tricks with the linker, the rseq signature is simply -+ * data (not a trap instruction) prior to ARMv6 on big endian. This is -+ * why the signature is expressed as data (.word) rather than as -+ * instruction (.inst) in assembler. - */ - --#define RSEQ_SIG_CODE 0xe7f5def3 -- --#ifndef __ASSEMBLER__ -- --#define RSEQ_SIG_DATA \ -- ({ \ -- int sig; \ -- asm volatile ("b 2f\n\t" \ -- "1: .inst " __rseq_str(RSEQ_SIG_CODE) "\n\t" \ -- "2:\n\t" \ -- "ldr %[sig], 1b\n\t" \ -- : [sig] "=r" (sig)); \ -- sig; \ -- }) -- --#define RSEQ_SIG RSEQ_SIG_DATA -- -+#ifdef __ARMEB__ -+#define RSEQ_SIG 0xf3def5e7 /* udf #24035 ; 0x5de3 (ARMv6+) */ -+#else -+#define RSEQ_SIG 0xe7f5def3 /* udf #24035 ; 0x5de3 */ - #endif - - #define rseq_smp_mb() __asm__ __volatile__ ("dmb" ::: "memory", "cc") -@@ -125,8 +131,7 @@ do { \ - __rseq_str(table_label) ":\n\t" \ - ".word " __rseq_str(version) ", " __rseq_str(flags) "\n\t" \ - ".word " __rseq_str(start_ip) ", 0x0, " __rseq_str(post_commit_offset) ", 0x0, " __rseq_str(abort_ip) ", 0x0\n\t" \ -- ".arm\n\t" \ -- ".inst " __rseq_str(RSEQ_SIG_CODE) "\n\t" \ -+ ".word " __rseq_str(RSEQ_SIG) "\n\t" \ - __rseq_str(label) ":\n\t" \ - teardown \ - "b %l[" __rseq_str(abort_label) "]\n\t" -diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c -index 2f2d24a4dd5c..e629766f0ec8 100644 ---- a/virt/kvm/kvm_main.c -+++ b/virt/kvm/kvm_main.c -@@ -1790,7 +1790,7 @@ void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, - if (!map->hva) - return; - -- if (map->page) -+ if (map->page != KVM_UNMAPPED_PAGE) - kunmap(map->page); - #ifdef CONFIG_HAS_IOMEM - else diff -Nru linux-liquorix-5.2/debian/patches/zen/v5.2.9-lqx1.patch linux-liquorix-5.2/debian/patches/zen/v5.2.9-lqx1.patch --- linux-liquorix-5.2/debian/patches/zen/v5.2.9-lqx1.patch 1970-01-01 00:00:00.000000000 +0000 +++ linux-liquorix-5.2/debian/patches/zen/v5.2.9-lqx1.patch 2019-08-16 22:19:02.000000000 +0000 @@ -0,0 +1,121954 @@ +diff --git a/Documentation/admin-guide/hw-vuln/index.rst b/Documentation/admin-guide/hw-vuln/index.rst +index ffc064c1ec68..49311f3da6f2 100644 +--- a/Documentation/admin-guide/hw-vuln/index.rst ++++ b/Documentation/admin-guide/hw-vuln/index.rst +@@ -9,5 +9,6 @@ are configurable at compile, boot or run time. + .. toctree:: + :maxdepth: 1 + ++ spectre + l1tf + mds +diff --git a/Documentation/admin-guide/hw-vuln/spectre.rst b/Documentation/admin-guide/hw-vuln/spectre.rst +new file mode 100644 +index 000000000000..e05e581af5cf +--- /dev/null ++++ b/Documentation/admin-guide/hw-vuln/spectre.rst +@@ -0,0 +1,769 @@ ++.. SPDX-License-Identifier: GPL-2.0 ++ ++Spectre Side Channels ++===================== ++ ++Spectre is a class of side channel attacks that exploit branch prediction ++and speculative execution on modern CPUs to read memory, possibly ++bypassing access controls. Speculative execution side channel exploits ++do not modify memory but attempt to infer privileged data in the memory. ++ ++This document covers Spectre variant 1 and Spectre variant 2. ++ ++Affected processors ++------------------- ++ ++Speculative execution side channel methods affect a wide range of modern ++high performance processors, since most modern high speed processors ++use branch prediction and speculative execution. ++ ++The following CPUs are vulnerable: ++ ++ - Intel Core, Atom, Pentium, and Xeon processors ++ ++ - AMD Phenom, EPYC, and Zen processors ++ ++ - IBM POWER and zSeries processors ++ ++ - Higher end ARM processors ++ ++ - Apple CPUs ++ ++ - Higher end MIPS CPUs ++ ++ - Likely most other high performance CPUs. Contact your CPU vendor for details. ++ ++Whether a processor is affected or not can be read out from the Spectre ++vulnerability files in sysfs. See :ref:`spectre_sys_info`. ++ ++Related CVEs ++------------ ++ ++The following CVE entries describe Spectre variants: ++ ++ ============= ======================= ========================== ++ CVE-2017-5753 Bounds check bypass Spectre variant 1 ++ CVE-2017-5715 Branch target injection Spectre variant 2 ++ CVE-2019-1125 Spectre v1 swapgs Spectre variant 1 (swapgs) ++ ============= ======================= ========================== ++ ++Problem ++------- ++ ++CPUs use speculative operations to improve performance. That may leave ++traces of memory accesses or computations in the processor's caches, ++buffers, and branch predictors. Malicious software may be able to ++influence the speculative execution paths, and then use the side effects ++of the speculative execution in the CPUs' caches and buffers to infer ++privileged data touched during the speculative execution. ++ ++Spectre variant 1 attacks take advantage of speculative execution of ++conditional branches, while Spectre variant 2 attacks use speculative ++execution of indirect branches to leak privileged memory. ++See :ref:`[1] ` :ref:`[5] ` :ref:`[7] ` ++:ref:`[10] ` :ref:`[11] `. ++ ++Spectre variant 1 (Bounds Check Bypass) ++--------------------------------------- ++ ++The bounds check bypass attack :ref:`[2] ` takes advantage ++of speculative execution that bypasses conditional branch instructions ++used for memory access bounds check (e.g. checking if the index of an ++array results in memory access within a valid range). This results in ++memory accesses to invalid memory (with out-of-bound index) that are ++done speculatively before validation checks resolve. Such speculative ++memory accesses can leave side effects, creating side channels which ++leak information to the attacker. ++ ++There are some extensions of Spectre variant 1 attacks for reading data ++over the network, see :ref:`[12] `. However such attacks ++are difficult, low bandwidth, fragile, and are considered low risk. ++ ++Note that, despite "Bounds Check Bypass" name, Spectre variant 1 is not ++only about user-controlled array bounds checks. It can affect any ++conditional checks. The kernel entry code interrupt, exception, and NMI ++handlers all have conditional swapgs checks. Those may be problematic ++in the context of Spectre v1, as kernel code can speculatively run with ++a user GS. ++ ++Spectre variant 2 (Branch Target Injection) ++------------------------------------------- ++ ++The branch target injection attack takes advantage of speculative ++execution of indirect branches :ref:`[3] `. The indirect ++branch predictors inside the processor used to guess the target of ++indirect branches can be influenced by an attacker, causing gadget code ++to be speculatively executed, thus exposing sensitive data touched by ++the victim. The side effects left in the CPU's caches during speculative ++execution can be measured to infer data values. ++ ++.. _poison_btb: ++ ++In Spectre variant 2 attacks, the attacker can steer speculative indirect ++branches in the victim to gadget code by poisoning the branch target ++buffer of a CPU used for predicting indirect branch addresses. Such ++poisoning could be done by indirect branching into existing code, ++with the address offset of the indirect branch under the attacker's ++control. Since the branch prediction on impacted hardware does not ++fully disambiguate branch address and uses the offset for prediction, ++this could cause privileged code's indirect branch to jump to a gadget ++code with the same offset. ++ ++The most useful gadgets take an attacker-controlled input parameter (such ++as a register value) so that the memory read can be controlled. Gadgets ++without input parameters might be possible, but the attacker would have ++very little control over what memory can be read, reducing the risk of ++the attack revealing useful data. ++ ++One other variant 2 attack vector is for the attacker to poison the ++return stack buffer (RSB) :ref:`[13] ` to cause speculative ++subroutine return instruction execution to go to a gadget. An attacker's ++imbalanced subroutine call instructions might "poison" entries in the ++return stack buffer which are later consumed by a victim's subroutine ++return instructions. This attack can be mitigated by flushing the return ++stack buffer on context switch, or virtual machine (VM) exit. ++ ++On systems with simultaneous multi-threading (SMT), attacks are possible ++from the sibling thread, as level 1 cache and branch target buffer ++(BTB) may be shared between hardware threads in a CPU core. A malicious ++program running on the sibling thread may influence its peer's BTB to ++steer its indirect branch speculations to gadget code, and measure the ++speculative execution's side effects left in level 1 cache to infer the ++victim's data. ++ ++Attack scenarios ++---------------- ++ ++The following list of attack scenarios have been anticipated, but may ++not cover all possible attack vectors. ++ ++1. A user process attacking the kernel ++^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ++ ++Spectre variant 1 ++~~~~~~~~~~~~~~~~~ ++ ++ The attacker passes a parameter to the kernel via a register or ++ via a known address in memory during a syscall. Such parameter may ++ be used later by the kernel as an index to an array or to derive ++ a pointer for a Spectre variant 1 attack. The index or pointer ++ is invalid, but bound checks are bypassed in the code branch taken ++ for speculative execution. This could cause privileged memory to be ++ accessed and leaked. ++ ++ For kernel code that has been identified where data pointers could ++ potentially be influenced for Spectre attacks, new "nospec" accessor ++ macros are used to prevent speculative loading of data. ++ ++Spectre variant 1 (swapgs) ++~~~~~~~~~~~~~~~~~~~~~~~~~~ ++ ++ An attacker can train the branch predictor to speculatively skip the ++ swapgs path for an interrupt or exception. If they initialize ++ the GS register to a user-space value, if the swapgs is speculatively ++ skipped, subsequent GS-related percpu accesses in the speculation ++ window will be done with the attacker-controlled GS value. This ++ could cause privileged memory to be accessed and leaked. ++ ++ For example: ++ ++ :: ++ ++ if (coming from user space) ++ swapgs ++ mov %gs:, %reg ++ mov (%reg), %reg1 ++ ++ When coming from user space, the CPU can speculatively skip the ++ swapgs, and then do a speculative percpu load using the user GS ++ value. So the user can speculatively force a read of any kernel ++ value. If a gadget exists which uses the percpu value as an address ++ in another load/store, then the contents of the kernel value may ++ become visible via an L1 side channel attack. ++ ++ A similar attack exists when coming from kernel space. The CPU can ++ speculatively do the swapgs, causing the user GS to get used for the ++ rest of the speculative window. ++ ++Spectre variant 2 ++~~~~~~~~~~~~~~~~~ ++ ++ A spectre variant 2 attacker can :ref:`poison ` the branch ++ target buffer (BTB) before issuing syscall to launch an attack. ++ After entering the kernel, the kernel could use the poisoned branch ++ target buffer on indirect jump and jump to gadget code in speculative ++ execution. ++ ++ If an attacker tries to control the memory addresses leaked during ++ speculative execution, he would also need to pass a parameter to the ++ gadget, either through a register or a known address in memory. After ++ the gadget has executed, he can measure the side effect. ++ ++ The kernel can protect itself against consuming poisoned branch ++ target buffer entries by using return trampolines (also known as ++ "retpoline") :ref:`[3] ` :ref:`[9] ` for all ++ indirect branches. Return trampolines trap speculative execution paths ++ to prevent jumping to gadget code during speculative execution. ++ x86 CPUs with Enhanced Indirect Branch Restricted Speculation ++ (Enhanced IBRS) available in hardware should use the feature to ++ mitigate Spectre variant 2 instead of retpoline. Enhanced IBRS is ++ more efficient than retpoline. ++ ++ There may be gadget code in firmware which could be exploited with ++ Spectre variant 2 attack by a rogue user process. To mitigate such ++ attacks on x86, Indirect Branch Restricted Speculation (IBRS) feature ++ is turned on before the kernel invokes any firmware code. ++ ++2. A user process attacking another user process ++^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ++ ++ A malicious user process can try to attack another user process, ++ either via a context switch on the same hardware thread, or from the ++ sibling hyperthread sharing a physical processor core on simultaneous ++ multi-threading (SMT) system. ++ ++ Spectre variant 1 attacks generally require passing parameters ++ between the processes, which needs a data passing relationship, such ++ as remote procedure calls (RPC). Those parameters are used in gadget ++ code to derive invalid data pointers accessing privileged memory in ++ the attacked process. ++ ++ Spectre variant 2 attacks can be launched from a rogue process by ++ :ref:`poisoning ` the branch target buffer. This can ++ influence the indirect branch targets for a victim process that either ++ runs later on the same hardware thread, or running concurrently on ++ a sibling hardware thread sharing the same physical core. ++ ++ A user process can protect itself against Spectre variant 2 attacks ++ by using the prctl() syscall to disable indirect branch speculation ++ for itself. An administrator can also cordon off an unsafe process ++ from polluting the branch target buffer by disabling the process's ++ indirect branch speculation. This comes with a performance cost ++ from not using indirect branch speculation and clearing the branch ++ target buffer. When SMT is enabled on x86, for a process that has ++ indirect branch speculation disabled, Single Threaded Indirect Branch ++ Predictors (STIBP) :ref:`[4] ` are turned on to prevent the ++ sibling thread from controlling branch target buffer. In addition, ++ the Indirect Branch Prediction Barrier (IBPB) is issued to clear the ++ branch target buffer when context switching to and from such process. ++ ++ On x86, the return stack buffer is stuffed on context switch. ++ This prevents the branch target buffer from being used for branch ++ prediction when the return stack buffer underflows while switching to ++ a deeper call stack. Any poisoned entries in the return stack buffer ++ left by the previous process will also be cleared. ++ ++ User programs should use address space randomization to make attacks ++ more difficult (Set /proc/sys/kernel/randomize_va_space = 1 or 2). ++ ++3. A virtualized guest attacking the host ++^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ++ ++ The attack mechanism is similar to how user processes attack the ++ kernel. The kernel is entered via hyper-calls or other virtualization ++ exit paths. ++ ++ For Spectre variant 1 attacks, rogue guests can pass parameters ++ (e.g. in registers) via hyper-calls to derive invalid pointers to ++ speculate into privileged memory after entering the kernel. For places ++ where such kernel code has been identified, nospec accessor macros ++ are used to stop speculative memory access. ++ ++ For Spectre variant 2 attacks, rogue guests can :ref:`poison ++ ` the branch target buffer or return stack buffer, causing ++ the kernel to jump to gadget code in the speculative execution paths. ++ ++ To mitigate variant 2, the host kernel can use return trampolines ++ for indirect branches to bypass the poisoned branch target buffer, ++ and flushing the return stack buffer on VM exit. This prevents rogue ++ guests from affecting indirect branching in the host kernel. ++ ++ To protect host processes from rogue guests, host processes can have ++ indirect branch speculation disabled via prctl(). The branch target ++ buffer is cleared before context switching to such processes. ++ ++4. A virtualized guest attacking other guest ++^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ++ ++ A rogue guest may attack another guest to get data accessible by the ++ other guest. ++ ++ Spectre variant 1 attacks are possible if parameters can be passed ++ between guests. This may be done via mechanisms such as shared memory ++ or message passing. Such parameters could be used to derive data ++ pointers to privileged data in guest. The privileged data could be ++ accessed by gadget code in the victim's speculation paths. ++ ++ Spectre variant 2 attacks can be launched from a rogue guest by ++ :ref:`poisoning ` the branch target buffer or the return ++ stack buffer. Such poisoned entries could be used to influence ++ speculation execution paths in the victim guest. ++ ++ Linux kernel mitigates attacks to other guests running in the same ++ CPU hardware thread by flushing the return stack buffer on VM exit, ++ and clearing the branch target buffer before switching to a new guest. ++ ++ If SMT is used, Spectre variant 2 attacks from an untrusted guest ++ in the sibling hyperthread can be mitigated by the administrator, ++ by turning off the unsafe guest's indirect branch speculation via ++ prctl(). A guest can also protect itself by turning on microcode ++ based mitigations (such as IBPB or STIBP on x86) within the guest. ++ ++.. _spectre_sys_info: ++ ++Spectre system information ++-------------------------- ++ ++The Linux kernel provides a sysfs interface to enumerate the current ++mitigation status of the system for Spectre: whether the system is ++vulnerable, and which mitigations are active. ++ ++The sysfs file showing Spectre variant 1 mitigation status is: ++ ++ /sys/devices/system/cpu/vulnerabilities/spectre_v1 ++ ++The possible values in this file are: ++ ++ .. list-table:: ++ ++ * - 'Not affected' ++ - The processor is not vulnerable. ++ * - 'Vulnerable: __user pointer sanitization and usercopy barriers only; no swapgs barriers' ++ - The swapgs protections are disabled; otherwise it has ++ protection in the kernel on a case by case base with explicit ++ pointer sanitation and usercopy LFENCE barriers. ++ * - 'Mitigation: usercopy/swapgs barriers and __user pointer sanitization' ++ - Protection in the kernel on a case by case base with explicit ++ pointer sanitation, usercopy LFENCE barriers, and swapgs LFENCE ++ barriers. ++ ++However, the protections are put in place on a case by case basis, ++and there is no guarantee that all possible attack vectors for Spectre ++variant 1 are covered. ++ ++The spectre_v2 kernel file reports if the kernel has been compiled with ++retpoline mitigation or if the CPU has hardware mitigation, and if the ++CPU has support for additional process-specific mitigation. ++ ++This file also reports CPU features enabled by microcode to mitigate ++attack between user processes: ++ ++1. Indirect Branch Prediction Barrier (IBPB) to add additional ++ isolation between processes of different users. ++2. Single Thread Indirect Branch Predictors (STIBP) to add additional ++ isolation between CPU threads running on the same core. ++ ++These CPU features may impact performance when used and can be enabled ++per process on a case-by-case base. ++ ++The sysfs file showing Spectre variant 2 mitigation status is: ++ ++ /sys/devices/system/cpu/vulnerabilities/spectre_v2 ++ ++The possible values in this file are: ++ ++ - Kernel status: ++ ++ ==================================== ================================= ++ 'Not affected' The processor is not vulnerable ++ 'Vulnerable' Vulnerable, no mitigation ++ 'Mitigation: Full generic retpoline' Software-focused mitigation ++ 'Mitigation: Full AMD retpoline' AMD-specific software mitigation ++ 'Mitigation: Enhanced IBRS' Hardware-focused mitigation ++ ==================================== ================================= ++ ++ - Firmware status: Show if Indirect Branch Restricted Speculation (IBRS) is ++ used to protect against Spectre variant 2 attacks when calling firmware (x86 only). ++ ++ ========== ============================================================= ++ 'IBRS_FW' Protection against user program attacks when calling firmware ++ ========== ============================================================= ++ ++ - Indirect branch prediction barrier (IBPB) status for protection between ++ processes of different users. This feature can be controlled through ++ prctl() per process, or through kernel command line options. This is ++ an x86 only feature. For more details see below. ++ ++ =================== ======================================================== ++ 'IBPB: disabled' IBPB unused ++ 'IBPB: always-on' Use IBPB on all tasks ++ 'IBPB: conditional' Use IBPB on SECCOMP or indirect branch restricted tasks ++ =================== ======================================================== ++ ++ - Single threaded indirect branch prediction (STIBP) status for protection ++ between different hyper threads. This feature can be controlled through ++ prctl per process, or through kernel command line options. This is x86 ++ only feature. For more details see below. ++ ++ ==================== ======================================================== ++ 'STIBP: disabled' STIBP unused ++ 'STIBP: forced' Use STIBP on all tasks ++ 'STIBP: conditional' Use STIBP on SECCOMP or indirect branch restricted tasks ++ ==================== ======================================================== ++ ++ - Return stack buffer (RSB) protection status: ++ ++ ============= =========================================== ++ 'RSB filling' Protection of RSB on context switch enabled ++ ============= =========================================== ++ ++Full mitigation might require a microcode update from the CPU ++vendor. When the necessary microcode is not available, the kernel will ++report vulnerability. ++ ++Turning on mitigation for Spectre variant 1 and Spectre variant 2 ++----------------------------------------------------------------- ++ ++1. Kernel mitigation ++^^^^^^^^^^^^^^^^^^^^ ++ ++Spectre variant 1 ++~~~~~~~~~~~~~~~~~ ++ ++ For the Spectre variant 1, vulnerable kernel code (as determined ++ by code audit or scanning tools) is annotated on a case by case ++ basis to use nospec accessor macros for bounds clipping :ref:`[2] ++ ` to avoid any usable disclosure gadgets. However, it may ++ not cover all attack vectors for Spectre variant 1. ++ ++ Copy-from-user code has an LFENCE barrier to prevent the access_ok() ++ check from being mis-speculated. The barrier is done by the ++ barrier_nospec() macro. ++ ++ For the swapgs variant of Spectre variant 1, LFENCE barriers are ++ added to interrupt, exception and NMI entry where needed. These ++ barriers are done by the FENCE_SWAPGS_KERNEL_ENTRY and ++ FENCE_SWAPGS_USER_ENTRY macros. ++ ++Spectre variant 2 ++~~~~~~~~~~~~~~~~~ ++ ++ For Spectre variant 2 mitigation, the compiler turns indirect calls or ++ jumps in the kernel into equivalent return trampolines (retpolines) ++ :ref:`[3] ` :ref:`[9] ` to go to the target ++ addresses. Speculative execution paths under retpolines are trapped ++ in an infinite loop to prevent any speculative execution jumping to ++ a gadget. ++ ++ To turn on retpoline mitigation on a vulnerable CPU, the kernel ++ needs to be compiled with a gcc compiler that supports the ++ -mindirect-branch=thunk-extern -mindirect-branch-register options. ++ If the kernel is compiled with a Clang compiler, the compiler needs ++ to support -mretpoline-external-thunk option. The kernel config ++ CONFIG_RETPOLINE needs to be turned on, and the CPU needs to run with ++ the latest updated microcode. ++ ++ On Intel Skylake-era systems the mitigation covers most, but not all, ++ cases. See :ref:`[3] ` for more details. ++ ++ On CPUs with hardware mitigation for Spectre variant 2 (e.g. Enhanced ++ IBRS on x86), retpoline is automatically disabled at run time. ++ ++ The retpoline mitigation is turned on by default on vulnerable ++ CPUs. It can be forced on or off by the administrator ++ via the kernel command line and sysfs control files. See ++ :ref:`spectre_mitigation_control_command_line`. ++ ++ On x86, indirect branch restricted speculation is turned on by default ++ before invoking any firmware code to prevent Spectre variant 2 exploits ++ using the firmware. ++ ++ Using kernel address space randomization (CONFIG_RANDOMIZE_SLAB=y ++ and CONFIG_SLAB_FREELIST_RANDOM=y in the kernel configuration) makes ++ attacks on the kernel generally more difficult. ++ ++2. User program mitigation ++^^^^^^^^^^^^^^^^^^^^^^^^^^ ++ ++ User programs can mitigate Spectre variant 1 using LFENCE or "bounds ++ clipping". For more details see :ref:`[2] `. ++ ++ For Spectre variant 2 mitigation, individual user programs ++ can be compiled with return trampolines for indirect branches. ++ This protects them from consuming poisoned entries in the branch ++ target buffer left by malicious software. Alternatively, the ++ programs can disable their indirect branch speculation via prctl() ++ (See :ref:`Documentation/userspace-api/spec_ctrl.rst `). ++ On x86, this will turn on STIBP to guard against attacks from the ++ sibling thread when the user program is running, and use IBPB to ++ flush the branch target buffer when switching to/from the program. ++ ++ Restricting indirect branch speculation on a user program will ++ also prevent the program from launching a variant 2 attack ++ on x86. All sand-boxed SECCOMP programs have indirect branch ++ speculation restricted by default. Administrators can change ++ that behavior via the kernel command line and sysfs control files. ++ See :ref:`spectre_mitigation_control_command_line`. ++ ++ Programs that disable their indirect branch speculation will have ++ more overhead and run slower. ++ ++ User programs should use address space randomization ++ (/proc/sys/kernel/randomize_va_space = 1 or 2) to make attacks more ++ difficult. ++ ++3. VM mitigation ++^^^^^^^^^^^^^^^^ ++ ++ Within the kernel, Spectre variant 1 attacks from rogue guests are ++ mitigated on a case by case basis in VM exit paths. Vulnerable code ++ uses nospec accessor macros for "bounds clipping", to avoid any ++ usable disclosure gadgets. However, this may not cover all variant ++ 1 attack vectors. ++ ++ For Spectre variant 2 attacks from rogue guests to the kernel, the ++ Linux kernel uses retpoline or Enhanced IBRS to prevent consumption of ++ poisoned entries in branch target buffer left by rogue guests. It also ++ flushes the return stack buffer on every VM exit to prevent a return ++ stack buffer underflow so poisoned branch target buffer could be used, ++ or attacker guests leaving poisoned entries in the return stack buffer. ++ ++ To mitigate guest-to-guest attacks in the same CPU hardware thread, ++ the branch target buffer is sanitized by flushing before switching ++ to a new guest on a CPU. ++ ++ The above mitigations are turned on by default on vulnerable CPUs. ++ ++ To mitigate guest-to-guest attacks from sibling thread when SMT is ++ in use, an untrusted guest running in the sibling thread can have ++ its indirect branch speculation disabled by administrator via prctl(). ++ ++ The kernel also allows guests to use any microcode based mitigation ++ they choose to use (such as IBPB or STIBP on x86) to protect themselves. ++ ++.. _spectre_mitigation_control_command_line: ++ ++Mitigation control on the kernel command line ++--------------------------------------------- ++ ++Spectre variant 2 mitigation can be disabled or force enabled at the ++kernel command line. ++ ++ nospectre_v1 ++ ++ [X86,PPC] Disable mitigations for Spectre Variant 1 ++ (bounds check bypass). With this option data leaks are ++ possible in the system. ++ ++ nospectre_v2 ++ ++ [X86] Disable all mitigations for the Spectre variant 2 ++ (indirect branch prediction) vulnerability. System may ++ allow data leaks with this option, which is equivalent ++ to spectre_v2=off. ++ ++ ++ spectre_v2= ++ ++ [X86] Control mitigation of Spectre variant 2 ++ (indirect branch speculation) vulnerability. ++ The default operation protects the kernel from ++ user space attacks. ++ ++ on ++ unconditionally enable, implies ++ spectre_v2_user=on ++ off ++ unconditionally disable, implies ++ spectre_v2_user=off ++ auto ++ kernel detects whether your CPU model is ++ vulnerable ++ ++ Selecting 'on' will, and 'auto' may, choose a ++ mitigation method at run time according to the ++ CPU, the available microcode, the setting of the ++ CONFIG_RETPOLINE configuration option, and the ++ compiler with which the kernel was built. ++ ++ Selecting 'on' will also enable the mitigation ++ against user space to user space task attacks. ++ ++ Selecting 'off' will disable both the kernel and ++ the user space protections. ++ ++ Specific mitigations can also be selected manually: ++ ++ retpoline ++ replace indirect branches ++ retpoline,generic ++ google's original retpoline ++ retpoline,amd ++ AMD-specific minimal thunk ++ ++ Not specifying this option is equivalent to ++ spectre_v2=auto. ++ ++For user space mitigation: ++ ++ spectre_v2_user= ++ ++ [X86] Control mitigation of Spectre variant 2 ++ (indirect branch speculation) vulnerability between ++ user space tasks ++ ++ on ++ Unconditionally enable mitigations. Is ++ enforced by spectre_v2=on ++ ++ off ++ Unconditionally disable mitigations. Is ++ enforced by spectre_v2=off ++ ++ prctl ++ Indirect branch speculation is enabled, ++ but mitigation can be enabled via prctl ++ per thread. The mitigation control state ++ is inherited on fork. ++ ++ prctl,ibpb ++ Like "prctl" above, but only STIBP is ++ controlled per thread. IBPB is issued ++ always when switching between different user ++ space processes. ++ ++ seccomp ++ Same as "prctl" above, but all seccomp ++ threads will enable the mitigation unless ++ they explicitly opt out. ++ ++ seccomp,ibpb ++ Like "seccomp" above, but only STIBP is ++ controlled per thread. IBPB is issued ++ always when switching between different ++ user space processes. ++ ++ auto ++ Kernel selects the mitigation depending on ++ the available CPU features and vulnerability. ++ ++ Default mitigation: ++ If CONFIG_SECCOMP=y then "seccomp", otherwise "prctl" ++ ++ Not specifying this option is equivalent to ++ spectre_v2_user=auto. ++ ++ In general the kernel by default selects ++ reasonable mitigations for the current CPU. To ++ disable Spectre variant 2 mitigations, boot with ++ spectre_v2=off. Spectre variant 1 mitigations ++ cannot be disabled. ++ ++Mitigation selection guide ++-------------------------- ++ ++1. Trusted userspace ++^^^^^^^^^^^^^^^^^^^^ ++ ++ If all userspace applications are from trusted sources and do not ++ execute externally supplied untrusted code, then the mitigations can ++ be disabled. ++ ++2. Protect sensitive programs ++^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ++ ++ For security-sensitive programs that have secrets (e.g. crypto ++ keys), protection against Spectre variant 2 can be put in place by ++ disabling indirect branch speculation when the program is running ++ (See :ref:`Documentation/userspace-api/spec_ctrl.rst `). ++ ++3. Sandbox untrusted programs ++^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ++ ++ Untrusted programs that could be a source of attacks can be cordoned ++ off by disabling their indirect branch speculation when they are run ++ (See :ref:`Documentation/userspace-api/spec_ctrl.rst `). ++ This prevents untrusted programs from polluting the branch target ++ buffer. All programs running in SECCOMP sandboxes have indirect ++ branch speculation restricted by default. This behavior can be ++ changed via the kernel command line and sysfs control files. See ++ :ref:`spectre_mitigation_control_command_line`. ++ ++3. High security mode ++^^^^^^^^^^^^^^^^^^^^^ ++ ++ All Spectre variant 2 mitigations can be forced on ++ at boot time for all programs (See the "on" option in ++ :ref:`spectre_mitigation_control_command_line`). This will add ++ overhead as indirect branch speculations for all programs will be ++ restricted. ++ ++ On x86, branch target buffer will be flushed with IBPB when switching ++ to a new program. STIBP is left on all the time to protect programs ++ against variant 2 attacks originating from programs running on ++ sibling threads. ++ ++ Alternatively, STIBP can be used only when running programs ++ whose indirect branch speculation is explicitly disabled, ++ while IBPB is still used all the time when switching to a new ++ program to clear the branch target buffer (See "ibpb" option in ++ :ref:`spectre_mitigation_control_command_line`). This "ibpb" option ++ has less performance cost than the "on" option, which leaves STIBP ++ on all the time. ++ ++References on Spectre ++--------------------- ++ ++Intel white papers: ++ ++.. _spec_ref1: ++ ++[1] `Intel analysis of speculative execution side channels `_. ++ ++.. _spec_ref2: ++ ++[2] `Bounds check bypass `_. ++ ++.. _spec_ref3: ++ ++[3] `Deep dive: Retpoline: A branch target injection mitigation `_. ++ ++.. _spec_ref4: ++ ++[4] `Deep Dive: Single Thread Indirect Branch Predictors `_. ++ ++AMD white papers: ++ ++.. _spec_ref5: ++ ++[5] `AMD64 technology indirect branch control extension `_. ++ ++.. _spec_ref6: ++ ++[6] `Software techniques for managing speculation on AMD processors `_. ++ ++ARM white papers: ++ ++.. _spec_ref7: ++ ++[7] `Cache speculation side-channels `_. ++ ++.. _spec_ref8: ++ ++[8] `Cache speculation issues update `_. ++ ++Google white paper: ++ ++.. _spec_ref9: ++ ++[9] `Retpoline: a software construct for preventing branch-target-injection `_. ++ ++MIPS white paper: ++ ++.. _spec_ref10: ++ ++[10] `MIPS: response on speculative execution and side channel vulnerabilities `_. ++ ++Academic papers: ++ ++.. _spec_ref11: ++ ++[11] `Spectre Attacks: Exploiting Speculative Execution `_. ++ ++.. _spec_ref12: ++ ++[12] `NetSpectre: Read Arbitrary Memory over Network `_. ++ ++.. _spec_ref13: ++ ++[13] `Spectre Returns! Speculation Attacks using the Return Stack Buffer `_. +diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt +index 138f6664b2e2..cc7bfbade6f5 100644 +--- a/Documentation/admin-guide/kernel-parameters.txt ++++ b/Documentation/admin-guide/kernel-parameters.txt +@@ -2587,7 +2587,7 @@ + expose users to several CPU vulnerabilities. + Equivalent to: nopti [X86,PPC] + kpti=0 [ARM64] +- nospectre_v1 [PPC] ++ nospectre_v1 [X86,PPC] + nobp=0 [S390] + nospectre_v2 [X86,PPC,S390,ARM64] + spectre_v2_user=off [X86] +@@ -2936,9 +2936,9 @@ + nosmt=force: Force disable SMT, cannot be undone + via the sysfs control file. + +- nospectre_v1 [PPC] Disable mitigations for Spectre Variant 1 (bounds +- check bypass). With this option data leaks are possible +- in the system. ++ nospectre_v1 [X86,PPC] Disable mitigations for Spectre Variant 1 ++ (bounds check bypass). With this option data leaks are ++ possible in the system. + + nospectre_v2 [X86,PPC_FSL_BOOK3E,ARM64] Disable all mitigations for + the Spectre variant 2 (indirect branch prediction) +@@ -4178,6 +4178,14 @@ + Memory area to be used by remote processor image, + managed by CMA. + ++ rqshare= [X86] Select the MuQSS scheduler runqueue sharing type. ++ Format: ++ smt -- Share SMT (hyperthread) sibling runqueues ++ mc -- Share MC (multicore) sibling runqueues ++ smp -- Share SMP runqueues ++ none -- So not share any runqueues ++ Default value is mc ++ + rw [KNL] Mount root device read-write on boot + + S [KNL] Run init in single mode +@@ -5102,12 +5110,6 @@ + emulate [default] Vsyscalls turn into traps and are + emulated reasonably safely. + +- native Vsyscalls are native syscall instructions. +- This is a little bit faster than trapping +- and makes a few dynamic recompilers work +- better than they would in emulation mode. +- It also makes exploits much easier to write. +- + none Vsyscalls don't work at all. This makes + them quite hard to use for exploits but + might break your system. +diff --git a/Documentation/atomic_t.txt b/Documentation/atomic_t.txt +index dca3fb0554db..65bb09a29324 100644 +--- a/Documentation/atomic_t.txt ++++ b/Documentation/atomic_t.txt +@@ -194,6 +194,9 @@ These helper barriers exist because architectures have varying implicit + ordering on their SMP atomic primitives. For example our TSO architectures + provide full ordered atomics and these barriers are no-ops. + ++NOTE: when the atomic RmW ops are fully ordered, they should also imply a ++compiler barrier. ++ + Thus: + + atomic_fetch_add(); +diff --git a/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt b/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt +new file mode 100644 +index 000000000000..a30d63db3c8f +--- /dev/null ++++ b/Documentation/devicetree/bindings/display/panel/armadeus,st0700-adapt.txt +@@ -0,0 +1,9 @@ ++Armadeus ST0700 Adapt. A Santek ST0700I5Y-RBSLW 7.0" WVGA (800x480) TFT with ++an adapter board. ++ ++Required properties: ++- compatible: "armadeus,st0700-adapt" ++- power-supply: see panel-common.txt ++ ++Optional properties: ++- backlight: see panel-common.txt +diff --git a/Documentation/devicetree/bindings/leds/backlight/lm3630a-backlight.yaml b/Documentation/devicetree/bindings/leds/backlight/lm3630a-backlight.yaml +index 4d61fe0a98a4..dc129d9a329e 100644 +--- a/Documentation/devicetree/bindings/leds/backlight/lm3630a-backlight.yaml ++++ b/Documentation/devicetree/bindings/leds/backlight/lm3630a-backlight.yaml +@@ -23,16 +23,17 @@ properties: + reg: + maxItems: 1 + +- ti,linear-mapping-mode: +- description: | +- Enable linear mapping mode. If disabled, then it will use exponential +- mapping mode in which the ramp up/down appears to have a more uniform +- transition to the human eye. +- type: boolean ++ '#address-cells': ++ const: 1 ++ ++ '#size-cells': ++ const: 0 + + required: + - compatible + - reg ++ - '#address-cells' ++ - '#size-cells' + + patternProperties: + "^led@[01]$": +@@ -48,7 +49,6 @@ patternProperties: + in this property. The two current sinks can be controlled + independently with both banks, or bank A can be configured to control + both sinks with the led-sources property. +- maxItems: 1 + minimum: 0 + maximum: 1 + +@@ -73,6 +73,13 @@ patternProperties: + minimum: 0 + maximum: 255 + ++ ti,linear-mapping-mode: ++ description: | ++ Enable linear mapping mode. If disabled, then it will use exponential ++ mapping mode in which the ramp up/down appears to have a more uniform ++ transition to the human eye. ++ type: boolean ++ + required: + - reg + +diff --git a/Documentation/devicetree/bindings/net/marvell-orion-mdio.txt b/Documentation/devicetree/bindings/net/marvell-orion-mdio.txt +index 42cd81090a2c..3f3cfc1d8d4d 100644 +--- a/Documentation/devicetree/bindings/net/marvell-orion-mdio.txt ++++ b/Documentation/devicetree/bindings/net/marvell-orion-mdio.txt +@@ -16,7 +16,7 @@ Required properties: + + Optional properties: + - interrupts: interrupt line number for the SMI error/done interrupt +-- clocks: phandle for up to three required clocks for the MDIO instance ++- clocks: phandle for up to four required clocks for the MDIO instance + + The child nodes of the MDIO driver are the individual PHY devices + connected to this MDIO bus. They must have a "reg" property given the +diff --git a/Documentation/devicetree/bindings/usb/usb251xb.txt b/Documentation/devicetree/bindings/usb/usb251xb.txt +index bc7945e9dbfe..17915f64b8ee 100644 +--- a/Documentation/devicetree/bindings/usb/usb251xb.txt ++++ b/Documentation/devicetree/bindings/usb/usb251xb.txt +@@ -64,10 +64,8 @@ Optional properties : + - power-on-time-ms : Specifies the time it takes from the time the host + initiates the power-on sequence to a port until the port has adequate + power. The value is given in ms in a 0 - 510 range (default is 100ms). +- - swap-dx-lanes : Specifies the downstream ports which will swap the +- differential-pair (D+/D-), default is not-swapped. +- - swap-us-lanes : Selects the upstream port differential-pair (D+/D-) +- swapping (boolean, default is not-swapped) ++ - swap-dx-lanes : Specifies the ports which will swap the differential-pair ++ (D+/D-), default is not-swapped. + + Examples: + usb2512b@2c { +diff --git a/Documentation/scheduler/sched-BFS.txt b/Documentation/scheduler/sched-BFS.txt +new file mode 100644 +index 000000000000..c0282002a079 +--- /dev/null ++++ b/Documentation/scheduler/sched-BFS.txt +@@ -0,0 +1,351 @@ ++BFS - The Brain Fuck Scheduler by Con Kolivas. ++ ++Goals. ++ ++The goal of the Brain Fuck Scheduler, referred to as BFS from here on, is to ++completely do away with the complex designs of the past for the cpu process ++scheduler and instead implement one that is very simple in basic design. ++The main focus of BFS is to achieve excellent desktop interactivity and ++responsiveness without heuristics and tuning knobs that are difficult to ++understand, impossible to model and predict the effect of, and when tuned to ++one workload cause massive detriment to another. ++ ++ ++Design summary. ++ ++BFS is best described as a single runqueue, O(n) lookup, earliest effective ++virtual deadline first design, loosely based on EEVDF (earliest eligible virtual ++deadline first) and my previous Staircase Deadline scheduler. Each component ++shall be described in order to understand the significance of, and reasoning for ++it. The codebase when the first stable version was released was approximately ++9000 lines less code than the existing mainline linux kernel scheduler (in ++2.6.31). This does not even take into account the removal of documentation and ++the cgroups code that is not used. ++ ++Design reasoning. ++ ++The single runqueue refers to the queued but not running processes for the ++entire system, regardless of the number of CPUs. The reason for going back to ++a single runqueue design is that once multiple runqueues are introduced, ++per-CPU or otherwise, there will be complex interactions as each runqueue will ++be responsible for the scheduling latency and fairness of the tasks only on its ++own runqueue, and to achieve fairness and low latency across multiple CPUs, any ++advantage in throughput of having CPU local tasks causes other disadvantages. ++This is due to requiring a very complex balancing system to at best achieve some ++semblance of fairness across CPUs and can only maintain relatively low latency ++for tasks bound to the same CPUs, not across them. To increase said fairness ++and latency across CPUs, the advantage of local runqueue locking, which makes ++for better scalability, is lost due to having to grab multiple locks. ++ ++A significant feature of BFS is that all accounting is done purely based on CPU ++used and nowhere is sleep time used in any way to determine entitlement or ++interactivity. Interactivity "estimators" that use some kind of sleep/run ++algorithm are doomed to fail to detect all interactive tasks, and to falsely tag ++tasks that aren't interactive as being so. The reason for this is that it is ++close to impossible to determine that when a task is sleeping, whether it is ++doing it voluntarily, as in a userspace application waiting for input in the ++form of a mouse click or otherwise, or involuntarily, because it is waiting for ++another thread, process, I/O, kernel activity or whatever. Thus, such an ++estimator will introduce corner cases, and more heuristics will be required to ++cope with those corner cases, introducing more corner cases and failed ++interactivity detection and so on. Interactivity in BFS is built into the design ++by virtue of the fact that tasks that are waking up have not used up their quota ++of CPU time, and have earlier effective deadlines, thereby making it very likely ++they will preempt any CPU bound task of equivalent nice level. See below for ++more information on the virtual deadline mechanism. Even if they do not preempt ++a running task, because the rr interval is guaranteed to have a bound upper ++limit on how long a task will wait for, it will be scheduled within a timeframe ++that will not cause visible interface jitter. ++ ++ ++Design details. ++ ++Task insertion. ++ ++BFS inserts tasks into each relevant queue as an O(1) insertion into a double ++linked list. On insertion, *every* running queue is checked to see if the newly ++queued task can run on any idle queue, or preempt the lowest running task on the ++system. This is how the cross-CPU scheduling of BFS achieves significantly lower ++latency per extra CPU the system has. In this case the lookup is, in the worst ++case scenario, O(n) where n is the number of CPUs on the system. ++ ++Data protection. ++ ++BFS has one single lock protecting the process local data of every task in the ++global queue. Thus every insertion, removal and modification of task data in the ++global runqueue needs to grab the global lock. However, once a task is taken by ++a CPU, the CPU has its own local data copy of the running process' accounting ++information which only that CPU accesses and modifies (such as during a ++timer tick) thus allowing the accounting data to be updated lockless. Once a ++CPU has taken a task to run, it removes it from the global queue. Thus the ++global queue only ever has, at most, ++ ++ (number of tasks requesting cpu time) - (number of logical CPUs) + 1 ++ ++tasks in the global queue. This value is relevant for the time taken to look up ++tasks during scheduling. This will increase if many tasks with CPU affinity set ++in their policy to limit which CPUs they're allowed to run on if they outnumber ++the number of CPUs. The +1 is because when rescheduling a task, the CPU's ++currently running task is put back on the queue. Lookup will be described after ++the virtual deadline mechanism is explained. ++ ++Virtual deadline. ++ ++The key to achieving low latency, scheduling fairness, and "nice level" ++distribution in BFS is entirely in the virtual deadline mechanism. The one ++tunable in BFS is the rr_interval, or "round robin interval". This is the ++maximum time two SCHED_OTHER (or SCHED_NORMAL, the common scheduling policy) ++tasks of the same nice level will be running for, or looking at it the other ++way around, the longest duration two tasks of the same nice level will be ++delayed for. When a task requests cpu time, it is given a quota (time_slice) ++equal to the rr_interval and a virtual deadline. The virtual deadline is ++offset from the current time in jiffies by this equation: ++ ++ jiffies + (prio_ratio * rr_interval) ++ ++The prio_ratio is determined as a ratio compared to the baseline of nice -20 ++and increases by 10% per nice level. The deadline is a virtual one only in that ++no guarantee is placed that a task will actually be scheduled by this time, but ++it is used to compare which task should go next. There are three components to ++how a task is next chosen. First is time_slice expiration. If a task runs out ++of its time_slice, it is descheduled, the time_slice is refilled, and the ++deadline reset to that formula above. Second is sleep, where a task no longer ++is requesting CPU for whatever reason. The time_slice and deadline are _not_ ++adjusted in this case and are just carried over for when the task is next ++scheduled. Third is preemption, and that is when a newly waking task is deemed ++higher priority than a currently running task on any cpu by virtue of the fact ++that it has an earlier virtual deadline than the currently running task. The ++earlier deadline is the key to which task is next chosen for the first and ++second cases. Once a task is descheduled, it is put back on the queue, and an ++O(n) lookup of all queued-but-not-running tasks is done to determine which has ++the earliest deadline and that task is chosen to receive CPU next. ++ ++The CPU proportion of different nice tasks works out to be approximately the ++ ++ (prio_ratio difference)^2 ++ ++The reason it is squared is that a task's deadline does not change while it is ++running unless it runs out of time_slice. Thus, even if the time actually ++passes the deadline of another task that is queued, it will not get CPU time ++unless the current running task deschedules, and the time "base" (jiffies) is ++constantly moving. ++ ++Task lookup. ++ ++BFS has 103 priority queues. 100 of these are dedicated to the static priority ++of realtime tasks, and the remaining 3 are, in order of best to worst priority, ++SCHED_ISO (isochronous), SCHED_NORMAL, and SCHED_IDLEPRIO (idle priority ++scheduling). When a task of these priorities is queued, a bitmap of running ++priorities is set showing which of these priorities has tasks waiting for CPU ++time. When a CPU is made to reschedule, the lookup for the next task to get ++CPU time is performed in the following way: ++ ++First the bitmap is checked to see what static priority tasks are queued. If ++any realtime priorities are found, the corresponding queue is checked and the ++first task listed there is taken (provided CPU affinity is suitable) and lookup ++is complete. If the priority corresponds to a SCHED_ISO task, they are also ++taken in FIFO order (as they behave like SCHED_RR). If the priority corresponds ++to either SCHED_NORMAL or SCHED_IDLEPRIO, then the lookup becomes O(n). At this ++stage, every task in the runlist that corresponds to that priority is checked ++to see which has the earliest set deadline, and (provided it has suitable CPU ++affinity) it is taken off the runqueue and given the CPU. If a task has an ++expired deadline, it is taken and the rest of the lookup aborted (as they are ++chosen in FIFO order). ++ ++Thus, the lookup is O(n) in the worst case only, where n is as described ++earlier, as tasks may be chosen before the whole task list is looked over. ++ ++ ++Scalability. ++ ++The major limitations of BFS will be that of scalability, as the separate ++runqueue designs will have less lock contention as the number of CPUs rises. ++However they do not scale linearly even with separate runqueues as multiple ++runqueues will need to be locked concurrently on such designs to be able to ++achieve fair CPU balancing, to try and achieve some sort of nice-level fairness ++across CPUs, and to achieve low enough latency for tasks on a busy CPU when ++other CPUs would be more suited. BFS has the advantage that it requires no ++balancing algorithm whatsoever, as balancing occurs by proxy simply because ++all CPUs draw off the global runqueue, in priority and deadline order. Despite ++the fact that scalability is _not_ the prime concern of BFS, it both shows very ++good scalability to smaller numbers of CPUs and is likely a more scalable design ++at these numbers of CPUs. ++ ++It also has some very low overhead scalability features built into the design ++when it has been deemed their overhead is so marginal that they're worth adding. ++The first is the local copy of the running process' data to the CPU it's running ++on to allow that data to be updated lockless where possible. Then there is ++deference paid to the last CPU a task was running on, by trying that CPU first ++when looking for an idle CPU to use the next time it's scheduled. Finally there ++is the notion of cache locality beyond the last running CPU. The sched_domains ++information is used to determine the relative virtual "cache distance" that ++other CPUs have from the last CPU a task was running on. CPUs with shared ++caches, such as SMT siblings, or multicore CPUs with shared caches, are treated ++as cache local. CPUs without shared caches are treated as not cache local, and ++CPUs on different NUMA nodes are treated as very distant. This "relative cache ++distance" is used by modifying the virtual deadline value when doing lookups. ++Effectively, the deadline is unaltered between "cache local" CPUs, doubled for ++"cache distant" CPUs, and quadrupled for "very distant" CPUs. The reasoning ++behind the doubling of deadlines is as follows. The real cost of migrating a ++task from one CPU to another is entirely dependant on the cache footprint of ++the task, how cache intensive the task is, how long it's been running on that ++CPU to take up the bulk of its cache, how big the CPU cache is, how fast and ++how layered the CPU cache is, how fast a context switch is... and so on. In ++other words, it's close to random in the real world where we do more than just ++one sole workload. The only thing we can be sure of is that it's not free. So ++BFS uses the principle that an idle CPU is a wasted CPU and utilising idle CPUs ++is more important than cache locality, and cache locality only plays a part ++after that. Doubling the effective deadline is based on the premise that the ++"cache local" CPUs will tend to work on the same tasks up to double the number ++of cache local CPUs, and once the workload is beyond that amount, it is likely ++that none of the tasks are cache warm anywhere anyway. The quadrupling for NUMA ++is a value I pulled out of my arse. ++ ++When choosing an idle CPU for a waking task, the cache locality is determined ++according to where the task last ran and then idle CPUs are ranked from best ++to worst to choose the most suitable idle CPU based on cache locality, NUMA ++node locality and hyperthread sibling business. They are chosen in the ++following preference (if idle): ++ ++* Same core, idle or busy cache, idle threads ++* Other core, same cache, idle or busy cache, idle threads. ++* Same node, other CPU, idle cache, idle threads. ++* Same node, other CPU, busy cache, idle threads. ++* Same core, busy threads. ++* Other core, same cache, busy threads. ++* Same node, other CPU, busy threads. ++* Other node, other CPU, idle cache, idle threads. ++* Other node, other CPU, busy cache, idle threads. ++* Other node, other CPU, busy threads. ++ ++This shows the SMT or "hyperthread" awareness in the design as well which will ++choose a real idle core first before a logical SMT sibling which already has ++tasks on the physical CPU. ++ ++Early benchmarking of BFS suggested scalability dropped off at the 16 CPU mark. ++However this benchmarking was performed on an earlier design that was far less ++scalable than the current one so it's hard to know how scalable it is in terms ++of both CPUs (due to the global runqueue) and heavily loaded machines (due to ++O(n) lookup) at this stage. Note that in terms of scalability, the number of ++_logical_ CPUs matters, not the number of _physical_ CPUs. Thus, a dual (2x) ++quad core (4X) hyperthreaded (2X) machine is effectively a 16X. Newer benchmark ++results are very promising indeed, without needing to tweak any knobs, features ++or options. Benchmark contributions are most welcome. ++ ++ ++Features ++ ++As the initial prime target audience for BFS was the average desktop user, it ++was designed to not need tweaking, tuning or have features set to obtain benefit ++from it. Thus the number of knobs and features has been kept to an absolute ++minimum and should not require extra user input for the vast majority of cases. ++There are precisely 2 tunables, and 2 extra scheduling policies. The rr_interval ++and iso_cpu tunables, and the SCHED_ISO and SCHED_IDLEPRIO policies. In addition ++to this, BFS also uses sub-tick accounting. What BFS does _not_ now feature is ++support for CGROUPS. The average user should neither need to know what these ++are, nor should they need to be using them to have good desktop behaviour. ++ ++rr_interval ++ ++There is only one "scheduler" tunable, the round robin interval. This can be ++accessed in ++ ++ /proc/sys/kernel/rr_interval ++ ++The value is in milliseconds, and the default value is set to 6 on a ++uniprocessor machine, and automatically set to a progressively higher value on ++multiprocessor machines. The reasoning behind increasing the value on more CPUs ++is that the effective latency is decreased by virtue of there being more CPUs on ++BFS (for reasons explained above), and increasing the value allows for less ++cache contention and more throughput. Valid values are from 1 to 1000 ++Decreasing the value will decrease latencies at the cost of decreasing ++throughput, while increasing it will improve throughput, but at the cost of ++worsening latencies. The accuracy of the rr interval is limited by HZ resolution ++of the kernel configuration. Thus, the worst case latencies are usually slightly ++higher than this actual value. The default value of 6 is not an arbitrary one. ++It is based on the fact that humans can detect jitter at approximately 7ms, so ++aiming for much lower latencies is pointless under most circumstances. It is ++worth noting this fact when comparing the latency performance of BFS to other ++schedulers. Worst case latencies being higher than 7ms are far worse than ++average latencies not being in the microsecond range. ++ ++Isochronous scheduling. ++ ++Isochronous scheduling is a unique scheduling policy designed to provide ++near-real-time performance to unprivileged (ie non-root) users without the ++ability to starve the machine indefinitely. Isochronous tasks (which means ++"same time") are set using, for example, the schedtool application like so: ++ ++ schedtool -I -e amarok ++ ++This will start the audio application "amarok" as SCHED_ISO. How SCHED_ISO works ++is that it has a priority level between true realtime tasks and SCHED_NORMAL ++which would allow them to preempt all normal tasks, in a SCHED_RR fashion (ie, ++if multiple SCHED_ISO tasks are running, they purely round robin at rr_interval ++rate). However if ISO tasks run for more than a tunable finite amount of time, ++they are then demoted back to SCHED_NORMAL scheduling. This finite amount of ++time is the percentage of _total CPU_ available across the machine, configurable ++as a percentage in the following "resource handling" tunable (as opposed to a ++scheduler tunable): ++ ++ /proc/sys/kernel/iso_cpu ++ ++and is set to 70% by default. It is calculated over a rolling 5 second average ++Because it is the total CPU available, it means that on a multi CPU machine, it ++is possible to have an ISO task running as realtime scheduling indefinitely on ++just one CPU, as the other CPUs will be available. Setting this to 100 is the ++equivalent of giving all users SCHED_RR access and setting it to 0 removes the ++ability to run any pseudo-realtime tasks. ++ ++A feature of BFS is that it detects when an application tries to obtain a ++realtime policy (SCHED_RR or SCHED_FIFO) and the caller does not have the ++appropriate privileges to use those policies. When it detects this, it will ++give the task SCHED_ISO policy instead. Thus it is transparent to the user. ++Because some applications constantly set their policy as well as their nice ++level, there is potential for them to undo the override specified by the user ++on the command line of setting the policy to SCHED_ISO. To counter this, once ++a task has been set to SCHED_ISO policy, it needs superuser privileges to set ++it back to SCHED_NORMAL. This will ensure the task remains ISO and all child ++processes and threads will also inherit the ISO policy. ++ ++Idleprio scheduling. ++ ++Idleprio scheduling is a scheduling policy designed to give out CPU to a task ++_only_ when the CPU would be otherwise idle. The idea behind this is to allow ++ultra low priority tasks to be run in the background that have virtually no ++effect on the foreground tasks. This is ideally suited to distributed computing ++clients (like setiathome, folding, mprime etc) but can also be used to start ++a video encode or so on without any slowdown of other tasks. To avoid this ++policy from grabbing shared resources and holding them indefinitely, if it ++detects a state where the task is waiting on I/O, the machine is about to ++suspend to ram and so on, it will transiently schedule them as SCHED_NORMAL. As ++per the Isochronous task management, once a task has been scheduled as IDLEPRIO, ++it cannot be put back to SCHED_NORMAL without superuser privileges. Tasks can ++be set to start as SCHED_IDLEPRIO with the schedtool command like so: ++ ++ schedtool -D -e ./mprime ++ ++Subtick accounting. ++ ++It is surprisingly difficult to get accurate CPU accounting, and in many cases, ++the accounting is done by simply determining what is happening at the precise ++moment a timer tick fires off. This becomes increasingly inaccurate as the ++timer tick frequency (HZ) is lowered. It is possible to create an application ++which uses almost 100% CPU, yet by being descheduled at the right time, records ++zero CPU usage. While the main problem with this is that there are possible ++security implications, it is also difficult to determine how much CPU a task ++really does use. BFS tries to use the sub-tick accounting from the TSC clock, ++where possible, to determine real CPU usage. This is not entirely reliable, but ++is far more likely to produce accurate CPU usage data than the existing designs ++and will not show tasks as consuming no CPU usage when they actually are. Thus, ++the amount of CPU reported as being used by BFS will more accurately represent ++how much CPU the task itself is using (as is shown for example by the 'time' ++application), so the reported values may be quite different to other schedulers. ++Values reported as the 'load' are more prone to problems with this design, but ++per process values are closer to real usage. When comparing throughput of BFS ++to other designs, it is important to compare the actual completed work in terms ++of total wall clock time taken and total work done, rather than the reported ++"cpu usage". ++ ++ ++Con Kolivas Fri Aug 27 2010 +diff --git a/Documentation/scheduler/sched-MuQSS.txt b/Documentation/scheduler/sched-MuQSS.txt +new file mode 100644 +index 000000000000..ae28b85c9995 +--- /dev/null ++++ b/Documentation/scheduler/sched-MuQSS.txt +@@ -0,0 +1,373 @@ ++MuQSS - The Multiple Queue Skiplist Scheduler by Con Kolivas. ++ ++MuQSS is a per-cpu runqueue variant of the original BFS scheduler with ++one 8 level skiplist per runqueue, and fine grained locking for much more ++scalability. ++ ++ ++Goals. ++ ++The goal of the Multiple Queue Skiplist Scheduler, referred to as MuQSS from ++here on (pronounced mux) is to completely do away with the complex designs of ++the past for the cpu process scheduler and instead implement one that is very ++simple in basic design. The main focus of MuQSS is to achieve excellent desktop ++interactivity and responsiveness without heuristics and tuning knobs that are ++difficult to understand, impossible to model and predict the effect of, and when ++tuned to one workload cause massive detriment to another, while still being ++scalable to many CPUs and processes. ++ ++ ++Design summary. ++ ++MuQSS is best described as per-cpu multiple runqueue, O(log n) insertion, O(1) ++lookup, earliest effective virtual deadline first tickless design, loosely based ++on EEVDF (earliest eligible virtual deadline first) and my previous Staircase ++Deadline scheduler, and evolved from the single runqueue O(n) BFS scheduler. ++Each component shall be described in order to understand the significance of, ++and reasoning for it. ++ ++ ++Design reasoning. ++ ++In BFS, the use of a single runqueue across all CPUs meant that each CPU would ++need to scan the entire runqueue looking for the process with the earliest ++deadline and schedule that next, regardless of which CPU it originally came ++from. This made BFS deterministic with respect to latency and provided ++guaranteed latencies dependent on number of processes and CPUs. The single ++runqueue, however, meant that all CPUs would compete for the single lock ++protecting it, which would lead to increasing lock contention as the number of ++CPUs rose and appeared to limit scalability of common workloads beyond 16 ++logical CPUs. Additionally, the O(n) lookup of the runqueue list obviously ++increased overhead proportionate to the number of queued proecesses and led to ++cache thrashing while iterating over the linked list. ++ ++MuQSS is an evolution of BFS, designed to maintain the same scheduling ++decision mechanism and be virtually deterministic without relying on the ++constrained design of the single runqueue by splitting out the single runqueue ++to be per-CPU and use skiplists instead of linked lists. ++ ++The original reason for going back to a single runqueue design for BFS was that ++once multiple runqueues are introduced, per-CPU or otherwise, there will be ++complex interactions as each runqueue will be responsible for the scheduling ++latency and fairness of the tasks only on its own runqueue, and to achieve ++fairness and low latency across multiple CPUs, any advantage in throughput of ++having CPU local tasks causes other disadvantages. This is due to requiring a ++very complex balancing system to at best achieve some semblance of fairness ++across CPUs and can only maintain relatively low latency for tasks bound to the ++same CPUs, not across them. To increase said fairness and latency across CPUs, ++the advantage of local runqueue locking, which makes for better scalability, is ++lost due to having to grab multiple locks. ++ ++MuQSS works around the problems inherent in multiple runqueue designs by ++making its skip lists priority ordered and through novel use of lockless ++examination of each other runqueue it can decide if it should take the earliest ++deadline task from another runqueue for latency reasons, or for CPU balancing ++reasons. It still does not have a balancing system, choosing to allow the ++next task scheduling decision and task wakeup CPU choice to allow balancing to ++happen by virtue of its choices. ++ ++As a further evolution of the design, MuQSS normally configures sharing of ++runqueues in a logical fashion for when CPU resources are shared for improved ++latency and throughput. By default it shares runqueues and locks between ++multicore siblings. Optionally it can be configured to run with sharing of ++SMT siblings only, all SMP packages or no sharing at all. Additionally it can ++be selected at boot time. ++ ++ ++Design details. ++ ++Custom skip list implementation: ++ ++To avoid the overhead of building up and tearing down skip list structures, ++the variant used by MuQSS has a number of optimisations making it specific for ++its use case in the scheduler. It uses static arrays of 8 'levels' instead of ++building up and tearing down structures dynamically. This makes each runqueue ++only scale O(log N) up to 64k tasks. However as there is one runqueue per CPU ++it means that it scales O(log N) up to 64k x number of logical CPUs which is ++far beyond the realistic task limits each CPU could handle. By being 8 levels ++it also makes the array exactly one cacheline in size. Additionally, each ++skip list node is bidirectional making insertion and removal amortised O(1), ++being O(k) where k is 1-8. Uniquely, we are only ever interested in the very ++first entry in each list at all times with MuQSS, so there is never a need to ++do a search and thus look up is always O(1). In interactive mode, the queues ++will be searched beyond their first entry if the first task is not suitable ++for affinity or SMT nice reasons. ++ ++Task insertion: ++ ++MuQSS inserts tasks into a per CPU runqueue as an O(log N) insertion into ++a custom skip list as described above (based on the original design by William ++Pugh). Insertion is ordered in such a way that there is never a need to do a ++search by ordering tasks according to static priority primarily, and then ++virtual deadline at the time of insertion. ++ ++Niffies: ++ ++Niffies are a monotonic forward moving timer not unlike the "jiffies" but are ++of nanosecond resolution. Niffies are calculated per-runqueue from the high ++resolution TSC timers, and in order to maintain fairness are synchronised ++between CPUs whenever both runqueues are locked concurrently. ++ ++Virtual deadline: ++ ++The key to achieving low latency, scheduling fairness, and "nice level" ++distribution in MuQSS is entirely in the virtual deadline mechanism. The one ++tunable in MuQSS is the rr_interval, or "round robin interval". This is the ++maximum time two SCHED_OTHER (or SCHED_NORMAL, the common scheduling policy) ++tasks of the same nice level will be running for, or looking at it the other ++way around, the longest duration two tasks of the same nice level will be ++delayed for. When a task requests cpu time, it is given a quota (time_slice) ++equal to the rr_interval and a virtual deadline. The virtual deadline is ++offset from the current time in niffies by this equation: ++ ++ niffies + (prio_ratio * rr_interval) ++ ++The prio_ratio is determined as a ratio compared to the baseline of nice -20 ++and increases by 10% per nice level. The deadline is a virtual one only in that ++no guarantee is placed that a task will actually be scheduled by this time, but ++it is used to compare which task should go next. There are three components to ++how a task is next chosen. First is time_slice expiration. If a task runs out ++of its time_slice, it is descheduled, the time_slice is refilled, and the ++deadline reset to that formula above. Second is sleep, where a task no longer ++is requesting CPU for whatever reason. The time_slice and deadline are _not_ ++adjusted in this case and are just carried over for when the task is next ++scheduled. Third is preemption, and that is when a newly waking task is deemed ++higher priority than a currently running task on any cpu by virtue of the fact ++that it has an earlier virtual deadline than the currently running task. The ++earlier deadline is the key to which task is next chosen for the first and ++second cases. ++ ++The CPU proportion of different nice tasks works out to be approximately the ++ ++ (prio_ratio difference)^2 ++ ++The reason it is squared is that a task's deadline does not change while it is ++running unless it runs out of time_slice. Thus, even if the time actually ++passes the deadline of another task that is queued, it will not get CPU time ++unless the current running task deschedules, and the time "base" (niffies) is ++constantly moving. ++ ++Task lookup: ++ ++As tasks are already pre-ordered according to anticipated scheduling order in ++the skip lists, lookup for the next suitable task per-runqueue is always a ++matter of simply selecting the first task in the 0th level skip list entry. ++In order to maintain optimal latency and fairness across CPUs, MuQSS does a ++novel examination of every other runqueue in cache locality order, choosing the ++best task across all runqueues. This provides near-determinism of how long any ++task across the entire system may wait before receiving CPU time. The other ++runqueues are first examine lockless and then trylocked to minimise the ++potential lock contention if they are likely to have a suitable better task. ++Each other runqueue lock is only held for as long as it takes to examine the ++entry for suitability. In "interactive" mode, the default setting, MuQSS will ++look for the best deadline task across all CPUs, while in !interactive mode, ++it will only select a better deadline task from another CPU if it is more ++heavily laden than the current one. ++ ++Lookup is therefore O(k) where k is number of CPUs. ++ ++ ++Latency. ++ ++Through the use of virtual deadlines to govern the scheduling order of normal ++tasks, queue-to-activation latency per runqueue is guaranteed to be bound by ++the rr_interval tunable which is set to 6ms by default. This means that the ++longest a CPU bound task will wait for more CPU is proportional to the number ++of running tasks and in the common case of 0-2 running tasks per CPU, will be ++under the 7ms threshold for human perception of jitter. Additionally, as newly ++woken tasks will have an early deadline from their previous runtime, the very ++tasks that are usually latency sensitive will have the shortest interval for ++activation, usually preempting any existing CPU bound tasks. ++ ++Tickless expiry: ++ ++A feature of MuQSS is that it is not tied to the resolution of the chosen tick ++rate in Hz, instead depending entirely on the high resolution timers where ++possible for sub-millisecond accuracy on timeouts regarless of the underlying ++tick rate. This allows MuQSS to be run with the low overhead of low Hz rates ++such as 100 by default, benefiting from the improved throughput and lower ++power usage it provides. Another advantage of this approach is that in ++combination with the Full No HZ option, which disables ticks on running task ++CPUs instead of just idle CPUs, the tick can be disabled at all times ++regardless of how many tasks are running instead of being limited to just one ++running task. Note that this option is NOT recommended for regular desktop ++users. ++ ++ ++Scalability and balancing. ++ ++Unlike traditional approaches where balancing is a combination of CPU selection ++at task wakeup and intermittent balancing based on a vast array of rules set ++according to architecture, busyness calculations and special case management, ++MuQSS indirectly balances on the fly at task wakeup and next task selection. ++During initialisation, MuQSS creates a cache coherency ordered list of CPUs for ++each logical CPU and uses this to aid task/CPU selection when CPUs are busy. ++Additionally it selects any idle CPUs, if they are available, at any time over ++busy CPUs according to the following preference: ++ ++ * Same thread, idle or busy cache, idle or busy threads ++ * Other core, same cache, idle or busy cache, idle threads. ++ * Same node, other CPU, idle cache, idle threads. ++ * Same node, other CPU, busy cache, idle threads. ++ * Other core, same cache, busy threads. ++ * Same node, other CPU, busy threads. ++ * Other node, other CPU, idle cache, idle threads. ++ * Other node, other CPU, busy cache, idle threads. ++ * Other node, other CPU, busy threads. ++ ++Mux is therefore SMT, MC and Numa aware without the need for extra ++intermittent balancing to maintain CPUs busy and make the most of cache ++coherency. ++ ++ ++Features ++ ++As the initial prime target audience for MuQSS was the average desktop user, it ++was designed to not need tweaking, tuning or have features set to obtain benefit ++from it. Thus the number of knobs and features has been kept to an absolute ++minimum and should not require extra user input for the vast majority of cases. ++There are 3 optional tunables, and 2 extra scheduling policies. The rr_interval, ++interactive, and iso_cpu tunables, and the SCHED_ISO and SCHED_IDLEPRIO ++policies. In addition to this, MuQSS also uses sub-tick accounting. What MuQSS ++does _not_ now feature is support for CGROUPS. The average user should neither ++need to know what these are, nor should they need to be using them to have good ++desktop behaviour. However since some applications refuse to work without ++cgroups, one can enable them with MuQSS as a stub and the filesystem will be ++created which will allow the applications to work. ++ ++rr_interval: ++ ++ /proc/sys/kernel/rr_interval ++ ++The value is in milliseconds, and the default value is set to 6. Valid values ++are from 1 to 1000 Decreasing the value will decrease latencies at the cost of ++decreasing throughput, while increasing it will improve throughput, but at the ++cost of worsening latencies. It is based on the fact that humans can detect ++jitter at approximately 7ms, so aiming for much lower latencies is pointless ++under most circumstances. It is worth noting this fact when comparing the ++latency performance of MuQSS to other schedulers. Worst case latencies being ++higher than 7ms are far worse than average latencies not being in the ++microsecond range. ++ ++interactive: ++ ++ /proc/sys/kernel/interactive ++ ++The value is a simple boolean of 1 for on and 0 for off and is set to on by ++default. Disabling this will disable the near-determinism of MuQSS when ++selecting the next task by not examining all CPUs for the earliest deadline ++task, or which CPU to wake to, instead prioritising CPU balancing for improved ++throughput. Latency will still be bound by rr_interval, but on a per-CPU basis ++instead of across the whole system. ++ ++Runqueue sharing. ++ ++By default MuQSS chooses to share runqueue resources (specifically the skip ++list and locking) between multicore siblings. It is configurable at build time ++to select between None, SMT, MC and SMP, corresponding to no sharing, sharing ++only between simultaneous mulithreading siblings, multicore siblings, or ++symmetric multiprocessing physical packages. Additionally it can be se at ++bootime with the use of the rqshare parameter. The reason for configurability ++is that some architectures have CPUs with many multicore siblings (>= 16) ++where it may be detrimental to throughput to share runqueues and another ++sharing option may be desirable. Additionally, more sharing than usual can ++improve latency on a system-wide level at the expense of throughput if desired. ++ ++The options are: ++none, smt, mc, smp ++ ++eg: ++ rqshare=mc ++ ++Isochronous scheduling: ++ ++Isochronous scheduling is a unique scheduling policy designed to provide ++near-real-time performance to unprivileged (ie non-root) users without the ++ability to starve the machine indefinitely. Isochronous tasks (which means ++"same time") are set using, for example, the schedtool application like so: ++ ++ schedtool -I -e amarok ++ ++This will start the audio application "amarok" as SCHED_ISO. How SCHED_ISO works ++is that it has a priority level between true realtime tasks and SCHED_NORMAL ++which would allow them to preempt all normal tasks, in a SCHED_RR fashion (ie, ++if multiple SCHED_ISO tasks are running, they purely round robin at rr_interval ++rate). However if ISO tasks run for more than a tunable finite amount of time, ++they are then demoted back to SCHED_NORMAL scheduling. This finite amount of ++time is the percentage of CPU available per CPU, configurable as a percentage in ++the following "resource handling" tunable (as opposed to a scheduler tunable): ++ ++iso_cpu: ++ ++ /proc/sys/kernel/iso_cpu ++ ++and is set to 70% by default. It is calculated over a rolling 5 second average ++Because it is the total CPU available, it means that on a multi CPU machine, it ++is possible to have an ISO task running as realtime scheduling indefinitely on ++just one CPU, as the other CPUs will be available. Setting this to 100 is the ++equivalent of giving all users SCHED_RR access and setting it to 0 removes the ++ability to run any pseudo-realtime tasks. ++ ++A feature of MuQSS is that it detects when an application tries to obtain a ++realtime policy (SCHED_RR or SCHED_FIFO) and the caller does not have the ++appropriate privileges to use those policies. When it detects this, it will ++give the task SCHED_ISO policy instead. Thus it is transparent to the user. ++ ++ ++Idleprio scheduling: ++ ++Idleprio scheduling is a scheduling policy designed to give out CPU to a task ++_only_ when the CPU would be otherwise idle. The idea behind this is to allow ++ultra low priority tasks to be run in the background that have virtually no ++effect on the foreground tasks. This is ideally suited to distributed computing ++clients (like setiathome, folding, mprime etc) but can also be used to start a ++video encode or so on without any slowdown of other tasks. To avoid this policy ++from grabbing shared resources and holding them indefinitely, if it detects a ++state where the task is waiting on I/O, the machine is about to suspend to ram ++and so on, it will transiently schedule them as SCHED_NORMAL. Once a task has ++been scheduled as IDLEPRIO, it cannot be put back to SCHED_NORMAL without ++superuser privileges since it is effectively a lower scheduling policy. Tasks ++can be set to start as SCHED_IDLEPRIO with the schedtool command like so: ++ ++schedtool -D -e ./mprime ++ ++Subtick accounting: ++ ++It is surprisingly difficult to get accurate CPU accounting, and in many cases, ++the accounting is done by simply determining what is happening at the precise ++moment a timer tick fires off. This becomes increasingly inaccurate as the timer ++tick frequency (HZ) is lowered. It is possible to create an application which ++uses almost 100% CPU, yet by being descheduled at the right time, records zero ++CPU usage. While the main problem with this is that there are possible security ++implications, it is also difficult to determine how much CPU a task really does ++use. Mux uses sub-tick accounting from the TSC clock to determine real CPU ++usage. Thus, the amount of CPU reported as being used by MuQSS will more ++accurately represent how much CPU the task itself is using (as is shown for ++example by the 'time' application), so the reported values may be quite ++different to other schedulers. When comparing throughput of MuQSS to other ++designs, it is important to compare the actual completed work in terms of total ++wall clock time taken and total work done, rather than the reported "cpu usage". ++ ++Symmetric MultiThreading (SMT) aware nice: ++ ++SMT, a.k.a. hyperthreading, is a very common feature on modern CPUs. While the ++logical CPU count rises by adding thread units to each CPU core, allowing more ++than one task to be run simultaneously on the same core, the disadvantage of it ++is that the CPU power is shared between the tasks, not summating to the power ++of two CPUs. The practical upshot of this is that two tasks running on ++separate threads of the same core run significantly slower than if they had one ++core each to run on. While smart CPU selection allows each task to have a core ++to itself whenever available (as is done on MuQSS), it cannot offset the ++slowdown that occurs when the cores are all loaded and only a thread is left. ++Most of the time this is harmless as the CPU is effectively overloaded at this ++point and the extra thread is of benefit. However when running a niced task in ++the presence of an un-niced task (say nice 19 v nice 0), the nice task gets ++precisely the same amount of CPU power as the unniced one. MuQSS has an ++optional configuration feature known as SMT-NICE which selectively idles the ++secondary niced thread for a period proportional to the nice difference, ++allowing CPU distribution according to nice level to be maintained, at the ++expense of a small amount of extra overhead. If this is configured in on a ++machine without SMT threads, the overhead is minimal. ++ ++ ++Con Kolivas Sat, 29th October 2016 +diff --git a/Documentation/scheduler/sched-pelt.c b/Documentation/scheduler/sched-pelt.c +index e4219139386a..7238b355919c 100644 +--- a/Documentation/scheduler/sched-pelt.c ++++ b/Documentation/scheduler/sched-pelt.c +@@ -20,7 +20,8 @@ void calc_runnable_avg_yN_inv(void) + int i; + unsigned int x; + +- printf("static const u32 runnable_avg_yN_inv[] = {"); ++ /* To silence -Wunused-but-set-variable warnings. */ ++ printf("static const u32 runnable_avg_yN_inv[] __maybe_unused = {"); + for (i = 0; i < HALFLIFE; i++) { + x = ((1UL<<32)-1)*pow(y, i); + +diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt +index f0c86fbb3b48..88cc0a02a9ef 100644 +--- a/Documentation/sysctl/kernel.txt ++++ b/Documentation/sysctl/kernel.txt +@@ -41,6 +41,7 @@ show up in /proc/sys/kernel: + - hung_task_check_interval_secs + - hung_task_warnings + - hyperv_record_panic_msg ++- iso_cpu + - kexec_load_disabled + - kptr_restrict + - l2cr [ PPC only ] +@@ -77,6 +78,7 @@ show up in /proc/sys/kernel: + - randomize_va_space + - real-root-dev ==> Documentation/admin-guide/initrd.rst + - reboot-cmd [ SPARC only ] ++- rr_interval + - rtsig-max + - rtsig-nr + - sched_energy_aware +@@ -100,6 +102,7 @@ show up in /proc/sys/kernel: + - unknown_nmi_panic + - watchdog + - watchdog_thresh ++- yield_type + - version + + ============================================================== +@@ -438,6 +441,16 @@ When kptr_restrict is set to (2), kernel pointers printed using + + ============================================================== + ++iso_cpu: (MuQSS CPU scheduler only). ++ ++This sets the percentage cpu that the unprivileged SCHED_ISO tasks can ++run effectively at realtime priority, averaged over a rolling five ++seconds over the -whole- system, meaning all cpus. ++ ++Set to 70 (percent) by default. ++ ++============================================================== ++ + l2cr: (PPC only) + + This flag controls the L2 cache of G3 processor boards. If +@@ -881,6 +894,20 @@ rebooting. ??? + + ============================================================== + ++rr_interval: (MuQSS CPU scheduler only) ++ ++This is the smallest duration that any cpu process scheduling unit ++will run for. Increasing this value can increase throughput of cpu ++bound tasks substantially but at the expense of increased latencies ++overall. Conversely decreasing it will decrease average and maximum ++latencies but at the expense of throughput. This value is in ++milliseconds and the default value chosen depends on the number of ++cpus available at scheduler initialisation with a minimum of 6. ++ ++Valid values are from 1-1000. ++ ++============================================================== ++ + rtsig-max & rtsig-nr: + + The file rtsig-max can be used to tune the maximum number +@@ -1143,3 +1170,13 @@ The softlockup threshold is (2 * watchdog_thresh). Setting this + tunable to zero will disable lockup detection altogether. + + ============================================================== ++ ++yield_type: (MuQSS CPU scheduler only) ++ ++This determines what type of yield calls to sched_yield will perform. ++ ++ 0: No yield. ++ 1: Yield only to better priority/deadline tasks. (default) ++ 2: Expire timeslice and recalculate deadline. ++ ++============================================================== +diff --git a/Documentation/tp_smapi.txt b/Documentation/tp_smapi.txt +new file mode 100644 +index 000000000000..a249678a8866 +--- /dev/null ++++ b/Documentation/tp_smapi.txt +@@ -0,0 +1,275 @@ ++tp_smapi version 0.42 ++IBM ThinkPad hardware functions driver ++ ++Author: Shem Multinymous ++Project: http://sourceforge.net/projects/tpctl ++Wiki: http://thinkwiki.org/wiki/tp_smapi ++List: linux-thinkpad@linux-thinkpad.org ++ (http://mailman.linux-thinkpad.org/mailman/listinfo/linux-thinkpad) ++ ++Description ++----------- ++ ++ThinkPad laptops include a proprietary interface called SMAPI BIOS ++(System Management Application Program Interface) which provides some ++hardware control functionality that is not accessible by other means. ++ ++This driver exposes some features of the SMAPI BIOS through a sysfs ++interface. It is suitable for newer models, on which SMAPI is invoked ++through IO port writes. Older models use a different SMAPI interface; ++for those, try the "thinkpad" module from the "tpctl" package. ++ ++WARNING: ++This driver uses undocumented features and direct hardware access. ++It thus cannot be guaranteed to work, and may cause arbitrary damage ++(especially on models it wasn't tested on). ++ ++ ++Module parameters ++----------------- ++ ++thinkpad_ec module: ++ force_io=1 lets thinkpad_ec load on some recent ThinkPad models ++ (e.g., T400 and T500) whose BIOS's ACPI DSDT reserves the ports we need. ++tp_smapi module: ++ debug=1 enables verbose dmesg output. ++ ++ ++Usage ++----- ++ ++Control of battery charging thresholds (in percents of current full charge ++capacity): ++ ++# echo 40 > /sys/devices/platform/smapi/BAT0/start_charge_thresh ++# echo 70 > /sys/devices/platform/smapi/BAT0/stop_charge_thresh ++# cat /sys/devices/platform/smapi/BAT0/*_charge_thresh ++ ++ (This is useful since Li-Ion batteries wear out much faster at very ++ high or low charge levels. The driver will also keeps the thresholds ++ across suspend-to-disk with AC disconnected; this isn't done ++ automatically by the hardware.) ++ ++Inhibiting battery charging for 17 minutes (overrides thresholds): ++ ++# echo 17 > /sys/devices/platform/smapi/BAT0/inhibit_charge_minutes ++# echo 0 > /sys/devices/platform/smapi/BAT0/inhibit_charge_minutes # stop ++# cat /sys/devices/platform/smapi/BAT0/inhibit_charge_minutes ++ ++ (This can be used to control which battery is charged when using an ++ Ultrabay battery.) ++ ++Forcing battery discharging even if AC power available: ++ ++# echo 1 > /sys/devices/platform/smapi/BAT0/force_discharge # start discharge ++# echo 0 > /sys/devices/platform/smapi/BAT0/force_discharge # stop discharge ++# cat /sys/devices/platform/smapi/BAT0/force_discharge ++ ++ (When AC is connected, forced discharging will automatically stop ++ when battery is fully depleted -- this is useful for calibration. ++ Also, this attribute can be used to control which battery is discharged ++ when both a system battery and an Ultrabay battery are connected.) ++ ++Misc read-only battery status attributes (see note about HDAPS below): ++ ++/sys/devices/platform/smapi/BAT0/installed # 0 or 1 ++/sys/devices/platform/smapi/BAT0/state # idle/charging/discharging ++/sys/devices/platform/smapi/BAT0/cycle_count # integer counter ++/sys/devices/platform/smapi/BAT0/current_now # instantaneous current ++/sys/devices/platform/smapi/BAT0/current_avg # last minute average ++/sys/devices/platform/smapi/BAT0/power_now # instantaneous power ++/sys/devices/platform/smapi/BAT0/power_avg # last minute average ++/sys/devices/platform/smapi/BAT0/last_full_capacity # in mWh ++/sys/devices/platform/smapi/BAT0/remaining_percent # remaining percent of energy (set by calibration) ++/sys/devices/platform/smapi/BAT0/remaining_percent_error # error range of remaing_percent (not reset by calibration) ++/sys/devices/platform/smapi/BAT0/remaining_running_time # in minutes, by last minute average power ++/sys/devices/platform/smapi/BAT0/remaining_running_time_now # in minutes, by instantenous power ++/sys/devices/platform/smapi/BAT0/remaining_charging_time # in minutes ++/sys/devices/platform/smapi/BAT0/remaining_capacity # in mWh ++/sys/devices/platform/smapi/BAT0/design_capacity # in mWh ++/sys/devices/platform/smapi/BAT0/voltage # in mV ++/sys/devices/platform/smapi/BAT0/design_voltage # in mV ++/sys/devices/platform/smapi/BAT0/charging_max_current # max charging current ++/sys/devices/platform/smapi/BAT0/charging_max_voltage # max charging voltage ++/sys/devices/platform/smapi/BAT0/group{0,1,2,3}_voltage # see below ++/sys/devices/platform/smapi/BAT0/manufacturer # string ++/sys/devices/platform/smapi/BAT0/model # string ++/sys/devices/platform/smapi/BAT0/barcoding # string ++/sys/devices/platform/smapi/BAT0/chemistry # string ++/sys/devices/platform/smapi/BAT0/serial # integer ++/sys/devices/platform/smapi/BAT0/manufacture_date # YYYY-MM-DD ++/sys/devices/platform/smapi/BAT0/first_use_date # YYYY-MM-DD ++/sys/devices/platform/smapi/BAT0/temperature # in milli-Celsius ++/sys/devices/platform/smapi/BAT0/dump # see below ++/sys/devices/platform/smapi/ac_connected # 0 or 1 ++ ++The BAT0/group{0,1,2,3}_voltage attribute refers to the separate cell groups ++in each battery. For example, on the ThinkPad 600, X3x, T4x and R5x models, ++the battery contains 3 cell groups in series, where each group consisting of 2 ++or 3 cells connected in parallel. The voltage of each group is given by these ++attributes, and their sum (roughly) equals the "voltage" attribute. ++(The effective performance of the battery is determined by the weakest group, ++i.e., the one those voltage changes most rapidly during dis/charging.) ++ ++The "BAT0/dump" attribute gives a a hex dump of the raw status data, which ++contains additional data now in the above (if you can figure it out). Some ++unused values are autodetected and replaced by "--": ++ ++In all of the above, replace BAT0 with BAT1 to address the 2nd battery (e.g. ++in the UltraBay). ++ ++ ++Raw SMAPI calls: ++ ++/sys/devices/platform/smapi/smapi_request ++This performs raw SMAPI calls. It uses a bad interface that cannot handle ++multiple simultaneous access. Don't touch it, it's for development only. ++If you did touch it, you would so something like ++# echo '211a 100 0 0' > /sys/devices/platform/smapi/smapi_request ++# cat /sys/devices/platform/smapi/smapi_request ++and notice that in the output "211a 34b b2 0 0 0 'OK'", the "4b" in the 2nd ++value, converted to decimal is 75: the current charge stop threshold. ++ ++ ++Model-specific status ++--------------------- ++ ++Works (at least partially) on the following ThinkPad model: ++* A30 ++* G41 ++* R40, R50p, R51, R52 ++* T23, T40, T40p, T41, T41p, T42, T42p, T43, T43p, T60, T61, T400, T410, T420 (partially) ++* X24, X31, X32, X40, X41, X60, X61, X200, X201, X220 (partially) ++* Z60t, Z61m ++ ++Does not work on: ++* X230 and newer ++* T430 and newer ++* Any ThinkPad Edge ++* Any ThinkPad Yoga ++* Any ThinkPad L series ++* Any ThinkPad P series ++ ++Not all functions are available on all models; for detailed status, see: ++ http://thinkwiki.org/wiki/tp_smapi ++ ++Please report success/failure by e-mail or on the Wiki. ++If you get a "not implemented" or "not supported" message, your laptop ++probably just can't do that (at least not via the SMAPI BIOS). ++For negative reports, follow the bug reporting guidelines below. ++If you send me the necessary technical data (i.e., SMAPI function ++interfaces), I will support additional models. ++ ++ ++Additional HDAPS features ++------------------------- ++ ++The modified hdaps driver has several improvements on the one in mainline ++(beyond resolving the conflict with thinkpad_ec and tp_smapi): ++ ++- Fixes reliability and improves support for recent ThinkPad models ++ (especially *60 and newer). Unlike the mainline driver, the modified hdaps ++ correctly follows the Embedded Controller communication protocol. ++ ++- Extends the "invert" parameter to cover all possible axis orientations. ++ The possible values are as follows. ++ Let X,Y denote the hardware readouts. ++ Let R denote the laptop's roll (tilt left/right). ++ Let P denote the laptop's pitch (tilt forward/backward). ++ invert=0: R= X P= Y (same as mainline) ++ invert=1: R=-X P=-Y (same as mainline) ++ invert=2: R=-X P= Y (new) ++ invert=3: R= X P=-Y (new) ++ invert=4: R= Y P= X (new) ++ invert=5: R=-Y P=-X (new) ++ invert=6: R=-Y P= X (new) ++ invert=7: R= Y P=-X (new) ++ It's probably easiest to just try all 8 possibilities and see which yields ++ correct results (e.g., in the hdaps-gl visualisation). ++ ++- Adds a whitelist which automatically sets the correct axis orientation for ++ some models. If the value for your model is wrong or missing, you can override ++ it using the "invert" parameter. Please also update the tables at ++ http://www.thinkwiki.org/wiki/tp_smapi and ++ http://www.thinkwiki.org/wiki/List_of_DMI_IDs ++ and submit a patch for the whitelist in hdaps.c. ++ ++- Provides new attributes: ++ /sys/devices/platform/hdaps/sampling_rate: ++ This determines the frequency at which the host queries the embedded ++ controller for accelerometer data (and informs the hdaps input devices). ++ Default=50. ++ /sys/devices/platform/hdaps/oversampling_ratio: ++ When set to X, the embedded controller is told to do physical accelerometer ++ measurements at a rate that is X times higher than the rate at which ++ the driver reads those measurements (i.e., X*sampling_rate). This ++ makes the readouts from the embedded controller more fresh, and is also ++ useful for the running average filter (see next). Default=5 ++ /sys/devices/platform/hdaps/running_avg_filter_order: ++ When set to X, reported readouts will be the average of the last X physical ++ accelerometer measurements. Current firmware allows 1<=X<=8. Setting to a ++ high value decreases readout fluctuations. The averaging is handled by the ++ embedded controller, so no CPU resources are used. Higher values make the ++ readouts smoother, since it averages out both sensor noise (good) and abrupt ++ changes (bad). Default=2. ++ ++- Provides a second input device, which publishes the raw accelerometer ++ measurements (without the fuzzing needed for joystick emulation). This input ++ device can be matched by a udev rule such as the following (all on one line): ++ KERNEL=="event[0-9]*", ATTRS{phys}=="hdaps/input1", ++ ATTRS{modalias}=="input:b0019v1014p5054e4801-*", ++ SYMLINK+="input/hdaps/accelerometer-event ++ ++A new version of the hdapsd userspace daemon, which uses the input device ++interface instead of polling sysfs, is available seprately. Using this reduces ++the total interrupts per second generated by hdaps+hdapsd (on tickless kernels) ++to 50, down from a value that fluctuates between 50 and 100. Set the ++sampling_rate sysfs attribute to a lower value to further reduce interrupts, ++at the expense of response latency. ++ ++Licensing note: all my changes to the HDAPS driver are licensed under the ++GPL version 2 or, at your option and to the extent allowed by derivation from ++prior works, any later version. My version of hdaps is derived work from the ++mainline version, which at the time of writing is available only under ++GPL version 2. ++ ++Bug reporting ++------------- ++ ++Mail . Please include: ++* Details about your model, ++* Relevant "dmesg" output. Make sure thinkpad_ec and tp_smapi are loaded with ++ the "debug=1" parameter (e.g., use "make load HDAPS=1 DEBUG=1"). ++* Output of "dmidecode | grep -C5 Product" ++* Does the failed functionality works under Windows? ++ ++ ++More about SMAPI ++---------------- ++ ++For hints about what may be possible via the SMAPI BIOS and how, see: ++ ++* IBM Technical Reference Manual for the ThinkPad 770 ++ (http://www-307.ibm.com/pc/support/site.wss/document.do?lndocid=PFAN-3TUQQD) ++* Exported symbols in PWRMGRIF.DLL or TPPWRW32.DLL (e.g., use "objdump -x"). ++* drivers/char/mwave/smapi.c in the Linux kernel tree.* ++* The "thinkpad" SMAPI module (http://tpctl.sourceforge.net). ++* The SMAPI_* constants in tp_smapi.c. ++ ++Note that in the above Technical Reference and in the "thinkpad" module, ++SMAPI is invoked through a function call to some physical address. However, ++the interface used by tp_smapi and the above mwave drive, and apparently ++required by newer ThinkPad, is different: you set the parameters up in the ++CPU's registers and write to ports 0xB2 (the APM control port) and 0x4F; this ++triggers an SMI (System Management Interrupt), causing the CPU to enter ++SMM (System Management Mode) and run the BIOS firmware; the results are ++returned in the CPU's registers. It is not clear what is the relation between ++the two variants of SMAPI, though the assignment of error codes seems to be ++similar. ++ ++In addition, the embedded controller on ThinkPad laptops has a non-standard ++interface at IO ports 0x1600-0x161F (mapped to LCP channel 3 of the H8S chip). ++The interface provides various system management services (currently known: ++battery information and accelerometer readouts). For more information see the ++thinkpad_ec module and the H8S hardware documentation: ++http://documentation.renesas.com/eng/products/mpumcu/rej09b0300_2140bhm.pdf +diff --git a/Documentation/userspace-api/spec_ctrl.rst b/Documentation/userspace-api/spec_ctrl.rst +index 1129c7550a48..7ddd8f667459 100644 +--- a/Documentation/userspace-api/spec_ctrl.rst ++++ b/Documentation/userspace-api/spec_ctrl.rst +@@ -49,6 +49,8 @@ If PR_SPEC_PRCTL is set, then the per-task control of the mitigation is + available. If not set, prctl(PR_SET_SPECULATION_CTRL) for the speculation + misfeature will fail. + ++.. _set_spec_ctrl: ++ + PR_SET_SPECULATION_CTRL + ----------------------- + +diff --git a/Makefile b/Makefile +index 3e4868a6498b..a9c48f9728c8 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,9 +1,9 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 5 + PATCHLEVEL = 2 +-SUBLEVEL = 0 +-EXTRAVERSION = +-NAME = Bobtail Squid ++SUBLEVEL = 9 ++EXTRAVERSION = -lqx1 ++NAME = The Beauty and the Bug + + # *DOCUMENTATION* + # To see a list of typical targets execute "make help" +@@ -467,6 +467,7 @@ KBUILD_CFLAGS_MODULE := -DMODULE + KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds + KBUILD_LDFLAGS := + GCC_PLUGINS_CFLAGS := ++CLANG_FLAGS := + + export ARCH SRCARCH CONFIG_SHELL HOSTCC KBUILD_HOSTCFLAGS CROSS_COMPILE AS LD CC + export CPP AR NM STRIP OBJCOPY OBJDUMP PAHOLE KBUILD_HOSTLDFLAGS KBUILD_HOSTLDLIBS +@@ -519,7 +520,7 @@ endif + + ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),) + ifneq ($(CROSS_COMPILE),) +-CLANG_FLAGS := --target=$(notdir $(CROSS_COMPILE:%-=%)) ++CLANG_FLAGS += --target=$(notdir $(CROSS_COMPILE:%-=%)) + GCC_TOOLCHAIN_DIR := $(dir $(shell which $(CROSS_COMPILE)elfedit)) + CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR) + GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..) +@@ -528,6 +529,7 @@ ifneq ($(GCC_TOOLCHAIN),) + CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN) + endif + CLANG_FLAGS += -no-integrated-as ++CLANG_FLAGS += -Werror=unknown-warning-option + KBUILD_CFLAGS += $(CLANG_FLAGS) + KBUILD_AFLAGS += $(CLANG_FLAGS) + export CLANG_FLAGS +@@ -636,6 +638,10 @@ RETPOLINE_CFLAGS_CLANG := -mretpoline-external-thunk + RETPOLINE_VDSO_CFLAGS_CLANG := -mretpoline + RETPOLINE_CFLAGS := $(call cc-option,$(RETPOLINE_CFLAGS_GCC),$(call cc-option,$(RETPOLINE_CFLAGS_CLANG))) + RETPOLINE_VDSO_CFLAGS := $(call cc-option,$(RETPOLINE_VDSO_CFLAGS_GCC),$(call cc-option,$(RETPOLINE_VDSO_CFLAGS_CLANG))) ++# -mindirect-branch is incompatible with -fcf-protection, so ensure the ++# latter is disabled ++RETPOLINE_CFLAGS += $(call cc-option,-fcf-protection=none,) ++RETPOLINE_VDSO_CFLAGS += $(call cc-option,-fcf-protection=none,) + export RETPOLINE_CFLAGS + export RETPOLINE_VDSO_CFLAGS + +@@ -697,8 +703,12 @@ KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member) + ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE + KBUILD_CFLAGS += -Os + else ++ifdef CONFIG_CC_OPTIMIZE_HARDER ++KBUILD_CFLAGS += -O3 ++else + KBUILD_CFLAGS += -O2 + endif ++endif + + ifdef CONFIG_CC_DISABLE_WARN_MAYBE_UNINITIALIZED + KBUILD_CFLAGS += -Wno-maybe-uninitialized +diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig +index f7b19b813a70..df503f68a2a2 100644 +--- a/arch/alpha/Kconfig ++++ b/arch/alpha/Kconfig +@@ -664,6 +664,8 @@ config HZ + default 1200 if HZ_1200 + default 1024 + ++source "kernel/Kconfig.MuQSS" ++ + config SRM_ENV + tristate "SRM environment through procfs" + depends on PROC_FS +diff --git a/arch/arc/kernel/unwind.c b/arch/arc/kernel/unwind.c +index 182ce67dfe10..c2663fce7f6c 100644 +--- a/arch/arc/kernel/unwind.c ++++ b/arch/arc/kernel/unwind.c +@@ -181,11 +181,6 @@ static void *__init unw_hdr_alloc_early(unsigned long sz) + return memblock_alloc_from(sz, sizeof(unsigned int), MAX_DMA_ADDRESS); + } + +-static void *unw_hdr_alloc(unsigned long sz) +-{ +- return kmalloc(sz, GFP_KERNEL); +-} +- + static void init_unwind_table(struct unwind_table *table, const char *name, + const void *core_start, unsigned long core_size, + const void *init_start, unsigned long init_size, +@@ -366,6 +361,10 @@ static void init_unwind_hdr(struct unwind_table *table, + } + + #ifdef CONFIG_MODULES ++static void *unw_hdr_alloc(unsigned long sz) ++{ ++ return kmalloc(sz, GFP_KERNEL); ++} + + static struct unwind_table *last_table; + +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 8869742a85df..edd126f7f26a 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -1306,6 +1306,8 @@ config SCHED_SMT + MultiThreading at a cost of slightly increased overhead in some + places. If unsure say N here. + ++source "kernel/Kconfig.MuQSS" ++ + config HAVE_ARM_SCU + bool + help +diff --git a/arch/arm/boot/dts/bcm47094-linksys-panamera.dts b/arch/arm/boot/dts/bcm47094-linksys-panamera.dts +index 5fd47eec4407..1679959a3654 100644 +--- a/arch/arm/boot/dts/bcm47094-linksys-panamera.dts ++++ b/arch/arm/boot/dts/bcm47094-linksys-panamera.dts +@@ -126,6 +126,9 @@ + }; + + mdio-bus-mux { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ + /* BIT(9) = 1 => external mdio */ + mdio_ext: mdio@200 { + reg = <0x200>; +diff --git a/arch/arm/boot/dts/gemini-dlink-dir-685.dts b/arch/arm/boot/dts/gemini-dlink-dir-685.dts +index 3613f05f8a80..bfaa2de63a10 100644 +--- a/arch/arm/boot/dts/gemini-dlink-dir-685.dts ++++ b/arch/arm/boot/dts/gemini-dlink-dir-685.dts +@@ -64,7 +64,7 @@ + gpio-sck = <&gpio1 5 GPIO_ACTIVE_HIGH>; + gpio-miso = <&gpio1 8 GPIO_ACTIVE_HIGH>; + gpio-mosi = <&gpio1 7 GPIO_ACTIVE_HIGH>; +- cs-gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>; ++ cs-gpios = <&gpio0 20 GPIO_ACTIVE_LOW>; + num-chipselects = <1>; + + panel: display@0 { +diff --git a/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi b/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi +index 9207d5d071f1..d556f7c541ce 100644 +--- a/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi ++++ b/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi +@@ -112,7 +112,7 @@ + }; + + &i2c2 { +- clock_frequency = <100000>; ++ clock-frequency = <100000>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_i2c2>; + status = "okay"; +diff --git a/arch/arm/boot/dts/imx6ul-geam.dts b/arch/arm/boot/dts/imx6ul-geam.dts +index bc77f26a2f1d..6157a058feec 100644 +--- a/arch/arm/boot/dts/imx6ul-geam.dts ++++ b/arch/arm/boot/dts/imx6ul-geam.dts +@@ -156,7 +156,7 @@ + }; + + &i2c2 { +- clock_frequency = <100000>; ++ clock-frequency = <100000>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_i2c2>; + status = "okay"; +diff --git a/arch/arm/boot/dts/imx6ul-isiot.dtsi b/arch/arm/boot/dts/imx6ul-isiot.dtsi +index 213e802bf35c..23e6e2e7ace9 100644 +--- a/arch/arm/boot/dts/imx6ul-isiot.dtsi ++++ b/arch/arm/boot/dts/imx6ul-isiot.dtsi +@@ -148,7 +148,7 @@ + }; + + &i2c2 { +- clock_frequency = <100000>; ++ clock-frequency = <100000>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_i2c2>; + status = "okay"; +diff --git a/arch/arm/boot/dts/imx6ul-pico-hobbit.dts b/arch/arm/boot/dts/imx6ul-pico-hobbit.dts +index 39eeeddac39e..09f7ffa9ad8c 100644 +--- a/arch/arm/boot/dts/imx6ul-pico-hobbit.dts ++++ b/arch/arm/boot/dts/imx6ul-pico-hobbit.dts +@@ -43,7 +43,7 @@ + }; + + &i2c2 { +- clock_frequency = <100000>; ++ clock-frequency = <100000>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_i2c2>; + status = "okay"; +diff --git a/arch/arm/boot/dts/imx6ul-pico-pi.dts b/arch/arm/boot/dts/imx6ul-pico-pi.dts +index de07357b27fc..6cd7d5877d20 100644 +--- a/arch/arm/boot/dts/imx6ul-pico-pi.dts ++++ b/arch/arm/boot/dts/imx6ul-pico-pi.dts +@@ -43,7 +43,7 @@ + }; + + &i2c2 { +- clock_frequency = <100000>; ++ clock-frequency = <100000>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_i2c2>; + status = "okay"; +@@ -58,7 +58,7 @@ + }; + + &i2c3 { +- clock_frequency = <100000>; ++ clock-frequency = <100000>; + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_i2c3>; + status = "okay"; +diff --git a/arch/arm/boot/dts/rk3288-veyron-mickey.dts b/arch/arm/boot/dts/rk3288-veyron-mickey.dts +index e852594417b5..b13f87792e9f 100644 +--- a/arch/arm/boot/dts/rk3288-veyron-mickey.dts ++++ b/arch/arm/boot/dts/rk3288-veyron-mickey.dts +@@ -128,10 +128,6 @@ + }; + }; + +-&emmc { +- /delete-property/mmc-hs200-1_8v; +-}; +- + &i2c2 { + status = "disabled"; + }; +diff --git a/arch/arm/boot/dts/rk3288-veyron-minnie.dts b/arch/arm/boot/dts/rk3288-veyron-minnie.dts +index 468a1818545d..ce57881625ec 100644 +--- a/arch/arm/boot/dts/rk3288-veyron-minnie.dts ++++ b/arch/arm/boot/dts/rk3288-veyron-minnie.dts +@@ -90,10 +90,6 @@ + pwm-off-delay-ms = <200>; + }; + +-&emmc { +- /delete-property/mmc-hs200-1_8v; +-}; +- + &gpio_keys { + pinctrl-0 = <&pwr_key_l &ap_lid_int_l &volum_down_l &volum_up_l>; + +diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi +index aa017abf4f42..f7bc886a4b51 100644 +--- a/arch/arm/boot/dts/rk3288.dtsi ++++ b/arch/arm/boot/dts/rk3288.dtsi +@@ -231,6 +231,7 @@ + , + ; + clock-frequency = <24000000>; ++ arm,no-tick-in-suspend; + }; + + timer: timer@ff810000 { +diff --git a/arch/arm/mach-davinci/sleep.S b/arch/arm/mach-davinci/sleep.S +index 05d03f09ff54..71262dcdbca3 100644 +--- a/arch/arm/mach-davinci/sleep.S ++++ b/arch/arm/mach-davinci/sleep.S +@@ -24,6 +24,7 @@ + #define DEEPSLEEP_SLEEPENABLE_BIT BIT(31) + + .text ++ .arch armv5te + /* + * Move DaVinci into deep sleep state + * +diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig +index 1c518b8ee520..21a59efd1a2c 100644 +--- a/arch/arm/mach-exynos/Kconfig ++++ b/arch/arm/mach-exynos/Kconfig +@@ -106,7 +106,7 @@ config SOC_EXYNOS5420 + bool "SAMSUNG EXYNOS5420" + default y + depends on ARCH_EXYNOS5 +- select MCPM if SMP ++ select EXYNOS_MCPM if SMP + select ARM_CCI400_PORT_CTRL + select ARM_CPU_SUSPEND + +@@ -115,6 +115,10 @@ config SOC_EXYNOS5800 + default y + depends on SOC_EXYNOS5420 + ++config EXYNOS_MCPM ++ bool ++ select MCPM ++ + config EXYNOS_CPU_SUSPEND + bool + select ARM_CPU_SUSPEND +diff --git a/arch/arm/mach-exynos/Makefile b/arch/arm/mach-exynos/Makefile +index 264dbaa89c3d..5abf3db23912 100644 +--- a/arch/arm/mach-exynos/Makefile ++++ b/arch/arm/mach-exynos/Makefile +@@ -18,5 +18,5 @@ plus_sec := $(call as-instr,.arch_extension sec,+sec) + AFLAGS_exynos-smc.o :=-Wa,-march=armv7-a$(plus_sec) + AFLAGS_sleep.o :=-Wa,-march=armv7-a$(plus_sec) + +-obj-$(CONFIG_MCPM) += mcpm-exynos.o ++obj-$(CONFIG_EXYNOS_MCPM) += mcpm-exynos.o + CFLAGS_mcpm-exynos.o += -march=armv7-a +diff --git a/arch/arm/mach-exynos/suspend.c b/arch/arm/mach-exynos/suspend.c +index be122af0de8f..8b1e6ab8504f 100644 +--- a/arch/arm/mach-exynos/suspend.c ++++ b/arch/arm/mach-exynos/suspend.c +@@ -268,7 +268,7 @@ static int exynos5420_cpu_suspend(unsigned long arg) + unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); + unsigned int cpu = MPIDR_AFFINITY_LEVEL(mpidr, 0); + +- if (IS_ENABLED(CONFIG_MCPM)) { ++ if (IS_ENABLED(CONFIG_EXYNOS_MCPM)) { + mcpm_set_entry_vector(cpu, cluster, exynos_cpu_resume); + mcpm_cpu_suspend(); + } +@@ -351,7 +351,7 @@ static void exynos5420_pm_prepare(void) + exynos_pm_enter_sleep_mode(); + + /* ensure at least INFORM0 has the resume address */ +- if (IS_ENABLED(CONFIG_MCPM)) ++ if (IS_ENABLED(CONFIG_EXYNOS_MCPM)) + pmu_raw_writel(__pa_symbol(mcpm_entry_point), S5P_INFORM0); + + tmp = pmu_raw_readl(EXYNOS_L2_OPTION(0)); +@@ -455,7 +455,7 @@ static void exynos5420_prepare_pm_resume(void) + mpidr = read_cpuid_mpidr(); + cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1); + +- if (IS_ENABLED(CONFIG_MCPM)) ++ if (IS_ENABLED(CONFIG_EXYNOS_MCPM)) + WARN_ON(mcpm_cpu_powered_up()); + + if (IS_ENABLED(CONFIG_HW_PERF_EVENTS) && cluster != 0) { +diff --git a/arch/arm/mach-rpc/dma.c b/arch/arm/mach-rpc/dma.c +index 488d5c3b37f4..799e0b016b62 100644 +--- a/arch/arm/mach-rpc/dma.c ++++ b/arch/arm/mach-rpc/dma.c +@@ -128,7 +128,7 @@ static irqreturn_t iomd_dma_handle(int irq, void *dev_id) + } while (1); + + idma->state = ~DMA_ST_AB; +- disable_irq(irq); ++ disable_irq_nosync(irq); + + return IRQ_HANDLED; + } +@@ -177,6 +177,9 @@ static void iomd_enable_dma(unsigned int chan, dma_t *dma) + DMA_FROM_DEVICE : DMA_TO_DEVICE); + } + ++ idma->dma_addr = idma->dma.sg->dma_address; ++ idma->dma_len = idma->dma.sg->length; ++ + iomd_writeb(DMA_CR_C, dma_base + CR); + idma->state = DMA_ST_AB; + } +diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig +index 697ea0510729..51983654dc4b 100644 +--- a/arch/arm64/Kconfig ++++ b/arch/arm64/Kconfig +@@ -260,7 +260,8 @@ config GENERIC_CALIBRATE_DELAY + def_bool y + + config ZONE_DMA32 +- def_bool y ++ bool "Support DMA32 zone" if EXPERT ++ default y + + config HAVE_GENERIC_GUP + def_bool y +@@ -825,6 +826,8 @@ config SCHED_SMT + MultiThreading at a cost of slightly increased overhead in some + places. If unsure say N here. + ++source "kernel/Kconfig.MuQSS" ++ + config NR_CPUS + int "Maximum number of CPUs (2-4096)" + range 2 4096 +diff --git a/arch/arm64/boot/dts/freescale/imx8mm-pinfunc.h b/arch/arm64/boot/dts/freescale/imx8mm-pinfunc.h +index e25f7fcd7997..cffa8991880d 100644 +--- a/arch/arm64/boot/dts/freescale/imx8mm-pinfunc.h ++++ b/arch/arm64/boot/dts/freescale/imx8mm-pinfunc.h +@@ -462,7 +462,7 @@ + #define MX8MM_IOMUXC_SAI3_RXFS_GPIO4_IO28 0x1CC 0x434 0x000 0x5 0x0 + #define MX8MM_IOMUXC_SAI3_RXFS_TPSMP_HTRANS0 0x1CC 0x434 0x000 0x7 0x0 + #define MX8MM_IOMUXC_SAI3_RXC_SAI3_RX_BCLK 0x1D0 0x438 0x000 0x0 0x0 +-#define MX8MM_IOMUXC_SAI3_RXC_GPT1_CAPTURE2 0x1D0 0x438 0x000 0x1 0x0 ++#define MX8MM_IOMUXC_SAI3_RXC_GPT1_CLK 0x1D0 0x438 0x000 0x1 0x0 + #define MX8MM_IOMUXC_SAI3_RXC_SAI5_RX_BCLK 0x1D0 0x438 0x4D0 0x2 0x2 + #define MX8MM_IOMUXC_SAI3_RXC_GPIO4_IO29 0x1D0 0x438 0x000 0x5 0x0 + #define MX8MM_IOMUXC_SAI3_RXC_TPSMP_HTRANS1 0x1D0 0x438 0x000 0x7 0x0 +@@ -472,7 +472,7 @@ + #define MX8MM_IOMUXC_SAI3_RXD_GPIO4_IO30 0x1D4 0x43C 0x000 0x5 0x0 + #define MX8MM_IOMUXC_SAI3_RXD_TPSMP_HDATA0 0x1D4 0x43C 0x000 0x7 0x0 + #define MX8MM_IOMUXC_SAI3_TXFS_SAI3_TX_SYNC 0x1D8 0x440 0x000 0x0 0x0 +-#define MX8MM_IOMUXC_SAI3_TXFS_GPT1_CLK 0x1D8 0x440 0x000 0x1 0x0 ++#define MX8MM_IOMUXC_SAI3_TXFS_GPT1_CAPTURE2 0x1D8 0x440 0x000 0x1 0x0 + #define MX8MM_IOMUXC_SAI3_TXFS_SAI5_RX_DATA1 0x1D8 0x440 0x4D8 0x2 0x2 + #define MX8MM_IOMUXC_SAI3_TXFS_GPIO4_IO31 0x1D8 0x440 0x000 0x5 0x0 + #define MX8MM_IOMUXC_SAI3_TXFS_TPSMP_HDATA1 0x1D8 0x440 0x000 0x7 0x0 +diff --git a/arch/arm64/boot/dts/freescale/imx8mq.dtsi b/arch/arm64/boot/dts/freescale/imx8mq.dtsi +index 6d635ba0904c..6632cbd88bed 100644 +--- a/arch/arm64/boot/dts/freescale/imx8mq.dtsi ++++ b/arch/arm64/boot/dts/freescale/imx8mq.dtsi +@@ -675,8 +675,7 @@ + + sai2: sai@308b0000 { + #sound-dai-cells = <0>; +- compatible = "fsl,imx8mq-sai", +- "fsl,imx6sx-sai"; ++ compatible = "fsl,imx8mq-sai"; + reg = <0x308b0000 0x10000>; + interrupts = ; + clocks = <&clk IMX8MQ_CLK_SAI2_IPG>, +diff --git a/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dtsi b/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dtsi +index 329f8ceeebea..205071b45a32 100644 +--- a/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dtsi ++++ b/arch/arm64/boot/dts/marvell/armada-8040-mcbin.dtsi +@@ -184,6 +184,8 @@ + num-lanes = <4>; + num-viewport = <8>; + reset-gpios = <&cp0_gpio2 20 GPIO_ACTIVE_LOW>; ++ ranges = <0x81000000 0x0 0xf9010000 0x0 0xf9010000 0x0 0x10000 ++ 0x82000000 0x0 0xc0000000 0x0 0xc0000000 0x0 0x20000000>; + status = "okay"; + }; + +diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi b/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi +index 4dcd0d36189a..f70cd83f2bed 100644 +--- a/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi ++++ b/arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi +@@ -328,7 +328,8 @@ + regulator-max-microvolt = <1320000>; + enable-gpios = <&pmic 6 GPIO_ACTIVE_HIGH>; + regulator-ramp-delay = <80>; +- regulator-enable-ramp-delay = <1000>; ++ regulator-enable-ramp-delay = <2000>; ++ regulator-settling-time-us = <160>; + }; + }; + }; +diff --git a/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts b/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts +index 5d0181908f45..f187d4f3ade3 100644 +--- a/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts ++++ b/arch/arm64/boot/dts/nvidia/tegra210-p3450-0000.dts +@@ -633,17 +633,16 @@ + }; + + vdd_gpu: regulator@6 { +- compatible = "regulator-fixed"; ++ compatible = "pwm-regulator"; + reg = <6>; +- ++ pwms = <&pwm 1 4880>; + regulator-name = "VDD_GPU"; +- regulator-min-microvolt = <5000000>; +- regulator-max-microvolt = <5000000>; +- regulator-enable-ramp-delay = <250>; +- +- gpio = <&pmic 6 GPIO_ACTIVE_HIGH>; +- enable-active-high; +- ++ regulator-min-microvolt = <710000>; ++ regulator-max-microvolt = <1320000>; ++ regulator-ramp-delay = <80>; ++ regulator-enable-ramp-delay = <2000>; ++ regulator-settling-time-us = <160>; ++ enable-gpios = <&pmic 6 GPIO_ACTIVE_HIGH>; + vin-supply = <&vdd_5v0_sys>; + }; + }; +diff --git a/arch/arm64/boot/dts/nvidia/tegra210.dtsi b/arch/arm64/boot/dts/nvidia/tegra210.dtsi +index a550c0a4d572..cd23bdbeda85 100644 +--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi ++++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi +@@ -1258,7 +1258,7 @@ + compatible = "nvidia,tegra210-agic"; + #interrupt-cells = <3>; + interrupt-controller; +- reg = <0x702f9000 0x2000>, ++ reg = <0x702f9000 0x1000>, + <0x702fa000 0x2000>; + interrupts = ; + clocks = <&tegra_car TEGRA210_CLK_APE>; +diff --git a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi +index 2c3127167e3c..d987d6741e40 100644 +--- a/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi ++++ b/arch/arm64/boot/dts/qcom/qcs404-evb.dtsi +@@ -118,7 +118,7 @@ + }; + + vreg_l3_1p05: l3 { +- regulator-min-microvolt = <1050000>; ++ regulator-min-microvolt = <1048000>; + regulator-max-microvolt = <1160000>; + }; + +diff --git a/arch/arm64/boot/dts/qcom/qcs404.dtsi b/arch/arm64/boot/dts/qcom/qcs404.dtsi +index ffedf9640af7..65a2cbeb28be 100644 +--- a/arch/arm64/boot/dts/qcom/qcs404.dtsi ++++ b/arch/arm64/boot/dts/qcom/qcs404.dtsi +@@ -383,6 +383,7 @@ + compatible = "qcom,gcc-qcs404"; + reg = <0x01800000 0x80000>; + #clock-cells = <1>; ++ #reset-cells = <1>; + + assigned-clocks = <&gcc GCC_APSS_AHB_CLK_SRC>; + assigned-clock-rates = <19200000>; +diff --git a/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi b/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi +index 04623e52ac5d..1bc1579674e5 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi +@@ -565,12 +565,11 @@ + status = "okay"; + + u2phy0_otg: otg-port { +- phy-supply = <&vcc5v0_typec0>; + status = "okay"; + }; + + u2phy0_host: host-port { +- phy-supply = <&vcc5v0_host>; ++ phy-supply = <&vcc5v0_typec0>; + status = "okay"; + }; + }; +@@ -620,7 +619,7 @@ + + &usbdrd_dwc3_0 { + status = "okay"; +- dr_mode = "otg"; ++ dr_mode = "host"; + }; + + &usbdrd3_1 { +diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi +index 196ac9b78076..89594a7276f4 100644 +--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi ++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi +@@ -1706,11 +1706,11 @@ + reg = <0x0 0xff914000 0x0 0x100>, <0x0 0xff915000 0x0 0x100>; + interrupts = ; + interrupt-names = "isp0_mmu"; +- clocks = <&cru ACLK_ISP0_NOC>, <&cru HCLK_ISP0_NOC>; ++ clocks = <&cru ACLK_ISP0_WRAPPER>, <&cru HCLK_ISP0_WRAPPER>; + clock-names = "aclk", "iface"; + #iommu-cells = <0>; ++ power-domains = <&power RK3399_PD_ISP0>; + rockchip,disable-mmu-reset; +- status = "disabled"; + }; + + isp1_mmu: iommu@ff924000 { +@@ -1718,11 +1718,11 @@ + reg = <0x0 0xff924000 0x0 0x100>, <0x0 0xff925000 0x0 0x100>; + interrupts = ; + interrupt-names = "isp1_mmu"; +- clocks = <&cru ACLK_ISP1_NOC>, <&cru HCLK_ISP1_NOC>; ++ clocks = <&cru ACLK_ISP1_WRAPPER>, <&cru HCLK_ISP1_WRAPPER>; + clock-names = "aclk", "iface"; + #iommu-cells = <0>; ++ power-domains = <&power RK3399_PD_ISP1>; + rockchip,disable-mmu-reset; +- status = "disabled"; + }; + + hdmi_sound: hdmi-sound { +diff --git a/arch/arm64/crypto/sha1-ce-glue.c b/arch/arm64/crypto/sha1-ce-glue.c +index ecb0f67e5998..bdc1b6d7aff7 100644 +--- a/arch/arm64/crypto/sha1-ce-glue.c ++++ b/arch/arm64/crypto/sha1-ce-glue.c +@@ -52,7 +52,7 @@ static int sha1_ce_finup(struct shash_desc *desc, const u8 *data, + unsigned int len, u8 *out) + { + struct sha1_ce_state *sctx = shash_desc_ctx(desc); +- bool finalize = !sctx->sst.count && !(len % SHA1_BLOCK_SIZE); ++ bool finalize = !sctx->sst.count && !(len % SHA1_BLOCK_SIZE) && len; + + if (!crypto_simd_usable()) + return crypto_sha1_finup(desc, data, len, out); +diff --git a/arch/arm64/crypto/sha2-ce-glue.c b/arch/arm64/crypto/sha2-ce-glue.c +index 955c3c2d3f5a..604a01a4ede6 100644 +--- a/arch/arm64/crypto/sha2-ce-glue.c ++++ b/arch/arm64/crypto/sha2-ce-glue.c +@@ -57,7 +57,7 @@ static int sha256_ce_finup(struct shash_desc *desc, const u8 *data, + unsigned int len, u8 *out) + { + struct sha256_ce_state *sctx = shash_desc_ctx(desc); +- bool finalize = !sctx->sst.count && !(len % SHA256_BLOCK_SIZE); ++ bool finalize = !sctx->sst.count && !(len % SHA256_BLOCK_SIZE) && len; + + if (!crypto_simd_usable()) { + if (len) +diff --git a/arch/arm64/include/asm/arch_gicv3.h b/arch/arm64/include/asm/arch_gicv3.h +index 2247908e55d6..79155a8cfe7c 100644 +--- a/arch/arm64/include/asm/arch_gicv3.h ++++ b/arch/arm64/include/asm/arch_gicv3.h +@@ -152,7 +152,9 @@ static inline bool gic_prio_masking_enabled(void) + + static inline void gic_pmr_mask_irqs(void) + { +- BUILD_BUG_ON(GICD_INT_DEF_PRI <= GIC_PRIO_IRQOFF); ++ BUILD_BUG_ON(GICD_INT_DEF_PRI < (GIC_PRIO_IRQOFF | ++ GIC_PRIO_PSR_I_SET)); ++ BUILD_BUG_ON(GICD_INT_DEF_PRI >= GIC_PRIO_IRQON); + gic_write_pmr(GIC_PRIO_IRQOFF); + } + +diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h +index 570d195a184d..e3a15c751b13 100644 +--- a/arch/arm64/include/asm/assembler.h ++++ b/arch/arm64/include/asm/assembler.h +@@ -96,7 +96,11 @@ + * RAS Error Synchronization barrier + */ + .macro esb ++#ifdef CONFIG_ARM64_RAS_EXTN + hint #16 ++#else ++ nop ++#endif + .endm + + /* +diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h +index 373799b7982f..0a61344ab243 100644 +--- a/arch/arm64/include/asm/cpufeature.h ++++ b/arch/arm64/include/asm/cpufeature.h +@@ -35,9 +35,10 @@ + */ + + enum ftr_type { +- FTR_EXACT, /* Use a predefined safe value */ +- FTR_LOWER_SAFE, /* Smaller value is safe */ +- FTR_HIGHER_SAFE,/* Bigger value is safe */ ++ FTR_EXACT, /* Use a predefined safe value */ ++ FTR_LOWER_SAFE, /* Smaller value is safe */ ++ FTR_HIGHER_SAFE, /* Bigger value is safe */ ++ FTR_HIGHER_OR_ZERO_SAFE, /* Bigger value is safe, but 0 is biggest */ + }; + + #define FTR_STRICT true /* SANITY check strict matching required */ +diff --git a/arch/arm64/include/asm/daifflags.h b/arch/arm64/include/asm/daifflags.h +index 6dd8a8723525..ae7e605085d7 100644 +--- a/arch/arm64/include/asm/daifflags.h ++++ b/arch/arm64/include/asm/daifflags.h +@@ -7,6 +7,7 @@ + + #include + ++#include + #include + + #define DAIF_PROCCTX 0 +@@ -21,6 +22,11 @@ static inline void local_daif_mask(void) + : + : + : "memory"); ++ ++ /* Don't really care for a dsb here, we don't intend to enable IRQs */ ++ if (system_uses_irq_prio_masking()) ++ gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET); ++ + trace_hardirqs_off(); + } + +@@ -32,7 +38,7 @@ static inline unsigned long local_daif_save(void) + + if (system_uses_irq_prio_masking()) { + /* If IRQs are masked with PMR, reflect it in the flags */ +- if (read_sysreg_s(SYS_ICC_PMR_EL1) <= GIC_PRIO_IRQOFF) ++ if (read_sysreg_s(SYS_ICC_PMR_EL1) != GIC_PRIO_IRQON) + flags |= PSR_I_BIT; + } + +@@ -48,36 +54,44 @@ static inline void local_daif_restore(unsigned long flags) + if (!irq_disabled) { + trace_hardirqs_on(); + +- if (system_uses_irq_prio_masking()) +- arch_local_irq_enable(); +- } else if (!(flags & PSR_A_BIT)) { +- /* +- * If interrupts are disabled but we can take +- * asynchronous errors, we can take NMIs +- */ + if (system_uses_irq_prio_masking()) { +- flags &= ~PSR_I_BIT; ++ gic_write_pmr(GIC_PRIO_IRQON); ++ dsb(sy); ++ } ++ } else if (system_uses_irq_prio_masking()) { ++ u64 pmr; ++ ++ if (!(flags & PSR_A_BIT)) { + /* +- * There has been concern that the write to daif +- * might be reordered before this write to PMR. +- * From the ARM ARM DDI 0487D.a, section D1.7.1 +- * "Accessing PSTATE fields": +- * Writes to the PSTATE fields have side-effects on +- * various aspects of the PE operation. All of these +- * side-effects are guaranteed: +- * - Not to be visible to earlier instructions in +- * the execution stream. +- * - To be visible to later instructions in the +- * execution stream +- * +- * Also, writes to PMR are self-synchronizing, so no +- * interrupts with a lower priority than PMR is signaled +- * to the PE after the write. +- * +- * So we don't need additional synchronization here. ++ * If interrupts are disabled but we can take ++ * asynchronous errors, we can take NMIs + */ +- arch_local_irq_disable(); ++ flags &= ~PSR_I_BIT; ++ pmr = GIC_PRIO_IRQOFF; ++ } else { ++ pmr = GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET; + } ++ ++ /* ++ * There has been concern that the write to daif ++ * might be reordered before this write to PMR. ++ * From the ARM ARM DDI 0487D.a, section D1.7.1 ++ * "Accessing PSTATE fields": ++ * Writes to the PSTATE fields have side-effects on ++ * various aspects of the PE operation. All of these ++ * side-effects are guaranteed: ++ * - Not to be visible to earlier instructions in ++ * the execution stream. ++ * - To be visible to later instructions in the ++ * execution stream ++ * ++ * Also, writes to PMR are self-synchronizing, so no ++ * interrupts with a lower priority than PMR is signaled ++ * to the PE after the write. ++ * ++ * So we don't need additional synchronization here. ++ */ ++ gic_write_pmr(pmr); + } + + write_sysreg(flags, daif); +diff --git a/arch/arm64/include/asm/irqflags.h b/arch/arm64/include/asm/irqflags.h +index 66853fde60f9..5b7cef8c9241 100644 +--- a/arch/arm64/include/asm/irqflags.h ++++ b/arch/arm64/include/asm/irqflags.h +@@ -56,43 +56,46 @@ static inline void arch_local_irq_disable(void) + */ + static inline unsigned long arch_local_save_flags(void) + { +- unsigned long daif_bits; + unsigned long flags; + +- daif_bits = read_sysreg(daif); +- +- /* +- * The asm is logically equivalent to: +- * +- * if (system_uses_irq_prio_masking()) +- * flags = (daif_bits & PSR_I_BIT) ? +- * GIC_PRIO_IRQOFF : +- * read_sysreg_s(SYS_ICC_PMR_EL1); +- * else +- * flags = daif_bits; +- */ + asm volatile(ALTERNATIVE( +- "mov %0, %1\n" +- "nop\n" +- "nop", +- __mrs_s("%0", SYS_ICC_PMR_EL1) +- "ands %1, %1, " __stringify(PSR_I_BIT) "\n" +- "csel %0, %0, %2, eq", +- ARM64_HAS_IRQ_PRIO_MASKING) +- : "=&r" (flags), "+r" (daif_bits) +- : "r" ((unsigned long) GIC_PRIO_IRQOFF) ++ "mrs %0, daif", ++ __mrs_s("%0", SYS_ICC_PMR_EL1), ++ ARM64_HAS_IRQ_PRIO_MASKING) ++ : "=&r" (flags) ++ : + : "memory"); + + return flags; + } + ++static inline int arch_irqs_disabled_flags(unsigned long flags) ++{ ++ int res; ++ ++ asm volatile(ALTERNATIVE( ++ "and %w0, %w1, #" __stringify(PSR_I_BIT), ++ "eor %w0, %w1, #" __stringify(GIC_PRIO_IRQON), ++ ARM64_HAS_IRQ_PRIO_MASKING) ++ : "=&r" (res) ++ : "r" ((int) flags) ++ : "memory"); ++ ++ return res; ++} ++ + static inline unsigned long arch_local_irq_save(void) + { + unsigned long flags; + + flags = arch_local_save_flags(); + +- arch_local_irq_disable(); ++ /* ++ * There are too many states with IRQs disabled, just keep the current ++ * state if interrupts are already disabled/masked. ++ */ ++ if (!arch_irqs_disabled_flags(flags)) ++ arch_local_irq_disable(); + + return flags; + } +@@ -113,21 +116,5 @@ static inline void arch_local_irq_restore(unsigned long flags) + : "memory"); + } + +-static inline int arch_irqs_disabled_flags(unsigned long flags) +-{ +- int res; +- +- asm volatile(ALTERNATIVE( +- "and %w0, %w1, #" __stringify(PSR_I_BIT) "\n" +- "nop", +- "cmp %w1, #" __stringify(GIC_PRIO_IRQOFF) "\n" +- "cset %w0, ls", +- ARM64_HAS_IRQ_PRIO_MASKING) +- : "=&r" (res) +- : "r" ((int) flags) +- : "memory"); +- +- return res; +-} + #endif + #endif +diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h +index c328191aa202..9f19c354b165 100644 +--- a/arch/arm64/include/asm/kvm_host.h ++++ b/arch/arm64/include/asm/kvm_host.h +@@ -597,11 +597,12 @@ static inline void kvm_arm_vhe_guest_enter(void) + * will not signal the CPU of interrupts of lower priority, and the + * only way to get out will be via guest exceptions. + * Naturally, we want to avoid this. ++ * ++ * local_daif_mask() already sets GIC_PRIO_PSR_I_SET, we just need a ++ * dsb to ensure the redistributor is forwards EL2 IRQs to the CPU. + */ +- if (system_uses_irq_prio_masking()) { +- gic_write_pmr(GIC_PRIO_IRQON); ++ if (system_uses_irq_prio_masking()) + dsb(sy); +- } + } + + static inline void kvm_arm_vhe_guest_exit(void) +diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h +index fd5b1a4efc70..844e2964b0f5 100644 +--- a/arch/arm64/include/asm/processor.h ++++ b/arch/arm64/include/asm/processor.h +@@ -193,6 +193,16 @@ static inline void start_thread_common(struct pt_regs *regs, unsigned long pc) + regs->pmr_save = GIC_PRIO_IRQON; + } + ++static inline void set_ssbs_bit(struct pt_regs *regs) ++{ ++ regs->pstate |= PSR_SSBS_BIT; ++} ++ ++static inline void set_compat_ssbs_bit(struct pt_regs *regs) ++{ ++ regs->pstate |= PSR_AA32_SSBS_BIT; ++} ++ + static inline void start_thread(struct pt_regs *regs, unsigned long pc, + unsigned long sp) + { +@@ -200,7 +210,7 @@ static inline void start_thread(struct pt_regs *regs, unsigned long pc, + regs->pstate = PSR_MODE_EL0t; + + if (arm64_get_ssbd_state() != ARM64_SSBD_FORCE_ENABLE) +- regs->pstate |= PSR_SSBS_BIT; ++ set_ssbs_bit(regs); + + regs->sp = sp; + } +@@ -219,7 +229,7 @@ static inline void compat_start_thread(struct pt_regs *regs, unsigned long pc, + #endif + + if (arm64_get_ssbd_state() != ARM64_SSBD_FORCE_ENABLE) +- regs->pstate |= PSR_AA32_SSBS_BIT; ++ set_compat_ssbs_bit(regs); + + regs->compat_sp = sp; + } +diff --git a/arch/arm64/include/asm/ptrace.h b/arch/arm64/include/asm/ptrace.h +index dad858b6adc6..81693244f58d 100644 +--- a/arch/arm64/include/asm/ptrace.h ++++ b/arch/arm64/include/asm/ptrace.h +@@ -24,9 +24,15 @@ + * means masking more IRQs (or at least that the same IRQs remain masked). + * + * To mask interrupts, we clear the most significant bit of PMR. ++ * ++ * Some code sections either automatically switch back to PSR.I or explicitly ++ * require to not use priority masking. If bit GIC_PRIO_PSR_I_SET is included ++ * in the the priority mask, it indicates that PSR.I should be set and ++ * interrupt disabling temporarily does not rely on IRQ priorities. + */ +-#define GIC_PRIO_IRQON 0xf0 +-#define GIC_PRIO_IRQOFF (GIC_PRIO_IRQON & ~0x80) ++#define GIC_PRIO_IRQON 0xc0 ++#define GIC_PRIO_IRQOFF (GIC_PRIO_IRQON & ~0x80) ++#define GIC_PRIO_PSR_I_SET (1 << 4) + + /* Additional SPSR bits not exposed in the UABI */ + #define PSR_IL_BIT (1 << 20) +diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c +index 2804330c95dc..3a58e9db5cfe 100644 +--- a/arch/arm64/kernel/acpi.c ++++ b/arch/arm64/kernel/acpi.c +@@ -152,10 +152,14 @@ static int __init acpi_fadt_sanity_check(void) + */ + if (table->revision < 5 || + (table->revision == 5 && fadt->minor_revision < 1)) { +- pr_err("Unsupported FADT revision %d.%d, should be 5.1+\n", ++ pr_err(FW_BUG "Unsupported FADT revision %d.%d, should be 5.1+\n", + table->revision, fadt->minor_revision); +- ret = -EINVAL; +- goto out; ++ ++ if (!fadt->arm_boot_flags) { ++ ret = -EINVAL; ++ goto out; ++ } ++ pr_err("FADT has ARM boot flags set, assuming 5.1\n"); + } + + if (!(fadt->flags & ACPI_FADT_HW_REDUCED)) { +diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c +index aabdabf52fdb..ae63eedea1c1 100644 +--- a/arch/arm64/kernel/cpufeature.c ++++ b/arch/arm64/kernel/cpufeature.c +@@ -225,8 +225,8 @@ static const struct arm64_ftr_bits ftr_ctr[] = { + ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_EXACT, 31, 1, 1), /* RES1 */ + ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, CTR_DIC_SHIFT, 1, 1), + ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, CTR_IDC_SHIFT, 1, 1), +- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, CTR_CWG_SHIFT, 4, 0), +- ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_SAFE, CTR_ERG_SHIFT, 4, 0), ++ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_OR_ZERO_SAFE, CTR_CWG_SHIFT, 4, 0), ++ ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_HIGHER_OR_ZERO_SAFE, CTR_ERG_SHIFT, 4, 0), + ARM64_FTR_BITS(FTR_VISIBLE, FTR_STRICT, FTR_LOWER_SAFE, CTR_DMINLINE_SHIFT, 4, 1), + /* + * Linux can handle differing I-cache policies. Userspace JITs will +@@ -468,6 +468,10 @@ static s64 arm64_ftr_safe_value(const struct arm64_ftr_bits *ftrp, s64 new, + case FTR_LOWER_SAFE: + ret = new < cur ? new : cur; + break; ++ case FTR_HIGHER_OR_ZERO_SAFE: ++ if (!cur || !new) ++ break; ++ /* Fallthrough */ + case FTR_HIGHER_SAFE: + ret = new > cur ? new : cur; + break; +diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S +index 2df8d0a1d980..320a30dbe35e 100644 +--- a/arch/arm64/kernel/entry.S ++++ b/arch/arm64/kernel/entry.S +@@ -247,6 +247,7 @@ alternative_else_nop_endif + /* + * Registers that may be useful after this macro is invoked: + * ++ * x20 - ICC_PMR_EL1 + * x21 - aborted SP + * x22 - aborted PC + * x23 - aborted PSTATE +@@ -424,6 +425,38 @@ tsk .req x28 // current thread_info + irq_stack_exit + .endm + ++#ifdef CONFIG_ARM64_PSEUDO_NMI ++ /* ++ * Set res to 0 if irqs were unmasked in interrupted context. ++ * Otherwise set res to non-0 value. ++ */ ++ .macro test_irqs_unmasked res:req, pmr:req ++alternative_if ARM64_HAS_IRQ_PRIO_MASKING ++ sub \res, \pmr, #GIC_PRIO_IRQON ++alternative_else ++ mov \res, xzr ++alternative_endif ++ .endm ++#endif ++ ++ .macro gic_prio_kentry_setup, tmp:req ++#ifdef CONFIG_ARM64_PSEUDO_NMI ++ alternative_if ARM64_HAS_IRQ_PRIO_MASKING ++ mov \tmp, #(GIC_PRIO_PSR_I_SET | GIC_PRIO_IRQON) ++ msr_s SYS_ICC_PMR_EL1, \tmp ++ alternative_else_nop_endif ++#endif ++ .endm ++ ++ .macro gic_prio_irq_setup, pmr:req, tmp:req ++#ifdef CONFIG_ARM64_PSEUDO_NMI ++ alternative_if ARM64_HAS_IRQ_PRIO_MASKING ++ orr \tmp, \pmr, #GIC_PRIO_PSR_I_SET ++ msr_s SYS_ICC_PMR_EL1, \tmp ++ alternative_else_nop_endif ++#endif ++ .endm ++ + .text + + /* +@@ -553,10 +586,8 @@ el1_sync: + b.eq el1_ia + cmp x24, #ESR_ELx_EC_SYS64 // configurable trap + b.eq el1_undef +- cmp x24, #ESR_ELx_EC_SP_ALIGN // stack alignment exception +- b.eq el1_sp_pc + cmp x24, #ESR_ELx_EC_PC_ALIGN // pc alignment exception +- b.eq el1_sp_pc ++ b.eq el1_pc + cmp x24, #ESR_ELx_EC_UNKNOWN // unknown exception in EL1 + b.eq el1_undef + cmp x24, #ESR_ELx_EC_BREAKPT_CUR // debug exception in EL1 +@@ -578,9 +609,11 @@ el1_da: + bl do_mem_abort + + kernel_exit 1 +-el1_sp_pc: ++el1_pc: + /* +- * Stack or PC alignment exception handling ++ * PC alignment exception handling. We don't handle SP alignment faults, ++ * since we will have hit a recursive exception when trying to push the ++ * initial pt_regs. + */ + mrs x0, far_el1 + inherit_daif pstate=x23, tmp=x2 +@@ -602,6 +635,7 @@ el1_dbg: + cmp x24, #ESR_ELx_EC_BRK64 // if BRK64 + cinc x24, x24, eq // set bit '0' + tbz x24, #0, el1_inv // EL1 only ++ gic_prio_kentry_setup tmp=x3 + mrs x0, far_el1 + mov x2, sp // struct pt_regs + bl do_debug_exception +@@ -619,20 +653,18 @@ ENDPROC(el1_sync) + .align 6 + el1_irq: + kernel_entry 1 ++ gic_prio_irq_setup pmr=x20, tmp=x1 + enable_da_f +-#ifdef CONFIG_TRACE_IRQFLAGS ++ + #ifdef CONFIG_ARM64_PSEUDO_NMI +-alternative_if ARM64_HAS_IRQ_PRIO_MASKING +- ldr x20, [sp, #S_PMR_SAVE] +-alternative_else +- mov x20, #GIC_PRIO_IRQON +-alternative_endif +- cmp x20, #GIC_PRIO_IRQOFF +- /* Irqs were disabled, don't trace */ +- b.ls 1f ++ test_irqs_unmasked res=x0, pmr=x20 ++ cbz x0, 1f ++ bl asm_nmi_enter ++1: + #endif ++ ++#ifdef CONFIG_TRACE_IRQFLAGS + bl trace_hardirqs_off +-1: + #endif + + irq_handler +@@ -651,14 +683,23 @@ alternative_else_nop_endif + bl preempt_schedule_irq // irq en/disable is done inside + 1: + #endif +-#ifdef CONFIG_TRACE_IRQFLAGS ++ + #ifdef CONFIG_ARM64_PSEUDO_NMI + /* +- * if IRQs were disabled when we received the interrupt, we have an NMI +- * and we are not re-enabling interrupt upon eret. Skip tracing. ++ * When using IRQ priority masking, we can get spurious interrupts while ++ * PMR is set to GIC_PRIO_IRQOFF. An NMI might also have occurred in a ++ * section with interrupts disabled. Skip tracing in those cases. + */ +- cmp x20, #GIC_PRIO_IRQOFF +- b.ls 1f ++ test_irqs_unmasked res=x0, pmr=x20 ++ cbz x0, 1f ++ bl asm_nmi_exit ++1: ++#endif ++ ++#ifdef CONFIG_TRACE_IRQFLAGS ++#ifdef CONFIG_ARM64_PSEUDO_NMI ++ test_irqs_unmasked res=x0, pmr=x20 ++ cbnz x0, 1f + #endif + bl trace_hardirqs_on + 1: +@@ -691,9 +732,9 @@ el0_sync: + ccmp x24, #ESR_ELx_EC_WFx, #4, ne + b.eq el0_sys + cmp x24, #ESR_ELx_EC_SP_ALIGN // stack alignment exception +- b.eq el0_sp_pc ++ b.eq el0_sp + cmp x24, #ESR_ELx_EC_PC_ALIGN // pc alignment exception +- b.eq el0_sp_pc ++ b.eq el0_pc + cmp x24, #ESR_ELx_EC_UNKNOWN // unknown exception in EL0 + b.eq el0_undef + cmp x24, #ESR_ELx_EC_BREAKPT_LOW // debug exception in EL0 +@@ -717,7 +758,7 @@ el0_sync_compat: + cmp x24, #ESR_ELx_EC_FP_EXC32 // FP/ASIMD exception + b.eq el0_fpsimd_exc + cmp x24, #ESR_ELx_EC_PC_ALIGN // pc alignment exception +- b.eq el0_sp_pc ++ b.eq el0_pc + cmp x24, #ESR_ELx_EC_UNKNOWN // unknown exception in EL0 + b.eq el0_undef + cmp x24, #ESR_ELx_EC_CP15_32 // CP15 MRC/MCR trap +@@ -776,6 +817,7 @@ el0_ia: + * Instruction abort handling + */ + mrs x26, far_el1 ++ gic_prio_kentry_setup tmp=x0 + enable_da_f + #ifdef CONFIG_TRACE_IRQFLAGS + bl trace_hardirqs_off +@@ -816,11 +858,16 @@ el0_fpsimd_exc: + mov x1, sp + bl do_fpsimd_exc + b ret_to_user ++el0_sp: ++ ldr x26, [sp, #S_SP] ++ b el0_sp_pc ++el0_pc: ++ mrs x26, far_el1 + el0_sp_pc: + /* + * Stack or PC alignment exception handling + */ +- mrs x26, far_el1 ++ gic_prio_kentry_setup tmp=x0 + enable_da_f + #ifdef CONFIG_TRACE_IRQFLAGS + bl trace_hardirqs_off +@@ -855,11 +902,12 @@ el0_dbg: + * Debug exception handling + */ + tbnz x24, #0, el0_inv // EL0 only ++ gic_prio_kentry_setup tmp=x3 + mrs x0, far_el1 + mov x1, x25 + mov x2, sp + bl do_debug_exception +- enable_daif ++ enable_da_f + ct_user_exit + b ret_to_user + el0_inv: +@@ -876,7 +924,9 @@ ENDPROC(el0_sync) + el0_irq: + kernel_entry 0 + el0_irq_naked: ++ gic_prio_irq_setup pmr=x20, tmp=x0 + enable_da_f ++ + #ifdef CONFIG_TRACE_IRQFLAGS + bl trace_hardirqs_off + #endif +@@ -898,6 +948,7 @@ ENDPROC(el0_irq) + el1_error: + kernel_entry 1 + mrs x1, esr_el1 ++ gic_prio_kentry_setup tmp=x2 + enable_dbg + mov x0, sp + bl do_serror +@@ -908,10 +959,11 @@ el0_error: + kernel_entry 0 + el0_error_naked: + mrs x1, esr_el1 ++ gic_prio_kentry_setup tmp=x2 + enable_dbg + mov x0, sp + bl do_serror +- enable_daif ++ enable_da_f + ct_user_exit + b ret_to_user + ENDPROC(el0_error) +@@ -932,6 +984,7 @@ work_pending: + */ + ret_to_user: + disable_daif ++ gic_prio_kentry_setup tmp=x3 + ldr x1, [tsk, #TSK_TI_FLAGS] + and x2, x1, #_TIF_WORK_MASK + cbnz x2, work_pending +@@ -948,6 +1001,7 @@ ENDPROC(ret_to_user) + */ + .align 6 + el0_svc: ++ gic_prio_kentry_setup tmp=x1 + mov x0, sp + bl el0_svc_handler + b ret_to_user +diff --git a/arch/arm64/kernel/hw_breakpoint.c b/arch/arm64/kernel/hw_breakpoint.c +index dceb84520948..67b3bae50b92 100644 +--- a/arch/arm64/kernel/hw_breakpoint.c ++++ b/arch/arm64/kernel/hw_breakpoint.c +@@ -536,13 +536,14 @@ int hw_breakpoint_arch_parse(struct perf_event *bp, + /* Aligned */ + break; + case 1: +- /* Allow single byte watchpoint. */ +- if (hw->ctrl.len == ARM_BREAKPOINT_LEN_1) +- break; + case 2: + /* Allow halfword watchpoints and breakpoints. */ + if (hw->ctrl.len == ARM_BREAKPOINT_LEN_2) + break; ++ case 3: ++ /* Allow single byte watchpoint. */ ++ if (hw->ctrl.len == ARM_BREAKPOINT_LEN_1) ++ break; + default: + return -EINVAL; + } +diff --git a/arch/arm64/kernel/irq.c b/arch/arm64/kernel/irq.c +index c70034fbd4ce..4a8506c3869b 100644 +--- a/arch/arm64/kernel/irq.c ++++ b/arch/arm64/kernel/irq.c +@@ -16,8 +16,10 @@ + #include + #include + #include ++#include + #include + #include ++#include + #include + + unsigned long irq_err_count; +@@ -65,3 +67,18 @@ void __init init_IRQ(void) + if (!handle_arch_irq) + panic("No interrupt controller found."); + } ++ ++/* ++ * Stubs to make nmi_enter/exit() code callable from ASM ++ */ ++asmlinkage void notrace asm_nmi_enter(void) ++{ ++ nmi_enter(); ++} ++NOKPROBE_SYMBOL(asm_nmi_enter); ++ ++asmlinkage void notrace asm_nmi_exit(void) ++{ ++ nmi_exit(); ++} ++NOKPROBE_SYMBOL(asm_nmi_exit); +diff --git a/arch/arm64/kernel/process.c b/arch/arm64/kernel/process.c +index 9856395ccdb7..b0c859ca6320 100644 +--- a/arch/arm64/kernel/process.c ++++ b/arch/arm64/kernel/process.c +@@ -83,7 +83,7 @@ static void __cpu_do_idle_irqprio(void) + * be raised. + */ + pmr = gic_read_pmr(); +- gic_write_pmr(GIC_PRIO_IRQON); ++ gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET); + + __cpu_do_idle(); + +@@ -398,7 +398,7 @@ int copy_thread(unsigned long clone_flags, unsigned long stack_start, + childregs->pstate |= PSR_UAO_BIT; + + if (arm64_get_ssbd_state() == ARM64_SSBD_FORCE_DISABLE) +- childregs->pstate |= PSR_SSBS_BIT; ++ set_ssbs_bit(childregs); + + if (system_uses_irq_prio_masking()) + childregs->pmr_save = GIC_PRIO_IRQON; +@@ -442,6 +442,32 @@ void uao_thread_switch(struct task_struct *next) + } + } + ++/* ++ * Force SSBS state on context-switch, since it may be lost after migrating ++ * from a CPU which treats the bit as RES0 in a heterogeneous system. ++ */ ++static void ssbs_thread_switch(struct task_struct *next) ++{ ++ struct pt_regs *regs = task_pt_regs(next); ++ ++ /* ++ * Nothing to do for kernel threads, but 'regs' may be junk ++ * (e.g. idle task) so check the flags and bail early. ++ */ ++ if (unlikely(next->flags & PF_KTHREAD)) ++ return; ++ ++ /* If the mitigation is enabled, then we leave SSBS clear. */ ++ if ((arm64_get_ssbd_state() == ARM64_SSBD_FORCE_ENABLE) || ++ test_tsk_thread_flag(next, TIF_SSBD)) ++ return; ++ ++ if (compat_user_mode(regs)) ++ set_compat_ssbs_bit(regs); ++ else if (user_mode(regs)) ++ set_ssbs_bit(regs); ++} ++ + /* + * We store our current task in sp_el0, which is clobbered by userspace. Keep a + * shadow copy so that we can restore this upon entry from userspace. +@@ -471,6 +497,7 @@ __notrace_funcgraph struct task_struct *__switch_to(struct task_struct *prev, + entry_task_switch(next); + uao_thread_switch(next); + ptrauth_thread_switch(next); ++ ssbs_thread_switch(next); + + /* + * Complete any pending TLB or cache maintenance on this CPU in case +diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c +index 6dcf9607d770..a1aed6a1b8da 100644 +--- a/arch/arm64/kernel/smp.c ++++ b/arch/arm64/kernel/smp.c +@@ -181,11 +181,13 @@ static void init_gic_priority_masking(void) + + WARN_ON(!(cpuflags & PSR_I_BIT)); + +- gic_write_pmr(GIC_PRIO_IRQOFF); +- + /* We can only unmask PSR.I if we can take aborts */ +- if (!(cpuflags & PSR_A_BIT)) ++ if (!(cpuflags & PSR_A_BIT)) { ++ gic_write_pmr(GIC_PRIO_IRQOFF); + write_sysreg(cpuflags & ~PSR_I_BIT, daif); ++ } else { ++ gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET); ++ } + } + + /* +diff --git a/arch/arm64/kvm/hyp/switch.c b/arch/arm64/kvm/hyp/switch.c +index b0041812bca9..58f281b6ca4a 100644 +--- a/arch/arm64/kvm/hyp/switch.c ++++ b/arch/arm64/kvm/hyp/switch.c +@@ -604,7 +604,7 @@ int __hyp_text __kvm_vcpu_run_nvhe(struct kvm_vcpu *vcpu) + * Naturally, we want to avoid this. + */ + if (system_uses_irq_prio_masking()) { +- gic_write_pmr(GIC_PRIO_IRQON); ++ gic_write_pmr(GIC_PRIO_IRQON | GIC_PRIO_PSR_I_SET); + dsb(sy); + } + +diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c +index 749c9b269f08..f3c795278def 100644 +--- a/arch/arm64/mm/init.c ++++ b/arch/arm64/mm/init.c +@@ -180,8 +180,9 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max) + { + unsigned long max_zone_pfns[MAX_NR_ZONES] = {0}; + +- if (IS_ENABLED(CONFIG_ZONE_DMA32)) +- max_zone_pfns[ZONE_DMA32] = PFN_DOWN(max_zone_dma_phys()); ++#ifdef CONFIG_ZONE_DMA32 ++ max_zone_pfns[ZONE_DMA32] = PFN_DOWN(max_zone_dma_phys()); ++#endif + max_zone_pfns[ZONE_NORMAL] = max; + + free_area_init_nodes(max_zone_pfns); +diff --git a/arch/mips/jz4740/board-qi_lb60.c b/arch/mips/jz4740/board-qi_lb60.c +index 071e9d94eea7..daed44ee116d 100644 +--- a/arch/mips/jz4740/board-qi_lb60.c ++++ b/arch/mips/jz4740/board-qi_lb60.c +@@ -466,27 +466,27 @@ static unsigned long pin_cfg_bias_disable[] = { + static struct pinctrl_map pin_map[] __initdata = { + /* NAND pin configuration */ + PIN_MAP_MUX_GROUP_DEFAULT("jz4740-nand", +- "10010000.jz4740-pinctrl", "nand", "nand-cs1"), ++ "10010000.pin-controller", "nand-cs1", "nand"), + + /* fbdev pin configuration */ + PIN_MAP_MUX_GROUP("jz4740-fb", PINCTRL_STATE_DEFAULT, +- "10010000.jz4740-pinctrl", "lcd", "lcd-8bit"), ++ "10010000.pin-controller", "lcd-8bit", "lcd"), + PIN_MAP_MUX_GROUP("jz4740-fb", PINCTRL_STATE_SLEEP, +- "10010000.jz4740-pinctrl", "lcd", "lcd-no-pins"), ++ "10010000.pin-controller", "lcd-no-pins", "lcd"), + + /* MMC pin configuration */ + PIN_MAP_MUX_GROUP_DEFAULT("jz4740-mmc.0", +- "10010000.jz4740-pinctrl", "mmc", "mmc-1bit"), ++ "10010000.pin-controller", "mmc-1bit", "mmc"), + PIN_MAP_MUX_GROUP_DEFAULT("jz4740-mmc.0", +- "10010000.jz4740-pinctrl", "mmc", "mmc-4bit"), ++ "10010000.pin-controller", "mmc-4bit", "mmc"), + PIN_MAP_CONFIGS_PIN_DEFAULT("jz4740-mmc.0", +- "10010000.jz4740-pinctrl", "PD0", pin_cfg_bias_disable), ++ "10010000.pin-controller", "PD0", pin_cfg_bias_disable), + PIN_MAP_CONFIGS_PIN_DEFAULT("jz4740-mmc.0", +- "10010000.jz4740-pinctrl", "PD2", pin_cfg_bias_disable), ++ "10010000.pin-controller", "PD2", pin_cfg_bias_disable), + + /* PWM pin configuration */ + PIN_MAP_MUX_GROUP_DEFAULT("jz4740-pwm", +- "10010000.jz4740-pinctrl", "pwm4", "pwm4"), ++ "10010000.pin-controller", "pwm4", "pwm4"), + }; + + +diff --git a/arch/mips/lantiq/irq.c b/arch/mips/lantiq/irq.c +index cfd87e662fcf..9c95097557c7 100644 +--- a/arch/mips/lantiq/irq.c ++++ b/arch/mips/lantiq/irq.c +@@ -154,8 +154,9 @@ static int ltq_eiu_settype(struct irq_data *d, unsigned int type) + if (edge) + irq_set_handler(d->hwirq, handle_edge_irq); + +- ltq_eiu_w32(ltq_eiu_r32(LTQ_EIU_EXIN_C) | +- (val << (i * 4)), LTQ_EIU_EXIN_C); ++ ltq_eiu_w32((ltq_eiu_r32(LTQ_EIU_EXIN_C) & ++ (~(7 << (i * 4)))) | (val << (i * 4)), ++ LTQ_EIU_EXIN_C); + } + } + +diff --git a/arch/nds32/include/asm/syscall.h b/arch/nds32/include/asm/syscall.h +index 899b2fb4b52f..7b5180d78e20 100644 +--- a/arch/nds32/include/asm/syscall.h ++++ b/arch/nds32/include/asm/syscall.h +@@ -26,7 +26,8 @@ struct pt_regs; + * + * It's only valid to call this when @task is known to be blocked. + */ +-int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) ++static inline int ++syscall_get_nr(struct task_struct *task, struct pt_regs *regs) + { + return regs->syscallno; + } +@@ -47,7 +48,8 @@ int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) + * system call instruction. This may not be the same as what the + * register state looked like at system call entry tracing. + */ +-void syscall_rollback(struct task_struct *task, struct pt_regs *regs) ++static inline void ++syscall_rollback(struct task_struct *task, struct pt_regs *regs) + { + regs->uregs[0] = regs->orig_r0; + } +@@ -62,7 +64,8 @@ void syscall_rollback(struct task_struct *task, struct pt_regs *regs) + * It's only valid to call this when @task is stopped for tracing on exit + * from a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. + */ +-long syscall_get_error(struct task_struct *task, struct pt_regs *regs) ++static inline long ++syscall_get_error(struct task_struct *task, struct pt_regs *regs) + { + unsigned long error = regs->uregs[0]; + return IS_ERR_VALUE(error) ? error : 0; +@@ -79,7 +82,8 @@ long syscall_get_error(struct task_struct *task, struct pt_regs *regs) + * It's only valid to call this when @task is stopped for tracing on exit + * from a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. + */ +-long syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) ++static inline long ++syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) + { + return regs->uregs[0]; + } +@@ -99,8 +103,9 @@ long syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) + * It's only valid to call this when @task is stopped for tracing on exit + * from a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. + */ +-void syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, +- int error, long val) ++static inline void ++syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, ++ int error, long val) + { + regs->uregs[0] = (long)error ? error : val; + } +@@ -118,8 +123,9 @@ void syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, + * entry to a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. + */ + #define SYSCALL_MAX_ARGS 6 +-void syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, +- unsigned long *args) ++static inline void ++syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, ++ unsigned long *args) + { + args[0] = regs->orig_r0; + args++; +@@ -138,8 +144,9 @@ void syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, + * It's only valid to call this when @task is stopped for tracing on + * entry to a system call, due to %TIF_SYSCALL_TRACE or %TIF_SYSCALL_AUDIT. + */ +-void syscall_set_arguments(struct task_struct *task, struct pt_regs *regs, +- const unsigned long *args) ++static inline void ++syscall_set_arguments(struct task_struct *task, struct pt_regs *regs, ++ const unsigned long *args) + { + regs->orig_r0 = args[0]; + args++; +diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile +index c19af26febe6..303ac6c4be64 100644 +--- a/arch/parisc/Makefile ++++ b/arch/parisc/Makefile +@@ -164,5 +164,8 @@ define archhelp + @echo ' zinstall - Install compressed vmlinuz kernel' + endef + ++archclean: ++ $(Q)$(MAKE) $(clean)=$(boot) ++ + archheaders: + $(Q)$(MAKE) $(build)=arch/parisc/kernel/syscalls all +diff --git a/arch/parisc/boot/compressed/Makefile b/arch/parisc/boot/compressed/Makefile +index 2da8624e5cf6..1e5879c6a752 100644 +--- a/arch/parisc/boot/compressed/Makefile ++++ b/arch/parisc/boot/compressed/Makefile +@@ -12,6 +12,7 @@ UBSAN_SANITIZE := n + targets := vmlinux.lds vmlinux vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 + targets += vmlinux.bin.xz vmlinux.bin.lzma vmlinux.bin.lzo vmlinux.bin.lz4 + targets += misc.o piggy.o sizes.h head.o real2.o firmware.o ++targets += real2.S firmware.c + + KBUILD_CFLAGS := -D__KERNEL__ -O2 -DBOOTLOADER + KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING +@@ -55,7 +56,8 @@ $(obj)/misc.o: $(obj)/sizes.h + CPPFLAGS_vmlinux.lds += -I$(objtree)/$(obj) -DBOOTLOADER + $(obj)/vmlinux.lds: $(obj)/sizes.h + +-$(obj)/vmlinux.bin: vmlinux ++OBJCOPYFLAGS_vmlinux.bin := -R .comment -R .note -S ++$(obj)/vmlinux.bin: vmlinux FORCE + $(call if_changed,objcopy) + + vmlinux.bin.all-y := $(obj)/vmlinux.bin +diff --git a/arch/parisc/boot/compressed/vmlinux.lds.S b/arch/parisc/boot/compressed/vmlinux.lds.S +index bfd7872739a3..2ac3a643f2eb 100644 +--- a/arch/parisc/boot/compressed/vmlinux.lds.S ++++ b/arch/parisc/boot/compressed/vmlinux.lds.S +@@ -48,8 +48,8 @@ SECTIONS + *(.rodata.compressed) + } + +- /* bootloader code and data starts behind area of extracted kernel */ +- . = (SZ_end - SZparisc_kernel_start + KERNEL_BINARY_TEXT_START); ++ /* bootloader code and data starts at least behind area of extracted kernel */ ++ . = MAX(ABSOLUTE(.), (SZ_end - SZparisc_kernel_start + KERNEL_BINARY_TEXT_START)); + + /* align on next page boundary */ + . = ALIGN(4096); +diff --git a/arch/parisc/kernel/kprobes.c b/arch/parisc/kernel/kprobes.c +index d58960b33bda..5d7f2692ac5a 100644 +--- a/arch/parisc/kernel/kprobes.c ++++ b/arch/parisc/kernel/kprobes.c +@@ -133,6 +133,9 @@ int __kprobes parisc_kprobe_ss_handler(struct pt_regs *regs) + struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); + struct kprobe *p = kprobe_running(); + ++ if (!p) ++ return 0; ++ + if (regs->iaoq[0] != (unsigned long)p->ainsn.insn+4) + return 0; + +diff --git a/arch/parisc/kernel/ptrace.c b/arch/parisc/kernel/ptrace.c +index a3d2fb4e6dd2..94106ec64fec 100644 +--- a/arch/parisc/kernel/ptrace.c ++++ b/arch/parisc/kernel/ptrace.c +@@ -167,6 +167,9 @@ long arch_ptrace(struct task_struct *child, long request, + if ((addr & (sizeof(unsigned long)-1)) || + addr >= sizeof(struct pt_regs)) + break; ++ if (addr == PT_IAOQ0 || addr == PT_IAOQ1) { ++ data |= 3; /* ensure userspace privilege */ ++ } + if ((addr >= PT_GR1 && addr <= PT_GR31) || + addr == PT_IAOQ0 || addr == PT_IAOQ1 || + (addr >= PT_FR0 && addr <= PT_FR31 + 4) || +@@ -228,16 +231,18 @@ long arch_ptrace(struct task_struct *child, long request, + + static compat_ulong_t translate_usr_offset(compat_ulong_t offset) + { +- if (offset < 0) +- return sizeof(struct pt_regs); +- else if (offset <= 32*4) /* gr[0..31] */ +- return offset * 2 + 4; +- else if (offset <= 32*4+32*8) /* gr[0..31] + fr[0..31] */ +- return offset + 32*4; +- else if (offset < sizeof(struct pt_regs)/2 + 32*4) +- return offset * 2 + 4 - 32*8; ++ compat_ulong_t pos; ++ ++ if (offset < 32*4) /* gr[0..31] */ ++ pos = offset * 2 + 4; ++ else if (offset < 32*4+32*8) /* fr[0] ... fr[31] */ ++ pos = (offset - 32*4) + PT_FR0; ++ else if (offset < sizeof(struct pt_regs)/2 + 32*4) /* sr[0] ... ipsw */ ++ pos = (offset - 32*4 - 32*8) * 2 + PT_SR0 + 4; + else +- return sizeof(struct pt_regs); ++ pos = sizeof(struct pt_regs); ++ ++ return pos; + } + + long compat_arch_ptrace(struct task_struct *child, compat_long_t request, +@@ -281,9 +286,12 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request, + addr = translate_usr_offset(addr); + if (addr >= sizeof(struct pt_regs)) + break; ++ if (addr == PT_IAOQ0+4 || addr == PT_IAOQ1+4) { ++ data |= 3; /* ensure userspace privilege */ ++ } + if (addr >= PT_FR0 && addr <= PT_FR31 + 4) { + /* Special case, fp regs are 64 bits anyway */ +- *(__u64 *) ((char *) task_regs(child) + addr) = data; ++ *(__u32 *) ((char *) task_regs(child) + addr) = data; + ret = 0; + } + else if ((addr >= PT_GR1+4 && addr <= PT_GR31+4) || +@@ -496,7 +504,8 @@ static void set_reg(struct pt_regs *regs, int num, unsigned long val) + return; + case RI(iaoq[0]): + case RI(iaoq[1]): +- regs->iaoq[num - RI(iaoq[0])] = val; ++ /* set 2 lowest bits to ensure userspace privilege: */ ++ regs->iaoq[num - RI(iaoq[0])] = val | 3; + return; + case RI(sar): regs->sar = val; + return; +diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig +index 8c1c636308c8..8c676d898532 100644 +--- a/arch/powerpc/Kconfig ++++ b/arch/powerpc/Kconfig +@@ -121,6 +121,7 @@ config PPC + select ARCH_32BIT_OFF_T if PPC32 + select ARCH_HAS_DEBUG_VIRTUAL + select ARCH_HAS_DEVMEM_IS_ALLOWED ++ select ARCH_HAS_DMA_MMAP_PGPROT + select ARCH_HAS_ELF_RANDOMIZE + select ARCH_HAS_FORTIFY_SOURCE + select ARCH_HAS_GCOV_PROFILE_ALL +@@ -821,6 +822,8 @@ config SCHED_SMT + when dealing with POWER5 cpus at a cost of slightly increased + overhead in some places. If unsure say N here. + ++source "kernel/Kconfig.MuQSS" ++ + config PPC_DENORMALISATION + bool "PowerPC denormalisation exception handling" + depends on PPC_BOOK3S_64 +diff --git a/arch/powerpc/boot/xz_config.h b/arch/powerpc/boot/xz_config.h +index e22e5b3770dd..ebfadd39e192 100644 +--- a/arch/powerpc/boot/xz_config.h ++++ b/arch/powerpc/boot/xz_config.h +@@ -20,10 +20,30 @@ static inline uint32_t swab32p(void *p) + + #ifdef __LITTLE_ENDIAN__ + #define get_le32(p) (*((uint32_t *) (p))) ++#define cpu_to_be32(x) swab32(x) ++static inline u32 be32_to_cpup(const u32 *p) ++{ ++ return swab32p((u32 *)p); ++} + #else + #define get_le32(p) swab32p(p) ++#define cpu_to_be32(x) (x) ++static inline u32 be32_to_cpup(const u32 *p) ++{ ++ return *p; ++} + #endif + ++static inline uint32_t get_unaligned_be32(const void *p) ++{ ++ return be32_to_cpup(p); ++} ++ ++static inline void put_unaligned_be32(u32 val, void *p) ++{ ++ *((u32 *)p) = cpu_to_be32(val); ++} ++ + #define memeq(a, b, size) (memcmp(a, b, size) == 0) + #define memzero(buf, size) memset(buf, 0, size) + +diff --git a/arch/powerpc/include/asm/cacheflush.h b/arch/powerpc/include/asm/cacheflush.h +index 74d60cfe8ce5..fd318f7c3eed 100644 +--- a/arch/powerpc/include/asm/cacheflush.h ++++ b/arch/powerpc/include/asm/cacheflush.h +@@ -29,9 +29,12 @@ + * not expect this type of fault. flush_cache_vmap is not exactly the right + * place to put this, but it seems to work well enough. + */ +-#define flush_cache_vmap(start, end) do { asm volatile("ptesync" ::: "memory"); } while (0) ++static inline void flush_cache_vmap(unsigned long start, unsigned long end) ++{ ++ asm volatile("ptesync" ::: "memory"); ++} + #else +-#define flush_cache_vmap(start, end) do { } while (0) ++static inline void flush_cache_vmap(unsigned long start, unsigned long end) { } + #endif + + #define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1 +diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h +index 3f53be60fb01..64145751b2fd 100644 +--- a/arch/powerpc/include/asm/pgtable.h ++++ b/arch/powerpc/include/asm/pgtable.h +@@ -140,6 +140,20 @@ static inline void pte_frag_set(mm_context_t *ctx, void *p) + } + #endif + ++#ifdef CONFIG_PPC64 ++#define is_ioremap_addr is_ioremap_addr ++static inline bool is_ioremap_addr(const void *x) ++{ ++#ifdef CONFIG_MMU ++ unsigned long addr = (unsigned long)x; ++ ++ return addr >= IOREMAP_BASE && addr < IOREMAP_END; ++#else ++ return false; ++#endif ++} ++#endif /* CONFIG_PPC64 */ ++ + #endif /* __ASSEMBLY__ */ + + #endif /* _ASM_POWERPC_PGTABLE_H */ +diff --git a/arch/powerpc/include/asm/pmc.h b/arch/powerpc/include/asm/pmc.h +index dc9a1ca70edf..c6bbe9778d3c 100644 +--- a/arch/powerpc/include/asm/pmc.h ++++ b/arch/powerpc/include/asm/pmc.h +@@ -27,11 +27,10 @@ static inline void ppc_set_pmu_inuse(int inuse) + #ifdef CONFIG_PPC_PSERIES + get_lppaca()->pmcregs_in_use = inuse; + #endif +- } else { ++ } + #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE +- get_paca()->pmcregs_in_use = inuse; ++ get_paca()->pmcregs_in_use = inuse; + #endif +- } + #endif + } + +diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile +index 0ea6c4aa3a20..21dfff2b25a1 100644 +--- a/arch/powerpc/kernel/Makefile ++++ b/arch/powerpc/kernel/Makefile +@@ -49,7 +49,8 @@ obj-y := cputable.o ptrace.o syscalls.o \ + signal.o sysfs.o cacheinfo.o time.o \ + prom.o traps.o setup-common.o \ + udbg.o misc.o io.o misc_$(BITS).o \ +- of_platform.o prom_parse.o ++ of_platform.o prom_parse.o \ ++ dma-common.o + obj-$(CONFIG_PPC64) += setup_64.o sys_ppc32.o \ + signal_64.o ptrace32.o \ + paca.o nvram_64.o firmware.o +diff --git a/arch/powerpc/kernel/dma-common.c b/arch/powerpc/kernel/dma-common.c +new file mode 100644 +index 000000000000..dc7ef6b17b69 +--- /dev/null ++++ b/arch/powerpc/kernel/dma-common.c +@@ -0,0 +1,17 @@ ++// SPDX-License-Identifier: GPL-2.0-or-later ++/* ++ * Contains common dma routines for all powerpc platforms. ++ * ++ * Copyright (C) 2019 Shawn Anastasio. ++ */ ++ ++#include ++#include ++ ++pgprot_t arch_dma_mmap_pgprot(struct device *dev, pgprot_t prot, ++ unsigned long attrs) ++{ ++ if (!dev_is_dma_coherent(dev)) ++ return pgprot_noncached(prot); ++ return prot; ++} +diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c +index f192d57db47d..c0e4b73191f3 100644 +--- a/arch/powerpc/kernel/eeh.c ++++ b/arch/powerpc/kernel/eeh.c +@@ -354,10 +354,19 @@ static inline unsigned long eeh_token_to_phys(unsigned long token) + ptep = find_init_mm_pte(token, &hugepage_shift); + if (!ptep) + return token; +- WARN_ON(hugepage_shift); +- pa = pte_pfn(*ptep) << PAGE_SHIFT; + +- return pa | (token & (PAGE_SIZE-1)); ++ pa = pte_pfn(*ptep); ++ ++ /* On radix we can do hugepage mappings for io, so handle that */ ++ if (hugepage_shift) { ++ pa <<= hugepage_shift; ++ pa |= token & ((1ul << hugepage_shift) - 1); ++ } else { ++ pa <<= PAGE_SHIFT; ++ pa |= token & (PAGE_SIZE - 1); ++ } ++ ++ return pa; + } + + /* +diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S +index 73ba246ca11d..6c51aa845bce 100644 +--- a/arch/powerpc/kernel/exceptions-64s.S ++++ b/arch/powerpc/kernel/exceptions-64s.S +@@ -1746,7 +1746,7 @@ handle_page_fault: + addi r3,r1,STACK_FRAME_OVERHEAD + bl do_page_fault + cmpdi r3,0 +- beq+ 12f ++ beq+ ret_from_except_lite + bl save_nvgprs + mr r5,r3 + addi r3,r1,STACK_FRAME_OVERHEAD +@@ -1761,7 +1761,12 @@ handle_dabr_fault: + ld r5,_DSISR(r1) + addi r3,r1,STACK_FRAME_OVERHEAD + bl do_break +-12: b ret_from_except_lite ++ /* ++ * do_break() may have changed the NV GPRS while handling a breakpoint. ++ * If so, we need to restore them with their updated values. Don't use ++ * ret_from_except_lite here. ++ */ ++ b ret_from_except + + + #ifdef CONFIG_PPC_BOOK3S_64 +diff --git a/arch/powerpc/kernel/hw_breakpoint.c b/arch/powerpc/kernel/hw_breakpoint.c +index a293a53b4365..50262597c222 100644 +--- a/arch/powerpc/kernel/hw_breakpoint.c ++++ b/arch/powerpc/kernel/hw_breakpoint.c +@@ -370,6 +370,11 @@ void hw_breakpoint_pmu_read(struct perf_event *bp) + bool dawr_force_enable; + EXPORT_SYMBOL_GPL(dawr_force_enable); + ++static void set_dawr_cb(void *info) ++{ ++ set_dawr(info); ++} ++ + static ssize_t dawr_write_file_bool(struct file *file, + const char __user *user_buf, + size_t count, loff_t *ppos) +@@ -389,7 +394,7 @@ static ssize_t dawr_write_file_bool(struct file *file, + + /* If we are clearing, make sure all CPUs have the DAWR cleared */ + if (!dawr_force_enable) +- smp_call_function((smp_call_func_t)set_dawr, &null_brk, 0); ++ smp_call_function(set_dawr_cb, &null_brk, 0); + + return rc; + } +diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c +index bc68c53af67c..5645bc9cbc09 100644 +--- a/arch/powerpc/kernel/irq.c ++++ b/arch/powerpc/kernel/irq.c +@@ -255,7 +255,7 @@ notrace void arch_local_irq_restore(unsigned long mask) + irq_happened = get_irq_happened(); + if (!irq_happened) { + #ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG +- WARN_ON(!(mfmsr() & MSR_EE)); ++ WARN_ON_ONCE(!(mfmsr() & MSR_EE)); + #endif + return; + } +@@ -268,7 +268,7 @@ notrace void arch_local_irq_restore(unsigned long mask) + */ + if (!(irq_happened & PACA_IRQ_HARD_DIS)) { + #ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG +- WARN_ON(!(mfmsr() & MSR_EE)); ++ WARN_ON_ONCE(!(mfmsr() & MSR_EE)); + #endif + __hard_irq_disable(); + #ifdef CONFIG_PPC_IRQ_SOFT_MASK_DEBUG +@@ -279,7 +279,7 @@ notrace void arch_local_irq_restore(unsigned long mask) + * warn if we are wrong. Only do that when IRQ tracing + * is enabled as mfmsr() can be costly. + */ +- if (WARN_ON(mfmsr() & MSR_EE)) ++ if (WARN_ON_ONCE(mfmsr() & MSR_EE)) + __hard_irq_disable(); + #endif + } +diff --git a/arch/powerpc/kernel/pci_of_scan.c b/arch/powerpc/kernel/pci_of_scan.c +index 24522aa37665..c63c53b37e8e 100644 +--- a/arch/powerpc/kernel/pci_of_scan.c ++++ b/arch/powerpc/kernel/pci_of_scan.c +@@ -42,6 +42,8 @@ unsigned int pci_parse_of_flags(u32 addr0, int bridge) + if (addr0 & 0x02000000) { + flags = IORESOURCE_MEM | PCI_BASE_ADDRESS_SPACE_MEMORY; + flags |= (addr0 >> 22) & PCI_BASE_ADDRESS_MEM_TYPE_64; ++ if (flags & PCI_BASE_ADDRESS_MEM_TYPE_64) ++ flags |= IORESOURCE_MEM_64; + flags |= (addr0 >> 28) & PCI_BASE_ADDRESS_MEM_TYPE_1M; + if (addr0 & 0x40000000) + flags |= IORESOURCE_PREFETCH +diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c +index ed446b7ea164..6d600c977c09 100644 +--- a/arch/powerpc/kernel/prom_init.c ++++ b/arch/powerpc/kernel/prom_init.c +@@ -168,6 +168,7 @@ static unsigned long __prombss prom_tce_alloc_end; + + #ifdef CONFIG_PPC_PSERIES + static bool __prombss prom_radix_disable; ++static bool __prombss prom_xive_disable; + #endif + + struct platform_support { +@@ -804,6 +805,12 @@ static void __init early_cmdline_parse(void) + } + if (prom_radix_disable) + prom_debug("Radix disabled from cmdline\n"); ++ ++ opt = prom_strstr(prom_cmd_line, "xive=off"); ++ if (opt) { ++ prom_xive_disable = true; ++ prom_debug("XIVE disabled from cmdline\n"); ++ } + #endif /* CONFIG_PPC_PSERIES */ + } + +@@ -1212,10 +1219,17 @@ static void __init prom_parse_xive_model(u8 val, + switch (val) { + case OV5_FEAT(OV5_XIVE_EITHER): /* Either Available */ + prom_debug("XIVE - either mode supported\n"); +- support->xive = true; ++ support->xive = !prom_xive_disable; + break; + case OV5_FEAT(OV5_XIVE_EXPLOIT): /* Only Exploitation mode */ + prom_debug("XIVE - exploitation mode supported\n"); ++ if (prom_xive_disable) { ++ /* ++ * If we __have__ to do XIVE, we're better off ignoring ++ * the command line rather than not booting. ++ */ ++ prom_printf("WARNING: Ignoring cmdline option xive=off\n"); ++ } + support->xive = true; + break; + case OV5_FEAT(OV5_XIVE_LEGACY): /* Only Legacy mode */ +diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c +index b824f4c69622..fff2eb22427d 100644 +--- a/arch/powerpc/kernel/rtas.c ++++ b/arch/powerpc/kernel/rtas.c +@@ -980,10 +980,9 @@ int rtas_ibm_suspend_me(u64 handle) + cpu_hotplug_disable(); + + /* Check if we raced with a CPU-Offline Operation */ +- if (unlikely(!cpumask_equal(cpu_present_mask, cpu_online_mask))) { +- pr_err("%s: Raced against a concurrent CPU-Offline\n", +- __func__); +- atomic_set(&data.error, -EBUSY); ++ if (!cpumask_equal(cpu_present_mask, cpu_online_mask)) { ++ pr_info("%s: Raced against a concurrent CPU-Offline\n", __func__); ++ atomic_set(&data.error, -EAGAIN); + goto out_hotplug_enable; + } + +diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c +index a2b74e057904..ebb78effd280 100644 +--- a/arch/powerpc/kernel/signal_32.c ++++ b/arch/powerpc/kernel/signal_32.c +@@ -1198,6 +1198,9 @@ SYSCALL_DEFINE0(rt_sigreturn) + goto bad; + + if (MSR_TM_ACTIVE(msr_hi<<32)) { ++ /* Trying to start TM on non TM system */ ++ if (!cpu_has_feature(CPU_FTR_TM)) ++ goto bad; + /* We only recheckpoint on return if we're + * transaction. + */ +diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c +index 4292ea39baa4..bee704f32f96 100644 +--- a/arch/powerpc/kernel/signal_64.c ++++ b/arch/powerpc/kernel/signal_64.c +@@ -771,6 +771,11 @@ SYSCALL_DEFINE0(rt_sigreturn) + if (MSR_TM_ACTIVE(msr)) { + /* We recheckpoint on return. */ + struct ucontext __user *uc_transact; ++ ++ /* Trying to start TM on non TM system */ ++ if (!cpu_has_feature(CPU_FTR_TM)) ++ goto badframe; ++ + if (__get_user(uc_transact, &uc->uc_link)) + goto badframe; + if (restore_tm_sigcontexts(current, &uc->uc_mcontext, +diff --git a/arch/powerpc/kernel/swsusp_32.S b/arch/powerpc/kernel/swsusp_32.S +index 7a919e9a3400..cbdf86228eaa 100644 +--- a/arch/powerpc/kernel/swsusp_32.S ++++ b/arch/powerpc/kernel/swsusp_32.S +@@ -25,11 +25,19 @@ + #define SL_IBAT2 0x48 + #define SL_DBAT3 0x50 + #define SL_IBAT3 0x58 +-#define SL_TB 0x60 +-#define SL_R2 0x68 +-#define SL_CR 0x6c +-#define SL_LR 0x70 +-#define SL_R12 0x74 /* r12 to r31 */ ++#define SL_DBAT4 0x60 ++#define SL_IBAT4 0x68 ++#define SL_DBAT5 0x70 ++#define SL_IBAT5 0x78 ++#define SL_DBAT6 0x80 ++#define SL_IBAT6 0x88 ++#define SL_DBAT7 0x90 ++#define SL_IBAT7 0x98 ++#define SL_TB 0xa0 ++#define SL_R2 0xa8 ++#define SL_CR 0xac ++#define SL_LR 0xb0 ++#define SL_R12 0xb4 /* r12 to r31 */ + #define SL_SIZE (SL_R12 + 80) + + .section .data +@@ -114,6 +122,41 @@ _GLOBAL(swsusp_arch_suspend) + mfibatl r4,3 + stw r4,SL_IBAT3+4(r11) + ++BEGIN_MMU_FTR_SECTION ++ mfspr r4,SPRN_DBAT4U ++ stw r4,SL_DBAT4(r11) ++ mfspr r4,SPRN_DBAT4L ++ stw r4,SL_DBAT4+4(r11) ++ mfspr r4,SPRN_DBAT5U ++ stw r4,SL_DBAT5(r11) ++ mfspr r4,SPRN_DBAT5L ++ stw r4,SL_DBAT5+4(r11) ++ mfspr r4,SPRN_DBAT6U ++ stw r4,SL_DBAT6(r11) ++ mfspr r4,SPRN_DBAT6L ++ stw r4,SL_DBAT6+4(r11) ++ mfspr r4,SPRN_DBAT7U ++ stw r4,SL_DBAT7(r11) ++ mfspr r4,SPRN_DBAT7L ++ stw r4,SL_DBAT7+4(r11) ++ mfspr r4,SPRN_IBAT4U ++ stw r4,SL_IBAT4(r11) ++ mfspr r4,SPRN_IBAT4L ++ stw r4,SL_IBAT4+4(r11) ++ mfspr r4,SPRN_IBAT5U ++ stw r4,SL_IBAT5(r11) ++ mfspr r4,SPRN_IBAT5L ++ stw r4,SL_IBAT5+4(r11) ++ mfspr r4,SPRN_IBAT6U ++ stw r4,SL_IBAT6(r11) ++ mfspr r4,SPRN_IBAT6L ++ stw r4,SL_IBAT6+4(r11) ++ mfspr r4,SPRN_IBAT7U ++ stw r4,SL_IBAT7(r11) ++ mfspr r4,SPRN_IBAT7L ++ stw r4,SL_IBAT7+4(r11) ++END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS) ++ + #if 0 + /* Backup various CPU config stuffs */ + bl __save_cpu_setup +@@ -279,27 +322,41 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) + mtibatu 3,r4 + lwz r4,SL_IBAT3+4(r11) + mtibatl 3,r4 +-#endif +- + BEGIN_MMU_FTR_SECTION +- li r4,0 ++ lwz r4,SL_DBAT4(r11) + mtspr SPRN_DBAT4U,r4 ++ lwz r4,SL_DBAT4+4(r11) + mtspr SPRN_DBAT4L,r4 ++ lwz r4,SL_DBAT5(r11) + mtspr SPRN_DBAT5U,r4 ++ lwz r4,SL_DBAT5+4(r11) + mtspr SPRN_DBAT5L,r4 ++ lwz r4,SL_DBAT6(r11) + mtspr SPRN_DBAT6U,r4 ++ lwz r4,SL_DBAT6+4(r11) + mtspr SPRN_DBAT6L,r4 ++ lwz r4,SL_DBAT7(r11) + mtspr SPRN_DBAT7U,r4 ++ lwz r4,SL_DBAT7+4(r11) + mtspr SPRN_DBAT7L,r4 ++ lwz r4,SL_IBAT4(r11) + mtspr SPRN_IBAT4U,r4 ++ lwz r4,SL_IBAT4+4(r11) + mtspr SPRN_IBAT4L,r4 ++ lwz r4,SL_IBAT5(r11) + mtspr SPRN_IBAT5U,r4 ++ lwz r4,SL_IBAT5+4(r11) + mtspr SPRN_IBAT5L,r4 ++ lwz r4,SL_IBAT6(r11) + mtspr SPRN_IBAT6U,r4 ++ lwz r4,SL_IBAT6+4(r11) + mtspr SPRN_IBAT6L,r4 ++ lwz r4,SL_IBAT7(r11) + mtspr SPRN_IBAT7U,r4 ++ lwz r4,SL_IBAT7+4(r11) + mtspr SPRN_IBAT7L,r4 + END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS) ++#endif + + /* Flush all TLBs */ + lis r4,0x1000 +diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c +index 76b1801aa44a..cde3f5a4b3e4 100644 +--- a/arch/powerpc/kvm/book3s_hv.c ++++ b/arch/powerpc/kvm/book3s_hv.c +@@ -3569,9 +3569,18 @@ int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, + mtspr(SPRN_DEC, vcpu->arch.dec_expires - mftb()); + + if (kvmhv_on_pseries()) { ++ /* ++ * We need to save and restore the guest visible part of the ++ * psscr (i.e. using SPRN_PSSCR_PR) since the hypervisor ++ * doesn't do this for us. Note only required if pseries since ++ * this is done in kvmhv_load_hv_regs_and_go() below otherwise. ++ */ ++ unsigned long host_psscr; + /* call our hypervisor to load up HV regs and go */ + struct hv_guest_state hvregs; + ++ host_psscr = mfspr(SPRN_PSSCR_PR); ++ mtspr(SPRN_PSSCR_PR, vcpu->arch.psscr); + kvmhv_save_hv_regs(vcpu, &hvregs); + hvregs.lpcr = lpcr; + vcpu->arch.regs.msr = vcpu->arch.shregs.msr; +@@ -3590,6 +3599,8 @@ int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, + vcpu->arch.shregs.msr = vcpu->arch.regs.msr; + vcpu->arch.shregs.dar = mfspr(SPRN_DAR); + vcpu->arch.shregs.dsisr = mfspr(SPRN_DSISR); ++ vcpu->arch.psscr = mfspr(SPRN_PSSCR_PR); ++ mtspr(SPRN_PSSCR_PR, host_psscr); + + /* H_CEDE has to be handled now, not later */ + if (trap == BOOK3S_INTERRUPT_SYSCALL && !vcpu->arch.nested && +@@ -3603,6 +3614,8 @@ int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, + + vcpu->arch.slb_max = 0; + dec = mfspr(SPRN_DEC); ++ if (!(lpcr & LPCR_LD)) /* Sign extend if not using large decrementer */ ++ dec = (s32) dec; + tb = mftb(); + vcpu->arch.dec_expires = dec + tb; + vcpu->cpu = -1; +@@ -3652,6 +3665,8 @@ int kvmhv_p9_guest_entry(struct kvm_vcpu *vcpu, u64 time_limit, + vcpu->arch.vpa.dirty = 1; + save_pmu = lp->pmcregs_in_use; + } ++ /* Must save pmu if this guest is capable of running nested guests */ ++ save_pmu |= nesting_enabled(vcpu->kvm); + + kvmhv_save_guest_pmu(vcpu, save_pmu); + +@@ -4122,8 +4137,15 @@ int kvmhv_run_single_vcpu(struct kvm_run *kvm_run, + + preempt_enable(); + +- /* cancel pending decrementer exception if DEC is now positive */ +- if (get_tb() < vcpu->arch.dec_expires && kvmppc_core_pending_dec(vcpu)) ++ /* ++ * cancel pending decrementer exception if DEC is now positive, or if ++ * entering a nested guest in which case the decrementer is now owned ++ * by L2 and the L1 decrementer is provided in hdec_expires ++ */ ++ if (kvmppc_core_pending_dec(vcpu) && ++ ((get_tb() < vcpu->arch.dec_expires) || ++ (trap == BOOK3S_INTERRUPT_SYSCALL && ++ kvmppc_get_gpr(vcpu, 3) == H_ENTER_NESTED))) + kvmppc_core_dequeue_dec(vcpu); + + trace_kvm_guest_exit(vcpu); +diff --git a/arch/powerpc/kvm/book3s_hv_tm.c b/arch/powerpc/kvm/book3s_hv_tm.c +index 229496e2652e..0db937497169 100644 +--- a/arch/powerpc/kvm/book3s_hv_tm.c ++++ b/arch/powerpc/kvm/book3s_hv_tm.c +@@ -128,7 +128,7 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) + } + /* Set CR0 to indicate previous transactional state */ + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | +- (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); ++ (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 29); + /* L=1 => tresume, L=0 => tsuspend */ + if (instr & (1 << 21)) { + if (MSR_TM_SUSPENDED(msr)) +@@ -172,7 +172,7 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) + + /* Set CR0 to indicate previous transactional state */ + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | +- (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); ++ (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 29); + vcpu->arch.shregs.msr &= ~MSR_TS_MASK; + return RESUME_GUEST; + +@@ -202,7 +202,7 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) + + /* Set CR0 to indicate previous transactional state */ + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | +- (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); ++ (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 29); + vcpu->arch.shregs.msr = msr | MSR_TS_S; + return RESUME_GUEST; + } +diff --git a/arch/powerpc/kvm/book3s_xive.c b/arch/powerpc/kvm/book3s_xive.c +index 6ca0d7376a9f..e3ba67095895 100644 +--- a/arch/powerpc/kvm/book3s_xive.c ++++ b/arch/powerpc/kvm/book3s_xive.c +@@ -1986,10 +1986,8 @@ static int kvmppc_xive_create(struct kvm_device *dev, u32 type) + + xive->single_escalation = xive_native_has_single_escalation(); + +- if (ret) { +- kfree(xive); ++ if (ret) + return ret; +- } + + return 0; + } +diff --git a/arch/powerpc/kvm/book3s_xive_native.c b/arch/powerpc/kvm/book3s_xive_native.c +index 5596c8ec221a..a998823f68a3 100644 +--- a/arch/powerpc/kvm/book3s_xive_native.c ++++ b/arch/powerpc/kvm/book3s_xive_native.c +@@ -1090,9 +1090,9 @@ static int kvmppc_xive_native_create(struct kvm_device *dev, u32 type) + xive->ops = &kvmppc_xive_native_ops; + + if (ret) +- kfree(xive); ++ return ret; + +- return ret; ++ return 0; + } + + /* +diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c +index 6d704ad2472b..993017dd83ca 100644 +--- a/arch/powerpc/kvm/powerpc.c ++++ b/arch/powerpc/kvm/powerpc.c +@@ -50,6 +50,11 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *v) + return !!(v->arch.pending_exceptions) || kvm_request_pending(v); + } + ++bool kvm_arch_dy_runnable(struct kvm_vcpu *vcpu) ++{ ++ return kvm_arch_vcpu_runnable(vcpu); ++} ++ + bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu) + { + return false; +diff --git a/arch/powerpc/mm/book3s64/hash_native.c b/arch/powerpc/mm/book3s64/hash_native.c +index 30d62ffe3310..1322c59cb5dd 100644 +--- a/arch/powerpc/mm/book3s64/hash_native.c ++++ b/arch/powerpc/mm/book3s64/hash_native.c +@@ -56,7 +56,7 @@ static inline void tlbiel_hash_set_isa206(unsigned int set, unsigned int is) + * tlbiel instruction for hash, set invalidation + * i.e., r=1 and is=01 or is=10 or is=11 + */ +-static inline void tlbiel_hash_set_isa300(unsigned int set, unsigned int is, ++static __always_inline void tlbiel_hash_set_isa300(unsigned int set, unsigned int is, + unsigned int pid, + unsigned int ric, unsigned int prs) + { +diff --git a/arch/powerpc/mm/book3s64/hash_utils.c b/arch/powerpc/mm/book3s64/hash_utils.c +index 28ced26f2a00..ab659044c7f6 100644 +--- a/arch/powerpc/mm/book3s64/hash_utils.c ++++ b/arch/powerpc/mm/book3s64/hash_utils.c +@@ -1901,11 +1901,20 @@ void hash__setup_initial_memory_limit(phys_addr_t first_memblock_base, + * + * For guests on platforms before POWER9, we clamp the it limit to 1G + * to avoid some funky things such as RTAS bugs etc... ++ * ++ * On POWER9 we limit to 1TB in case the host erroneously told us that ++ * the RMA was >1TB. Effective address bits 0:23 are treated as zero ++ * (meaning the access is aliased to zero i.e. addr = addr % 1TB) ++ * for virtual real mode addressing and so it doesn't make sense to ++ * have an area larger than 1TB as it can't be addressed. + */ + if (!early_cpu_has_feature(CPU_FTR_HVMODE)) { + ppc64_rma_size = first_memblock_size; + if (!early_cpu_has_feature(CPU_FTR_ARCH_300)) + ppc64_rma_size = min_t(u64, ppc64_rma_size, 0x40000000); ++ else ++ ppc64_rma_size = min_t(u64, ppc64_rma_size, ++ 1UL << SID_SHIFT_1T); + + /* Finally limit subsequent allocations */ + memblock_set_current_limit(ppc64_rma_size); +diff --git a/arch/powerpc/mm/book3s64/radix_tlb.c b/arch/powerpc/mm/book3s64/radix_tlb.c +index bb9835681315..d0cd5271a57c 100644 +--- a/arch/powerpc/mm/book3s64/radix_tlb.c ++++ b/arch/powerpc/mm/book3s64/radix_tlb.c +@@ -25,7 +25,7 @@ + * tlbiel instruction for radix, set invalidation + * i.e., r=1 and is=01 or is=10 or is=11 + */ +-static inline void tlbiel_radix_set_isa300(unsigned int set, unsigned int is, ++static __always_inline void tlbiel_radix_set_isa300(unsigned int set, unsigned int is, + unsigned int pid, + unsigned int ric, unsigned int prs) + { +@@ -146,8 +146,8 @@ static __always_inline void __tlbie_lpid(unsigned long lpid, unsigned long ric) + trace_tlbie(lpid, 0, rb, rs, ric, prs, r); + } + +-static inline void __tlbiel_lpid_guest(unsigned long lpid, int set, +- unsigned long ric) ++static __always_inline void __tlbiel_lpid_guest(unsigned long lpid, int set, ++ unsigned long ric) + { + unsigned long rb,rs,prs,r; + +@@ -163,8 +163,8 @@ static inline void __tlbiel_lpid_guest(unsigned long lpid, int set, + } + + +-static inline void __tlbiel_va(unsigned long va, unsigned long pid, +- unsigned long ap, unsigned long ric) ++static __always_inline void __tlbiel_va(unsigned long va, unsigned long pid, ++ unsigned long ap, unsigned long ric) + { + unsigned long rb,rs,prs,r; + +@@ -179,8 +179,8 @@ static inline void __tlbiel_va(unsigned long va, unsigned long pid, + trace_tlbie(0, 1, rb, rs, ric, prs, r); + } + +-static inline void __tlbie_va(unsigned long va, unsigned long pid, +- unsigned long ap, unsigned long ric) ++static __always_inline void __tlbie_va(unsigned long va, unsigned long pid, ++ unsigned long ap, unsigned long ric) + { + unsigned long rb,rs,prs,r; + +@@ -195,8 +195,8 @@ static inline void __tlbie_va(unsigned long va, unsigned long pid, + trace_tlbie(0, 0, rb, rs, ric, prs, r); + } + +-static inline void __tlbie_lpid_va(unsigned long va, unsigned long lpid, +- unsigned long ap, unsigned long ric) ++static __always_inline void __tlbie_lpid_va(unsigned long va, unsigned long lpid, ++ unsigned long ap, unsigned long ric) + { + unsigned long rb,rs,prs,r; + +@@ -235,7 +235,7 @@ static inline void fixup_tlbie_lpid(unsigned long lpid) + /* + * We use 128 set in radix mode and 256 set in hpt mode. + */ +-static inline void _tlbiel_pid(unsigned long pid, unsigned long ric) ++static __always_inline void _tlbiel_pid(unsigned long pid, unsigned long ric) + { + int set; + +@@ -337,7 +337,7 @@ static inline void _tlbie_lpid(unsigned long lpid, unsigned long ric) + asm volatile("eieio; tlbsync; ptesync": : :"memory"); + } + +-static inline void _tlbiel_lpid_guest(unsigned long lpid, unsigned long ric) ++static __always_inline void _tlbiel_lpid_guest(unsigned long lpid, unsigned long ric) + { + int set; + +@@ -377,8 +377,8 @@ static inline void __tlbiel_va_range(unsigned long start, unsigned long end, + __tlbiel_va(addr, pid, ap, RIC_FLUSH_TLB); + } + +-static inline void _tlbiel_va(unsigned long va, unsigned long pid, +- unsigned long psize, unsigned long ric) ++static __always_inline void _tlbiel_va(unsigned long va, unsigned long pid, ++ unsigned long psize, unsigned long ric) + { + unsigned long ap = mmu_get_ap(psize); + +@@ -409,8 +409,8 @@ static inline void __tlbie_va_range(unsigned long start, unsigned long end, + __tlbie_va(addr, pid, ap, RIC_FLUSH_TLB); + } + +-static inline void _tlbie_va(unsigned long va, unsigned long pid, +- unsigned long psize, unsigned long ric) ++static __always_inline void _tlbie_va(unsigned long va, unsigned long pid, ++ unsigned long psize, unsigned long ric) + { + unsigned long ap = mmu_get_ap(psize); + +@@ -420,7 +420,7 @@ static inline void _tlbie_va(unsigned long va, unsigned long pid, + asm volatile("eieio; tlbsync; ptesync": : :"memory"); + } + +-static inline void _tlbie_lpid_va(unsigned long va, unsigned long lpid, ++static __always_inline void _tlbie_lpid_va(unsigned long va, unsigned long lpid, + unsigned long psize, unsigned long ric) + { + unsigned long ap = mmu_get_ap(psize); +diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c +index b5d92dc32844..1de0f43a68e5 100644 +--- a/arch/powerpc/mm/hugetlbpage.c ++++ b/arch/powerpc/mm/hugetlbpage.c +@@ -130,6 +130,8 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz + } else { + pdshift = PUD_SHIFT; + pu = pud_alloc(mm, pg, addr); ++ if (!pu) ++ return NULL; + if (pshift == PUD_SHIFT) + return (pte_t *)pu; + else if (pshift > PMD_SHIFT) { +@@ -138,6 +140,8 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz + } else { + pdshift = PMD_SHIFT; + pm = pmd_alloc(mm, pu, addr); ++ if (!pm) ++ return NULL; + if (pshift == PMD_SHIFT) + /* 16MB hugepage */ + return (pte_t *)pm; +@@ -154,12 +158,16 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz + } else { + pdshift = PUD_SHIFT; + pu = pud_alloc(mm, pg, addr); ++ if (!pu) ++ return NULL; + if (pshift >= PUD_SHIFT) { + ptl = pud_lockptr(mm, pu); + hpdp = (hugepd_t *)pu; + } else { + pdshift = PMD_SHIFT; + pm = pmd_alloc(mm, pu, addr); ++ if (!pm) ++ return NULL; + ptl = pmd_lockptr(mm, pm); + hpdp = (hugepd_t *)pm; + } +diff --git a/arch/powerpc/mm/kasan/kasan_init_32.c b/arch/powerpc/mm/kasan/kasan_init_32.c +index 0d62be3cba47..74f4555a62ba 100644 +--- a/arch/powerpc/mm/kasan/kasan_init_32.c ++++ b/arch/powerpc/mm/kasan/kasan_init_32.c +@@ -21,7 +21,7 @@ static void kasan_populate_pte(pte_t *ptep, pgprot_t prot) + __set_pte_at(&init_mm, va, ptep, pfn_pte(PHYS_PFN(pa), prot), 0); + } + +-static int kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_end) ++static int __ref kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_end) + { + pmd_t *pmd; + unsigned long k_cur, k_next; +@@ -35,7 +35,10 @@ static int kasan_init_shadow_page_tables(unsigned long k_start, unsigned long k_ + if ((void *)pmd_page_vaddr(*pmd) != kasan_early_shadow_pte) + continue; + +- new = pte_alloc_one_kernel(&init_mm); ++ if (slab_is_available()) ++ new = pte_alloc_one_kernel(&init_mm); ++ else ++ new = memblock_alloc(PTE_FRAG_SIZE, PTE_FRAG_SIZE); + + if (!new) + return -ENOMEM; +diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c +index 2540d3b2588c..2eda1ec36f55 100644 +--- a/arch/powerpc/mm/mem.c ++++ b/arch/powerpc/mm/mem.c +@@ -249,7 +249,7 @@ void __init paging_init(void) + + #ifdef CONFIG_ZONE_DMA + max_zone_pfns[ZONE_DMA] = min(max_low_pfn, +- ((1UL << ARCH_ZONE_DMA_BITS) - 1) >> PAGE_SHIFT); ++ 1UL << (ARCH_ZONE_DMA_BITS - PAGE_SHIFT)); + #endif + max_zone_pfns[ZONE_NORMAL] = max_low_pfn; + #ifdef CONFIG_HIGHMEM +diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c +index d53188dee18f..35cb96cfc258 100644 +--- a/arch/powerpc/mm/pgtable_32.c ++++ b/arch/powerpc/mm/pgtable_32.c +@@ -360,7 +360,7 @@ void mark_initmem_nx(void) + unsigned long numpages = PFN_UP((unsigned long)_einittext) - + PFN_DOWN((unsigned long)_sinittext); + +- if (v_block_mapped((unsigned long)_stext) + 1) ++ if (v_block_mapped((unsigned long)_stext + 1)) + mmu_mark_initmem_nx(); + else + change_page_attr(page, numpages, PAGE_KERNEL); +diff --git a/arch/powerpc/platforms/4xx/uic.c b/arch/powerpc/platforms/4xx/uic.c +index 31f12ad37a98..36fb66ce54cf 100644 +--- a/arch/powerpc/platforms/4xx/uic.c ++++ b/arch/powerpc/platforms/4xx/uic.c +@@ -154,6 +154,7 @@ static int uic_set_irq_type(struct irq_data *d, unsigned int flow_type) + + mtdcr(uic->dcrbase + UIC_PR, pr); + mtdcr(uic->dcrbase + UIC_TR, tr); ++ mtdcr(uic->dcrbase + UIC_SR, ~mask); + + raw_spin_unlock_irqrestore(&uic->lock, flags); + +diff --git a/arch/powerpc/platforms/cell/spufs/sched.c b/arch/powerpc/platforms/cell/spufs/sched.c +index e56b553de27b..ef94224efa5b 100644 +--- a/arch/powerpc/platforms/cell/spufs/sched.c ++++ b/arch/powerpc/platforms/cell/spufs/sched.c +@@ -51,11 +51,6 @@ static struct task_struct *spusched_task; + static struct timer_list spusched_timer; + static struct timer_list spuloadavg_timer; + +-/* +- * Priority of a normal, non-rt, non-niced'd process (aka nice level 0). +- */ +-#define NORMAL_PRIO 120 +- + /* + * Frequency of the spu scheduler tick. By default we do one SPU scheduler + * tick for every 10 CPU scheduler ticks. +diff --git a/arch/powerpc/platforms/powermac/sleep.S b/arch/powerpc/platforms/powermac/sleep.S +index 6bbcbec97712..bd6085b470b7 100644 +--- a/arch/powerpc/platforms/powermac/sleep.S ++++ b/arch/powerpc/platforms/powermac/sleep.S +@@ -33,10 +33,18 @@ + #define SL_IBAT2 0x48 + #define SL_DBAT3 0x50 + #define SL_IBAT3 0x58 +-#define SL_TB 0x60 +-#define SL_R2 0x68 +-#define SL_CR 0x6c +-#define SL_R12 0x70 /* r12 to r31 */ ++#define SL_DBAT4 0x60 ++#define SL_IBAT4 0x68 ++#define SL_DBAT5 0x70 ++#define SL_IBAT5 0x78 ++#define SL_DBAT6 0x80 ++#define SL_IBAT6 0x88 ++#define SL_DBAT7 0x90 ++#define SL_IBAT7 0x98 ++#define SL_TB 0xa0 ++#define SL_R2 0xa8 ++#define SL_CR 0xac ++#define SL_R12 0xb0 /* r12 to r31 */ + #define SL_SIZE (SL_R12 + 80) + + .section .text +@@ -121,6 +129,41 @@ _GLOBAL(low_sleep_handler) + mfibatl r4,3 + stw r4,SL_IBAT3+4(r1) + ++BEGIN_MMU_FTR_SECTION ++ mfspr r4,SPRN_DBAT4U ++ stw r4,SL_DBAT4(r1) ++ mfspr r4,SPRN_DBAT4L ++ stw r4,SL_DBAT4+4(r1) ++ mfspr r4,SPRN_DBAT5U ++ stw r4,SL_DBAT5(r1) ++ mfspr r4,SPRN_DBAT5L ++ stw r4,SL_DBAT5+4(r1) ++ mfspr r4,SPRN_DBAT6U ++ stw r4,SL_DBAT6(r1) ++ mfspr r4,SPRN_DBAT6L ++ stw r4,SL_DBAT6+4(r1) ++ mfspr r4,SPRN_DBAT7U ++ stw r4,SL_DBAT7(r1) ++ mfspr r4,SPRN_DBAT7L ++ stw r4,SL_DBAT7+4(r1) ++ mfspr r4,SPRN_IBAT4U ++ stw r4,SL_IBAT4(r1) ++ mfspr r4,SPRN_IBAT4L ++ stw r4,SL_IBAT4+4(r1) ++ mfspr r4,SPRN_IBAT5U ++ stw r4,SL_IBAT5(r1) ++ mfspr r4,SPRN_IBAT5L ++ stw r4,SL_IBAT5+4(r1) ++ mfspr r4,SPRN_IBAT6U ++ stw r4,SL_IBAT6(r1) ++ mfspr r4,SPRN_IBAT6L ++ stw r4,SL_IBAT6+4(r1) ++ mfspr r4,SPRN_IBAT7U ++ stw r4,SL_IBAT7(r1) ++ mfspr r4,SPRN_IBAT7L ++ stw r4,SL_IBAT7+4(r1) ++END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS) ++ + /* Backup various CPU config stuffs */ + bl __save_cpu_setup + +@@ -321,22 +364,37 @@ grackle_wake_up: + mtibatl 3,r4 + + BEGIN_MMU_FTR_SECTION +- li r4,0 ++ lwz r4,SL_DBAT4(r1) + mtspr SPRN_DBAT4U,r4 ++ lwz r4,SL_DBAT4+4(r1) + mtspr SPRN_DBAT4L,r4 ++ lwz r4,SL_DBAT5(r1) + mtspr SPRN_DBAT5U,r4 ++ lwz r4,SL_DBAT5+4(r1) + mtspr SPRN_DBAT5L,r4 ++ lwz r4,SL_DBAT6(r1) + mtspr SPRN_DBAT6U,r4 ++ lwz r4,SL_DBAT6+4(r1) + mtspr SPRN_DBAT6L,r4 ++ lwz r4,SL_DBAT7(r1) + mtspr SPRN_DBAT7U,r4 ++ lwz r4,SL_DBAT7+4(r1) + mtspr SPRN_DBAT7L,r4 ++ lwz r4,SL_IBAT4(r1) + mtspr SPRN_IBAT4U,r4 ++ lwz r4,SL_IBAT4+4(r1) + mtspr SPRN_IBAT4L,r4 ++ lwz r4,SL_IBAT5(r1) + mtspr SPRN_IBAT5U,r4 ++ lwz r4,SL_IBAT5+4(r1) + mtspr SPRN_IBAT5L,r4 ++ lwz r4,SL_IBAT6(r1) + mtspr SPRN_IBAT6U,r4 ++ lwz r4,SL_IBAT6+4(r1) + mtspr SPRN_IBAT6L,r4 ++ lwz r4,SL_IBAT7(r1) + mtspr SPRN_IBAT7U,r4 ++ lwz r4,SL_IBAT7+4(r1) + mtspr SPRN_IBAT7L,r4 + END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS) + +diff --git a/arch/powerpc/platforms/powernv/idle.c b/arch/powerpc/platforms/powernv/idle.c +index 2f4479b94ac3..fd14a6237954 100644 +--- a/arch/powerpc/platforms/powernv/idle.c ++++ b/arch/powerpc/platforms/powernv/idle.c +@@ -758,7 +758,6 @@ static unsigned long power9_idle_stop(unsigned long psscr, bool mmu_on) + mtspr(SPRN_PTCR, sprs.ptcr); + mtspr(SPRN_RPR, sprs.rpr); + mtspr(SPRN_TSCR, sprs.tscr); +- mtspr(SPRN_LDBAR, sprs.ldbar); + + if (pls >= pnv_first_tb_loss_level) { + /* TB loss */ +@@ -790,6 +789,7 @@ static unsigned long power9_idle_stop(unsigned long psscr, bool mmu_on) + mtspr(SPRN_MMCR0, sprs.mmcr0); + mtspr(SPRN_MMCR1, sprs.mmcr1); + mtspr(SPRN_MMCR2, sprs.mmcr2); ++ mtspr(SPRN_LDBAR, sprs.ldbar); + + mtspr(SPRN_SPRG3, local_paca->sprg_vdso); + +diff --git a/arch/powerpc/platforms/powernv/npu-dma.c b/arch/powerpc/platforms/powernv/npu-dma.c +index c321fdbc2200..e607141e0b39 100644 +--- a/arch/powerpc/platforms/powernv/npu-dma.c ++++ b/arch/powerpc/platforms/powernv/npu-dma.c +@@ -28,9 +28,22 @@ static DEFINE_SPINLOCK(npu_context_lock); + static struct pci_dev *get_pci_dev(struct device_node *dn) + { + struct pci_dn *pdn = PCI_DN(dn); ++ struct pci_dev *pdev; + +- return pci_get_domain_bus_and_slot(pci_domain_nr(pdn->phb->bus), ++ pdev = pci_get_domain_bus_and_slot(pci_domain_nr(pdn->phb->bus), + pdn->busno, pdn->devfn); ++ ++ /* ++ * pci_get_domain_bus_and_slot() increased the reference count of ++ * the PCI device, but callers don't need that actually as the PE ++ * already holds a reference to the device. Since callers aren't ++ * aware of the reference count change, call pci_dev_put() now to ++ * avoid leaks. ++ */ ++ if (pdev) ++ pci_dev_put(pdev); ++ ++ return pdev; + } + + /* Given a NPU device get the associated PCI device. */ +diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c +index 10cc42b9e541..0f72c7484824 100644 +--- a/arch/powerpc/platforms/powernv/pci-ioda.c ++++ b/arch/powerpc/platforms/powernv/pci-ioda.c +@@ -2456,6 +2456,14 @@ static long pnv_pci_ioda2_setup_default_config(struct pnv_ioda_pe *pe) + if (!pnv_iommu_bypass_disabled) + pnv_pci_ioda2_set_bypass(pe, true); + ++ /* ++ * Set table base for the case of IOMMU DMA use. Usually this is done ++ * from dma_dev_setup() which is not called when a device is returned ++ * from VFIO so do it here. ++ */ ++ if (pe->pdev) ++ set_iommu_table_base(&pe->pdev->dev, tbl); ++ + return 0; + } + +@@ -2543,6 +2551,8 @@ static void pnv_ioda2_take_ownership(struct iommu_table_group *table_group) + pnv_pci_ioda2_unset_window(&pe->table_group, 0); + if (pe->pbus) + pnv_ioda_setup_bus_dma(pe, pe->pbus); ++ else if (pe->pdev) ++ set_iommu_table_base(&pe->pdev->dev, NULL); + iommu_tce_table_put(tbl); + } + +diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c +index 2ec43b4639a0..46d0d35b9ca4 100644 +--- a/arch/powerpc/platforms/pseries/hotplug-memory.c ++++ b/arch/powerpc/platforms/pseries/hotplug-memory.c +@@ -976,6 +976,9 @@ static int pseries_update_drconf_memory(struct of_reconfig_data *pr) + if (!memblock_size) + return -EINVAL; + ++ if (!pr->old_prop) ++ return 0; ++ + p = (__be32 *) pr->old_prop->value; + if (!p) + return -EINVAL; +diff --git a/arch/powerpc/platforms/pseries/mobility.c b/arch/powerpc/platforms/pseries/mobility.c +index 0c48c8964783..50e7aee3c7f3 100644 +--- a/arch/powerpc/platforms/pseries/mobility.c ++++ b/arch/powerpc/platforms/pseries/mobility.c +@@ -6,6 +6,7 @@ + * Copyright (C) 2010 IBM Corporation + */ + ++#include + #include + #include + #include +@@ -335,11 +336,19 @@ void post_mobility_fixup(void) + if (rc) + printk(KERN_ERR "Post-mobility activate-fw failed: %d\n", rc); + ++ /* ++ * We don't want CPUs to go online/offline while the device ++ * tree is being updated. ++ */ ++ cpus_read_lock(); ++ + rc = pseries_devicetree_update(MIGRATION_SCOPE); + if (rc) + printk(KERN_ERR "Post-mobility device tree update " + "failed: %d\n", rc); + ++ cpus_read_unlock(); ++ + /* Possibly switch to a new RFI flush type */ + pseries_setup_rfi_flush(); + +diff --git a/arch/powerpc/platforms/pseries/papr_scm.c b/arch/powerpc/platforms/pseries/papr_scm.c +index 96c53b23e58f..dad9825e4087 100644 +--- a/arch/powerpc/platforms/pseries/papr_scm.c ++++ b/arch/powerpc/platforms/pseries/papr_scm.c +@@ -42,8 +42,9 @@ struct papr_scm_priv { + static int drc_pmem_bind(struct papr_scm_priv *p) + { + unsigned long ret[PLPAR_HCALL_BUFSIZE]; +- uint64_t rc, token; + uint64_t saved = 0; ++ uint64_t token; ++ int64_t rc; + + /* + * When the hypervisor cannot map all the requested memory in a single +@@ -63,6 +64,10 @@ static int drc_pmem_bind(struct papr_scm_priv *p) + } while (rc == H_BUSY); + + if (rc) { ++ /* H_OVERLAP needs a separate error path */ ++ if (rc == H_OVERLAP) ++ return -EBUSY; ++ + dev_err(&p->pdev->dev, "bind err: %lld\n", rc); + return -ENXIO; + } +@@ -316,6 +321,14 @@ static int papr_scm_probe(struct platform_device *pdev) + + /* request the hypervisor to bind this region to somewhere in memory */ + rc = drc_pmem_bind(p); ++ ++ /* If phyp says drc memory still bound then force unbound and retry */ ++ if (rc == -EBUSY) { ++ dev_warn(&pdev->dev, "Retrying bind after unbinding\n"); ++ drc_pmem_unbind(p); ++ rc = drc_pmem_bind(p); ++ } ++ + if (rc) + goto err; + +diff --git a/arch/powerpc/sysdev/xive/common.c b/arch/powerpc/sysdev/xive/common.c +index 082c7e1c20f0..1cdb39575eae 100644 +--- a/arch/powerpc/sysdev/xive/common.c ++++ b/arch/powerpc/sysdev/xive/common.c +@@ -479,7 +479,7 @@ static int xive_find_target_in_mask(const struct cpumask *mask, + * Now go through the entire mask until we find a valid + * target. + */ +- for (;;) { ++ do { + /* + * We re-check online as the fallback case passes us + * an untested affinity mask +@@ -487,12 +487,11 @@ static int xive_find_target_in_mask(const struct cpumask *mask, + if (cpu_online(cpu) && xive_try_pick_target(cpu)) + return cpu; + cpu = cpumask_next(cpu, mask); +- if (cpu == first) +- break; + /* Wrap around */ + if (cpu >= nr_cpu_ids) + cpu = cpumask_first(mask); +- } ++ } while (cpu != first); ++ + return -1; + } + +diff --git a/arch/powerpc/sysdev/xive/spapr.c b/arch/powerpc/sysdev/xive/spapr.c +index cafb5c4df26b..8ef9cf4ebb1c 100644 +--- a/arch/powerpc/sysdev/xive/spapr.c ++++ b/arch/powerpc/sysdev/xive/spapr.c +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -659,6 +660,55 @@ static bool xive_get_max_prio(u8 *max_prio) + return true; + } + ++static const u8 *get_vec5_feature(unsigned int index) ++{ ++ unsigned long root, chosen; ++ int size; ++ const u8 *vec5; ++ ++ root = of_get_flat_dt_root(); ++ chosen = of_get_flat_dt_subnode_by_name(root, "chosen"); ++ if (chosen == -FDT_ERR_NOTFOUND) ++ return NULL; ++ ++ vec5 = of_get_flat_dt_prop(chosen, "ibm,architecture-vec-5", &size); ++ if (!vec5) ++ return NULL; ++ ++ if (size <= index) ++ return NULL; ++ ++ return vec5 + index; ++} ++ ++static bool xive_spapr_disabled(void) ++{ ++ const u8 *vec5_xive; ++ ++ vec5_xive = get_vec5_feature(OV5_INDX(OV5_XIVE_SUPPORT)); ++ if (vec5_xive) { ++ u8 val; ++ ++ val = *vec5_xive & OV5_FEAT(OV5_XIVE_SUPPORT); ++ switch (val) { ++ case OV5_FEAT(OV5_XIVE_EITHER): ++ case OV5_FEAT(OV5_XIVE_LEGACY): ++ break; ++ case OV5_FEAT(OV5_XIVE_EXPLOIT): ++ /* Hypervisor only supports XIVE */ ++ if (xive_cmdline_disabled) ++ pr_warn("WARNING: Ignoring cmdline option xive=off\n"); ++ return false; ++ default: ++ pr_warn("%s: Unknown xive support option: 0x%x\n", ++ __func__, val); ++ break; ++ } ++ } ++ ++ return xive_cmdline_disabled; ++} ++ + bool __init xive_spapr_init(void) + { + struct device_node *np; +@@ -671,7 +721,7 @@ bool __init xive_spapr_init(void) + const __be32 *reg; + int i; + +- if (xive_cmdline_disabled) ++ if (xive_spapr_disabled()) + return false; + + pr_devel("%s()\n", __func__); +diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c +index d0620d762a5a..4a721fd62406 100644 +--- a/arch/powerpc/xmon/xmon.c ++++ b/arch/powerpc/xmon/xmon.c +@@ -465,8 +465,10 @@ static int xmon_core(struct pt_regs *regs, int fromipi) + local_irq_save(flags); + hard_irq_disable(); + +- tracing_enabled = tracing_is_on(); +- tracing_off(); ++ if (!fromipi) { ++ tracing_enabled = tracing_is_on(); ++ tracing_off(); ++ } + + bp = in_breakpoint_table(regs->nip, &offset); + if (bp != NULL) { +diff --git a/arch/s390/include/asm/facility.h b/arch/s390/include/asm/facility.h +index e78cda94456b..68c476b20b57 100644 +--- a/arch/s390/include/asm/facility.h ++++ b/arch/s390/include/asm/facility.h +@@ -59,6 +59,18 @@ static inline int test_facility(unsigned long nr) + return __test_facility(nr, &S390_lowcore.stfle_fac_list); + } + ++static inline unsigned long __stfle_asm(u64 *stfle_fac_list, int size) ++{ ++ register unsigned long reg0 asm("0") = size - 1; ++ ++ asm volatile( ++ ".insn s,0xb2b00000,0(%1)" /* stfle */ ++ : "+d" (reg0) ++ : "a" (stfle_fac_list) ++ : "memory", "cc"); ++ return reg0; ++} ++ + /** + * stfle - Store facility list extended + * @stfle_fac_list: array where facility list can be stored +@@ -75,13 +87,8 @@ static inline void __stfle(u64 *stfle_fac_list, int size) + memcpy(stfle_fac_list, &S390_lowcore.stfl_fac_list, 4); + if (S390_lowcore.stfl_fac_list & 0x01000000) { + /* More facility bits available with stfle */ +- register unsigned long reg0 asm("0") = size - 1; +- +- asm volatile(".insn s,0xb2b00000,0(%1)" /* stfle */ +- : "+d" (reg0) +- : "a" (stfle_fac_list) +- : "memory", "cc"); +- nr = (reg0 + 1) * 8; /* # bytes stored by stfle */ ++ nr = __stfle_asm(stfle_fac_list, size); ++ nr = min_t(unsigned long, (nr + 1) * 8, size * 8); + } + memset((char *) stfle_fac_list + nr, 0, size * 8 - nr); + } +diff --git a/arch/s390/include/asm/page.h b/arch/s390/include/asm/page.h +index a4d38092530a..823578c6b9e2 100644 +--- a/arch/s390/include/asm/page.h ++++ b/arch/s390/include/asm/page.h +@@ -177,6 +177,8 @@ static inline int devmem_is_allowed(unsigned long pfn) + #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | \ + VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) + ++#define ARCH_ZONE_DMA_BITS 31 ++ + #include + #include + +diff --git a/arch/s390/include/asm/sclp.h b/arch/s390/include/asm/sclp.h +index f577c5f6031a..c563f8368b19 100644 +--- a/arch/s390/include/asm/sclp.h ++++ b/arch/s390/include/asm/sclp.h +@@ -80,7 +80,6 @@ struct sclp_info { + unsigned char has_gisaf : 1; + unsigned char has_diag318 : 1; + unsigned char has_sipl : 1; +- unsigned char has_sipl_g2 : 1; + unsigned char has_dirq : 1; + unsigned int ibc; + unsigned int mtid; +diff --git a/arch/s390/kernel/ipl.c b/arch/s390/kernel/ipl.c +index d836af3ccc38..2c0a515428d6 100644 +--- a/arch/s390/kernel/ipl.c ++++ b/arch/s390/kernel/ipl.c +@@ -286,12 +286,7 @@ static struct kobj_attribute sys_ipl_secure_attr = + static ssize_t ipl_has_secure_show(struct kobject *kobj, + struct kobj_attribute *attr, char *page) + { +- if (MACHINE_IS_LPAR) +- return sprintf(page, "%i\n", !!sclp.has_sipl); +- else if (MACHINE_IS_VM) +- return sprintf(page, "%i\n", !!sclp.has_sipl_g2); +- else +- return sprintf(page, "%i\n", 0); ++ return sprintf(page, "%i\n", !!sclp.has_sipl); + } + + static struct kobj_attribute sys_ipl_has_secure_attr = +diff --git a/arch/sh/boards/Kconfig b/arch/sh/boards/Kconfig +index b9a37057b77a..cee24c308337 100644 +--- a/arch/sh/boards/Kconfig ++++ b/arch/sh/boards/Kconfig +@@ -8,27 +8,19 @@ config SH_ALPHA_BOARD + bool + + config SH_DEVICE_TREE +- bool "Board Described by Device Tree" ++ bool + select OF + select OF_EARLY_FLATTREE + select TIMER_OF + select COMMON_CLK + select GENERIC_CALIBRATE_DELAY +- help +- Select Board Described by Device Tree to build a kernel that +- does not hard-code any board-specific knowledge but instead uses +- a device tree blob provided by the boot-loader. You must enable +- drivers for any hardware you want to use separately. At this +- time, only boards based on the open-hardware J-Core processors +- have sufficient driver coverage to use this option; do not +- select it if you are using original SuperH hardware. + + config SH_JCORE_SOC + bool "J-Core SoC" +- depends on SH_DEVICE_TREE && (CPU_SH2 || CPU_J2) ++ select SH_DEVICE_TREE + select CLKSRC_JCORE_PIT + select JCORE_AIC +- default y if CPU_J2 ++ depends on CPU_J2 + help + Select this option to include drivers core components of the + J-Core SoC, including interrupt controllers and timers. +diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h +index c28e37a344ad..ac0561960c52 100644 +--- a/arch/sh/include/asm/io.h ++++ b/arch/sh/include/asm/io.h +@@ -369,7 +369,11 @@ static inline int iounmap_fixed(void __iomem *addr) { return -EINVAL; } + + #define ioremap_nocache ioremap + #define ioremap_uc ioremap +-#define iounmap __iounmap ++ ++static inline void iounmap(void __iomem *addr) ++{ ++ __iounmap(addr); ++} + + /* + * Convert a physical pointer to a virtual kernel pointer for /dev/mem +diff --git a/arch/sh/kernel/hw_breakpoint.c b/arch/sh/kernel/hw_breakpoint.c +index bc96b16288c1..af6a65ac04cf 100644 +--- a/arch/sh/kernel/hw_breakpoint.c ++++ b/arch/sh/kernel/hw_breakpoint.c +@@ -157,6 +157,7 @@ int arch_bp_generic_fields(int sh_len, int sh_type, + switch (sh_type) { + case SH_BREAKPOINT_READ: + *gen_type = HW_BREAKPOINT_R; ++ break; + case SH_BREAKPOINT_WRITE: + *gen_type = HW_BREAKPOINT_W; + break; +diff --git a/arch/um/include/asm/mmu_context.h b/arch/um/include/asm/mmu_context.h +index 9f4b4bb78120..00cefd33afdd 100644 +--- a/arch/um/include/asm/mmu_context.h ++++ b/arch/um/include/asm/mmu_context.h +@@ -52,7 +52,7 @@ static inline void activate_mm(struct mm_struct *old, struct mm_struct *new) + * when the new ->mm is used for the first time. + */ + __switch_mm(&new->context.id); +- down_write(&new->mmap_sem); ++ down_write_nested(&new->mmap_sem, 1); + uml_setup_stubs(new); + up_write(&new->mmap_sem); + } +diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig +index 2bbbd4d1ba31..ce84e791706e 100644 +--- a/arch/x86/Kconfig ++++ b/arch/x86/Kconfig +@@ -1007,6 +1007,22 @@ config NR_CPUS + config SCHED_SMT + def_bool y if SMP + ++config SMT_NICE ++ bool "SMT (Hyperthreading) aware nice priority and policy support" ++ depends on SCHED_MUQSS && SCHED_SMT ++ default y ++ ---help--- ++ Enabling Hyperthreading on Intel CPUs decreases the effectiveness ++ of the use of 'nice' levels and different scheduling policies ++ (e.g. realtime) due to sharing of CPU power between hyperthreads. ++ SMT nice support makes each logical CPU aware of what is running on ++ its hyperthread siblings, maintaining appropriate distribution of ++ CPU according to nice levels and scheduling policies at the expense ++ of slightly increased overhead. ++ ++ If unsure say Y here. ++ ++ + config SCHED_MC + def_bool y + prompt "Multi-core scheduler support" +@@ -1037,6 +1053,8 @@ config SCHED_MC_PRIO + + If unsure say Y here. + ++source "kernel/Kconfig.MuQSS" ++ + config UP_LATE_INIT + def_bool y + depends on !SMP && X86_LOCAL_APIC +diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu +index 6adce15268bd..f8612b07d32f 100644 +--- a/arch/x86/Kconfig.cpu ++++ b/arch/x86/Kconfig.cpu +@@ -116,6 +116,7 @@ config MPENTIUMM + config MPENTIUM4 + bool "Pentium-4/Celeron(P4-based)/Pentium-4 M/older Xeon" + depends on X86_32 ++ select X86_P6_NOP + ---help--- + Select this for Intel Pentium 4 chips. This includes the + Pentium 4, Pentium D, P4-based Celeron and Xeon, and +@@ -148,9 +149,8 @@ config MPENTIUM4 + -Paxville + -Dempsey + +- + config MK6 +- bool "K6/K6-II/K6-III" ++ bool "AMD K6/K6-II/K6-III" + depends on X86_32 + ---help--- + Select this for an AMD K6-family processor. Enables use of +@@ -158,7 +158,7 @@ config MK6 + flags to GCC. + + config MK7 +- bool "Athlon/Duron/K7" ++ bool "AMD Athlon/Duron/K7" + depends on X86_32 + ---help--- + Select this for an AMD Athlon K7-family processor. Enables use of +@@ -166,12 +166,83 @@ config MK7 + flags to GCC. + + config MK8 +- bool "Opteron/Athlon64/Hammer/K8" ++ bool "AMD Opteron/Athlon64/Hammer/K8" + ---help--- + Select this for an AMD Opteron or Athlon64 Hammer-family processor. + Enables use of some extended instructions, and passes appropriate + optimization flags to GCC. + ++config MK8SSE3 ++ bool "AMD Opteron/Athlon64/Hammer/K8 with SSE3" ++ ---help--- ++ Select this for improved AMD Opteron or Athlon64 Hammer-family processors. ++ Enables use of some extended instructions, and passes appropriate ++ optimization flags to GCC. ++ ++config MK10 ++ bool "AMD 61xx/7x50/PhenomX3/X4/II/K10" ++ ---help--- ++ Select this for an AMD 61xx Eight-Core Magny-Cours, Athlon X2 7x50, ++ Phenom X3/X4/II, Athlon II X2/X3/X4, or Turion II-family processor. ++ Enables use of some extended instructions, and passes appropriate ++ optimization flags to GCC. ++ ++config MBARCELONA ++ bool "AMD Barcelona" ++ ---help--- ++ Select this for AMD Family 10h Barcelona processors. ++ ++ Enables -march=barcelona ++ ++config MBOBCAT ++ bool "AMD Bobcat" ++ ---help--- ++ Select this for AMD Family 14h Bobcat processors. ++ ++ Enables -march=btver1 ++ ++config MJAGUAR ++ bool "AMD Jaguar" ++ ---help--- ++ Select this for AMD Family 16h Jaguar processors. ++ ++ Enables -march=btver2 ++ ++config MBULLDOZER ++ bool "AMD Bulldozer" ++ ---help--- ++ Select this for AMD Family 15h Bulldozer processors. ++ ++ Enables -march=bdver1 ++ ++config MPILEDRIVER ++ bool "AMD Piledriver" ++ ---help--- ++ Select this for AMD Family 15h Piledriver processors. ++ ++ Enables -march=bdver2 ++ ++config MSTEAMROLLER ++ bool "AMD Steamroller" ++ ---help--- ++ Select this for AMD Family 15h Steamroller processors. ++ ++ Enables -march=bdver3 ++ ++config MEXCAVATOR ++ bool "AMD Excavator" ++ ---help--- ++ Select this for AMD Family 15h Excavator processors. ++ ++ Enables -march=bdver4 ++ ++config MZEN ++ bool "AMD Zen" ++ ---help--- ++ Select this for AMD Family 17h Zen processors. ++ ++ Enables -march=znver1 ++ + config MCRUSOE + bool "Crusoe" + depends on X86_32 +@@ -253,6 +324,7 @@ config MVIAC7 + + config MPSC + bool "Intel P4 / older Netburst based Xeon" ++ select X86_P6_NOP + depends on X86_64 + ---help--- + Optimize for Intel Pentium 4, Pentium D and older Nocona/Dempsey +@@ -262,8 +334,19 @@ config MPSC + using the cpu family field + in /proc/cpuinfo. Family 15 is an older Xeon, Family 6 a newer one. + ++config MATOM ++ bool "Intel Atom" ++ select X86_P6_NOP ++ ---help--- ++ ++ Select this for the Intel Atom platform. Intel Atom CPUs have an ++ in-order pipelining architecture and thus can benefit from ++ accordingly optimized code. Use a recent GCC with specific Atom ++ support in order to fully benefit from selecting this option. ++ + config MCORE2 +- bool "Core 2/newer Xeon" ++ bool "Intel Core 2" ++ select X86_P6_NOP + ---help--- + + Select this for Intel Core 2 and newer Core 2 Xeons (Xeon 51xx and +@@ -271,14 +354,106 @@ config MCORE2 + family in /proc/cpuinfo. Newer ones have 6 and older ones 15 + (not a typo) + +-config MATOM +- bool "Intel Atom" ++ Enables -march=core2 ++ ++config MNEHALEM ++ bool "Intel Nehalem" ++ select X86_P6_NOP + ---help--- + +- Select this for the Intel Atom platform. Intel Atom CPUs have an +- in-order pipelining architecture and thus can benefit from +- accordingly optimized code. Use a recent GCC with specific Atom +- support in order to fully benefit from selecting this option. ++ Select this for 1st Gen Core processors in the Nehalem family. ++ ++ Enables -march=nehalem ++ ++config MWESTMERE ++ bool "Intel Westmere" ++ select X86_P6_NOP ++ ---help--- ++ ++ Select this for the Intel Westmere formerly Nehalem-C family. ++ ++ Enables -march=westmere ++ ++config MSILVERMONT ++ bool "Intel Silvermont" ++ select X86_P6_NOP ++ ---help--- ++ ++ Select this for the Intel Silvermont platform. ++ ++ Enables -march=silvermont ++ ++config MSANDYBRIDGE ++ bool "Intel Sandy Bridge" ++ select X86_P6_NOP ++ ---help--- ++ ++ Select this for 2nd Gen Core processors in the Sandy Bridge family. ++ ++ Enables -march=sandybridge ++ ++config MIVYBRIDGE ++ bool "Intel Ivy Bridge" ++ select X86_P6_NOP ++ ---help--- ++ ++ Select this for 3rd Gen Core processors in the Ivy Bridge family. ++ ++ Enables -march=ivybridge ++ ++config MHASWELL ++ bool "Intel Haswell" ++ select X86_P6_NOP ++ ---help--- ++ ++ Select this for 4th Gen Core processors in the Haswell family. ++ ++ Enables -march=haswell ++ ++config MBROADWELL ++ bool "Intel Broadwell" ++ select X86_P6_NOP ++ ---help--- ++ ++ Select this for 5th Gen Core processors in the Broadwell family. ++ ++ Enables -march=broadwell ++ ++config MSKYLAKE ++ bool "Intel Skylake" ++ select X86_P6_NOP ++ ---help--- ++ ++ Select this for 6th Gen Core processors in the Skylake family. ++ ++ Enables -march=skylake ++ ++config MSKYLAKEX ++ bool "Intel Skylake X" ++ select X86_P6_NOP ++ ---help--- ++ ++ Select this for 6th Gen Core processors in the Skylake X family. ++ ++ Enables -march=skylake-avx512 ++ ++config MCANNONLAKE ++ bool "Intel Cannon Lake" ++ select X86_P6_NOP ++ ---help--- ++ ++ Select this for 8th Gen Core processors ++ ++ Enables -march=cannonlake ++ ++config MICELAKE ++ bool "Intel Ice Lake" ++ select X86_P6_NOP ++ ---help--- ++ ++ Select this for 8th Gen Core processors in the Ice Lake family. ++ ++ Enables -march=icelake + + config GENERIC_CPU + bool "Generic-x86-64" +@@ -287,6 +462,19 @@ config GENERIC_CPU + Generic x86-64 CPU. + Run equally well on all x86-64 CPUs. + ++config MNATIVE ++ bool "Native optimizations autodetected by GCC" ++ ---help--- ++ ++ GCC 4.2 and above support -march=native, which automatically detects ++ the optimum settings to use based on your processor. -march=native ++ also detects and applies additional settings beyond -march specific ++ to your CPU, (eg. -msse4). Unless you have a specific reason not to ++ (e.g. distcc cross-compiling), you should probably be using ++ -march=native rather than anything listed below. ++ ++ Enables -march=native ++ + endchoice + + config X86_GENERIC +@@ -311,7 +499,7 @@ config X86_INTERNODE_CACHE_SHIFT + config X86_L1_CACHE_SHIFT + int + default "7" if MPENTIUM4 || MPSC +- default "6" if MK7 || MK8 || MPENTIUMM || MCORE2 || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU ++ default "6" if MK7 || MK8 || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MJAGUAR || MPENTIUMM || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MNATIVE || MATOM || MVIAC7 || X86_GENERIC || GENERIC_CPU + default "4" if MELAN || M486 || MGEODEGX1 + default "5" if MWINCHIP3D || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE_LX + +@@ -329,35 +517,36 @@ config X86_ALIGNMENT_16 + + config X86_INTEL_USERCOPY + def_bool y +- depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK7 || MEFFICEON || MCORE2 ++ depends on MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M586MMX || X86_GENERIC || MK8 || MK8SSE3 || MK7 || MEFFICEON || MCORE2 || MK10 || MBARCELONA || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MNATIVE + + config X86_USE_PPRO_CHECKSUM + def_bool y +- depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MATOM ++ depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MK10 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MK8SSE3 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MATOM || MNATIVE + + config X86_USE_3DNOW + def_bool y + depends on (MCYRIXIII || MK7 || MGEODE_LX) && !UML + +-# +-# P6_NOPs are a relatively minor optimization that require a family >= +-# 6 processor, except that it is broken on certain VIA chips. +-# Furthermore, AMD chips prefer a totally different sequence of NOPs +-# (which work on all CPUs). In addition, it looks like Virtual PC +-# does not understand them. +-# +-# As a result, disallow these if we're not compiling for X86_64 (these +-# NOPs do work on all x86-64 capable chips); the list of processors in +-# the right-hand clause are the cores that benefit from this optimization. +-# + config X86_P6_NOP +- def_bool y +- depends on X86_64 +- depends on (MCORE2 || MPENTIUM4 || MPSC) ++ default n ++ bool "Support for P6_NOPs on Intel chips" ++ depends on (MCORE2 || MPENTIUM4 || MPSC || MATOM || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MNATIVE) ++ ---help--- ++ P6_NOPs are a relatively minor optimization that require a family >= ++ 6 processor, except that it is broken on certain VIA chips. ++ Furthermore, AMD chips prefer a totally different sequence of NOPs ++ (which work on all CPUs). In addition, it looks like Virtual PC ++ does not understand them. ++ ++ As a result, disallow these if we're not compiling for X86_64 (these ++ NOPs do work on all x86-64 capable chips); the list of processors in ++ the right-hand clause are the cores that benefit from this optimization. ++ ++ Say Y if you have Intel CPU newer than Pentium Pro, N otherwise. + + config X86_TSC + def_bool y +- depends on (MWINCHIP3D || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2 || MATOM) || X86_64 ++ depends on (MWINCHIP3D || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MK8SSE3 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MNATIVE || MATOM) || X86_64 + + config X86_CMPXCHG64 + def_bool y +@@ -367,7 +556,7 @@ config X86_CMPXCHG64 + # generates cmov. + config X86_CMOV + def_bool y +- depends on (MK8 || MK7 || MCORE2 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MATOM || MGEODE_LX) ++ depends on (MK8 || MK8SSE3 || MK10 || MBARCELONA || MBOBCAT || MBULLDOZER || MPILEDRIVER || MSTEAMROLLER || MEXCAVATOR || MZEN || MJAGUAR || MK7 || MCORE2 || MNEHALEM || MWESTMERE || MSILVERMONT || MSANDYBRIDGE || MIVYBRIDGE || MHASWELL || MBROADWELL || MSKYLAKE || MSKYLAKEX || MCANNONLAKE || MICELAKE || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MVIAC3_2 || MVIAC7 || MCRUSOE || MEFFICEON || X86_64 || MNATIVE || MATOM || MGEODE_LX) + + config X86_MINIMUM_CPU_FAMILY + int +diff --git a/arch/x86/Makefile b/arch/x86/Makefile +index 56e748a7679f..29eb64851528 100644 +--- a/arch/x86/Makefile ++++ b/arch/x86/Makefile +@@ -118,13 +118,46 @@ else + KBUILD_CFLAGS += $(call cc-option,-mskip-rax-setup) + + # FIXME - should be integrated in Makefile.cpu (Makefile_32.cpu) ++ cflags-$(CONFIG_MNATIVE) += $(call cc-option,-march=native) + cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8) ++ cflags-$(CONFIG_MK8SSE3) += $(call cc-option,-march=k8-sse3,-mtune=k8) ++ cflags-$(CONFIG_MK10) += $(call cc-option,-march=amdfam10) ++ cflags-$(CONFIG_MBARCELONA) += $(call cc-option,-march=barcelona) ++ cflags-$(CONFIG_MBOBCAT) += $(call cc-option,-march=btver1) ++ cflags-$(CONFIG_MJAGUAR) += $(call cc-option,-march=btver2) ++ cflags-$(CONFIG_MBULLDOZER) += $(call cc-option,-march=bdver1) ++ cflags-$(CONFIG_MPILEDRIVER) += $(call cc-option,-march=bdver2) ++ cflags-$(CONFIG_MSTEAMROLLER) += $(call cc-option,-march=bdver3) ++ cflags-$(CONFIG_MEXCAVATOR) += $(call cc-option,-march=bdver4) ++ cflags-$(CONFIG_MZEN) += $(call cc-option,-march=znver1) + cflags-$(CONFIG_MPSC) += $(call cc-option,-march=nocona) + + cflags-$(CONFIG_MCORE2) += \ +- $(call cc-option,-march=core2,$(call cc-option,-mtune=generic)) +- cflags-$(CONFIG_MATOM) += $(call cc-option,-march=atom) \ +- $(call cc-option,-mtune=atom,$(call cc-option,-mtune=generic)) ++ $(call cc-option,-march=core2,$(call cc-option,-mtune=core2)) ++ cflags-$(CONFIG_MNEHALEM) += \ ++ $(call cc-option,-march=nehalem,$(call cc-option,-mtune=nehalem)) ++ cflags-$(CONFIG_MWESTMERE) += \ ++ $(call cc-option,-march=westmere,$(call cc-option,-mtune=westmere)) ++ cflags-$(CONFIG_MSILVERMONT) += \ ++ $(call cc-option,-march=silvermont,$(call cc-option,-mtune=silvermont)) ++ cflags-$(CONFIG_MSANDYBRIDGE) += \ ++ $(call cc-option,-march=sandybridge,$(call cc-option,-mtune=sandybridge)) ++ cflags-$(CONFIG_MIVYBRIDGE) += \ ++ $(call cc-option,-march=ivybridge,$(call cc-option,-mtune=ivybridge)) ++ cflags-$(CONFIG_MHASWELL) += \ ++ $(call cc-option,-march=haswell,$(call cc-option,-mtune=haswell)) ++ cflags-$(CONFIG_MBROADWELL) += \ ++ $(call cc-option,-march=broadwell,$(call cc-option,-mtune=broadwell)) ++ cflags-$(CONFIG_MSKYLAKE) += \ ++ $(call cc-option,-march=skylake,$(call cc-option,-mtune=skylake)) ++ cflags-$(CONFIG_MSKYLAKEX) += \ ++ $(call cc-option,-march=skylake-avx512,$(call cc-option,-mtune=skylake-avx512)) ++ cflags-$(CONFIG_MCANNONLAKE) += \ ++ $(call cc-option,-march=cannonlake,$(call cc-option,-mtune=cannonlake)) ++ cflags-$(CONFIG_MICELAKE) += \ ++ $(call cc-option,-march=icelake,$(call cc-option,-mtune=icelake)) ++ cflags-$(CONFIG_MATOM) += $(call cc-option,-march=bonnell) \ ++ $(call cc-option,-mtune=bonnell,$(call cc-option,-mtune=generic)) + cflags-$(CONFIG_GENERIC_CPU) += $(call cc-option,-mtune=generic) + KBUILD_CFLAGS += $(cflags-y) + +diff --git a/arch/x86/Makefile_32.cpu b/arch/x86/Makefile_32.cpu +index 1f5faf8606b4..14a6d19995cc 100644 +--- a/arch/x86/Makefile_32.cpu ++++ b/arch/x86/Makefile_32.cpu +@@ -23,7 +23,18 @@ cflags-$(CONFIG_MK6) += -march=k6 + # Please note, that patches that add -march=athlon-xp and friends are pointless. + # They make zero difference whatsosever to performance at this time. + cflags-$(CONFIG_MK7) += -march=athlon ++cflags-$(CONFIG_MNATIVE) += $(call cc-option,-march=native) + cflags-$(CONFIG_MK8) += $(call cc-option,-march=k8,-march=athlon) ++cflags-$(CONFIG_MK8SSE3) += $(call cc-option,-march=k8-sse3,-march=athlon) ++cflags-$(CONFIG_MK10) += $(call cc-option,-march=amdfam10,-march=athlon) ++cflags-$(CONFIG_MBARCELONA) += $(call cc-option,-march=barcelona,-march=athlon) ++cflags-$(CONFIG_MBOBCAT) += $(call cc-option,-march=btver1,-march=athlon) ++cflags-$(CONFIG_MJAGUAR) += $(call cc-option,-march=btver2,-march=athlon) ++cflags-$(CONFIG_MBULLDOZER) += $(call cc-option,-march=bdver1,-march=athlon) ++cflags-$(CONFIG_MPILEDRIVER) += $(call cc-option,-march=bdver2,-march=athlon) ++cflags-$(CONFIG_MSTEAMROLLER) += $(call cc-option,-march=bdver3,-march=athlon) ++cflags-$(CONFIG_MEXCAVATOR) += $(call cc-option,-march=bdver4,-march=athlon) ++cflags-$(CONFIG_MZEN) += $(call cc-option,-march=znver1,-march=athlon) + cflags-$(CONFIG_MCRUSOE) += -march=i686 -falign-functions=0 -falign-jumps=0 -falign-loops=0 + cflags-$(CONFIG_MEFFICEON) += -march=i686 $(call tune,pentium3) -falign-functions=0 -falign-jumps=0 -falign-loops=0 + cflags-$(CONFIG_MWINCHIPC6) += $(call cc-option,-march=winchip-c6,-march=i586) +@@ -32,8 +43,19 @@ cflags-$(CONFIG_MCYRIXIII) += $(call cc-option,-march=c3,-march=i486) -falign-fu + cflags-$(CONFIG_MVIAC3_2) += $(call cc-option,-march=c3-2,-march=i686) + cflags-$(CONFIG_MVIAC7) += -march=i686 + cflags-$(CONFIG_MCORE2) += -march=i686 $(call tune,core2) +-cflags-$(CONFIG_MATOM) += $(call cc-option,-march=atom,$(call cc-option,-march=core2,-march=i686)) \ +- $(call cc-option,-mtune=atom,$(call cc-option,-mtune=generic)) ++cflags-$(CONFIG_MNEHALEM) += -march=i686 $(call tune,nehalem) ++cflags-$(CONFIG_MWESTMERE) += -march=i686 $(call tune,westmere) ++cflags-$(CONFIG_MSILVERMONT) += -march=i686 $(call tune,silvermont) ++cflags-$(CONFIG_MSANDYBRIDGE) += -march=i686 $(call tune,sandybridge) ++cflags-$(CONFIG_MIVYBRIDGE) += -march=i686 $(call tune,ivybridge) ++cflags-$(CONFIG_MHASWELL) += -march=i686 $(call tune,haswell) ++cflags-$(CONFIG_MBROADWELL) += -march=i686 $(call tune,broadwell) ++cflags-$(CONFIG_MSKYLAKE) += -march=i686 $(call tune,skylake) ++cflags-$(CONFIG_MSKYLAKEX) += -march=i686 $(call tune,skylake-avx512) ++cflags-$(CONFIG_MCANNONLAKE) += -march=i686 $(call tune,cannonlake) ++cflags-$(CONFIG_MICELAKE) += -march=i686 $(call tune,icelake) ++cflags-$(CONFIG_MATOM) += $(call cc-option,-march=bonnell,$(call cc-option,-march=core2,-march=i686)) \ ++ $(call cc-option,-mtune=bonnell,$(call cc-option,-mtune=generic)) + + # AMD Elan support + cflags-$(CONFIG_MELAN) += -march=i486 +diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c +index 5a237e8dbf8d..0de54a1d25c0 100644 +--- a/arch/x86/boot/compressed/misc.c ++++ b/arch/x86/boot/compressed/misc.c +@@ -17,6 +17,7 @@ + #include "pgtable.h" + #include "../string.h" + #include "../voffset.h" ++#include + + /* + * WARNING!! +diff --git a/arch/x86/boot/compressed/misc.h b/arch/x86/boot/compressed/misc.h +index d2f184165934..c8181392f70d 100644 +--- a/arch/x86/boot/compressed/misc.h ++++ b/arch/x86/boot/compressed/misc.h +@@ -23,7 +23,6 @@ + #include + #include + #include +-#include + + #define BOOT_CTYPE_H + #include +diff --git a/arch/x86/boot/string.c b/arch/x86/boot/string.c +index 401e30ca0a75..8272a4492844 100644 +--- a/arch/x86/boot/string.c ++++ b/arch/x86/boot/string.c +@@ -37,6 +37,14 @@ int memcmp(const void *s1, const void *s2, size_t len) + return diff; + } + ++/* ++ * Clang may lower `memcmp == 0` to `bcmp == 0`. ++ */ ++int bcmp(const void *s1, const void *s2, size_t len) ++{ ++ return memcmp(s1, s2, len); ++} ++ + int strcmp(const char *str1, const char *str2) + { + const unsigned char *s1 = (const unsigned char *)str1; +diff --git a/arch/x86/entry/calling.h b/arch/x86/entry/calling.h +index efb0d1b1f15f..d6f2e29be3e2 100644 +--- a/arch/x86/entry/calling.h ++++ b/arch/x86/entry/calling.h +@@ -329,6 +329,23 @@ For 32-bit we have the following conventions - kernel is built with + + #endif + ++/* ++ * Mitigate Spectre v1 for conditional swapgs code paths. ++ * ++ * FENCE_SWAPGS_USER_ENTRY is used in the user entry swapgs code path, to ++ * prevent a speculative swapgs when coming from kernel space. ++ * ++ * FENCE_SWAPGS_KERNEL_ENTRY is used in the kernel entry non-swapgs code path, ++ * to prevent the swapgs from getting speculatively skipped when coming from ++ * user space. ++ */ ++.macro FENCE_SWAPGS_USER_ENTRY ++ ALTERNATIVE "", "lfence", X86_FEATURE_FENCE_SWAPGS_USER ++.endm ++.macro FENCE_SWAPGS_KERNEL_ENTRY ++ ALTERNATIVE "", "lfence", X86_FEATURE_FENCE_SWAPGS_KERNEL ++.endm ++ + .macro STACKLEAK_ERASE_NOCLOBBER + #ifdef CONFIG_GCC_PLUGIN_STACKLEAK + PUSH_AND_CLEAR_REGS +diff --git a/arch/x86/entry/entry_32.S b/arch/x86/entry/entry_32.S +index 7b23431be5cb..f49e11669271 100644 +--- a/arch/x86/entry/entry_32.S ++++ b/arch/x86/entry/entry_32.S +@@ -1104,6 +1104,30 @@ ENTRY(irq_entries_start) + .endr + END(irq_entries_start) + ++#ifdef CONFIG_X86_LOCAL_APIC ++ .align 8 ++ENTRY(spurious_entries_start) ++ vector=FIRST_SYSTEM_VECTOR ++ .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR) ++ pushl $(~vector+0x80) /* Note: always in signed byte range */ ++ vector=vector+1 ++ jmp common_spurious ++ .align 8 ++ .endr ++END(spurious_entries_start) ++ ++common_spurious: ++ ASM_CLAC ++ addl $-0x80, (%esp) /* Adjust vector into the [-256, -1] range */ ++ SAVE_ALL switch_stacks=1 ++ ENCODE_FRAME_POINTER ++ TRACE_IRQS_OFF ++ movl %esp, %eax ++ call smp_spurious_interrupt ++ jmp ret_from_intr ++ENDPROC(common_spurious) ++#endif ++ + /* + * the CPU automatically disables interrupts when executing an IRQ vector, + * so IRQ-flags tracing has to follow that: +diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S +index 11aa3b2afa4d..69808aaa6851 100644 +--- a/arch/x86/entry/entry_64.S ++++ b/arch/x86/entry/entry_64.S +@@ -375,6 +375,18 @@ ENTRY(irq_entries_start) + .endr + END(irq_entries_start) + ++ .align 8 ++ENTRY(spurious_entries_start) ++ vector=FIRST_SYSTEM_VECTOR ++ .rept (NR_VECTORS - FIRST_SYSTEM_VECTOR) ++ UNWIND_HINT_IRET_REGS ++ pushq $(~vector+0x80) /* Note: always in signed byte range */ ++ jmp common_spurious ++ .align 8 ++ vector=vector+1 ++ .endr ++END(spurious_entries_start) ++ + .macro DEBUG_ENTRY_ASSERT_IRQS_OFF + #ifdef CONFIG_DEBUG_ENTRY + pushq %rax +@@ -507,7 +519,7 @@ ENTRY(interrupt_entry) + testb $3, CS-ORIG_RAX+8(%rsp) + jz 1f + SWAPGS +- ++ FENCE_SWAPGS_USER_ENTRY + /* + * Switch to the thread stack. The IRET frame and orig_ax are + * on the stack, as well as the return address. RDI..R12 are +@@ -537,8 +549,10 @@ ENTRY(interrupt_entry) + UNWIND_HINT_FUNC + + movq (%rdi), %rdi ++ jmp 2f + 1: +- ++ FENCE_SWAPGS_KERNEL_ENTRY ++2: + PUSH_AND_CLEAR_REGS save_ret=1 + ENCODE_FRAME_POINTER 8 + +@@ -571,10 +585,20 @@ _ASM_NOKPROBE(interrupt_entry) + + /* Interrupt entry/exit. */ + +- /* +- * The interrupt stubs push (~vector+0x80) onto the stack and +- * then jump to common_interrupt. +- */ ++/* ++ * The interrupt stubs push (~vector+0x80) onto the stack and ++ * then jump to common_spurious/interrupt. ++ */ ++common_spurious: ++ addq $-0x80, (%rsp) /* Adjust vector to [-256, -1] range */ ++ call interrupt_entry ++ UNWIND_HINT_REGS indirect=1 ++ call smp_spurious_interrupt /* rdi points to pt_regs */ ++ jmp ret_from_intr ++END(common_spurious) ++_ASM_NOKPROBE(common_spurious) ++ ++/* common_interrupt is a hotpath. Align it */ + .p2align CONFIG_X86_L1_CACHE_SHIFT + common_interrupt: + addq $-0x80, (%rsp) /* Adjust vector to [-256, -1] range */ +@@ -1149,7 +1173,6 @@ idtentry stack_segment do_stack_segment has_error_code=1 + #ifdef CONFIG_XEN_PV + idtentry xennmi do_nmi has_error_code=0 + idtentry xendebug do_debug has_error_code=0 +-idtentry xenint3 do_int3 has_error_code=0 + #endif + + idtentry general_protection do_general_protection has_error_code=1 +@@ -1194,6 +1217,13 @@ ENTRY(paranoid_entry) + */ + SAVE_AND_SWITCH_TO_KERNEL_CR3 scratch_reg=%rax save_reg=%r14 + ++ /* ++ * The above SAVE_AND_SWITCH_TO_KERNEL_CR3 macro doesn't do an ++ * unconditional CR3 write, even in the PTI case. So do an lfence ++ * to prevent GS speculation, regardless of whether PTI is enabled. ++ */ ++ FENCE_SWAPGS_KERNEL_ENTRY ++ + ret + END(paranoid_entry) + +@@ -1244,6 +1274,7 @@ ENTRY(error_entry) + * from user mode due to an IRET fault. + */ + SWAPGS ++ FENCE_SWAPGS_USER_ENTRY + /* We have user CR3. Change to kernel CR3. */ + SWITCH_TO_KERNEL_CR3 scratch_reg=%rax + +@@ -1265,6 +1296,8 @@ ENTRY(error_entry) + CALL_enter_from_user_mode + ret + ++.Lerror_entry_done_lfence: ++ FENCE_SWAPGS_KERNEL_ENTRY + .Lerror_entry_done: + TRACE_IRQS_OFF + ret +@@ -1283,7 +1316,7 @@ ENTRY(error_entry) + cmpq %rax, RIP+8(%rsp) + je .Lbstep_iret + cmpq $.Lgs_change, RIP+8(%rsp) +- jne .Lerror_entry_done ++ jne .Lerror_entry_done_lfence + + /* + * hack: .Lgs_change can fail with user gsbase. If this happens, fix up +@@ -1291,6 +1324,7 @@ ENTRY(error_entry) + * .Lgs_change's error handler with kernel gsbase. + */ + SWAPGS ++ FENCE_SWAPGS_USER_ENTRY + SWITCH_TO_KERNEL_CR3 scratch_reg=%rax + jmp .Lerror_entry_done + +@@ -1305,6 +1339,7 @@ ENTRY(error_entry) + * gsbase and CR3. Switch to kernel gsbase and CR3: + */ + SWAPGS ++ FENCE_SWAPGS_USER_ENTRY + SWITCH_TO_KERNEL_CR3 scratch_reg=%rax + + /* +@@ -1396,6 +1431,7 @@ ENTRY(nmi) + + swapgs + cld ++ FENCE_SWAPGS_USER_ENTRY + SWITCH_TO_KERNEL_CR3 scratch_reg=%rdx + movq %rsp, %rdx + movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp +diff --git a/arch/x86/events/amd/uncore.c b/arch/x86/events/amd/uncore.c +index 85e6984c560b..a6ea07f2aa84 100644 +--- a/arch/x86/events/amd/uncore.c ++++ b/arch/x86/events/amd/uncore.c +@@ -202,15 +202,22 @@ static int amd_uncore_event_init(struct perf_event *event) + hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB; + hwc->idx = -1; + ++ if (event->cpu < 0) ++ return -EINVAL; ++ + /* + * SliceMask and ThreadMask need to be set for certain L3 events in + * Family 17h. For other events, the two fields do not affect the count. + */ +- if (l3_mask) +- hwc->config |= (AMD64_L3_SLICE_MASK | AMD64_L3_THREAD_MASK); ++ if (l3_mask && is_llc_event(event)) { ++ int thread = 2 * (cpu_data(event->cpu).cpu_core_id % 4); + +- if (event->cpu < 0) +- return -EINVAL; ++ if (smp_num_siblings > 1) ++ thread += cpu_data(event->cpu).apicid & 1; ++ ++ hwc->config |= (1ULL << (AMD64_L3_THREAD_SHIFT + thread) & ++ AMD64_L3_THREAD_MASK) | AMD64_L3_SLICE_MASK; ++ } + + uncore = event_to_amd_uncore(event); + if (!uncore) +diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c +index a5436cee20b1..6179be624f35 100644 +--- a/arch/x86/events/intel/core.c ++++ b/arch/x86/events/intel/core.c +@@ -262,8 +262,8 @@ static struct event_constraint intel_icl_event_constraints[] = { + }; + + static struct extra_reg intel_icl_extra_regs[] __read_mostly = { +- INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x3fffff9fffull, RSP_0), +- INTEL_UEVENT_EXTRA_REG(0x01bb, MSR_OFFCORE_RSP_1, 0x3fffff9fffull, RSP_1), ++ INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x3fffffbfffull, RSP_0), ++ INTEL_UEVENT_EXTRA_REG(0x01bb, MSR_OFFCORE_RSP_1, 0x3fffffbfffull, RSP_1), + INTEL_UEVENT_PEBS_LDLAT_EXTRA_REG(0x01cd), + INTEL_UEVENT_EXTRA_REG(0x01c6, MSR_PEBS_FRONTEND, 0x7fff17, FE), + EVENT_EXTRA_END +@@ -2160,12 +2160,10 @@ static void intel_pmu_disable_event(struct perf_event *event) + cpuc->intel_ctrl_host_mask &= ~(1ull << hwc->idx); + cpuc->intel_cp_status &= ~(1ull << hwc->idx); + +- if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) { ++ if (unlikely(hwc->config_base == MSR_ARCH_PERFMON_FIXED_CTR_CTRL)) + intel_pmu_disable_fixed(hwc); +- return; +- } +- +- x86_pmu_disable_event(event); ++ else ++ x86_pmu_disable_event(event); + + /* + * Needs to be called after x86_pmu_disable_event, +@@ -4054,6 +4052,13 @@ static bool check_msr(unsigned long msr, u64 mask) + { + u64 val_old, val_new, val_tmp; + ++ /* ++ * Disable the check for real HW, so we don't ++ * mess with potentionaly enabled registers: ++ */ ++ if (!boot_cpu_has(X86_FEATURE_HYPERVISOR)) ++ return true; ++ + /* + * Read the current value, change it and read it back to see if it + * matches, this is needed to detect certain hardware emulators +@@ -4439,6 +4444,7 @@ __init int intel_pmu_init(void) + struct event_constraint *c; + unsigned int unused; + struct extra_reg *er; ++ bool pmem = false; + int version, i; + char *name; + +@@ -4890,9 +4896,10 @@ __init int intel_pmu_init(void) + name = "knights-landing"; + break; + ++ case INTEL_FAM6_SKYLAKE_X: ++ pmem = true; + case INTEL_FAM6_SKYLAKE_MOBILE: + case INTEL_FAM6_SKYLAKE_DESKTOP: +- case INTEL_FAM6_SKYLAKE_X: + case INTEL_FAM6_KABYLAKE_MOBILE: + case INTEL_FAM6_KABYLAKE_DESKTOP: + x86_add_quirk(intel_pebs_isolation_quirk); +@@ -4925,8 +4932,7 @@ __init int intel_pmu_init(void) + x86_pmu.cpu_events = hsw_events_attrs; + mem_attr = hsw_mem_events_attrs; + tsx_attr = hsw_tsx_events_attrs; +- intel_pmu_pebs_data_source_skl( +- boot_cpu_data.x86_model == INTEL_FAM6_SKYLAKE_X); ++ intel_pmu_pebs_data_source_skl(pmem); + + if (boot_cpu_has(X86_FEATURE_TSX_FORCE_ABORT)) { + x86_pmu.flags |= PMU_FL_TFA; +@@ -4940,7 +4946,11 @@ __init int intel_pmu_init(void) + name = "skylake"; + break; + ++ case INTEL_FAM6_ICELAKE_X: ++ case INTEL_FAM6_ICELAKE_XEON_D: ++ pmem = true; + case INTEL_FAM6_ICELAKE_MOBILE: ++ case INTEL_FAM6_ICELAKE_DESKTOP: + x86_pmu.late_ack = true; + memcpy(hw_cache_event_ids, skl_hw_cache_event_ids, sizeof(hw_cache_event_ids)); + memcpy(hw_cache_extra_regs, skl_hw_cache_extra_regs, sizeof(hw_cache_extra_regs)); +@@ -4963,7 +4973,7 @@ __init int intel_pmu_init(void) + x86_pmu.cpu_events = get_icl_events_attrs(); + x86_pmu.rtm_abort_event = X86_CONFIG(.event=0xca, .umask=0x02); + x86_pmu.lbr_pt_coexist = true; +- intel_pmu_pebs_data_source_skl(false); ++ intel_pmu_pebs_data_source_skl(pmem); + pr_cont("Icelake events, "); + name = "icelake"; + break; +diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c +index 505c73dc6a73..6601b8759c92 100644 +--- a/arch/x86/events/intel/ds.c ++++ b/arch/x86/events/intel/ds.c +@@ -851,7 +851,7 @@ struct event_constraint intel_skl_pebs_event_constraints[] = { + + struct event_constraint intel_icl_pebs_event_constraints[] = { + INTEL_FLAGS_UEVENT_CONSTRAINT(0x1c0, 0x100000000ULL), /* INST_RETIRED.PREC_DIST */ +- INTEL_FLAGS_UEVENT_CONSTRAINT(0x0400, 0x400000000ULL), /* SLOTS */ ++ INTEL_FLAGS_UEVENT_CONSTRAINT(0x0400, 0x800000000ULL), /* SLOTS */ + + INTEL_PLD_CONSTRAINT(0x1cd, 0xff), /* MEM_TRANS_RETIRED.LOAD_LATENCY */ + INTEL_FLAGS_UEVENT_CONSTRAINT_DATALA_LD(0x1d0, 0xf), /* MEM_INST_RETIRED.LOAD */ +diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c +index 9e3fbd47cb56..089bfcdf2f7f 100644 +--- a/arch/x86/events/intel/uncore.c ++++ b/arch/x86/events/intel/uncore.c +@@ -1400,6 +1400,7 @@ static const struct x86_cpu_id intel_uncore_match[] __initconst = { + X86_UNCORE_MODEL_MATCH(INTEL_FAM6_KABYLAKE_MOBILE, skl_uncore_init), + X86_UNCORE_MODEL_MATCH(INTEL_FAM6_KABYLAKE_DESKTOP, skl_uncore_init), + X86_UNCORE_MODEL_MATCH(INTEL_FAM6_ICELAKE_MOBILE, icl_uncore_init), ++ X86_UNCORE_MODEL_MATCH(INTEL_FAM6_ICELAKE_NNPI, icl_uncore_init), + {}, + }; + +diff --git a/arch/x86/events/intel/uncore.h b/arch/x86/events/intel/uncore.h +index 79eb2e21e4f0..28499e39679f 100644 +--- a/arch/x86/events/intel/uncore.h ++++ b/arch/x86/events/intel/uncore.h +@@ -419,6 +419,16 @@ static inline bool is_freerunning_event(struct perf_event *event) + (((cfg >> 8) & 0xff) >= UNCORE_FREERUNNING_UMASK_START); + } + ++/* Check and reject invalid config */ ++static inline int uncore_freerunning_hw_config(struct intel_uncore_box *box, ++ struct perf_event *event) ++{ ++ if (is_freerunning_event(event)) ++ return 0; ++ ++ return -EINVAL; ++} ++ + static inline void uncore_disable_box(struct intel_uncore_box *box) + { + if (box->pmu->type->ops->disable_box) +diff --git a/arch/x86/events/intel/uncore_snbep.c b/arch/x86/events/intel/uncore_snbep.c +index b10e04387f38..8e4e8e423839 100644 +--- a/arch/x86/events/intel/uncore_snbep.c ++++ b/arch/x86/events/intel/uncore_snbep.c +@@ -3585,6 +3585,7 @@ static struct uncore_event_desc skx_uncore_iio_freerunning_events[] = { + + static struct intel_uncore_ops skx_uncore_iio_freerunning_ops = { + .read_counter = uncore_msr_read_counter, ++ .hw_config = uncore_freerunning_hw_config, + }; + + static struct attribute *skx_uncore_iio_freerunning_formats_attr[] = { +diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c +index 1608050e9df9..dd92d8b438d4 100644 +--- a/arch/x86/hyperv/hv_init.c ++++ b/arch/x86/hyperv/hv_init.c +@@ -111,8 +111,17 @@ static int hv_cpu_init(unsigned int cpu) + if (!hv_vp_assist_page) + return 0; + +- if (!*hvp) +- *hvp = __vmalloc(PAGE_SIZE, GFP_KERNEL, PAGE_KERNEL); ++ /* ++ * The VP ASSIST PAGE is an "overlay" page (see Hyper-V TLFS's Section ++ * 5.2.1 "GPA Overlay Pages"). Here it must be zeroed out to make sure ++ * we always write the EOI MSR in hv_apic_eoi_write() *after* the ++ * EOI optimization is disabled in hv_cpu_die(), otherwise a CPU may ++ * not be stopped in the case of CPU offlining and the VM will hang. ++ */ ++ if (!*hvp) { ++ *hvp = __vmalloc(PAGE_SIZE, GFP_KERNEL | __GFP_ZERO, ++ PAGE_KERNEL); ++ } + + if (*hvp) { + u64 val; +diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h +index 1340fa53b575..2e599384abd8 100644 +--- a/arch/x86/include/asm/apic.h ++++ b/arch/x86/include/asm/apic.h +@@ -49,7 +49,7 @@ static inline void generic_apic_probe(void) + + #ifdef CONFIG_X86_LOCAL_APIC + +-extern unsigned int apic_verbosity; ++extern int apic_verbosity; + extern int local_apic_timer_c2_ok; + + extern int disable_apic; +diff --git a/arch/x86/include/asm/atomic.h b/arch/x86/include/asm/atomic.h +index ea3d95275b43..115127c7ad28 100644 +--- a/arch/x86/include/asm/atomic.h ++++ b/arch/x86/include/asm/atomic.h +@@ -54,7 +54,7 @@ static __always_inline void arch_atomic_add(int i, atomic_t *v) + { + asm volatile(LOCK_PREFIX "addl %1,%0" + : "+m" (v->counter) +- : "ir" (i)); ++ : "ir" (i) : "memory"); + } + + /** +@@ -68,7 +68,7 @@ static __always_inline void arch_atomic_sub(int i, atomic_t *v) + { + asm volatile(LOCK_PREFIX "subl %1,%0" + : "+m" (v->counter) +- : "ir" (i)); ++ : "ir" (i) : "memory"); + } + + /** +@@ -95,7 +95,7 @@ static __always_inline bool arch_atomic_sub_and_test(int i, atomic_t *v) + static __always_inline void arch_atomic_inc(atomic_t *v) + { + asm volatile(LOCK_PREFIX "incl %0" +- : "+m" (v->counter)); ++ : "+m" (v->counter) :: "memory"); + } + #define arch_atomic_inc arch_atomic_inc + +@@ -108,7 +108,7 @@ static __always_inline void arch_atomic_inc(atomic_t *v) + static __always_inline void arch_atomic_dec(atomic_t *v) + { + asm volatile(LOCK_PREFIX "decl %0" +- : "+m" (v->counter)); ++ : "+m" (v->counter) :: "memory"); + } + #define arch_atomic_dec arch_atomic_dec + +diff --git a/arch/x86/include/asm/atomic64_64.h b/arch/x86/include/asm/atomic64_64.h +index dadc20adba21..5e86c0d68ac1 100644 +--- a/arch/x86/include/asm/atomic64_64.h ++++ b/arch/x86/include/asm/atomic64_64.h +@@ -45,7 +45,7 @@ static __always_inline void arch_atomic64_add(long i, atomic64_t *v) + { + asm volatile(LOCK_PREFIX "addq %1,%0" + : "=m" (v->counter) +- : "er" (i), "m" (v->counter)); ++ : "er" (i), "m" (v->counter) : "memory"); + } + + /** +@@ -59,7 +59,7 @@ static inline void arch_atomic64_sub(long i, atomic64_t *v) + { + asm volatile(LOCK_PREFIX "subq %1,%0" + : "=m" (v->counter) +- : "er" (i), "m" (v->counter)); ++ : "er" (i), "m" (v->counter) : "memory"); + } + + /** +@@ -87,7 +87,7 @@ static __always_inline void arch_atomic64_inc(atomic64_t *v) + { + asm volatile(LOCK_PREFIX "incq %0" + : "=m" (v->counter) +- : "m" (v->counter)); ++ : "m" (v->counter) : "memory"); + } + #define arch_atomic64_inc arch_atomic64_inc + +@@ -101,7 +101,7 @@ static __always_inline void arch_atomic64_dec(atomic64_t *v) + { + asm volatile(LOCK_PREFIX "decq %0" + : "=m" (v->counter) +- : "m" (v->counter)); ++ : "m" (v->counter) : "memory"); + } + #define arch_atomic64_dec arch_atomic64_dec + +diff --git a/arch/x86/include/asm/barrier.h b/arch/x86/include/asm/barrier.h +index 14de0432d288..84f848c2541a 100644 +--- a/arch/x86/include/asm/barrier.h ++++ b/arch/x86/include/asm/barrier.h +@@ -80,8 +80,8 @@ do { \ + }) + + /* Atomic operations are already serializing on x86 */ +-#define __smp_mb__before_atomic() barrier() +-#define __smp_mb__after_atomic() barrier() ++#define __smp_mb__before_atomic() do { } while (0) ++#define __smp_mb__after_atomic() do { } while (0) + + #include + +diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h +index 1d337c51f7e6..403f70c2e431 100644 +--- a/arch/x86/include/asm/cpufeature.h ++++ b/arch/x86/include/asm/cpufeature.h +@@ -22,8 +22,8 @@ enum cpuid_leafs + CPUID_LNX_3, + CPUID_7_0_EBX, + CPUID_D_1_EAX, +- CPUID_F_0_EDX, +- CPUID_F_1_EDX, ++ CPUID_LNX_4, ++ CPUID_DUMMY, + CPUID_8000_0008_EBX, + CPUID_6_EAX, + CPUID_8000_000A_EDX, +diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h +index 75f27ee2c263..49a8c25eada4 100644 +--- a/arch/x86/include/asm/cpufeatures.h ++++ b/arch/x86/include/asm/cpufeatures.h +@@ -239,12 +239,14 @@ + #define X86_FEATURE_BMI1 ( 9*32+ 3) /* 1st group bit manipulation extensions */ + #define X86_FEATURE_HLE ( 9*32+ 4) /* Hardware Lock Elision */ + #define X86_FEATURE_AVX2 ( 9*32+ 5) /* AVX2 instructions */ ++#define X86_FEATURE_FDP_EXCPTN_ONLY ( 9*32+ 6) /* "" FPU data pointer updated only on x87 exceptions */ + #define X86_FEATURE_SMEP ( 9*32+ 7) /* Supervisor Mode Execution Protection */ + #define X86_FEATURE_BMI2 ( 9*32+ 8) /* 2nd group bit manipulation extensions */ + #define X86_FEATURE_ERMS ( 9*32+ 9) /* Enhanced REP MOVSB/STOSB instructions */ + #define X86_FEATURE_INVPCID ( 9*32+10) /* Invalidate Processor Context ID */ + #define X86_FEATURE_RTM ( 9*32+11) /* Restricted Transactional Memory */ + #define X86_FEATURE_CQM ( 9*32+12) /* Cache QoS Monitoring */ ++#define X86_FEATURE_ZERO_FCS_FDS ( 9*32+13) /* "" Zero out FPU CS and FPU DS */ + #define X86_FEATURE_MPX ( 9*32+14) /* Memory Protection Extension */ + #define X86_FEATURE_RDT_A ( 9*32+15) /* Resource Director Technology Allocation */ + #define X86_FEATURE_AVX512F ( 9*32+16) /* AVX-512 Foundation */ +@@ -269,13 +271,18 @@ + #define X86_FEATURE_XGETBV1 (10*32+ 2) /* XGETBV with ECX = 1 instruction */ + #define X86_FEATURE_XSAVES (10*32+ 3) /* XSAVES/XRSTORS instructions */ + +-/* Intel-defined CPU QoS Sub-leaf, CPUID level 0x0000000F:0 (EDX), word 11 */ +-#define X86_FEATURE_CQM_LLC (11*32+ 1) /* LLC QoS if 1 */ +- +-/* Intel-defined CPU QoS Sub-leaf, CPUID level 0x0000000F:1 (EDX), word 12 */ +-#define X86_FEATURE_CQM_OCCUP_LLC (12*32+ 0) /* LLC occupancy monitoring */ +-#define X86_FEATURE_CQM_MBM_TOTAL (12*32+ 1) /* LLC Total MBM monitoring */ +-#define X86_FEATURE_CQM_MBM_LOCAL (12*32+ 2) /* LLC Local MBM monitoring */ ++/* ++ * Extended auxiliary flags: Linux defined - for features scattered in various ++ * CPUID levels like 0xf, etc. ++ * ++ * Reuse free bits when adding new feature flags! ++ */ ++#define X86_FEATURE_CQM_LLC (11*32+ 0) /* LLC QoS if 1 */ ++#define X86_FEATURE_CQM_OCCUP_LLC (11*32+ 1) /* LLC occupancy monitoring */ ++#define X86_FEATURE_CQM_MBM_TOTAL (11*32+ 2) /* LLC Total MBM monitoring */ ++#define X86_FEATURE_CQM_MBM_LOCAL (11*32+ 3) /* LLC Local MBM monitoring */ ++#define X86_FEATURE_FENCE_SWAPGS_USER (11*32+ 4) /* "" LFENCE in user entry SWAPGS path */ ++#define X86_FEATURE_FENCE_SWAPGS_KERNEL (11*32+ 5) /* "" LFENCE in kernel entry SWAPGS path */ + + /* AMD-defined CPU features, CPUID level 0x80000008 (EBX), word 13 */ + #define X86_FEATURE_CLZERO (13*32+ 0) /* CLZERO instruction */ +@@ -385,5 +392,6 @@ + #define X86_BUG_L1TF X86_BUG(18) /* CPU is affected by L1 Terminal Fault */ + #define X86_BUG_MDS X86_BUG(19) /* CPU is affected by Microarchitectural data sampling */ + #define X86_BUG_MSBDS_ONLY X86_BUG(20) /* CPU is only affected by the MSDBS variant of BUG_MDS */ ++#define X86_BUG_SWAPGS X86_BUG(21) /* CPU is affected by speculation through SWAPGS */ + + #endif /* _ASM_X86_CPUFEATURES_H */ +diff --git a/arch/x86/include/asm/hw_irq.h b/arch/x86/include/asm/hw_irq.h +index 32e666e1231e..cbd97e22d2f3 100644 +--- a/arch/x86/include/asm/hw_irq.h ++++ b/arch/x86/include/asm/hw_irq.h +@@ -150,8 +150,11 @@ extern char irq_entries_start[]; + #define trace_irq_entries_start irq_entries_start + #endif + ++extern char spurious_entries_start[]; ++ + #define VECTOR_UNUSED NULL +-#define VECTOR_RETRIGGERED ((void *)~0UL) ++#define VECTOR_SHUTDOWN ((void *)~0UL) ++#define VECTOR_RETRIGGERED ((void *)~1UL) + + typedef struct irq_desc* vector_irq_t[NR_VECTORS]; + DECLARE_PER_CPU(vector_irq_t, vector_irq); +diff --git a/arch/x86/include/asm/intel-family.h b/arch/x86/include/asm/intel-family.h +index 310118805f57..f60ddd655c78 100644 +--- a/arch/x86/include/asm/intel-family.h ++++ b/arch/x86/include/asm/intel-family.h +@@ -56,6 +56,7 @@ + #define INTEL_FAM6_ICELAKE_XEON_D 0x6C + #define INTEL_FAM6_ICELAKE_DESKTOP 0x7D + #define INTEL_FAM6_ICELAKE_MOBILE 0x7E ++#define INTEL_FAM6_ICELAKE_NNPI 0x9D + + /* "Small Core" Processors (Atom) */ + +diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h +index 26d1eb83f72a..921c609c2af7 100644 +--- a/arch/x86/include/asm/kvm_host.h ++++ b/arch/x86/include/asm/kvm_host.h +@@ -607,15 +607,16 @@ struct kvm_vcpu_arch { + + /* + * QEMU userspace and the guest each have their own FPU state. +- * In vcpu_run, we switch between the user, maintained in the +- * task_struct struct, and guest FPU contexts. While running a VCPU, +- * the VCPU thread will have the guest FPU context. ++ * In vcpu_run, we switch between the user and guest FPU contexts. ++ * While running a VCPU, the VCPU thread will have the guest FPU ++ * context. + * + * Note that while the PKRU state lives inside the fpu registers, + * it is switched out separately at VMENTER and VMEXIT time. The + * "guest_fpu" state here contains the guest FPU context, with the + * host PRKU bits. + */ ++ struct fpu user_fpu; + struct fpu *guest_fpu; + + u64 xcr0; +@@ -1168,6 +1169,7 @@ struct kvm_x86_ops { + int (*update_pi_irte)(struct kvm *kvm, unsigned int host_irq, + uint32_t guest_irq, bool set); + void (*apicv_post_state_restore)(struct kvm_vcpu *vcpu); ++ bool (*dy_apicv_has_pending_interrupt)(struct kvm_vcpu *vcpu); + + int (*set_hv_timer)(struct kvm_vcpu *vcpu, u64 guest_deadline_tsc, + bool *expired); +@@ -1490,25 +1492,29 @@ enum { + #define kvm_arch_vcpu_memslots_id(vcpu) ((vcpu)->arch.hflags & HF_SMM_MASK ? 1 : 0) + #define kvm_memslots_for_spte_role(kvm, role) __kvm_memslots(kvm, (role).smm) + ++asmlinkage void __noreturn kvm_spurious_fault(void); ++ + /* + * Hardware virtualization extension instructions may fault if a + * reboot turns off virtualization while processes are running. +- * Trap the fault and ignore the instruction if that happens. ++ * Usually after catching the fault we just panic; during reboot ++ * instead the instruction is ignored. + */ +-asmlinkage void kvm_spurious_fault(void); +- +-#define ____kvm_handle_fault_on_reboot(insn, cleanup_insn) \ +- "666: " insn "\n\t" \ +- "668: \n\t" \ +- ".pushsection .fixup, \"ax\" \n" \ +- "667: \n\t" \ +- cleanup_insn "\n\t" \ +- "cmpb $0, kvm_rebooting \n\t" \ +- "jne 668b \n\t" \ +- __ASM_SIZE(push) " $666b \n\t" \ +- "jmp kvm_spurious_fault \n\t" \ +- ".popsection \n\t" \ +- _ASM_EXTABLE(666b, 667b) ++#define ____kvm_handle_fault_on_reboot(insn, cleanup_insn) \ ++ "666: \n\t" \ ++ insn "\n\t" \ ++ "jmp 668f \n\t" \ ++ "667: \n\t" \ ++ "call kvm_spurious_fault \n\t" \ ++ "668: \n\t" \ ++ ".pushsection .fixup, \"ax\" \n\t" \ ++ "700: \n\t" \ ++ cleanup_insn "\n\t" \ ++ "cmpb $0, kvm_rebooting\n\t" \ ++ "je 667b \n\t" \ ++ "jmp 668b \n\t" \ ++ ".popsection \n\t" \ ++ _ASM_EXTABLE(666b, 700b) + + #define __kvm_handle_fault_on_reboot(insn) \ + ____kvm_handle_fault_on_reboot(insn, "") +diff --git a/arch/x86/include/asm/module.h b/arch/x86/include/asm/module.h +index 7948a17febb4..44b776297dc3 100644 +--- a/arch/x86/include/asm/module.h ++++ b/arch/x86/include/asm/module.h +@@ -25,6 +25,30 @@ struct mod_arch_specific { + #define MODULE_PROC_FAMILY "586MMX " + #elif defined CONFIG_MCORE2 + #define MODULE_PROC_FAMILY "CORE2 " ++#elif defined CONFIG_MNATIVE ++#define MODULE_PROC_FAMILY "NATIVE " ++#elif defined CONFIG_MNEHALEM ++#define MODULE_PROC_FAMILY "NEHALEM " ++#elif defined CONFIG_MWESTMERE ++#define MODULE_PROC_FAMILY "WESTMERE " ++#elif defined CONFIG_MSILVERMONT ++#define MODULE_PROC_FAMILY "SILVERMONT " ++#elif defined CONFIG_MSANDYBRIDGE ++#define MODULE_PROC_FAMILY "SANDYBRIDGE " ++#elif defined CONFIG_MIVYBRIDGE ++#define MODULE_PROC_FAMILY "IVYBRIDGE " ++#elif defined CONFIG_MHASWELL ++#define MODULE_PROC_FAMILY "HASWELL " ++#elif defined CONFIG_MBROADWELL ++#define MODULE_PROC_FAMILY "BROADWELL " ++#elif defined CONFIG_MSKYLAKE ++#define MODULE_PROC_FAMILY "SKYLAKE " ++#elif defined CONFIG_MSKYLAKEX ++#define MODULE_PROC_FAMILY "SKYLAKEX " ++#elif defined CONFIG_MCANNONLAKE ++#define MODULE_PROC_FAMILY "CANNONLAKE " ++#elif defined CONFIG_MICELAKE ++#define MODULE_PROC_FAMILY "ICELAKE " + #elif defined CONFIG_MATOM + #define MODULE_PROC_FAMILY "ATOM " + #elif defined CONFIG_M686 +@@ -43,6 +67,26 @@ struct mod_arch_specific { + #define MODULE_PROC_FAMILY "K7 " + #elif defined CONFIG_MK8 + #define MODULE_PROC_FAMILY "K8 " ++#elif defined CONFIG_MK8SSE3 ++#define MODULE_PROC_FAMILY "K8SSE3 " ++#elif defined CONFIG_MK10 ++#define MODULE_PROC_FAMILY "K10 " ++#elif defined CONFIG_MBARCELONA ++#define MODULE_PROC_FAMILY "BARCELONA " ++#elif defined CONFIG_MBOBCAT ++#define MODULE_PROC_FAMILY "BOBCAT " ++#elif defined CONFIG_MBULLDOZER ++#define MODULE_PROC_FAMILY "BULLDOZER " ++#elif defined CONFIG_MPILEDRIVER ++#define MODULE_PROC_FAMILY "PILEDRIVER " ++#elif defined CONFIG_MSTEAMROLLER ++#define MODULE_PROC_FAMILY "STEAMROLLER " ++#elif defined CONFIG_MJAGUAR ++#define MODULE_PROC_FAMILY "JAGUAR " ++#elif defined CONFIG_MEXCAVATOR ++#define MODULE_PROC_FAMILY "EXCAVATOR " ++#elif defined CONFIG_MZEN ++#define MODULE_PROC_FAMILY "ZEN " + #elif defined CONFIG_MELAN + #define MODULE_PROC_FAMILY "ELAN " + #elif defined CONFIG_MCRUSOE +diff --git a/arch/x86/include/asm/paravirt.h b/arch/x86/include/asm/paravirt.h +index c25c38a05c1c..d6f5ae2c79ab 100644 +--- a/arch/x86/include/asm/paravirt.h ++++ b/arch/x86/include/asm/paravirt.h +@@ -746,6 +746,7 @@ bool __raw_callee_save___native_vcpu_is_preempted(long cpu); + PV_RESTORE_ALL_CALLER_REGS \ + FRAME_END \ + "ret;" \ ++ ".size " PV_THUNK_NAME(func) ", .-" PV_THUNK_NAME(func) ";" \ + ".popsection") + + /* Get a reference to a callee-save function */ +diff --git a/arch/x86/include/asm/traps.h b/arch/x86/include/asm/traps.h +index 7d6f3f3fad78..f2bd284abc16 100644 +--- a/arch/x86/include/asm/traps.h ++++ b/arch/x86/include/asm/traps.h +@@ -40,7 +40,7 @@ asmlinkage void simd_coprocessor_error(void); + asmlinkage void xen_divide_error(void); + asmlinkage void xen_xennmi(void); + asmlinkage void xen_xendebug(void); +-asmlinkage void xen_xenint3(void); ++asmlinkage void xen_int3(void); + asmlinkage void xen_overflow(void); + asmlinkage void xen_bounds(void); + asmlinkage void xen_invalid_op(void); +diff --git a/arch/x86/include/uapi/asm/vmx.h b/arch/x86/include/uapi/asm/vmx.h +index d213ec5c3766..f0b0c90dd398 100644 +--- a/arch/x86/include/uapi/asm/vmx.h ++++ b/arch/x86/include/uapi/asm/vmx.h +@@ -146,7 +146,6 @@ + + #define VMX_ABORT_SAVE_GUEST_MSR_FAIL 1 + #define VMX_ABORT_LOAD_HOST_PDPTE_FAIL 2 +-#define VMX_ABORT_VMCS_CORRUPTED 3 + #define VMX_ABORT_LOAD_HOST_MSR_FAIL 4 + + #endif /* _UAPIVMX_H */ +diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c +index 85be316665b4..530cf1fd68a2 100644 +--- a/arch/x86/kernel/apic/apic.c ++++ b/arch/x86/kernel/apic/apic.c +@@ -183,7 +183,7 @@ EXPORT_SYMBOL_GPL(local_apic_timer_c2_ok); + /* + * Debug level, exported for io_apic.c + */ +-unsigned int apic_verbosity; ++int apic_verbosity; + + int pic_mode; + +@@ -2041,21 +2041,32 @@ __visible void __irq_entry smp_spurious_interrupt(struct pt_regs *regs) + entering_irq(); + trace_spurious_apic_entry(vector); + ++ inc_irq_stat(irq_spurious_count); ++ ++ /* ++ * If this is a spurious interrupt then do not acknowledge ++ */ ++ if (vector == SPURIOUS_APIC_VECTOR) { ++ /* See SDM vol 3 */ ++ pr_info("Spurious APIC interrupt (vector 0xFF) on CPU#%d, should never happen.\n", ++ smp_processor_id()); ++ goto out; ++ } ++ + /* +- * Check if this really is a spurious interrupt and ACK it +- * if it is a vectored one. Just in case... +- * Spurious interrupts should not be ACKed. ++ * If it is a vectored one, verify it's set in the ISR. If set, ++ * acknowledge it. + */ + v = apic_read(APIC_ISR + ((vector & ~0x1f) >> 1)); +- if (v & (1 << (vector & 0x1f))) ++ if (v & (1 << (vector & 0x1f))) { ++ pr_info("Spurious interrupt (vector 0x%02x) on CPU#%d. Acked\n", ++ vector, smp_processor_id()); + ack_APIC_irq(); +- +- inc_irq_stat(irq_spurious_count); +- +- /* see sw-dev-man vol 3, chapter 7.4.13.5 */ +- pr_info("spurious APIC interrupt through vector %02x on CPU#%d, " +- "should never happen.\n", vector, smp_processor_id()); +- ++ } else { ++ pr_info("Spurious interrupt (vector 0x%02x) on CPU#%d. Not pending!\n", ++ vector, smp_processor_id()); ++ } ++out: + trace_spurious_apic_exit(vector); + exiting_irq(); + } +diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c +index 53aa234a6803..c9fec0657eea 100644 +--- a/arch/x86/kernel/apic/io_apic.c ++++ b/arch/x86/kernel/apic/io_apic.c +@@ -1893,6 +1893,50 @@ static int ioapic_set_affinity(struct irq_data *irq_data, + return ret; + } + ++/* ++ * Interrupt shutdown masks the ioapic pin, but the interrupt might already ++ * be in flight, but not yet serviced by the target CPU. That means ++ * __synchronize_hardirq() would return and claim that everything is calmed ++ * down. So free_irq() would proceed and deactivate the interrupt and free ++ * resources. ++ * ++ * Once the target CPU comes around to service it it will find a cleared ++ * vector and complain. While the spurious interrupt is harmless, the full ++ * release of resources might prevent the interrupt from being acknowledged ++ * which keeps the hardware in a weird state. ++ * ++ * Verify that the corresponding Remote-IRR bits are clear. ++ */ ++static int ioapic_irq_get_chip_state(struct irq_data *irqd, ++ enum irqchip_irq_state which, ++ bool *state) ++{ ++ struct mp_chip_data *mcd = irqd->chip_data; ++ struct IO_APIC_route_entry rentry; ++ struct irq_pin_list *p; ++ ++ if (which != IRQCHIP_STATE_ACTIVE) ++ return -EINVAL; ++ ++ *state = false; ++ raw_spin_lock(&ioapic_lock); ++ for_each_irq_pin(p, mcd->irq_2_pin) { ++ rentry = __ioapic_read_entry(p->apic, p->pin); ++ /* ++ * The remote IRR is only valid in level trigger mode. It's ++ * meaning is undefined for edge triggered interrupts and ++ * irrelevant because the IO-APIC treats them as fire and ++ * forget. ++ */ ++ if (rentry.irr && rentry.trigger) { ++ *state = true; ++ break; ++ } ++ } ++ raw_spin_unlock(&ioapic_lock); ++ return 0; ++} ++ + static struct irq_chip ioapic_chip __read_mostly = { + .name = "IO-APIC", + .irq_startup = startup_ioapic_irq, +@@ -1902,6 +1946,7 @@ static struct irq_chip ioapic_chip __read_mostly = { + .irq_eoi = ioapic_ack_level, + .irq_set_affinity = ioapic_set_affinity, + .irq_retrigger = irq_chip_retrigger_hierarchy, ++ .irq_get_irqchip_state = ioapic_irq_get_chip_state, + .flags = IRQCHIP_SKIP_SET_WAKE, + }; + +@@ -1914,6 +1959,7 @@ static struct irq_chip ioapic_ir_chip __read_mostly = { + .irq_eoi = ioapic_ir_ack_level, + .irq_set_affinity = ioapic_set_affinity, + .irq_retrigger = irq_chip_retrigger_hierarchy, ++ .irq_get_irqchip_state = ioapic_irq_get_chip_state, + .flags = IRQCHIP_SKIP_SET_WAKE, + }; + +diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c +index e7cb78aed644..fdacb864c3dd 100644 +--- a/arch/x86/kernel/apic/vector.c ++++ b/arch/x86/kernel/apic/vector.c +@@ -340,7 +340,7 @@ static void clear_irq_vector(struct irq_data *irqd) + trace_vector_clear(irqd->irq, vector, apicd->cpu, apicd->prev_vector, + apicd->prev_cpu); + +- per_cpu(vector_irq, apicd->cpu)[vector] = VECTOR_UNUSED; ++ per_cpu(vector_irq, apicd->cpu)[vector] = VECTOR_SHUTDOWN; + irq_matrix_free(vector_matrix, apicd->cpu, vector, managed); + apicd->vector = 0; + +@@ -349,7 +349,7 @@ static void clear_irq_vector(struct irq_data *irqd) + if (!vector) + return; + +- per_cpu(vector_irq, apicd->prev_cpu)[vector] = VECTOR_UNUSED; ++ per_cpu(vector_irq, apicd->prev_cpu)[vector] = VECTOR_SHUTDOWN; + irq_matrix_free(vector_matrix, apicd->prev_cpu, vector, managed); + apicd->prev_vector = 0; + apicd->move_in_progress = 0; +diff --git a/arch/x86/kernel/cpu/bugs.c b/arch/x86/kernel/cpu/bugs.c +index 66ca906aa790..c6fa3ef10b4e 100644 +--- a/arch/x86/kernel/cpu/bugs.c ++++ b/arch/x86/kernel/cpu/bugs.c +@@ -34,6 +34,7 @@ + + #include "cpu.h" + ++static void __init spectre_v1_select_mitigation(void); + static void __init spectre_v2_select_mitigation(void); + static void __init ssb_select_mitigation(void); + static void __init l1tf_select_mitigation(void); +@@ -98,17 +99,11 @@ void __init check_bugs(void) + if (boot_cpu_has(X86_FEATURE_STIBP)) + x86_spec_ctrl_mask |= SPEC_CTRL_STIBP; + +- /* Select the proper spectre mitigation before patching alternatives */ ++ /* Select the proper CPU mitigations before patching alternatives: */ ++ spectre_v1_select_mitigation(); + spectre_v2_select_mitigation(); +- +- /* +- * Select proper mitigation for any exposure to the Speculative Store +- * Bypass vulnerability. +- */ + ssb_select_mitigation(); +- + l1tf_select_mitigation(); +- + mds_select_mitigation(); + + arch_smt_update(); +@@ -273,6 +268,98 @@ static int __init mds_cmdline(char *str) + } + early_param("mds", mds_cmdline); + ++#undef pr_fmt ++#define pr_fmt(fmt) "Spectre V1 : " fmt ++ ++enum spectre_v1_mitigation { ++ SPECTRE_V1_MITIGATION_NONE, ++ SPECTRE_V1_MITIGATION_AUTO, ++}; ++ ++static enum spectre_v1_mitigation spectre_v1_mitigation __ro_after_init = ++ SPECTRE_V1_MITIGATION_AUTO; ++ ++static const char * const spectre_v1_strings[] = { ++ [SPECTRE_V1_MITIGATION_NONE] = "Vulnerable: __user pointer sanitization and usercopy barriers only; no swapgs barriers", ++ [SPECTRE_V1_MITIGATION_AUTO] = "Mitigation: usercopy/swapgs barriers and __user pointer sanitization", ++}; ++ ++/* ++ * Does SMAP provide full mitigation against speculative kernel access to ++ * userspace? ++ */ ++static bool smap_works_speculatively(void) ++{ ++ if (!boot_cpu_has(X86_FEATURE_SMAP)) ++ return false; ++ ++ /* ++ * On CPUs which are vulnerable to Meltdown, SMAP does not ++ * prevent speculative access to user data in the L1 cache. ++ * Consider SMAP to be non-functional as a mitigation on these ++ * CPUs. ++ */ ++ if (boot_cpu_has(X86_BUG_CPU_MELTDOWN)) ++ return false; ++ ++ return true; ++} ++ ++static void __init spectre_v1_select_mitigation(void) ++{ ++ if (!boot_cpu_has_bug(X86_BUG_SPECTRE_V1) || cpu_mitigations_off()) { ++ spectre_v1_mitigation = SPECTRE_V1_MITIGATION_NONE; ++ return; ++ } ++ ++ if (spectre_v1_mitigation == SPECTRE_V1_MITIGATION_AUTO) { ++ /* ++ * With Spectre v1, a user can speculatively control either ++ * path of a conditional swapgs with a user-controlled GS ++ * value. The mitigation is to add lfences to both code paths. ++ * ++ * If FSGSBASE is enabled, the user can put a kernel address in ++ * GS, in which case SMAP provides no protection. ++ * ++ * [ NOTE: Don't check for X86_FEATURE_FSGSBASE until the ++ * FSGSBASE enablement patches have been merged. ] ++ * ++ * If FSGSBASE is disabled, the user can only put a user space ++ * address in GS. That makes an attack harder, but still ++ * possible if there's no SMAP protection. ++ */ ++ if (!smap_works_speculatively()) { ++ /* ++ * Mitigation can be provided from SWAPGS itself or ++ * PTI as the CR3 write in the Meltdown mitigation ++ * is serializing. ++ * ++ * If neither is there, mitigate with an LFENCE to ++ * stop speculation through swapgs. ++ */ ++ if (boot_cpu_has_bug(X86_BUG_SWAPGS) && ++ !boot_cpu_has(X86_FEATURE_PTI)) ++ setup_force_cpu_cap(X86_FEATURE_FENCE_SWAPGS_USER); ++ ++ /* ++ * Enable lfences in the kernel entry (non-swapgs) ++ * paths, to prevent user entry from speculatively ++ * skipping swapgs. ++ */ ++ setup_force_cpu_cap(X86_FEATURE_FENCE_SWAPGS_KERNEL); ++ } ++ } ++ ++ pr_info("%s\n", spectre_v1_strings[spectre_v1_mitigation]); ++} ++ ++static int __init nospectre_v1_cmdline(char *str) ++{ ++ spectre_v1_mitigation = SPECTRE_V1_MITIGATION_NONE; ++ return 0; ++} ++early_param("nospectre_v1", nospectre_v1_cmdline); ++ + #undef pr_fmt + #define pr_fmt(fmt) "Spectre V2 : " fmt + +@@ -1226,7 +1313,7 @@ static ssize_t l1tf_show_state(char *buf) + + static ssize_t mds_show_state(char *buf) + { +- if (!hypervisor_is_type(X86_HYPER_NATIVE)) { ++ if (boot_cpu_has(X86_FEATURE_HYPERVISOR)) { + return sprintf(buf, "%s; SMT Host state unknown\n", + mds_strings[mds_mitigation]); + } +@@ -1290,7 +1377,7 @@ static ssize_t cpu_show_common(struct device *dev, struct device_attribute *attr + break; + + case X86_BUG_SPECTRE_V1: +- return sprintf(buf, "Mitigation: __user pointer sanitization\n"); ++ return sprintf(buf, "%s\n", spectre_v1_strings[spectre_v1_mitigation]); + + case X86_BUG_SPECTRE_V2: + return sprintf(buf, "%s%s%s%s%s%s\n", spectre_v2_strings[spectre_v2_enabled], +diff --git a/arch/x86/kernel/cpu/cacheinfo.c b/arch/x86/kernel/cpu/cacheinfo.c +index 395d46f78582..c7503be92f35 100644 +--- a/arch/x86/kernel/cpu/cacheinfo.c ++++ b/arch/x86/kernel/cpu/cacheinfo.c +@@ -658,8 +658,7 @@ void cacheinfo_amd_init_llc_id(struct cpuinfo_x86 *c, int cpu, u8 node_id) + if (c->x86 < 0x17) { + /* LLC is at the node level. */ + per_cpu(cpu_llc_id, cpu) = node_id; +- } else if (c->x86 == 0x17 && +- c->x86_model >= 0 && c->x86_model <= 0x1F) { ++ } else if (c->x86 == 0x17 && c->x86_model <= 0x1F) { + /* + * LLC is at the core complex level. + * Core complex ID is ApicId[3] for these processors. +diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c +index 2c57fffebf9b..3ae218b51eed 100644 +--- a/arch/x86/kernel/cpu/common.c ++++ b/arch/x86/kernel/cpu/common.c +@@ -801,6 +801,30 @@ static void init_speculation_control(struct cpuinfo_x86 *c) + } + } + ++static void init_cqm(struct cpuinfo_x86 *c) ++{ ++ if (!cpu_has(c, X86_FEATURE_CQM_LLC)) { ++ c->x86_cache_max_rmid = -1; ++ c->x86_cache_occ_scale = -1; ++ return; ++ } ++ ++ /* will be overridden if occupancy monitoring exists */ ++ c->x86_cache_max_rmid = cpuid_ebx(0xf); ++ ++ if (cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC) || ++ cpu_has(c, X86_FEATURE_CQM_MBM_TOTAL) || ++ cpu_has(c, X86_FEATURE_CQM_MBM_LOCAL)) { ++ u32 eax, ebx, ecx, edx; ++ ++ /* QoS sub-leaf, EAX=0Fh, ECX=1 */ ++ cpuid_count(0xf, 1, &eax, &ebx, &ecx, &edx); ++ ++ c->x86_cache_max_rmid = ecx; ++ c->x86_cache_occ_scale = ebx; ++ } ++} ++ + void get_cpu_cap(struct cpuinfo_x86 *c) + { + u32 eax, ebx, ecx, edx; +@@ -832,33 +856,6 @@ void get_cpu_cap(struct cpuinfo_x86 *c) + c->x86_capability[CPUID_D_1_EAX] = eax; + } + +- /* Additional Intel-defined flags: level 0x0000000F */ +- if (c->cpuid_level >= 0x0000000F) { +- +- /* QoS sub-leaf, EAX=0Fh, ECX=0 */ +- cpuid_count(0x0000000F, 0, &eax, &ebx, &ecx, &edx); +- c->x86_capability[CPUID_F_0_EDX] = edx; +- +- if (cpu_has(c, X86_FEATURE_CQM_LLC)) { +- /* will be overridden if occupancy monitoring exists */ +- c->x86_cache_max_rmid = ebx; +- +- /* QoS sub-leaf, EAX=0Fh, ECX=1 */ +- cpuid_count(0x0000000F, 1, &eax, &ebx, &ecx, &edx); +- c->x86_capability[CPUID_F_1_EDX] = edx; +- +- if ((cpu_has(c, X86_FEATURE_CQM_OCCUP_LLC)) || +- ((cpu_has(c, X86_FEATURE_CQM_MBM_TOTAL)) || +- (cpu_has(c, X86_FEATURE_CQM_MBM_LOCAL)))) { +- c->x86_cache_max_rmid = ecx; +- c->x86_cache_occ_scale = ebx; +- } +- } else { +- c->x86_cache_max_rmid = -1; +- c->x86_cache_occ_scale = -1; +- } +- } +- + /* AMD-defined flags: level 0x80000001 */ + eax = cpuid_eax(0x80000000); + c->extended_cpuid_level = eax; +@@ -889,6 +886,7 @@ void get_cpu_cap(struct cpuinfo_x86 *c) + + init_scattered_cpuid_features(c); + init_speculation_control(c); ++ init_cqm(c); + + /* + * Clear/Set all flags overridden by options, after probe. +@@ -947,6 +945,7 @@ static void identify_cpu_without_cpuid(struct cpuinfo_x86 *c) + #define NO_L1TF BIT(3) + #define NO_MDS BIT(4) + #define MSBDS_ONLY BIT(5) ++#define NO_SWAPGS BIT(6) + + #define VULNWL(_vendor, _family, _model, _whitelist) \ + { X86_VENDOR_##_vendor, _family, _model, X86_FEATURE_ANY, _whitelist } +@@ -973,30 +972,38 @@ static const __initconst struct x86_cpu_id cpu_vuln_whitelist[] = { + VULNWL_INTEL(ATOM_BONNELL, NO_SPECULATION), + VULNWL_INTEL(ATOM_BONNELL_MID, NO_SPECULATION), + +- VULNWL_INTEL(ATOM_SILVERMONT, NO_SSB | NO_L1TF | MSBDS_ONLY), +- VULNWL_INTEL(ATOM_SILVERMONT_X, NO_SSB | NO_L1TF | MSBDS_ONLY), +- VULNWL_INTEL(ATOM_SILVERMONT_MID, NO_SSB | NO_L1TF | MSBDS_ONLY), +- VULNWL_INTEL(ATOM_AIRMONT, NO_SSB | NO_L1TF | MSBDS_ONLY), +- VULNWL_INTEL(XEON_PHI_KNL, NO_SSB | NO_L1TF | MSBDS_ONLY), +- VULNWL_INTEL(XEON_PHI_KNM, NO_SSB | NO_L1TF | MSBDS_ONLY), ++ VULNWL_INTEL(ATOM_SILVERMONT, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), ++ VULNWL_INTEL(ATOM_SILVERMONT_X, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), ++ VULNWL_INTEL(ATOM_SILVERMONT_MID, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), ++ VULNWL_INTEL(ATOM_AIRMONT, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), ++ VULNWL_INTEL(XEON_PHI_KNL, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), ++ VULNWL_INTEL(XEON_PHI_KNM, NO_SSB | NO_L1TF | MSBDS_ONLY | NO_SWAPGS), + + VULNWL_INTEL(CORE_YONAH, NO_SSB), + +- VULNWL_INTEL(ATOM_AIRMONT_MID, NO_L1TF | MSBDS_ONLY), ++ VULNWL_INTEL(ATOM_AIRMONT_MID, NO_L1TF | MSBDS_ONLY | NO_SWAPGS), + +- VULNWL_INTEL(ATOM_GOLDMONT, NO_MDS | NO_L1TF), +- VULNWL_INTEL(ATOM_GOLDMONT_X, NO_MDS | NO_L1TF), +- VULNWL_INTEL(ATOM_GOLDMONT_PLUS, NO_MDS | NO_L1TF), ++ VULNWL_INTEL(ATOM_GOLDMONT, NO_MDS | NO_L1TF | NO_SWAPGS), ++ VULNWL_INTEL(ATOM_GOLDMONT_X, NO_MDS | NO_L1TF | NO_SWAPGS), ++ VULNWL_INTEL(ATOM_GOLDMONT_PLUS, NO_MDS | NO_L1TF | NO_SWAPGS), ++ ++ /* ++ * Technically, swapgs isn't serializing on AMD (despite it previously ++ * being documented as such in the APM). But according to AMD, %gs is ++ * updated non-speculatively, and the issuing of %gs-relative memory ++ * operands will be blocked until the %gs update completes, which is ++ * good enough for our purposes. ++ */ + + /* AMD Family 0xf - 0x12 */ +- VULNWL_AMD(0x0f, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS), +- VULNWL_AMD(0x10, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS), +- VULNWL_AMD(0x11, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS), +- VULNWL_AMD(0x12, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS), ++ VULNWL_AMD(0x0f, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS), ++ VULNWL_AMD(0x10, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS), ++ VULNWL_AMD(0x11, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS), ++ VULNWL_AMD(0x12, NO_MELTDOWN | NO_SSB | NO_L1TF | NO_MDS | NO_SWAPGS), + + /* FAMILY_ANY must be last, otherwise 0x0f - 0x12 matches won't work */ +- VULNWL_AMD(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS), +- VULNWL_HYGON(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS), ++ VULNWL_AMD(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS), ++ VULNWL_HYGON(X86_FAMILY_ANY, NO_MELTDOWN | NO_L1TF | NO_MDS | NO_SWAPGS), + {} + }; + +@@ -1033,6 +1040,9 @@ static void __init cpu_set_bug_bits(struct cpuinfo_x86 *c) + setup_force_cpu_bug(X86_BUG_MSBDS_ONLY); + } + ++ if (!cpu_matches(NO_SWAPGS)) ++ setup_force_cpu_bug(X86_BUG_SWAPGS); ++ + if (cpu_matches(NO_MELTDOWN)) + return; + +diff --git a/arch/x86/kernel/cpu/cpuid-deps.c b/arch/x86/kernel/cpu/cpuid-deps.c +index 2c0bd38a44ab..fa07a224e7b9 100644 +--- a/arch/x86/kernel/cpu/cpuid-deps.c ++++ b/arch/x86/kernel/cpu/cpuid-deps.c +@@ -59,6 +59,9 @@ static const struct cpuid_dep cpuid_deps[] = { + { X86_FEATURE_AVX512_4VNNIW, X86_FEATURE_AVX512F }, + { X86_FEATURE_AVX512_4FMAPS, X86_FEATURE_AVX512F }, + { X86_FEATURE_AVX512_VPOPCNTDQ, X86_FEATURE_AVX512F }, ++ { X86_FEATURE_CQM_OCCUP_LLC, X86_FEATURE_CQM_LLC }, ++ { X86_FEATURE_CQM_MBM_TOTAL, X86_FEATURE_CQM_LLC }, ++ { X86_FEATURE_CQM_MBM_LOCAL, X86_FEATURE_CQM_LLC }, + {} + }; + +diff --git a/arch/x86/kernel/cpu/mkcapflags.sh b/arch/x86/kernel/cpu/mkcapflags.sh +index d0dfb892c72f..aed45b8895d5 100644 +--- a/arch/x86/kernel/cpu/mkcapflags.sh ++++ b/arch/x86/kernel/cpu/mkcapflags.sh +@@ -4,6 +4,8 @@ + # Generate the x86_cap/bug_flags[] arrays from include/asm/cpufeatures.h + # + ++set -e ++ + IN=$1 + OUT=$2 + +diff --git a/arch/x86/kernel/cpu/scattered.c b/arch/x86/kernel/cpu/scattered.c +index 94aa1c72ca98..adf9b71386ef 100644 +--- a/arch/x86/kernel/cpu/scattered.c ++++ b/arch/x86/kernel/cpu/scattered.c +@@ -26,6 +26,10 @@ struct cpuid_bit { + static const struct cpuid_bit cpuid_bits[] = { + { X86_FEATURE_APERFMPERF, CPUID_ECX, 0, 0x00000006, 0 }, + { X86_FEATURE_EPB, CPUID_ECX, 3, 0x00000006, 0 }, ++ { X86_FEATURE_CQM_LLC, CPUID_EDX, 1, 0x0000000f, 0 }, ++ { X86_FEATURE_CQM_OCCUP_LLC, CPUID_EDX, 0, 0x0000000f, 1 }, ++ { X86_FEATURE_CQM_MBM_TOTAL, CPUID_EDX, 1, 0x0000000f, 1 }, ++ { X86_FEATURE_CQM_MBM_LOCAL, CPUID_EDX, 2, 0x0000000f, 1 }, + { X86_FEATURE_CAT_L3, CPUID_EBX, 1, 0x00000010, 0 }, + { X86_FEATURE_CAT_L2, CPUID_EBX, 2, 0x00000010, 0 }, + { X86_FEATURE_CDP_L3, CPUID_ECX, 2, 0x00000010, 1 }, +diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c +index d2482bbbe3d0..87ef69a72c52 100644 +--- a/arch/x86/kernel/idt.c ++++ b/arch/x86/kernel/idt.c +@@ -319,7 +319,8 @@ void __init idt_setup_apic_and_irq_gates(void) + #ifdef CONFIG_X86_LOCAL_APIC + for_each_clear_bit_from(i, system_vectors, NR_VECTORS) { + set_bit(i, system_vectors); +- set_intr_gate(i, spurious_interrupt); ++ entry = spurious_entries_start + 8 * (i - FIRST_SYSTEM_VECTOR); ++ set_intr_gate(i, entry); + } + #endif + } +diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c +index 9b68b5b00ac9..cc496eb7a8d2 100644 +--- a/arch/x86/kernel/irq.c ++++ b/arch/x86/kernel/irq.c +@@ -247,7 +247,7 @@ __visible unsigned int __irq_entry do_IRQ(struct pt_regs *regs) + if (!handle_irq(desc, regs)) { + ack_APIC_irq(); + +- if (desc != VECTOR_RETRIGGERED) { ++ if (desc != VECTOR_RETRIGGERED && desc != VECTOR_SHUTDOWN) { + pr_emerg_ratelimited("%s: %d.%d No irq handler for vector\n", + __func__, smp_processor_id(), + vector); +diff --git a/arch/x86/kernel/kvm.c b/arch/x86/kernel/kvm.c +index 5169b8cc35bb..320b70acb211 100644 +--- a/arch/x86/kernel/kvm.c ++++ b/arch/x86/kernel/kvm.c +@@ -817,6 +817,7 @@ asm( + "cmpb $0, " __stringify(KVM_STEAL_TIME_preempted) "+steal_time(%rax);" + "setne %al;" + "ret;" ++".size __raw_callee_save___kvm_vcpu_is_preempted, .-__raw_callee_save___kvm_vcpu_is_preempted;" + ".popsection"); + + #endif +diff --git a/arch/x86/kernel/mpparse.c b/arch/x86/kernel/mpparse.c +index 1bfe5c6e6cfe..afac7ccce72f 100644 +--- a/arch/x86/kernel/mpparse.c ++++ b/arch/x86/kernel/mpparse.c +@@ -546,17 +546,15 @@ void __init default_get_smp_config(unsigned int early) + * local APIC has default address + */ + mp_lapic_addr = APIC_DEFAULT_PHYS_BASE; +- return; ++ goto out; + } + + pr_info("Default MP configuration #%d\n", mpf->feature1); + construct_default_ISA_mptable(mpf->feature1); + + } else if (mpf->physptr) { +- if (check_physptr(mpf, early)) { +- early_memunmap(mpf, sizeof(*mpf)); +- return; +- } ++ if (check_physptr(mpf, early)) ++ goto out; + } else + BUG(); + +@@ -565,7 +563,7 @@ void __init default_get_smp_config(unsigned int early) + /* + * Only use the first configuration found. + */ +- ++out: + early_memunmap(mpf, sizeof(*mpf)); + } + +diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c +index a166c960bc9e..e9d0bc3a5e88 100644 +--- a/arch/x86/kernel/ptrace.c ++++ b/arch/x86/kernel/ptrace.c +@@ -25,6 +25,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -643,9 +644,11 @@ static unsigned long ptrace_get_debugreg(struct task_struct *tsk, int n) + { + struct thread_struct *thread = &tsk->thread; + unsigned long val = 0; ++ int index = n; + + if (n < HBP_NUM) { +- struct perf_event *bp = thread->ptrace_bps[n]; ++ struct perf_event *bp = thread->ptrace_bps[index]; ++ index = array_index_nospec(index, HBP_NUM); + + if (bp) + val = bp->hw.info.address; +diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c +index 2abf27d7df6b..2d6898c2cb64 100644 +--- a/arch/x86/kernel/stacktrace.c ++++ b/arch/x86/kernel/stacktrace.c +@@ -100,7 +100,7 @@ copy_stack_frame(const void __user *fp, struct stack_frame_user *frame) + { + int ret; + +- if (!access_ok(fp, sizeof(*frame))) ++ if (__range_not_ok(fp, sizeof(*frame), TASK_SIZE)) + return 0; + + ret = 1; +@@ -129,11 +129,9 @@ void arch_stack_walk_user(stack_trace_consume_fn consume_entry, void *cookie, + break; + if ((unsigned long)fp < regs->sp) + break; +- if (frame.ret_addr) { +- if (!consume_entry(cookie, frame.ret_addr, false)) +- return; +- } +- if (fp == frame.next_fp) ++ if (!frame.ret_addr) ++ break; ++ if (!consume_entry(cookie, frame.ret_addr, false)) + break; + fp = frame.next_fp; + } +diff --git a/arch/x86/kernel/sysfb_efi.c b/arch/x86/kernel/sysfb_efi.c +index 8eb67a670b10..653b7f617b61 100644 +--- a/arch/x86/kernel/sysfb_efi.c ++++ b/arch/x86/kernel/sysfb_efi.c +@@ -230,9 +230,55 @@ static const struct dmi_system_id efifb_dmi_system_table[] __initconst = { + {}, + }; + ++/* ++ * Some devices have a portrait LCD but advertise a landscape resolution (and ++ * pitch). We simply swap width and height for these devices so that we can ++ * correctly deal with some of them coming with multiple resolutions. ++ */ ++static const struct dmi_system_id efifb_dmi_swap_width_height[] __initconst = { ++ { ++ /* ++ * Lenovo MIIX310-10ICR, only some batches have the troublesome ++ * 800x1280 portrait screen. Luckily the portrait version has ++ * its own BIOS version, so we match on that. ++ */ ++ .matches = { ++ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "MIIX 310-10ICR"), ++ DMI_EXACT_MATCH(DMI_BIOS_VERSION, "1HCN44WW"), ++ }, ++ }, ++ { ++ /* Lenovo MIIX 320-10ICR with 800x1280 portrait screen */ ++ .matches = { ++ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, ++ "Lenovo MIIX 320-10ICR"), ++ }, ++ }, ++ { ++ /* Lenovo D330 with 800x1280 or 1200x1920 portrait screen */ ++ .matches = { ++ DMI_EXACT_MATCH(DMI_SYS_VENDOR, "LENOVO"), ++ DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, ++ "Lenovo ideapad D330-10IGM"), ++ }, ++ }, ++ {}, ++}; ++ + __init void sysfb_apply_efi_quirks(void) + { + if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI || + !(screen_info.capabilities & VIDEO_CAPABILITY_SKIP_QUIRKS)) + dmi_check_system(efifb_dmi_system_table); ++ ++ if (screen_info.orig_video_isVGA == VIDEO_TYPE_EFI && ++ dmi_check_system(efifb_dmi_swap_width_height)) { ++ u16 temp = screen_info.lfb_width; ++ ++ screen_info.lfb_width = screen_info.lfb_height; ++ screen_info.lfb_height = temp; ++ screen_info.lfb_linelength = 4 * screen_info.lfb_width; ++ } + } +diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c +index a5b802a12212..71d3fef1edc9 100644 +--- a/arch/x86/kernel/tls.c ++++ b/arch/x86/kernel/tls.c +@@ -5,6 +5,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -220,6 +221,7 @@ int do_get_thread_area(struct task_struct *p, int idx, + struct user_desc __user *u_info) + { + struct user_desc info; ++ int index; + + if (idx == -1 && get_user(idx, &u_info->entry_number)) + return -EFAULT; +@@ -227,8 +229,11 @@ int do_get_thread_area(struct task_struct *p, int idx, + if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX) + return -EINVAL; + +- fill_user_desc(&info, idx, +- &p->thread.tls_array[idx - GDT_ENTRY_TLS_MIN]); ++ index = idx - GDT_ENTRY_TLS_MIN; ++ index = array_index_nospec(index, ++ GDT_ENTRY_TLS_MAX - GDT_ENTRY_TLS_MIN + 1); ++ ++ fill_user_desc(&info, idx, &p->thread.tls_array[index]); + + if (copy_to_user(u_info, &info, sizeof(info))) + return -EFAULT; +diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S +index 0850b5149345..4d1517022a14 100644 +--- a/arch/x86/kernel/vmlinux.lds.S ++++ b/arch/x86/kernel/vmlinux.lds.S +@@ -141,10 +141,10 @@ SECTIONS + *(.text.__x86.indirect_thunk) + __indirect_thunk_end = .; + #endif +- } :text = 0x9090 + +- /* End of text section */ +- _etext = .; ++ /* End of text section */ ++ _etext = .; ++ } :text = 0x9090 + + NOTES :text :note + +diff --git a/arch/x86/kvm/cpuid.h b/arch/x86/kvm/cpuid.h +index 9a327d5b6d1f..d78a61408243 100644 +--- a/arch/x86/kvm/cpuid.h ++++ b/arch/x86/kvm/cpuid.h +@@ -47,8 +47,6 @@ static const struct cpuid_reg reverse_cpuid[] = { + [CPUID_8000_0001_ECX] = {0x80000001, 0, CPUID_ECX}, + [CPUID_7_0_EBX] = { 7, 0, CPUID_EBX}, + [CPUID_D_1_EAX] = { 0xd, 1, CPUID_EAX}, +- [CPUID_F_0_EDX] = { 0xf, 0, CPUID_EDX}, +- [CPUID_F_1_EDX] = { 0xf, 1, CPUID_EDX}, + [CPUID_8000_0008_EBX] = {0x80000008, 0, CPUID_EBX}, + [CPUID_6_EAX] = { 6, 0, CPUID_EAX}, + [CPUID_8000_000A_EDX] = {0x8000000a, 0, CPUID_EDX}, +diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c +index 98f6e4f88b04..8d95c81b2c82 100644 +--- a/arch/x86/kvm/mmu.c ++++ b/arch/x86/kvm/mmu.c +@@ -4593,11 +4593,11 @@ static void update_permission_bitmask(struct kvm_vcpu *vcpu, + */ + + /* Faults from writes to non-writable pages */ +- u8 wf = (pfec & PFERR_WRITE_MASK) ? ~w : 0; ++ u8 wf = (pfec & PFERR_WRITE_MASK) ? (u8)~w : 0; + /* Faults from user mode accesses to supervisor pages */ +- u8 uf = (pfec & PFERR_USER_MASK) ? ~u : 0; ++ u8 uf = (pfec & PFERR_USER_MASK) ? (u8)~u : 0; + /* Faults from fetches of non-executable pages*/ +- u8 ff = (pfec & PFERR_FETCH_MASK) ? ~x : 0; ++ u8 ff = (pfec & PFERR_FETCH_MASK) ? (u8)~x : 0; + /* Faults from kernel mode fetches of user pages */ + u8 smepf = 0; + /* Faults from kernel mode accesses of user pages */ +diff --git a/arch/x86/kvm/pmu.c b/arch/x86/kvm/pmu.c +index 132d149494d6..cab14ec1b3af 100644 +--- a/arch/x86/kvm/pmu.c ++++ b/arch/x86/kvm/pmu.c +@@ -128,8 +128,8 @@ static void pmc_reprogram_counter(struct kvm_pmc *pmc, u32 type, + intr ? kvm_perf_overflow_intr : + kvm_perf_overflow, pmc); + if (IS_ERR(event)) { +- printk_once("kvm_pmu: event creation failed %ld\n", +- PTR_ERR(event)); ++ pr_debug_ratelimited("kvm_pmu: event creation failed %ld for pmc->idx = %d\n", ++ PTR_ERR(event), pmc->idx); + return; + } + +diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c +index 48c865a4e5dd..14384a1ec53f 100644 +--- a/arch/x86/kvm/svm.c ++++ b/arch/x86/kvm/svm.c +@@ -3290,7 +3290,7 @@ static int nested_svm_vmexit(struct vcpu_svm *svm) + vmcb->control.exit_int_info_err, + KVM_ISA_SVM); + +- rc = kvm_vcpu_map(&svm->vcpu, gfn_to_gpa(svm->nested.vmcb), &map); ++ rc = kvm_vcpu_map(&svm->vcpu, gpa_to_gfn(svm->nested.vmcb), &map); + if (rc) { + if (rc == -EINVAL) + kvm_inject_gp(&svm->vcpu, 0); +@@ -3580,7 +3580,7 @@ static bool nested_svm_vmrun(struct vcpu_svm *svm) + + vmcb_gpa = svm->vmcb->save.rax; + +- rc = kvm_vcpu_map(&svm->vcpu, gfn_to_gpa(vmcb_gpa), &map); ++ rc = kvm_vcpu_map(&svm->vcpu, gpa_to_gfn(vmcb_gpa), &map); + if (rc) { + if (rc == -EINVAL) + kvm_inject_gp(&svm->vcpu, 0); +@@ -5167,6 +5167,11 @@ static void svm_deliver_avic_intr(struct kvm_vcpu *vcpu, int vec) + kvm_vcpu_wake_up(vcpu); + } + ++static bool svm_dy_apicv_has_pending_interrupt(struct kvm_vcpu *vcpu) ++{ ++ return false; ++} ++ + static void svm_ir_list_del(struct vcpu_svm *svm, struct amd_iommu_pi_data *pi) + { + unsigned long flags; +@@ -7264,6 +7269,7 @@ static struct kvm_x86_ops svm_x86_ops __ro_after_init = { + + .pmu_ops = &amd_pmu_ops, + .deliver_posted_interrupt = svm_deliver_avic_intr, ++ .dy_apicv_has_pending_interrupt = svm_dy_apicv_has_pending_interrupt, + .update_pi_irte = svm_update_pi_irte, + .setup_mce = svm_setup_mce, + +diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c +index 46af3a5e9209..b96723294b2f 100644 +--- a/arch/x86/kvm/vmx/nested.c ++++ b/arch/x86/kvm/vmx/nested.c +@@ -91,6 +91,10 @@ static void init_vmcs_shadow_fields(void) + pr_err("Missing field from shadow_read_write_field %x\n", + field + 1); + ++ WARN_ONCE(field >= GUEST_ES_AR_BYTES && ++ field <= GUEST_TR_AR_BYTES, ++ "Update vmcs12_write_any() to expose AR_BYTES RW"); ++ + /* + * PML and the preemption timer can be emulated, but the + * processor cannot vmwrite to fields that don't exist +@@ -184,6 +188,7 @@ static void vmx_disable_shadow_vmcs(struct vcpu_vmx *vmx) + { + vmcs_clear_bits(SECONDARY_VM_EXEC_CONTROL, SECONDARY_EXEC_SHADOW_VMCS); + vmcs_write64(VMCS_LINK_POINTER, -1ull); ++ vmx->nested.need_vmcs12_sync = false; + } + + static inline void nested_release_evmcs(struct kvm_vcpu *vcpu) +@@ -209,6 +214,8 @@ static void free_nested(struct kvm_vcpu *vcpu) + if (!vmx->nested.vmxon && !vmx->nested.smm.vmxon) + return; + ++ kvm_clear_request(KVM_REQ_GET_VMCS12_PAGES, vcpu); ++ + vmx->nested.vmxon = false; + vmx->nested.smm.vmxon = false; + free_vpid(vmx->nested.vpid02); +@@ -1321,6 +1328,9 @@ static void copy_shadow_to_vmcs12(struct vcpu_vmx *vmx) + u64 field_value; + struct vmcs *shadow_vmcs = vmx->vmcs01.shadow_vmcs; + ++ if (WARN_ON(!shadow_vmcs)) ++ return; ++ + preempt_disable(); + + vmcs_load(shadow_vmcs); +@@ -1359,6 +1369,9 @@ static void copy_vmcs12_to_shadow(struct vcpu_vmx *vmx) + u64 field_value = 0; + struct vmcs *shadow_vmcs = vmx->vmcs01.shadow_vmcs; + ++ if (WARN_ON(!shadow_vmcs)) ++ return; ++ + vmcs_load(shadow_vmcs); + + for (q = 0; q < ARRAY_SIZE(fields); q++) { +@@ -2234,13 +2247,9 @@ static void prepare_vmcs02_full(struct vcpu_vmx *vmx, struct vmcs12 *vmcs12) + + set_cr4_guest_host_mask(vmx); + +- if (kvm_mpx_supported()) { +- if (vmx->nested.nested_run_pending && +- (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS)) +- vmcs_write64(GUEST_BNDCFGS, vmcs12->guest_bndcfgs); +- else +- vmcs_write64(GUEST_BNDCFGS, vmx->nested.vmcs01_guest_bndcfgs); +- } ++ if (kvm_mpx_supported() && vmx->nested.nested_run_pending && ++ (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS)) ++ vmcs_write64(GUEST_BNDCFGS, vmcs12->guest_bndcfgs); + } + + /* +@@ -2283,6 +2292,9 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12, + kvm_set_dr(vcpu, 7, vcpu->arch.dr7); + vmcs_write64(GUEST_IA32_DEBUGCTL, vmx->nested.vmcs01_debugctl); + } ++ if (kvm_mpx_supported() && (!vmx->nested.nested_run_pending || ++ !(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS))) ++ vmcs_write64(GUEST_BNDCFGS, vmx->nested.vmcs01_guest_bndcfgs); + vmx_set_rflags(vcpu, vmcs12->guest_rflags); + + /* EXCEPTION_BITMAP and CR0_GUEST_HOST_MASK should basically be the +@@ -2878,9 +2890,6 @@ static void nested_get_vmcs12_pages(struct kvm_vcpu *vcpu) + */ + vmcs_clear_bits(CPU_BASED_VM_EXEC_CONTROL, + CPU_BASED_TPR_SHADOW); +- } else { +- printk("bad virtual-APIC page address\n"); +- dump_vmcs(); + } + } + +@@ -2964,6 +2973,25 @@ int nested_vmx_enter_non_root_mode(struct kvm_vcpu *vcpu, bool from_vmentry) + !(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_BNDCFGS)) + vmx->nested.vmcs01_guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS); + ++ /* ++ * Overwrite vmcs01.GUEST_CR3 with L1's CR3 if EPT is disabled *and* ++ * nested early checks are disabled. In the event of a "late" VM-Fail, ++ * i.e. a VM-Fail detected by hardware but not KVM, KVM must unwind its ++ * software model to the pre-VMEntry host state. When EPT is disabled, ++ * GUEST_CR3 holds KVM's shadow CR3, not L1's "real" CR3, which causes ++ * nested_vmx_restore_host_state() to corrupt vcpu->arch.cr3. Stuffing ++ * vmcs01.GUEST_CR3 results in the unwind naturally setting arch.cr3 to ++ * the correct value. Smashing vmcs01.GUEST_CR3 is safe because nested ++ * VM-Exits, and the unwind, reset KVM's MMU, i.e. vmcs01.GUEST_CR3 is ++ * guaranteed to be overwritten with a shadow CR3 prior to re-entering ++ * L1. Don't stuff vmcs01.GUEST_CR3 when using nested early checks as ++ * KVM modifies vcpu->arch.cr3 if and only if the early hardware checks ++ * pass, and early VM-Fails do not reset KVM's MMU, i.e. the VM-Fail ++ * path would need to manually save/restore vmcs01.GUEST_CR3. ++ */ ++ if (!enable_ept && !nested_early_check) ++ vmcs_writel(GUEST_CR3, vcpu->arch.cr3); ++ + vmx_switch_vmcs(vcpu, &vmx->nested.vmcs02); + + prepare_vmcs02_early(vmx, vmcs12); +@@ -3775,18 +3803,8 @@ static void nested_vmx_restore_host_state(struct kvm_vcpu *vcpu) + vmx_set_cr4(vcpu, vmcs_readl(CR4_READ_SHADOW)); + + nested_ept_uninit_mmu_context(vcpu); +- +- /* +- * This is only valid if EPT is in use, otherwise the vmcs01 GUEST_CR3 +- * points to shadow pages! Fortunately we only get here after a WARN_ON +- * if EPT is disabled, so a VMabort is perfectly fine. +- */ +- if (enable_ept) { +- vcpu->arch.cr3 = vmcs_readl(GUEST_CR3); +- __set_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail); +- } else { +- nested_vmx_abort(vcpu, VMX_ABORT_VMCS_CORRUPTED); +- } ++ vcpu->arch.cr3 = vmcs_readl(GUEST_CR3); ++ __set_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail); + + /* + * Use ept_save_pdptrs(vcpu) to load the MMU's cached PDPTRs +@@ -3794,7 +3812,8 @@ static void nested_vmx_restore_host_state(struct kvm_vcpu *vcpu) + * VMFail, like everything else we just need to ensure our + * software model is up-to-date. + */ +- ept_save_pdptrs(vcpu); ++ if (enable_ept) ++ ept_save_pdptrs(vcpu); + + kvm_mmu_reset_context(vcpu); + +@@ -4008,7 +4027,7 @@ void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, + * #UD or #GP. + */ + int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, +- u32 vmx_instruction_info, bool wr, gva_t *ret) ++ u32 vmx_instruction_info, bool wr, int len, gva_t *ret) + { + gva_t off; + bool exn; +@@ -4068,7 +4087,10 @@ int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, + * mode, e.g. a 32-bit address size can yield a 64-bit virtual + * address when using FS/GS with a non-zero base. + */ +- *ret = s.base + off; ++ if (seg_reg == VCPU_SREG_FS || seg_reg == VCPU_SREG_GS) ++ *ret = s.base + off; ++ else ++ *ret = off; + + /* Long mode: #GP(0)/#SS(0) if the memory address is in a + * non-canonical form. This is the only check on the memory +@@ -4115,7 +4137,7 @@ int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, + */ + if (!(s.base == 0 && s.limit == 0xffffffff && + ((s.type & 8) || !(s.type & 4)))) +- exn = exn || (off + sizeof(u64) > s.limit); ++ exn = exn || ((u64)off + len - 1 > s.limit); + } + if (exn) { + kvm_queue_exception_e(vcpu, +@@ -4134,7 +4156,8 @@ static int nested_vmx_get_vmptr(struct kvm_vcpu *vcpu, gpa_t *vmpointer) + struct x86_exception e; + + if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION), +- vmcs_read32(VMX_INSTRUCTION_INFO), false, &gva)) ++ vmcs_read32(VMX_INSTRUCTION_INFO), false, ++ sizeof(*vmpointer), &gva)) + return 1; + + if (kvm_read_guest_virt(vcpu, gva, vmpointer, sizeof(*vmpointer), &e)) { +@@ -4304,7 +4327,6 @@ static inline void nested_release_vmcs12(struct kvm_vcpu *vcpu) + /* copy to memory all shadowed fields in case + they were modified */ + copy_shadow_to_vmcs12(vmx); +- vmx->nested.need_vmcs12_sync = false; + vmx_disable_shadow_vmcs(vmx); + } + vmx->nested.posted_intr_nv = -1; +@@ -4386,6 +4408,7 @@ static int handle_vmread(struct kvm_vcpu *vcpu) + u64 field_value; + unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); + u32 vmx_instruction_info = vmcs_read32(VMX_INSTRUCTION_INFO); ++ int len; + gva_t gva = 0; + struct vmcs12 *vmcs12; + +@@ -4423,12 +4446,12 @@ static int handle_vmread(struct kvm_vcpu *vcpu) + kvm_register_writel(vcpu, (((vmx_instruction_info) >> 3) & 0xf), + field_value); + } else { ++ len = is_64_bit_mode(vcpu) ? 8 : 4; + if (get_vmx_mem_address(vcpu, exit_qualification, +- vmx_instruction_info, true, &gva)) ++ vmx_instruction_info, true, len, &gva)) + return 1; + /* _system ok, nested_vmx_check_permission has verified cpl=0 */ +- kvm_write_guest_virt_system(vcpu, gva, &field_value, +- (is_long_mode(vcpu) ? 8 : 4), NULL); ++ kvm_write_guest_virt_system(vcpu, gva, &field_value, len, NULL); + } + + return nested_vmx_succeed(vcpu); +@@ -4438,6 +4461,7 @@ static int handle_vmread(struct kvm_vcpu *vcpu) + static int handle_vmwrite(struct kvm_vcpu *vcpu) + { + unsigned long field; ++ int len; + gva_t gva; + struct vcpu_vmx *vmx = to_vmx(vcpu); + unsigned long exit_qualification = vmcs_readl(EXIT_QUALIFICATION); +@@ -4463,11 +4487,11 @@ static int handle_vmwrite(struct kvm_vcpu *vcpu) + field_value = kvm_register_readl(vcpu, + (((vmx_instruction_info) >> 3) & 0xf)); + else { ++ len = is_64_bit_mode(vcpu) ? 8 : 4; + if (get_vmx_mem_address(vcpu, exit_qualification, +- vmx_instruction_info, false, &gva)) ++ vmx_instruction_info, false, len, &gva)) + return 1; +- if (kvm_read_guest_virt(vcpu, gva, &field_value, +- (is_64_bit_mode(vcpu) ? 8 : 4), &e)) { ++ if (kvm_read_guest_virt(vcpu, gva, &field_value, len, &e)) { + kvm_inject_page_fault(vcpu, &e); + return 1; + } +@@ -4496,6 +4520,17 @@ static int handle_vmwrite(struct kvm_vcpu *vcpu) + vmcs12 = get_shadow_vmcs12(vcpu); + } + ++ /* ++ * Some Intel CPUs intentionally drop the reserved bits of the AR byte ++ * fields on VMWRITE. Emulate this behavior to ensure consistent KVM ++ * behavior regardless of the underlying hardware, e.g. if an AR_BYTE ++ * field is intercepted for VMWRITE but not VMREAD (in L1), then VMREAD ++ * from L1 will return a different value than VMREAD from L2 (L1 sees ++ * the stripped down value, L2 sees the full value as stored by KVM). ++ */ ++ if (field >= GUEST_ES_AR_BYTES && field <= GUEST_TR_AR_BYTES) ++ field_value &= 0x1f0ff; ++ + if (vmcs12_write_any(vmcs12, field, field_value) < 0) + return nested_vmx_failValid(vcpu, + VMXERR_UNSUPPORTED_VMCS_COMPONENT); +@@ -4615,7 +4650,8 @@ static int handle_vmptrst(struct kvm_vcpu *vcpu) + if (unlikely(to_vmx(vcpu)->nested.hv_evmcs)) + return 1; + +- if (get_vmx_mem_address(vcpu, exit_qual, instr_info, true, &gva)) ++ if (get_vmx_mem_address(vcpu, exit_qual, instr_info, ++ true, sizeof(gpa_t), &gva)) + return 1; + /* *_system ok, nested_vmx_check_permission has verified cpl=0 */ + if (kvm_write_guest_virt_system(vcpu, gva, (void *)¤t_vmptr, +@@ -4661,7 +4697,7 @@ static int handle_invept(struct kvm_vcpu *vcpu) + * operand is read even if it isn't needed (e.g., for type==global) + */ + if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION), +- vmx_instruction_info, false, &gva)) ++ vmx_instruction_info, false, sizeof(operand), &gva)) + return 1; + if (kvm_read_guest_virt(vcpu, gva, &operand, sizeof(operand), &e)) { + kvm_inject_page_fault(vcpu, &e); +@@ -4723,7 +4759,7 @@ static int handle_invvpid(struct kvm_vcpu *vcpu) + * operand is read even if it isn't needed (e.g., for type==global) + */ + if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION), +- vmx_instruction_info, false, &gva)) ++ vmx_instruction_info, false, sizeof(operand), &gva)) + return 1; + if (kvm_read_guest_virt(vcpu, gva, &operand, sizeof(operand), &e)) { + kvm_inject_page_fault(vcpu, &e); +@@ -5749,14 +5785,6 @@ __init int nested_vmx_hardware_setup(int (*exit_handlers[])(struct kvm_vcpu *)) + { + int i; + +- /* +- * Without EPT it is not possible to restore L1's CR3 and PDPTR on +- * VMfail, because they are not available in vmcs01. Just always +- * use hardware checks. +- */ +- if (!enable_ept) +- nested_early_check = 1; +- + if (!cpu_has_vmx_shadow_vmcs()) + enable_shadow_vmcs = 0; + if (enable_shadow_vmcs) { +diff --git a/arch/x86/kvm/vmx/nested.h b/arch/x86/kvm/vmx/nested.h +index e847ff1019a2..29d205bb4e4f 100644 +--- a/arch/x86/kvm/vmx/nested.h ++++ b/arch/x86/kvm/vmx/nested.h +@@ -21,7 +21,7 @@ void nested_sync_from_vmcs12(struct kvm_vcpu *vcpu); + int vmx_set_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data); + int vmx_get_vmx_msr(struct nested_vmx_msrs *msrs, u32 msr_index, u64 *pdata); + int get_vmx_mem_address(struct kvm_vcpu *vcpu, unsigned long exit_qualification, +- u32 vmx_instruction_info, bool wr, gva_t *ret); ++ u32 vmx_instruction_info, bool wr, int len, gva_t *ret); + + static inline struct vmcs12 *get_vmcs12(struct kvm_vcpu *vcpu) + { +diff --git a/arch/x86/kvm/vmx/vmcs_shadow_fields.h b/arch/x86/kvm/vmx/vmcs_shadow_fields.h +index 132432f375c2..97dd5295be31 100644 +--- a/arch/x86/kvm/vmx/vmcs_shadow_fields.h ++++ b/arch/x86/kvm/vmx/vmcs_shadow_fields.h +@@ -40,14 +40,14 @@ SHADOW_FIELD_RO(VM_EXIT_INSTRUCTION_LEN) + SHADOW_FIELD_RO(IDT_VECTORING_INFO_FIELD) + SHADOW_FIELD_RO(IDT_VECTORING_ERROR_CODE) + SHADOW_FIELD_RO(VM_EXIT_INTR_ERROR_CODE) ++SHADOW_FIELD_RO(GUEST_CS_AR_BYTES) ++SHADOW_FIELD_RO(GUEST_SS_AR_BYTES) + SHADOW_FIELD_RW(CPU_BASED_VM_EXEC_CONTROL) + SHADOW_FIELD_RW(EXCEPTION_BITMAP) + SHADOW_FIELD_RW(VM_ENTRY_EXCEPTION_ERROR_CODE) + SHADOW_FIELD_RW(VM_ENTRY_INTR_INFO_FIELD) + SHADOW_FIELD_RW(VM_ENTRY_INSTRUCTION_LEN) + SHADOW_FIELD_RW(TPR_THRESHOLD) +-SHADOW_FIELD_RW(GUEST_CS_AR_BYTES) +-SHADOW_FIELD_RW(GUEST_SS_AR_BYTES) + SHADOW_FIELD_RW(GUEST_INTERRUPTIBILITY_INFO) + SHADOW_FIELD_RW(VMX_PREEMPTION_TIMER_VALUE) + +diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c +index d98eac371c0a..4b830c0adcf8 100644 +--- a/arch/x86/kvm/vmx/vmx.c ++++ b/arch/x86/kvm/vmx/vmx.c +@@ -1718,7 +1718,10 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) + return vmx_get_vmx_msr(&vmx->nested.msrs, msr_info->index, + &msr_info->data); + case MSR_IA32_XSS: +- if (!vmx_xsaves_supported()) ++ if (!vmx_xsaves_supported() || ++ (!msr_info->host_initiated && ++ !(guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) && ++ guest_cpuid_has(vcpu, X86_FEATURE_XSAVES)))) + return 1; + msr_info->data = vcpu->arch.ia32_xss; + break; +@@ -1896,9 +1899,10 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) + MSR_TYPE_W); + break; + case MSR_IA32_CR_PAT: ++ if (!kvm_pat_valid(data)) ++ return 1; ++ + if (vmcs_config.vmentry_ctrl & VM_ENTRY_LOAD_IA32_PAT) { +- if (!kvm_pat_valid(data)) +- return 1; + vmcs_write64(GUEST_IA32_PAT, data); + vcpu->arch.pat = data; + break; +@@ -1932,7 +1936,10 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, struct msr_data *msr_info) + return 1; + return vmx_set_vmx_msr(vcpu, msr_index, data); + case MSR_IA32_XSS: +- if (!vmx_xsaves_supported()) ++ if (!vmx_xsaves_supported() || ++ (!msr_info->host_initiated && ++ !(guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) && ++ guest_cpuid_has(vcpu, X86_FEATURE_XSAVES)))) + return 1; + /* + * The only supported bit as of Skylake is bit 8, but +@@ -5342,7 +5349,8 @@ static int handle_invpcid(struct kvm_vcpu *vcpu) + * is read even if it isn't needed (e.g., for type==all) + */ + if (get_vmx_mem_address(vcpu, vmcs_readl(EXIT_QUALIFICATION), +- vmx_instruction_info, false, &gva)) ++ vmx_instruction_info, false, ++ sizeof(operand), &gva)) + return 1; + + if (kvm_read_guest_virt(vcpu, gva, &operand, sizeof(operand), &e)) { +@@ -6088,6 +6096,11 @@ static int vmx_sync_pir_to_irr(struct kvm_vcpu *vcpu) + return max_irr; + } + ++static bool vmx_dy_apicv_has_pending_interrupt(struct kvm_vcpu *vcpu) ++{ ++ return pi_test_on(vcpu_to_pi_desc(vcpu)); ++} ++ + static void vmx_load_eoi_exitmap(struct kvm_vcpu *vcpu, u64 *eoi_exit_bitmap) + { + if (!kvm_vcpu_apicv_active(vcpu)) +@@ -6109,28 +6122,21 @@ static void vmx_apicv_post_state_restore(struct kvm_vcpu *vcpu) + + static void vmx_complete_atomic_exit(struct vcpu_vmx *vmx) + { +- u32 exit_intr_info = 0; +- u16 basic_exit_reason = (u16)vmx->exit_reason; +- +- if (!(basic_exit_reason == EXIT_REASON_MCE_DURING_VMENTRY +- || basic_exit_reason == EXIT_REASON_EXCEPTION_NMI)) ++ if (vmx->exit_reason != EXIT_REASON_EXCEPTION_NMI) + return; + +- if (!(vmx->exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY)) +- exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); +- vmx->exit_intr_info = exit_intr_info; ++ vmx->exit_intr_info = vmcs_read32(VM_EXIT_INTR_INFO); + + /* if exit due to PF check for async PF */ +- if (is_page_fault(exit_intr_info)) ++ if (is_page_fault(vmx->exit_intr_info)) + vmx->vcpu.arch.apf.host_apf_reason = kvm_read_and_reset_pf_reason(); + + /* Handle machine checks before interrupts are enabled */ +- if (basic_exit_reason == EXIT_REASON_MCE_DURING_VMENTRY || +- is_machine_check(exit_intr_info)) ++ if (is_machine_check(vmx->exit_intr_info)) + kvm_machine_check(); + + /* We need to handle NMIs before interrupts are enabled */ +- if (is_nmi(exit_intr_info)) { ++ if (is_nmi(vmx->exit_intr_info)) { + kvm_before_interrupt(&vmx->vcpu); + asm("int $2"); + kvm_after_interrupt(&vmx->vcpu); +@@ -6533,6 +6539,9 @@ static void vmx_vcpu_run(struct kvm_vcpu *vcpu) + vmx->idt_vectoring_info = 0; + + vmx->exit_reason = vmx->fail ? 0xdead : vmcs_read32(VM_EXIT_REASON); ++ if ((u16)vmx->exit_reason == EXIT_REASON_MCE_DURING_VMENTRY) ++ kvm_machine_check(); ++ + if (vmx->fail || (vmx->exit_reason & VMX_EXIT_REASONS_FAILED_VMENTRY)) + return; + +@@ -7658,6 +7667,7 @@ static struct kvm_x86_ops vmx_x86_ops __ro_after_init = { + .guest_apic_has_interrupt = vmx_guest_apic_has_interrupt, + .sync_pir_to_irr = vmx_sync_pir_to_irr, + .deliver_posted_interrupt = vmx_deliver_posted_interrupt, ++ .dy_apicv_has_pending_interrupt = vmx_dy_apicv_has_pending_interrupt, + + .set_tss_addr = vmx_set_tss_addr, + .set_identity_map_addr = vmx_set_identity_map_addr, +diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c +index fafd81d2c9ea..cbced8ff29d4 100644 +--- a/arch/x86/kvm/x86.c ++++ b/arch/x86/kvm/x86.c +@@ -3264,6 +3264,10 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) + + kvm_x86_ops->vcpu_load(vcpu, cpu); + ++ fpregs_assert_state_consistent(); ++ if (test_thread_flag(TIF_NEED_FPU_LOAD)) ++ switch_fpu_return(); ++ + /* Apply any externally detected TSC adjustments (due to suspend) */ + if (unlikely(vcpu->arch.tsc_offset_adjustment)) { + adjust_tsc_offset_host(vcpu, vcpu->arch.tsc_offset_adjustment); +@@ -7955,9 +7959,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu) + wait_lapic_expire(vcpu); + guest_enter_irqoff(); + +- fpregs_assert_state_consistent(); +- if (test_thread_flag(TIF_NEED_FPU_LOAD)) +- switch_fpu_return(); ++ /* The preempt notifier should have taken care of the FPU already. */ ++ WARN_ON_ONCE(test_thread_flag(TIF_NEED_FPU_LOAD)); + + if (unlikely(vcpu->arch.switch_db_regs)) { + set_debugreg(0, 7); +@@ -8219,7 +8222,7 @@ static void kvm_load_guest_fpu(struct kvm_vcpu *vcpu) + { + fpregs_lock(); + +- copy_fpregs_to_fpstate(¤t->thread.fpu); ++ copy_fpregs_to_fpstate(&vcpu->arch.user_fpu); + /* PKRU is separately restored in kvm_x86_ops->run. */ + __copy_kernel_to_fpregs(&vcpu->arch.guest_fpu->state, + ~XFEATURE_MASK_PKRU); +@@ -8236,7 +8239,7 @@ static void kvm_put_guest_fpu(struct kvm_vcpu *vcpu) + fpregs_lock(); + + copy_fpregs_to_fpstate(vcpu->arch.guest_fpu); +- copy_kernel_to_fpregs(¤t->thread.fpu.state); ++ copy_kernel_to_fpregs(&vcpu->arch.user_fpu.state); + + fpregs_mark_activate(); + fpregs_unlock(); +@@ -9638,6 +9641,22 @@ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu) + return kvm_vcpu_running(vcpu) || kvm_vcpu_has_events(vcpu); + } + ++bool kvm_arch_dy_runnable(struct kvm_vcpu *vcpu) ++{ ++ if (READ_ONCE(vcpu->arch.pv.pv_unhalted)) ++ return true; ++ ++ if (kvm_test_request(KVM_REQ_NMI, vcpu) || ++ kvm_test_request(KVM_REQ_SMI, vcpu) || ++ kvm_test_request(KVM_REQ_EVENT, vcpu)) ++ return true; ++ ++ if (vcpu->arch.apicv_active && kvm_x86_ops->dy_apicv_has_pending_interrupt(vcpu)) ++ return true; ++ ++ return false; ++} ++ + bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu) + { + return vcpu->arch.preempted_in_kernel; +diff --git a/arch/x86/math-emu/fpu_emu.h b/arch/x86/math-emu/fpu_emu.h +index a5a41ec58072..0c122226ca56 100644 +--- a/arch/x86/math-emu/fpu_emu.h ++++ b/arch/x86/math-emu/fpu_emu.h +@@ -177,7 +177,7 @@ static inline void reg_copy(FPU_REG const *x, FPU_REG *y) + #define setexponentpos(x,y) { (*(short *)&((x)->exp)) = \ + ((y) + EXTENDED_Ebias) & 0x7fff; } + #define exponent16(x) (*(short *)&((x)->exp)) +-#define setexponent16(x,y) { (*(short *)&((x)->exp)) = (y); } ++#define setexponent16(x,y) { (*(short *)&((x)->exp)) = (u16)(y); } + #define addexponent(x,y) { (*(short *)&((x)->exp)) += (y); } + #define stdexp(x) { (*(short *)&((x)->exp)) += EXTENDED_Ebias; } + +diff --git a/arch/x86/math-emu/reg_constant.c b/arch/x86/math-emu/reg_constant.c +index 8dc9095bab22..742619e94bdf 100644 +--- a/arch/x86/math-emu/reg_constant.c ++++ b/arch/x86/math-emu/reg_constant.c +@@ -18,7 +18,7 @@ + #include "control_w.h" + + #define MAKE_REG(s, e, l, h) { l, h, \ +- ((EXTENDED_Ebias+(e)) | ((SIGN_##s != 0)*0x8000)) } ++ (u16)((EXTENDED_Ebias+(e)) | ((SIGN_##s != 0)*0x8000)) } + + FPU_REG const CONST_1 = MAKE_REG(POS, 0, 0x00000000, 0x80000000); + #if 0 +diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c +index 46df4c6aae46..26a8b4b1b9ed 100644 +--- a/arch/x86/mm/fault.c ++++ b/arch/x86/mm/fault.c +@@ -194,13 +194,14 @@ static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address) + + pmd = pmd_offset(pud, address); + pmd_k = pmd_offset(pud_k, address); +- if (!pmd_present(*pmd_k)) +- return NULL; + +- if (!pmd_present(*pmd)) ++ if (pmd_present(*pmd) != pmd_present(*pmd_k)) + set_pmd(pmd, *pmd_k); ++ ++ if (!pmd_present(*pmd_k)) ++ return NULL; + else +- BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k)); ++ BUG_ON(pmd_pfn(*pmd) != pmd_pfn(*pmd_k)); + + return pmd_k; + } +@@ -220,17 +221,13 @@ void vmalloc_sync_all(void) + spin_lock(&pgd_lock); + list_for_each_entry(page, &pgd_list, lru) { + spinlock_t *pgt_lock; +- pmd_t *ret; + + /* the pgt_lock only for Xen */ + pgt_lock = &pgd_page_get_mm(page)->page_table_lock; + + spin_lock(pgt_lock); +- ret = vmalloc_sync_one(page_address(page), address); ++ vmalloc_sync_one(page_address(page), address); + spin_unlock(pgt_lock); +- +- if (!ret) +- break; + } + spin_unlock(&pgd_lock); + } +diff --git a/arch/x86/purgatory/Makefile b/arch/x86/purgatory/Makefile +index 3cf302b26332..8901a1f89cf5 100644 +--- a/arch/x86/purgatory/Makefile ++++ b/arch/x86/purgatory/Makefile +@@ -6,6 +6,9 @@ purgatory-y := purgatory.o stack.o setup-x86_$(BITS).o sha256.o entry64.o string + targets += $(purgatory-y) + PURGATORY_OBJS = $(addprefix $(obj)/,$(purgatory-y)) + ++$(obj)/string.o: $(srctree)/arch/x86/boot/compressed/string.c FORCE ++ $(call if_changed_rule,cc_o_c) ++ + $(obj)/sha256.o: $(srctree)/lib/sha256.c FORCE + $(call if_changed_rule,cc_o_c) + +@@ -17,11 +20,34 @@ KCOV_INSTRUMENT := n + + # Default KBUILD_CFLAGS can have -pg option set when FTRACE is enabled. That + # in turn leaves some undefined symbols like __fentry__ in purgatory and not +-# sure how to relocate those. Like kexec-tools, use custom flags. +- +-KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes -fno-zero-initialized-in-bss -fno-builtin -ffreestanding -c -Os -mcmodel=large +-KBUILD_CFLAGS += -m$(BITS) +-KBUILD_CFLAGS += $(call cc-option,-fno-PIE) ++# sure how to relocate those. ++ifdef CONFIG_FUNCTION_TRACER ++CFLAGS_REMOVE_sha256.o += $(CC_FLAGS_FTRACE) ++CFLAGS_REMOVE_purgatory.o += $(CC_FLAGS_FTRACE) ++CFLAGS_REMOVE_string.o += $(CC_FLAGS_FTRACE) ++CFLAGS_REMOVE_kexec-purgatory.o += $(CC_FLAGS_FTRACE) ++endif ++ ++ifdef CONFIG_STACKPROTECTOR ++CFLAGS_REMOVE_sha256.o += -fstack-protector ++CFLAGS_REMOVE_purgatory.o += -fstack-protector ++CFLAGS_REMOVE_string.o += -fstack-protector ++CFLAGS_REMOVE_kexec-purgatory.o += -fstack-protector ++endif ++ ++ifdef CONFIG_STACKPROTECTOR_STRONG ++CFLAGS_REMOVE_sha256.o += -fstack-protector-strong ++CFLAGS_REMOVE_purgatory.o += -fstack-protector-strong ++CFLAGS_REMOVE_string.o += -fstack-protector-strong ++CFLAGS_REMOVE_kexec-purgatory.o += -fstack-protector-strong ++endif ++ ++ifdef CONFIG_RETPOLINE ++CFLAGS_REMOVE_sha256.o += $(RETPOLINE_CFLAGS) ++CFLAGS_REMOVE_purgatory.o += $(RETPOLINE_CFLAGS) ++CFLAGS_REMOVE_string.o += $(RETPOLINE_CFLAGS) ++CFLAGS_REMOVE_kexec-purgatory.o += $(RETPOLINE_CFLAGS) ++endif + + $(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE + $(call if_changed,ld) +diff --git a/arch/x86/purgatory/purgatory.c b/arch/x86/purgatory/purgatory.c +index 6d8d5a34c377..b607bda786f6 100644 +--- a/arch/x86/purgatory/purgatory.c ++++ b/arch/x86/purgatory/purgatory.c +@@ -68,3 +68,9 @@ void purgatory(void) + } + copy_backup_region(); + } ++ ++/* ++ * Defined in order to reuse memcpy() and memset() from ++ * arch/x86/boot/compressed/string.c ++ */ ++void warn(const char *msg) {} +diff --git a/arch/x86/purgatory/string.c b/arch/x86/purgatory/string.c +deleted file mode 100644 +index 01ad43873ad9..000000000000 +--- a/arch/x86/purgatory/string.c ++++ /dev/null +@@ -1,23 +0,0 @@ +-// SPDX-License-Identifier: GPL-2.0-only +-/* +- * Simple string functions. +- * +- * Copyright (C) 2014 Red Hat Inc. +- * +- * Author: +- * Vivek Goyal +- */ +- +-#include +- +-#include "../boot/string.c" +- +-void *memcpy(void *dst, const void *src, size_t len) +-{ +- return __builtin_memcpy(dst, src, len); +-} +- +-void *memset(void *dst, int c, size_t len) +-{ +- return __builtin_memset(dst, c, len); +-} +diff --git a/arch/x86/xen/enlighten_pv.c b/arch/x86/xen/enlighten_pv.c +index 4722ba2966ac..30c14cb343fc 100644 +--- a/arch/x86/xen/enlighten_pv.c ++++ b/arch/x86/xen/enlighten_pv.c +@@ -596,12 +596,12 @@ struct trap_array_entry { + + static struct trap_array_entry trap_array[] = { + { debug, xen_xendebug, true }, +- { int3, xen_xenint3, true }, + { double_fault, xen_double_fault, true }, + #ifdef CONFIG_X86_MCE + { machine_check, xen_machine_check, true }, + #endif + { nmi, xen_xennmi, true }, ++ { int3, xen_int3, false }, + { overflow, xen_overflow, false }, + #ifdef CONFIG_IA32_EMULATION + { entry_INT80_compat, xen_entry_INT80_compat, false }, +diff --git a/arch/x86/xen/xen-asm_64.S b/arch/x86/xen/xen-asm_64.S +index 1e9ef0ba30a5..ebf610b49c06 100644 +--- a/arch/x86/xen/xen-asm_64.S ++++ b/arch/x86/xen/xen-asm_64.S +@@ -32,7 +32,6 @@ xen_pv_trap divide_error + xen_pv_trap debug + xen_pv_trap xendebug + xen_pv_trap int3 +-xen_pv_trap xenint3 + xen_pv_trap xennmi + xen_pv_trap overflow + xen_pv_trap bounds +diff --git a/block/Kconfig b/block/Kconfig +index 2466dcc3ef1d..1b220101a9cb 100644 +--- a/block/Kconfig ++++ b/block/Kconfig +@@ -73,7 +73,6 @@ config BLK_DEV_INTEGRITY + + config BLK_DEV_ZONED + bool "Zoned block device support" +- select MQ_IOSCHED_DEADLINE + ---help--- + Block layer zoned block device support. This option enables + support for ZAC/ZBC host-managed and host-aware zoned block devices. +diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c +index f9269ae6da9c..56609e311697 100644 +--- a/block/bfq-iosched.c ++++ b/block/bfq-iosched.c +@@ -157,6 +157,7 @@ BFQ_BFQQ_FNS(in_large_burst); + BFQ_BFQQ_FNS(coop); + BFQ_BFQQ_FNS(split_coop); + BFQ_BFQQ_FNS(softrt_update); ++BFQ_BFQQ_FNS(has_waker); + #undef BFQ_BFQQ_FNS \ + + /* Expiration time of sync (0) and async (1) requests, in ns. */ +@@ -1427,17 +1428,19 @@ static int bfq_min_budget(struct bfq_data *bfqd) + * mechanism may be re-designed in such a way to make it possible to + * know whether preemption is needed without needing to update service + * trees). In addition, queue preemptions almost always cause random +- * I/O, and thus loss of throughput. Because of these facts, the next +- * function adopts the following simple scheme to avoid both costly +- * operations and too frequent preemptions: it requests the expiration +- * of the in-service queue (unconditionally) only for queues that need +- * to recover a hole, or that either are weight-raised or deserve to +- * be weight-raised. ++ * I/O, which may in turn cause loss of throughput. Finally, there may ++ * even be no in-service queue when the next function is invoked (so, ++ * no queue to compare timestamps with). Because of these facts, the ++ * next function adopts the following simple scheme to avoid costly ++ * operations, too frequent preemptions and too many dependencies on ++ * the state of the scheduler: it requests the expiration of the ++ * in-service queue (unconditionally) only for queues that need to ++ * recover a hole. Then it delegates to other parts of the code the ++ * responsibility of handling the above case 2. + */ + static bool bfq_bfqq_update_budg_for_activation(struct bfq_data *bfqd, + struct bfq_queue *bfqq, +- bool arrived_in_time, +- bool wr_or_deserves_wr) ++ bool arrived_in_time) + { + struct bfq_entity *entity = &bfqq->entity; + +@@ -1492,7 +1495,7 @@ static bool bfq_bfqq_update_budg_for_activation(struct bfq_data *bfqd, + entity->budget = max_t(unsigned long, bfqq->max_budget, + bfq_serv_to_charge(bfqq->next_rq, bfqq)); + bfq_clear_bfqq_non_blocking_wait_rq(bfqq); +- return wr_or_deserves_wr; ++ return false; + } + + /* +@@ -1610,6 +1613,36 @@ static bool bfq_bfqq_idle_for_long_time(struct bfq_data *bfqd, + bfqd->bfq_wr_min_idle_time); + } + ++ ++/* ++ * Return true if bfqq is in a higher priority class, or has a higher ++ * weight than the in-service queue. ++ */ ++static bool bfq_bfqq_higher_class_or_weight(struct bfq_queue *bfqq, ++ struct bfq_queue *in_serv_bfqq) ++{ ++ int bfqq_weight, in_serv_weight; ++ ++ if (bfqq->ioprio_class < in_serv_bfqq->ioprio_class) ++ return true; ++ ++ if (in_serv_bfqq->entity.parent == bfqq->entity.parent) { ++ bfqq_weight = bfqq->entity.weight; ++ in_serv_weight = in_serv_bfqq->entity.weight; ++ } else { ++ if (bfqq->entity.parent) ++ bfqq_weight = bfqq->entity.parent->weight; ++ else ++ bfqq_weight = bfqq->entity.weight; ++ if (in_serv_bfqq->entity.parent) ++ in_serv_weight = in_serv_bfqq->entity.parent->weight; ++ else ++ in_serv_weight = in_serv_bfqq->entity.weight; ++ } ++ ++ return bfqq_weight > in_serv_weight; ++} ++ + static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd, + struct bfq_queue *bfqq, + int old_wr_coeff, +@@ -1654,8 +1687,7 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd, + */ + bfqq_wants_to_preempt = + bfq_bfqq_update_budg_for_activation(bfqd, bfqq, +- arrived_in_time, +- wr_or_deserves_wr); ++ arrived_in_time); + + /* + * If bfqq happened to be activated in a burst, but has been +@@ -1720,21 +1752,111 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd, + + /* + * Expire in-service queue only if preemption may be needed +- * for guarantees. In this respect, the function +- * next_queue_may_preempt just checks a simple, necessary +- * condition, and not a sufficient condition based on +- * timestamps. In fact, for the latter condition to be +- * evaluated, timestamps would need first to be updated, and +- * this operation is quite costly (see the comments on the +- * function bfq_bfqq_update_budg_for_activation). ++ * for guarantees. In particular, we care only about two ++ * cases. The first is that bfqq has to recover a service ++ * hole, as explained in the comments on ++ * bfq_bfqq_update_budg_for_activation(), i.e., that ++ * bfqq_wants_to_preempt is true. However, if bfqq does not ++ * carry time-critical I/O, then bfqq's bandwidth is less ++ * important than that of queues that carry time-critical I/O. ++ * So, as a further constraint, we consider this case only if ++ * bfqq is at least as weight-raised, i.e., at least as time ++ * critical, as the in-service queue. ++ * ++ * The second case is that bfqq is in a higher priority class, ++ * or has a higher weight than the in-service queue. If this ++ * condition does not hold, we don't care because, even if ++ * bfqq does not start to be served immediately, the resulting ++ * delay for bfqq's I/O is however lower or much lower than ++ * the ideal completion time to be guaranteed to bfqq's I/O. ++ * ++ * In both cases, preemption is needed only if, according to ++ * the timestamps of both bfqq and of the in-service queue, ++ * bfqq actually is the next queue to serve. So, to reduce ++ * useless preemptions, the return value of ++ * next_queue_may_preempt() is considered in the next compound ++ * condition too. Yet next_queue_may_preempt() just checks a ++ * simple, necessary condition for bfqq to be the next queue ++ * to serve. In fact, to evaluate a sufficient condition, the ++ * timestamps of the in-service queue would need to be ++ * updated, and this operation is quite costly (see the ++ * comments on bfq_bfqq_update_budg_for_activation()). + */ +- if (bfqd->in_service_queue && bfqq_wants_to_preempt && +- bfqd->in_service_queue->wr_coeff < bfqq->wr_coeff && ++ if (bfqd->in_service_queue && ++ ((bfqq_wants_to_preempt && ++ bfqq->wr_coeff >= bfqd->in_service_queue->wr_coeff) || ++ bfq_bfqq_higher_class_or_weight(bfqq, bfqd->in_service_queue)) && + next_queue_may_preempt(bfqd)) + bfq_bfqq_expire(bfqd, bfqd->in_service_queue, + false, BFQQE_PREEMPTED); + } + ++static void bfq_reset_inject_limit(struct bfq_data *bfqd, ++ struct bfq_queue *bfqq) ++{ ++ /* invalidate baseline total service time */ ++ bfqq->last_serv_time_ns = 0; ++ ++ /* ++ * Reset pointer in case we are waiting for ++ * some request completion. ++ */ ++ bfqd->waited_rq = NULL; ++ ++ /* ++ * If bfqq has a short think time, then start by setting the ++ * inject limit to 0 prudentially, because the service time of ++ * an injected I/O request may be higher than the think time ++ * of bfqq, and therefore, if one request was injected when ++ * bfqq remains empty, this injected request might delay the ++ * service of the next I/O request for bfqq significantly. In ++ * case bfqq can actually tolerate some injection, then the ++ * adaptive update will however raise the limit soon. This ++ * lucky circumstance holds exactly because bfqq has a short ++ * think time, and thus, after remaining empty, is likely to ++ * get new I/O enqueued---and then completed---before being ++ * expired. This is the very pattern that gives the ++ * limit-update algorithm the chance to measure the effect of ++ * injection on request service times, and then to update the ++ * limit accordingly. ++ * ++ * However, in the following special case, the inject limit is ++ * left to 1 even if the think time is short: bfqq's I/O is ++ * synchronized with that of some other queue, i.e., bfqq may ++ * receive new I/O only after the I/O of the other queue is ++ * completed. Keeping the inject limit to 1 allows the ++ * blocking I/O to be served while bfqq is in service. And ++ * this is very convenient both for bfqq and for overall ++ * throughput, as explained in detail in the comments in ++ * bfq_update_has_short_ttime(). ++ * ++ * On the opposite end, if bfqq has a long think time, then ++ * start directly by 1, because: ++ * a) on the bright side, keeping at most one request in ++ * service in the drive is unlikely to cause any harm to the ++ * latency of bfqq's requests, as the service time of a single ++ * request is likely to be lower than the think time of bfqq; ++ * b) on the downside, after becoming empty, bfqq is likely to ++ * expire before getting its next request. With this request ++ * arrival pattern, it is very hard to sample total service ++ * times and update the inject limit accordingly (see comments ++ * on bfq_update_inject_limit()). So the limit is likely to be ++ * never, or at least seldom, updated. As a consequence, by ++ * setting the limit to 1, we avoid that no injection ever ++ * occurs with bfqq. On the downside, this proactive step ++ * further reduces chances to actually compute the baseline ++ * total service time. Thus it reduces chances to execute the ++ * limit-update algorithm and possibly raise the limit to more ++ * than 1. ++ */ ++ if (bfq_bfqq_has_short_ttime(bfqq)) ++ bfqq->inject_limit = 0; ++ else ++ bfqq->inject_limit = 1; ++ ++ bfqq->decrease_time_jif = jiffies; ++} ++ + static void bfq_add_request(struct request *rq) + { + struct bfq_queue *bfqq = RQ_BFQQ(rq); +@@ -1748,6 +1870,112 @@ static void bfq_add_request(struct request *rq) + bfqd->queued++; + + if (RB_EMPTY_ROOT(&bfqq->sort_list) && bfq_bfqq_sync(bfqq)) { ++ /* ++ * Detect whether bfqq's I/O seems synchronized with ++ * that of some other queue, i.e., whether bfqq, after ++ * remaining empty, happens to receive new I/O only ++ * right after some I/O request of the other queue has ++ * been completed. We call waker queue the other ++ * queue, and we assume, for simplicity, that bfqq may ++ * have at most one waker queue. ++ * ++ * A remarkable throughput boost can be reached by ++ * unconditionally injecting the I/O of the waker ++ * queue, every time a new bfq_dispatch_request ++ * happens to be invoked while I/O is being plugged ++ * for bfqq. In addition to boosting throughput, this ++ * unblocks bfqq's I/O, thereby improving bandwidth ++ * and latency for bfqq. Note that these same results ++ * may be achieved with the general injection ++ * mechanism, but less effectively. For details on ++ * this aspect, see the comments on the choice of the ++ * queue for injection in bfq_select_queue(). ++ * ++ * Turning back to the detection of a waker queue, a ++ * queue Q is deemed as a waker queue for bfqq if, for ++ * two consecutive times, bfqq happens to become non ++ * empty right after a request of Q has been ++ * completed. In particular, on the first time, Q is ++ * tentatively set as a candidate waker queue, while ++ * on the second time, the flag ++ * bfq_bfqq_has_waker(bfqq) is set to confirm that Q ++ * is a waker queue for bfqq. These detection steps ++ * are performed only if bfqq has a long think time, ++ * so as to make it more likely that bfqq's I/O is ++ * actually being blocked by a synchronization. This ++ * last filter, plus the above two-times requirement, ++ * make false positives less likely. ++ * ++ * NOTE ++ * ++ * The sooner a waker queue is detected, the sooner ++ * throughput can be boosted by injecting I/O from the ++ * waker queue. Fortunately, detection is likely to be ++ * actually fast, for the following reasons. While ++ * blocked by synchronization, bfqq has a long think ++ * time. This implies that bfqq's inject limit is at ++ * least equal to 1 (see the comments in ++ * bfq_update_inject_limit()). So, thanks to ++ * injection, the waker queue is likely to be served ++ * during the very first I/O-plugging time interval ++ * for bfqq. This triggers the first step of the ++ * detection mechanism. Thanks again to injection, the ++ * candidate waker queue is then likely to be ++ * confirmed no later than during the next ++ * I/O-plugging interval for bfqq. ++ */ ++ if (bfqd->last_completed_rq_bfqq && ++ !bfq_bfqq_has_short_ttime(bfqq) && ++ ktime_get_ns() - bfqd->last_completion < ++ 200 * NSEC_PER_USEC) { ++ if (bfqd->last_completed_rq_bfqq != bfqq && ++ bfqd->last_completed_rq_bfqq != ++ bfqq->waker_bfqq) { ++ /* ++ * First synchronization detected with ++ * a candidate waker queue, or with a ++ * different candidate waker queue ++ * from the current one. ++ */ ++ bfqq->waker_bfqq = bfqd->last_completed_rq_bfqq; ++ ++ /* ++ * If the waker queue disappears, then ++ * bfqq->waker_bfqq must be reset. To ++ * this goal, we maintain in each ++ * waker queue a list, woken_list, of ++ * all the queues that reference the ++ * waker queue through their ++ * waker_bfqq pointer. When the waker ++ * queue exits, the waker_bfqq pointer ++ * of all the queues in the woken_list ++ * is reset. ++ * ++ * In addition, if bfqq is already in ++ * the woken_list of a waker queue, ++ * then, before being inserted into ++ * the woken_list of a new waker ++ * queue, bfqq must be removed from ++ * the woken_list of the old waker ++ * queue. ++ */ ++ if (!hlist_unhashed(&bfqq->woken_list_node)) ++ hlist_del_init(&bfqq->woken_list_node); ++ hlist_add_head(&bfqq->woken_list_node, ++ &bfqd->last_completed_rq_bfqq->woken_list); ++ ++ bfq_clear_bfqq_has_waker(bfqq); ++ } else if (bfqd->last_completed_rq_bfqq == ++ bfqq->waker_bfqq && ++ !bfq_bfqq_has_waker(bfqq)) { ++ /* ++ * synchronization with waker_bfqq ++ * seen for the second time ++ */ ++ bfq_mark_bfqq_has_waker(bfqq); ++ } ++ } ++ + /* + * Periodically reset inject limit, to make sure that + * the latter eventually drops in case workload +@@ -1755,71 +1983,8 @@ static void bfq_add_request(struct request *rq) + * bfq_update_inject_limit(). + */ + if (time_is_before_eq_jiffies(bfqq->decrease_time_jif + +- msecs_to_jiffies(1000))) { +- /* invalidate baseline total service time */ +- bfqq->last_serv_time_ns = 0; +- +- /* +- * Reset pointer in case we are waiting for +- * some request completion. +- */ +- bfqd->waited_rq = NULL; +- +- /* +- * If bfqq has a short think time, then start +- * by setting the inject limit to 0 +- * prudentially, because the service time of +- * an injected I/O request may be higher than +- * the think time of bfqq, and therefore, if +- * one request was injected when bfqq remains +- * empty, this injected request might delay +- * the service of the next I/O request for +- * bfqq significantly. In case bfqq can +- * actually tolerate some injection, then the +- * adaptive update will however raise the +- * limit soon. This lucky circumstance holds +- * exactly because bfqq has a short think +- * time, and thus, after remaining empty, is +- * likely to get new I/O enqueued---and then +- * completed---before being expired. This is +- * the very pattern that gives the +- * limit-update algorithm the chance to +- * measure the effect of injection on request +- * service times, and then to update the limit +- * accordingly. +- * +- * On the opposite end, if bfqq has a long +- * think time, then start directly by 1, +- * because: +- * a) on the bright side, keeping at most one +- * request in service in the drive is unlikely +- * to cause any harm to the latency of bfqq's +- * requests, as the service time of a single +- * request is likely to be lower than the +- * think time of bfqq; +- * b) on the downside, after becoming empty, +- * bfqq is likely to expire before getting its +- * next request. With this request arrival +- * pattern, it is very hard to sample total +- * service times and update the inject limit +- * accordingly (see comments on +- * bfq_update_inject_limit()). So the limit is +- * likely to be never, or at least seldom, +- * updated. As a consequence, by setting the +- * limit to 1, we avoid that no injection ever +- * occurs with bfqq. On the downside, this +- * proactive step further reduces chances to +- * actually compute the baseline total service +- * time. Thus it reduces chances to execute the +- * limit-update algorithm and possibly raise the +- * limit to more than 1. +- */ +- if (bfq_bfqq_has_short_ttime(bfqq)) +- bfqq->inject_limit = 0; +- else +- bfqq->inject_limit = 1; +- bfqq->decrease_time_jif = jiffies; +- } ++ msecs_to_jiffies(1000))) ++ bfq_reset_inject_limit(bfqd, bfqq); + + /* + * The following conditions must hold to setup a new +@@ -2085,9 +2250,14 @@ static void bfq_request_merged(struct request_queue *q, struct request *req, + blk_rq_pos(container_of(rb_prev(&req->rb_node), + struct request, rb_node))) { + struct bfq_queue *bfqq = bfq_init_rq(req); +- struct bfq_data *bfqd = bfqq->bfqd; ++ struct bfq_data *bfqd; + struct request *prev, *next_rq; + ++ if (!bfqq) ++ return; ++ ++ bfqd = bfqq->bfqd; ++ + /* Reposition request in its sort_list */ + elv_rb_del(&bfqq->sort_list, req); + elv_rb_add(&bfqq->sort_list, req); +@@ -2134,6 +2304,9 @@ static void bfq_requests_merged(struct request_queue *q, struct request *rq, + struct bfq_queue *bfqq = bfq_init_rq(rq), + *next_bfqq = bfq_init_rq(next); + ++ if (!bfqq) ++ return; ++ + /* + * If next and rq belong to the same bfq_queue and next is older + * than rq, then reposition rq in the fifo (by substituting next +@@ -3045,7 +3218,205 @@ static void bfq_dispatch_remove(struct request_queue *q, struct request *rq) + bfq_remove_request(q, rq); + } + +-static bool __bfq_bfqq_expire(struct bfq_data *bfqd, struct bfq_queue *bfqq) ++/* ++ * There is a case where idling does not have to be performed for ++ * throughput concerns, but to preserve the throughput share of ++ * the process associated with bfqq. ++ * ++ * To introduce this case, we can note that allowing the drive ++ * to enqueue more than one request at a time, and hence ++ * delegating de facto final scheduling decisions to the ++ * drive's internal scheduler, entails loss of control on the ++ * actual request service order. In particular, the critical ++ * situation is when requests from different processes happen ++ * to be present, at the same time, in the internal queue(s) ++ * of the drive. In such a situation, the drive, by deciding ++ * the service order of the internally-queued requests, does ++ * determine also the actual throughput distribution among ++ * these processes. But the drive typically has no notion or ++ * concern about per-process throughput distribution, and ++ * makes its decisions only on a per-request basis. Therefore, ++ * the service distribution enforced by the drive's internal ++ * scheduler is likely to coincide with the desired throughput ++ * distribution only in a completely symmetric, or favorably ++ * skewed scenario where: ++ * (i-a) each of these processes must get the same throughput as ++ * the others, ++ * (i-b) in case (i-a) does not hold, it holds that the process ++ * associated with bfqq must receive a lower or equal ++ * throughput than any of the other processes; ++ * (ii) the I/O of each process has the same properties, in ++ * terms of locality (sequential or random), direction ++ * (reads or writes), request sizes, greediness ++ * (from I/O-bound to sporadic), and so on; ++ ++ * In fact, in such a scenario, the drive tends to treat the requests ++ * of each process in about the same way as the requests of the ++ * others, and thus to provide each of these processes with about the ++ * same throughput. This is exactly the desired throughput ++ * distribution if (i-a) holds, or, if (i-b) holds instead, this is an ++ * even more convenient distribution for (the process associated with) ++ * bfqq. ++ * ++ * In contrast, in any asymmetric or unfavorable scenario, device ++ * idling (I/O-dispatch plugging) is certainly needed to guarantee ++ * that bfqq receives its assigned fraction of the device throughput ++ * (see [1] for details). ++ * ++ * The problem is that idling may significantly reduce throughput with ++ * certain combinations of types of I/O and devices. An important ++ * example is sync random I/O on flash storage with command ++ * queueing. So, unless bfqq falls in cases where idling also boosts ++ * throughput, it is important to check conditions (i-a), i(-b) and ++ * (ii) accurately, so as to avoid idling when not strictly needed for ++ * service guarantees. ++ * ++ * Unfortunately, it is extremely difficult to thoroughly check ++ * condition (ii). And, in case there are active groups, it becomes ++ * very difficult to check conditions (i-a) and (i-b) too. In fact, ++ * if there are active groups, then, for conditions (i-a) or (i-b) to ++ * become false 'indirectly', it is enough that an active group ++ * contains more active processes or sub-groups than some other active ++ * group. More precisely, for conditions (i-a) or (i-b) to become ++ * false because of such a group, it is not even necessary that the ++ * group is (still) active: it is sufficient that, even if the group ++ * has become inactive, some of its descendant processes still have ++ * some request already dispatched but still waiting for ++ * completion. In fact, requests have still to be guaranteed their ++ * share of the throughput even after being dispatched. In this ++ * respect, it is easy to show that, if a group frequently becomes ++ * inactive while still having in-flight requests, and if, when this ++ * happens, the group is not considered in the calculation of whether ++ * the scenario is asymmetric, then the group may fail to be ++ * guaranteed its fair share of the throughput (basically because ++ * idling may not be performed for the descendant processes of the ++ * group, but it had to be). We address this issue with the following ++ * bi-modal behavior, implemented in the function ++ * bfq_asymmetric_scenario(). ++ * ++ * If there are groups with requests waiting for completion ++ * (as commented above, some of these groups may even be ++ * already inactive), then the scenario is tagged as ++ * asymmetric, conservatively, without checking any of the ++ * conditions (i-a), (i-b) or (ii). So the device is idled for bfqq. ++ * This behavior matches also the fact that groups are created ++ * exactly if controlling I/O is a primary concern (to ++ * preserve bandwidth and latency guarantees). ++ * ++ * On the opposite end, if there are no groups with requests waiting ++ * for completion, then only conditions (i-a) and (i-b) are actually ++ * controlled, i.e., provided that conditions (i-a) or (i-b) holds, ++ * idling is not performed, regardless of whether condition (ii) ++ * holds. In other words, only if conditions (i-a) and (i-b) do not ++ * hold, then idling is allowed, and the device tends to be prevented ++ * from queueing many requests, possibly of several processes. Since ++ * there are no groups with requests waiting for completion, then, to ++ * control conditions (i-a) and (i-b) it is enough to check just ++ * whether all the queues with requests waiting for completion also ++ * have the same weight. ++ * ++ * Not checking condition (ii) evidently exposes bfqq to the ++ * risk of getting less throughput than its fair share. ++ * However, for queues with the same weight, a further ++ * mechanism, preemption, mitigates or even eliminates this ++ * problem. And it does so without consequences on overall ++ * throughput. This mechanism and its benefits are explained ++ * in the next three paragraphs. ++ * ++ * Even if a queue, say Q, is expired when it remains idle, Q ++ * can still preempt the new in-service queue if the next ++ * request of Q arrives soon (see the comments on ++ * bfq_bfqq_update_budg_for_activation). If all queues and ++ * groups have the same weight, this form of preemption, ++ * combined with the hole-recovery heuristic described in the ++ * comments on function bfq_bfqq_update_budg_for_activation, ++ * are enough to preserve a correct bandwidth distribution in ++ * the mid term, even without idling. In fact, even if not ++ * idling allows the internal queues of the device to contain ++ * many requests, and thus to reorder requests, we can rather ++ * safely assume that the internal scheduler still preserves a ++ * minimum of mid-term fairness. ++ * ++ * More precisely, this preemption-based, idleless approach ++ * provides fairness in terms of IOPS, and not sectors per ++ * second. This can be seen with a simple example. Suppose ++ * that there are two queues with the same weight, but that ++ * the first queue receives requests of 8 sectors, while the ++ * second queue receives requests of 1024 sectors. In ++ * addition, suppose that each of the two queues contains at ++ * most one request at a time, which implies that each queue ++ * always remains idle after it is served. Finally, after ++ * remaining idle, each queue receives very quickly a new ++ * request. It follows that the two queues are served ++ * alternatively, preempting each other if needed. This ++ * implies that, although both queues have the same weight, ++ * the queue with large requests receives a service that is ++ * 1024/8 times as high as the service received by the other ++ * queue. ++ * ++ * The motivation for using preemption instead of idling (for ++ * queues with the same weight) is that, by not idling, ++ * service guarantees are preserved (completely or at least in ++ * part) without minimally sacrificing throughput. And, if ++ * there is no active group, then the primary expectation for ++ * this device is probably a high throughput. ++ * ++ * We are now left only with explaining the two sub-conditions in the ++ * additional compound condition that is checked below for deciding ++ * whether the scenario is asymmetric. To explain the first ++ * sub-condition, we need to add that the function ++ * bfq_asymmetric_scenario checks the weights of only ++ * non-weight-raised queues, for efficiency reasons (see comments on ++ * bfq_weights_tree_add()). Then the fact that bfqq is weight-raised ++ * is checked explicitly here. More precisely, the compound condition ++ * below takes into account also the fact that, even if bfqq is being ++ * weight-raised, the scenario is still symmetric if all queues with ++ * requests waiting for completion happen to be ++ * weight-raised. Actually, we should be even more precise here, and ++ * differentiate between interactive weight raising and soft real-time ++ * weight raising. ++ * ++ * The second sub-condition checked in the compound condition is ++ * whether there is a fair amount of already in-flight I/O not ++ * belonging to bfqq. If so, I/O dispatching is to be plugged, for the ++ * following reason. The drive may decide to serve in-flight ++ * non-bfqq's I/O requests before bfqq's ones, thereby delaying the ++ * arrival of new I/O requests for bfqq (recall that bfqq is sync). If ++ * I/O-dispatching is not plugged, then, while bfqq remains empty, a ++ * basically uncontrolled amount of I/O from other queues may be ++ * dispatched too, possibly causing the service of bfqq's I/O to be ++ * delayed even longer in the drive. This problem gets more and more ++ * serious as the speed and the queue depth of the drive grow, ++ * because, as these two quantities grow, the probability to find no ++ * queue busy but many requests in flight grows too. By contrast, ++ * plugging I/O dispatching minimizes the delay induced by already ++ * in-flight I/O, and enables bfqq to recover the bandwidth it may ++ * lose because of this delay. ++ * ++ * As a side note, it is worth considering that the above ++ * device-idling countermeasures may however fail in the following ++ * unlucky scenario: if I/O-dispatch plugging is (correctly) disabled ++ * in a time period during which all symmetry sub-conditions hold, and ++ * therefore the device is allowed to enqueue many requests, but at ++ * some later point in time some sub-condition stops to hold, then it ++ * may become impossible to make requests be served in the desired ++ * order until all the requests already queued in the device have been ++ * served. The last sub-condition commented above somewhat mitigates ++ * this problem for weight-raised queues. ++ */ ++static bool idling_needed_for_service_guarantees(struct bfq_data *bfqd, ++ struct bfq_queue *bfqq) ++{ ++ return (bfqq->wr_coeff > 1 && ++ (bfqd->wr_busy_queues < ++ bfq_tot_busy_queues(bfqd) || ++ bfqd->rq_in_driver >= ++ bfqq->dispatched + 4)) || ++ bfq_asymmetric_scenario(bfqd, bfqq); ++} ++ ++static bool __bfq_bfqq_expire(struct bfq_data *bfqd, struct bfq_queue *bfqq, ++ enum bfqq_expiration reason) + { + /* + * If this bfqq is shared between multiple processes, check +@@ -3056,7 +3427,22 @@ static bool __bfq_bfqq_expire(struct bfq_data *bfqd, struct bfq_queue *bfqq) + if (bfq_bfqq_coop(bfqq) && BFQQ_SEEKY(bfqq)) + bfq_mark_bfqq_split_coop(bfqq); + +- if (RB_EMPTY_ROOT(&bfqq->sort_list)) { ++ /* ++ * Consider queues with a higher finish virtual time than ++ * bfqq. If idling_needed_for_service_guarantees(bfqq) returns ++ * true, then bfqq's bandwidth would be violated if an ++ * uncontrolled amount of I/O from these queues were ++ * dispatched while bfqq is waiting for its new I/O to ++ * arrive. This is exactly what may happen if this is a forced ++ * expiration caused by a preemption attempt, and if bfqq is ++ * not re-scheduled. To prevent this from happening, re-queue ++ * bfqq if it needs I/O-dispatch plugging, even if it is ++ * empty. By doing so, bfqq is granted to be served before the ++ * above queues (provided that bfqq is of course eligible). ++ */ ++ if (RB_EMPTY_ROOT(&bfqq->sort_list) && ++ !(reason == BFQQE_PREEMPTED && ++ idling_needed_for_service_guarantees(bfqd, bfqq))) { + if (bfqq->dispatched == 0) + /* + * Overloading budget_timeout field to store +@@ -3073,7 +3459,8 @@ static bool __bfq_bfqq_expire(struct bfq_data *bfqd, struct bfq_queue *bfqq) + * Resort priority tree of potential close cooperators. + * See comments on bfq_pos_tree_add_move() for the unlikely(). + */ +- if (unlikely(!bfqd->nonrot_with_queueing)) ++ if (unlikely(!bfqd->nonrot_with_queueing && ++ !RB_EMPTY_ROOT(&bfqq->sort_list))) + bfq_pos_tree_add_move(bfqd, bfqq); + } + +@@ -3574,7 +3961,7 @@ void bfq_bfqq_expire(struct bfq_data *bfqd, + * reason. + */ + __bfq_bfqq_recalc_budget(bfqd, bfqq, reason); +- if (__bfq_bfqq_expire(bfqd, bfqq)) ++ if (__bfq_bfqq_expire(bfqd, bfqq, reason)) + /* bfqq is gone, no more actions on it */ + return; + +@@ -3720,184 +4107,6 @@ static bool idling_boosts_thr_without_issues(struct bfq_data *bfqd, + bfqd->wr_busy_queues == 0; + } + +-/* +- * There is a case where idling does not have to be performed for +- * throughput concerns, but to preserve the throughput share of +- * the process associated with bfqq. +- * +- * To introduce this case, we can note that allowing the drive +- * to enqueue more than one request at a time, and hence +- * delegating de facto final scheduling decisions to the +- * drive's internal scheduler, entails loss of control on the +- * actual request service order. In particular, the critical +- * situation is when requests from different processes happen +- * to be present, at the same time, in the internal queue(s) +- * of the drive. In such a situation, the drive, by deciding +- * the service order of the internally-queued requests, does +- * determine also the actual throughput distribution among +- * these processes. But the drive typically has no notion or +- * concern about per-process throughput distribution, and +- * makes its decisions only on a per-request basis. Therefore, +- * the service distribution enforced by the drive's internal +- * scheduler is likely to coincide with the desired throughput +- * distribution only in a completely symmetric, or favorably +- * skewed scenario where: +- * (i-a) each of these processes must get the same throughput as +- * the others, +- * (i-b) in case (i-a) does not hold, it holds that the process +- * associated with bfqq must receive a lower or equal +- * throughput than any of the other processes; +- * (ii) the I/O of each process has the same properties, in +- * terms of locality (sequential or random), direction +- * (reads or writes), request sizes, greediness +- * (from I/O-bound to sporadic), and so on; +- +- * In fact, in such a scenario, the drive tends to treat the requests +- * of each process in about the same way as the requests of the +- * others, and thus to provide each of these processes with about the +- * same throughput. This is exactly the desired throughput +- * distribution if (i-a) holds, or, if (i-b) holds instead, this is an +- * even more convenient distribution for (the process associated with) +- * bfqq. +- * +- * In contrast, in any asymmetric or unfavorable scenario, device +- * idling (I/O-dispatch plugging) is certainly needed to guarantee +- * that bfqq receives its assigned fraction of the device throughput +- * (see [1] for details). +- * +- * The problem is that idling may significantly reduce throughput with +- * certain combinations of types of I/O and devices. An important +- * example is sync random I/O on flash storage with command +- * queueing. So, unless bfqq falls in cases where idling also boosts +- * throughput, it is important to check conditions (i-a), i(-b) and +- * (ii) accurately, so as to avoid idling when not strictly needed for +- * service guarantees. +- * +- * Unfortunately, it is extremely difficult to thoroughly check +- * condition (ii). And, in case there are active groups, it becomes +- * very difficult to check conditions (i-a) and (i-b) too. In fact, +- * if there are active groups, then, for conditions (i-a) or (i-b) to +- * become false 'indirectly', it is enough that an active group +- * contains more active processes or sub-groups than some other active +- * group. More precisely, for conditions (i-a) or (i-b) to become +- * false because of such a group, it is not even necessary that the +- * group is (still) active: it is sufficient that, even if the group +- * has become inactive, some of its descendant processes still have +- * some request already dispatched but still waiting for +- * completion. In fact, requests have still to be guaranteed their +- * share of the throughput even after being dispatched. In this +- * respect, it is easy to show that, if a group frequently becomes +- * inactive while still having in-flight requests, and if, when this +- * happens, the group is not considered in the calculation of whether +- * the scenario is asymmetric, then the group may fail to be +- * guaranteed its fair share of the throughput (basically because +- * idling may not be performed for the descendant processes of the +- * group, but it had to be). We address this issue with the following +- * bi-modal behavior, implemented in the function +- * bfq_asymmetric_scenario(). +- * +- * If there are groups with requests waiting for completion +- * (as commented above, some of these groups may even be +- * already inactive), then the scenario is tagged as +- * asymmetric, conservatively, without checking any of the +- * conditions (i-a), (i-b) or (ii). So the device is idled for bfqq. +- * This behavior matches also the fact that groups are created +- * exactly if controlling I/O is a primary concern (to +- * preserve bandwidth and latency guarantees). +- * +- * On the opposite end, if there are no groups with requests waiting +- * for completion, then only conditions (i-a) and (i-b) are actually +- * controlled, i.e., provided that conditions (i-a) or (i-b) holds, +- * idling is not performed, regardless of whether condition (ii) +- * holds. In other words, only if conditions (i-a) and (i-b) do not +- * hold, then idling is allowed, and the device tends to be prevented +- * from queueing many requests, possibly of several processes. Since +- * there are no groups with requests waiting for completion, then, to +- * control conditions (i-a) and (i-b) it is enough to check just +- * whether all the queues with requests waiting for completion also +- * have the same weight. +- * +- * Not checking condition (ii) evidently exposes bfqq to the +- * risk of getting less throughput than its fair share. +- * However, for queues with the same weight, a further +- * mechanism, preemption, mitigates or even eliminates this +- * problem. And it does so without consequences on overall +- * throughput. This mechanism and its benefits are explained +- * in the next three paragraphs. +- * +- * Even if a queue, say Q, is expired when it remains idle, Q +- * can still preempt the new in-service queue if the next +- * request of Q arrives soon (see the comments on +- * bfq_bfqq_update_budg_for_activation). If all queues and +- * groups have the same weight, this form of preemption, +- * combined with the hole-recovery heuristic described in the +- * comments on function bfq_bfqq_update_budg_for_activation, +- * are enough to preserve a correct bandwidth distribution in +- * the mid term, even without idling. In fact, even if not +- * idling allows the internal queues of the device to contain +- * many requests, and thus to reorder requests, we can rather +- * safely assume that the internal scheduler still preserves a +- * minimum of mid-term fairness. +- * +- * More precisely, this preemption-based, idleless approach +- * provides fairness in terms of IOPS, and not sectors per +- * second. This can be seen with a simple example. Suppose +- * that there are two queues with the same weight, but that +- * the first queue receives requests of 8 sectors, while the +- * second queue receives requests of 1024 sectors. In +- * addition, suppose that each of the two queues contains at +- * most one request at a time, which implies that each queue +- * always remains idle after it is served. Finally, after +- * remaining idle, each queue receives very quickly a new +- * request. It follows that the two queues are served +- * alternatively, preempting each other if needed. This +- * implies that, although both queues have the same weight, +- * the queue with large requests receives a service that is +- * 1024/8 times as high as the service received by the other +- * queue. +- * +- * The motivation for using preemption instead of idling (for +- * queues with the same weight) is that, by not idling, +- * service guarantees are preserved (completely or at least in +- * part) without minimally sacrificing throughput. And, if +- * there is no active group, then the primary expectation for +- * this device is probably a high throughput. +- * +- * We are now left only with explaining the additional +- * compound condition that is checked below for deciding +- * whether the scenario is asymmetric. To explain this +- * compound condition, we need to add that the function +- * bfq_asymmetric_scenario checks the weights of only +- * non-weight-raised queues, for efficiency reasons (see +- * comments on bfq_weights_tree_add()). Then the fact that +- * bfqq is weight-raised is checked explicitly here. More +- * precisely, the compound condition below takes into account +- * also the fact that, even if bfqq is being weight-raised, +- * the scenario is still symmetric if all queues with requests +- * waiting for completion happen to be +- * weight-raised. Actually, we should be even more precise +- * here, and differentiate between interactive weight raising +- * and soft real-time weight raising. +- * +- * As a side note, it is worth considering that the above +- * device-idling countermeasures may however fail in the +- * following unlucky scenario: if idling is (correctly) +- * disabled in a time period during which all symmetry +- * sub-conditions hold, and hence the device is allowed to +- * enqueue many requests, but at some later point in time some +- * sub-condition stops to hold, then it may become impossible +- * to let requests be served in the desired order until all +- * the requests already queued in the device have been served. +- */ +-static bool idling_needed_for_service_guarantees(struct bfq_data *bfqd, +- struct bfq_queue *bfqq) +-{ +- return (bfqq->wr_coeff > 1 && +- bfqd->wr_busy_queues < +- bfq_tot_busy_queues(bfqd)) || +- bfq_asymmetric_scenario(bfqd, bfqq); +-} +- + /* + * For a queue that becomes empty, device idling is allowed only if + * this function returns true for that queue. As a consequence, since +@@ -4156,22 +4365,95 @@ static struct bfq_queue *bfq_select_queue(struct bfq_data *bfqd) + (bfqq->dispatched != 0 && bfq_better_to_idle(bfqq))) { + struct bfq_queue *async_bfqq = + bfqq->bic && bfqq->bic->bfqq[0] && +- bfq_bfqq_busy(bfqq->bic->bfqq[0]) ? ++ bfq_bfqq_busy(bfqq->bic->bfqq[0]) && ++ bfqq->bic->bfqq[0]->next_rq ? + bfqq->bic->bfqq[0] : NULL; + + /* +- * If the process associated with bfqq has also async +- * I/O pending, then inject it +- * unconditionally. Injecting I/O from the same +- * process can cause no harm to the process. On the +- * contrary, it can only increase bandwidth and reduce +- * latency for the process. ++ * The next three mutually-exclusive ifs decide ++ * whether to try injection, and choose the queue to ++ * pick an I/O request from. ++ * ++ * The first if checks whether the process associated ++ * with bfqq has also async I/O pending. If so, it ++ * injects such I/O unconditionally. Injecting async ++ * I/O from the same process can cause no harm to the ++ * process. On the contrary, it can only increase ++ * bandwidth and reduce latency for the process. ++ * ++ * The second if checks whether there happens to be a ++ * non-empty waker queue for bfqq, i.e., a queue whose ++ * I/O needs to be completed for bfqq to receive new ++ * I/O. This happens, e.g., if bfqq is associated with ++ * a process that does some sync. A sync generates ++ * extra blocking I/O, which must be completed before ++ * the process associated with bfqq can go on with its ++ * I/O. If the I/O of the waker queue is not served, ++ * then bfqq remains empty, and no I/O is dispatched, ++ * until the idle timeout fires for bfqq. This is ++ * likely to result in lower bandwidth and higher ++ * latencies for bfqq, and in a severe loss of total ++ * throughput. The best action to take is therefore to ++ * serve the waker queue as soon as possible. So do it ++ * (without relying on the third alternative below for ++ * eventually serving waker_bfqq's I/O; see the last ++ * paragraph for further details). This systematic ++ * injection of I/O from the waker queue does not ++ * cause any delay to bfqq's I/O. On the contrary, ++ * next bfqq's I/O is brought forward dramatically, ++ * for it is not blocked for milliseconds. ++ * ++ * The third if checks whether bfqq is a queue for ++ * which it is better to avoid injection. It is so if ++ * bfqq delivers more throughput when served without ++ * any further I/O from other queues in the middle, or ++ * if the service times of bfqq's I/O requests both ++ * count more than overall throughput, and may be ++ * easily increased by injection (this happens if bfqq ++ * has a short think time). If none of these ++ * conditions holds, then a candidate queue for ++ * injection is looked for through ++ * bfq_choose_bfqq_for_injection(). Note that the ++ * latter may return NULL (for example if the inject ++ * limit for bfqq is currently 0). ++ * ++ * NOTE: motivation for the second alternative ++ * ++ * Thanks to the way the inject limit is updated in ++ * bfq_update_has_short_ttime(), it is rather likely ++ * that, if I/O is being plugged for bfqq and the ++ * waker queue has pending I/O requests that are ++ * blocking bfqq's I/O, then the third alternative ++ * above lets the waker queue get served before the ++ * I/O-plugging timeout fires. So one may deem the ++ * second alternative superfluous. It is not, because ++ * the third alternative may be way less effective in ++ * case of a synchronization. For two main ++ * reasons. First, throughput may be low because the ++ * inject limit may be too low to guarantee the same ++ * amount of injected I/O, from the waker queue or ++ * other queues, that the second alternative ++ * guarantees (the second alternative unconditionally ++ * injects a pending I/O request of the waker queue ++ * for each bfq_dispatch_request()). Second, with the ++ * third alternative, the duration of the plugging, ++ * i.e., the time before bfqq finally receives new I/O, ++ * may not be minimized, because the waker queue may ++ * happen to be served only after other queues. + */ + if (async_bfqq && + icq_to_bic(async_bfqq->next_rq->elv.icq) == bfqq->bic && + bfq_serv_to_charge(async_bfqq->next_rq, async_bfqq) <= + bfq_bfqq_budget_left(async_bfqq)) + bfqq = bfqq->bic->bfqq[0]; ++ else if (bfq_bfqq_has_waker(bfqq) && ++ bfq_bfqq_busy(bfqq->waker_bfqq) && ++ bfqq->next_rq && ++ bfq_serv_to_charge(bfqq->waker_bfqq->next_rq, ++ bfqq->waker_bfqq) <= ++ bfq_bfqq_budget_left(bfqq->waker_bfqq) ++ ) ++ bfqq = bfqq->waker_bfqq; + else if (!idling_boosts_thr_without_issues(bfqd, bfqq) && + (bfqq->wr_coeff == 1 || bfqd->wr_busy_queues > 1 || + !bfq_bfqq_has_short_ttime(bfqq))) +@@ -4489,6 +4771,8 @@ static struct request *bfq_dispatch_request(struct blk_mq_hw_ctx *hctx) + */ + void bfq_put_queue(struct bfq_queue *bfqq) + { ++ struct bfq_queue *item; ++ struct hlist_node *n; + #ifdef CONFIG_BFQ_GROUP_IOSCHED + struct bfq_group *bfqg = bfqq_group(bfqq); + #endif +@@ -4533,6 +4817,36 @@ void bfq_put_queue(struct bfq_queue *bfqq) + bfqq->bfqd->burst_size--; + } + ++ /* ++ * bfqq does not exist any longer, so it cannot be woken by ++ * any other queue, and cannot wake any other queue. Then bfqq ++ * must be removed from the woken list of its possible waker ++ * queue, and all queues in the woken list of bfqq must stop ++ * having a waker queue. Strictly speaking, these updates ++ * should be performed when bfqq remains with no I/O source ++ * attached to it, which happens before bfqq gets freed. In ++ * particular, this happens when the last process associated ++ * with bfqq exits or gets associated with a different ++ * queue. However, both events lead to bfqq being freed soon, ++ * and dangling references would come out only after bfqq gets ++ * freed. So these updates are done here, as a simple and safe ++ * way to handle all cases. ++ */ ++ /* remove bfqq from woken list */ ++ if (!hlist_unhashed(&bfqq->woken_list_node)) ++ hlist_del_init(&bfqq->woken_list_node); ++ ++ /* reset waker for all queues in woken list */ ++ hlist_for_each_entry_safe(item, n, &bfqq->woken_list, ++ woken_list_node) { ++ item->waker_bfqq = NULL; ++ bfq_clear_bfqq_has_waker(item); ++ hlist_del_init(&item->woken_list_node); ++ } ++ ++ if (bfqq->bfqd && bfqq->bfqd->last_completed_rq_bfqq == bfqq) ++ bfqq->bfqd->last_completed_rq_bfqq = NULL; ++ + kmem_cache_free(bfq_pool, bfqq); + #ifdef CONFIG_BFQ_GROUP_IOSCHED + bfqg_and_blkg_put(bfqg); +@@ -4561,7 +4875,7 @@ static void bfq_put_cooperator(struct bfq_queue *bfqq) + static void bfq_exit_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq) + { + if (bfqq == bfqd->in_service_queue) { +- __bfq_bfqq_expire(bfqd, bfqq); ++ __bfq_bfqq_expire(bfqd, bfqq, BFQQE_BUDGET_TIMEOUT); + bfq_schedule_dispatch(bfqd); + } + +@@ -4584,6 +4898,7 @@ static void bfq_exit_icq_bfqq(struct bfq_io_cq *bic, bool is_sync) + unsigned long flags; + + spin_lock_irqsave(&bfqd->lock, flags); ++ bfqq->bic = NULL; + bfq_exit_bfqq(bfqd, bfqq); + bic_set_bfqq(bic, NULL, is_sync); + spin_unlock_irqrestore(&bfqd->lock, flags); +@@ -4687,6 +5002,8 @@ static void bfq_init_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq, + RB_CLEAR_NODE(&bfqq->entity.rb_node); + INIT_LIST_HEAD(&bfqq->fifo); + INIT_HLIST_NODE(&bfqq->burst_list_node); ++ INIT_HLIST_NODE(&bfqq->woken_list_node); ++ INIT_HLIST_HEAD(&bfqq->woken_list); + + bfqq->ref = 0; + bfqq->bfqd = bfqd; +@@ -4854,7 +5171,7 @@ static void bfq_update_has_short_ttime(struct bfq_data *bfqd, + struct bfq_queue *bfqq, + struct bfq_io_cq *bic) + { +- bool has_short_ttime = true; ++ bool has_short_ttime = true, state_changed; + + /* + * No need to update has_short_ttime if bfqq is async or in +@@ -4879,13 +5196,102 @@ static void bfq_update_has_short_ttime(struct bfq_data *bfqd, + bfqq->ttime.ttime_mean > bfqd->bfq_slice_idle)) + has_short_ttime = false; + +- bfq_log_bfqq(bfqd, bfqq, "update_has_short_ttime: has_short_ttime %d", +- has_short_ttime); ++ state_changed = has_short_ttime != bfq_bfqq_has_short_ttime(bfqq); + + if (has_short_ttime) + bfq_mark_bfqq_has_short_ttime(bfqq); + else + bfq_clear_bfqq_has_short_ttime(bfqq); ++ ++ /* ++ * Until the base value for the total service time gets ++ * finally computed for bfqq, the inject limit does depend on ++ * the think-time state (short|long). In particular, the limit ++ * is 0 or 1 if the think time is deemed, respectively, as ++ * short or long (details in the comments in ++ * bfq_update_inject_limit()). Accordingly, the next ++ * instructions reset the inject limit if the think-time state ++ * has changed and the above base value is still to be ++ * computed. ++ * ++ * However, the reset is performed only if more than 100 ms ++ * have elapsed since the last update of the inject limit, or ++ * (inclusive) if the change is from short to long think ++ * time. The reason for this waiting is as follows. ++ * ++ * bfqq may have a long think time because of a ++ * synchronization with some other queue, i.e., because the ++ * I/O of some other queue may need to be completed for bfqq ++ * to receive new I/O. Details in the comments on the choice ++ * of the queue for injection in bfq_select_queue(). ++ * ++ * As stressed in those comments, if such a synchronization is ++ * actually in place, then, without injection on bfqq, the ++ * blocking I/O cannot happen to served while bfqq is in ++ * service. As a consequence, if bfqq is granted ++ * I/O-dispatch-plugging, then bfqq remains empty, and no I/O ++ * is dispatched, until the idle timeout fires. This is likely ++ * to result in lower bandwidth and higher latencies for bfqq, ++ * and in a severe loss of total throughput. ++ * ++ * On the opposite end, a non-zero inject limit may allow the ++ * I/O that blocks bfqq to be executed soon, and therefore ++ * bfqq to receive new I/O soon. ++ * ++ * But, if the blocking gets actually eliminated, then the ++ * next think-time sample for bfqq may be very low. This in ++ * turn may cause bfqq's think time to be deemed ++ * short. Without the 100 ms barrier, this new state change ++ * would cause the body of the next if to be executed ++ * immediately. But this would set to 0 the inject ++ * limit. Without injection, the blocking I/O would cause the ++ * think time of bfqq to become long again, and therefore the ++ * inject limit to be raised again, and so on. The only effect ++ * of such a steady oscillation between the two think-time ++ * states would be to prevent effective injection on bfqq. ++ * ++ * In contrast, if the inject limit is not reset during such a ++ * long time interval as 100 ms, then the number of short ++ * think time samples can grow significantly before the reset ++ * is performed. As a consequence, the think time state can ++ * become stable before the reset. Therefore there will be no ++ * state change when the 100 ms elapse, and no reset of the ++ * inject limit. The inject limit remains steadily equal to 1 ++ * both during and after the 100 ms. So injection can be ++ * performed at all times, and throughput gets boosted. ++ * ++ * An inject limit equal to 1 is however in conflict, in ++ * general, with the fact that the think time of bfqq is ++ * short, because injection may be likely to delay bfqq's I/O ++ * (as explained in the comments in ++ * bfq_update_inject_limit()). But this does not happen in ++ * this special case, because bfqq's low think time is due to ++ * an effective handling of a synchronization, through ++ * injection. In this special case, bfqq's I/O does not get ++ * delayed by injection; on the contrary, bfqq's I/O is ++ * brought forward, because it is not blocked for ++ * milliseconds. ++ * ++ * In addition, serving the blocking I/O much sooner, and much ++ * more frequently than once per I/O-plugging timeout, makes ++ * it much quicker to detect a waker queue (the concept of ++ * waker queue is defined in the comments in ++ * bfq_add_request()). This makes it possible to start sooner ++ * to boost throughput more effectively, by injecting the I/O ++ * of the waker queue unconditionally on every ++ * bfq_dispatch_request(). ++ * ++ * One last, important benefit of not resetting the inject ++ * limit before 100 ms is that, during this time interval, the ++ * base value for the total service time is likely to get ++ * finally computed for bfqq, freeing the inject limit from ++ * its relation with the think time. ++ */ ++ if (state_changed && bfqq->last_serv_time_ns == 0 && ++ (time_is_before_eq_jiffies(bfqq->decrease_time_jif + ++ msecs_to_jiffies(100)) || ++ !has_short_ttime)) ++ bfq_reset_inject_limit(bfqd, bfqq); + } + + /* +@@ -4895,19 +5301,9 @@ static void bfq_update_has_short_ttime(struct bfq_data *bfqd, + static void bfq_rq_enqueued(struct bfq_data *bfqd, struct bfq_queue *bfqq, + struct request *rq) + { +- struct bfq_io_cq *bic = RQ_BIC(rq); +- + if (rq->cmd_flags & REQ_META) + bfqq->meta_pending++; + +- bfq_update_io_thinktime(bfqd, bfqq); +- bfq_update_has_short_ttime(bfqd, bfqq, bic); +- bfq_update_io_seektime(bfqd, bfqq, rq); +- +- bfq_log_bfqq(bfqd, bfqq, +- "rq_enqueued: has_short_ttime=%d (seeky %d)", +- bfq_bfqq_has_short_ttime(bfqq), BFQQ_SEEKY(bfqq)); +- + bfqq->last_request_pos = blk_rq_pos(rq) + blk_rq_sectors(rq); + + if (bfqq == bfqd->in_service_queue && bfq_bfqq_wait_request(bfqq)) { +@@ -4995,6 +5391,10 @@ static bool __bfq_insert_request(struct bfq_data *bfqd, struct request *rq) + bfqq = new_bfqq; + } + ++ bfq_update_io_thinktime(bfqd, bfqq); ++ bfq_update_has_short_ttime(bfqd, bfqq, RQ_BIC(rq)); ++ bfq_update_io_seektime(bfqd, bfqq, rq); ++ + waiting = bfqq && bfq_bfqq_wait_request(bfqq); + bfq_add_request(rq); + idle_timer_disabled = waiting && !bfq_bfqq_wait_request(bfqq); +@@ -5060,12 +5460,12 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq, + + spin_lock_irq(&bfqd->lock); + bfqq = bfq_init_rq(rq); +- if (at_head || blk_rq_is_passthrough(rq)) { ++ if (!bfqq || at_head || blk_rq_is_passthrough(rq)) { + if (at_head) + list_add(&rq->queuelist, &bfqd->dispatch); + else + list_add_tail(&rq->queuelist, &bfqd->dispatch); +- } else { /* bfqq is assumed to be non null here */ ++ } else { + idle_timer_disabled = __bfq_insert_request(bfqd, rq); + /* + * Update bfqq, because, if a queue merge has occurred +@@ -5200,6 +5600,7 @@ static void bfq_completed_request(struct bfq_queue *bfqq, struct bfq_data *bfqd) + 1UL<<(BFQ_RATE_SHIFT - 10)) + bfq_update_rate_reset(bfqd, NULL); + bfqd->last_completion = now_ns; ++ bfqd->last_completed_rq_bfqq = bfqq; + + /* + * If we are waiting to discover whether the request pattern +@@ -5397,8 +5798,14 @@ static void bfq_update_inject_limit(struct bfq_data *bfqd, + * total service time, and there seem to be the right + * conditions to do it, or we can lower the last base value + * computed. ++ * ++ * NOTE: (bfqd->rq_in_driver == 1) means that there is no I/O ++ * request in flight, because this function is in the code ++ * path that handles the completion of a request of bfqq, and, ++ * in particular, this function is executed before ++ * bfqd->rq_in_driver is decremented in such a code path. + */ +- if ((bfqq->last_serv_time_ns == 0 && bfqd->rq_in_driver == 0) || ++ if ((bfqq->last_serv_time_ns == 0 && bfqd->rq_in_driver == 1) || + tot_time_ns < bfqq->last_serv_time_ns) { + bfqq->last_serv_time_ns = tot_time_ns; + /* +@@ -5406,7 +5813,18 @@ static void bfq_update_inject_limit(struct bfq_data *bfqd, + * start trying injection. + */ + bfqq->inject_limit = max_t(unsigned int, 1, old_limit); +- } ++ } else if (!bfqd->rqs_injected && bfqd->rq_in_driver == 1) ++ /* ++ * No I/O injected and no request still in service in ++ * the drive: these are the exact conditions for ++ * computing the base value of the total service time ++ * for bfqq. So let's update this value, because it is ++ * rather variable. For example, it varies if the size ++ * or the spatial locality of the I/O requests in bfqq ++ * change. ++ */ ++ bfqq->last_serv_time_ns = tot_time_ns; ++ + + /* update complete, not waiting for any request completion any longer */ + bfqd->waited_rq = NULL; +diff --git a/block/bfq-iosched.h b/block/bfq-iosched.h +index c2faa77824f8..56eb59d898b8 100644 +--- a/block/bfq-iosched.h ++++ b/block/bfq-iosched.h +@@ -357,6 +357,24 @@ struct bfq_queue { + + /* max service rate measured so far */ + u32 max_service_rate; ++ ++ /* ++ * Pointer to the waker queue for this queue, i.e., to the ++ * queue Q such that this queue happens to get new I/O right ++ * after some I/O request of Q is completed. For details, see ++ * the comments on the choice of the queue for injection in ++ * bfq_select_queue(). ++ */ ++ struct bfq_queue *waker_bfqq; ++ /* node for woken_list, see below */ ++ struct hlist_node woken_list_node; ++ /* ++ * Head of the list of the woken queues for this queue, i.e., ++ * of the list of the queues for which this queue is a waker ++ * queue. This list is used to reset the waker_bfqq pointer in ++ * the woken queues when this queue exits. ++ */ ++ struct hlist_head woken_list; + }; + + /** +@@ -533,6 +551,9 @@ struct bfq_data { + /* time of last request completion (ns) */ + u64 last_completion; + ++ /* bfqq owning the last completed rq */ ++ struct bfq_queue *last_completed_rq_bfqq; ++ + /* time of last transition from empty to non-empty (ns) */ + u64 last_empty_occupied_ns; + +@@ -743,7 +764,8 @@ enum bfqq_state_flags { + * update + */ + BFQQF_coop, /* bfqq is shared */ +- BFQQF_split_coop /* shared bfqq will be split */ ++ BFQQF_split_coop, /* shared bfqq will be split */ ++ BFQQF_has_waker /* bfqq has a waker queue */ + }; + + #define BFQ_BFQQ_FNS(name) \ +@@ -763,6 +785,7 @@ BFQ_BFQQ_FNS(in_large_burst); + BFQ_BFQQ_FNS(coop); + BFQ_BFQQ_FNS(split_coop); + BFQ_BFQQ_FNS(softrt_update); ++BFQ_BFQQ_FNS(has_waker); + #undef BFQ_BFQQ_FNS + + /* Expiration reasons. */ +diff --git a/block/bio-integrity.c b/block/bio-integrity.c +index 4db620849515..fb95dbb21dd8 100644 +--- a/block/bio-integrity.c ++++ b/block/bio-integrity.c +@@ -276,8 +276,12 @@ bool bio_integrity_prep(struct bio *bio) + ret = bio_integrity_add_page(bio, virt_to_page(buf), + bytes, offset); + +- if (ret == 0) +- return false; ++ if (ret == 0) { ++ printk(KERN_ERR "could not attach integrity payload\n"); ++ kfree(buf); ++ status = BLK_STS_RESOURCE; ++ goto err_end_io; ++ } + + if (ret < bytes) + break; +diff --git a/block/bio.c b/block/bio.c +index ce797d73bb43..121caeea3e00 100644 +--- a/block/bio.c ++++ b/block/bio.c +@@ -16,6 +16,7 @@ + #include + #include + #include ++#include + + #include + #include "blk.h" +@@ -731,7 +732,7 @@ static int __bio_add_pc_page(struct request_queue *q, struct bio *bio, + } + } + +- if (bio_full(bio)) ++ if (bio_full(bio, len)) + return 0; + + if (bio->bi_phys_segments >= queue_max_segments(q)) +@@ -807,7 +808,7 @@ void __bio_add_page(struct bio *bio, struct page *page, + struct bio_vec *bv = &bio->bi_io_vec[bio->bi_vcnt]; + + WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED)); +- WARN_ON_ONCE(bio_full(bio)); ++ WARN_ON_ONCE(bio_full(bio, len)); + + bv->bv_page = page; + bv->bv_offset = off; +@@ -834,7 +835,7 @@ int bio_add_page(struct bio *bio, struct page *page, + bool same_page = false; + + if (!__bio_try_merge_page(bio, page, len, offset, &same_page)) { +- if (bio_full(bio)) ++ if (bio_full(bio, len)) + return 0; + __bio_add_page(bio, page, len, offset); + } +@@ -922,7 +923,7 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) + if (same_page) + put_page(page); + } else { +- if (WARN_ON_ONCE(bio_full(bio))) ++ if (WARN_ON_ONCE(bio_full(bio, len))) + return -EINVAL; + __bio_add_page(bio, page, len, offset); + } +@@ -966,7 +967,7 @@ int bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) + ret = __bio_iov_bvec_add_pages(bio, iter); + else + ret = __bio_iov_iter_get_pages(bio, iter); +- } while (!ret && iov_iter_count(iter) && !bio_full(bio)); ++ } while (!ret && iov_iter_count(iter) && !bio_full(bio, 0)); + + if (iov_iter_bvec_no_ref(iter)) + bio_set_flag(bio, BIO_NO_PAGE_REF); +@@ -1479,8 +1480,22 @@ void bio_unmap_user(struct bio *bio) + bio_put(bio); + } + ++static void bio_invalidate_vmalloc_pages(struct bio *bio) ++{ ++#ifdef ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE ++ if (bio->bi_private && !op_is_write(bio_op(bio))) { ++ unsigned long i, len = 0; ++ ++ for (i = 0; i < bio->bi_vcnt; i++) ++ len += bio->bi_io_vec[i].bv_len; ++ invalidate_kernel_vmap_range(bio->bi_private, len); ++ } ++#endif ++} ++ + static void bio_map_kern_endio(struct bio *bio) + { ++ bio_invalidate_vmalloc_pages(bio); + bio_put(bio); + } + +@@ -1501,6 +1516,8 @@ struct bio *bio_map_kern(struct request_queue *q, void *data, unsigned int len, + unsigned long end = (kaddr + len + PAGE_SIZE - 1) >> PAGE_SHIFT; + unsigned long start = kaddr >> PAGE_SHIFT; + const int nr_pages = end - start; ++ bool is_vmalloc = is_vmalloc_addr(data); ++ struct page *page; + int offset, i; + struct bio *bio; + +@@ -1508,6 +1525,11 @@ struct bio *bio_map_kern(struct request_queue *q, void *data, unsigned int len, + if (!bio) + return ERR_PTR(-ENOMEM); + ++ if (is_vmalloc) { ++ flush_kernel_vmap_range(data, len); ++ bio->bi_private = data; ++ } ++ + offset = offset_in_page(kaddr); + for (i = 0; i < nr_pages; i++) { + unsigned int bytes = PAGE_SIZE - offset; +@@ -1518,7 +1540,11 @@ struct bio *bio_map_kern(struct request_queue *q, void *data, unsigned int len, + if (bytes > len) + bytes = len; + +- if (bio_add_pc_page(q, bio, virt_to_page(data), bytes, ++ if (!is_vmalloc) ++ page = virt_to_page(data); ++ else ++ page = vmalloc_to_page(data); ++ if (bio_add_pc_page(q, bio, page, bytes, + offset) < bytes) { + /* we don't support partial mappings */ + bio_put(bio); +diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c +index 1f7127b03490..e4715b35d42c 100644 +--- a/block/blk-cgroup.c ++++ b/block/blk-cgroup.c +@@ -1006,8 +1006,12 @@ static int blkcg_print_stat(struct seq_file *sf, void *v) + } + next: + if (has_stats) { +- off += scnprintf(buf+off, size-off, "\n"); +- seq_commit(sf, off); ++ if (off < size - 1) { ++ off += scnprintf(buf+off, size-off, "\n"); ++ seq_commit(sf, off); ++ } else { ++ seq_commit(sf, -1); ++ } + } + } + +diff --git a/block/blk-core.c b/block/blk-core.c +index 8340f69670d8..5183fca0818a 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -117,6 +117,7 @@ void blk_rq_init(struct request_queue *q, struct request *rq) + rq->internal_tag = -1; + rq->start_time_ns = ktime_get_ns(); + rq->part = NULL; ++ refcount_set(&rq->ref, 1); + } + EXPORT_SYMBOL(blk_rq_init); + +diff --git a/block/blk-iolatency.c b/block/blk-iolatency.c +index d22e61bced86..d973c38ee4fd 100644 +--- a/block/blk-iolatency.c ++++ b/block/blk-iolatency.c +@@ -618,44 +618,26 @@ static void blkcg_iolatency_done_bio(struct rq_qos *rqos, struct bio *bio) + + inflight = atomic_dec_return(&rqw->inflight); + WARN_ON_ONCE(inflight < 0); +- if (iolat->min_lat_nsec == 0) +- goto next; +- iolatency_record_time(iolat, &bio->bi_issue, now, +- issue_as_root); +- window_start = atomic64_read(&iolat->window_start); +- if (now > window_start && +- (now - window_start) >= iolat->cur_win_nsec) { +- if (atomic64_cmpxchg(&iolat->window_start, +- window_start, now) == window_start) +- iolatency_check_latencies(iolat, now); ++ /* ++ * If bi_status is BLK_STS_AGAIN, the bio wasn't actually ++ * submitted, so do not account for it. ++ */ ++ if (iolat->min_lat_nsec && bio->bi_status != BLK_STS_AGAIN) { ++ iolatency_record_time(iolat, &bio->bi_issue, now, ++ issue_as_root); ++ window_start = atomic64_read(&iolat->window_start); ++ if (now > window_start && ++ (now - window_start) >= iolat->cur_win_nsec) { ++ if (atomic64_cmpxchg(&iolat->window_start, ++ window_start, now) == window_start) ++ iolatency_check_latencies(iolat, now); ++ } + } +-next: + wake_up(&rqw->wait); + blkg = blkg->parent; + } + } + +-static void blkcg_iolatency_cleanup(struct rq_qos *rqos, struct bio *bio) +-{ +- struct blkcg_gq *blkg; +- +- blkg = bio->bi_blkg; +- while (blkg && blkg->parent) { +- struct rq_wait *rqw; +- struct iolatency_grp *iolat; +- +- iolat = blkg_to_lat(blkg); +- if (!iolat) +- goto next; +- +- rqw = &iolat->rq_wait; +- atomic_dec(&rqw->inflight); +- wake_up(&rqw->wait); +-next: +- blkg = blkg->parent; +- } +-} +- + static void blkcg_iolatency_exit(struct rq_qos *rqos) + { + struct blk_iolatency *blkiolat = BLKIOLATENCY(rqos); +@@ -667,7 +649,6 @@ static void blkcg_iolatency_exit(struct rq_qos *rqos) + + static struct rq_qos_ops blkcg_iolatency_ops = { + .throttle = blkcg_iolatency_throttle, +- .cleanup = blkcg_iolatency_cleanup, + .done_bio = blkcg_iolatency_done_bio, + .exit = blkcg_iolatency_exit, + }; +@@ -778,8 +759,10 @@ static int iolatency_set_min_lat_nsec(struct blkcg_gq *blkg, u64 val) + + if (!oldval && val) + return 1; +- if (oldval && !val) ++ if (oldval && !val) { ++ blkcg_clear_delay(blkg); + return -1; ++ } + return 0; + } + +diff --git a/block/blk-rq-qos.c b/block/blk-rq-qos.c +index 659ccb8b693f..06d024204f50 100644 +--- a/block/blk-rq-qos.c ++++ b/block/blk-rq-qos.c +@@ -202,6 +202,7 @@ static int rq_qos_wake_function(struct wait_queue_entry *curr, + return -1; + + data->got_token = true; ++ smp_wmb(); + list_del_init(&curr->entry); + wake_up_process(data->task); + return 1; +@@ -245,6 +246,7 @@ void rq_qos_wait(struct rq_wait *rqw, void *private_data, + + prepare_to_wait_exclusive(&rqw->wait, &data.wq, TASK_UNINTERRUPTIBLE); + do { ++ /* The memory barrier in set_task_state saves us here. */ + if (data.got_token) + break; + if (!has_sleeper && acquire_inflight_cb(rqw, private_data)) { +@@ -255,12 +257,14 @@ void rq_qos_wait(struct rq_wait *rqw, void *private_data, + * which means we now have two. Put our local token + * and wake anyone else potentially waiting for one. + */ ++ smp_rmb(); + if (data.got_token) + cleanup_cb(rqw, private_data); + break; + } + io_schedule(); +- has_sleeper = false; ++ has_sleeper = true; ++ set_current_state(TASK_UNINTERRUPTIBLE); + } while (1); + finish_wait(&rqw->wait, &data.wq); + } +diff --git a/block/blk-throttle.c b/block/blk-throttle.c +index 9ea7c0ecad10..8ab6c8153223 100644 +--- a/block/blk-throttle.c ++++ b/block/blk-throttle.c +@@ -881,13 +881,10 @@ static bool tg_with_in_iops_limit(struct throtl_grp *tg, struct bio *bio, + unsigned long jiffy_elapsed, jiffy_wait, jiffy_elapsed_rnd; + u64 tmp; + +- jiffy_elapsed = jiffy_elapsed_rnd = jiffies - tg->slice_start[rw]; +- +- /* Slice has just started. Consider one slice interval */ +- if (!jiffy_elapsed) +- jiffy_elapsed_rnd = tg->td->throtl_slice; ++ jiffy_elapsed = jiffies - tg->slice_start[rw]; + +- jiffy_elapsed_rnd = roundup(jiffy_elapsed_rnd, tg->td->throtl_slice); ++ /* Round up to the next throttle slice, wait time must be nonzero */ ++ jiffy_elapsed_rnd = roundup(jiffy_elapsed + 1, tg->td->throtl_slice); + + /* + * jiffy_elapsed_rnd should not be a big value as minimum iops can be +diff --git a/block/blk-zoned.c b/block/blk-zoned.c +index ae7e91bd0618..0434e2846028 100644 +--- a/block/blk-zoned.c ++++ b/block/blk-zoned.c +@@ -14,6 +14,9 @@ + #include + #include + #include ++#include ++#include ++#include + + #include "blk.h" + +@@ -70,7 +73,7 @@ EXPORT_SYMBOL_GPL(__blk_req_zone_write_unlock); + static inline unsigned int __blkdev_nr_zones(struct request_queue *q, + sector_t nr_sectors) + { +- unsigned long zone_sectors = blk_queue_zone_sectors(q); ++ sector_t zone_sectors = blk_queue_zone_sectors(q); + + return (nr_sectors + zone_sectors - 1) >> ilog2(zone_sectors); + } +@@ -373,22 +376,25 @@ static inline unsigned long *blk_alloc_zone_bitmap(int node, + * Allocate an array of struct blk_zone to get nr_zones zone information. + * The allocated array may be smaller than nr_zones. + */ +-static struct blk_zone *blk_alloc_zones(int node, unsigned int *nr_zones) ++static struct blk_zone *blk_alloc_zones(unsigned int *nr_zones) + { +- size_t size = *nr_zones * sizeof(struct blk_zone); +- struct page *page; +- int order; +- +- for (order = get_order(size); order >= 0; order--) { +- page = alloc_pages_node(node, GFP_NOIO | __GFP_ZERO, order); +- if (page) { +- *nr_zones = min_t(unsigned int, *nr_zones, +- (PAGE_SIZE << order) / sizeof(struct blk_zone)); +- return page_address(page); +- } ++ struct blk_zone *zones; ++ size_t nrz = min(*nr_zones, BLK_ZONED_REPORT_MAX_ZONES); ++ ++ /* ++ * GFP_KERNEL here is meaningless as the caller task context has ++ * the PF_MEMALLOC_NOIO flag set in blk_revalidate_disk_zones() ++ * with memalloc_noio_save(). ++ */ ++ zones = kvcalloc(nrz, sizeof(struct blk_zone), GFP_KERNEL); ++ if (!zones) { ++ *nr_zones = 0; ++ return NULL; + } + +- return NULL; ++ *nr_zones = nrz; ++ ++ return zones; + } + + void blk_queue_free_zone_bitmaps(struct request_queue *q) +@@ -415,6 +421,7 @@ int blk_revalidate_disk_zones(struct gendisk *disk) + unsigned long *seq_zones_wlock = NULL, *seq_zones_bitmap = NULL; + unsigned int i, rep_nr_zones = 0, z = 0, nrz; + struct blk_zone *zones = NULL; ++ unsigned int noio_flag; + sector_t sector = 0; + int ret = 0; + +@@ -427,6 +434,12 @@ int blk_revalidate_disk_zones(struct gendisk *disk) + return 0; + } + ++ /* ++ * Ensure that all memory allocations in this context are done as ++ * if GFP_NOIO was specified. ++ */ ++ noio_flag = memalloc_noio_save(); ++ + if (!blk_queue_is_zoned(q) || !nr_zones) { + nr_zones = 0; + goto update; +@@ -443,7 +456,7 @@ int blk_revalidate_disk_zones(struct gendisk *disk) + + /* Get zone information and initialize seq_zones_bitmap */ + rep_nr_zones = nr_zones; +- zones = blk_alloc_zones(q->node, &rep_nr_zones); ++ zones = blk_alloc_zones(&rep_nr_zones); + if (!zones) + goto out; + +@@ -480,8 +493,9 @@ int blk_revalidate_disk_zones(struct gendisk *disk) + blk_mq_unfreeze_queue(q); + + out: +- free_pages((unsigned long)zones, +- get_order(rep_nr_zones * sizeof(struct blk_zone))); ++ memalloc_noio_restore(noio_flag); ++ ++ kvfree(zones); + kfree(seq_zones_wlock); + kfree(seq_zones_bitmap); + +diff --git a/block/elevator.c b/block/elevator.c +index 2f17d66d0e61..a3168cb0ea7d 100644 +--- a/block/elevator.c ++++ b/block/elevator.c +@@ -604,8 +604,10 @@ int elevator_init_mq(struct request_queue *q) + struct elevator_type *e; + int err = 0; + ++#ifndef CONFIG_ZEN_INTERACTIVE + if (q->nr_hw_queues != 1) + return 0; ++#endif + + /* + * q->sysfs_lock must be held to provide mutual exclusion between +@@ -615,7 +617,13 @@ int elevator_init_mq(struct request_queue *q) + if (unlikely(q->elevator)) + goto out_unlock; + ++#if defined(CONFIG_ZEN_INTERACTIVE) && defined(CONFIG_MQ_IOSCHED_BFQ) ++ e = elevator_get(q, "bfq-mq", false); ++#elif defined(CONFIG_ZEN_INTERACTIVE) && defined(CONFIG_IOSCHED_BFQ) ++ e = elevator_get(q, "bfq", false); ++#else + e = elevator_get(q, "mq-deadline", false); ++#endif + if (!e) + goto out_unlock; + +diff --git a/crypto/asymmetric_keys/Kconfig b/crypto/asymmetric_keys/Kconfig +index be70ca6c85d3..1f1f004dc757 100644 +--- a/crypto/asymmetric_keys/Kconfig ++++ b/crypto/asymmetric_keys/Kconfig +@@ -15,6 +15,7 @@ config ASYMMETRIC_PUBLIC_KEY_SUBTYPE + select MPILIB + select CRYPTO_HASH_INFO + select CRYPTO_AKCIPHER ++ select CRYPTO_HASH + help + This option provides support for asymmetric public key type handling. + If signature generation and/or verification are to be used, +@@ -65,6 +66,7 @@ config TPM_KEY_PARSER + config PKCS7_MESSAGE_PARSER + tristate "PKCS#7 message parser" + depends on X509_CERTIFICATE_PARSER ++ select CRYPTO_HASH + select ASN1 + select OID_REGISTRY + help +@@ -87,6 +89,7 @@ config SIGNED_PE_FILE_VERIFICATION + bool "Support for PE file signature verification" + depends on PKCS7_MESSAGE_PARSER=y + depends on SYSTEM_DATA_VERIFICATION ++ select CRYPTO_HASH + select ASN1 + select OID_REGISTRY + help +diff --git a/crypto/chacha20poly1305.c b/crypto/chacha20poly1305.c +index 2db7eac4bf3b..2e2c25c62be6 100644 +--- a/crypto/chacha20poly1305.c ++++ b/crypto/chacha20poly1305.c +@@ -61,6 +61,8 @@ struct chachapoly_req_ctx { + unsigned int cryptlen; + /* Actual AD, excluding IV */ + unsigned int assoclen; ++ /* request flags, with MAY_SLEEP cleared if needed */ ++ u32 flags; + union { + struct poly_req poly; + struct chacha_req chacha; +@@ -70,8 +72,12 @@ struct chachapoly_req_ctx { + static inline void async_done_continue(struct aead_request *req, int err, + int (*cont)(struct aead_request *)) + { +- if (!err) ++ if (!err) { ++ struct chachapoly_req_ctx *rctx = aead_request_ctx(req); ++ ++ rctx->flags &= ~CRYPTO_TFM_REQ_MAY_SLEEP; + err = cont(req); ++ } + + if (err != -EINPROGRESS && err != -EBUSY) + aead_request_complete(req, err); +@@ -138,7 +144,7 @@ static int chacha_decrypt(struct aead_request *req) + dst = scatterwalk_ffwd(rctx->dst, req->dst, req->assoclen); + } + +- skcipher_request_set_callback(&creq->req, aead_request_flags(req), ++ skcipher_request_set_callback(&creq->req, rctx->flags, + chacha_decrypt_done, req); + skcipher_request_set_tfm(&creq->req, ctx->chacha); + skcipher_request_set_crypt(&creq->req, src, dst, +@@ -182,7 +188,7 @@ static int poly_tail(struct aead_request *req) + memcpy(&preq->tail.cryptlen, &len, sizeof(len)); + sg_set_buf(preq->src, &preq->tail, sizeof(preq->tail)); + +- ahash_request_set_callback(&preq->req, aead_request_flags(req), ++ ahash_request_set_callback(&preq->req, rctx->flags, + poly_tail_done, req); + ahash_request_set_tfm(&preq->req, ctx->poly); + ahash_request_set_crypt(&preq->req, preq->src, +@@ -213,7 +219,7 @@ static int poly_cipherpad(struct aead_request *req) + sg_init_table(preq->src, 1); + sg_set_buf(preq->src, &preq->pad, padlen); + +- ahash_request_set_callback(&preq->req, aead_request_flags(req), ++ ahash_request_set_callback(&preq->req, rctx->flags, + poly_cipherpad_done, req); + ahash_request_set_tfm(&preq->req, ctx->poly); + ahash_request_set_crypt(&preq->req, preq->src, NULL, padlen); +@@ -244,7 +250,7 @@ static int poly_cipher(struct aead_request *req) + sg_init_table(rctx->src, 2); + crypt = scatterwalk_ffwd(rctx->src, crypt, req->assoclen); + +- ahash_request_set_callback(&preq->req, aead_request_flags(req), ++ ahash_request_set_callback(&preq->req, rctx->flags, + poly_cipher_done, req); + ahash_request_set_tfm(&preq->req, ctx->poly); + ahash_request_set_crypt(&preq->req, crypt, NULL, rctx->cryptlen); +@@ -274,7 +280,7 @@ static int poly_adpad(struct aead_request *req) + sg_init_table(preq->src, 1); + sg_set_buf(preq->src, preq->pad, padlen); + +- ahash_request_set_callback(&preq->req, aead_request_flags(req), ++ ahash_request_set_callback(&preq->req, rctx->flags, + poly_adpad_done, req); + ahash_request_set_tfm(&preq->req, ctx->poly); + ahash_request_set_crypt(&preq->req, preq->src, NULL, padlen); +@@ -298,7 +304,7 @@ static int poly_ad(struct aead_request *req) + struct poly_req *preq = &rctx->u.poly; + int err; + +- ahash_request_set_callback(&preq->req, aead_request_flags(req), ++ ahash_request_set_callback(&preq->req, rctx->flags, + poly_ad_done, req); + ahash_request_set_tfm(&preq->req, ctx->poly); + ahash_request_set_crypt(&preq->req, req->src, NULL, rctx->assoclen); +@@ -325,7 +331,7 @@ static int poly_setkey(struct aead_request *req) + sg_init_table(preq->src, 1); + sg_set_buf(preq->src, rctx->key, sizeof(rctx->key)); + +- ahash_request_set_callback(&preq->req, aead_request_flags(req), ++ ahash_request_set_callback(&preq->req, rctx->flags, + poly_setkey_done, req); + ahash_request_set_tfm(&preq->req, ctx->poly); + ahash_request_set_crypt(&preq->req, preq->src, NULL, sizeof(rctx->key)); +@@ -349,7 +355,7 @@ static int poly_init(struct aead_request *req) + struct poly_req *preq = &rctx->u.poly; + int err; + +- ahash_request_set_callback(&preq->req, aead_request_flags(req), ++ ahash_request_set_callback(&preq->req, rctx->flags, + poly_init_done, req); + ahash_request_set_tfm(&preq->req, ctx->poly); + +@@ -387,7 +393,7 @@ static int poly_genkey(struct aead_request *req) + + chacha_iv(creq->iv, req, 0); + +- skcipher_request_set_callback(&creq->req, aead_request_flags(req), ++ skcipher_request_set_callback(&creq->req, rctx->flags, + poly_genkey_done, req); + skcipher_request_set_tfm(&creq->req, ctx->chacha); + skcipher_request_set_crypt(&creq->req, creq->src, creq->src, +@@ -427,7 +433,7 @@ static int chacha_encrypt(struct aead_request *req) + dst = scatterwalk_ffwd(rctx->dst, req->dst, req->assoclen); + } + +- skcipher_request_set_callback(&creq->req, aead_request_flags(req), ++ skcipher_request_set_callback(&creq->req, rctx->flags, + chacha_encrypt_done, req); + skcipher_request_set_tfm(&creq->req, ctx->chacha); + skcipher_request_set_crypt(&creq->req, src, dst, +@@ -445,6 +451,7 @@ static int chachapoly_encrypt(struct aead_request *req) + struct chachapoly_req_ctx *rctx = aead_request_ctx(req); + + rctx->cryptlen = req->cryptlen; ++ rctx->flags = aead_request_flags(req); + + /* encrypt call chain: + * - chacha_encrypt/done() +@@ -466,6 +473,7 @@ static int chachapoly_decrypt(struct aead_request *req) + struct chachapoly_req_ctx *rctx = aead_request_ctx(req); + + rctx->cryptlen = req->cryptlen - POLY1305_DIGEST_SIZE; ++ rctx->flags = aead_request_flags(req); + + /* decrypt call chain: + * - poly_genkey/done() +diff --git a/crypto/ghash-generic.c b/crypto/ghash-generic.c +index 6425b9cd718e..dad9e1f91a78 100644 +--- a/crypto/ghash-generic.c ++++ b/crypto/ghash-generic.c +@@ -31,6 +31,7 @@ static int ghash_setkey(struct crypto_shash *tfm, + const u8 *key, unsigned int keylen) + { + struct ghash_ctx *ctx = crypto_shash_ctx(tfm); ++ be128 k; + + if (keylen != GHASH_BLOCK_SIZE) { + crypto_shash_set_flags(tfm, CRYPTO_TFM_RES_BAD_KEY_LEN); +@@ -39,7 +40,12 @@ static int ghash_setkey(struct crypto_shash *tfm, + + if (ctx->gf128) + gf128mul_free_4k(ctx->gf128); +- ctx->gf128 = gf128mul_init_4k_lle((be128 *)key); ++ ++ BUILD_BUG_ON(sizeof(k) != GHASH_BLOCK_SIZE); ++ memcpy(&k, key, GHASH_BLOCK_SIZE); /* avoid violating alignment rules */ ++ ctx->gf128 = gf128mul_init_4k_lle(&k); ++ memzero_explicit(&k, GHASH_BLOCK_SIZE); ++ + if (!ctx->gf128) + return -ENOMEM; + +diff --git a/crypto/lrw.c b/crypto/lrw.c +index 58009cf63a6e..be829f6afc8e 100644 +--- a/crypto/lrw.c ++++ b/crypto/lrw.c +@@ -384,7 +384,7 @@ static int create(struct crypto_template *tmpl, struct rtattr **tb) + inst->alg.base.cra_priority = alg->base.cra_priority; + inst->alg.base.cra_blocksize = LRW_BLOCK_SIZE; + inst->alg.base.cra_alignmask = alg->base.cra_alignmask | +- (__alignof__(__be32) - 1); ++ (__alignof__(be128) - 1); + + inst->alg.ivsize = LRW_BLOCK_SIZE; + inst->alg.min_keysize = crypto_skcipher_alg_min_keysize(alg) + +diff --git a/crypto/serpent_generic.c b/crypto/serpent_generic.c +index 16f612b6dbca..a9cc0b2aa0d6 100644 +--- a/crypto/serpent_generic.c ++++ b/crypto/serpent_generic.c +@@ -225,7 +225,13 @@ + x4 ^= x2; \ + }) + +-static void __serpent_setkey_sbox(u32 r0, u32 r1, u32 r2, u32 r3, u32 r4, u32 *k) ++/* ++ * both gcc and clang have misoptimized this function in the past, ++ * producing horrible object code from spilling temporary variables ++ * on the stack. Forcing this part out of line avoids that. ++ */ ++static noinline void __serpent_setkey_sbox(u32 r0, u32 r1, u32 r2, ++ u32 r3, u32 r4, u32 *k) + { + k += 100; + S3(r3, r4, r0, r1, r2); store_and_load_keys(r1, r2, r4, r3, 28, 24); +diff --git a/crypto/testmgr.c b/crypto/testmgr.c +index 658a7eeebab2..292d28caf00f 100644 +--- a/crypto/testmgr.c ++++ b/crypto/testmgr.c +@@ -1279,6 +1279,7 @@ static int test_hash_vec(const char *driver, const struct hash_testvec *vec, + req, tsgl, hashstate); + if (err) + return err; ++ cond_resched(); + } + } + #endif +@@ -1493,6 +1494,7 @@ static int __alg_test_hash(const struct hash_testvec *vecs, + err = test_hash_vec(driver, &vecs[i], i, req, tsgl, hashstate); + if (err) + goto out; ++ cond_resched(); + } + err = test_hash_vs_generic_impl(driver, generic_driver, maxkeysize, req, + tsgl, hashstate); +@@ -1755,6 +1757,7 @@ static int test_aead_vec(const char *driver, int enc, + &cfg, req, tsgls); + if (err) + return err; ++ cond_resched(); + } + } + #endif +@@ -1994,6 +1997,7 @@ static int test_aead(const char *driver, int enc, + tsgls); + if (err) + return err; ++ cond_resched(); + } + return 0; + } +@@ -2336,6 +2340,7 @@ static int test_skcipher_vec(const char *driver, int enc, + &cfg, req, tsgls); + if (err) + return err; ++ cond_resched(); + } + } + #endif +@@ -2535,6 +2540,7 @@ static int test_skcipher(const char *driver, int enc, + tsgls); + if (err) + return err; ++ cond_resched(); + } + return 0; + } +diff --git a/drivers/acpi/acpica/acevents.h b/drivers/acpi/acpica/acevents.h +index 831660179662..c8652f91054e 100644 +--- a/drivers/acpi/acpica/acevents.h ++++ b/drivers/acpi/acpica/acevents.h +@@ -69,7 +69,8 @@ acpi_status + acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked); + + acpi_status +-acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info); ++acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info, ++ u8 clear_on_enable); + + acpi_status + acpi_ev_remove_gpe_reference(struct acpi_gpe_event_info *gpe_event_info); +diff --git a/drivers/acpi/acpica/evgpe.c b/drivers/acpi/acpica/evgpe.c +index 62d3aa74277b..344feba29063 100644 +--- a/drivers/acpi/acpica/evgpe.c ++++ b/drivers/acpi/acpica/evgpe.c +@@ -146,6 +146,7 @@ acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked) + * FUNCTION: acpi_ev_add_gpe_reference + * + * PARAMETERS: gpe_event_info - Add a reference to this GPE ++ * clear_on_enable - Clear GPE status before enabling it + * + * RETURN: Status + * +@@ -155,7 +156,8 @@ acpi_ev_mask_gpe(struct acpi_gpe_event_info *gpe_event_info, u8 is_masked) + ******************************************************************************/ + + acpi_status +-acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info) ++acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info, ++ u8 clear_on_enable) + { + acpi_status status = AE_OK; + +@@ -170,6 +172,10 @@ acpi_ev_add_gpe_reference(struct acpi_gpe_event_info *gpe_event_info) + + /* Enable on first reference */ + ++ if (clear_on_enable) { ++ (void)acpi_hw_clear_gpe(gpe_event_info); ++ } ++ + status = acpi_ev_update_gpe_enable_mask(gpe_event_info); + if (ACPI_SUCCESS(status)) { + status = acpi_ev_enable_gpe(gpe_event_info); +diff --git a/drivers/acpi/acpica/evgpeblk.c b/drivers/acpi/acpica/evgpeblk.c +index 328d1d6123ad..fb15e9e2373b 100644 +--- a/drivers/acpi/acpica/evgpeblk.c ++++ b/drivers/acpi/acpica/evgpeblk.c +@@ -453,7 +453,7 @@ acpi_ev_initialize_gpe_block(struct acpi_gpe_xrupt_info *gpe_xrupt_info, + continue; + } + +- status = acpi_ev_add_gpe_reference(gpe_event_info); ++ status = acpi_ev_add_gpe_reference(gpe_event_info, FALSE); + if (ACPI_FAILURE(status)) { + ACPI_EXCEPTION((AE_INFO, status, + "Could not enable GPE 0x%02X", +diff --git a/drivers/acpi/acpica/evxface.c b/drivers/acpi/acpica/evxface.c +index 3df00eb6621b..279ef0557aa3 100644 +--- a/drivers/acpi/acpica/evxface.c ++++ b/drivers/acpi/acpica/evxface.c +@@ -971,7 +971,7 @@ acpi_remove_gpe_handler(acpi_handle gpe_device, + ACPI_GPE_DISPATCH_METHOD) || + (ACPI_GPE_DISPATCH_TYPE(handler->original_flags) == + ACPI_GPE_DISPATCH_NOTIFY)) && handler->originally_enabled) { +- (void)acpi_ev_add_gpe_reference(gpe_event_info); ++ (void)acpi_ev_add_gpe_reference(gpe_event_info, FALSE); + if (ACPI_GPE_IS_POLLING_NEEDED(gpe_event_info)) { + + /* Poll edge triggered GPEs to handle existing events */ +diff --git a/drivers/acpi/acpica/evxfgpe.c b/drivers/acpi/acpica/evxfgpe.c +index 30a083902f52..710488ec59e9 100644 +--- a/drivers/acpi/acpica/evxfgpe.c ++++ b/drivers/acpi/acpica/evxfgpe.c +@@ -108,7 +108,7 @@ acpi_status acpi_enable_gpe(acpi_handle gpe_device, u32 gpe_number) + if (gpe_event_info) { + if (ACPI_GPE_DISPATCH_TYPE(gpe_event_info->flags) != + ACPI_GPE_DISPATCH_NONE) { +- status = acpi_ev_add_gpe_reference(gpe_event_info); ++ status = acpi_ev_add_gpe_reference(gpe_event_info, TRUE); + if (ACPI_SUCCESS(status) && + ACPI_GPE_IS_POLLING_NEEDED(gpe_event_info)) { + +diff --git a/drivers/acpi/arm64/iort.c b/drivers/acpi/arm64/iort.c +index d4551e33fa71..8569b79e8b58 100644 +--- a/drivers/acpi/arm64/iort.c ++++ b/drivers/acpi/arm64/iort.c +@@ -611,8 +611,8 @@ static int iort_dev_find_its_id(struct device *dev, u32 req_id, + + /* Move to ITS specific data */ + its = (struct acpi_iort_its_group *)node->node_data; +- if (idx > its->its_count) { +- dev_err(dev, "requested ITS ID index [%d] is greater than available [%d]\n", ++ if (idx >= its->its_count) { ++ dev_err(dev, "requested ITS ID index [%d] overruns ITS entries [%d]\n", + idx, its->its_count); + return -ENXIO; + } +diff --git a/drivers/acpi/blacklist.c b/drivers/acpi/blacklist.c +index ad2c565f5cbe..a86a770c9b79 100644 +--- a/drivers/acpi/blacklist.c ++++ b/drivers/acpi/blacklist.c +@@ -17,7 +17,9 @@ + + #include "internal.h" + ++#ifdef CONFIG_DMI + static const struct dmi_system_id acpi_rev_dmi_table[] __initconst; ++#endif + + /* + * POLICY: If *anything* doesn't work, put it on the blacklist. +@@ -61,7 +63,9 @@ int __init acpi_blacklisted(void) + } + + (void)early_acpi_osi_init(); ++#ifdef CONFIG_DMI + dmi_check_system(acpi_rev_dmi_table); ++#endif + + return blacklisted; + } +diff --git a/drivers/android/binder.c b/drivers/android/binder.c +index bc26b5511f0a..dc1c83eafc22 100644 +--- a/drivers/android/binder.c ++++ b/drivers/android/binder.c +@@ -2059,10 +2059,9 @@ static size_t binder_get_object(struct binder_proc *proc, + + read_size = min_t(size_t, sizeof(*object), buffer->data_size - offset); + if (offset > buffer->data_size || read_size < sizeof(*hdr) || +- !IS_ALIGNED(offset, sizeof(u32))) ++ binder_alloc_copy_from_buffer(&proc->alloc, object, buffer, ++ offset, read_size)) + return 0; +- binder_alloc_copy_from_buffer(&proc->alloc, object, buffer, +- offset, read_size); + + /* Ok, now see if we read a complete object. */ + hdr = &object->hdr; +@@ -2131,8 +2130,10 @@ static struct binder_buffer_object *binder_validate_ptr( + return NULL; + + buffer_offset = start_offset + sizeof(binder_size_t) * index; +- binder_alloc_copy_from_buffer(&proc->alloc, &object_offset, +- b, buffer_offset, sizeof(object_offset)); ++ if (binder_alloc_copy_from_buffer(&proc->alloc, &object_offset, ++ b, buffer_offset, ++ sizeof(object_offset))) ++ return NULL; + object_size = binder_get_object(proc, b, object_offset, object); + if (!object_size || object->hdr.type != BINDER_TYPE_PTR) + return NULL; +@@ -2212,10 +2213,12 @@ static bool binder_validate_fixup(struct binder_proc *proc, + return false; + last_min_offset = last_bbo->parent_offset + sizeof(uintptr_t); + buffer_offset = objects_start_offset + +- sizeof(binder_size_t) * last_bbo->parent, +- binder_alloc_copy_from_buffer(&proc->alloc, &last_obj_offset, +- b, buffer_offset, +- sizeof(last_obj_offset)); ++ sizeof(binder_size_t) * last_bbo->parent; ++ if (binder_alloc_copy_from_buffer(&proc->alloc, ++ &last_obj_offset, ++ b, buffer_offset, ++ sizeof(last_obj_offset))) ++ return false; + } + return (fixup_offset >= last_min_offset); + } +@@ -2301,15 +2304,15 @@ static void binder_transaction_buffer_release(struct binder_proc *proc, + for (buffer_offset = off_start_offset; buffer_offset < off_end_offset; + buffer_offset += sizeof(binder_size_t)) { + struct binder_object_header *hdr; +- size_t object_size; ++ size_t object_size = 0; + struct binder_object object; + binder_size_t object_offset; + +- binder_alloc_copy_from_buffer(&proc->alloc, &object_offset, +- buffer, buffer_offset, +- sizeof(object_offset)); +- object_size = binder_get_object(proc, buffer, +- object_offset, &object); ++ if (!binder_alloc_copy_from_buffer(&proc->alloc, &object_offset, ++ buffer, buffer_offset, ++ sizeof(object_offset))) ++ object_size = binder_get_object(proc, buffer, ++ object_offset, &object); + if (object_size == 0) { + pr_err("transaction release %d bad object at offset %lld, size %zd\n", + debug_id, (u64)object_offset, buffer->data_size); +@@ -2432,15 +2435,16 @@ static void binder_transaction_buffer_release(struct binder_proc *proc, + for (fd_index = 0; fd_index < fda->num_fds; + fd_index++) { + u32 fd; ++ int err; + binder_size_t offset = fda_offset + + fd_index * sizeof(fd); + +- binder_alloc_copy_from_buffer(&proc->alloc, +- &fd, +- buffer, +- offset, +- sizeof(fd)); +- binder_deferred_fd_close(fd); ++ err = binder_alloc_copy_from_buffer( ++ &proc->alloc, &fd, buffer, ++ offset, sizeof(fd)); ++ WARN_ON(err); ++ if (!err) ++ binder_deferred_fd_close(fd); + } + } break; + default: +@@ -2683,11 +2687,12 @@ static int binder_translate_fd_array(struct binder_fd_array_object *fda, + int ret; + binder_size_t offset = fda_offset + fdi * sizeof(fd); + +- binder_alloc_copy_from_buffer(&target_proc->alloc, +- &fd, t->buffer, +- offset, sizeof(fd)); +- ret = binder_translate_fd(fd, offset, t, thread, +- in_reply_to); ++ ret = binder_alloc_copy_from_buffer(&target_proc->alloc, ++ &fd, t->buffer, ++ offset, sizeof(fd)); ++ if (!ret) ++ ret = binder_translate_fd(fd, offset, t, thread, ++ in_reply_to); + if (ret < 0) + return ret; + } +@@ -2740,8 +2745,12 @@ static int binder_fixup_parent(struct binder_transaction *t, + } + buffer_offset = bp->parent_offset + + (uintptr_t)parent->buffer - (uintptr_t)b->user_data; +- binder_alloc_copy_to_buffer(&target_proc->alloc, b, buffer_offset, +- &bp->buffer, sizeof(bp->buffer)); ++ if (binder_alloc_copy_to_buffer(&target_proc->alloc, b, buffer_offset, ++ &bp->buffer, sizeof(bp->buffer))) { ++ binder_user_error("%d:%d got transaction with invalid parent offset\n", ++ proc->pid, thread->pid); ++ return -EINVAL; ++ } + + return 0; + } +@@ -2979,7 +2988,7 @@ static void binder_transaction(struct binder_proc *proc, + else + return_error = BR_DEAD_REPLY; + mutex_unlock(&context->context_mgr_node_lock); +- if (target_node && target_proc == proc) { ++ if (target_node && target_proc->pid == proc->pid) { + binder_user_error("%d:%d got transaction to context manager from process owning it\n", + proc->pid, thread->pid); + return_error = BR_FAILED_REPLY; +@@ -3160,15 +3169,20 @@ static void binder_transaction(struct binder_proc *proc, + goto err_binder_alloc_buf_failed; + } + if (secctx) { ++ int err; + size_t buf_offset = ALIGN(tr->data_size, sizeof(void *)) + + ALIGN(tr->offsets_size, sizeof(void *)) + + ALIGN(extra_buffers_size, sizeof(void *)) - + ALIGN(secctx_sz, sizeof(u64)); + + t->security_ctx = (uintptr_t)t->buffer->user_data + buf_offset; +- binder_alloc_copy_to_buffer(&target_proc->alloc, +- t->buffer, buf_offset, +- secctx, secctx_sz); ++ err = binder_alloc_copy_to_buffer(&target_proc->alloc, ++ t->buffer, buf_offset, ++ secctx, secctx_sz); ++ if (err) { ++ t->security_ctx = 0; ++ WARN_ON(1); ++ } + security_release_secctx(secctx, secctx_sz); + secctx = NULL; + } +@@ -3225,7 +3239,8 @@ static void binder_transaction(struct binder_proc *proc, + buffer_offset = off_start_offset; + off_end_offset = off_start_offset + tr->offsets_size; + sg_buf_offset = ALIGN(off_end_offset, sizeof(void *)); +- sg_buf_end_offset = sg_buf_offset + extra_buffers_size; ++ sg_buf_end_offset = sg_buf_offset + extra_buffers_size - ++ ALIGN(secctx_sz, sizeof(u64)); + off_min = 0; + for (buffer_offset = off_start_offset; buffer_offset < off_end_offset; + buffer_offset += sizeof(binder_size_t)) { +@@ -3234,11 +3249,16 @@ static void binder_transaction(struct binder_proc *proc, + struct binder_object object; + binder_size_t object_offset; + +- binder_alloc_copy_from_buffer(&target_proc->alloc, +- &object_offset, +- t->buffer, +- buffer_offset, +- sizeof(object_offset)); ++ if (binder_alloc_copy_from_buffer(&target_proc->alloc, ++ &object_offset, ++ t->buffer, ++ buffer_offset, ++ sizeof(object_offset))) { ++ return_error = BR_FAILED_REPLY; ++ return_error_param = -EINVAL; ++ return_error_line = __LINE__; ++ goto err_bad_offset; ++ } + object_size = binder_get_object(target_proc, t->buffer, + object_offset, &object); + if (object_size == 0 || object_offset < off_min) { +@@ -3262,15 +3282,17 @@ static void binder_transaction(struct binder_proc *proc, + + fp = to_flat_binder_object(hdr); + ret = binder_translate_binder(fp, t, thread); +- if (ret < 0) { ++ ++ if (ret < 0 || ++ binder_alloc_copy_to_buffer(&target_proc->alloc, ++ t->buffer, ++ object_offset, ++ fp, sizeof(*fp))) { + return_error = BR_FAILED_REPLY; + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; + } +- binder_alloc_copy_to_buffer(&target_proc->alloc, +- t->buffer, object_offset, +- fp, sizeof(*fp)); + } break; + case BINDER_TYPE_HANDLE: + case BINDER_TYPE_WEAK_HANDLE: { +@@ -3278,15 +3300,16 @@ static void binder_transaction(struct binder_proc *proc, + + fp = to_flat_binder_object(hdr); + ret = binder_translate_handle(fp, t, thread); +- if (ret < 0) { ++ if (ret < 0 || ++ binder_alloc_copy_to_buffer(&target_proc->alloc, ++ t->buffer, ++ object_offset, ++ fp, sizeof(*fp))) { + return_error = BR_FAILED_REPLY; + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; + } +- binder_alloc_copy_to_buffer(&target_proc->alloc, +- t->buffer, object_offset, +- fp, sizeof(*fp)); + } break; + + case BINDER_TYPE_FD: { +@@ -3296,16 +3319,17 @@ static void binder_transaction(struct binder_proc *proc, + int ret = binder_translate_fd(fp->fd, fd_offset, t, + thread, in_reply_to); + +- if (ret < 0) { ++ fp->pad_binder = 0; ++ if (ret < 0 || ++ binder_alloc_copy_to_buffer(&target_proc->alloc, ++ t->buffer, ++ object_offset, ++ fp, sizeof(*fp))) { + return_error = BR_FAILED_REPLY; + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; + } +- fp->pad_binder = 0; +- binder_alloc_copy_to_buffer(&target_proc->alloc, +- t->buffer, object_offset, +- fp, sizeof(*fp)); + } break; + case BINDER_TYPE_FDA: { + struct binder_object ptr_object; +@@ -3393,15 +3417,16 @@ static void binder_transaction(struct binder_proc *proc, + num_valid, + last_fixup_obj_off, + last_fixup_min_off); +- if (ret < 0) { ++ if (ret < 0 || ++ binder_alloc_copy_to_buffer(&target_proc->alloc, ++ t->buffer, ++ object_offset, ++ bp, sizeof(*bp))) { + return_error = BR_FAILED_REPLY; + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; + } +- binder_alloc_copy_to_buffer(&target_proc->alloc, +- t->buffer, object_offset, +- bp, sizeof(*bp)); + last_fixup_obj_off = object_offset; + last_fixup_min_off = 0; + } break; +@@ -4140,20 +4165,27 @@ static int binder_apply_fd_fixups(struct binder_proc *proc, + trace_binder_transaction_fd_recv(t, fd, fixup->offset); + fd_install(fd, fixup->file); + fixup->file = NULL; +- binder_alloc_copy_to_buffer(&proc->alloc, t->buffer, +- fixup->offset, &fd, +- sizeof(u32)); ++ if (binder_alloc_copy_to_buffer(&proc->alloc, t->buffer, ++ fixup->offset, &fd, ++ sizeof(u32))) { ++ ret = -EINVAL; ++ break; ++ } + } + list_for_each_entry_safe(fixup, tmp, &t->fd_fixups, fixup_entry) { + if (fixup->file) { + fput(fixup->file); + } else if (ret) { + u32 fd; +- +- binder_alloc_copy_from_buffer(&proc->alloc, &fd, +- t->buffer, fixup->offset, +- sizeof(fd)); +- binder_deferred_fd_close(fd); ++ int err; ++ ++ err = binder_alloc_copy_from_buffer(&proc->alloc, &fd, ++ t->buffer, ++ fixup->offset, ++ sizeof(fd)); ++ WARN_ON(err); ++ if (!err) ++ binder_deferred_fd_close(fd); + } + list_del(&fixup->fixup_entry); + kfree(fixup); +@@ -4268,6 +4300,8 @@ static int binder_thread_read(struct binder_proc *proc, + case BINDER_WORK_TRANSACTION_COMPLETE: { + binder_inner_proc_unlock(proc); + cmd = BR_TRANSACTION_COMPLETE; ++ kfree(w); ++ binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); + if (put_user(cmd, (uint32_t __user *)ptr)) + return -EFAULT; + ptr += sizeof(uint32_t); +@@ -4276,8 +4310,6 @@ static int binder_thread_read(struct binder_proc *proc, + binder_debug(BINDER_DEBUG_TRANSACTION_COMPLETE, + "%d:%d BR_TRANSACTION_COMPLETE\n", + proc->pid, thread->pid); +- kfree(w); +- binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); + } break; + case BINDER_WORK_NODE: { + struct binder_node *node = container_of(w, struct binder_node, work); +diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c +index ce5603c2291c..6d79a1b0d446 100644 +--- a/drivers/android/binder_alloc.c ++++ b/drivers/android/binder_alloc.c +@@ -1119,15 +1119,16 @@ binder_alloc_copy_user_to_buffer(struct binder_alloc *alloc, + return 0; + } + +-static void binder_alloc_do_buffer_copy(struct binder_alloc *alloc, +- bool to_buffer, +- struct binder_buffer *buffer, +- binder_size_t buffer_offset, +- void *ptr, +- size_t bytes) ++static int binder_alloc_do_buffer_copy(struct binder_alloc *alloc, ++ bool to_buffer, ++ struct binder_buffer *buffer, ++ binder_size_t buffer_offset, ++ void *ptr, ++ size_t bytes) + { + /* All copies must be 32-bit aligned and 32-bit size */ +- BUG_ON(!check_buffer(alloc, buffer, buffer_offset, bytes)); ++ if (!check_buffer(alloc, buffer, buffer_offset, bytes)) ++ return -EINVAL; + + while (bytes) { + unsigned long size; +@@ -1155,25 +1156,26 @@ static void binder_alloc_do_buffer_copy(struct binder_alloc *alloc, + ptr = ptr + size; + buffer_offset += size; + } ++ return 0; + } + +-void binder_alloc_copy_to_buffer(struct binder_alloc *alloc, +- struct binder_buffer *buffer, +- binder_size_t buffer_offset, +- void *src, +- size_t bytes) ++int binder_alloc_copy_to_buffer(struct binder_alloc *alloc, ++ struct binder_buffer *buffer, ++ binder_size_t buffer_offset, ++ void *src, ++ size_t bytes) + { +- binder_alloc_do_buffer_copy(alloc, true, buffer, buffer_offset, +- src, bytes); ++ return binder_alloc_do_buffer_copy(alloc, true, buffer, buffer_offset, ++ src, bytes); + } + +-void binder_alloc_copy_from_buffer(struct binder_alloc *alloc, +- void *dest, +- struct binder_buffer *buffer, +- binder_size_t buffer_offset, +- size_t bytes) ++int binder_alloc_copy_from_buffer(struct binder_alloc *alloc, ++ void *dest, ++ struct binder_buffer *buffer, ++ binder_size_t buffer_offset, ++ size_t bytes) + { +- binder_alloc_do_buffer_copy(alloc, false, buffer, buffer_offset, +- dest, bytes); ++ return binder_alloc_do_buffer_copy(alloc, false, buffer, buffer_offset, ++ dest, bytes); + } + +diff --git a/drivers/android/binder_alloc.h b/drivers/android/binder_alloc.h +index 71bfa95f8e09..db9c1b984695 100644 +--- a/drivers/android/binder_alloc.h ++++ b/drivers/android/binder_alloc.h +@@ -159,17 +159,17 @@ binder_alloc_copy_user_to_buffer(struct binder_alloc *alloc, + const void __user *from, + size_t bytes); + +-void binder_alloc_copy_to_buffer(struct binder_alloc *alloc, +- struct binder_buffer *buffer, +- binder_size_t buffer_offset, +- void *src, +- size_t bytes); +- +-void binder_alloc_copy_from_buffer(struct binder_alloc *alloc, +- void *dest, +- struct binder_buffer *buffer, +- binder_size_t buffer_offset, +- size_t bytes); ++int binder_alloc_copy_to_buffer(struct binder_alloc *alloc, ++ struct binder_buffer *buffer, ++ binder_size_t buffer_offset, ++ void *src, ++ size_t bytes); ++ ++int binder_alloc_copy_from_buffer(struct binder_alloc *alloc, ++ void *dest, ++ struct binder_buffer *buffer, ++ binder_size_t buffer_offset, ++ size_t bytes); + + #endif /* _LINUX_BINDER_ALLOC_H */ + +diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c +index 9d687e1d4325..3bfd9da58473 100644 +--- a/drivers/ata/libata-eh.c ++++ b/drivers/ata/libata-eh.c +@@ -1469,7 +1469,7 @@ static int ata_eh_read_log_10h(struct ata_device *dev, + tf->hob_lbah = buf[10]; + tf->nsect = buf[12]; + tf->hob_nsect = buf[13]; +- if (ata_id_has_ncq_autosense(dev->id)) ++ if (dev->class == ATA_DEV_ZAC && ata_id_has_ncq_autosense(dev->id)) + tf->auxiliary = buf[14] << 16 | buf[15] << 8 | buf[16]; + + return 0; +@@ -1716,7 +1716,8 @@ void ata_eh_analyze_ncq_error(struct ata_link *link) + memcpy(&qc->result_tf, &tf, sizeof(tf)); + qc->result_tf.flags = ATA_TFLAG_ISADDR | ATA_TFLAG_LBA | ATA_TFLAG_LBA48; + qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ; +- if ((qc->result_tf.command & ATA_SENSE) || qc->result_tf.auxiliary) { ++ if (dev->class == ATA_DEV_ZAC && ++ ((qc->result_tf.command & ATA_SENSE) || qc->result_tf.auxiliary)) { + char sense_key, asc, ascq; + + sense_key = (qc->result_tf.auxiliary >> 16) & 0xff; +@@ -1770,10 +1771,11 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, + } + + switch (qc->dev->class) { +- case ATA_DEV_ATA: + case ATA_DEV_ZAC: + if (stat & ATA_SENSE) + ata_eh_request_sense(qc, qc->scsicmd); ++ /* fall through */ ++ case ATA_DEV_ATA: + if (err & ATA_ICRC) + qc->err_mask |= AC_ERR_ATA_BUS; + if (err & (ATA_UNC | ATA_AMNF)) +diff --git a/drivers/atm/iphase.c b/drivers/atm/iphase.c +index 302cf0ba1600..8c7a996d1f16 100644 +--- a/drivers/atm/iphase.c ++++ b/drivers/atm/iphase.c +@@ -63,6 +63,7 @@ + #include + #include + #include ++#include + #include "iphase.h" + #include "suni.h" + #define swap_byte_order(x) (((x & 0xff) << 8) | ((x & 0xff00) >> 8)) +@@ -2760,8 +2761,11 @@ static int ia_ioctl(struct atm_dev *dev, unsigned int cmd, void __user *arg) + } + if (copy_from_user(&ia_cmds, arg, sizeof ia_cmds)) return -EFAULT; + board = ia_cmds.status; +- if ((board < 0) || (board > iadev_count)) +- board = 0; ++ ++ if ((board < 0) || (board > iadev_count)) ++ board = 0; ++ board = array_index_nospec(board, iadev_count + 1); ++ + iadev = ia_dev[board]; + switch (ia_cmds.cmd) { + case MEMDUMP: +diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c +index a7359535caf5..b444f89a2041 100644 +--- a/drivers/base/cacheinfo.c ++++ b/drivers/base/cacheinfo.c +@@ -655,7 +655,8 @@ static int cacheinfo_cpu_pre_down(unsigned int cpu) + + static int __init cacheinfo_sysfs_init(void) + { +- return cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "base/cacheinfo:online", ++ return cpuhp_setup_state(CPUHP_AP_BASE_CACHEINFO_ONLINE, ++ "base/cacheinfo:online", + cacheinfo_cpu_online, cacheinfo_cpu_pre_down); + } + device_initcall(cacheinfo_sysfs_init); +diff --git a/drivers/base/core.c b/drivers/base/core.c +index fd7511e04e62..eaf3aa0cb803 100644 +--- a/drivers/base/core.c ++++ b/drivers/base/core.c +@@ -2211,6 +2211,24 @@ void put_device(struct device *dev) + } + EXPORT_SYMBOL_GPL(put_device); + ++bool kill_device(struct device *dev) ++{ ++ /* ++ * Require the device lock and set the "dead" flag to guarantee that ++ * the update behavior is consistent with the other bitfields near ++ * it and that we cannot have an asynchronous probe routine trying ++ * to run while we are tearing out the bus/class/sysfs from ++ * underneath the device. ++ */ ++ lockdep_assert_held(&dev->mutex); ++ ++ if (dev->p->dead) ++ return false; ++ dev->p->dead = true; ++ return true; ++} ++EXPORT_SYMBOL_GPL(kill_device); ++ + /** + * device_del - delete device from system. + * @dev: device. +@@ -2230,15 +2248,8 @@ void device_del(struct device *dev) + struct kobject *glue_dir = NULL; + struct class_interface *class_intf; + +- /* +- * Hold the device lock and set the "dead" flag to guarantee that +- * the update behavior is consistent with the other bitfields near +- * it and that we cannot have an asynchronous probe routine trying +- * to run while we are tearing out the bus/class/sysfs from +- * underneath the device. +- */ + device_lock(dev); +- dev->p->dead = true; ++ kill_device(dev); + device_unlock(dev); + + /* Notify clients of device removal. This call must come +diff --git a/drivers/base/firmware_loader/fallback.c b/drivers/base/firmware_loader/fallback.c +index f962488546b6..103b5d37fa86 100644 +--- a/drivers/base/firmware_loader/fallback.c ++++ b/drivers/base/firmware_loader/fallback.c +@@ -659,7 +659,7 @@ static bool fw_run_sysfs_fallback(enum fw_opt opt_flags) + /* Also permit LSMs and IMA to fail firmware sysfs fallback */ + ret = security_kernel_load_data(LOADING_FIRMWARE); + if (ret < 0) +- return ret; ++ return false; + + return fw_force_sysfs_fallback(opt_flags); + } +diff --git a/drivers/base/platform.c b/drivers/base/platform.c +index 4d1729853d1a..8b25c7b12179 100644 +--- a/drivers/base/platform.c ++++ b/drivers/base/platform.c +@@ -157,8 +157,13 @@ int platform_get_irq(struct platform_device *dev, unsigned int num) + * the device will only expose one IRQ, and this fallback + * allows a common code path across either kind of resource. + */ +- if (num == 0 && has_acpi_companion(&dev->dev)) +- return acpi_dev_gpio_irq_get(ACPI_COMPANION(&dev->dev), num); ++ if (num == 0 && has_acpi_companion(&dev->dev)) { ++ int ret = acpi_dev_gpio_irq_get(ACPI_COMPANION(&dev->dev), num); ++ ++ /* Our callers expect -ENXIO for missing IRQs. */ ++ if (ret >= 0 || ret == -EPROBE_DEFER) ++ return ret; ++ } + + return -ENXIO; + #endif +diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c +index 263f82516ff4..e5e1b3a01b1a 100644 +--- a/drivers/base/regmap/regmap-debugfs.c ++++ b/drivers/base/regmap/regmap-debugfs.c +@@ -579,6 +579,8 @@ void regmap_debugfs_init(struct regmap *map, const char *name) + } + + if (!strcmp(name, "dummy")) { ++ kfree(map->debugfs_name); ++ + map->debugfs_name = kasprintf(GFP_KERNEL, "dummy%d", + dummy_index); + name = map->debugfs_name; +diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c +index f1025452bb39..19f57ccfbe1d 100644 +--- a/drivers/base/regmap/regmap.c ++++ b/drivers/base/regmap/regmap.c +@@ -1637,6 +1637,8 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg, + map->format.reg_bytes + + map->format.pad_bytes, + val, val_len); ++ else ++ ret = -ENOTSUPP; + + /* If that didn't work fall back on linearising by hand. */ + if (ret == -ENOTSUPP) { +diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c +index 90ebfcae0ce6..2b3103c30857 100644 +--- a/drivers/block/drbd/drbd_receiver.c ++++ b/drivers/block/drbd/drbd_receiver.c +@@ -5417,7 +5417,7 @@ static int drbd_do_auth(struct drbd_connection *connection) + unsigned int key_len; + char secret[SHARED_SECRET_MAX]; /* 64 byte */ + unsigned int resp_size; +- SHASH_DESC_ON_STACK(desc, connection->cram_hmac_tfm); ++ struct shash_desc *desc; + struct packet_info pi; + struct net_conf *nc; + int err, rv; +@@ -5430,6 +5430,13 @@ static int drbd_do_auth(struct drbd_connection *connection) + memcpy(secret, nc->shared_secret, key_len); + rcu_read_unlock(); + ++ desc = kmalloc(sizeof(struct shash_desc) + ++ crypto_shash_descsize(connection->cram_hmac_tfm), ++ GFP_KERNEL); ++ if (!desc) { ++ rv = -1; ++ goto fail; ++ } + desc->tfm = connection->cram_hmac_tfm; + + rv = crypto_shash_setkey(connection->cram_hmac_tfm, (u8 *)secret, key_len); +@@ -5571,7 +5578,10 @@ static int drbd_do_auth(struct drbd_connection *connection) + kfree(peers_ch); + kfree(response); + kfree(right_response); +- shash_desc_zero(desc); ++ if (desc) { ++ shash_desc_zero(desc); ++ kfree(desc); ++ } + + return rv; + } +diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c +index 9fb9b312ab6b..fee57f7f3821 100644 +--- a/drivers/block/floppy.c ++++ b/drivers/block/floppy.c +@@ -2120,6 +2120,9 @@ static void setup_format_params(int track) + raw_cmd->kernel_data = floppy_track_buffer; + raw_cmd->length = 4 * F_SECT_PER_TRACK; + ++ if (!F_SECT_PER_TRACK) ++ return; ++ + /* allow for about 30ms for data transport per track */ + head_shift = (F_SECT_PER_TRACK + 5) / 6; + +@@ -3230,8 +3233,12 @@ static int set_geometry(unsigned int cmd, struct floppy_struct *g, + int cnt; + + /* sanity checking for parameters. */ +- if (g->sect <= 0 || +- g->head <= 0 || ++ if ((int)g->sect <= 0 || ++ (int)g->head <= 0 || ++ /* check for overflow in max_sector */ ++ (int)(g->sect * g->head) <= 0 || ++ /* check for zero in F_SECT_PER_TRACK */ ++ (unsigned char)((g->sect << 2) >> FD_SIZECODE(g)) == 0 || + g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) || + /* check if reserved bits are set */ + (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_SECTBASEMASK)) != 0) +@@ -3375,6 +3382,24 @@ static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo) + return 0; + } + ++static bool valid_floppy_drive_params(const short autodetect[8], ++ int native_format) ++{ ++ size_t floppy_type_size = ARRAY_SIZE(floppy_type); ++ size_t i = 0; ++ ++ for (i = 0; i < 8; ++i) { ++ if (autodetect[i] < 0 || ++ autodetect[i] >= floppy_type_size) ++ return false; ++ } ++ ++ if (native_format < 0 || native_format >= floppy_type_size) ++ return false; ++ ++ return true; ++} ++ + static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, + unsigned long param) + { +@@ -3501,6 +3526,9 @@ static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int + SUPBOUND(size, strlen((const char *)outparam) + 1); + break; + case FDSETDRVPRM: ++ if (!valid_floppy_drive_params(inparam.dp.autodetect, ++ inparam.dp.native_format)) ++ return -EINVAL; + *UDP = inparam.dp; + break; + case FDGETDRVPRM: +@@ -3698,6 +3726,8 @@ static int compat_setdrvprm(int drive, + return -EPERM; + if (copy_from_user(&v, arg, sizeof(struct compat_floppy_drive_params))) + return -EFAULT; ++ if (!valid_floppy_drive_params(v.autodetect, v.native_format)) ++ return -EINVAL; + mutex_lock(&floppy_mutex); + UDP->cmos = v.cmos; + UDP->max_dtr = v.max_dtr; +diff --git a/drivers/block/loop.c b/drivers/block/loop.c +index f11b7dc16e9d..e1739efca37e 100644 +--- a/drivers/block/loop.c ++++ b/drivers/block/loop.c +@@ -893,7 +893,7 @@ static void loop_unprepare_queue(struct loop_device *lo) + + static int loop_kthread_worker_fn(void *worker_ptr) + { +- current->flags |= PF_LESS_THROTTLE; ++ current->flags |= PF_LESS_THROTTLE | PF_MEMALLOC_NOIO; + return kthread_worker_fn(worker_ptr); + } + +@@ -932,6 +932,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, + struct file *file; + struct inode *inode; + struct address_space *mapping; ++ struct block_device *claimed_bdev = NULL; + int lo_flags = 0; + int error; + loff_t size; +@@ -950,10 +951,11 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, + * here to avoid changing device under exclusive owner. + */ + if (!(mode & FMODE_EXCL)) { +- bdgrab(bdev); +- error = blkdev_get(bdev, mode | FMODE_EXCL, loop_set_fd); +- if (error) ++ claimed_bdev = bd_start_claiming(bdev, loop_set_fd); ++ if (IS_ERR(claimed_bdev)) { ++ error = PTR_ERR(claimed_bdev); + goto out_putf; ++ } + } + + error = mutex_lock_killable(&loop_ctl_mutex); +@@ -1023,15 +1025,15 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, + mutex_unlock(&loop_ctl_mutex); + if (partscan) + loop_reread_partitions(lo, bdev); +- if (!(mode & FMODE_EXCL)) +- blkdev_put(bdev, mode | FMODE_EXCL); ++ if (claimed_bdev) ++ bd_abort_claiming(bdev, claimed_bdev, loop_set_fd); + return 0; + + out_unlock: + mutex_unlock(&loop_ctl_mutex); + out_bdev: +- if (!(mode & FMODE_EXCL)) +- blkdev_put(bdev, mode | FMODE_EXCL); ++ if (claimed_bdev) ++ bd_abort_claiming(bdev, claimed_bdev, loop_set_fd); + out_putf: + fput(file); + out: +diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c +index 3a9bca3aa093..57aebc6e1c28 100644 +--- a/drivers/block/nbd.c ++++ b/drivers/block/nbd.c +@@ -1229,7 +1229,7 @@ static void nbd_clear_sock_ioctl(struct nbd_device *nbd, + struct block_device *bdev) + { + sock_shutdown(nbd); +- kill_bdev(bdev); ++ __invalidate_device(bdev, true); + nbd_bdev_reset(bdev); + if (test_and_clear_bit(NBD_HAS_CONFIG_REF, + &nbd->config->runtime_flags)) +diff --git a/drivers/block/null_blk_main.c b/drivers/block/null_blk_main.c +index 447d635c79a2..2a4f8bc4f930 100644 +--- a/drivers/block/null_blk_main.c ++++ b/drivers/block/null_blk_main.c +@@ -327,11 +327,12 @@ static ssize_t nullb_device_power_store(struct config_item *item, + set_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags); + dev->power = newp; + } else if (dev->power && !newp) { +- mutex_lock(&lock); +- dev->power = newp; +- null_del_dev(dev->nullb); +- mutex_unlock(&lock); +- clear_bit(NULLB_DEV_FL_UP, &dev->flags); ++ if (test_and_clear_bit(NULLB_DEV_FL_UP, &dev->flags)) { ++ mutex_lock(&lock); ++ dev->power = newp; ++ null_del_dev(dev->nullb); ++ mutex_unlock(&lock); ++ } + clear_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags); + } + +diff --git a/drivers/block/swim.c b/drivers/block/swim.c +index 4c297f69171d..5bc4f1be2617 100644 +--- a/drivers/block/swim.c ++++ b/drivers/block/swim.c +@@ -328,7 +328,7 @@ static inline void swim_motor(struct swim __iomem *base, + if (swim_readbit(base, MOTOR_ON)) + break; + current->state = TASK_INTERRUPTIBLE; +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + } + } else if (action == OFF) { + swim_action(base, MOTOR_OFF); +@@ -347,7 +347,7 @@ static inline void swim_eject(struct swim __iomem *base) + if (!swim_readbit(base, DISK_IN)) + break; + current->state = TASK_INTERRUPTIBLE; +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + } + swim_select(base, RELAX); + } +@@ -371,7 +371,7 @@ static inline int swim_step(struct swim __iomem *base) + for (wait = 0; wait < HZ; wait++) { + + current->state = TASK_INTERRUPTIBLE; +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + + swim_select(base, RELAX); + if (!swim_readbit(base, STEP)) +diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig +index 1ffc64770643..57ef113add92 100644 +--- a/drivers/block/zram/Kconfig ++++ b/drivers/block/zram/Kconfig +@@ -2,7 +2,8 @@ + config ZRAM + tristate "Compressed RAM block device support" + depends on BLOCK && SYSFS && ZSMALLOC && CRYPTO +- select CRYPTO_LZO ++ select CRYPTO_LZO if !ZEN_INTERACTIVE ++ select CRYPTO_LZ4 if ZEN_INTERACTIVE + help + Creates virtual block devices called /dev/zramX (X = 0, 1, ...). + Pages written to these disks are compressed and stored in memory +diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c +index d58a359a6622..3393c4d6ec20 100644 +--- a/drivers/block/zram/zram_drv.c ++++ b/drivers/block/zram/zram_drv.c +@@ -41,7 +41,11 @@ static DEFINE_IDR(zram_index_idr); + static DEFINE_MUTEX(zram_index_mutex); + + static int zram_major; ++#ifdef CONFIG_ZEN_INTERACTIVE ++static const char *default_compressor = "lz4"; ++#else + static const char *default_compressor = "lzo-rle"; ++#endif + + /* Module params (documentation at end) */ + static unsigned int num_devices = 1; +diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c +index 50aed5259c2b..6d61f5aafc78 100644 +--- a/drivers/bluetooth/btusb.c ++++ b/drivers/bluetooth/btusb.c +@@ -264,7 +264,9 @@ static const struct usb_device_id blacklist_table[] = { + { USB_DEVICE(0x04ca, 0x3015), .driver_info = BTUSB_QCA_ROME }, + { USB_DEVICE(0x04ca, 0x3016), .driver_info = BTUSB_QCA_ROME }, + { USB_DEVICE(0x04ca, 0x301a), .driver_info = BTUSB_QCA_ROME }, ++ { USB_DEVICE(0x13d3, 0x3491), .driver_info = BTUSB_QCA_ROME }, + { USB_DEVICE(0x13d3, 0x3496), .driver_info = BTUSB_QCA_ROME }, ++ { USB_DEVICE(0x13d3, 0x3501), .driver_info = BTUSB_QCA_ROME }, + + /* Broadcom BCM2035 */ + { USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 }, +diff --git a/drivers/bluetooth/hci_ath.c b/drivers/bluetooth/hci_ath.c +index a55be205b91a..dbfe34664633 100644 +--- a/drivers/bluetooth/hci_ath.c ++++ b/drivers/bluetooth/hci_ath.c +@@ -98,6 +98,9 @@ static int ath_open(struct hci_uart *hu) + + BT_DBG("hu %p", hu); + ++ if (!hci_uart_has_flow_control(hu)) ++ return -EOPNOTSUPP; ++ + ath = kzalloc(sizeof(*ath), GFP_KERNEL); + if (!ath) + return -ENOMEM; +diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c +index 8905ad2edde7..ae2624fce913 100644 +--- a/drivers/bluetooth/hci_bcm.c ++++ b/drivers/bluetooth/hci_bcm.c +@@ -406,6 +406,9 @@ static int bcm_open(struct hci_uart *hu) + + bt_dev_dbg(hu->hdev, "hu %p", hu); + ++ if (!hci_uart_has_flow_control(hu)) ++ return -EOPNOTSUPP; ++ + bcm = kzalloc(sizeof(*bcm), GFP_KERNEL); + if (!bcm) + return -ENOMEM; +diff --git a/drivers/bluetooth/hci_bcsp.c b/drivers/bluetooth/hci_bcsp.c +index 82b13faa9422..fe2e307009f4 100644 +--- a/drivers/bluetooth/hci_bcsp.c ++++ b/drivers/bluetooth/hci_bcsp.c +@@ -744,6 +744,11 @@ static int bcsp_close(struct hci_uart *hu) + skb_queue_purge(&bcsp->rel); + skb_queue_purge(&bcsp->unrel); + ++ if (bcsp->rx_skb) { ++ kfree_skb(bcsp->rx_skb); ++ bcsp->rx_skb = NULL; ++ } ++ + kfree(bcsp); + return 0; + } +diff --git a/drivers/bluetooth/hci_intel.c b/drivers/bluetooth/hci_intel.c +index 207bae5e0d46..31f25153087d 100644 +--- a/drivers/bluetooth/hci_intel.c ++++ b/drivers/bluetooth/hci_intel.c +@@ -391,6 +391,9 @@ static int intel_open(struct hci_uart *hu) + + BT_DBG("hu %p", hu); + ++ if (!hci_uart_has_flow_control(hu)) ++ return -EOPNOTSUPP; ++ + intel = kzalloc(sizeof(*intel), GFP_KERNEL); + if (!intel) + return -ENOMEM; +diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c +index c84f985f348d..c953f14656b5 100644 +--- a/drivers/bluetooth/hci_ldisc.c ++++ b/drivers/bluetooth/hci_ldisc.c +@@ -284,6 +284,19 @@ static int hci_uart_send_frame(struct hci_dev *hdev, struct sk_buff *skb) + return 0; + } + ++/* Check the underlying device or tty has flow control support */ ++bool hci_uart_has_flow_control(struct hci_uart *hu) ++{ ++ /* serdev nodes check if the needed operations are present */ ++ if (hu->serdev) ++ return true; ++ ++ if (hu->tty->driver->ops->tiocmget && hu->tty->driver->ops->tiocmset) ++ return true; ++ ++ return false; ++} ++ + /* Flow control or un-flow control the device */ + void hci_uart_set_flow_control(struct hci_uart *hu, bool enable) + { +diff --git a/drivers/bluetooth/hci_mrvl.c b/drivers/bluetooth/hci_mrvl.c +index 50212ac629e3..49dcf198ffd8 100644 +--- a/drivers/bluetooth/hci_mrvl.c ++++ b/drivers/bluetooth/hci_mrvl.c +@@ -52,6 +52,9 @@ static int mrvl_open(struct hci_uart *hu) + + BT_DBG("hu %p", hu); + ++ if (!hci_uart_has_flow_control(hu)) ++ return -EOPNOTSUPP; ++ + mrvl = kzalloc(sizeof(*mrvl), GFP_KERNEL); + if (!mrvl) + return -ENOMEM; +diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c +index 9d273cdde563..f41fb2c02e4f 100644 +--- a/drivers/bluetooth/hci_qca.c ++++ b/drivers/bluetooth/hci_qca.c +@@ -458,6 +458,9 @@ static int qca_open(struct hci_uart *hu) + + BT_DBG("hu %p qca_open", hu); + ++ if (!hci_uart_has_flow_control(hu)) ++ return -EOPNOTSUPP; ++ + qca = kzalloc(sizeof(struct qca_data), GFP_KERNEL); + if (!qca) + return -ENOMEM; +diff --git a/drivers/bluetooth/hci_uart.h b/drivers/bluetooth/hci_uart.h +index d8cf005e3c5d..22c278b13ab9 100644 +--- a/drivers/bluetooth/hci_uart.h ++++ b/drivers/bluetooth/hci_uart.h +@@ -103,6 +103,7 @@ int hci_uart_tx_wakeup(struct hci_uart *hu); + int hci_uart_init_ready(struct hci_uart *hu); + void hci_uart_init_work(struct work_struct *work); + void hci_uart_set_baudrate(struct hci_uart *hu, unsigned int speed); ++bool hci_uart_has_flow_control(struct hci_uart *hu); + void hci_uart_set_flow_control(struct hci_uart *hu, bool enable); + void hci_uart_set_speeds(struct hci_uart *hu, unsigned int init_speed, + unsigned int oper_speed); +diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c +index 5c39f20378b8..9ac6671bb514 100644 +--- a/drivers/char/hpet.c ++++ b/drivers/char/hpet.c +@@ -567,8 +567,7 @@ static inline unsigned long hpet_time_div(struct hpets *hpets, + unsigned long long m; + + m = hpets->hp_tick_freq + (dis >> 1); +- do_div(m, dis); +- return (unsigned long)m; ++ return div64_ul(m, dis); + } + + static int +diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c +index 1dc10740fc0f..083c6f01bd8c 100644 +--- a/drivers/char/ipmi/ipmi_msghandler.c ++++ b/drivers/char/ipmi/ipmi_msghandler.c +@@ -3541,7 +3541,7 @@ static void cleanup_smi_msgs(struct ipmi_smi *intf) + /* Current message first, to preserve order */ + while (intf->curr_msg && !list_empty(&intf->waiting_rcv_msgs)) { + /* Wait for the message to clear out. */ +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + } + + /* No need for locks, the interface is down. */ +diff --git a/drivers/char/ipmi/ipmi_si_platform.c b/drivers/char/ipmi/ipmi_si_platform.c +index f2a91c4d8cab..0cd849675d99 100644 +--- a/drivers/char/ipmi/ipmi_si_platform.c ++++ b/drivers/char/ipmi/ipmi_si_platform.c +@@ -19,6 +19,7 @@ + #include "ipmi_si.h" + #include "ipmi_dmi.h" + ++static bool platform_registered; + static bool si_tryplatform = true; + #ifdef CONFIG_ACPI + static bool si_tryacpi = true; +@@ -469,9 +470,12 @@ void ipmi_si_platform_init(void) + int rv = platform_driver_register(&ipmi_platform_driver); + if (rv) + pr_err("Unable to register driver: %d\n", rv); ++ else ++ platform_registered = true; + } + + void ipmi_si_platform_shutdown(void) + { +- platform_driver_unregister(&ipmi_platform_driver); ++ if (platform_registered) ++ platform_driver_unregister(&ipmi_platform_driver); + } +diff --git a/drivers/char/ipmi/ipmi_ssif.c b/drivers/char/ipmi/ipmi_ssif.c +index cf8156d6bc07..bcd0ab91d8c8 100644 +--- a/drivers/char/ipmi/ipmi_ssif.c ++++ b/drivers/char/ipmi/ipmi_ssif.c +@@ -303,6 +303,7 @@ struct ssif_info { + ((unsigned int) atomic_read(&(ssif)->stats[SSIF_STAT_ ## stat])) + + static bool initialized; ++static bool platform_registered; + + static void return_hosed_msg(struct ssif_info *ssif_info, + struct ipmi_smi_msg *msg); +@@ -1289,7 +1290,7 @@ static void shutdown_ssif(void *send_info) + + /* make sure the driver is not looking for flags any more. */ + while (ssif_info->ssif_state != SSIF_NORMAL) +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + + ssif_info->stopping = true; + del_timer_sync(&ssif_info->watch_timer); +@@ -2088,6 +2089,8 @@ static int init_ipmi_ssif(void) + rv = platform_driver_register(&ipmi_driver); + if (rv) + pr_err("Unable to register driver: %d\n", rv); ++ else ++ platform_registered = true; + } + + ssif_i2c_driver.address_list = ssif_address_list(); +@@ -2111,7 +2114,7 @@ static void cleanup_ipmi_ssif(void) + + kfree(ssif_i2c_driver.address_list); + +- if (ssif_trydmi) ++ if (ssif_trydmi && platform_registered) + platform_driver_unregister(&ipmi_driver); + + free_ssif_clients(); +diff --git a/drivers/char/snsc.c b/drivers/char/snsc.c +index 5918ea7499bb..5228e78df804 100644 +--- a/drivers/char/snsc.c ++++ b/drivers/char/snsc.c +@@ -198,7 +198,7 @@ scdrv_read(struct file *file, char __user *buf, size_t count, loff_t *f_pos) + add_wait_queue(&sd->sd_rq, &wait); + spin_unlock_irqrestore(&sd->sd_rlock, flags); + +- schedule_timeout(msecs_to_jiffies(SCDRV_TIMEOUT)); ++ schedule_msec_hrtimeout((SCDRV_TIMEOUT)); + + remove_wait_queue(&sd->sd_rq, &wait); + if (signal_pending(current)) { +@@ -294,7 +294,7 @@ scdrv_write(struct file *file, const char __user *buf, + add_wait_queue(&sd->sd_wq, &wait); + spin_unlock_irqrestore(&sd->sd_wlock, flags); + +- schedule_timeout(msecs_to_jiffies(SCDRV_TIMEOUT)); ++ schedule_msec_hrtimeout((SCDRV_TIMEOUT)); + + remove_wait_queue(&sd->sd_wq, &wait); + if (signal_pending(current)) { +diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c +index 90325e1749fb..bf868260f435 100644 +--- a/drivers/char/tpm/tpm-chip.c ++++ b/drivers/char/tpm/tpm-chip.c +@@ -77,6 +77,18 @@ static int tpm_go_idle(struct tpm_chip *chip) + return chip->ops->go_idle(chip); + } + ++static void tpm_clk_enable(struct tpm_chip *chip) ++{ ++ if (chip->ops->clk_enable) ++ chip->ops->clk_enable(chip, true); ++} ++ ++static void tpm_clk_disable(struct tpm_chip *chip) ++{ ++ if (chip->ops->clk_enable) ++ chip->ops->clk_enable(chip, false); ++} ++ + /** + * tpm_chip_start() - power on the TPM + * @chip: a TPM chip to use +@@ -89,13 +101,12 @@ int tpm_chip_start(struct tpm_chip *chip) + { + int ret; + +- if (chip->ops->clk_enable) +- chip->ops->clk_enable(chip, true); ++ tpm_clk_enable(chip); + + if (chip->locality == -1) { + ret = tpm_request_locality(chip); + if (ret) { +- chip->ops->clk_enable(chip, false); ++ tpm_clk_disable(chip); + return ret; + } + } +@@ -103,8 +114,7 @@ int tpm_chip_start(struct tpm_chip *chip) + ret = tpm_cmd_ready(chip); + if (ret) { + tpm_relinquish_locality(chip); +- if (chip->ops->clk_enable) +- chip->ops->clk_enable(chip, false); ++ tpm_clk_disable(chip); + return ret; + } + +@@ -124,8 +134,7 @@ void tpm_chip_stop(struct tpm_chip *chip) + { + tpm_go_idle(chip); + tpm_relinquish_locality(chip); +- if (chip->ops->clk_enable) +- chip->ops->clk_enable(chip, false); ++ tpm_clk_disable(chip); + } + EXPORT_SYMBOL_GPL(tpm_chip_stop); + +@@ -289,15 +298,15 @@ static int tpm_class_shutdown(struct device *dev) + { + struct tpm_chip *chip = container_of(dev, struct tpm_chip, dev); + ++ down_write(&chip->ops_sem); + if (chip->flags & TPM_CHIP_FLAG_TPM2) { +- down_write(&chip->ops_sem); + if (!tpm_chip_start(chip)) { + tpm2_shutdown(chip, TPM2_SU_CLEAR); + tpm_chip_stop(chip); + } +- chip->ops = NULL; +- up_write(&chip->ops_sem); + } ++ chip->ops = NULL; ++ up_write(&chip->ops_sem); + + return 0; + } +diff --git a/drivers/char/tpm/tpm1-cmd.c b/drivers/char/tpm/tpm1-cmd.c +index 85dcf2654d11..faacbe1ffa1a 100644 +--- a/drivers/char/tpm/tpm1-cmd.c ++++ b/drivers/char/tpm/tpm1-cmd.c +@@ -510,7 +510,7 @@ struct tpm1_get_random_out { + * + * Return: + * * number of bytes read +- * * -errno or a TPM return code otherwise ++ * * -errno (positive TPM return codes are masked to -EIO) + */ + int tpm1_get_random(struct tpm_chip *chip, u8 *dest, size_t max) + { +@@ -531,8 +531,11 @@ int tpm1_get_random(struct tpm_chip *chip, u8 *dest, size_t max) + + rc = tpm_transmit_cmd(chip, &buf, sizeof(out->rng_data_len), + "attempting get random"); +- if (rc) ++ if (rc) { ++ if (rc > 0) ++ rc = -EIO; + goto out; ++ } + + out = (struct tpm1_get_random_out *)&buf.data[TPM_HEADER_SIZE]; + +diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c +index 4de49924cfc4..d103545e4055 100644 +--- a/drivers/char/tpm/tpm2-cmd.c ++++ b/drivers/char/tpm/tpm2-cmd.c +@@ -297,7 +297,7 @@ struct tpm2_get_random_out { + * + * Return: + * size of the buffer on success, +- * -errno otherwise ++ * -errno otherwise (positive TPM return codes are masked to -EIO) + */ + int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max) + { +@@ -324,8 +324,11 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max) + offsetof(struct tpm2_get_random_out, + buffer), + "attempting get random"); +- if (err) ++ if (err) { ++ if (err > 0) ++ err = -EIO; + goto out; ++ } + + out = (struct tpm2_get_random_out *) + &buf.data[TPM_HEADER_SIZE]; +diff --git a/drivers/clk/imx/clk-imx8mm.c b/drivers/clk/imx/clk-imx8mm.c +index 122a81ab8e48..01ef2fab5764 100644 +--- a/drivers/clk/imx/clk-imx8mm.c ++++ b/drivers/clk/imx/clk-imx8mm.c +@@ -325,7 +325,7 @@ static const char *imx8mm_dsi_dbi_sels[] = {"osc_24m", "sys_pll1_266m", "sys_pll + "sys_pll2_1000m", "sys_pll3_out", "audio_pll2_out", "video_pll1_out", }; + + static const char *imx8mm_usdhc3_sels[] = {"osc_24m", "sys_pll1_400m", "sys_pll1_800m", "sys_pll2_500m", +- "sys_pll3_out", "sys_pll1_266m", "audio_pll2_clk", "sys_pll1_100m", }; ++ "sys_pll3_out", "sys_pll1_266m", "audio_pll2_out", "sys_pll1_100m", }; + + static const char *imx8mm_csi1_core_sels[] = {"osc_24m", "sys_pll1_266m", "sys_pll2_250m", "sys_pll1_800m", + "sys_pll2_1000m", "sys_pll3_out", "audio_pll2_out", "video_pll1_out", }; +@@ -361,11 +361,11 @@ static const char *imx8mm_pdm_sels[] = {"osc_24m", "sys_pll2_100m", "audio_pll1_ + "sys_pll2_1000m", "sys_pll3_out", "clk_ext3", "audio_pll2_out", }; + + static const char *imx8mm_vpu_h1_sels[] = {"osc_24m", "vpu_pll_out", "sys_pll1_800m", "sys_pll2_1000m", +- "audio_pll2_clk", "sys_pll2_125m", "sys_pll3_clk", "audio_pll1_out", }; ++ "audio_pll2_out", "sys_pll2_125m", "sys_pll3_clk", "audio_pll1_out", }; + + static const char *imx8mm_dram_core_sels[] = {"dram_pll_out", "dram_alt_root", }; + +-static const char *imx8mm_clko1_sels[] = {"osc_24m", "sys_pll1_800m", "osc_27m", "sys_pll1_200m", "audio_pll2_clk", ++static const char *imx8mm_clko1_sels[] = {"osc_24m", "sys_pll1_800m", "osc_27m", "sys_pll1_200m", "audio_pll2_out", + "vpu_pll", "sys_pll1_80m", }; + + static struct clk *clks[IMX8MM_CLK_END]; +diff --git a/drivers/clk/mediatek/clk-mt8183.c b/drivers/clk/mediatek/clk-mt8183.c +index 9d8651033ae9..bc01611c7723 100644 +--- a/drivers/clk/mediatek/clk-mt8183.c ++++ b/drivers/clk/mediatek/clk-mt8183.c +@@ -25,9 +25,11 @@ static const struct mtk_fixed_clk top_fixed_clks[] = { + FIXED_CLK(CLK_TOP_UNIVP_192M, "univpll_192m", "univpll", 192000000), + }; + ++static const struct mtk_fixed_factor top_early_divs[] = { ++ FACTOR(CLK_TOP_CLK13M, "clk13m", "clk26m", 1, 2), ++}; ++ + static const struct mtk_fixed_factor top_divs[] = { +- FACTOR(CLK_TOP_CLK13M, "clk13m", "clk26m", 1, +- 2), + FACTOR(CLK_TOP_F26M_CK_D2, "csw_f26m_ck_d2", "clk26m", 1, + 2), + FACTOR(CLK_TOP_SYSPLL_CK, "syspll_ck", "mainpll", 1, +@@ -1167,37 +1169,57 @@ static int clk_mt8183_apmixed_probe(struct platform_device *pdev) + return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); + } + ++static struct clk_onecell_data *top_clk_data; ++ ++static void clk_mt8183_top_init_early(struct device_node *node) ++{ ++ int i; ++ ++ top_clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK); ++ ++ for (i = 0; i < CLK_TOP_NR_CLK; i++) ++ top_clk_data->clks[i] = ERR_PTR(-EPROBE_DEFER); ++ ++ mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs), ++ top_clk_data); ++ ++ of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data); ++} ++ ++CLK_OF_DECLARE_DRIVER(mt8183_topckgen, "mediatek,mt8183-topckgen", ++ clk_mt8183_top_init_early); ++ + static int clk_mt8183_top_probe(struct platform_device *pdev) + { + struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + void __iomem *base; +- struct clk_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + + base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(base)) + return PTR_ERR(base); + +- clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK); +- + mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks), +- clk_data); ++ top_clk_data); ++ ++ mtk_clk_register_factors(top_early_divs, ARRAY_SIZE(top_early_divs), ++ top_clk_data); + +- mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), clk_data); ++ mtk_clk_register_factors(top_divs, ARRAY_SIZE(top_divs), top_clk_data); + + mtk_clk_register_muxes(top_muxes, ARRAY_SIZE(top_muxes), +- node, &mt8183_clk_lock, clk_data); ++ node, &mt8183_clk_lock, top_clk_data); + + mtk_clk_register_composites(top_aud_muxes, ARRAY_SIZE(top_aud_muxes), +- base, &mt8183_clk_lock, clk_data); ++ base, &mt8183_clk_lock, top_clk_data); + + mtk_clk_register_composites(top_aud_divs, ARRAY_SIZE(top_aud_divs), +- base, &mt8183_clk_lock, clk_data); ++ base, &mt8183_clk_lock, top_clk_data); + + mtk_clk_register_gates(node, top_clks, ARRAY_SIZE(top_clks), +- clk_data); ++ top_clk_data); + +- return of_clk_add_provider(node, of_clk_src_onecell_get, clk_data); ++ return of_clk_add_provider(node, of_clk_src_onecell_get, top_clk_data); + } + + static int clk_mt8183_infra_probe(struct platform_device *pdev) +diff --git a/drivers/clk/meson/clk-mpll.c b/drivers/clk/meson/clk-mpll.c +index f76850d99e59..d3f42e086431 100644 +--- a/drivers/clk/meson/clk-mpll.c ++++ b/drivers/clk/meson/clk-mpll.c +@@ -119,9 +119,12 @@ static int mpll_set_rate(struct clk_hw *hw, + meson_parm_write(clk->map, &mpll->sdm, sdm); + meson_parm_write(clk->map, &mpll->sdm_en, 1); + +- /* Set additional fractional part enable if required */ +- if (MESON_PARM_APPLICABLE(&mpll->ssen)) +- meson_parm_write(clk->map, &mpll->ssen, 1); ++ /* Set spread spectrum if possible */ ++ if (MESON_PARM_APPLICABLE(&mpll->ssen)) { ++ unsigned int ss = ++ mpll->flags & CLK_MESON_MPLL_SPREAD_SPECTRUM ? 1 : 0; ++ meson_parm_write(clk->map, &mpll->ssen, ss); ++ } + + /* Set the integer divider part */ + meson_parm_write(clk->map, &mpll->n2, n2); +diff --git a/drivers/clk/meson/clk-mpll.h b/drivers/clk/meson/clk-mpll.h +index cf79340006dd..0f948430fed4 100644 +--- a/drivers/clk/meson/clk-mpll.h ++++ b/drivers/clk/meson/clk-mpll.h +@@ -23,6 +23,7 @@ struct meson_clk_mpll_data { + }; + + #define CLK_MESON_MPLL_ROUND_CLOSEST BIT(0) ++#define CLK_MESON_MPLL_SPREAD_SPECTRUM BIT(1) + + extern const struct clk_ops meson_clk_mpll_ro_ops; + extern const struct clk_ops meson_clk_mpll_ops; +diff --git a/drivers/clk/sprd/sc9860-clk.c b/drivers/clk/sprd/sc9860-clk.c +index 9980ab55271b..f76305b4bc8d 100644 +--- a/drivers/clk/sprd/sc9860-clk.c ++++ b/drivers/clk/sprd/sc9860-clk.c +@@ -2023,6 +2023,7 @@ static int sc9860_clk_probe(struct platform_device *pdev) + { + const struct of_device_id *match; + const struct sprd_clk_desc *desc; ++ int ret; + + match = of_match_node(sprd_sc9860_clk_ids, pdev->dev.of_node); + if (!match) { +@@ -2031,7 +2032,9 @@ static int sc9860_clk_probe(struct platform_device *pdev) + } + + desc = match->data; +- sprd_clk_regmap_init(pdev, desc); ++ ret = sprd_clk_regmap_init(pdev, desc); ++ if (ret) ++ return ret; + + return sprd_clk_probe(&pdev->dev, desc->hw_clks); + } +diff --git a/drivers/clk/tegra/clk-tegra210.c b/drivers/clk/tegra/clk-tegra210.c +index ac1d27a8c650..e5470a6bbf55 100644 +--- a/drivers/clk/tegra/clk-tegra210.c ++++ b/drivers/clk/tegra/clk-tegra210.c +@@ -2204,9 +2204,9 @@ static struct div_nmp pllu_nmp = { + }; + + static struct tegra_clk_pll_freq_table pll_u_freq_table[] = { +- { 12000000, 480000000, 40, 1, 0, 0 }, +- { 13000000, 480000000, 36, 1, 0, 0 }, /* actual: 468.0 MHz */ +- { 38400000, 480000000, 25, 2, 0, 0 }, ++ { 12000000, 480000000, 40, 1, 1, 0 }, ++ { 13000000, 480000000, 36, 1, 1, 0 }, /* actual: 468.0 MHz */ ++ { 38400000, 480000000, 25, 2, 1, 0 }, + { 0, 0, 0, 0, 0, 0 }, + }; + +@@ -3333,6 +3333,7 @@ static struct tegra_clk_init_table init_table[] __initdata = { + { TEGRA210_CLK_DFLL_REF, TEGRA210_CLK_PLL_P, 51000000, 1 }, + { TEGRA210_CLK_SBC4, TEGRA210_CLK_PLL_P, 12000000, 1 }, + { TEGRA210_CLK_PLL_RE_VCO, TEGRA210_CLK_CLK_MAX, 672000000, 1 }, ++ { TEGRA210_CLK_PLL_U_OUT1, TEGRA210_CLK_CLK_MAX, 48000000, 1 }, + { TEGRA210_CLK_XUSB_GATE, TEGRA210_CLK_CLK_MAX, 0, 1 }, + { TEGRA210_CLK_XUSB_SS_SRC, TEGRA210_CLK_PLL_U_480M, 120000000, 0 }, + { TEGRA210_CLK_XUSB_FS_SRC, TEGRA210_CLK_PLL_U_48M, 48000000, 0 }, +@@ -3357,7 +3358,6 @@ static struct tegra_clk_init_table init_table[] __initdata = { + { TEGRA210_CLK_PLL_DP, TEGRA210_CLK_CLK_MAX, 270000000, 0 }, + { TEGRA210_CLK_SOC_THERM, TEGRA210_CLK_PLL_P, 51000000, 0 }, + { TEGRA210_CLK_CCLK_G, TEGRA210_CLK_CLK_MAX, 0, 1 }, +- { TEGRA210_CLK_PLL_U_OUT1, TEGRA210_CLK_CLK_MAX, 48000000, 1 }, + { TEGRA210_CLK_PLL_U_OUT2, TEGRA210_CLK_CLK_MAX, 60000000, 1 }, + { TEGRA210_CLK_SPDIF_IN_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, + { TEGRA210_CLK_I2S0_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 }, +diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c +index e8eab16b154b..74cb299f5089 100644 +--- a/drivers/clocksource/exynos_mct.c ++++ b/drivers/clocksource/exynos_mct.c +@@ -206,7 +206,7 @@ static void exynos4_frc_resume(struct clocksource *cs) + + static struct clocksource mct_frc = { + .name = "mct-frc", +- .rating = 400, ++ .rating = 450, /* use value higher than ARM arch timer */ + .read = exynos4_frc_read, + .mask = CLOCKSOURCE_MASK(32), + .flags = CLOCK_SOURCE_IS_CONTINUOUS, +@@ -461,7 +461,7 @@ static int exynos4_mct_starting_cpu(unsigned int cpu) + evt->set_state_oneshot_stopped = set_state_shutdown; + evt->tick_resume = set_state_shutdown; + evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT; +- evt->rating = 450; ++ evt->rating = 500; /* use value higher than ARM arch timer */ + + exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET); + +diff --git a/drivers/clocksource/timer-tegra20.c b/drivers/clocksource/timer-tegra20.c +index 1e7ece279730..462be34b41c4 100644 +--- a/drivers/clocksource/timer-tegra20.c ++++ b/drivers/clocksource/timer-tegra20.c +@@ -288,7 +288,7 @@ static int __init tegra_init_timer(struct device_node *np) + pr_err("%s: can't map IRQ for CPU%d\n", + __func__, cpu); + ret = -EINVAL; +- goto out; ++ goto out_irq; + } + + irq_set_status_flags(cpu_to->clkevt.irq, IRQ_NOAUTOEN); +@@ -298,7 +298,8 @@ static int __init tegra_init_timer(struct device_node *np) + if (ret) { + pr_err("%s: cannot setup irq %d for CPU%d\n", + __func__, cpu_to->clkevt.irq, cpu); +- ret = -EINVAL; ++ irq_dispose_mapping(cpu_to->clkevt.irq); ++ cpu_to->clkevt.irq = 0; + goto out_irq; + } + } +@@ -318,6 +319,8 @@ static int __init tegra_init_timer(struct device_node *np) + irq_dispose_mapping(cpu_to->clkevt.irq); + } + } ++ ++ to->of_base.base = timer_reg_base; + out: + timer_of_cleanup(to); + return ret; +diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c +index dced033875bf..6215b7dec2e2 100644 +--- a/drivers/cpufreq/cpufreq_ondemand.c ++++ b/drivers/cpufreq/cpufreq_ondemand.c +@@ -19,7 +19,11 @@ + + /* On-demand governor macros */ + #define DEF_FREQUENCY_UP_THRESHOLD (80) ++#ifdef CONFIG_ZEN_INTERACTIVE ++#define DEF_SAMPLING_DOWN_FACTOR (5) ++#else + #define DEF_SAMPLING_DOWN_FACTOR (1) ++#endif + #define MAX_SAMPLING_DOWN_FACTOR (100000) + #define MICRO_FREQUENCY_UP_THRESHOLD (95) + #define MICRO_FREQUENCY_MIN_SAMPLE_RATE (10000) +diff --git a/drivers/cpufreq/pasemi-cpufreq.c b/drivers/cpufreq/pasemi-cpufreq.c +index 6b1e4abe3248..d2f061015323 100644 +--- a/drivers/cpufreq/pasemi-cpufreq.c ++++ b/drivers/cpufreq/pasemi-cpufreq.c +@@ -131,10 +131,18 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy) + int err = -ENODEV; + + cpu = of_get_cpu_node(policy->cpu, NULL); ++ if (!cpu) ++ goto out; + ++ max_freqp = of_get_property(cpu, "clock-frequency", NULL); + of_node_put(cpu); +- if (!cpu) ++ if (!max_freqp) { ++ err = -EINVAL; + goto out; ++ } ++ ++ /* we need the freq in kHz */ ++ max_freq = *max_freqp / 1000; + + dn = of_find_compatible_node(NULL, NULL, "1682m-sdc"); + if (!dn) +@@ -171,16 +179,6 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy) + } + + pr_debug("init cpufreq on CPU %d\n", policy->cpu); +- +- max_freqp = of_get_property(cpu, "clock-frequency", NULL); +- if (!max_freqp) { +- err = -EINVAL; +- goto out_unmap_sdcpwr; +- } +- +- /* we need the freq in kHz */ +- max_freq = *max_freqp / 1000; +- + pr_debug("max clock-frequency is at %u kHz\n", max_freq); + pr_debug("initializing frequency table\n"); + +@@ -198,9 +196,6 @@ static int pas_cpufreq_cpu_init(struct cpufreq_policy *policy) + + return cpufreq_generic_init(policy, pas_freqs, get_gizmo_latency()); + +-out_unmap_sdcpwr: +- iounmap(sdcpwr_mapbase); +- + out_unmap_sdcasr: + iounmap(sdcasr_mapbase); + out: +diff --git a/drivers/crypto/amcc/crypto4xx_alg.c b/drivers/crypto/amcc/crypto4xx_alg.c +index 49f3e0ce242c..cbfc607282f4 100644 +--- a/drivers/crypto/amcc/crypto4xx_alg.c ++++ b/drivers/crypto/amcc/crypto4xx_alg.c +@@ -67,12 +67,16 @@ static void set_dynamic_sa_command_1(struct dynamic_sa_ctl *sa, u32 cm, + } + + static inline int crypto4xx_crypt(struct skcipher_request *req, +- const unsigned int ivlen, bool decrypt) ++ const unsigned int ivlen, bool decrypt, ++ bool check_blocksize) + { + struct crypto_skcipher *cipher = crypto_skcipher_reqtfm(req); + struct crypto4xx_ctx *ctx = crypto_skcipher_ctx(cipher); + __le32 iv[AES_IV_SIZE]; + ++ if (check_blocksize && !IS_ALIGNED(req->cryptlen, AES_BLOCK_SIZE)) ++ return -EINVAL; ++ + if (ivlen) + crypto4xx_memcpy_to_le32(iv, req->iv, ivlen); + +@@ -81,24 +85,34 @@ static inline int crypto4xx_crypt(struct skcipher_request *req, + ctx->sa_len, 0, NULL); + } + +-int crypto4xx_encrypt_noiv(struct skcipher_request *req) ++int crypto4xx_encrypt_noiv_block(struct skcipher_request *req) ++{ ++ return crypto4xx_crypt(req, 0, false, true); ++} ++ ++int crypto4xx_encrypt_iv_stream(struct skcipher_request *req) ++{ ++ return crypto4xx_crypt(req, AES_IV_SIZE, false, false); ++} ++ ++int crypto4xx_decrypt_noiv_block(struct skcipher_request *req) + { +- return crypto4xx_crypt(req, 0, false); ++ return crypto4xx_crypt(req, 0, true, true); + } + +-int crypto4xx_encrypt_iv(struct skcipher_request *req) ++int crypto4xx_decrypt_iv_stream(struct skcipher_request *req) + { +- return crypto4xx_crypt(req, AES_IV_SIZE, false); ++ return crypto4xx_crypt(req, AES_IV_SIZE, true, false); + } + +-int crypto4xx_decrypt_noiv(struct skcipher_request *req) ++int crypto4xx_encrypt_iv_block(struct skcipher_request *req) + { +- return crypto4xx_crypt(req, 0, true); ++ return crypto4xx_crypt(req, AES_IV_SIZE, false, true); + } + +-int crypto4xx_decrypt_iv(struct skcipher_request *req) ++int crypto4xx_decrypt_iv_block(struct skcipher_request *req) + { +- return crypto4xx_crypt(req, AES_IV_SIZE, true); ++ return crypto4xx_crypt(req, AES_IV_SIZE, true, true); + } + + /** +@@ -269,8 +283,8 @@ crypto4xx_ctr_crypt(struct skcipher_request *req, bool encrypt) + return ret; + } + +- return encrypt ? crypto4xx_encrypt_iv(req) +- : crypto4xx_decrypt_iv(req); ++ return encrypt ? crypto4xx_encrypt_iv_stream(req) ++ : crypto4xx_decrypt_iv_stream(req); + } + + static int crypto4xx_sk_setup_fallback(struct crypto4xx_ctx *ctx, +diff --git a/drivers/crypto/amcc/crypto4xx_core.c b/drivers/crypto/amcc/crypto4xx_core.c +index 16d911aaa508..53e2ba9b0c02 100644 +--- a/drivers/crypto/amcc/crypto4xx_core.c ++++ b/drivers/crypto/amcc/crypto4xx_core.c +@@ -1210,8 +1210,8 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { + .max_keysize = AES_MAX_KEY_SIZE, + .ivsize = AES_IV_SIZE, + .setkey = crypto4xx_setkey_aes_cbc, +- .encrypt = crypto4xx_encrypt_iv, +- .decrypt = crypto4xx_decrypt_iv, ++ .encrypt = crypto4xx_encrypt_iv_block, ++ .decrypt = crypto4xx_decrypt_iv_block, + .init = crypto4xx_sk_init, + .exit = crypto4xx_sk_exit, + } }, +@@ -1222,7 +1222,7 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { + .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY, + .cra_flags = CRYPTO_ALG_ASYNC | + CRYPTO_ALG_KERN_DRIVER_ONLY, +- .cra_blocksize = AES_BLOCK_SIZE, ++ .cra_blocksize = 1, + .cra_ctxsize = sizeof(struct crypto4xx_ctx), + .cra_module = THIS_MODULE, + }, +@@ -1230,8 +1230,8 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { + .max_keysize = AES_MAX_KEY_SIZE, + .ivsize = AES_IV_SIZE, + .setkey = crypto4xx_setkey_aes_cfb, +- .encrypt = crypto4xx_encrypt_iv, +- .decrypt = crypto4xx_decrypt_iv, ++ .encrypt = crypto4xx_encrypt_iv_stream, ++ .decrypt = crypto4xx_decrypt_iv_stream, + .init = crypto4xx_sk_init, + .exit = crypto4xx_sk_exit, + } }, +@@ -1243,7 +1243,7 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { + .cra_flags = CRYPTO_ALG_NEED_FALLBACK | + CRYPTO_ALG_ASYNC | + CRYPTO_ALG_KERN_DRIVER_ONLY, +- .cra_blocksize = AES_BLOCK_SIZE, ++ .cra_blocksize = 1, + .cra_ctxsize = sizeof(struct crypto4xx_ctx), + .cra_module = THIS_MODULE, + }, +@@ -1263,7 +1263,7 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { + .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY, + .cra_flags = CRYPTO_ALG_ASYNC | + CRYPTO_ALG_KERN_DRIVER_ONLY, +- .cra_blocksize = AES_BLOCK_SIZE, ++ .cra_blocksize = 1, + .cra_ctxsize = sizeof(struct crypto4xx_ctx), + .cra_module = THIS_MODULE, + }, +@@ -1290,8 +1290,8 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { + .min_keysize = AES_MIN_KEY_SIZE, + .max_keysize = AES_MAX_KEY_SIZE, + .setkey = crypto4xx_setkey_aes_ecb, +- .encrypt = crypto4xx_encrypt_noiv, +- .decrypt = crypto4xx_decrypt_noiv, ++ .encrypt = crypto4xx_encrypt_noiv_block, ++ .decrypt = crypto4xx_decrypt_noiv_block, + .init = crypto4xx_sk_init, + .exit = crypto4xx_sk_exit, + } }, +@@ -1302,7 +1302,7 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { + .cra_priority = CRYPTO4XX_CRYPTO_PRIORITY, + .cra_flags = CRYPTO_ALG_ASYNC | + CRYPTO_ALG_KERN_DRIVER_ONLY, +- .cra_blocksize = AES_BLOCK_SIZE, ++ .cra_blocksize = 1, + .cra_ctxsize = sizeof(struct crypto4xx_ctx), + .cra_module = THIS_MODULE, + }, +@@ -1310,8 +1310,8 @@ static struct crypto4xx_alg_common crypto4xx_alg[] = { + .max_keysize = AES_MAX_KEY_SIZE, + .ivsize = AES_IV_SIZE, + .setkey = crypto4xx_setkey_aes_ofb, +- .encrypt = crypto4xx_encrypt_iv, +- .decrypt = crypto4xx_decrypt_iv, ++ .encrypt = crypto4xx_encrypt_iv_stream, ++ .decrypt = crypto4xx_decrypt_iv_stream, + .init = crypto4xx_sk_init, + .exit = crypto4xx_sk_exit, + } }, +diff --git a/drivers/crypto/amcc/crypto4xx_core.h b/drivers/crypto/amcc/crypto4xx_core.h +index ca1c25c40c23..6b6841359190 100644 +--- a/drivers/crypto/amcc/crypto4xx_core.h ++++ b/drivers/crypto/amcc/crypto4xx_core.h +@@ -173,10 +173,12 @@ int crypto4xx_setkey_rfc3686(struct crypto_skcipher *cipher, + const u8 *key, unsigned int keylen); + int crypto4xx_encrypt_ctr(struct skcipher_request *req); + int crypto4xx_decrypt_ctr(struct skcipher_request *req); +-int crypto4xx_encrypt_iv(struct skcipher_request *req); +-int crypto4xx_decrypt_iv(struct skcipher_request *req); +-int crypto4xx_encrypt_noiv(struct skcipher_request *req); +-int crypto4xx_decrypt_noiv(struct skcipher_request *req); ++int crypto4xx_encrypt_iv_stream(struct skcipher_request *req); ++int crypto4xx_decrypt_iv_stream(struct skcipher_request *req); ++int crypto4xx_encrypt_iv_block(struct skcipher_request *req); ++int crypto4xx_decrypt_iv_block(struct skcipher_request *req); ++int crypto4xx_encrypt_noiv_block(struct skcipher_request *req); ++int crypto4xx_decrypt_noiv_block(struct skcipher_request *req); + int crypto4xx_rfc3686_encrypt(struct skcipher_request *req); + int crypto4xx_rfc3686_decrypt(struct skcipher_request *req); + int crypto4xx_sha1_alg_init(struct crypto_tfm *tfm); +diff --git a/drivers/crypto/amcc/crypto4xx_trng.c b/drivers/crypto/amcc/crypto4xx_trng.c +index 02a6bed3b062..f10a87e541ed 100644 +--- a/drivers/crypto/amcc/crypto4xx_trng.c ++++ b/drivers/crypto/amcc/crypto4xx_trng.c +@@ -108,7 +108,6 @@ void ppc4xx_trng_probe(struct crypto4xx_core_device *core_dev) + return; + + err_out: +- of_node_put(trng); + iounmap(dev->trng_base); + kfree(rng); + dev->trng_base = NULL; +diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c +index c0ece44f303b..af9e473abdfd 100644 +--- a/drivers/crypto/caam/caamalg.c ++++ b/drivers/crypto/caam/caamalg.c +@@ -999,6 +999,7 @@ static void skcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err, + struct skcipher_request *req = context; + struct skcipher_edesc *edesc; + struct crypto_skcipher *skcipher = crypto_skcipher_reqtfm(req); ++ struct caam_ctx *ctx = crypto_skcipher_ctx(skcipher); + int ivsize = crypto_skcipher_ivsize(skcipher); + + #ifdef DEBUG +@@ -1023,9 +1024,9 @@ static void skcipher_encrypt_done(struct device *jrdev, u32 *desc, u32 err, + + /* + * The crypto API expects us to set the IV (req->iv) to the last +- * ciphertext block. This is used e.g. by the CTS mode. ++ * ciphertext block when running in CBC mode. + */ +- if (ivsize) ++ if ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == OP_ALG_AAI_CBC) + scatterwalk_map_and_copy(req->iv, req->dst, req->cryptlen - + ivsize, ivsize, 0); + +@@ -1106,6 +1107,7 @@ static void init_aead_job(struct aead_request *req, + if (unlikely(req->src != req->dst)) { + if (!edesc->mapped_dst_nents) { + dst_dma = 0; ++ out_options = 0; + } else if (edesc->mapped_dst_nents == 1) { + dst_dma = sg_dma_address(req->dst); + out_options = 0; +@@ -1842,9 +1844,9 @@ static int skcipher_decrypt(struct skcipher_request *req) + + /* + * The crypto API expects us to set the IV (req->iv) to the last +- * ciphertext block. ++ * ciphertext block when running in CBC mode. + */ +- if (ivsize) ++ if ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == OP_ALG_AAI_CBC) + scatterwalk_map_and_copy(req->iv, req->src, req->cryptlen - + ivsize, ivsize, 0); + +diff --git a/drivers/crypto/caam/caamalg_qi.c b/drivers/crypto/caam/caamalg_qi.c +index d290d6b41825..116cbc81fa8d 100644 +--- a/drivers/crypto/caam/caamalg_qi.c ++++ b/drivers/crypto/caam/caamalg_qi.c +@@ -1109,7 +1109,7 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req, + dma_to_qm_sg_one_ext(&fd_sgt[0], qm_sg_dma + + (1 + !!ivsize) * sizeof(*sg_table), + out_len, 0); +- } else if (mapped_dst_nents == 1) { ++ } else if (mapped_dst_nents <= 1) { + dma_to_qm_sg_one(&fd_sgt[0], sg_dma_address(req->dst), out_len, + 0); + } else { +diff --git a/drivers/crypto/caam/caamalg_qi2.c b/drivers/crypto/caam/caamalg_qi2.c +index 2b2980a8a9b9..b949944c8e55 100644 +--- a/drivers/crypto/caam/caamalg_qi2.c ++++ b/drivers/crypto/caam/caamalg_qi2.c +@@ -559,6 +559,14 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req, + dpaa2_fl_set_addr(out_fle, qm_sg_dma + + (1 + !!ivsize) * sizeof(*sg_table)); + } ++ } else if (!mapped_dst_nents) { ++ /* ++ * crypto engine requires the output entry to be present when ++ * "frame list" FD is used. ++ * Since engine does not support FMT=2'b11 (unused entry type), ++ * leaving out_fle zeroized is the best option. ++ */ ++ goto skip_out_fle; + } else if (mapped_dst_nents == 1) { + dpaa2_fl_set_format(out_fle, dpaa2_fl_single); + dpaa2_fl_set_addr(out_fle, sg_dma_address(req->dst)); +@@ -570,6 +578,7 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req, + + dpaa2_fl_set_len(out_fle, out_len); + ++skip_out_fle: + return edesc; + } + +diff --git a/drivers/crypto/caam/qi.c b/drivers/crypto/caam/qi.c +index 9f08f84cca59..2d9b0485141f 100644 +--- a/drivers/crypto/caam/qi.c ++++ b/drivers/crypto/caam/qi.c +@@ -18,6 +18,7 @@ + #include "desc_constr.h" + + #define PREHDR_RSLS_SHIFT 31 ++#define PREHDR_ABS BIT(25) + + /* + * Use a reasonable backlog of frames (per CPU) as congestion threshold, +@@ -346,6 +347,7 @@ int caam_drv_ctx_update(struct caam_drv_ctx *drv_ctx, u32 *sh_desc) + */ + drv_ctx->prehdr[0] = cpu_to_caam32((1 << PREHDR_RSLS_SHIFT) | + num_words); ++ drv_ctx->prehdr[1] = cpu_to_caam32(PREHDR_ABS); + memcpy(drv_ctx->sh_desc, sh_desc, desc_bytes(sh_desc)); + dma_sync_single_for_device(qidev, drv_ctx->context_a, + sizeof(drv_ctx->sh_desc) + +@@ -401,6 +403,7 @@ struct caam_drv_ctx *caam_drv_ctx_init(struct device *qidev, + */ + drv_ctx->prehdr[0] = cpu_to_caam32((1 << PREHDR_RSLS_SHIFT) | + num_words); ++ drv_ctx->prehdr[1] = cpu_to_caam32(PREHDR_ABS); + memcpy(drv_ctx->sh_desc, sh_desc, desc_bytes(sh_desc)); + size = sizeof(drv_ctx->prehdr) + sizeof(drv_ctx->sh_desc); + hwdesc = dma_map_single(qidev, drv_ctx->prehdr, size, +diff --git a/drivers/crypto/ccp/ccp-crypto-aes-galois.c b/drivers/crypto/ccp/ccp-crypto-aes-galois.c +index f9fec2ddf56a..94c1ad7eeddf 100644 +--- a/drivers/crypto/ccp/ccp-crypto-aes-galois.c ++++ b/drivers/crypto/ccp/ccp-crypto-aes-galois.c +@@ -58,6 +58,19 @@ static int ccp_aes_gcm_setkey(struct crypto_aead *tfm, const u8 *key, + static int ccp_aes_gcm_setauthsize(struct crypto_aead *tfm, + unsigned int authsize) + { ++ switch (authsize) { ++ case 16: ++ case 15: ++ case 14: ++ case 13: ++ case 12: ++ case 8: ++ case 4: ++ break; ++ default: ++ return -EINVAL; ++ } ++ + return 0; + } + +@@ -104,6 +117,7 @@ static int ccp_aes_gcm_crypt(struct aead_request *req, bool encrypt) + memset(&rctx->cmd, 0, sizeof(rctx->cmd)); + INIT_LIST_HEAD(&rctx->cmd.entry); + rctx->cmd.engine = CCP_ENGINE_AES; ++ rctx->cmd.u.aes.authsize = crypto_aead_authsize(tfm); + rctx->cmd.u.aes.type = ctx->u.aes.type; + rctx->cmd.u.aes.mode = ctx->u.aes.mode; + rctx->cmd.u.aes.action = encrypt; +diff --git a/drivers/crypto/ccp/ccp-dev.c b/drivers/crypto/ccp/ccp-dev.c +index cc3e96c4f5fb..f79eede71c62 100644 +--- a/drivers/crypto/ccp/ccp-dev.c ++++ b/drivers/crypto/ccp/ccp-dev.c +@@ -32,56 +32,62 @@ struct ccp_tasklet_data { + }; + + /* Human-readable error strings */ ++#define CCP_MAX_ERROR_CODE 64 + static char *ccp_error_codes[] = { + "", +- "ERR 01: ILLEGAL_ENGINE", +- "ERR 02: ILLEGAL_KEY_ID", +- "ERR 03: ILLEGAL_FUNCTION_TYPE", +- "ERR 04: ILLEGAL_FUNCTION_MODE", +- "ERR 05: ILLEGAL_FUNCTION_ENCRYPT", +- "ERR 06: ILLEGAL_FUNCTION_SIZE", +- "ERR 07: Zlib_MISSING_INIT_EOM", +- "ERR 08: ILLEGAL_FUNCTION_RSVD", +- "ERR 09: ILLEGAL_BUFFER_LENGTH", +- "ERR 10: VLSB_FAULT", +- "ERR 11: ILLEGAL_MEM_ADDR", +- "ERR 12: ILLEGAL_MEM_SEL", +- "ERR 13: ILLEGAL_CONTEXT_ID", +- "ERR 14: ILLEGAL_KEY_ADDR", +- "ERR 15: 0xF Reserved", +- "ERR 16: Zlib_ILLEGAL_MULTI_QUEUE", +- "ERR 17: Zlib_ILLEGAL_JOBID_CHANGE", +- "ERR 18: CMD_TIMEOUT", +- "ERR 19: IDMA0_AXI_SLVERR", +- "ERR 20: IDMA0_AXI_DECERR", +- "ERR 21: 0x15 Reserved", +- "ERR 22: IDMA1_AXI_SLAVE_FAULT", +- "ERR 23: IDMA1_AIXI_DECERR", +- "ERR 24: 0x18 Reserved", +- "ERR 25: ZLIBVHB_AXI_SLVERR", +- "ERR 26: ZLIBVHB_AXI_DECERR", +- "ERR 27: 0x1B Reserved", +- "ERR 27: ZLIB_UNEXPECTED_EOM", +- "ERR 27: ZLIB_EXTRA_DATA", +- "ERR 30: ZLIB_BTYPE", +- "ERR 31: ZLIB_UNDEFINED_SYMBOL", +- "ERR 32: ZLIB_UNDEFINED_DISTANCE_S", +- "ERR 33: ZLIB_CODE_LENGTH_SYMBOL", +- "ERR 34: ZLIB _VHB_ILLEGAL_FETCH", +- "ERR 35: ZLIB_UNCOMPRESSED_LEN", +- "ERR 36: ZLIB_LIMIT_REACHED", +- "ERR 37: ZLIB_CHECKSUM_MISMATCH0", +- "ERR 38: ODMA0_AXI_SLVERR", +- "ERR 39: ODMA0_AXI_DECERR", +- "ERR 40: 0x28 Reserved", +- "ERR 41: ODMA1_AXI_SLVERR", +- "ERR 42: ODMA1_AXI_DECERR", +- "ERR 43: LSB_PARITY_ERR", ++ "ILLEGAL_ENGINE", ++ "ILLEGAL_KEY_ID", ++ "ILLEGAL_FUNCTION_TYPE", ++ "ILLEGAL_FUNCTION_MODE", ++ "ILLEGAL_FUNCTION_ENCRYPT", ++ "ILLEGAL_FUNCTION_SIZE", ++ "Zlib_MISSING_INIT_EOM", ++ "ILLEGAL_FUNCTION_RSVD", ++ "ILLEGAL_BUFFER_LENGTH", ++ "VLSB_FAULT", ++ "ILLEGAL_MEM_ADDR", ++ "ILLEGAL_MEM_SEL", ++ "ILLEGAL_CONTEXT_ID", ++ "ILLEGAL_KEY_ADDR", ++ "0xF Reserved", ++ "Zlib_ILLEGAL_MULTI_QUEUE", ++ "Zlib_ILLEGAL_JOBID_CHANGE", ++ "CMD_TIMEOUT", ++ "IDMA0_AXI_SLVERR", ++ "IDMA0_AXI_DECERR", ++ "0x15 Reserved", ++ "IDMA1_AXI_SLAVE_FAULT", ++ "IDMA1_AIXI_DECERR", ++ "0x18 Reserved", ++ "ZLIBVHB_AXI_SLVERR", ++ "ZLIBVHB_AXI_DECERR", ++ "0x1B Reserved", ++ "ZLIB_UNEXPECTED_EOM", ++ "ZLIB_EXTRA_DATA", ++ "ZLIB_BTYPE", ++ "ZLIB_UNDEFINED_SYMBOL", ++ "ZLIB_UNDEFINED_DISTANCE_S", ++ "ZLIB_CODE_LENGTH_SYMBOL", ++ "ZLIB _VHB_ILLEGAL_FETCH", ++ "ZLIB_UNCOMPRESSED_LEN", ++ "ZLIB_LIMIT_REACHED", ++ "ZLIB_CHECKSUM_MISMATCH0", ++ "ODMA0_AXI_SLVERR", ++ "ODMA0_AXI_DECERR", ++ "0x28 Reserved", ++ "ODMA1_AXI_SLVERR", ++ "ODMA1_AXI_DECERR", + }; + +-void ccp_log_error(struct ccp_device *d, int e) ++void ccp_log_error(struct ccp_device *d, unsigned int e) + { +- dev_err(d->dev, "CCP error: %s (0x%x)\n", ccp_error_codes[e], e); ++ if (WARN_ON(e >= CCP_MAX_ERROR_CODE)) ++ return; ++ ++ if (e < ARRAY_SIZE(ccp_error_codes)) ++ dev_err(d->dev, "CCP error %d: %s\n", e, ccp_error_codes[e]); ++ else ++ dev_err(d->dev, "CCP error %d: Unknown Error\n", e); + } + + /* List of CCPs, CCP count, read-write access lock, and access functions +diff --git a/drivers/crypto/ccp/ccp-dev.h b/drivers/crypto/ccp/ccp-dev.h +index 90523a069bff..5e624920fd99 100644 +--- a/drivers/crypto/ccp/ccp-dev.h ++++ b/drivers/crypto/ccp/ccp-dev.h +@@ -629,7 +629,7 @@ struct ccp5_desc { + void ccp_add_device(struct ccp_device *ccp); + void ccp_del_device(struct ccp_device *ccp); + +-extern void ccp_log_error(struct ccp_device *, int); ++extern void ccp_log_error(struct ccp_device *, unsigned int); + + struct ccp_device *ccp_alloc_struct(struct sp_device *sp); + bool ccp_queues_suspended(struct ccp_device *ccp); +diff --git a/drivers/crypto/ccp/ccp-ops.c b/drivers/crypto/ccp/ccp-ops.c +index db8de89d990f..a13e8a362316 100644 +--- a/drivers/crypto/ccp/ccp-ops.c ++++ b/drivers/crypto/ccp/ccp-ops.c +@@ -622,6 +622,8 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, + + unsigned long long *final; + unsigned int dm_offset; ++ unsigned int authsize; ++ unsigned int jobid; + unsigned int ilen; + bool in_place = true; /* Default value */ + int ret; +@@ -642,6 +644,21 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, + if (!aes->key) /* Gotta have a key SGL */ + return -EINVAL; + ++ /* Zero defaults to 16 bytes, the maximum size */ ++ authsize = aes->authsize ? aes->authsize : AES_BLOCK_SIZE; ++ switch (authsize) { ++ case 16: ++ case 15: ++ case 14: ++ case 13: ++ case 12: ++ case 8: ++ case 4: ++ break; ++ default: ++ return -EINVAL; ++ } ++ + /* First, decompose the source buffer into AAD & PT, + * and the destination buffer into AAD, CT & tag, or + * the input into CT & tag. +@@ -656,13 +673,15 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, + p_tag = scatterwalk_ffwd(sg_tag, p_outp, ilen); + } else { + /* Input length for decryption includes tag */ +- ilen = aes->src_len - AES_BLOCK_SIZE; ++ ilen = aes->src_len - authsize; + p_tag = scatterwalk_ffwd(sg_tag, p_inp, ilen); + } + ++ jobid = CCP_NEW_JOBID(cmd_q->ccp); ++ + memset(&op, 0, sizeof(op)); + op.cmd_q = cmd_q; +- op.jobid = CCP_NEW_JOBID(cmd_q->ccp); ++ op.jobid = jobid; + op.sb_key = cmd_q->sb_key; /* Pre-allocated */ + op.sb_ctx = cmd_q->sb_ctx; /* Pre-allocated */ + op.init = 1; +@@ -763,8 +782,7 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, + while (src.sg_wa.bytes_left) { + ccp_prepare_data(&src, &dst, &op, AES_BLOCK_SIZE, true); + if (!src.sg_wa.bytes_left) { +- unsigned int nbytes = aes->src_len +- % AES_BLOCK_SIZE; ++ unsigned int nbytes = ilen % AES_BLOCK_SIZE; + + if (nbytes) { + op.eom = 1; +@@ -813,6 +831,13 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, + final[0] = cpu_to_be64(aes->aad_len * 8); + final[1] = cpu_to_be64(ilen * 8); + ++ memset(&op, 0, sizeof(op)); ++ op.cmd_q = cmd_q; ++ op.jobid = jobid; ++ op.sb_key = cmd_q->sb_key; /* Pre-allocated */ ++ op.sb_ctx = cmd_q->sb_ctx; /* Pre-allocated */ ++ op.init = 1; ++ op.u.aes.type = aes->type; + op.u.aes.mode = CCP_AES_MODE_GHASH; + op.u.aes.action = CCP_AES_GHASHFINAL; + op.src.type = CCP_MEMTYPE_SYSTEM; +@@ -829,18 +854,19 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, + + if (aes->action == CCP_AES_ACTION_ENCRYPT) { + /* Put the ciphered tag after the ciphertext. */ +- ccp_get_dm_area(&final_wa, 0, p_tag, 0, AES_BLOCK_SIZE); ++ ccp_get_dm_area(&final_wa, 0, p_tag, 0, authsize); + } else { + /* Does this ciphered tag match the input? */ +- ret = ccp_init_dm_workarea(&tag, cmd_q, AES_BLOCK_SIZE, ++ ret = ccp_init_dm_workarea(&tag, cmd_q, authsize, + DMA_BIDIRECTIONAL); + if (ret) + goto e_tag; +- ret = ccp_set_dm_area(&tag, 0, p_tag, 0, AES_BLOCK_SIZE); ++ ret = ccp_set_dm_area(&tag, 0, p_tag, 0, authsize); + if (ret) + goto e_tag; + +- ret = memcmp(tag.address, final_wa.address, AES_BLOCK_SIZE); ++ ret = crypto_memneq(tag.address, final_wa.address, ++ authsize) ? -EBADMSG : 0; + ccp_dm_free(&tag); + } + +@@ -848,11 +874,11 @@ static int ccp_run_aes_gcm_cmd(struct ccp_cmd_queue *cmd_q, + ccp_dm_free(&final_wa); + + e_dst: +- if (aes->src_len && !in_place) ++ if (ilen > 0 && !in_place) + ccp_free_data(&dst, cmd_q); + + e_src: +- if (aes->src_len) ++ if (ilen > 0) + ccp_free_data(&src, cmd_q); + + e_aad: +diff --git a/drivers/crypto/ccp/psp-dev.c b/drivers/crypto/ccp/psp-dev.c +index de5a8ca70d3d..6b17d179ef8a 100644 +--- a/drivers/crypto/ccp/psp-dev.c ++++ b/drivers/crypto/ccp/psp-dev.c +@@ -24,10 +24,6 @@ + #include "sp-dev.h" + #include "psp-dev.h" + +-#define SEV_VERSION_GREATER_OR_EQUAL(_maj, _min) \ +- ((psp_master->api_major) >= _maj && \ +- (psp_master->api_minor) >= _min) +- + #define DEVICE_NAME "sev" + #define SEV_FW_FILE "amd/sev.fw" + #define SEV_FW_NAME_SIZE 64 +@@ -47,6 +43,15 @@ MODULE_PARM_DESC(psp_probe_timeout, " default timeout value, in seconds, during + static bool psp_dead; + static int psp_timeout; + ++static inline bool sev_version_greater_or_equal(u8 maj, u8 min) ++{ ++ if (psp_master->api_major > maj) ++ return true; ++ if (psp_master->api_major == maj && psp_master->api_minor >= min) ++ return true; ++ return false; ++} ++ + static struct psp_device *psp_alloc_struct(struct sp_device *sp) + { + struct device *dev = sp->dev; +@@ -588,7 +593,7 @@ static int sev_ioctl_do_get_id2(struct sev_issue_cmd *argp) + int ret; + + /* SEV GET_ID is available from SEV API v0.16 and up */ +- if (!SEV_VERSION_GREATER_OR_EQUAL(0, 16)) ++ if (!sev_version_greater_or_equal(0, 16)) + return -ENOTSUPP; + + if (copy_from_user(&input, (void __user *)argp->data, sizeof(input))) +@@ -651,7 +656,7 @@ static int sev_ioctl_do_get_id(struct sev_issue_cmd *argp) + int ret; + + /* SEV GET_ID available from SEV API v0.16 and up */ +- if (!SEV_VERSION_GREATER_OR_EQUAL(0, 16)) ++ if (!sev_version_greater_or_equal(0, 16)) + return -ENOTSUPP; + + /* SEV FW expects the buffer it fills with the ID to be +@@ -1053,7 +1058,7 @@ void psp_pci_init(void) + psp_master->sev_state = SEV_STATE_UNINIT; + } + +- if (SEV_VERSION_GREATER_OR_EQUAL(0, 15) && ++ if (sev_version_greater_or_equal(0, 15) && + sev_update_firmware(psp_master->dev) == 0) + sev_get_api_version(); + +diff --git a/drivers/crypto/inside-secure/safexcel_cipher.c b/drivers/crypto/inside-secure/safexcel_cipher.c +index de4be10b172f..ccacdcf07ffc 100644 +--- a/drivers/crypto/inside-secure/safexcel_cipher.c ++++ b/drivers/crypto/inside-secure/safexcel_cipher.c +@@ -51,6 +51,8 @@ struct safexcel_cipher_ctx { + + struct safexcel_cipher_req { + enum safexcel_cipher_direction direction; ++ /* Number of result descriptors associated to the request */ ++ unsigned int rdescs; + bool needs_inv; + }; + +@@ -333,7 +335,10 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int rin + + *ret = 0; + +- do { ++ if (unlikely(!sreq->rdescs)) ++ return 0; ++ ++ while (sreq->rdescs--) { + rdesc = safexcel_ring_next_rptr(priv, &priv->ring[ring].rdr); + if (IS_ERR(rdesc)) { + dev_err(priv->dev, +@@ -346,7 +351,7 @@ static int safexcel_handle_req_result(struct safexcel_crypto_priv *priv, int rin + *ret = safexcel_rdesc_check_errors(priv, rdesc); + + ndesc++; +- } while (!rdesc->last_seg); ++ } + + safexcel_complete(priv, ring); + +@@ -501,6 +506,7 @@ static int safexcel_send_req(struct crypto_async_request *base, int ring, + static int safexcel_handle_inv_result(struct safexcel_crypto_priv *priv, + int ring, + struct crypto_async_request *base, ++ struct safexcel_cipher_req *sreq, + bool *should_complete, int *ret) + { + struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(base->tfm); +@@ -509,7 +515,10 @@ static int safexcel_handle_inv_result(struct safexcel_crypto_priv *priv, + + *ret = 0; + +- do { ++ if (unlikely(!sreq->rdescs)) ++ return 0; ++ ++ while (sreq->rdescs--) { + rdesc = safexcel_ring_next_rptr(priv, &priv->ring[ring].rdr); + if (IS_ERR(rdesc)) { + dev_err(priv->dev, +@@ -522,7 +531,7 @@ static int safexcel_handle_inv_result(struct safexcel_crypto_priv *priv, + *ret = safexcel_rdesc_check_errors(priv, rdesc); + + ndesc++; +- } while (!rdesc->last_seg); ++ } + + safexcel_complete(priv, ring); + +@@ -564,7 +573,7 @@ static int safexcel_skcipher_handle_result(struct safexcel_crypto_priv *priv, + + if (sreq->needs_inv) { + sreq->needs_inv = false; +- err = safexcel_handle_inv_result(priv, ring, async, ++ err = safexcel_handle_inv_result(priv, ring, async, sreq, + should_complete, ret); + } else { + err = safexcel_handle_req_result(priv, ring, async, req->src, +@@ -587,7 +596,7 @@ static int safexcel_aead_handle_result(struct safexcel_crypto_priv *priv, + + if (sreq->needs_inv) { + sreq->needs_inv = false; +- err = safexcel_handle_inv_result(priv, ring, async, ++ err = safexcel_handle_inv_result(priv, ring, async, sreq, + should_complete, ret); + } else { + err = safexcel_handle_req_result(priv, ring, async, req->src, +@@ -633,6 +642,8 @@ static int safexcel_skcipher_send(struct crypto_async_request *async, int ring, + ret = safexcel_send_req(async, ring, sreq, req->src, + req->dst, req->cryptlen, 0, 0, req->iv, + commands, results); ++ ++ sreq->rdescs = *results; + return ret; + } + +@@ -655,6 +666,7 @@ static int safexcel_aead_send(struct crypto_async_request *async, int ring, + req->cryptlen, req->assoclen, + crypto_aead_authsize(tfm), req->iv, + commands, results); ++ sreq->rdescs = *results; + return ret; + } + +diff --git a/drivers/crypto/nx/nx-842-powernv.c b/drivers/crypto/nx/nx-842-powernv.c +index 4acbc47973e9..e78ff5c65ed6 100644 +--- a/drivers/crypto/nx/nx-842-powernv.c ++++ b/drivers/crypto/nx/nx-842-powernv.c +@@ -27,8 +27,6 @@ MODULE_ALIAS_CRYPTO("842-nx"); + #define WORKMEM_ALIGN (CRB_ALIGN) + #define CSB_WAIT_MAX (5000) /* ms */ + #define VAS_RETRIES (10) +-/* # of requests allowed per RxFIFO at a time. 0 for unlimited */ +-#define MAX_CREDITS_PER_RXFIFO (1024) + + struct nx842_workmem { + /* Below fields must be properly aligned */ +@@ -812,7 +810,11 @@ static int __init vas_cfg_coproc_info(struct device_node *dn, int chip_id, + rxattr.lnotify_lpid = lpid; + rxattr.lnotify_pid = pid; + rxattr.lnotify_tid = tid; +- rxattr.wcreds_max = MAX_CREDITS_PER_RXFIFO; ++ /* ++ * Maximum RX window credits can not be more than #CRBs in ++ * RxFIFO. Otherwise, can get checkstop if RxFIFO overruns. ++ */ ++ rxattr.wcreds_max = fifo_size / CRB_SIZE; + + /* + * Open a VAS receice window which is used to configure RxFIFO +diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c +index fbc7bf9d7380..710e09e28227 100644 +--- a/drivers/crypto/talitos.c ++++ b/drivers/crypto/talitos.c +@@ -321,6 +321,21 @@ int talitos_submit(struct device *dev, int ch, struct talitos_desc *desc, + } + EXPORT_SYMBOL(talitos_submit); + ++static __be32 get_request_hdr(struct talitos_request *request, bool is_sec1) ++{ ++ struct talitos_edesc *edesc; ++ ++ if (!is_sec1) ++ return request->desc->hdr; ++ ++ if (!request->desc->next_desc) ++ return request->desc->hdr1; ++ ++ edesc = container_of(request->desc, struct talitos_edesc, desc); ++ ++ return ((struct talitos_desc *)(edesc->buf + edesc->dma_len))->hdr1; ++} ++ + /* + * process what was done, notify callback of error if not + */ +@@ -342,12 +357,7 @@ static void flush_channel(struct device *dev, int ch, int error, int reset_ch) + + /* descriptors with their done bits set don't get the error */ + rmb(); +- if (!is_sec1) +- hdr = request->desc->hdr; +- else if (request->desc->next_desc) +- hdr = (request->desc + 1)->hdr1; +- else +- hdr = request->desc->hdr1; ++ hdr = get_request_hdr(request, is_sec1); + + if ((hdr & DESC_HDR_DONE) == DESC_HDR_DONE) + status = 0; +@@ -477,8 +487,14 @@ static u32 current_desc_hdr(struct device *dev, int ch) + } + } + +- if (priv->chan[ch].fifo[iter].desc->next_desc == cur_desc) +- return (priv->chan[ch].fifo[iter].desc + 1)->hdr; ++ if (priv->chan[ch].fifo[iter].desc->next_desc == cur_desc) { ++ struct talitos_edesc *edesc; ++ ++ edesc = container_of(priv->chan[ch].fifo[iter].desc, ++ struct talitos_edesc, desc); ++ return ((struct talitos_desc *) ++ (edesc->buf + edesc->dma_len))->hdr; ++ } + + return priv->chan[ch].fifo[iter].desc->hdr; + } +@@ -948,36 +964,6 @@ static int aead_des3_setkey(struct crypto_aead *authenc, + goto out; + } + +-/* +- * talitos_edesc - s/w-extended descriptor +- * @src_nents: number of segments in input scatterlist +- * @dst_nents: number of segments in output scatterlist +- * @icv_ool: whether ICV is out-of-line +- * @iv_dma: dma address of iv for checking continuity and link table +- * @dma_len: length of dma mapped link_tbl space +- * @dma_link_tbl: bus physical address of link_tbl/buf +- * @desc: h/w descriptor +- * @link_tbl: input and output h/w link tables (if {src,dst}_nents > 1) (SEC2) +- * @buf: input and output buffeur (if {src,dst}_nents > 1) (SEC1) +- * +- * if decrypting (with authcheck), or either one of src_nents or dst_nents +- * is greater than 1, an integrity check value is concatenated to the end +- * of link_tbl data +- */ +-struct talitos_edesc { +- int src_nents; +- int dst_nents; +- bool icv_ool; +- dma_addr_t iv_dma; +- int dma_len; +- dma_addr_t dma_link_tbl; +- struct talitos_desc desc; +- union { +- struct talitos_ptr link_tbl[0]; +- u8 buf[0]; +- }; +-}; +- + static void talitos_sg_unmap(struct device *dev, + struct talitos_edesc *edesc, + struct scatterlist *src, +@@ -1050,7 +1036,6 @@ static void ipsec_esp_encrypt_done(struct device *dev, + unsigned int authsize = crypto_aead_authsize(authenc); + unsigned int ivsize = crypto_aead_ivsize(authenc); + struct talitos_edesc *edesc; +- struct scatterlist *sg; + void *icvdata; + + edesc = container_of(desc, struct talitos_edesc, desc); +@@ -1064,9 +1049,8 @@ static void ipsec_esp_encrypt_done(struct device *dev, + else + icvdata = &edesc->link_tbl[edesc->src_nents + + edesc->dst_nents + 2]; +- sg = sg_last(areq->dst, edesc->dst_nents); +- memcpy((char *)sg_virt(sg) + sg->length - authsize, +- icvdata, authsize); ++ sg_pcopy_from_buffer(areq->dst, edesc->dst_nents ? : 1, icvdata, ++ authsize, areq->assoclen + areq->cryptlen); + } + + dma_unmap_single(dev, edesc->iv_dma, ivsize, DMA_TO_DEVICE); +@@ -1084,7 +1068,6 @@ static void ipsec_esp_decrypt_swauth_done(struct device *dev, + struct crypto_aead *authenc = crypto_aead_reqtfm(req); + unsigned int authsize = crypto_aead_authsize(authenc); + struct talitos_edesc *edesc; +- struct scatterlist *sg; + char *oicv, *icv; + struct talitos_private *priv = dev_get_drvdata(dev); + bool is_sec1 = has_ftr_sec1(priv); +@@ -1094,9 +1077,18 @@ static void ipsec_esp_decrypt_swauth_done(struct device *dev, + ipsec_esp_unmap(dev, edesc, req); + + if (!err) { ++ char icvdata[SHA512_DIGEST_SIZE]; ++ int nents = edesc->dst_nents ? : 1; ++ unsigned int len = req->assoclen + req->cryptlen; ++ + /* auth check */ +- sg = sg_last(req->dst, edesc->dst_nents ? : 1); +- icv = (char *)sg_virt(sg) + sg->length - authsize; ++ if (nents > 1) { ++ sg_pcopy_to_buffer(req->dst, nents, icvdata, authsize, ++ len - authsize); ++ icv = icvdata; ++ } else { ++ icv = (char *)sg_virt(req->dst) + len - authsize; ++ } + + if (edesc->dma_len) { + if (is_sec1) +@@ -1466,15 +1458,11 @@ static struct talitos_edesc *talitos_edesc_alloc(struct device *dev, + edesc->dst_nents = dst_nents; + edesc->iv_dma = iv_dma; + edesc->dma_len = dma_len; +- if (dma_len) { +- void *addr = &edesc->link_tbl[0]; +- +- if (is_sec1 && !dst) +- addr += sizeof(struct talitos_desc); +- edesc->dma_link_tbl = dma_map_single(dev, addr, ++ if (dma_len) ++ edesc->dma_link_tbl = dma_map_single(dev, &edesc->link_tbl[0], + edesc->dma_len, + DMA_BIDIRECTIONAL); +- } ++ + return edesc; + } + +@@ -1516,7 +1504,6 @@ static int aead_decrypt(struct aead_request *req) + struct talitos_ctx *ctx = crypto_aead_ctx(authenc); + struct talitos_private *priv = dev_get_drvdata(ctx->dev); + struct talitos_edesc *edesc; +- struct scatterlist *sg; + void *icvdata; + + req->cryptlen -= authsize; +@@ -1550,9 +1537,8 @@ static int aead_decrypt(struct aead_request *req) + else + icvdata = &edesc->link_tbl[0]; + +- sg = sg_last(req->src, edesc->src_nents ? : 1); +- +- memcpy(icvdata, (char *)sg_virt(sg) + sg->length - authsize, authsize); ++ sg_pcopy_to_buffer(req->src, edesc->src_nents ? : 1, icvdata, authsize, ++ req->assoclen + req->cryptlen - authsize); + + return ipsec_esp(edesc, req, ipsec_esp_decrypt_swauth_done); + } +@@ -1624,11 +1610,15 @@ static void ablkcipher_done(struct device *dev, + int err) + { + struct ablkcipher_request *areq = context; ++ struct crypto_ablkcipher *cipher = crypto_ablkcipher_reqtfm(areq); ++ struct talitos_ctx *ctx = crypto_ablkcipher_ctx(cipher); ++ unsigned int ivsize = crypto_ablkcipher_ivsize(cipher); + struct talitos_edesc *edesc; + + edesc = container_of(desc, struct talitos_edesc, desc); + + common_nonsnoop_unmap(dev, edesc, areq); ++ memcpy(areq->info, ctx->iv, ivsize); + + kfree(edesc); + +@@ -1759,14 +1749,16 @@ static void common_nonsnoop_hash_unmap(struct device *dev, + struct talitos_private *priv = dev_get_drvdata(dev); + bool is_sec1 = has_ftr_sec1(priv); + struct talitos_desc *desc = &edesc->desc; +- struct talitos_desc *desc2 = desc + 1; ++ struct talitos_desc *desc2 = (struct talitos_desc *) ++ (edesc->buf + edesc->dma_len); + + unmap_single_talitos_ptr(dev, &edesc->desc.ptr[5], DMA_FROM_DEVICE); + if (desc->next_desc && + desc->ptr[5].ptr != desc2->ptr[5].ptr) + unmap_single_talitos_ptr(dev, &desc2->ptr[5], DMA_FROM_DEVICE); + +- talitos_sg_unmap(dev, edesc, req_ctx->psrc, NULL, 0, 0); ++ if (req_ctx->psrc) ++ talitos_sg_unmap(dev, edesc, req_ctx->psrc, NULL, 0, 0); + + /* When using hashctx-in, must unmap it. */ + if (from_talitos_ptr_len(&edesc->desc.ptr[1], is_sec1)) +@@ -1833,7 +1825,6 @@ static void talitos_handle_buggy_hash(struct talitos_ctx *ctx, + + static int common_nonsnoop_hash(struct talitos_edesc *edesc, + struct ahash_request *areq, unsigned int length, +- unsigned int offset, + void (*callback) (struct device *dev, + struct talitos_desc *desc, + void *context, int error)) +@@ -1872,9 +1863,7 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, + + sg_count = edesc->src_nents ?: 1; + if (is_sec1 && sg_count > 1) +- sg_pcopy_to_buffer(req_ctx->psrc, sg_count, +- edesc->buf + sizeof(struct talitos_desc), +- length, req_ctx->nbuf); ++ sg_copy_to_buffer(req_ctx->psrc, sg_count, edesc->buf, length); + else if (length) + sg_count = dma_map_sg(dev, req_ctx->psrc, sg_count, + DMA_TO_DEVICE); +@@ -1887,7 +1876,7 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, + DMA_TO_DEVICE); + } else { + sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc, +- &desc->ptr[3], sg_count, offset, 0); ++ &desc->ptr[3], sg_count, 0, 0); + if (sg_count > 1) + sync_needed = true; + } +@@ -1911,7 +1900,8 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, + talitos_handle_buggy_hash(ctx, edesc, &desc->ptr[3]); + + if (is_sec1 && req_ctx->nbuf && length) { +- struct talitos_desc *desc2 = desc + 1; ++ struct talitos_desc *desc2 = (struct talitos_desc *) ++ (edesc->buf + edesc->dma_len); + dma_addr_t next_desc; + + memset(desc2, 0, sizeof(*desc2)); +@@ -1932,7 +1922,7 @@ static int common_nonsnoop_hash(struct talitos_edesc *edesc, + DMA_TO_DEVICE); + copy_talitos_ptr(&desc2->ptr[2], &desc->ptr[2], is_sec1); + sg_count = talitos_sg_map(dev, req_ctx->psrc, length, edesc, +- &desc2->ptr[3], sg_count, offset, 0); ++ &desc2->ptr[3], sg_count, 0, 0); + if (sg_count > 1) + sync_needed = true; + copy_talitos_ptr(&desc2->ptr[5], &desc->ptr[5], is_sec1); +@@ -2043,7 +2033,6 @@ static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes) + struct device *dev = ctx->dev; + struct talitos_private *priv = dev_get_drvdata(dev); + bool is_sec1 = has_ftr_sec1(priv); +- int offset = 0; + u8 *ctx_buf = req_ctx->buf[req_ctx->buf_idx]; + + if (!req_ctx->last && (nbytes + req_ctx->nbuf <= blocksize)) { +@@ -2083,6 +2072,8 @@ static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes) + sg_chain(req_ctx->bufsl, 2, areq->src); + req_ctx->psrc = req_ctx->bufsl; + } else if (is_sec1 && req_ctx->nbuf && req_ctx->nbuf < blocksize) { ++ int offset; ++ + if (nbytes_to_hash > blocksize) + offset = blocksize - req_ctx->nbuf; + else +@@ -2095,7 +2086,8 @@ static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes) + sg_copy_to_buffer(areq->src, nents, + ctx_buf + req_ctx->nbuf, offset); + req_ctx->nbuf += offset; +- req_ctx->psrc = areq->src; ++ req_ctx->psrc = scatterwalk_ffwd(req_ctx->bufsl, areq->src, ++ offset); + } else + req_ctx->psrc = areq->src; + +@@ -2135,8 +2127,7 @@ static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes) + if (ctx->keylen && (req_ctx->first || req_ctx->last)) + edesc->desc.hdr |= DESC_HDR_MODE0_MDEU_HMAC; + +- return common_nonsnoop_hash(edesc, areq, nbytes_to_hash, offset, +- ahash_done); ++ return common_nonsnoop_hash(edesc, areq, nbytes_to_hash, ahash_done); + } + + static int ahash_update(struct ahash_request *areq) +@@ -2339,7 +2330,7 @@ static struct talitos_alg_template driver_algs[] = { + .base = { + .cra_name = "authenc(hmac(sha1),cbc(aes))", + .cra_driver_name = "authenc-hmac-sha1-" +- "cbc-aes-talitos", ++ "cbc-aes-talitos-hsna", + .cra_blocksize = AES_BLOCK_SIZE, + .cra_flags = CRYPTO_ALG_ASYNC, + }, +@@ -2384,7 +2375,7 @@ static struct talitos_alg_template driver_algs[] = { + .cra_name = "authenc(hmac(sha1)," + "cbc(des3_ede))", + .cra_driver_name = "authenc-hmac-sha1-" +- "cbc-3des-talitos", ++ "cbc-3des-talitos-hsna", + .cra_blocksize = DES3_EDE_BLOCK_SIZE, + .cra_flags = CRYPTO_ALG_ASYNC, + }, +@@ -2427,7 +2418,7 @@ static struct talitos_alg_template driver_algs[] = { + .base = { + .cra_name = "authenc(hmac(sha224),cbc(aes))", + .cra_driver_name = "authenc-hmac-sha224-" +- "cbc-aes-talitos", ++ "cbc-aes-talitos-hsna", + .cra_blocksize = AES_BLOCK_SIZE, + .cra_flags = CRYPTO_ALG_ASYNC, + }, +@@ -2472,7 +2463,7 @@ static struct talitos_alg_template driver_algs[] = { + .cra_name = "authenc(hmac(sha224)," + "cbc(des3_ede))", + .cra_driver_name = "authenc-hmac-sha224-" +- "cbc-3des-talitos", ++ "cbc-3des-talitos-hsna", + .cra_blocksize = DES3_EDE_BLOCK_SIZE, + .cra_flags = CRYPTO_ALG_ASYNC, + }, +@@ -2515,7 +2506,7 @@ static struct talitos_alg_template driver_algs[] = { + .base = { + .cra_name = "authenc(hmac(sha256),cbc(aes))", + .cra_driver_name = "authenc-hmac-sha256-" +- "cbc-aes-talitos", ++ "cbc-aes-talitos-hsna", + .cra_blocksize = AES_BLOCK_SIZE, + .cra_flags = CRYPTO_ALG_ASYNC, + }, +@@ -2560,7 +2551,7 @@ static struct talitos_alg_template driver_algs[] = { + .cra_name = "authenc(hmac(sha256)," + "cbc(des3_ede))", + .cra_driver_name = "authenc-hmac-sha256-" +- "cbc-3des-talitos", ++ "cbc-3des-talitos-hsna", + .cra_blocksize = DES3_EDE_BLOCK_SIZE, + .cra_flags = CRYPTO_ALG_ASYNC, + }, +@@ -2689,7 +2680,7 @@ static struct talitos_alg_template driver_algs[] = { + .base = { + .cra_name = "authenc(hmac(md5),cbc(aes))", + .cra_driver_name = "authenc-hmac-md5-" +- "cbc-aes-talitos", ++ "cbc-aes-talitos-hsna", + .cra_blocksize = AES_BLOCK_SIZE, + .cra_flags = CRYPTO_ALG_ASYNC, + }, +@@ -2732,7 +2723,7 @@ static struct talitos_alg_template driver_algs[] = { + .base = { + .cra_name = "authenc(hmac(md5),cbc(des3_ede))", + .cra_driver_name = "authenc-hmac-md5-" +- "cbc-3des-talitos", ++ "cbc-3des-talitos-hsna", + .cra_blocksize = DES3_EDE_BLOCK_SIZE, + .cra_flags = CRYPTO_ALG_ASYNC, + }, +@@ -3270,7 +3261,10 @@ static struct talitos_crypto_alg *talitos_alg_alloc(struct device *dev, + alg->cra_priority = t_alg->algt.priority; + else + alg->cra_priority = TALITOS_CRA_PRIORITY; +- alg->cra_alignmask = 0; ++ if (has_ftr_sec1(priv)) ++ alg->cra_alignmask = 3; ++ else ++ alg->cra_alignmask = 0; + alg->cra_ctxsize = sizeof(struct talitos_ctx); + alg->cra_flags |= CRYPTO_ALG_KERN_DRIVER_ONLY; + +diff --git a/drivers/crypto/talitos.h b/drivers/crypto/talitos.h +index a65a63e0d6c1..979f6a61e545 100644 +--- a/drivers/crypto/talitos.h ++++ b/drivers/crypto/talitos.h +@@ -65,6 +65,36 @@ struct talitos_desc { + + #define TALITOS_DESC_SIZE (sizeof(struct talitos_desc) - sizeof(__be32)) + ++/* ++ * talitos_edesc - s/w-extended descriptor ++ * @src_nents: number of segments in input scatterlist ++ * @dst_nents: number of segments in output scatterlist ++ * @icv_ool: whether ICV is out-of-line ++ * @iv_dma: dma address of iv for checking continuity and link table ++ * @dma_len: length of dma mapped link_tbl space ++ * @dma_link_tbl: bus physical address of link_tbl/buf ++ * @desc: h/w descriptor ++ * @link_tbl: input and output h/w link tables (if {src,dst}_nents > 1) (SEC2) ++ * @buf: input and output buffeur (if {src,dst}_nents > 1) (SEC1) ++ * ++ * if decrypting (with authcheck), or either one of src_nents or dst_nents ++ * is greater than 1, an integrity check value is concatenated to the end ++ * of link_tbl data ++ */ ++struct talitos_edesc { ++ int src_nents; ++ int dst_nents; ++ bool icv_ool; ++ dma_addr_t iv_dma; ++ int dma_len; ++ dma_addr_t dma_link_tbl; ++ struct talitos_desc desc; ++ union { ++ struct talitos_ptr link_tbl[0]; ++ u8 buf[0]; ++ }; ++}; ++ + /** + * talitos_request - descriptor submission request + * @desc: descriptor pointer (kernel virtual) +diff --git a/drivers/dax/kmem.c b/drivers/dax/kmem.c +index a02318c6d28a..4c0131857133 100644 +--- a/drivers/dax/kmem.c ++++ b/drivers/dax/kmem.c +@@ -66,8 +66,11 @@ int dev_dax_kmem_probe(struct device *dev) + new_res->name = dev_name(dev); + + rc = add_memory(numa_node, new_res->start, resource_size(new_res)); +- if (rc) ++ if (rc) { ++ release_resource(new_res); ++ kfree(new_res); + return rc; ++ } + + return 0; + } +diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c +index bf4d4c80fbc6..a6fee5a6e9fb 100644 +--- a/drivers/dma-buf/dma-buf.c ++++ b/drivers/dma-buf/dma-buf.c +@@ -1057,6 +1057,7 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused) + fence->ops->get_driver_name(fence), + fence->ops->get_timeline_name(fence), + dma_fence_is_signaled(fence) ? "" : "un"); ++ dma_fence_put(fence); + } + rcu_read_unlock(); + +diff --git a/drivers/dma-buf/reservation.c b/drivers/dma-buf/reservation.c +index 4d32e2c67862..4447e13d1e89 100644 +--- a/drivers/dma-buf/reservation.c ++++ b/drivers/dma-buf/reservation.c +@@ -365,6 +365,10 @@ int reservation_object_get_fences_rcu(struct reservation_object *obj, + GFP_NOWAIT | __GFP_NOWARN); + if (!nshared) { + rcu_read_unlock(); ++ ++ dma_fence_put(fence_excl); ++ fence_excl = NULL; ++ + nshared = krealloc(shared, sz, GFP_KERNEL); + if (nshared) { + shared = nshared; +diff --git a/drivers/dma/sh/rcar-dmac.c b/drivers/dma/sh/rcar-dmac.c +index 33ab1b607e2b..54de669c38b8 100644 +--- a/drivers/dma/sh/rcar-dmac.c ++++ b/drivers/dma/sh/rcar-dmac.c +@@ -1165,7 +1165,7 @@ rcar_dmac_prep_slave_sg(struct dma_chan *chan, struct scatterlist *sgl, + struct rcar_dmac_chan *rchan = to_rcar_dmac_chan(chan); + + /* Someone calling slave DMA on a generic channel? */ +- if (rchan->mid_rid < 0 || !sg_len) { ++ if (rchan->mid_rid < 0 || !sg_len || !sg_dma_len(sgl)) { + dev_warn(chan->device->dev, + "%s: bad parameter: len=%d, id=%d\n", + __func__, sg_len, rchan->mid_rid); +diff --git a/drivers/dma/tegra20-apb-dma.c b/drivers/dma/tegra20-apb-dma.c +index ef317c90fbe1..79e9593815f1 100644 +--- a/drivers/dma/tegra20-apb-dma.c ++++ b/drivers/dma/tegra20-apb-dma.c +@@ -977,8 +977,12 @@ static struct dma_async_tx_descriptor *tegra_dma_prep_slave_sg( + csr |= tdc->slave_id << TEGRA_APBDMA_CSR_REQ_SEL_SHIFT; + } + +- if (flags & DMA_PREP_INTERRUPT) ++ if (flags & DMA_PREP_INTERRUPT) { + csr |= TEGRA_APBDMA_CSR_IE_EOC; ++ } else { ++ WARN_ON_ONCE(1); ++ return NULL; ++ } + + apb_seq |= TEGRA_APBDMA_APBSEQ_WRAP_WORD_1; + +@@ -1120,8 +1124,12 @@ static struct dma_async_tx_descriptor *tegra_dma_prep_dma_cyclic( + csr |= tdc->slave_id << TEGRA_APBDMA_CSR_REQ_SEL_SHIFT; + } + +- if (flags & DMA_PREP_INTERRUPT) ++ if (flags & DMA_PREP_INTERRUPT) { + csr |= TEGRA_APBDMA_CSR_IE_EOC; ++ } else { ++ WARN_ON_ONCE(1); ++ return NULL; ++ } + + apb_seq |= TEGRA_APBDMA_APBSEQ_WRAP_WORD_1; + +diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c +index 464174685589..4386ea4b9b5a 100644 +--- a/drivers/edac/edac_mc_sysfs.c ++++ b/drivers/edac/edac_mc_sysfs.c +@@ -26,7 +26,7 @@ + static int edac_mc_log_ue = 1; + static int edac_mc_log_ce = 1; + static int edac_mc_panic_on_ue; +-static int edac_mc_poll_msec = 1000; ++static unsigned int edac_mc_poll_msec = 1000; + + /* Getter functions for above */ + int edac_mc_get_log_ue(void) +@@ -45,30 +45,30 @@ int edac_mc_get_panic_on_ue(void) + } + + /* this is temporary */ +-int edac_mc_get_poll_msec(void) ++unsigned int edac_mc_get_poll_msec(void) + { + return edac_mc_poll_msec; + } + + static int edac_set_poll_msec(const char *val, const struct kernel_param *kp) + { +- unsigned long l; ++ unsigned int i; + int ret; + + if (!val) + return -EINVAL; + +- ret = kstrtoul(val, 0, &l); ++ ret = kstrtouint(val, 0, &i); + if (ret) + return ret; + +- if (l < 1000) ++ if (i < 1000) + return -EINVAL; + +- *((unsigned long *)kp->arg) = l; ++ *((unsigned int *)kp->arg) = i; + + /* notify edac_mc engine to reset the poll period */ +- edac_mc_reset_delay_period(l); ++ edac_mc_reset_delay_period(i); + + return 0; + } +@@ -82,7 +82,7 @@ MODULE_PARM_DESC(edac_mc_log_ue, + module_param(edac_mc_log_ce, int, 0644); + MODULE_PARM_DESC(edac_mc_log_ce, + "Log correctable error to console: 0=off 1=on"); +-module_param_call(edac_mc_poll_msec, edac_set_poll_msec, param_get_int, ++module_param_call(edac_mc_poll_msec, edac_set_poll_msec, param_get_uint, + &edac_mc_poll_msec, 0644); + MODULE_PARM_DESC(edac_mc_poll_msec, "Polling period in milliseconds"); + +@@ -404,6 +404,8 @@ static inline int nr_pages_per_csrow(struct csrow_info *csrow) + static int edac_create_csrow_object(struct mem_ctl_info *mci, + struct csrow_info *csrow, int index) + { ++ int err; ++ + csrow->dev.type = &csrow_attr_type; + csrow->dev.groups = csrow_dev_groups; + device_initialize(&csrow->dev); +@@ -415,7 +417,11 @@ static int edac_create_csrow_object(struct mem_ctl_info *mci, + edac_dbg(0, "creating (virtual) csrow node %s\n", + dev_name(&csrow->dev)); + +- return device_add(&csrow->dev); ++ err = device_add(&csrow->dev); ++ if (err) ++ put_device(&csrow->dev); ++ ++ return err; + } + + /* Create a CSROW object under specifed edac_mc_device */ +@@ -443,7 +449,8 @@ static int edac_create_csrow_objects(struct mem_ctl_info *mci) + csrow = mci->csrows[i]; + if (!nr_pages_per_csrow(csrow)) + continue; +- put_device(&mci->csrows[i]->dev); ++ ++ device_del(&mci->csrows[i]->dev); + } + + return err; +@@ -645,9 +652,11 @@ static int edac_create_dimm_object(struct mem_ctl_info *mci, + dev_set_drvdata(&dimm->dev, dimm); + pm_runtime_forbid(&mci->dev); + +- err = device_add(&dimm->dev); ++ err = device_add(&dimm->dev); ++ if (err) ++ put_device(&dimm->dev); + +- edac_dbg(0, "creating rank/dimm device %s\n", dev_name(&dimm->dev)); ++ edac_dbg(0, "created rank/dimm device %s\n", dev_name(&dimm->dev)); + + return err; + } +@@ -928,6 +937,7 @@ int edac_create_sysfs_mci_device(struct mem_ctl_info *mci, + err = device_add(&mci->dev); + if (err < 0) { + edac_dbg(1, "failure: create device %s\n", dev_name(&mci->dev)); ++ put_device(&mci->dev); + goto out; + } + +diff --git a/drivers/edac/edac_module.h b/drivers/edac/edac_module.h +index dd7d0b509aa3..75528f07abd5 100644 +--- a/drivers/edac/edac_module.h ++++ b/drivers/edac/edac_module.h +@@ -36,7 +36,7 @@ extern int edac_mc_get_log_ue(void); + extern int edac_mc_get_log_ce(void); + extern int edac_mc_get_panic_on_ue(void); + extern int edac_get_poll_msec(void); +-extern int edac_mc_get_poll_msec(void); ++extern unsigned int edac_mc_get_poll_msec(void); + + unsigned edac_dimm_info_location(struct dimm_info *dimm, char *buf, + unsigned len); +diff --git a/drivers/firmware/Kconfig b/drivers/firmware/Kconfig +index d40ccc3af9e2..fa7ed01415b7 100644 +--- a/drivers/firmware/Kconfig ++++ b/drivers/firmware/Kconfig +@@ -157,7 +157,7 @@ config DMI_SCAN_MACHINE_NON_EFI_FALLBACK + + config ISCSI_IBFT_FIND + bool "iSCSI Boot Firmware Table Attributes" +- depends on X86 && ACPI ++ depends on X86 && ISCSI_IBFT + default n + help + This option enables the kernel to find the region of memory +@@ -168,7 +168,8 @@ config ISCSI_IBFT_FIND + config ISCSI_IBFT + tristate "iSCSI Boot Firmware Table Attributes module" + select ISCSI_BOOT_SYSFS +- depends on ISCSI_IBFT_FIND && SCSI && SCSI_LOWLEVEL ++ select ISCSI_IBFT_FIND if X86 ++ depends on ACPI && SCSI && SCSI_LOWLEVEL + default n + help + This option enables support for detection and exposing of iSCSI +diff --git a/drivers/firmware/iscsi_ibft.c b/drivers/firmware/iscsi_ibft.c +index ab3aa3983833..7e12cbdf957c 100644 +--- a/drivers/firmware/iscsi_ibft.c ++++ b/drivers/firmware/iscsi_ibft.c +@@ -84,6 +84,10 @@ MODULE_DESCRIPTION("sysfs interface to BIOS iBFT information"); + MODULE_LICENSE("GPL"); + MODULE_VERSION(IBFT_ISCSI_VERSION); + ++#ifndef CONFIG_ISCSI_IBFT_FIND ++struct acpi_table_ibft *ibft_addr; ++#endif ++ + struct ibft_hdr { + u8 id; + u8 version; +diff --git a/drivers/firmware/psci/psci_checker.c b/drivers/firmware/psci/psci_checker.c +index 08c85099d4d0..f3659443f8c2 100644 +--- a/drivers/firmware/psci/psci_checker.c ++++ b/drivers/firmware/psci/psci_checker.c +@@ -359,16 +359,16 @@ static int suspend_test_thread(void *arg) + for (;;) { + /* Needs to be set first to avoid missing a wakeup. */ + set_current_state(TASK_INTERRUPTIBLE); +- if (kthread_should_stop()) { +- __set_current_state(TASK_RUNNING); ++ if (kthread_should_park()) + break; +- } + schedule(); + } + + pr_info("CPU %d suspend test results: success %d, shallow states %d, errors %d\n", + cpu, nb_suspend, nb_shallow_sleep, nb_err); + ++ kthread_parkme(); ++ + return nb_err; + } + +@@ -433,8 +433,10 @@ static int suspend_tests(void) + + + /* Stop and destroy all threads, get return status. */ +- for (i = 0; i < nb_threads; ++i) ++ for (i = 0; i < nb_threads; ++i) { ++ err += kthread_park(threads[i]); + err += kthread_stop(threads[i]); ++ } + out: + cpuidle_resume_and_unlock(); + kfree(threads); +diff --git a/drivers/fpga/Kconfig b/drivers/fpga/Kconfig +index 8072c195d831..dd414250e77e 100644 +--- a/drivers/fpga/Kconfig ++++ b/drivers/fpga/Kconfig +@@ -40,6 +40,7 @@ config ALTERA_PR_IP_CORE_PLAT + config FPGA_MGR_ALTERA_PS_SPI + tristate "Altera FPGA Passive Serial over SPI" + depends on SPI ++ select BITREVERSE + help + FPGA manager driver support for Altera Arria/Cyclone/Stratix + using the passive serial interface over SPI. +diff --git a/drivers/gpio/gpio-davinci.c b/drivers/gpio/gpio-davinci.c +index 3bbf5804bd11..de4da2ed7955 100644 +--- a/drivers/gpio/gpio-davinci.c ++++ b/drivers/gpio/gpio-davinci.c +@@ -238,8 +238,9 @@ static int davinci_gpio_probe(struct platform_device *pdev) + for (i = 0; i < nirq; i++) { + chips->irqs[i] = platform_get_irq(pdev, i); + if (chips->irqs[i] < 0) { +- dev_info(dev, "IRQ not populated, err = %d\n", +- chips->irqs[i]); ++ if (chips->irqs[i] != -EPROBE_DEFER) ++ dev_info(dev, "IRQ not populated, err = %d\n", ++ chips->irqs[i]); + return chips->irqs[i]; + } + } +diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c +index 9276ef616430..8591c410ecaa 100644 +--- a/drivers/gpio/gpio-omap.c ++++ b/drivers/gpio/gpio-omap.c +@@ -829,9 +829,9 @@ static void omap_gpio_irq_shutdown(struct irq_data *d) + + raw_spin_lock_irqsave(&bank->lock, flags); + bank->irq_usage &= ~(BIT(offset)); +- omap_set_gpio_irqenable(bank, offset, 0); +- omap_clear_gpio_irqstatus(bank, offset); + omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE); ++ omap_clear_gpio_irqstatus(bank, offset); ++ omap_set_gpio_irqenable(bank, offset, 0); + if (!LINE_USED(bank->mod_usage, offset)) + omap_clear_gpio_debounce(bank, offset); + omap_disable_gpio_module(bank, offset); +@@ -867,8 +867,8 @@ static void omap_gpio_mask_irq(struct irq_data *d) + unsigned long flags; + + raw_spin_lock_irqsave(&bank->lock, flags); +- omap_set_gpio_irqenable(bank, offset, 0); + omap_set_gpio_triggering(bank, offset, IRQ_TYPE_NONE); ++ omap_set_gpio_irqenable(bank, offset, 0); + raw_spin_unlock_irqrestore(&bank->lock, flags); + } + +@@ -880,9 +880,6 @@ static void omap_gpio_unmask_irq(struct irq_data *d) + unsigned long flags; + + raw_spin_lock_irqsave(&bank->lock, flags); +- if (trigger) +- omap_set_gpio_triggering(bank, offset, trigger); +- + omap_set_gpio_irqenable(bank, offset, 1); + + /* +@@ -890,9 +887,13 @@ static void omap_gpio_unmask_irq(struct irq_data *d) + * is cleared, thus after the handler has run. OMAP4 needs this done + * after enabing the interrupt to clear the wakeup status. + */ +- if (bank->level_mask & BIT(offset)) ++ if (bank->regs->leveldetect0 && bank->regs->wkup_en && ++ trigger & (IRQ_TYPE_LEVEL_HIGH | IRQ_TYPE_LEVEL_LOW)) + omap_clear_gpio_irqstatus(bank, offset); + ++ if (trigger) ++ omap_set_gpio_triggering(bank, offset, trigger); ++ + raw_spin_unlock_irqrestore(&bank->lock, flags); + } + +@@ -1274,13 +1275,23 @@ static void omap_gpio_idle(struct gpio_bank *bank, bool may_lose_context) + { + struct device *dev = bank->chip.parent; + void __iomem *base = bank->base; +- u32 nowake; ++ u32 mask, nowake; + + bank->saved_datain = readl_relaxed(base + bank->regs->datain); + + if (!bank->enabled_non_wakeup_gpios) + goto update_gpio_context_count; + ++ /* Check for pending EDGE_FALLING, ignore EDGE_BOTH */ ++ mask = bank->enabled_non_wakeup_gpios & bank->context.fallingdetect; ++ mask &= ~bank->context.risingdetect; ++ bank->saved_datain |= mask; ++ ++ /* Check for pending EDGE_RISING, ignore EDGE_BOTH */ ++ mask = bank->enabled_non_wakeup_gpios & bank->context.risingdetect; ++ mask &= ~bank->context.fallingdetect; ++ bank->saved_datain &= ~mask; ++ + if (!may_lose_context) + goto update_gpio_context_count; + +@@ -1453,6 +1464,8 @@ static struct omap_gpio_reg_offs omap4_gpio_regs = { + .clr_dataout = OMAP4_GPIO_CLEARDATAOUT, + .irqstatus = OMAP4_GPIO_IRQSTATUS0, + .irqstatus2 = OMAP4_GPIO_IRQSTATUS1, ++ .irqstatus_raw0 = OMAP4_GPIO_IRQSTATUSRAW0, ++ .irqstatus_raw1 = OMAP4_GPIO_IRQSTATUSRAW1, + .irqenable = OMAP4_GPIO_IRQSTATUSSET0, + .irqenable2 = OMAP4_GPIO_IRQSTATUSSET1, + .set_irqenable = OMAP4_GPIO_IRQSTATUSSET0, +diff --git a/drivers/gpio/gpiolib-of.c b/drivers/gpio/gpiolib-of.c +index 9c9b965d7d6d..c9325efc1783 100644 +--- a/drivers/gpio/gpiolib-of.c ++++ b/drivers/gpio/gpiolib-of.c +@@ -118,15 +118,8 @@ static void of_gpio_flags_quirks(struct device_node *np, + * Legacy handling of SPI active high chip select. If we have a + * property named "cs-gpios" we need to inspect the child node + * to determine if the flags should have inverted semantics. +- * +- * This does not apply to an SPI device named "spi-gpio", because +- * these have traditionally obtained their own GPIOs by parsing +- * the device tree directly and did not respect any "spi-cs-high" +- * property on the SPI bus children. + */ +- if (IS_ENABLED(CONFIG_SPI_MASTER) && +- !strcmp(propname, "cs-gpios") && +- !of_device_is_compatible(np, "spi-gpio") && ++ if (IS_ENABLED(CONFIG_SPI_MASTER) && !strcmp(propname, "cs-gpios") && + of_property_read_bool(np, "cs-gpios")) { + struct device_node *child; + u32 cs; +@@ -161,6 +154,7 @@ static void of_gpio_flags_quirks(struct device_node *np, + of_node_full_name(child)); + *flags |= OF_GPIO_ACTIVE_LOW; + } ++ of_node_put(child); + break; + } + } +diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c +index e013d417a936..4f333d6f2e23 100644 +--- a/drivers/gpio/gpiolib.c ++++ b/drivers/gpio/gpiolib.c +@@ -956,9 +956,11 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) + } + + if (eflags & GPIOEVENT_REQUEST_RISING_EDGE) +- irqflags |= IRQF_TRIGGER_RISING; ++ irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? ++ IRQF_TRIGGER_FALLING : IRQF_TRIGGER_RISING; + if (eflags & GPIOEVENT_REQUEST_FALLING_EDGE) +- irqflags |= IRQF_TRIGGER_FALLING; ++ irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? ++ IRQF_TRIGGER_RISING : IRQF_TRIGGER_FALLING; + irqflags |= IRQF_ONESHOT; + + INIT_KFIFO(le->events); +@@ -1392,12 +1394,17 @@ int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data, + for (i = 0; i < chip->ngpio; i++) { + struct gpio_desc *desc = &gdev->descs[i]; + +- if (chip->get_direction && gpiochip_line_is_valid(chip, i)) +- desc->flags = !chip->get_direction(chip, i) ? +- (1 << FLAG_IS_OUT) : 0; +- else +- desc->flags = !chip->direction_input ? +- (1 << FLAG_IS_OUT) : 0; ++ if (chip->get_direction && gpiochip_line_is_valid(chip, i)) { ++ if (!chip->get_direction(chip, i)) ++ set_bit(FLAG_IS_OUT, &desc->flags); ++ else ++ clear_bit(FLAG_IS_OUT, &desc->flags); ++ } else { ++ if (!chip->direction_input) ++ set_bit(FLAG_IS_OUT, &desc->flags); ++ else ++ clear_bit(FLAG_IS_OUT, &desc->flags); ++ } + } + + acpi_gpiochip_add(chip); +@@ -3025,7 +3032,7 @@ int gpiod_get_array_value_complex(bool raw, bool can_sleep, + int gpiod_get_raw_value(const struct gpio_desc *desc) + { + VALIDATE_DESC(desc); +- /* Should be using gpio_get_value_cansleep() */ ++ /* Should be using gpiod_get_raw_value_cansleep() */ + WARN_ON(desc->gdev->chip->can_sleep); + return gpiod_get_raw_value_commit(desc); + } +@@ -3046,7 +3053,7 @@ int gpiod_get_value(const struct gpio_desc *desc) + int value; + + VALIDATE_DESC(desc); +- /* Should be using gpio_get_value_cansleep() */ ++ /* Should be using gpiod_get_value_cansleep() */ + WARN_ON(desc->gdev->chip->can_sleep); + + value = gpiod_get_raw_value_commit(desc); +@@ -3317,7 +3324,7 @@ int gpiod_set_array_value_complex(bool raw, bool can_sleep, + void gpiod_set_raw_value(struct gpio_desc *desc, int value) + { + VALIDATE_DESC_VOID(desc); +- /* Should be using gpiod_set_value_cansleep() */ ++ /* Should be using gpiod_set_raw_value_cansleep() */ + WARN_ON(desc->gdev->chip->can_sleep); + gpiod_set_raw_value_commit(desc, value); + } +@@ -3358,6 +3365,7 @@ static void gpiod_set_value_nocheck(struct gpio_desc *desc, int value) + void gpiod_set_value(struct gpio_desc *desc, int value) + { + VALIDATE_DESC_VOID(desc); ++ /* Should be using gpiod_set_value_cansleep() */ + WARN_ON(desc->gdev->chip->can_sleep); + gpiod_set_value_nocheck(desc, value); + } +@@ -4244,8 +4252,7 @@ EXPORT_SYMBOL_GPL(gpiod_get_index); + * + * Returns: + * On successful request the GPIO pin is configured in accordance with +- * provided @dflags. If the node does not have the requested GPIO +- * property, NULL is returned. ++ * provided @dflags. + * + * In case of error an ERR_PTR() is returned. + */ +@@ -4267,9 +4274,6 @@ struct gpio_desc *gpiod_get_from_of_node(struct device_node *node, + index, &flags); + + if (!desc || IS_ERR(desc)) { +- /* If it is not there, just return NULL */ +- if (PTR_ERR(desc) == -ENOENT) +- return NULL; + return desc; + } + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +index a6e5184d436c..4b192e0ce92f 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +@@ -896,6 +896,9 @@ static int init_kfd_vm(struct amdgpu_vm *vm, void **process_info, + AMDGPU_FENCE_OWNER_KFD, false); + if (ret) + goto wait_pd_fail; ++ ret = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv, 1); ++ if (ret) ++ goto reserve_shared_fail; + amdgpu_bo_fence(vm->root.base.bo, + &vm->process_info->eviction_fence->base, true); + amdgpu_bo_unreserve(vm->root.base.bo); +@@ -909,6 +912,7 @@ static int init_kfd_vm(struct amdgpu_vm *vm, void **process_info, + + return 0; + ++reserve_shared_fail: + wait_pd_fail: + validate_pd_fail: + amdgpu_bo_unreserve(vm->root.base.bo); +diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +index 02955e6e9dd9..c21ef99cc590 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c +@@ -1317,6 +1317,39 @@ static int gfx_v8_0_rlc_init(struct amdgpu_device *adev) + return 0; + } + ++static int gfx_v8_0_csb_vram_pin(struct amdgpu_device *adev) ++{ ++ int r; ++ ++ r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, false); ++ if (unlikely(r != 0)) ++ return r; ++ ++ r = amdgpu_bo_pin(adev->gfx.rlc.clear_state_obj, ++ AMDGPU_GEM_DOMAIN_VRAM); ++ if (!r) ++ adev->gfx.rlc.clear_state_gpu_addr = ++ amdgpu_bo_gpu_offset(adev->gfx.rlc.clear_state_obj); ++ ++ amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); ++ ++ return r; ++} ++ ++static void gfx_v8_0_csb_vram_unpin(struct amdgpu_device *adev) ++{ ++ int r; ++ ++ if (!adev->gfx.rlc.clear_state_obj) ++ return; ++ ++ r = amdgpu_bo_reserve(adev->gfx.rlc.clear_state_obj, true); ++ if (likely(r == 0)) { ++ amdgpu_bo_unpin(adev->gfx.rlc.clear_state_obj); ++ amdgpu_bo_unreserve(adev->gfx.rlc.clear_state_obj); ++ } ++} ++ + static void gfx_v8_0_mec_fini(struct amdgpu_device *adev) + { + amdgpu_bo_free_kernel(&adev->gfx.mec.hpd_eop_obj, NULL, NULL); +@@ -4777,6 +4810,10 @@ static int gfx_v8_0_hw_init(void *handle) + gfx_v8_0_init_golden_registers(adev); + gfx_v8_0_constants_init(adev); + ++ r = gfx_v8_0_csb_vram_pin(adev); ++ if (r) ++ return r; ++ + r = adev->gfx.rlc.funcs->resume(adev); + if (r) + return r; +@@ -4893,6 +4930,9 @@ static int gfx_v8_0_hw_fini(void *handle) + else + pr_err("rlc is busy, skip halt rlc\n"); + amdgpu_gfx_rlc_exit_safe_mode(adev); ++ ++ gfx_v8_0_csb_vram_unpin(adev); ++ + return 0; + } + +diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +index 72837b8c7031..c2086eb00555 100644 +--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c ++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +@@ -1163,6 +1163,9 @@ static int gmc_v9_0_gart_enable(struct amdgpu_device *adev) + tmp = RREG32_SOC15(HDP, 0, mmHDP_HOST_PATH_CNTL); + WREG32_SOC15(HDP, 0, mmHDP_HOST_PATH_CNTL, tmp); + ++ WREG32_SOC15(HDP, 0, mmHDP_NONSURFACE_BASE, (adev->gmc.vram_start >> 8)); ++ WREG32_SOC15(HDP, 0, mmHDP_NONSURFACE_BASE_HI, (adev->gmc.vram_start >> 40)); ++ + /* After HDP is initialized, flush HDP.*/ + adev->nbio_funcs->hdp_flush(adev, NULL); + +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +index ae381450601c..afbaf6f5131e 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +@@ -1268,12 +1268,17 @@ int amdkfd_fence_wait_timeout(unsigned int *fence_addr, + return 0; + } + +-static int unmap_sdma_queues(struct device_queue_manager *dqm, +- unsigned int sdma_engine) ++static int unmap_sdma_queues(struct device_queue_manager *dqm) + { +- return pm_send_unmap_queue(&dqm->packets, KFD_QUEUE_TYPE_SDMA, +- KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, false, +- sdma_engine); ++ int i, retval = 0; ++ ++ for (i = 0; i < dqm->dev->device_info->num_sdma_engines; i++) { ++ retval = pm_send_unmap_queue(&dqm->packets, KFD_QUEUE_TYPE_SDMA, ++ KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, false, i); ++ if (retval) ++ return retval; ++ } ++ return retval; + } + + /* dqm->lock mutex has to be locked before calling this function */ +@@ -1312,10 +1317,8 @@ static int unmap_queues_cpsch(struct device_queue_manager *dqm, + pr_debug("Before destroying queues, sdma queue count is : %u\n", + dqm->sdma_queue_count); + +- if (dqm->sdma_queue_count > 0) { +- unmap_sdma_queues(dqm, 0); +- unmap_sdma_queues(dqm, 1); +- } ++ if (dqm->sdma_queue_count > 0) ++ unmap_sdma_queues(dqm); + + retval = pm_send_unmap_queue(&dqm->packets, KFD_QUEUE_TYPE_COMPUTE, + filter, filter_param, false, 0); +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c +index 9dbba609450e..8fe74b821b32 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c +@@ -76,6 +76,7 @@ static int init_mqd(struct mqd_manager *mm, void **mqd, + struct v9_mqd *m; + struct kfd_dev *kfd = mm->dev; + ++ *mqd_mem_obj = NULL; + /* From V9, for CWSR, the control stack is located on the next page + * boundary after the mqd, we will use the gtt allocation function + * instead of sub-allocation function. +@@ -93,8 +94,10 @@ static int init_mqd(struct mqd_manager *mm, void **mqd, + } else + retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct v9_mqd), + mqd_mem_obj); +- if (retval != 0) ++ if (retval) { ++ kfree(*mqd_mem_obj); + return -ENOMEM; ++ } + + m = (struct v9_mqd *) (*mqd_mem_obj)->cpu_ptr; + addr = (*mqd_mem_obj)->gpu_addr; +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +index ab7c5c3004ee..dc3ac66a4450 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +@@ -2592,7 +2592,7 @@ fill_plane_buffer_attributes(struct amdgpu_device *adev, + address->type = PLN_ADDR_TYPE_GRAPHICS; + address->grph.addr.low_part = lower_32_bits(afb->address); + address->grph.addr.high_part = upper_32_bits(afb->address); +- } else { ++ } else if (format < SURFACE_PIXEL_FORMAT_INVALID) { + uint64_t chroma_addr = afb->address + fb->offsets[1]; + + plane_size->video.luma_size.x = 0; +@@ -4627,6 +4627,13 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm, + { + struct amdgpu_device *adev = dm->ddev->dev_private; + ++ /* ++ * Some of the properties below require access to state, like bpc. ++ * Allocate some default initial connector state with our reset helper. ++ */ ++ if (aconnector->base.funcs->reset) ++ aconnector->base.funcs->reset(&aconnector->base); ++ + aconnector->connector_id = link_index; + aconnector->dc_link = link; + aconnector->base.interlace_allowed = false; +@@ -4809,9 +4816,6 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm, + &aconnector->base, + &amdgpu_dm_connector_helper_funcs); + +- if (aconnector->base.funcs->reset) +- aconnector->base.funcs->reset(&aconnector->base); +- + amdgpu_dm_connector_init_helper( + dm, + aconnector, +@@ -4952,12 +4956,12 @@ static int get_cursor_position(struct drm_plane *plane, struct drm_crtc *crtc, + int x, y; + int xorigin = 0, yorigin = 0; + +- if (!crtc || !plane->state->fb) { +- position->enable = false; +- position->x = 0; +- position->y = 0; ++ position->enable = false; ++ position->x = 0; ++ position->y = 0; ++ ++ if (!crtc || !plane->state->fb) + return 0; +- } + + if ((plane->state->crtc_w > amdgpu_crtc->max_cursor_width) || + (plane->state->crtc_h > amdgpu_crtc->max_cursor_height)) { +@@ -4971,6 +4975,10 @@ static int get_cursor_position(struct drm_plane *plane, struct drm_crtc *crtc, + x = plane->state->crtc_x; + y = plane->state->crtc_y; + ++ if (x <= -amdgpu_crtc->max_cursor_width || ++ y <= -amdgpu_crtc->max_cursor_height) ++ return 0; ++ + if (crtc->primary->state) { + /* avivo cursor are offset into the total surface */ + x += crtc->primary->state->src_x >> 16; +@@ -6327,6 +6335,10 @@ static bool should_reset_plane(struct drm_atomic_state *state, + if (!new_crtc_state) + return true; + ++ /* CRTC Degamma changes currently require us to recreate planes. */ ++ if (new_crtc_state->color_mgmt_changed) ++ return true; ++ + if (drm_atomic_crtc_needs_modeset(new_crtc_state)) + return true; + +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c +index 18c775a950cc..0a7adc2925e3 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc.c +@@ -608,8 +608,10 @@ const struct dc_link_settings *dc_link_get_link_cap( + + static void destruct(struct dc *dc) + { +- dc_release_state(dc->current_state); +- dc->current_state = NULL; ++ if (dc->current_state) { ++ dc_release_state(dc->current_state); ++ dc->current_state = NULL; ++ } + + destroy_links(dc); + +@@ -1138,9 +1140,6 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *c + const struct dc_link *link = context->streams[i]->link; + struct dc_stream_status *status; + +- if (context->streams[i]->apply_seamless_boot_optimization) +- context->streams[i]->apply_seamless_boot_optimization = false; +- + if (!context->streams[i]->mode_changed) + continue; + +@@ -1792,10 +1791,15 @@ static void commit_planes_for_stream(struct dc *dc, + if (dc->optimize_seamless_boot && surface_count > 0) { + /* Optimize seamless boot flag keeps clocks and watermarks high until + * first flip. After first flip, optimization is required to lower +- * bandwidth. ++ * bandwidth. Important to note that it is expected UEFI will ++ * only light up a single display on POST, therefore we only expect ++ * one stream with seamless boot flag set. + */ +- dc->optimize_seamless_boot = false; +- dc->optimized_required = true; ++ if (stream->apply_seamless_boot_optimization) { ++ stream->apply_seamless_boot_optimization = false; ++ dc->optimize_seamless_boot = false; ++ dc->optimized_required = true; ++ } + } + + if (update_type == UPDATE_TYPE_FULL && !dc->optimize_seamless_boot) { +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +index b37ecc3ede61..adf39e3b8d29 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +@@ -960,6 +960,12 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason) + + link->type = dc_connection_none; + sink_caps.signal = SIGNAL_TYPE_NONE; ++ /* When we unplug a passive DP-HDMI dongle connection, dongle_max_pix_clk ++ * is not cleared. If we emulate a DP signal on this connection, it thinks ++ * the dongle is still there and limits the number of modes we can emulate. ++ * Clear dongle_max_pix_clk on disconnect to fix this ++ */ ++ link->dongle_max_pix_clk = 0; + } + + LINK_INFO("link=%d, dc_sink_in=%p is now %s prev_sink=%p dpcd same=%d edid same=%d\n", +@@ -2278,7 +2284,7 @@ bool dc_link_set_backlight_level(const struct dc_link *link, + if (core_dc->current_state->res_ctx.pipe_ctx[i].stream) { + if (core_dc->current_state->res_ctx. + pipe_ctx[i].stream->link +- == link) ++ == link) { + /* DMCU -1 for all controller id values, + * therefore +1 here + */ +@@ -2286,6 +2292,13 @@ bool dc_link_set_backlight_level(const struct dc_link *link, + core_dc->current_state-> + res_ctx.pipe_ctx[i].stream_res.tg->inst + + 1; ++ ++ /* Disable brightness ramping when the display is blanked ++ * as it can hang the DMCU ++ */ ++ if (core_dc->current_state->res_ctx.pipe_ctx[i].plane_state == NULL) ++ frame_ramp = 0; ++ } + } + } + abm->funcs->set_backlight_level_pwm( +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +index 1ee544a32ebb..966aa3b754c5 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +@@ -1624,8 +1624,7 @@ static bool decide_edp_link_settings(struct dc_link *link, struct dc_link_settin + uint32_t link_bw; + + if (link->dpcd_caps.dpcd_rev.raw < DPCD_REV_14 || +- link->dpcd_caps.edp_supported_link_rates_count == 0 || +- link->dc->config.optimize_edp_link_rate == false) { ++ link->dpcd_caps.edp_supported_link_rates_count == 0) { + *link_setting = link->verified_link_cap; + return true; + } +@@ -2219,11 +2218,18 @@ static void get_active_converter_info( + link->dpcd_caps.dongle_type = DISPLAY_DONGLE_NONE; + ddc_service_set_dongle_type(link->ddc, + link->dpcd_caps.dongle_type); ++ link->dpcd_caps.is_branch_dev = false; + return; + } + + /* DPCD 0x5 bit 0 = 1, it indicate it's branch device */ +- link->dpcd_caps.is_branch_dev = ds_port.fields.PORT_PRESENT; ++ if (ds_port.fields.PORT_TYPE == DOWNSTREAM_DP) { ++ link->dpcd_caps.is_branch_dev = false; ++ } ++ ++ else { ++ link->dpcd_caps.is_branch_dev = ds_port.fields.PORT_PRESENT; ++ } + + switch (ds_port.fields.PORT_TYPE) { + case DOWNSTREAM_VGA: +@@ -2597,7 +2603,8 @@ void detect_edp_sink_caps(struct dc_link *link) + memset(supported_link_rates, 0, sizeof(supported_link_rates)); + + if (link->dpcd_caps.dpcd_rev.raw >= DPCD_REV_14 && +- link->dc->config.optimize_edp_link_rate) { ++ (link->dc->config.optimize_edp_link_rate || ++ link->reported_link_cap.link_rate == LINK_RATE_UNKNOWN)) { + // Read DPCD 00010h - 0001Fh 16 bytes at one shot + core_link_read_dpcd(link, DP_SUPPORTED_LINK_RATES, + supported_link_rates, sizeof(supported_link_rates)); +@@ -2612,6 +2619,9 @@ void detect_edp_sink_caps(struct dc_link *link) + link_rate = linkRateInKHzToLinkRateMultiplier(link_rate_in_khz); + link->dpcd_caps.edp_supported_link_rates[link->dpcd_caps.edp_supported_link_rates_count] = link_rate; + link->dpcd_caps.edp_supported_link_rates_count++; ++ ++ if (link->reported_link_cap.link_rate < link_rate) ++ link->reported_link_cap.link_rate = link_rate; + } + } + } +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +index eac7186e4f08..b459ce056b60 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +@@ -254,7 +254,7 @@ bool resource_construct( + * PORT_CONNECTIVITY == 1 (as instructed by HW team). + */ + update_num_audio(&straps, &num_audio, &pool->audio_support); +- for (i = 0; i < pool->pipe_count && i < num_audio; i++) { ++ for (i = 0; i < caps->num_audio; i++) { + struct audio *aud = create_funcs->create_audio(ctx, i); + + if (aud == NULL) { +@@ -1702,6 +1702,12 @@ static struct audio *find_first_free_audio( + return pool->audios[i]; + } + } ++ ++ /* use engine id to find free audio */ ++ if ((id < pool->audio_count) && (res_ctx->is_audio_acquired[id] == false)) { ++ return pool->audios[id]; ++ } ++ + /*not found the matching one, first come first serve*/ + for (i = 0; i < pool->audio_count; i++) { + if (res_ctx->is_audio_acquired[i] == false) { +@@ -1866,6 +1872,7 @@ static int get_norm_pix_clk(const struct dc_crtc_timing *timing) + pix_clk /= 2; + if (timing->pixel_encoding != PIXEL_ENCODING_YCBCR422) { + switch (timing->display_color_depth) { ++ case COLOR_DEPTH_666: + case COLOR_DEPTH_888: + normalized_pix_clk = pix_clk; + break; +@@ -2012,7 +2019,7 @@ enum dc_status resource_map_pool_resources( + /* TODO: Add check if ASIC support and EDID audio */ + if (!stream->converter_disable_audio && + dc_is_audio_capable_signal(pipe_ctx->stream->signal) && +- stream->audio_info.mode_count) { ++ stream->audio_info.mode_count && stream->audio_info.flags.all) { + pipe_ctx->stream_res.audio = find_first_free_audio( + &context->res_ctx, pool, pipe_ctx->stream_res.stream_enc->id); + +@@ -2034,6 +2041,9 @@ enum dc_status resource_map_pool_resources( + if (context->streams[i] == stream) { + context->stream_status[i].primary_otg_inst = pipe_ctx->stream_res.tg->inst; + context->stream_status[i].stream_enc_inst = pipe_ctx->stream_res.stream_enc->id; ++ context->stream_status[i].audio_inst = ++ pipe_ctx->stream_res.audio ? pipe_ctx->stream_res.audio->inst : -1; ++ + return DC_OK; + } + +diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/amd/display/dc/dc_stream.h +index 189bdab929a5..c20803b71fa5 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc_stream.h ++++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h +@@ -42,6 +42,7 @@ struct dc_stream_status { + int primary_otg_inst; + int stream_enc_inst; + int plane_count; ++ int audio_inst; + struct timing_sync_info timing_sync_info; + struct dc_plane_state *plane_states[MAX_SURFACE_NUM]; + }; +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c +index da96229db53a..da30ae04e82b 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_abm.c +@@ -234,6 +234,10 @@ static void dmcu_set_backlight_level( + s2 |= (backlight_8_bit << ATOM_S2_CURRENT_BL_LEVEL_SHIFT); + + REG_WRITE(BIOS_SCRATCH_2, s2); ++ ++ /* waitDMCUReadyForCmd */ ++ REG_WAIT(MASTER_COMM_CNTL_REG, MASTER_COMM_INTERRUPT, ++ 0, 1, 80000); + } + + static void dce_abm_init(struct abm *abm) +@@ -473,6 +477,8 @@ void dce_abm_destroy(struct abm **abm) + { + struct dce_abm *abm_dce = TO_DCE_ABM(*abm); + ++ abm_dce->base.funcs->set_abm_immediate_disable(*abm); ++ + kfree(abm_dce); + *abm = NULL; + } +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c +index 818536eea00a..c6a607cd0e4b 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.c +@@ -388,6 +388,9 @@ static bool dcn10_dmcu_init(struct dmcu *dmcu) + /* Set initialized ramping boundary value */ + REG_WRITE(MASTER_COMM_DATA_REG1, 0xFFFF); + ++ /* Set backlight ramping stepsize */ ++ REG_WRITE(MASTER_COMM_DATA_REG2, abm_gain_stepsize); ++ + /* Set command to initialize microcontroller */ + REG_UPDATE(MASTER_COMM_CMD_REG, MASTER_COMM_CMD_REG_BYTE0, + MCP_INIT_DMCU); +diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h +index 60ce56f60ae3..5bd0df55aa5d 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h ++++ b/drivers/gpu/drm/amd/display/dc/dce/dce_dmcu.h +@@ -263,4 +263,6 @@ struct dmcu *dcn10_dmcu_create( + + void dce_dmcu_destroy(struct dmcu **dmcu); + ++static const uint32_t abm_gain_stepsize = 0x0060; ++ + #endif /* _DCE_ABM_H_ */ +diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +index 7ac50ab1b762..7d7e93c87c28 100644 +--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +@@ -242,6 +242,9 @@ static void build_prescale_params(struct ipp_prescale_params *prescale_params, + prescale_params->mode = IPP_PRESCALE_MODE_FIXED_UNSIGNED; + + switch (plane_state->format) { ++ case SURFACE_PIXEL_FORMAT_GRPH_RGB565: ++ prescale_params->scale = 0x2082; ++ break; + case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888: + case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888: + prescale_params->scale = 0x2020; +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +index 33d311cea28c..5cc5dabf4d65 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +@@ -23,6 +23,7 @@ + * + */ + ++#include + #include "dm_services.h" + #include "core_types.h" + #include "resource.h" +@@ -1119,16 +1120,7 @@ static void dcn10_init_hw(struct dc *dc) + * everything down. + */ + if (dcb->funcs->is_accelerated_mode(dcb) || dc->config.power_down_display_on_boot) { +- for (i = 0; i < dc->res_pool->pipe_count; i++) { +- struct hubp *hubp = dc->res_pool->hubps[i]; +- struct dpp *dpp = dc->res_pool->dpps[i]; +- +- hubp->funcs->hubp_init(hubp); +- dc->res_pool->opps[i]->mpc_tree_params.opp_id = dc->res_pool->opps[i]->inst; +- plane_atomic_power_down(dc, dpp, hubp); +- } +- +- apply_DEGVIDCN10_253_wa(dc); ++ dc->hwss.init_pipes(dc, dc->current_state); + } + + for (i = 0; i < dc->res_pool->audio_count; i++) { +@@ -1297,10 +1289,6 @@ static bool dcn10_set_input_transfer_func(struct pipe_ctx *pipe_ctx, + return result; + } + +- +- +- +- + static bool + dcn10_set_output_transfer_func(struct pipe_ctx *pipe_ctx, + const struct dc_stream_state *stream) +@@ -2415,6 +2403,12 @@ static void dcn10_apply_ctx_for_surface( + if (removed_pipe[i]) + dcn10_disable_plane(dc, &dc->current_state->res_ctx.pipe_ctx[i]); + ++ for (i = 0; i < dc->res_pool->pipe_count; i++) ++ if (removed_pipe[i]) { ++ dc->hwss.optimize_bandwidth(dc, context); ++ break; ++ } ++ + if (dc->hwseq->wa.DEGVIDCN10_254) + hubbub1_wm_change_req_wa(dc->res_pool->hubbub); + } +diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +index 7eccb54c421d..aac52eed6b2a 100644 +--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c ++++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_resource.c +@@ -512,7 +512,7 @@ static const struct resource_caps rv2_res_cap = { + .num_audio = 3, + .num_stream_encoder = 3, + .num_pll = 3, +- .num_ddc = 3, ++ .num_ddc = 4, + }; + #endif + +diff --git a/drivers/gpu/drm/amd/display/dc/inc/core_types.h b/drivers/gpu/drm/amd/display/dc/inc/core_types.h +index 6f5ab05d6467..6f0cc718fbd7 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/core_types.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/core_types.h +@@ -169,7 +169,7 @@ struct resource_pool { + struct clock_source *clock_sources[MAX_CLOCK_SOURCES]; + unsigned int clk_src_count; + +- struct audio *audios[MAX_PIPES]; ++ struct audio *audios[MAX_AUDIOS]; + unsigned int audio_count; + struct audio_support audio_support; + +diff --git a/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h b/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h +index 4c8e2c6fb6db..72266efd826c 100644 +--- a/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h ++++ b/drivers/gpu/drm/amd/display/dc/inc/hw/hw_shared.h +@@ -34,6 +34,7 @@ + * Data types shared between different Virtual HW blocks + ******************************************************************************/ + ++#define MAX_AUDIOS 7 + #define MAX_PIPES 6 + + struct gamma_curve { +diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c +index a1055413bade..31f867bb5afe 100644 +--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c ++++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c +@@ -1564,7 +1564,8 @@ bool mod_color_calculate_regamma_params(struct dc_transfer_func *output_tf, + + output_tf->type = TF_TYPE_DISTRIBUTED_POINTS; + +- if (ramp && (mapUserRamp || ramp->type != GAMMA_RGB_256)) { ++ if (ramp && ramp->type != GAMMA_CS_TFM_1D && ++ (mapUserRamp || ramp->type != GAMMA_RGB_256)) { + rgb_user = kvcalloc(ramp->num_entries + _EXTRA_POINTS, + sizeof(*rgb_user), + GFP_KERNEL); +diff --git a/drivers/gpu/drm/bochs/bochs_drv.c b/drivers/gpu/drm/bochs/bochs_drv.c +index b86cc705138c..d8b945596b09 100644 +--- a/drivers/gpu/drm/bochs/bochs_drv.c ++++ b/drivers/gpu/drm/bochs/bochs_drv.c +@@ -7,6 +7,7 @@ + #include + #include + #include ++#include + + #include "bochs.h" + +@@ -171,6 +172,7 @@ static void bochs_pci_remove(struct pci_dev *pdev) + { + struct drm_device *dev = pci_get_drvdata(pdev); + ++ drm_atomic_helper_shutdown(dev); + drm_dev_unregister(dev); + bochs_unload(dev); + drm_dev_put(dev); +diff --git a/drivers/gpu/drm/bridge/sii902x.c b/drivers/gpu/drm/bridge/sii902x.c +index 1211b5379df1..8e3c5e599eba 100644 +--- a/drivers/gpu/drm/bridge/sii902x.c ++++ b/drivers/gpu/drm/bridge/sii902x.c +@@ -229,10 +229,11 @@ static void sii902x_bridge_mode_set(struct drm_bridge *bridge, + struct regmap *regmap = sii902x->regmap; + u8 buf[HDMI_INFOFRAME_SIZE(AVI)]; + struct hdmi_avi_infoframe frame; ++ u16 pixel_clock_10kHz = adj->clock / 10; + int ret; + +- buf[0] = adj->clock; +- buf[1] = adj->clock >> 8; ++ buf[0] = pixel_clock_10kHz & 0xff; ++ buf[1] = pixel_clock_10kHz >> 8; + buf[2] = adj->vrefresh; + buf[3] = 0x00; + buf[4] = adj->hdisplay; +diff --git a/drivers/gpu/drm/bridge/tc358767.c b/drivers/gpu/drm/bridge/tc358767.c +index 4655bb1eb88f..f59a51e19dab 100644 +--- a/drivers/gpu/drm/bridge/tc358767.c ++++ b/drivers/gpu/drm/bridge/tc358767.c +@@ -1141,6 +1141,13 @@ static int tc_connector_get_modes(struct drm_connector *connector) + struct tc_data *tc = connector_to_tc(connector); + struct edid *edid; + unsigned int count; ++ int ret; ++ ++ ret = tc_get_display_props(tc); ++ if (ret < 0) { ++ dev_err(tc->dev, "failed to read display props: %d\n", ret); ++ return 0; ++ } + + if (tc->panel && tc->panel->funcs && tc->panel->funcs->get_modes) { + count = tc->panel->funcs->get_modes(tc->panel); +diff --git a/drivers/gpu/drm/bridge/ti-tfp410.c b/drivers/gpu/drm/bridge/ti-tfp410.c +index a879aac21246..3a8af9978ebd 100644 +--- a/drivers/gpu/drm/bridge/ti-tfp410.c ++++ b/drivers/gpu/drm/bridge/ti-tfp410.c +@@ -372,7 +372,8 @@ static int tfp410_fini(struct device *dev) + { + struct tfp410 *dvi = dev_get_drvdata(dev); + +- cancel_delayed_work_sync(&dvi->hpd_work); ++ if (dvi->hpd_irq >= 0) ++ cancel_delayed_work_sync(&dvi->hpd_work); + + drm_bridge_remove(&dvi->bridge); + +diff --git a/drivers/gpu/drm/drm_debugfs_crc.c b/drivers/gpu/drm/drm_debugfs_crc.c +index 00e743153e94..fde298d9f510 100644 +--- a/drivers/gpu/drm/drm_debugfs_crc.c ++++ b/drivers/gpu/drm/drm_debugfs_crc.c +@@ -389,12 +389,13 @@ int drm_crtc_add_crc_entry(struct drm_crtc *crtc, bool has_frame, + struct drm_crtc_crc *crc = &crtc->crc; + struct drm_crtc_crc_entry *entry; + int head, tail; ++ unsigned long flags; + +- spin_lock(&crc->lock); ++ spin_lock_irqsave(&crc->lock, flags); + + /* Caller may not have noticed yet that userspace has stopped reading */ + if (!crc->entries) { +- spin_unlock(&crc->lock); ++ spin_unlock_irqrestore(&crc->lock, flags); + return -EINVAL; + } + +@@ -405,7 +406,7 @@ int drm_crtc_add_crc_entry(struct drm_crtc *crtc, bool has_frame, + bool was_overflow = crc->overflow; + + crc->overflow = true; +- spin_unlock(&crc->lock); ++ spin_unlock_irqrestore(&crc->lock, flags); + + if (!was_overflow) + DRM_ERROR("Overflow of CRC buffer, userspace reads too slow.\n"); +@@ -421,7 +422,7 @@ int drm_crtc_add_crc_entry(struct drm_crtc *crtc, bool has_frame, + head = (head + 1) & (DRM_CRC_ENTRIES_NR - 1); + crc->head = head; + +- spin_unlock(&crc->lock); ++ spin_unlock_irqrestore(&crc->lock, flags); + + wake_up_interruptible(&crc->wq); + +diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c +index e804ac5dec02..e9d75549cde8 100644 +--- a/drivers/gpu/drm/drm_edid.c ++++ b/drivers/gpu/drm/drm_edid.c +@@ -1339,6 +1339,7 @@ MODULE_PARM_DESC(edid_fixup, + + static void drm_get_displayid(struct drm_connector *connector, + struct edid *edid); ++static int validate_displayid(u8 *displayid, int length, int idx); + + static int drm_edid_block_checksum(const u8 *raw_edid) + { +@@ -2922,16 +2923,46 @@ static u8 *drm_find_edid_extension(const struct edid *edid, int ext_id) + return edid_ext; + } + +-static u8 *drm_find_cea_extension(const struct edid *edid) +-{ +- return drm_find_edid_extension(edid, CEA_EXT); +-} + + static u8 *drm_find_displayid_extension(const struct edid *edid) + { + return drm_find_edid_extension(edid, DISPLAYID_EXT); + } + ++static u8 *drm_find_cea_extension(const struct edid *edid) ++{ ++ int ret; ++ int idx = 1; ++ int length = EDID_LENGTH; ++ struct displayid_block *block; ++ u8 *cea; ++ u8 *displayid; ++ ++ /* Look for a top level CEA extension block */ ++ cea = drm_find_edid_extension(edid, CEA_EXT); ++ if (cea) ++ return cea; ++ ++ /* CEA blocks can also be found embedded in a DisplayID block */ ++ displayid = drm_find_displayid_extension(edid); ++ if (!displayid) ++ return NULL; ++ ++ ret = validate_displayid(displayid, length, idx); ++ if (ret) ++ return NULL; ++ ++ idx += sizeof(struct displayid_hdr); ++ for_each_displayid_db(displayid, block, idx, length) { ++ if (block->tag == DATA_BLOCK_CTA) { ++ cea = (u8 *)block; ++ break; ++ } ++ } ++ ++ return cea; ++} ++ + /* + * Calculate the alternate clock for the CEA mode + * (60Hz vs. 59.94Hz etc.) +@@ -3655,13 +3686,38 @@ cea_revision(const u8 *cea) + static int + cea_db_offsets(const u8 *cea, int *start, int *end) + { +- /* Data block offset in CEA extension block */ +- *start = 4; +- *end = cea[2]; +- if (*end == 0) +- *end = 127; +- if (*end < 4 || *end > 127) +- return -ERANGE; ++ /* DisplayID CTA extension blocks and top-level CEA EDID ++ * block header definitions differ in the following bytes: ++ * 1) Byte 2 of the header specifies length differently, ++ * 2) Byte 3 is only present in the CEA top level block. ++ * ++ * The different definitions for byte 2 follow. ++ * ++ * DisplayID CTA extension block defines byte 2 as: ++ * Number of payload bytes ++ * ++ * CEA EDID block defines byte 2 as: ++ * Byte number (decimal) within this block where the 18-byte ++ * DTDs begin. If no non-DTD data is present in this extension ++ * block, the value should be set to 04h (the byte after next). ++ * If set to 00h, there are no DTDs present in this block and ++ * no non-DTD data. ++ */ ++ if (cea[0] == DATA_BLOCK_CTA) { ++ *start = 3; ++ *end = *start + cea[2]; ++ } else if (cea[0] == CEA_EXT) { ++ /* Data block offset in CEA extension block */ ++ *start = 4; ++ *end = cea[2]; ++ if (*end == 0) ++ *end = 127; ++ if (*end < 4 || *end > 127) ++ return -ERANGE; ++ } else { ++ return -ENOTSUPP; ++ } ++ + return 0; + } + +@@ -5279,6 +5335,9 @@ static int drm_parse_display_id(struct drm_connector *connector, + case DATA_BLOCK_TYPE_1_DETAILED_TIMING: + /* handled in mode gathering code. */ + break; ++ case DATA_BLOCK_CTA: ++ /* handled in the cea parser code. */ ++ break; + default: + DRM_DEBUG_KMS("found DisplayID tag 0x%x, unhandled\n", block->tag); + break; +diff --git a/drivers/gpu/drm/drm_edid_load.c b/drivers/gpu/drm/drm_edid_load.c +index 1e5593575d23..6192b7b20d84 100644 +--- a/drivers/gpu/drm/drm_edid_load.c ++++ b/drivers/gpu/drm/drm_edid_load.c +@@ -278,6 +278,8 @@ struct edid *drm_load_edid_firmware(struct drm_connector *connector) + * the last one found one as a fallback. + */ + fwstr = kstrdup(edid_firmware, GFP_KERNEL); ++ if (!fwstr) ++ return ERR_PTR(-ENOMEM); + edidstr = fwstr; + + while ((edidname = strsep(&edidstr, ","))) { +diff --git a/drivers/gpu/drm/drm_framebuffer.c b/drivers/gpu/drm/drm_framebuffer.c +index d8d75e25f6fb..45f6f11a88a7 100644 +--- a/drivers/gpu/drm/drm_framebuffer.c ++++ b/drivers/gpu/drm/drm_framebuffer.c +@@ -830,7 +830,7 @@ static int atomic_remove_fb(struct drm_framebuffer *fb) + struct drm_device *dev = fb->dev; + struct drm_atomic_state *state; + struct drm_plane *plane; +- struct drm_connector *conn; ++ struct drm_connector *conn __maybe_unused; + struct drm_connector_state *conn_state; + int i, ret; + unsigned plane_mask; +diff --git a/drivers/gpu/drm/i915/gvt/kvmgt.c b/drivers/gpu/drm/i915/gvt/kvmgt.c +index a68addf95c23..4a7cf8646b0d 100644 +--- a/drivers/gpu/drm/i915/gvt/kvmgt.c ++++ b/drivers/gpu/drm/i915/gvt/kvmgt.c +@@ -1904,6 +1904,18 @@ static int kvmgt_dma_map_guest_page(unsigned long handle, unsigned long gfn, + + entry = __gvt_cache_find_gfn(info->vgpu, gfn); + if (!entry) { ++ ret = gvt_dma_map_page(vgpu, gfn, dma_addr, size); ++ if (ret) ++ goto err_unlock; ++ ++ ret = __gvt_cache_add(info->vgpu, gfn, *dma_addr, size); ++ if (ret) ++ goto err_unmap; ++ } else if (entry->size != size) { ++ /* the same gfn with different size: unmap and re-map */ ++ gvt_dma_unmap_page(vgpu, gfn, entry->dma_addr, entry->size); ++ __gvt_cache_remove_entry(vgpu, entry); ++ + ret = gvt_dma_map_page(vgpu, gfn, dma_addr, size); + if (ret) + goto err_unlock; +diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c +index dc4ce694c06a..235aedc62b4c 100644 +--- a/drivers/gpu/drm/i915/i915_perf.c ++++ b/drivers/gpu/drm/i915/i915_perf.c +@@ -3457,9 +3457,13 @@ void i915_perf_init(struct drm_i915_private *dev_priv) + dev_priv->perf.oa.ops.enable_metric_set = gen8_enable_metric_set; + dev_priv->perf.oa.ops.disable_metric_set = gen10_disable_metric_set; + +- dev_priv->perf.oa.ctx_oactxctrl_offset = 0x128; +- dev_priv->perf.oa.ctx_flexeu0_offset = 0x3de; +- ++ if (IS_GEN(dev_priv, 10)) { ++ dev_priv->perf.oa.ctx_oactxctrl_offset = 0x128; ++ dev_priv->perf.oa.ctx_flexeu0_offset = 0x3de; ++ } else { ++ dev_priv->perf.oa.ctx_oactxctrl_offset = 0x124; ++ dev_priv->perf.oa.ctx_flexeu0_offset = 0x78e; ++ } + dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<16); + } + } +diff --git a/drivers/gpu/drm/i915/i915_request.c b/drivers/gpu/drm/i915/i915_request.c +index c88e538b2ef4..81b48e273cbd 100644 +--- a/drivers/gpu/drm/i915/i915_request.c ++++ b/drivers/gpu/drm/i915/i915_request.c +@@ -443,7 +443,7 @@ void __i915_request_submit(struct i915_request *request) + */ + if (request->sched.semaphores && + i915_sw_fence_signaled(&request->semaphore)) +- request->hw_context->saturated |= request->sched.semaphores; ++ engine->saturated |= request->sched.semaphores; + + /* We may be recursing from the signal callback of another i915 fence */ + spin_lock_nested(&request->lock, SINGLE_DEPTH_NESTING); +@@ -829,7 +829,7 @@ already_busywaiting(struct i915_request *rq) + * + * See the are-we-too-late? check in __i915_request_submit(). + */ +- return rq->sched.semaphores | rq->hw_context->saturated; ++ return rq->sched.semaphores | rq->engine->saturated; + } + + static int +diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c +index 1dc8d03ff127..ee6fa75d65a2 100644 +--- a/drivers/gpu/drm/i915/intel_bios.c ++++ b/drivers/gpu/drm/i915/intel_bios.c +@@ -762,7 +762,7 @@ parse_psr(struct drm_i915_private *dev_priv, const struct bdb_header *bdb) + } + + if (bdb->version >= 226) { +- u32 wakeup_time = psr_table->psr2_tp2_tp3_wakeup_time; ++ u32 wakeup_time = psr->psr2_tp2_tp3_wakeup_time; + + wakeup_time = (wakeup_time >> (2 * panel_type)) & 0x3; + switch (wakeup_time) { +diff --git a/drivers/gpu/drm/i915/intel_context.c b/drivers/gpu/drm/i915/intel_context.c +index 924cc556223a..8931e0fee873 100644 +--- a/drivers/gpu/drm/i915/intel_context.c ++++ b/drivers/gpu/drm/i915/intel_context.c +@@ -230,7 +230,6 @@ intel_context_init(struct intel_context *ce, + ce->gem_context = ctx; + ce->engine = engine; + ce->ops = engine->cops; +- ce->saturated = 0; + + INIT_LIST_HEAD(&ce->signal_link); + INIT_LIST_HEAD(&ce->signals); +diff --git a/drivers/gpu/drm/i915/intel_context_types.h b/drivers/gpu/drm/i915/intel_context_types.h +index 339c7437fe82..fd47b9d49e09 100644 +--- a/drivers/gpu/drm/i915/intel_context_types.h ++++ b/drivers/gpu/drm/i915/intel_context_types.h +@@ -59,8 +59,6 @@ struct intel_context { + atomic_t pin_count; + struct mutex pin_mutex; /* guards pinning and associated on-gpuing */ + +- intel_engine_mask_t saturated; /* submitting semaphores too late? */ +- + /** + * active_tracker: Active tracker for the external rq activity + * on this intel_context object. +diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c +index eea9bec04f1b..9d4f12e982c3 100644 +--- a/drivers/gpu/drm/i915/intel_engine_cs.c ++++ b/drivers/gpu/drm/i915/intel_engine_cs.c +@@ -1200,6 +1200,7 @@ void intel_engines_park(struct drm_i915_private *i915) + + i915_gem_batch_pool_fini(&engine->batch_pool); + engine->execlists.no_priolist = false; ++ engine->saturated = 0; + } + + i915->gt.active_engines = 0; +diff --git a/drivers/gpu/drm/i915/intel_engine_types.h b/drivers/gpu/drm/i915/intel_engine_types.h +index 1f970c76b6a6..4270ddb45f41 100644 +--- a/drivers/gpu/drm/i915/intel_engine_types.h ++++ b/drivers/gpu/drm/i915/intel_engine_types.h +@@ -285,6 +285,8 @@ struct intel_engine_cs { + struct intel_context *kernel_context; /* pinned */ + struct intel_context *preempt_context; /* pinned; optional */ + ++ intel_engine_mask_t saturated; /* submitting semaphores too late? */ ++ + struct drm_i915_gem_object *default_state; + void *pinned_default_state; + +diff --git a/drivers/gpu/drm/i915/intel_vbt_defs.h b/drivers/gpu/drm/i915/intel_vbt_defs.h +index fdbbb9a53804..796c070bbe6f 100644 +--- a/drivers/gpu/drm/i915/intel_vbt_defs.h ++++ b/drivers/gpu/drm/i915/intel_vbt_defs.h +@@ -772,13 +772,13 @@ struct psr_table { + /* TP wake up time in multiple of 100 */ + u16 tp1_wakeup_time; + u16 tp2_tp3_wakeup_time; +- +- /* PSR2 TP2/TP3 wakeup time for 16 panels */ +- u32 psr2_tp2_tp3_wakeup_time; + } __packed; + + struct bdb_psr { + struct psr_table psr_table[16]; ++ ++ /* PSR2 TP2/TP3 wakeup time for 16 panels */ ++ u32 psr2_tp2_tp3_wakeup_time; + } __packed; + + /* +diff --git a/drivers/gpu/drm/i915/vlv_dsi_pll.c b/drivers/gpu/drm/i915/vlv_dsi_pll.c +index 5e7b1fb2db5d..8ea1c927dbad 100644 +--- a/drivers/gpu/drm/i915/vlv_dsi_pll.c ++++ b/drivers/gpu/drm/i915/vlv_dsi_pll.c +@@ -394,8 +394,8 @@ static void glk_dsi_program_esc_clock(struct drm_device *dev, + else + txesc2_div = 10; + +- I915_WRITE(MIPIO_TXESC_CLK_DIV1, txesc1_div & GLK_TX_ESC_CLK_DIV1_MASK); +- I915_WRITE(MIPIO_TXESC_CLK_DIV2, txesc2_div & GLK_TX_ESC_CLK_DIV2_MASK); ++ I915_WRITE(MIPIO_TXESC_CLK_DIV1, (1 << (txesc1_div - 1)) & GLK_TX_ESC_CLK_DIV1_MASK); ++ I915_WRITE(MIPIO_TXESC_CLK_DIV2, (1 << (txesc2_div - 1)) & GLK_TX_ESC_CLK_DIV2_MASK); + } + + /* Program BXT Mipi clocks and dividers */ +diff --git a/drivers/gpu/drm/lima/lima_pp.c b/drivers/gpu/drm/lima/lima_pp.c +index d29721e177bf..8fef224b93c8 100644 +--- a/drivers/gpu/drm/lima/lima_pp.c ++++ b/drivers/gpu/drm/lima/lima_pp.c +@@ -64,7 +64,13 @@ static irqreturn_t lima_pp_bcast_irq_handler(int irq, void *data) + struct lima_ip *pp_bcast = data; + struct lima_device *dev = pp_bcast->dev; + struct lima_sched_pipe *pipe = dev->pipe + lima_pipe_pp; +- struct drm_lima_m450_pp_frame *frame = pipe->current_task->frame; ++ struct drm_lima_m450_pp_frame *frame; ++ ++ /* for shared irq case */ ++ if (!pipe->current_task) ++ return IRQ_NONE; ++ ++ frame = pipe->current_task->frame; + + for (i = 0; i < frame->num_pp; i++) { + struct lima_ip *ip = pipe->processor[i]; +diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +index 38e2cfa9cec7..6910d0468e3c 100644 +--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c ++++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +@@ -74,7 +74,7 @@ bool a6xx_gmu_sptprac_is_on(struct a6xx_gmu *gmu) + u32 val; + + /* This can be called from gpu state code so make sure GMU is valid */ +- if (IS_ERR_OR_NULL(gmu->mmio)) ++ if (!gmu->initialized) + return false; + + val = gmu_read(gmu, REG_A6XX_GMU_SPTPRAC_PWR_CLK_STATUS); +@@ -90,7 +90,7 @@ bool a6xx_gmu_gx_is_on(struct a6xx_gmu *gmu) + u32 val; + + /* This can be called from gpu state code so make sure GMU is valid */ +- if (IS_ERR_OR_NULL(gmu->mmio)) ++ if (!gmu->initialized) + return false; + + val = gmu_read(gmu, REG_A6XX_GMU_SPTPRAC_PWR_CLK_STATUS); +@@ -504,8 +504,10 @@ static void a6xx_gmu_rpmh_init(struct a6xx_gmu *gmu) + wmb(); + + err: +- devm_iounmap(gmu->dev, pdcptr); +- devm_iounmap(gmu->dev, seqptr); ++ if (!IS_ERR_OR_NULL(pdcptr)) ++ devm_iounmap(gmu->dev, pdcptr); ++ if (!IS_ERR_OR_NULL(seqptr)) ++ devm_iounmap(gmu->dev, seqptr); + } + + /* +@@ -695,7 +697,7 @@ int a6xx_gmu_resume(struct a6xx_gpu *a6xx_gpu) + struct a6xx_gmu *gmu = &a6xx_gpu->gmu; + int status, ret; + +- if (WARN(!gmu->mmio, "The GMU is not set up yet\n")) ++ if (WARN(!gmu->initialized, "The GMU is not set up yet\n")) + return 0; + + gmu->hung = false; +@@ -765,7 +767,7 @@ bool a6xx_gmu_isidle(struct a6xx_gmu *gmu) + { + u32 reg; + +- if (!gmu->mmio) ++ if (!gmu->initialized) + return true; + + reg = gmu_read(gmu, REG_A6XX_GPU_GMU_AO_GPU_CX_BUSY_STATUS); +@@ -1227,7 +1229,7 @@ void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu) + { + struct a6xx_gmu *gmu = &a6xx_gpu->gmu; + +- if (IS_ERR_OR_NULL(gmu->mmio)) ++ if (!gmu->initialized) + return; + + a6xx_gmu_stop(a6xx_gpu); +@@ -1245,6 +1247,8 @@ void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu) + iommu_detach_device(gmu->domain, gmu->dev); + + iommu_domain_free(gmu->domain); ++ ++ gmu->initialized = false; + } + + int a6xx_gmu_probe(struct a6xx_gpu *a6xx_gpu, struct device_node *node) +@@ -1309,6 +1313,8 @@ int a6xx_gmu_probe(struct a6xx_gpu *a6xx_gpu, struct device_node *node) + /* Set up the HFI queues */ + a6xx_hfi_init(gmu); + ++ gmu->initialized = true; ++ + return 0; + err: + a6xx_gmu_memory_free(gmu, gmu->hfi); +diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h +index bedd8e6a63aa..39a26dd63674 100644 +--- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h ++++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h +@@ -75,6 +75,7 @@ struct a6xx_gmu { + + struct a6xx_hfi_queue queues[2]; + ++ bool initialized; + bool hung; + }; + +diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c +index a9c0ac937b00..9acbbc0f3232 100644 +--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c ++++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c +@@ -56,7 +56,6 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname, + return ret; + + mem_phys = r.start; +- mem_size = resource_size(&r); + + /* Request the MDT file for the firmware */ + fw = adreno_request_fw(to_adreno_gpu(gpu), fwname); +@@ -72,6 +71,13 @@ static int zap_shader_load_mdt(struct msm_gpu *gpu, const char *fwname, + goto out; + } + ++ if (mem_size > resource_size(&r)) { ++ DRM_DEV_ERROR(dev, ++ "memory region is too small to load the MDT\n"); ++ ret = -E2BIG; ++ goto out; ++ } ++ + /* Allocate memory for the firmware image */ + mem_region = memremap(mem_phys, mem_size, MEMREMAP_WC); + if (!mem_region) { +diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +index 0ea150196659..c62f7abcf509 100644 +--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c ++++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +@@ -2226,8 +2226,6 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc, + if (ret) + goto fail; + +- spin_lock_init(&dpu_enc->enc_spinlock); +- + atomic_set(&dpu_enc->frame_done_timeout_ms, 0); + timer_setup(&dpu_enc->frame_done_timer, + dpu_encoder_frame_done_timeout, 0); +@@ -2281,6 +2279,7 @@ struct drm_encoder *dpu_encoder_init(struct drm_device *dev, + + drm_encoder_helper_add(&dpu_enc->base, &dpu_encoder_helper_funcs); + ++ spin_lock_init(&dpu_enc->enc_spinlock); + dpu_enc->enabled = false; + + return &dpu_enc->base; +diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c +index f38d7367bd3b..4a0fe8a25ad7 100644 +--- a/drivers/gpu/drm/msm/msm_drv.c ++++ b/drivers/gpu/drm/msm/msm_drv.c +@@ -1306,16 +1306,24 @@ static int msm_pdev_probe(struct platform_device *pdev) + + ret = add_gpu_components(&pdev->dev, &match); + if (ret) +- return ret; ++ goto fail; + + /* on all devices that I am aware of, iommu's which can map + * any address the cpu can see are used: + */ + ret = dma_set_mask_and_coherent(&pdev->dev, ~0); + if (ret) +- return ret; ++ goto fail; ++ ++ ret = component_master_add_with_match(&pdev->dev, &msm_drm_ops, match); ++ if (ret) ++ goto fail; + +- return component_master_add_with_match(&pdev->dev, &msm_drm_ops, match); ++ return 0; ++ ++fail: ++ of_platform_depopulate(&pdev->dev); ++ return ret; + } + + static int msm_pdev_remove(struct platform_device *pdev) +diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c +index 4b1650f51955..847b7866137d 100644 +--- a/drivers/gpu/drm/nouveau/dispnv50/disp.c ++++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c +@@ -775,7 +775,7 @@ nv50_msto_atomic_check(struct drm_encoder *encoder, + drm_dp_calc_pbn_mode(crtc_state->adjusted_mode.clock, + connector->display_info.bpc * 3); + +- if (drm_atomic_crtc_needs_modeset(crtc_state)) { ++ if (crtc_state->mode_changed) { + slots = drm_dp_atomic_find_vcpi_slots(state, &mstm->mgr, + mstc->port, + asyh->dp.pbn); +diff --git a/drivers/gpu/drm/nouveau/nouveau_connector.c b/drivers/gpu/drm/nouveau/nouveau_connector.c +index 4116ee62adaf..f69ff22beee0 100644 +--- a/drivers/gpu/drm/nouveau/nouveau_connector.c ++++ b/drivers/gpu/drm/nouveau/nouveau_connector.c +@@ -252,7 +252,7 @@ nouveau_conn_reset(struct drm_connector *connector) + return; + + if (connector->state) +- __drm_atomic_helper_connector_destroy_state(connector->state); ++ nouveau_conn_atomic_destroy_state(connector, connector->state); + __drm_atomic_helper_connector_reset(connector, &asyc->state); + asyc->dither.mode = DITHERING_MODE_AUTO; + asyc->dither.depth = DITHERING_DEPTH_AUTO; +diff --git a/drivers/gpu/drm/nouveau/nouveau_dmem.c b/drivers/gpu/drm/nouveau/nouveau_dmem.c +index 40c47d6a7d78..745e197a4775 100644 +--- a/drivers/gpu/drm/nouveau/nouveau_dmem.c ++++ b/drivers/gpu/drm/nouveau/nouveau_dmem.c +@@ -385,9 +385,10 @@ nouveau_dmem_pages_alloc(struct nouveau_drm *drm, + ret = nouveau_dmem_chunk_alloc(drm); + if (ret) { + if (c) +- break; ++ return 0; + return ret; + } ++ mutex_lock(&drm->dmem->mutex); + continue; + } + +diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c +index ecacb22834d7..719345074711 100644 +--- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c ++++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c +@@ -184,6 +184,25 @@ nvkm_i2c_fini(struct nvkm_subdev *subdev, bool suspend) + return 0; + } + ++static int ++nvkm_i2c_preinit(struct nvkm_subdev *subdev) ++{ ++ struct nvkm_i2c *i2c = nvkm_i2c(subdev); ++ struct nvkm_i2c_bus *bus; ++ struct nvkm_i2c_pad *pad; ++ ++ /* ++ * We init our i2c busses as early as possible, since they may be ++ * needed by the vbios init scripts on some cards ++ */ ++ list_for_each_entry(pad, &i2c->pad, head) ++ nvkm_i2c_pad_init(pad); ++ list_for_each_entry(bus, &i2c->bus, head) ++ nvkm_i2c_bus_init(bus); ++ ++ return 0; ++} ++ + static int + nvkm_i2c_init(struct nvkm_subdev *subdev) + { +@@ -238,6 +257,7 @@ nvkm_i2c_dtor(struct nvkm_subdev *subdev) + static const struct nvkm_subdev_func + nvkm_i2c = { + .dtor = nvkm_i2c_dtor, ++ .preinit = nvkm_i2c_preinit, + .init = nvkm_i2c_init, + .fini = nvkm_i2c_fini, + .intr = nvkm_i2c_intr, +diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c +index 8712af79a49c..4c43dd282acc 100644 +--- a/drivers/gpu/drm/omapdrm/omap_crtc.c ++++ b/drivers/gpu/drm/omapdrm/omap_crtc.c +@@ -384,10 +384,20 @@ static enum drm_mode_status omap_crtc_mode_valid(struct drm_crtc *crtc, + int r; + + drm_display_mode_to_videomode(mode, &vm); +- r = priv->dispc_ops->mgr_check_timings(priv->dispc, omap_crtc->channel, +- &vm); +- if (r) +- return r; ++ ++ /* ++ * DSI might not call this, since the supplied mode is not a ++ * valid DISPC mode. DSI will calculate and configure the ++ * proper DISPC mode later. ++ */ ++ if (omap_crtc->pipe->output->next == NULL || ++ omap_crtc->pipe->output->next->type != OMAP_DISPLAY_TYPE_DSI) { ++ r = priv->dispc_ops->mgr_check_timings(priv->dispc, ++ omap_crtc->channel, ++ &vm); ++ if (r) ++ return r; ++ } + + /* Check for bandwidth limit */ + if (priv->max_bandwidth) { +diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c +index 569be4efd8d1..397a3086eac8 100644 +--- a/drivers/gpu/drm/panel/panel-simple.c ++++ b/drivers/gpu/drm/panel/panel-simple.c +@@ -446,6 +446,32 @@ static const struct panel_desc ampire_am800480r3tmqwa1h = { + .bus_format = MEDIA_BUS_FMT_RGB666_1X18, + }; + ++static const struct display_timing santek_st0700i5y_rbslw_f_timing = { ++ .pixelclock = { 26400000, 33300000, 46800000 }, ++ .hactive = { 800, 800, 800 }, ++ .hfront_porch = { 16, 210, 354 }, ++ .hback_porch = { 45, 36, 6 }, ++ .hsync_len = { 1, 10, 40 }, ++ .vactive = { 480, 480, 480 }, ++ .vfront_porch = { 7, 22, 147 }, ++ .vback_porch = { 22, 13, 3 }, ++ .vsync_len = { 1, 10, 20 }, ++ .flags = DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW | ++ DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_POSEDGE ++}; ++ ++static const struct panel_desc armadeus_st0700_adapt = { ++ .timings = &santek_st0700i5y_rbslw_f_timing, ++ .num_timings = 1, ++ .bpc = 6, ++ .size = { ++ .width = 154, ++ .height = 86, ++ }, ++ .bus_format = MEDIA_BUS_FMT_RGB666_1X18, ++ .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_POSEDGE, ++}; ++ + static const struct drm_display_mode auo_b101aw03_mode = { + .clock = 51450, + .hdisplay = 1024, +@@ -2570,6 +2596,9 @@ static const struct of_device_id platform_of_match[] = { + }, { + .compatible = "arm,rtsm-display", + .data = &arm_rtsm, ++ }, { ++ .compatible = "armadeus,st0700-adapt", ++ .data = &armadeus_st0700_adapt, + }, { + .compatible = "auo,b101aw03", + .data = &auo_b101aw03, +@@ -3098,7 +3127,14 @@ static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi) + dsi->format = desc->format; + dsi->lanes = desc->lanes; + +- return mipi_dsi_attach(dsi); ++ err = mipi_dsi_attach(dsi); ++ if (err) { ++ struct panel_simple *panel = dev_get_drvdata(&dsi->dev); ++ ++ drm_panel_remove(&panel->base); ++ } ++ ++ return err; + } + + static int panel_simple_dsi_remove(struct mipi_dsi_device *dsi) +diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +index 12ed5265a90b..09046135e720 100644 +--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c ++++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +@@ -1011,7 +1011,8 @@ static bool vop_crtc_mode_fixup(struct drm_crtc *crtc, + struct vop *vop = to_vop(crtc); + + adjusted_mode->clock = +- clk_round_rate(vop->dclk, mode->clock * 1000) / 1000; ++ DIV_ROUND_UP(clk_round_rate(vop->dclk, mode->clock * 1000), ++ 1000); + + return true; + } +diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h +index b69ae10ca238..d724fb3de44e 100644 +--- a/drivers/gpu/drm/virtio/virtgpu_drv.h ++++ b/drivers/gpu/drm/virtio/virtgpu_drv.h +@@ -102,7 +102,6 @@ struct virtio_gpu_fence { + struct dma_fence f; + struct virtio_gpu_fence_driver *drv; + struct list_head node; +- uint64_t seq; + }; + #define to_virtio_fence(x) \ + container_of(x, struct virtio_gpu_fence, f) +diff --git a/drivers/gpu/drm/virtio/virtgpu_fence.c b/drivers/gpu/drm/virtio/virtgpu_fence.c +index 87d1966192f4..72b4f7561432 100644 +--- a/drivers/gpu/drm/virtio/virtgpu_fence.c ++++ b/drivers/gpu/drm/virtio/virtgpu_fence.c +@@ -40,16 +40,14 @@ bool virtio_fence_signaled(struct dma_fence *f) + { + struct virtio_gpu_fence *fence = to_virtio_fence(f); + +- if (atomic64_read(&fence->drv->last_seq) >= fence->seq) ++ if (atomic64_read(&fence->drv->last_seq) >= fence->f.seqno) + return true; + return false; + } + + static void virtio_fence_value_str(struct dma_fence *f, char *str, int size) + { +- struct virtio_gpu_fence *fence = to_virtio_fence(f); +- +- snprintf(str, size, "%llu", fence->seq); ++ snprintf(str, size, "%llu", f->seqno); + } + + static void virtio_timeline_value_str(struct dma_fence *f, char *str, int size) +@@ -76,6 +74,11 @@ struct virtio_gpu_fence *virtio_gpu_fence_alloc(struct virtio_gpu_device *vgdev) + return fence; + + fence->drv = drv; ++ ++ /* This only partially initializes the fence because the seqno is ++ * unknown yet. The fence must not be used outside of the driver ++ * until virtio_gpu_fence_emit is called. ++ */ + dma_fence_init(&fence->f, &virtio_fence_ops, &drv->lock, drv->context, 0); + + return fence; +@@ -89,13 +92,13 @@ int virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev, + unsigned long irq_flags; + + spin_lock_irqsave(&drv->lock, irq_flags); +- fence->seq = ++drv->sync_seq; ++ fence->f.seqno = ++drv->sync_seq; + dma_fence_get(&fence->f); + list_add_tail(&fence->node, &drv->fences); + spin_unlock_irqrestore(&drv->lock, irq_flags); + + cmd_hdr->flags |= cpu_to_le32(VIRTIO_GPU_FLAG_FENCE); +- cmd_hdr->fence_id = cpu_to_le64(fence->seq); ++ cmd_hdr->fence_id = cpu_to_le64(fence->f.seqno); + return 0; + } + +@@ -109,7 +112,7 @@ void virtio_gpu_fence_event_process(struct virtio_gpu_device *vgdev, + spin_lock_irqsave(&drv->lock, irq_flags); + atomic64_set(&vgdev->fence_drv.last_seq, last_seq); + list_for_each_entry_safe(fence, tmp, &drv->fences, node) { +- if (last_seq < fence->seq) ++ if (last_seq < fence->f.seqno) + continue; + dma_fence_signal_locked(&fence->f); + list_del(&fence->node); +diff --git a/drivers/gpu/drm/virtio/virtgpu_ioctl.c b/drivers/gpu/drm/virtio/virtgpu_ioctl.c +index 949a264985fc..19fbffd0f7a3 100644 +--- a/drivers/gpu/drm/virtio/virtgpu_ioctl.c ++++ b/drivers/gpu/drm/virtio/virtgpu_ioctl.c +@@ -542,6 +542,9 @@ static int virtio_gpu_get_caps_ioctl(struct drm_device *dev, + if (!ret) + return -EBUSY; + ++ /* is_valid check must proceed before copy of the cache entry. */ ++ smp_rmb(); ++ + ptr = cache_ent->caps_cache; + + copy_exit: +diff --git a/drivers/gpu/drm/virtio/virtgpu_vq.c b/drivers/gpu/drm/virtio/virtgpu_vq.c +index 5bb0f0a084e9..a7684f9c80db 100644 +--- a/drivers/gpu/drm/virtio/virtgpu_vq.c ++++ b/drivers/gpu/drm/virtio/virtgpu_vq.c +@@ -583,6 +583,8 @@ static void virtio_gpu_cmd_capset_cb(struct virtio_gpu_device *vgdev, + cache_ent->id == le32_to_cpu(cmd->capset_id)) { + memcpy(cache_ent->caps_cache, resp->capset_data, + cache_ent->size); ++ /* Copy must occur before is_valid is signalled. */ ++ smp_wmb(); + atomic_set(&cache_ent->is_valid, 1); + break; + } +diff --git a/drivers/gpu/drm/vkms/vkms_crtc.c b/drivers/gpu/drm/vkms/vkms_crtc.c +index bb66dbcd5e3f..e447b7588d06 100644 +--- a/drivers/gpu/drm/vkms/vkms_crtc.c ++++ b/drivers/gpu/drm/vkms/vkms_crtc.c +@@ -15,6 +15,10 @@ static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) + + spin_lock(&output->lock); + ++ ret_overrun = hrtimer_forward_now(&output->vblank_hrtimer, ++ output->period_ns); ++ WARN_ON(ret_overrun != 1); ++ + ret = drm_crtc_handle_vblank(crtc); + if (!ret) + DRM_ERROR("vkms failure on handling vblank"); +@@ -35,10 +39,6 @@ static enum hrtimer_restart vkms_vblank_simulate(struct hrtimer *timer) + DRM_WARN("failed to queue vkms_crc_work_handle"); + } + +- ret_overrun = hrtimer_forward_now(&output->vblank_hrtimer, +- output->period_ns); +- WARN_ON(ret_overrun != 1); +- + spin_unlock(&output->lock); + + return HRTIMER_RESTART; +@@ -74,11 +74,21 @@ bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe, + { + struct vkms_device *vkmsdev = drm_device_to_vkms_device(dev); + struct vkms_output *output = &vkmsdev->output; ++ struct drm_vblank_crtc *vblank = &dev->vblank[pipe]; + + *vblank_time = output->vblank_hrtimer.node.expires; + +- if (!in_vblank_irq) +- *vblank_time -= output->period_ns; ++ if (WARN_ON(*vblank_time == vblank->time)) ++ return true; ++ ++ /* ++ * To prevent races we roll the hrtimer forward before we do any ++ * interrupt processing - this is how real hw works (the interrupt is ++ * only generated after all the vblank registers are updated) and what ++ * the vblank core expects. Therefore we need to always correct the ++ * timestampe by one frame. ++ */ ++ *vblank_time -= output->period_ns; + + return true; + } +diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c +index ff3586cb6851..e1539c9294a4 100644 +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fifo.c +@@ -235,7 +235,7 @@ static int vmw_fifo_wait_noirq(struct vmw_private *dev_priv, + DRM_ERROR("SVGA device lockup.\n"); + break; + } +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + if (interruptible && signal_pending(current)) { + ret = -ERESTARTSYS; + break; +diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c +index c3ad4478266b..7e2a29d56459 100644 +--- a/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c ++++ b/drivers/gpu/drm/vmwgfx/vmwgfx_irq.c +@@ -202,7 +202,7 @@ int vmw_fallback_wait(struct vmw_private *dev_priv, + break; + } + if (lazy) +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + else if ((++count & 0x0F) == 0) { + /** + * FIXME: Use schedule_hr_timeout here for +diff --git a/drivers/gpu/host1x/bus.c b/drivers/gpu/host1x/bus.c +index 9797ccb0a073..6387302c1245 100644 +--- a/drivers/gpu/host1x/bus.c ++++ b/drivers/gpu/host1x/bus.c +@@ -414,6 +414,9 @@ static int host1x_device_add(struct host1x *host1x, + + of_dma_configure(&device->dev, host1x->dev->of_node, true); + ++ device->dev.dma_parms = &device->dma_parms; ++ dma_set_max_seg_size(&device->dev, SZ_4M); ++ + err = host1x_device_parse_dt(device, driver); + if (err < 0) { + kfree(device); +diff --git a/drivers/gpu/ipu-v3/ipu-ic.c b/drivers/gpu/ipu-v3/ipu-ic.c +index 89c3961f0fce..3428b0e72bc5 100644 +--- a/drivers/gpu/ipu-v3/ipu-ic.c ++++ b/drivers/gpu/ipu-v3/ipu-ic.c +@@ -251,7 +251,7 @@ static int init_csc(struct ipu_ic *ic, + writel(param, base++); + + param = ((a[0] & 0x1fe0) >> 5) | (params->scale << 8) | +- (params->sat << 9); ++ (params->sat << 10); + writel(param, base++); + + param = ((a[1] & 0x1f) << 27) | ((c[0][1] & 0x1ff) << 18) | +diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +index b032d3899fa3..34a812025b94 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -568,6 +568,7 @@ + #define USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A 0x0b4a + #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE 0x134a + #define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_094A 0x094a ++#define USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0641 0x0641 + + #define USB_VENDOR_ID_HUION 0x256c + #define USB_DEVICE_ID_HUION_TABLET 0x006e +@@ -1241,6 +1242,7 @@ + #define USB_DEVICE_ID_PRIMAX_KEYBOARD 0x4e05 + #define USB_DEVICE_ID_PRIMAX_REZEL 0x4e72 + #define USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4D0F 0x4d0f ++#define USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4D65 0x4d65 + #define USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4E22 0x4e22 + + +diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c +index 671a285724f9..5b669f7d653f 100644 +--- a/drivers/hid/hid-quirks.c ++++ b/drivers/hid/hid-quirks.c +@@ -91,6 +91,7 @@ static const struct hid_device_id hid_quirks[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_LOGITECH_OEM_USB_OPTICAL_MOUSE_0B4A), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_094A), HID_QUIRK_ALWAYS_POLL }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_HP, USB_PRODUCT_ID_HP_PIXART_OEM_USB_OPTICAL_MOUSE_0641), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_IDEACOM, USB_DEVICE_ID_IDEACOM_IDC6680), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_INNOMEDIA, USB_DEVICE_ID_INNEX_GENESIS_ATARI), HID_QUIRK_MULTI_INPUT }, + { HID_USB_DEVICE(USB_VENDOR_ID_KYE, USB_DEVICE_ID_KYE_EASYPEN_M610X), HID_QUIRK_MULTI_INPUT }, +@@ -130,6 +131,7 @@ static const struct hid_device_id hid_quirks[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_PIXART, USB_DEVICE_ID_PIXART_USB_OPTICAL_MOUSE), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_MOUSE_4D22), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4D0F), HID_QUIRK_ALWAYS_POLL }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4D65), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_PRIMAX, USB_DEVICE_ID_PRIMAX_PIXART_MOUSE_4E22), HID_QUIRK_ALWAYS_POLL }, + { HID_USB_DEVICE(USB_VENDOR_ID_PRODIGE, USB_DEVICE_ID_PRODIGE_CORDLESS), HID_QUIRK_NOGET }, + { HID_USB_DEVICE(USB_VENDOR_ID_QUANTA, USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH_3001), HID_QUIRK_NOGET }, +diff --git a/drivers/hid/hid-sony.c b/drivers/hid/hid-sony.c +index 93942063b51b..49dd2d905c7f 100644 +--- a/drivers/hid/hid-sony.c ++++ b/drivers/hid/hid-sony.c +@@ -585,10 +585,14 @@ static void sony_set_leds(struct sony_sc *sc); + static inline void sony_schedule_work(struct sony_sc *sc, + enum sony_worker which) + { ++ unsigned long flags; ++ + switch (which) { + case SONY_WORKER_STATE: +- if (!sc->defer_initialization) ++ spin_lock_irqsave(&sc->lock, flags); ++ if (!sc->defer_initialization && sc->state_worker_initialized) + schedule_work(&sc->state_worker); ++ spin_unlock_irqrestore(&sc->lock, flags); + break; + case SONY_WORKER_HOTPLUG: + if (sc->hotplug_worker_initialized) +@@ -2558,13 +2562,18 @@ static inline void sony_init_output_report(struct sony_sc *sc, + + static inline void sony_cancel_work_sync(struct sony_sc *sc) + { ++ unsigned long flags; ++ + if (sc->hotplug_worker_initialized) + cancel_work_sync(&sc->hotplug_worker); +- if (sc->state_worker_initialized) ++ if (sc->state_worker_initialized) { ++ spin_lock_irqsave(&sc->lock, flags); ++ sc->state_worker_initialized = 0; ++ spin_unlock_irqrestore(&sc->lock, flags); + cancel_work_sync(&sc->state_worker); ++ } + } + +- + static int sony_input_configured(struct hid_device *hdev, + struct hid_input *hidinput) + { +diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c +index 83dd3a2a7316..3299b1474d1b 100644 +--- a/drivers/hid/wacom_sys.c ++++ b/drivers/hid/wacom_sys.c +@@ -304,6 +304,9 @@ static void wacom_feature_mapping(struct hid_device *hdev, + wacom_hid_usage_quirk(hdev, field, usage); + + switch (equivalent_usage) { ++ case WACOM_HID_WD_TOUCH_RING_SETTING: ++ wacom->generic_has_leds = true; ++ break; + case HID_DG_CONTACTMAX: + /* leave touch_max as is if predefined */ + if (!features->touch_max) { +diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c +index 43f6da357165..926c597f5f46 100644 +--- a/drivers/hid/wacom_wac.c ++++ b/drivers/hid/wacom_wac.c +@@ -533,14 +533,14 @@ static int wacom_intuos_pad(struct wacom_wac *wacom) + */ + buttons = (data[4] << 1) | (data[3] & 0x01); + } else if (features->type == CINTIQ_COMPANION_2) { +- /* d-pad right -> data[4] & 0x10 +- * d-pad up -> data[4] & 0x20 +- * d-pad left -> data[4] & 0x40 +- * d-pad down -> data[4] & 0x80 +- * d-pad center -> data[3] & 0x01 ++ /* d-pad right -> data[2] & 0x10 ++ * d-pad up -> data[2] & 0x20 ++ * d-pad left -> data[2] & 0x40 ++ * d-pad down -> data[2] & 0x80 ++ * d-pad center -> data[1] & 0x01 + */ + buttons = ((data[2] >> 4) << 7) | +- ((data[1] & 0x04) << 6) | ++ ((data[1] & 0x04) << 4) | + ((data[2] & 0x0F) << 2) | + (data[1] & 0x03); + } else if (features->type >= INTUOS5S && features->type <= INTUOSPL) { +@@ -1926,8 +1926,6 @@ static void wacom_wac_pad_usage_mapping(struct hid_device *hdev, + features->device_type |= WACOM_DEVICETYPE_PAD; + break; + case WACOM_HID_WD_BUTTONCENTER: +- wacom->generic_has_leds = true; +- /* fall through */ + case WACOM_HID_WD_BUTTONHOME: + case WACOM_HID_WD_BUTTONUP: + case WACOM_HID_WD_BUTTONDOWN: +@@ -2119,14 +2117,12 @@ static void wacom_wac_pad_report(struct hid_device *hdev, + bool active = wacom_wac->hid_data.inrange_state != 0; + + /* report prox for expresskey events */ +- if ((wacom_equivalent_usage(field->physical) == HID_DG_TABLETFUNCTIONKEY) && +- wacom_wac->hid_data.pad_input_event_flag) { ++ if (wacom_wac->hid_data.pad_input_event_flag) { + input_event(input, EV_ABS, ABS_MISC, active ? PAD_DEVICE_ID : 0); + input_sync(input); + if (!active) + wacom_wac->hid_data.pad_input_event_flag = false; + } +- + } + + static void wacom_wac_pen_usage_mapping(struct hid_device *hdev, +@@ -2702,9 +2698,7 @@ static int wacom_wac_collection(struct hid_device *hdev, struct hid_report *repo + if (report->type != HID_INPUT_REPORT) + return -1; + +- if (WACOM_PAD_FIELD(field) && wacom->wacom_wac.pad_input) +- wacom_wac_pad_report(hdev, report, field); +- else if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) ++ if (WACOM_PEN_FIELD(field) && wacom->wacom_wac.pen_input) + wacom_wac_pen_report(hdev, report); + else if (WACOM_FINGER_FIELD(field) && wacom->wacom_wac.touch_input) + wacom_wac_finger_report(hdev, report); +@@ -2718,7 +2712,7 @@ void wacom_wac_report(struct hid_device *hdev, struct hid_report *report) + struct wacom_wac *wacom_wac = &wacom->wacom_wac; + struct hid_field *field; + bool pad_in_hid_field = false, pen_in_hid_field = false, +- finger_in_hid_field = false; ++ finger_in_hid_field = false, true_pad = false; + int r; + int prev_collection = -1; + +@@ -2734,6 +2728,8 @@ void wacom_wac_report(struct hid_device *hdev, struct hid_report *report) + pen_in_hid_field = true; + if (WACOM_FINGER_FIELD(field)) + finger_in_hid_field = true; ++ if (wacom_equivalent_usage(field->physical) == HID_DG_TABLETFUNCTIONKEY) ++ true_pad = true; + } + + wacom_wac_battery_pre_report(hdev, report); +@@ -2757,6 +2753,9 @@ void wacom_wac_report(struct hid_device *hdev, struct hid_report *report) + } + + wacom_wac_battery_report(hdev, report); ++ ++ if (true_pad && wacom->wacom_wac.pad_input) ++ wacom_wac_pad_report(hdev, report, field); + } + + static int wacom_bpt_touch(struct wacom_wac *wacom) +@@ -3713,7 +3712,7 @@ int wacom_setup_touch_input_capabilities(struct input_dev *input_dev, + 0, 5920, 4, 0); + } + input_abs_set_res(input_dev, ABS_MT_POSITION_X, 40); +- input_abs_set_res(input_dev, ABS_MT_POSITION_X, 40); ++ input_abs_set_res(input_dev, ABS_MT_POSITION_Y, 40); + + /* fall through */ + +diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h +index cac68d1c20c5..420a19bfaae3 100644 +--- a/drivers/hid/wacom_wac.h ++++ b/drivers/hid/wacom_wac.h +@@ -141,6 +141,7 @@ + #define WACOM_HID_WD_OFFSETBOTTOM (WACOM_HID_UP_WACOMDIGITIZER | 0x0d33) + #define WACOM_HID_WD_DATAMODE (WACOM_HID_UP_WACOMDIGITIZER | 0x1002) + #define WACOM_HID_WD_DIGITIZERINFO (WACOM_HID_UP_WACOMDIGITIZER | 0x1013) ++#define WACOM_HID_WD_TOUCH_RING_SETTING (WACOM_HID_UP_WACOMDIGITIZER | 0x1032) + #define WACOM_HID_UP_G9 0xff090000 + #define WACOM_HID_G9_PEN (WACOM_HID_UP_G9 | 0x02) + #define WACOM_HID_G9_TOUCHSCREEN (WACOM_HID_UP_G9 | 0x11) +diff --git a/drivers/hwmon/fam15h_power.c b/drivers/hwmon/fam15h_power.c +index 267eac00a3fb..352af68c6cd7 100644 +--- a/drivers/hwmon/fam15h_power.c ++++ b/drivers/hwmon/fam15h_power.c +@@ -225,7 +225,7 @@ static ssize_t power1_average_show(struct device *dev, + prev_ptsc[cu] = data->cpu_sw_pwr_ptsc[cu]; + } + +- leftover = schedule_timeout_interruptible(msecs_to_jiffies(data->power_period)); ++ leftover = schedule_msec_hrtimeout_interruptible((data->power_period)); + if (leftover) + return 0; + +diff --git a/drivers/hwmon/lm75.c b/drivers/hwmon/lm75.c +index 3fb9c0a2d6d0..ce5ec403ec73 100644 +--- a/drivers/hwmon/lm75.c ++++ b/drivers/hwmon/lm75.c +@@ -343,7 +343,7 @@ lm75_probe(struct i2c_client *client, const struct i2c_device_id *id) + data->sample_time = MSEC_PER_SEC / 2; + break; + case tmp75b: /* not one-shot mode, Conversion rate 37Hz */ +- clr_mask |= 1 << 15 | 0x3 << 13; ++ clr_mask |= 1 << 7 | 0x3 << 5; + data->resolution = 12; + data->sample_time = MSEC_PER_SEC / 37; + break; +diff --git a/drivers/hwmon/nct6775.c b/drivers/hwmon/nct6775.c +index e7dff5febe16..d42bc0883a32 100644 +--- a/drivers/hwmon/nct6775.c ++++ b/drivers/hwmon/nct6775.c +@@ -852,7 +852,7 @@ static const u16 NCT6106_REG_TARGET[] = { 0x111, 0x121, 0x131 }; + static const u16 NCT6106_REG_WEIGHT_TEMP_SEL[] = { 0x168, 0x178, 0x188 }; + static const u16 NCT6106_REG_WEIGHT_TEMP_STEP[] = { 0x169, 0x179, 0x189 }; + static const u16 NCT6106_REG_WEIGHT_TEMP_STEP_TOL[] = { 0x16a, 0x17a, 0x18a }; +-static const u16 NCT6106_REG_WEIGHT_DUTY_STEP[] = { 0x16b, 0x17b, 0x17c }; ++static const u16 NCT6106_REG_WEIGHT_DUTY_STEP[] = { 0x16b, 0x17b, 0x18b }; + static const u16 NCT6106_REG_WEIGHT_TEMP_BASE[] = { 0x16c, 0x17c, 0x18c }; + static const u16 NCT6106_REG_WEIGHT_DUTY_BASE[] = { 0x16d, 0x17d, 0x18d }; + +@@ -3764,6 +3764,7 @@ static int nct6775_probe(struct platform_device *pdev) + data->REG_FAN_TIME[0] = NCT6106_REG_FAN_STOP_TIME; + data->REG_FAN_TIME[1] = NCT6106_REG_FAN_STEP_UP_TIME; + data->REG_FAN_TIME[2] = NCT6106_REG_FAN_STEP_DOWN_TIME; ++ data->REG_TOLERANCE_H = NCT6106_REG_TOLERANCE_H; + data->REG_PWM[0] = NCT6106_REG_PWM; + data->REG_PWM[1] = NCT6106_REG_FAN_START_OUTPUT; + data->REG_PWM[2] = NCT6106_REG_FAN_STOP_OUTPUT; +diff --git a/drivers/hwmon/nct7802.c b/drivers/hwmon/nct7802.c +index ec7bcf8d7cd6..f3dd2a17bd42 100644 +--- a/drivers/hwmon/nct7802.c ++++ b/drivers/hwmon/nct7802.c +@@ -704,7 +704,7 @@ static struct attribute *nct7802_in_attrs[] = { + &sensor_dev_attr_in3_alarm.dev_attr.attr, + &sensor_dev_attr_in3_beep.dev_attr.attr, + +- &sensor_dev_attr_in4_input.dev_attr.attr, /* 17 */ ++ &sensor_dev_attr_in4_input.dev_attr.attr, /* 16 */ + &sensor_dev_attr_in4_min.dev_attr.attr, + &sensor_dev_attr_in4_max.dev_attr.attr, + &sensor_dev_attr_in4_alarm.dev_attr.attr, +@@ -730,9 +730,9 @@ static umode_t nct7802_in_is_visible(struct kobject *kobj, + + if (index >= 6 && index < 11 && (reg & 0x03) != 0x03) /* VSEN1 */ + return 0; +- if (index >= 11 && index < 17 && (reg & 0x0c) != 0x0c) /* VSEN2 */ ++ if (index >= 11 && index < 16 && (reg & 0x0c) != 0x0c) /* VSEN2 */ + return 0; +- if (index >= 17 && (reg & 0x30) != 0x30) /* VSEN3 */ ++ if (index >= 16 && (reg & 0x30) != 0x30) /* VSEN3 */ + return 0; + + return attr->mode; +diff --git a/drivers/hwmon/occ/common.c b/drivers/hwmon/occ/common.c +index 13a6290c8d25..f02aa403332c 100644 +--- a/drivers/hwmon/occ/common.c ++++ b/drivers/hwmon/occ/common.c +@@ -402,8 +402,10 @@ static ssize_t occ_show_power_1(struct device *dev, + + static u64 occ_get_powr_avg(u64 *accum, u32 *samples) + { +- return div64_u64(get_unaligned_be64(accum) * 1000000ULL, +- get_unaligned_be32(samples)); ++ u64 divisor = get_unaligned_be32(samples); ++ ++ return (divisor == 0) ? 0 : ++ div64_u64(get_unaligned_be64(accum) * 1000000ULL, divisor); + } + + static ssize_t occ_show_power_2(struct device *dev, +diff --git a/drivers/hwtracing/coresight/coresight-etb10.c b/drivers/hwtracing/coresight/coresight-etb10.c +index 4ee4c80a4354..543cc3d36e1d 100644 +--- a/drivers/hwtracing/coresight/coresight-etb10.c ++++ b/drivers/hwtracing/coresight/coresight-etb10.c +@@ -373,12 +373,10 @@ static void *etb_alloc_buffer(struct coresight_device *csdev, + struct perf_event *event, void **pages, + int nr_pages, bool overwrite) + { +- int node, cpu = event->cpu; ++ int node; + struct cs_buffers *buf; + +- if (cpu == -1) +- cpu = smp_processor_id(); +- node = cpu_to_node(cpu); ++ node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu); + + buf = kzalloc_node(sizeof(struct cs_buffers), GFP_KERNEL, node); + if (!buf) +diff --git a/drivers/hwtracing/coresight/coresight-etm-perf.c b/drivers/hwtracing/coresight/coresight-etm-perf.c +index 3c6294432748..1ef098ff27c3 100644 +--- a/drivers/hwtracing/coresight/coresight-etm-perf.c ++++ b/drivers/hwtracing/coresight/coresight-etm-perf.c +@@ -544,6 +544,7 @@ int etm_perf_add_symlink_sink(struct coresight_device *csdev) + /* See function coresight_get_sink_by_id() to know where this is used */ + hash = hashlen_hash(hashlen_string(NULL, name)); + ++ sysfs_attr_init(&ea->attr.attr); + ea->attr.attr.name = devm_kstrdup(pdev, name, GFP_KERNEL); + if (!ea->attr.attr.name) + return -ENOMEM; +diff --git a/drivers/hwtracing/coresight/coresight-funnel.c b/drivers/hwtracing/coresight/coresight-funnel.c +index 16b0c0e1e43a..ad6e16c96263 100644 +--- a/drivers/hwtracing/coresight/coresight-funnel.c ++++ b/drivers/hwtracing/coresight/coresight-funnel.c +@@ -241,6 +241,7 @@ static int funnel_probe(struct device *dev, struct resource *res) + } + + pm_runtime_put(dev); ++ ret = 0; + + out_disable_clk: + if (ret && !IS_ERR_OR_NULL(drvdata->atclk)) +diff --git a/drivers/hwtracing/coresight/coresight-tmc-etf.c b/drivers/hwtracing/coresight/coresight-tmc-etf.c +index 2527b5d3b65e..8de109de171f 100644 +--- a/drivers/hwtracing/coresight/coresight-tmc-etf.c ++++ b/drivers/hwtracing/coresight/coresight-tmc-etf.c +@@ -378,12 +378,10 @@ static void *tmc_alloc_etf_buffer(struct coresight_device *csdev, + struct perf_event *event, void **pages, + int nr_pages, bool overwrite) + { +- int node, cpu = event->cpu; ++ int node; + struct cs_buffers *buf; + +- if (cpu == -1) +- cpu = smp_processor_id(); +- node = cpu_to_node(cpu); ++ node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu); + + /* Allocate memory structure for interaction with Perf */ + buf = kzalloc_node(sizeof(struct cs_buffers), GFP_KERNEL, node); +diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c +index df6e4b0b84e9..9f293b9dce8c 100644 +--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c ++++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c +@@ -1178,14 +1178,11 @@ static struct etr_buf * + alloc_etr_buf(struct tmc_drvdata *drvdata, struct perf_event *event, + int nr_pages, void **pages, bool snapshot) + { +- int node, cpu = event->cpu; ++ int node; + struct etr_buf *etr_buf; + unsigned long size; + +- if (cpu == -1) +- cpu = smp_processor_id(); +- node = cpu_to_node(cpu); +- ++ node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu); + /* + * Try to match the perf ring buffer size if it is larger + * than the size requested via sysfs. +@@ -1317,13 +1314,11 @@ static struct etr_perf_buffer * + tmc_etr_setup_perf_buf(struct tmc_drvdata *drvdata, struct perf_event *event, + int nr_pages, void **pages, bool snapshot) + { +- int node, cpu = event->cpu; ++ int node; + struct etr_buf *etr_buf; + struct etr_perf_buffer *etr_perf; + +- if (cpu == -1) +- cpu = smp_processor_id(); +- node = cpu_to_node(cpu); ++ node = (event->cpu == -1) ? NUMA_NO_NODE : cpu_to_node(event->cpu); + + etr_perf = kzalloc_node(sizeof(*etr_perf), GFP_KERNEL, node); + if (!etr_perf) +diff --git a/drivers/hwtracing/intel_th/msu.c b/drivers/hwtracing/intel_th/msu.c +index 81bb54fa3ce8..cfd48c81b9d9 100644 +--- a/drivers/hwtracing/intel_th/msu.c ++++ b/drivers/hwtracing/intel_th/msu.c +@@ -667,7 +667,7 @@ static int msc_buffer_contig_alloc(struct msc *msc, unsigned long size) + goto err_out; + + ret = -ENOMEM; +- page = alloc_pages(GFP_KERNEL | __GFP_ZERO, order); ++ page = alloc_pages(GFP_KERNEL | __GFP_ZERO | GFP_DMA32, order); + if (!page) + goto err_free_sgt; + +@@ -767,6 +767,30 @@ static int __msc_buffer_win_alloc(struct msc_window *win, + return -ENOMEM; + } + ++#ifdef CONFIG_X86 ++static void msc_buffer_set_uc(struct msc_window *win, unsigned int nr_blocks) ++{ ++ int i; ++ ++ for (i = 0; i < nr_blocks; i++) ++ /* Set the page as uncached */ ++ set_memory_uc((unsigned long)msc_win_block(win, i), 1); ++} ++ ++static void msc_buffer_set_wb(struct msc_window *win) ++{ ++ int i; ++ ++ for (i = 0; i < win->nr_blocks; i++) ++ /* Reset the page to write-back */ ++ set_memory_wb((unsigned long)msc_win_block(win, i), 1); ++} ++#else /* !X86 */ ++static inline void ++msc_buffer_set_uc(struct msc_window *win, unsigned int nr_blocks) {} ++static inline void msc_buffer_set_wb(struct msc_window *win) {} ++#endif /* CONFIG_X86 */ ++ + /** + * msc_buffer_win_alloc() - alloc a window for a multiblock mode + * @msc: MSC device +@@ -780,7 +804,7 @@ static int __msc_buffer_win_alloc(struct msc_window *win, + static int msc_buffer_win_alloc(struct msc *msc, unsigned int nr_blocks) + { + struct msc_window *win; +- int ret = -ENOMEM, i; ++ int ret = -ENOMEM; + + if (!nr_blocks) + return 0; +@@ -811,11 +835,7 @@ static int msc_buffer_win_alloc(struct msc *msc, unsigned int nr_blocks) + if (ret < 0) + goto err_nomem; + +-#ifdef CONFIG_X86 +- for (i = 0; i < ret; i++) +- /* Set the page as uncached */ +- set_memory_uc((unsigned long)msc_win_block(win, i), 1); +-#endif ++ msc_buffer_set_uc(win, ret); + + win->nr_blocks = ret; + +@@ -860,8 +880,6 @@ static void __msc_buffer_win_free(struct msc *msc, struct msc_window *win) + */ + static void msc_buffer_win_free(struct msc *msc, struct msc_window *win) + { +- int i; +- + msc->nr_pages -= win->nr_blocks; + + list_del(&win->entry); +@@ -870,11 +888,7 @@ static void msc_buffer_win_free(struct msc *msc, struct msc_window *win) + msc->base_addr = 0; + } + +-#ifdef CONFIG_X86 +- for (i = 0; i < win->nr_blocks; i++) +- /* Reset the page to write-back */ +- set_memory_wb((unsigned long)msc_win_block(win, i), 1); +-#endif ++ msc_buffer_set_wb(win); + + __msc_buffer_win_free(msc, win); + +@@ -1386,10 +1400,9 @@ static int intel_th_msc_init(struct msc *msc) + + static void msc_win_switch(struct msc *msc) + { +- struct msc_window *last, *first; ++ struct msc_window *first; + + first = list_first_entry(&msc->win_list, struct msc_window, entry); +- last = list_last_entry(&msc->win_list, struct msc_window, entry); + + if (msc_is_last_win(msc->cur_win)) + msc->cur_win = first; +diff --git a/drivers/hwtracing/intel_th/pci.c b/drivers/hwtracing/intel_th/pci.c +index f1228708f2a2..c0378c3de9a4 100644 +--- a/drivers/hwtracing/intel_th/pci.c ++++ b/drivers/hwtracing/intel_th/pci.c +@@ -194,6 +194,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { + PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x02a6), + .driver_data = (kernel_ulong_t)&intel_th_2x, + }, ++ { ++ /* Ice Lake NNPI */ ++ PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x45c5), ++ .driver_data = (kernel_ulong_t)&intel_th_2x, ++ }, + { 0 }, + }; + +diff --git a/drivers/i2c/busses/i2c-at91-core.c b/drivers/i2c/busses/i2c-at91-core.c +index 8d55cdd69ff4..435c7d7377a3 100644 +--- a/drivers/i2c/busses/i2c-at91-core.c ++++ b/drivers/i2c/busses/i2c-at91-core.c +@@ -142,7 +142,7 @@ static struct at91_twi_pdata sama5d4_config = { + + static struct at91_twi_pdata sama5d2_config = { + .clk_max_div = 7, +- .clk_offset = 4, ++ .clk_offset = 3, + .has_unre_flag = true, + .has_alt_cmd = true, + .has_hold_field = true, +diff --git a/drivers/i2c/busses/i2c-at91-master.c b/drivers/i2c/busses/i2c-at91-master.c +index e87232f2e708..a3fcc35ffd3b 100644 +--- a/drivers/i2c/busses/i2c-at91-master.c ++++ b/drivers/i2c/busses/i2c-at91-master.c +@@ -122,9 +122,11 @@ static void at91_twi_write_next_byte(struct at91_twi_dev *dev) + writeb_relaxed(*dev->buf, dev->base + AT91_TWI_THR); + + /* send stop when last byte has been written */ +- if (--dev->buf_len == 0) ++ if (--dev->buf_len == 0) { + if (!dev->use_alt_cmd) + at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP); ++ at91_twi_write(dev, AT91_TWI_IDR, AT91_TWI_TXRDY); ++ } + + dev_dbg(dev->dev, "wrote 0x%x, to go %zu\n", *dev->buf, dev->buf_len); + +@@ -542,9 +544,8 @@ static int at91_do_twi_transfer(struct at91_twi_dev *dev) + } else { + at91_twi_write_next_byte(dev); + at91_twi_write(dev, AT91_TWI_IER, +- AT91_TWI_TXCOMP | +- AT91_TWI_NACK | +- AT91_TWI_TXRDY); ++ AT91_TWI_TXCOMP | AT91_TWI_NACK | ++ (dev->buf_len ? AT91_TWI_TXRDY : 0)); + } + } + +diff --git a/drivers/i2c/busses/i2c-bcm-iproc.c b/drivers/i2c/busses/i2c-bcm-iproc.c +index a845b8decac8..ad1681872e39 100644 +--- a/drivers/i2c/busses/i2c-bcm-iproc.c ++++ b/drivers/i2c/busses/i2c-bcm-iproc.c +@@ -403,16 +403,18 @@ static bool bcm_iproc_i2c_slave_isr(struct bcm_iproc_i2c_dev *iproc_i2c, + static void bcm_iproc_i2c_read_valid_bytes(struct bcm_iproc_i2c_dev *iproc_i2c) + { + struct i2c_msg *msg = iproc_i2c->msg; ++ uint32_t val; + + /* Read valid data from RX FIFO */ + while (iproc_i2c->rx_bytes < msg->len) { +- if (!((iproc_i2c_rd_reg(iproc_i2c, M_FIFO_CTRL_OFFSET) >> M_FIFO_RX_CNT_SHIFT) +- & M_FIFO_RX_CNT_MASK)) ++ val = iproc_i2c_rd_reg(iproc_i2c, M_RX_OFFSET); ++ ++ /* rx fifo empty */ ++ if (!((val >> M_RX_STATUS_SHIFT) & M_RX_STATUS_MASK)) + break; + + msg->buf[iproc_i2c->rx_bytes] = +- (iproc_i2c_rd_reg(iproc_i2c, M_RX_OFFSET) >> +- M_RX_DATA_SHIFT) & M_RX_DATA_MASK; ++ (val >> M_RX_DATA_SHIFT) & M_RX_DATA_MASK; + iproc_i2c->rx_bytes++; + } + } +diff --git a/drivers/i2c/busses/i2c-nvidia-gpu.c b/drivers/i2c/busses/i2c-nvidia-gpu.c +index 1c8f708f212b..ee2412b7459c 100644 +--- a/drivers/i2c/busses/i2c-nvidia-gpu.c ++++ b/drivers/i2c/busses/i2c-nvidia-gpu.c +@@ -51,6 +51,7 @@ struct gpu_i2c_dev { + void __iomem *regs; + struct i2c_adapter adapter; + struct i2c_board_info *gpu_ccgx_ucsi; ++ struct i2c_client *ccgx_client; + }; + + static void gpu_enable_i2c_bus(struct gpu_i2c_dev *i2cd) +@@ -261,8 +262,6 @@ static const struct property_entry ccgx_props[] = { + + static int gpu_populate_client(struct gpu_i2c_dev *i2cd, int irq) + { +- struct i2c_client *ccgx_client; +- + i2cd->gpu_ccgx_ucsi = devm_kzalloc(i2cd->dev, + sizeof(*i2cd->gpu_ccgx_ucsi), + GFP_KERNEL); +@@ -274,8 +273,8 @@ static int gpu_populate_client(struct gpu_i2c_dev *i2cd, int irq) + i2cd->gpu_ccgx_ucsi->addr = 0x8; + i2cd->gpu_ccgx_ucsi->irq = irq; + i2cd->gpu_ccgx_ucsi->properties = ccgx_props; +- ccgx_client = i2c_new_device(&i2cd->adapter, i2cd->gpu_ccgx_ucsi); +- if (!ccgx_client) ++ i2cd->ccgx_client = i2c_new_device(&i2cd->adapter, i2cd->gpu_ccgx_ucsi); ++ if (!i2cd->ccgx_client) + return -ENODEV; + + return 0; +@@ -354,6 +353,13 @@ static __maybe_unused int gpu_i2c_resume(struct device *dev) + struct gpu_i2c_dev *i2cd = dev_get_drvdata(dev); + + gpu_enable_i2c_bus(i2cd); ++ /* ++ * Runtime resume ccgx client so that it can see for any ++ * connector change event. Old ccg firmware has known ++ * issue of not triggering interrupt when a device is ++ * connected to runtime resume the controller. ++ */ ++ pm_request_resume(&i2cd->ccgx_client->dev); + return 0; + } + +diff --git a/drivers/i2c/busses/i2c-stm32f7.c b/drivers/i2c/busses/i2c-stm32f7.c +index 48337bef5b87..3d90c0bb049e 100644 +--- a/drivers/i2c/busses/i2c-stm32f7.c ++++ b/drivers/i2c/busses/i2c-stm32f7.c +@@ -25,7 +25,6 @@ + #include + #include + #include +-#include + #include + #include + #include +@@ -1816,15 +1815,14 @@ static struct i2c_algorithm stm32f7_i2c_algo = { + + static int stm32f7_i2c_probe(struct platform_device *pdev) + { +- struct device_node *np = pdev->dev.of_node; + struct stm32f7_i2c_dev *i2c_dev; + const struct stm32f7_i2c_setup *setup; + struct resource *res; +- u32 irq_error, irq_event, clk_rate, rise_time, fall_time; ++ u32 clk_rate, rise_time, fall_time; + struct i2c_adapter *adap; + struct reset_control *rst; + dma_addr_t phy_addr; +- int ret; ++ int irq_error, irq_event, ret; + + i2c_dev = devm_kzalloc(&pdev->dev, sizeof(*i2c_dev), GFP_KERNEL); + if (!i2c_dev) +@@ -1836,16 +1834,20 @@ static int stm32f7_i2c_probe(struct platform_device *pdev) + return PTR_ERR(i2c_dev->base); + phy_addr = (dma_addr_t)res->start; + +- irq_event = irq_of_parse_and_map(np, 0); +- if (!irq_event) { +- dev_err(&pdev->dev, "IRQ event missing or invalid\n"); +- return -EINVAL; ++ irq_event = platform_get_irq(pdev, 0); ++ if (irq_event <= 0) { ++ if (irq_event != -EPROBE_DEFER) ++ dev_err(&pdev->dev, "Failed to get IRQ event: %d\n", ++ irq_event); ++ return irq_event ? : -ENOENT; + } + +- irq_error = irq_of_parse_and_map(np, 1); +- if (!irq_error) { +- dev_err(&pdev->dev, "IRQ error missing or invalid\n"); +- return -EINVAL; ++ irq_error = platform_get_irq(pdev, 1); ++ if (irq_error <= 0) { ++ if (irq_error != -EPROBE_DEFER) ++ dev_err(&pdev->dev, "Failed to get IRQ error: %d\n", ++ irq_error); ++ return irq_error ? : -ENOENT; + } + + i2c_dev->clk = devm_clk_get(&pdev->dev, NULL); +diff --git a/drivers/i3c/master.c b/drivers/i3c/master.c +index 5f4bd52121fe..7837ea67f1f8 100644 +--- a/drivers/i3c/master.c ++++ b/drivers/i3c/master.c +@@ -91,6 +91,12 @@ void i3c_bus_normaluse_unlock(struct i3c_bus *bus) + up_read(&bus->lock); + } + ++static struct i3c_master_controller * ++i3c_bus_to_i3c_master(struct i3c_bus *i3cbus) ++{ ++ return container_of(i3cbus, struct i3c_master_controller, bus); ++} ++ + static struct i3c_master_controller *dev_to_i3cmaster(struct device *dev) + { + return container_of(dev, struct i3c_master_controller, dev); +@@ -565,20 +571,38 @@ static const struct device_type i3c_masterdev_type = { + .groups = i3c_masterdev_groups, + }; + +-int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode) ++int i3c_bus_set_mode(struct i3c_bus *i3cbus, enum i3c_bus_mode mode, ++ unsigned long max_i2c_scl_rate) + { +- i3cbus->mode = mode; ++ struct i3c_master_controller *master = i3c_bus_to_i3c_master(i3cbus); + +- if (!i3cbus->scl_rate.i3c) +- i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; ++ i3cbus->mode = mode; + +- if (!i3cbus->scl_rate.i2c) { +- if (i3cbus->mode == I3C_BUS_MODE_MIXED_SLOW) +- i3cbus->scl_rate.i2c = I3C_BUS_I2C_FM_SCL_RATE; +- else +- i3cbus->scl_rate.i2c = I3C_BUS_I2C_FM_PLUS_SCL_RATE; ++ switch (i3cbus->mode) { ++ case I3C_BUS_MODE_PURE: ++ if (!i3cbus->scl_rate.i3c) ++ i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; ++ break; ++ case I3C_BUS_MODE_MIXED_FAST: ++ if (!i3cbus->scl_rate.i3c) ++ i3cbus->scl_rate.i3c = I3C_BUS_TYP_I3C_SCL_RATE; ++ if (!i3cbus->scl_rate.i2c) ++ i3cbus->scl_rate.i2c = max_i2c_scl_rate; ++ break; ++ case I3C_BUS_MODE_MIXED_SLOW: ++ if (!i3cbus->scl_rate.i2c) ++ i3cbus->scl_rate.i2c = max_i2c_scl_rate; ++ if (!i3cbus->scl_rate.i3c || ++ i3cbus->scl_rate.i3c > i3cbus->scl_rate.i2c) ++ i3cbus->scl_rate.i3c = i3cbus->scl_rate.i2c; ++ break; ++ default: ++ return -EINVAL; + } + ++ dev_dbg(&master->dev, "i2c-scl = %ld Hz i3c-scl = %ld Hz\n", ++ i3cbus->scl_rate.i2c, i3cbus->scl_rate.i3c); ++ + /* + * I3C/I2C frequency may have been overridden, check that user-provided + * values are not exceeding max possible frequency. +@@ -1966,9 +1990,6 @@ of_i3c_master_add_i2c_boardinfo(struct i3c_master_controller *master, + /* LVR is encoded in reg[2]. */ + boardinfo->lvr = reg[2]; + +- if (boardinfo->lvr & I3C_LVR_I2C_FM_MODE) +- master->bus.scl_rate.i2c = I3C_BUS_I2C_FM_SCL_RATE; +- + list_add_tail(&boardinfo->node, &master->boardinfo.i2c); + of_node_get(node); + +@@ -2417,6 +2438,7 @@ int i3c_master_register(struct i3c_master_controller *master, + const struct i3c_master_controller_ops *ops, + bool secondary) + { ++ unsigned long i2c_scl_rate = I3C_BUS_I2C_FM_PLUS_SCL_RATE; + struct i3c_bus *i3cbus = i3c_master_get_bus(master); + enum i3c_bus_mode mode = I3C_BUS_MODE_PURE; + struct i2c_dev_boardinfo *i2cbi; +@@ -2466,9 +2488,12 @@ int i3c_master_register(struct i3c_master_controller *master, + ret = -EINVAL; + goto err_put_dev; + } ++ ++ if (i2cbi->lvr & I3C_LVR_I2C_FM_MODE) ++ i2c_scl_rate = I3C_BUS_I2C_FM_SCL_RATE; + } + +- ret = i3c_bus_set_mode(i3cbus, mode); ++ ret = i3c_bus_set_mode(i3cbus, mode, i2c_scl_rate); + if (ret) + goto err_put_dev; + +diff --git a/drivers/iio/accel/adxl372.c b/drivers/iio/accel/adxl372.c +index 3b84cb243a87..055227cb3d43 100644 +--- a/drivers/iio/accel/adxl372.c ++++ b/drivers/iio/accel/adxl372.c +@@ -782,10 +782,14 @@ static int adxl372_buffer_postenable(struct iio_dev *indio_dev) + unsigned int mask; + int i, ret; + +- ret = adxl372_set_interrupts(st, ADXL372_INT1_MAP_FIFO_FULL_MSK, 0); ++ ret = iio_triggered_buffer_postenable(indio_dev); + if (ret < 0) + return ret; + ++ ret = adxl372_set_interrupts(st, ADXL372_INT1_MAP_FIFO_FULL_MSK, 0); ++ if (ret < 0) ++ goto err; ++ + mask = *indio_dev->active_scan_mask; + + for (i = 0; i < ARRAY_SIZE(adxl372_axis_lookup_table); i++) { +@@ -793,8 +797,10 @@ static int adxl372_buffer_postenable(struct iio_dev *indio_dev) + break; + } + +- if (i == ARRAY_SIZE(adxl372_axis_lookup_table)) +- return -EINVAL; ++ if (i == ARRAY_SIZE(adxl372_axis_lookup_table)) { ++ ret = -EINVAL; ++ goto err; ++ } + + st->fifo_format = adxl372_axis_lookup_table[i].fifo_format; + st->fifo_set_size = bitmap_weight(indio_dev->active_scan_mask, +@@ -814,26 +820,25 @@ static int adxl372_buffer_postenable(struct iio_dev *indio_dev) + if (ret < 0) { + st->fifo_mode = ADXL372_FIFO_BYPASSED; + adxl372_set_interrupts(st, 0, 0); +- return ret; ++ goto err; + } + +- return iio_triggered_buffer_postenable(indio_dev); ++ return 0; ++ ++err: ++ iio_triggered_buffer_predisable(indio_dev); ++ return ret; + } + + static int adxl372_buffer_predisable(struct iio_dev *indio_dev) + { + struct adxl372_state *st = iio_priv(indio_dev); +- int ret; +- +- ret = iio_triggered_buffer_predisable(indio_dev); +- if (ret < 0) +- return ret; + + adxl372_set_interrupts(st, 0, 0); + st->fifo_mode = ADXL372_FIFO_BYPASSED; + adxl372_configure_fifo(st); + +- return 0; ++ return iio_triggered_buffer_predisable(indio_dev); + } + + static const struct iio_buffer_setup_ops adxl372_buffer_ops = { +diff --git a/drivers/iio/accel/cros_ec_accel_legacy.c b/drivers/iio/accel/cros_ec_accel_legacy.c +index 46bb2e421bb9..ad19d9c716f4 100644 +--- a/drivers/iio/accel/cros_ec_accel_legacy.c ++++ b/drivers/iio/accel/cros_ec_accel_legacy.c +@@ -319,7 +319,6 @@ static const struct iio_chan_spec_ext_info cros_ec_accel_legacy_ext_info[] = { + .modified = 1, \ + .info_mask_separate = \ + BIT(IIO_CHAN_INFO_RAW) | \ +- BIT(IIO_CHAN_INFO_SCALE) | \ + BIT(IIO_CHAN_INFO_CALIBBIAS), \ + .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE), \ + .ext_info = cros_ec_accel_legacy_ext_info, \ +diff --git a/drivers/iio/adc/ingenic-adc.c b/drivers/iio/adc/ingenic-adc.c +index 92b1d5037ac9..e234970b7150 100644 +--- a/drivers/iio/adc/ingenic-adc.c ++++ b/drivers/iio/adc/ingenic-adc.c +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -22,8 +23,11 @@ + #define JZ_ADC_REG_ADTCH 0x18 + #define JZ_ADC_REG_ADBDAT 0x1c + #define JZ_ADC_REG_ADSDAT 0x20 ++#define JZ_ADC_REG_ADCLK 0x28 + + #define JZ_ADC_REG_CFG_BAT_MD BIT(4) ++#define JZ_ADC_REG_ADCLK_CLKDIV_LSB 0 ++#define JZ_ADC_REG_ADCLK_CLKDIV10US_LSB 16 + + #define JZ_ADC_AUX_VREF 3300 + #define JZ_ADC_AUX_VREF_BITS 12 +@@ -34,6 +38,8 @@ + #define JZ4740_ADC_BATTERY_HIGH_VREF (7500 * 0.986) + #define JZ4740_ADC_BATTERY_HIGH_VREF_BITS 12 + ++struct ingenic_adc; ++ + struct ingenic_adc_soc_data { + unsigned int battery_high_vref; + unsigned int battery_high_vref_bits; +@@ -41,6 +47,7 @@ struct ingenic_adc_soc_data { + size_t battery_raw_avail_size; + const int *battery_scale_avail; + size_t battery_scale_avail_size; ++ int (*init_clk_div)(struct device *dev, struct ingenic_adc *adc); + }; + + struct ingenic_adc { +@@ -151,6 +158,42 @@ static const int jz4740_adc_battery_scale_avail[] = { + JZ_ADC_BATTERY_LOW_VREF, JZ_ADC_BATTERY_LOW_VREF_BITS, + }; + ++static int jz4725b_adc_init_clk_div(struct device *dev, struct ingenic_adc *adc) ++{ ++ struct clk *parent_clk; ++ unsigned long parent_rate, rate; ++ unsigned int div_main, div_10us; ++ ++ parent_clk = clk_get_parent(adc->clk); ++ if (!parent_clk) { ++ dev_err(dev, "ADC clock has no parent\n"); ++ return -ENODEV; ++ } ++ parent_rate = clk_get_rate(parent_clk); ++ ++ /* ++ * The JZ4725B ADC works at 500 kHz to 8 MHz. ++ * We pick the highest rate possible. ++ * In practice we typically get 6 MHz, half of the 12 MHz EXT clock. ++ */ ++ div_main = DIV_ROUND_UP(parent_rate, 8000000); ++ div_main = clamp(div_main, 1u, 64u); ++ rate = parent_rate / div_main; ++ if (rate < 500000 || rate > 8000000) { ++ dev_err(dev, "No valid divider for ADC main clock\n"); ++ return -EINVAL; ++ } ++ ++ /* We also need a divider that produces a 10us clock. */ ++ div_10us = DIV_ROUND_UP(rate, 100000); ++ ++ writel(((div_10us - 1) << JZ_ADC_REG_ADCLK_CLKDIV10US_LSB) | ++ (div_main - 1) << JZ_ADC_REG_ADCLK_CLKDIV_LSB, ++ adc->base + JZ_ADC_REG_ADCLK); ++ ++ return 0; ++} ++ + static const struct ingenic_adc_soc_data jz4725b_adc_soc_data = { + .battery_high_vref = JZ4725B_ADC_BATTERY_HIGH_VREF, + .battery_high_vref_bits = JZ4725B_ADC_BATTERY_HIGH_VREF_BITS, +@@ -158,6 +201,7 @@ static const struct ingenic_adc_soc_data jz4725b_adc_soc_data = { + .battery_raw_avail_size = ARRAY_SIZE(jz4725b_adc_battery_raw_avail), + .battery_scale_avail = jz4725b_adc_battery_scale_avail, + .battery_scale_avail_size = ARRAY_SIZE(jz4725b_adc_battery_scale_avail), ++ .init_clk_div = jz4725b_adc_init_clk_div, + }; + + static const struct ingenic_adc_soc_data jz4740_adc_soc_data = { +@@ -167,6 +211,7 @@ static const struct ingenic_adc_soc_data jz4740_adc_soc_data = { + .battery_raw_avail_size = ARRAY_SIZE(jz4740_adc_battery_raw_avail), + .battery_scale_avail = jz4740_adc_battery_scale_avail, + .battery_scale_avail_size = ARRAY_SIZE(jz4740_adc_battery_scale_avail), ++ .init_clk_div = NULL, /* no ADCLK register on JZ4740 */ + }; + + static int ingenic_adc_read_avail(struct iio_dev *iio_dev, +@@ -317,6 +362,15 @@ static int ingenic_adc_probe(struct platform_device *pdev) + return ret; + } + ++ /* Set clock dividers. */ ++ if (soc_data->init_clk_div) { ++ ret = soc_data->init_clk_div(dev, adc); ++ if (ret) { ++ clk_disable_unprepare(adc->clk); ++ return ret; ++ } ++ } ++ + /* Put hardware in a known passive state. */ + writeb(0x00, adc->base + JZ_ADC_REG_ENABLE); + writeb(0xff, adc->base + JZ_ADC_REG_CTRL); +diff --git a/drivers/iio/adc/max9611.c b/drivers/iio/adc/max9611.c +index 917223d5ff5b..0e3c6529fc4c 100644 +--- a/drivers/iio/adc/max9611.c ++++ b/drivers/iio/adc/max9611.c +@@ -83,7 +83,7 @@ + #define MAX9611_TEMP_MAX_POS 0x7f80 + #define MAX9611_TEMP_MAX_NEG 0xff80 + #define MAX9611_TEMP_MIN_NEG 0xd980 +-#define MAX9611_TEMP_MASK GENMASK(7, 15) ++#define MAX9611_TEMP_MASK GENMASK(15, 7) + #define MAX9611_TEMP_SHIFT 0x07 + #define MAX9611_TEMP_RAW(_r) ((_r) >> MAX9611_TEMP_SHIFT) + #define MAX9611_TEMP_SCALE_NUM 1000000 +diff --git a/drivers/iio/adc/rcar-gyroadc.c b/drivers/iio/adc/rcar-gyroadc.c +index 2c0d0316d149..b373acce5927 100644 +--- a/drivers/iio/adc/rcar-gyroadc.c ++++ b/drivers/iio/adc/rcar-gyroadc.c +@@ -382,7 +382,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) + dev_err(dev, + "Only %i channels supported with %pOFn, but reg = <%i>.\n", + num_channels, child, reg); +- return ret; ++ return -EINVAL; + } + } + +@@ -391,7 +391,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev) + dev_err(dev, + "Channel %i uses different ADC mode than the rest.\n", + reg); +- return ret; ++ return -EINVAL; + } + + /* Channel is valid, grab the regulator. */ +diff --git a/drivers/iio/adc/stm32-adc-core.c b/drivers/iio/adc/stm32-adc-core.c +index 2327ec18b40c..1f7ce5186dfc 100644 +--- a/drivers/iio/adc/stm32-adc-core.c ++++ b/drivers/iio/adc/stm32-adc-core.c +@@ -87,6 +87,7 @@ struct stm32_adc_priv_cfg { + * @domain: irq domain reference + * @aclk: clock reference for the analog circuitry + * @bclk: bus clock common for all ADCs, depends on part used ++ * @vdda: vdda analog supply reference + * @vref: regulator reference + * @cfg: compatible configuration data + * @common: common data for all ADC instances +@@ -97,6 +98,7 @@ struct stm32_adc_priv { + struct irq_domain *domain; + struct clk *aclk; + struct clk *bclk; ++ struct regulator *vdda; + struct regulator *vref; + const struct stm32_adc_priv_cfg *cfg; + struct stm32_adc_common common; +@@ -394,10 +396,16 @@ static int stm32_adc_core_hw_start(struct device *dev) + struct stm32_adc_priv *priv = to_stm32_adc_priv(common); + int ret; + ++ ret = regulator_enable(priv->vdda); ++ if (ret < 0) { ++ dev_err(dev, "vdda enable failed %d\n", ret); ++ return ret; ++ } ++ + ret = regulator_enable(priv->vref); + if (ret < 0) { + dev_err(dev, "vref enable failed\n"); +- return ret; ++ goto err_vdda_disable; + } + + if (priv->bclk) { +@@ -425,6 +433,8 @@ static int stm32_adc_core_hw_start(struct device *dev) + clk_disable_unprepare(priv->bclk); + err_regulator_disable: + regulator_disable(priv->vref); ++err_vdda_disable: ++ regulator_disable(priv->vdda); + + return ret; + } +@@ -441,6 +451,7 @@ static void stm32_adc_core_hw_stop(struct device *dev) + if (priv->bclk) + clk_disable_unprepare(priv->bclk); + regulator_disable(priv->vref); ++ regulator_disable(priv->vdda); + } + + static int stm32_adc_probe(struct platform_device *pdev) +@@ -468,6 +479,14 @@ static int stm32_adc_probe(struct platform_device *pdev) + return PTR_ERR(priv->common.base); + priv->common.phys_base = res->start; + ++ priv->vdda = devm_regulator_get(&pdev->dev, "vdda"); ++ if (IS_ERR(priv->vdda)) { ++ ret = PTR_ERR(priv->vdda); ++ if (ret != -EPROBE_DEFER) ++ dev_err(&pdev->dev, "vdda get failed, %d\n", ret); ++ return ret; ++ } ++ + priv->vref = devm_regulator_get(&pdev->dev, "vref"); + if (IS_ERR(priv->vref)) { + ret = PTR_ERR(priv->vref); +diff --git a/drivers/iio/adc/stm32-dfsdm-adc.c b/drivers/iio/adc/stm32-dfsdm-adc.c +index 19adc2b23472..588907cc3b6b 100644 +--- a/drivers/iio/adc/stm32-dfsdm-adc.c ++++ b/drivers/iio/adc/stm32-dfsdm-adc.c +@@ -1456,6 +1456,12 @@ static int stm32_dfsdm_adc_probe(struct platform_device *pdev) + * So IRQ associated to filter instance 0 is dedicated to the Filter 0. + */ + irq = platform_get_irq(pdev, 0); ++ if (irq < 0) { ++ if (irq != -EPROBE_DEFER) ++ dev_err(dev, "Failed to get IRQ: %d\n", irq); ++ return irq; ++ } ++ + ret = devm_request_irq(dev, irq, stm32_dfsdm_irq, + 0, pdev->name, adc); + if (ret < 0) { +diff --git a/drivers/iio/adc/stm32-dfsdm-core.c b/drivers/iio/adc/stm32-dfsdm-core.c +index 0a4d3746d21c..26e2011c5868 100644 +--- a/drivers/iio/adc/stm32-dfsdm-core.c ++++ b/drivers/iio/adc/stm32-dfsdm-core.c +@@ -233,6 +233,8 @@ static int stm32_dfsdm_parse_of(struct platform_device *pdev, + } + priv->dfsdm.phys_base = res->start; + priv->dfsdm.base = devm_ioremap_resource(&pdev->dev, res); ++ if (IS_ERR(priv->dfsdm.base)) ++ return PTR_ERR(priv->dfsdm.base); + + /* + * "dfsdm" clock is mandatory for DFSDM peripheral clocking. +@@ -242,8 +244,10 @@ static int stm32_dfsdm_parse_of(struct platform_device *pdev, + */ + priv->clk = devm_clk_get(&pdev->dev, "dfsdm"); + if (IS_ERR(priv->clk)) { +- dev_err(&pdev->dev, "No stm32_dfsdm_clk clock found\n"); +- return -EINVAL; ++ ret = PTR_ERR(priv->clk); ++ if (ret != -EPROBE_DEFER) ++ dev_err(&pdev->dev, "Failed to get clock (%d)\n", ret); ++ return ret; + } + + priv->aclk = devm_clk_get(&pdev->dev, "audio"); +diff --git a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +index 53a59957cc54..8a704cd5bddb 100644 +--- a/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c ++++ b/drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +@@ -845,6 +845,25 @@ static const struct iio_chan_spec inv_mpu_channels[] = { + INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z), + }; + ++static const unsigned long inv_mpu_scan_masks[] = { ++ /* 3-axis accel */ ++ BIT(INV_MPU6050_SCAN_ACCL_X) ++ | BIT(INV_MPU6050_SCAN_ACCL_Y) ++ | BIT(INV_MPU6050_SCAN_ACCL_Z), ++ /* 3-axis gyro */ ++ BIT(INV_MPU6050_SCAN_GYRO_X) ++ | BIT(INV_MPU6050_SCAN_GYRO_Y) ++ | BIT(INV_MPU6050_SCAN_GYRO_Z), ++ /* 6-axis accel + gyro */ ++ BIT(INV_MPU6050_SCAN_ACCL_X) ++ | BIT(INV_MPU6050_SCAN_ACCL_Y) ++ | BIT(INV_MPU6050_SCAN_ACCL_Z) ++ | BIT(INV_MPU6050_SCAN_GYRO_X) ++ | BIT(INV_MPU6050_SCAN_GYRO_Y) ++ | BIT(INV_MPU6050_SCAN_GYRO_Z), ++ 0, ++}; ++ + static const struct iio_chan_spec inv_icm20602_channels[] = { + IIO_CHAN_SOFT_TIMESTAMP(INV_ICM20602_SCAN_TIMESTAMP), + { +@@ -871,6 +890,28 @@ static const struct iio_chan_spec inv_icm20602_channels[] = { + INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_ICM20602_SCAN_ACCL_Z), + }; + ++static const unsigned long inv_icm20602_scan_masks[] = { ++ /* 3-axis accel + temp (mandatory) */ ++ BIT(INV_ICM20602_SCAN_ACCL_X) ++ | BIT(INV_ICM20602_SCAN_ACCL_Y) ++ | BIT(INV_ICM20602_SCAN_ACCL_Z) ++ | BIT(INV_ICM20602_SCAN_TEMP), ++ /* 3-axis gyro + temp (mandatory) */ ++ BIT(INV_ICM20602_SCAN_GYRO_X) ++ | BIT(INV_ICM20602_SCAN_GYRO_Y) ++ | BIT(INV_ICM20602_SCAN_GYRO_Z) ++ | BIT(INV_ICM20602_SCAN_TEMP), ++ /* 6-axis accel + gyro + temp (mandatory) */ ++ BIT(INV_ICM20602_SCAN_ACCL_X) ++ | BIT(INV_ICM20602_SCAN_ACCL_Y) ++ | BIT(INV_ICM20602_SCAN_ACCL_Z) ++ | BIT(INV_ICM20602_SCAN_GYRO_X) ++ | BIT(INV_ICM20602_SCAN_GYRO_Y) ++ | BIT(INV_ICM20602_SCAN_GYRO_Z) ++ | BIT(INV_ICM20602_SCAN_TEMP), ++ 0, ++}; ++ + /* + * The user can choose any frequency between INV_MPU6050_MIN_FIFO_RATE and + * INV_MPU6050_MAX_FIFO_RATE, but only these frequencies are matched by the +@@ -1130,9 +1171,11 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, + if (chip_type == INV_ICM20602) { + indio_dev->channels = inv_icm20602_channels; + indio_dev->num_channels = ARRAY_SIZE(inv_icm20602_channels); ++ indio_dev->available_scan_masks = inv_icm20602_scan_masks; + } else { + indio_dev->channels = inv_mpu_channels; + indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels); ++ indio_dev->available_scan_masks = inv_mpu_scan_masks; + } + + indio_dev->info = &mpu_info; +diff --git a/drivers/iio/light/tsl2563.c b/drivers/iio/light/tsl2563.c +index d8c40a83097d..b8d48a092073 100644 +--- a/drivers/iio/light/tsl2563.c ++++ b/drivers/iio/light/tsl2563.c +@@ -273,7 +273,7 @@ static void tsl2563_wait_adc(struct tsl2563_chip *chip) + * TODO: Make sure that we wait at least required delay but why we + * have to extend it one tick more? + */ +- schedule_timeout_interruptible(msecs_to_jiffies(delay) + 2); ++ schedule_msec_hrtimeout_interruptible(delay + 2); + } + + static int tsl2563_adjust_gainlevel(struct tsl2563_chip *chip, u16 adc) +diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c +index 2f7d14159841..2a0f9ce8bb54 100644 +--- a/drivers/infiniband/core/addr.c ++++ b/drivers/infiniband/core/addr.c +@@ -337,7 +337,7 @@ static int dst_fetch_ha(const struct dst_entry *dst, + neigh_event_send(n, NULL); + ret = -ENODATA; + } else { +- memcpy(dev_addr->dst_dev_addr, n->ha, MAX_ADDR_LEN); ++ neigh_ha_snapshot(dev_addr->dst_dev_addr, n, dst->dev); + } + + neigh_release(n); +@@ -817,6 +817,7 @@ int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid, + union { + struct sockaddr_in _sockaddr_in; + struct sockaddr_in6 _sockaddr_in6; ++ struct sockaddr_ib _sockaddr_ib; + } sgid_addr, dgid_addr; + int ret; + +diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c +index 29f7b15c81d9..156d210de195 100644 +--- a/drivers/infiniband/core/device.c ++++ b/drivers/infiniband/core/device.c +@@ -98,6 +98,12 @@ static LIST_HEAD(client_list); + static DEFINE_XARRAY_FLAGS(clients, XA_FLAGS_ALLOC); + static DECLARE_RWSEM(clients_rwsem); + ++static void ib_client_put(struct ib_client *client) ++{ ++ if (refcount_dec_and_test(&client->uses)) ++ complete(&client->uses_zero); ++} ++ + /* + * If client_data is registered then the corresponding client must also still + * be registered. +@@ -650,6 +656,14 @@ static int add_client_context(struct ib_device *device, + return 0; + + down_write(&device->client_data_rwsem); ++ /* ++ * So long as the client is registered hold both the client and device ++ * unregistration locks. ++ */ ++ if (!refcount_inc_not_zero(&client->uses)) ++ goto out_unlock; ++ refcount_inc(&device->refcount); ++ + /* + * Another caller to add_client_context got here first and has already + * completely initialized context. +@@ -673,6 +687,9 @@ static int add_client_context(struct ib_device *device, + return 0; + + out: ++ ib_device_put(device); ++ ib_client_put(client); ++out_unlock: + up_write(&device->client_data_rwsem); + return ret; + } +@@ -692,7 +709,7 @@ static void remove_client_context(struct ib_device *device, + client_data = xa_load(&device->client_data, client_id); + xa_clear_mark(&device->client_data, client_id, CLIENT_DATA_REGISTERED); + client = xa_load(&clients, client_id); +- downgrade_write(&device->client_data_rwsem); ++ up_write(&device->client_data_rwsem); + + /* + * Notice we cannot be holding any exclusive locks when calling the +@@ -702,17 +719,13 @@ static void remove_client_context(struct ib_device *device, + * + * For this reason clients and drivers should not call the + * unregistration functions will holdling any locks. +- * +- * It tempting to drop the client_data_rwsem too, but this is required +- * to ensure that unregister_client does not return until all clients +- * are completely unregistered, which is required to avoid module +- * unloading races. + */ + if (client->remove) + client->remove(device, client_data); + + xa_erase(&device->client_data, client_id); +- up_read(&device->client_data_rwsem); ++ ib_device_put(device); ++ ib_client_put(client); + } + + static int alloc_port_data(struct ib_device *device) +@@ -1696,6 +1709,8 @@ int ib_register_client(struct ib_client *client) + unsigned long index; + int ret; + ++ refcount_set(&client->uses, 1); ++ init_completion(&client->uses_zero); + ret = assign_client_id(client); + if (ret) + return ret; +@@ -1731,16 +1746,29 @@ void ib_unregister_client(struct ib_client *client) + unsigned long index; + + down_write(&clients_rwsem); ++ ib_client_put(client); + xa_clear_mark(&clients, client->client_id, CLIENT_REGISTERED); + up_write(&clients_rwsem); ++ ++ /* We do not want to have locks while calling client->remove() */ ++ rcu_read_lock(); ++ xa_for_each (&devices, index, device) { ++ if (!ib_device_try_get(device)) ++ continue; ++ rcu_read_unlock(); ++ ++ remove_client_context(device, client->client_id); ++ ++ ib_device_put(device); ++ rcu_read_lock(); ++ } ++ rcu_read_unlock(); ++ + /* +- * Every device still known must be serialized to make sure we are +- * done with the client callbacks before we return. ++ * remove_client_context() is not a fence, it can return even though a ++ * removal is ongoing. Wait until all removals are completed. + */ +- down_read(&devices_rwsem); +- xa_for_each (&devices, index, device) +- remove_client_context(device, client->client_id); +- up_read(&devices_rwsem); ++ wait_for_completion(&client->uses_zero); + + down_write(&clients_rwsem); + list_del(&client->list); +diff --git a/drivers/infiniband/core/umem_odp.c b/drivers/infiniband/core/umem_odp.c +index f962b5bbfa40..e4b13a32692a 100644 +--- a/drivers/infiniband/core/umem_odp.c ++++ b/drivers/infiniband/core/umem_odp.c +@@ -151,6 +151,7 @@ static int ib_umem_notifier_invalidate_range_start(struct mmu_notifier *mn, + { + struct ib_ucontext_per_mm *per_mm = + container_of(mn, struct ib_ucontext_per_mm, mn); ++ int rc; + + if (mmu_notifier_range_blockable(range)) + down_read(&per_mm->umem_rwsem); +@@ -167,11 +168,14 @@ static int ib_umem_notifier_invalidate_range_start(struct mmu_notifier *mn, + return 0; + } + +- return rbt_ib_umem_for_each_in_range(&per_mm->umem_tree, range->start, +- range->end, +- invalidate_range_start_trampoline, +- mmu_notifier_range_blockable(range), +- NULL); ++ rc = rbt_ib_umem_for_each_in_range(&per_mm->umem_tree, range->start, ++ range->end, ++ invalidate_range_start_trampoline, ++ mmu_notifier_range_blockable(range), ++ NULL); ++ if (rc) ++ up_read(&per_mm->umem_rwsem); ++ return rc; + } + + static int invalidate_range_end_trampoline(struct ib_umem_odp *item, u64 start, +diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c +index 2c3685faa57a..a4a9f90f2482 100644 +--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c ++++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c +@@ -308,6 +308,7 @@ int bnxt_re_del_gid(const struct ib_gid_attr *attr, void **context) + struct bnxt_re_dev *rdev = to_bnxt_re_dev(attr->device, ibdev); + struct bnxt_qplib_sgid_tbl *sgid_tbl = &rdev->qplib_res.sgid_tbl; + struct bnxt_qplib_gid *gid_to_del; ++ u16 vlan_id = 0xFFFF; + + /* Delete the entry from the hardware */ + ctx = *context; +@@ -317,7 +318,8 @@ int bnxt_re_del_gid(const struct ib_gid_attr *attr, void **context) + if (sgid_tbl && sgid_tbl->active) { + if (ctx->idx >= sgid_tbl->max) + return -EINVAL; +- gid_to_del = &sgid_tbl->tbl[ctx->idx]; ++ gid_to_del = &sgid_tbl->tbl[ctx->idx].gid; ++ vlan_id = sgid_tbl->tbl[ctx->idx].vlan_id; + /* DEL_GID is called in WQ context(netdevice_event_work_handler) + * or via the ib_unregister_device path. In the former case QP1 + * may not be destroyed yet, in which case just return as FW +@@ -335,7 +337,8 @@ int bnxt_re_del_gid(const struct ib_gid_attr *attr, void **context) + } + ctx->refcnt--; + if (!ctx->refcnt) { +- rc = bnxt_qplib_del_sgid(sgid_tbl, gid_to_del, true); ++ rc = bnxt_qplib_del_sgid(sgid_tbl, gid_to_del, ++ vlan_id, true); + if (rc) { + dev_err(rdev_to_dev(rdev), + "Failed to remove GID: %#x", rc); +diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.c b/drivers/infiniband/hw/bnxt_re/qplib_res.c +index 37928b1111df..bdbde8e22420 100644 +--- a/drivers/infiniband/hw/bnxt_re/qplib_res.c ++++ b/drivers/infiniband/hw/bnxt_re/qplib_res.c +@@ -488,7 +488,7 @@ static int bnxt_qplib_alloc_sgid_tbl(struct bnxt_qplib_res *res, + struct bnxt_qplib_sgid_tbl *sgid_tbl, + u16 max) + { +- sgid_tbl->tbl = kcalloc(max, sizeof(struct bnxt_qplib_gid), GFP_KERNEL); ++ sgid_tbl->tbl = kcalloc(max, sizeof(*sgid_tbl->tbl), GFP_KERNEL); + if (!sgid_tbl->tbl) + return -ENOMEM; + +@@ -526,9 +526,10 @@ static void bnxt_qplib_cleanup_sgid_tbl(struct bnxt_qplib_res *res, + for (i = 0; i < sgid_tbl->max; i++) { + if (memcmp(&sgid_tbl->tbl[i], &bnxt_qplib_gid_zero, + sizeof(bnxt_qplib_gid_zero))) +- bnxt_qplib_del_sgid(sgid_tbl, &sgid_tbl->tbl[i], true); ++ bnxt_qplib_del_sgid(sgid_tbl, &sgid_tbl->tbl[i].gid, ++ sgid_tbl->tbl[i].vlan_id, true); + } +- memset(sgid_tbl->tbl, 0, sizeof(struct bnxt_qplib_gid) * sgid_tbl->max); ++ memset(sgid_tbl->tbl, 0, sizeof(*sgid_tbl->tbl) * sgid_tbl->max); + memset(sgid_tbl->hw_id, -1, sizeof(u16) * sgid_tbl->max); + memset(sgid_tbl->vlan, 0, sizeof(u8) * sgid_tbl->max); + sgid_tbl->active = 0; +@@ -537,7 +538,11 @@ static void bnxt_qplib_cleanup_sgid_tbl(struct bnxt_qplib_res *res, + static void bnxt_qplib_init_sgid_tbl(struct bnxt_qplib_sgid_tbl *sgid_tbl, + struct net_device *netdev) + { +- memset(sgid_tbl->tbl, 0, sizeof(struct bnxt_qplib_gid) * sgid_tbl->max); ++ u32 i; ++ ++ for (i = 0; i < sgid_tbl->max; i++) ++ sgid_tbl->tbl[i].vlan_id = 0xffff; ++ + memset(sgid_tbl->hw_id, -1, sizeof(u16) * sgid_tbl->max); + } + +diff --git a/drivers/infiniband/hw/bnxt_re/qplib_res.h b/drivers/infiniband/hw/bnxt_re/qplib_res.h +index 30c42c92fac7..fbda11a7ab1a 100644 +--- a/drivers/infiniband/hw/bnxt_re/qplib_res.h ++++ b/drivers/infiniband/hw/bnxt_re/qplib_res.h +@@ -111,7 +111,7 @@ struct bnxt_qplib_pd_tbl { + }; + + struct bnxt_qplib_sgid_tbl { +- struct bnxt_qplib_gid *tbl; ++ struct bnxt_qplib_gid_info *tbl; + u16 *hw_id; + u16 max; + u16 active; +diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.c b/drivers/infiniband/hw/bnxt_re/qplib_sp.c +index 48793d3512ac..40296b97d21e 100644 +--- a/drivers/infiniband/hw/bnxt_re/qplib_sp.c ++++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.c +@@ -213,12 +213,12 @@ int bnxt_qplib_get_sgid(struct bnxt_qplib_res *res, + index, sgid_tbl->max); + return -EINVAL; + } +- memcpy(gid, &sgid_tbl->tbl[index], sizeof(*gid)); ++ memcpy(gid, &sgid_tbl->tbl[index].gid, sizeof(*gid)); + return 0; + } + + int bnxt_qplib_del_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, +- struct bnxt_qplib_gid *gid, bool update) ++ struct bnxt_qplib_gid *gid, u16 vlan_id, bool update) + { + struct bnxt_qplib_res *res = to_bnxt_qplib(sgid_tbl, + struct bnxt_qplib_res, +@@ -236,7 +236,8 @@ int bnxt_qplib_del_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, + return -ENOMEM; + } + for (index = 0; index < sgid_tbl->max; index++) { +- if (!memcmp(&sgid_tbl->tbl[index], gid, sizeof(*gid))) ++ if (!memcmp(&sgid_tbl->tbl[index].gid, gid, sizeof(*gid)) && ++ vlan_id == sgid_tbl->tbl[index].vlan_id) + break; + } + if (index == sgid_tbl->max) { +@@ -262,8 +263,9 @@ int bnxt_qplib_del_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, + if (rc) + return rc; + } +- memcpy(&sgid_tbl->tbl[index], &bnxt_qplib_gid_zero, ++ memcpy(&sgid_tbl->tbl[index].gid, &bnxt_qplib_gid_zero, + sizeof(bnxt_qplib_gid_zero)); ++ sgid_tbl->tbl[index].vlan_id = 0xFFFF; + sgid_tbl->vlan[index] = 0; + sgid_tbl->active--; + dev_dbg(&res->pdev->dev, +@@ -296,7 +298,8 @@ int bnxt_qplib_add_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, + } + free_idx = sgid_tbl->max; + for (i = 0; i < sgid_tbl->max; i++) { +- if (!memcmp(&sgid_tbl->tbl[i], gid, sizeof(*gid))) { ++ if (!memcmp(&sgid_tbl->tbl[i], gid, sizeof(*gid)) && ++ sgid_tbl->tbl[i].vlan_id == vlan_id) { + dev_dbg(&res->pdev->dev, + "SGID entry already exist in entry %d!\n", i); + *index = i; +@@ -351,6 +354,7 @@ int bnxt_qplib_add_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, + } + /* Add GID to the sgid_tbl */ + memcpy(&sgid_tbl->tbl[free_idx], gid, sizeof(*gid)); ++ sgid_tbl->tbl[free_idx].vlan_id = vlan_id; + sgid_tbl->active++; + if (vlan_id != 0xFFFF) + sgid_tbl->vlan[free_idx] = 1; +diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.h b/drivers/infiniband/hw/bnxt_re/qplib_sp.h +index 0ec3b12b0bcd..13d9432d5ce2 100644 +--- a/drivers/infiniband/hw/bnxt_re/qplib_sp.h ++++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.h +@@ -84,6 +84,11 @@ struct bnxt_qplib_gid { + u8 data[16]; + }; + ++struct bnxt_qplib_gid_info { ++ struct bnxt_qplib_gid gid; ++ u16 vlan_id; ++}; ++ + struct bnxt_qplib_ah { + struct bnxt_qplib_gid dgid; + struct bnxt_qplib_pd *pd; +@@ -221,7 +226,7 @@ int bnxt_qplib_get_sgid(struct bnxt_qplib_res *res, + struct bnxt_qplib_sgid_tbl *sgid_tbl, int index, + struct bnxt_qplib_gid *gid); + int bnxt_qplib_del_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, +- struct bnxt_qplib_gid *gid, bool update); ++ struct bnxt_qplib_gid *gid, u16 vlan_id, bool update); + int bnxt_qplib_add_sgid(struct bnxt_qplib_sgid_tbl *sgid_tbl, + struct bnxt_qplib_gid *gid, u8 *mac, u16 vlan_id, + bool update, u32 *index); +diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c +index d5b643a1d9fd..67052dc3100c 100644 +--- a/drivers/infiniband/hw/hfi1/chip.c ++++ b/drivers/infiniband/hw/hfi1/chip.c +@@ -14452,7 +14452,7 @@ void hfi1_deinit_vnic_rsm(struct hfi1_devdata *dd) + clear_rcvctrl(dd, RCV_CTRL_RCV_RSM_ENABLE_SMASK); + } + +-static void init_rxe(struct hfi1_devdata *dd) ++static int init_rxe(struct hfi1_devdata *dd) + { + struct rsm_map_table *rmt; + u64 val; +@@ -14461,6 +14461,9 @@ static void init_rxe(struct hfi1_devdata *dd) + write_csr(dd, RCV_ERR_MASK, ~0ull); + + rmt = alloc_rsm_map_table(dd); ++ if (!rmt) ++ return -ENOMEM; ++ + /* set up QOS, including the QPN map table */ + init_qos(dd, rmt); + init_fecn_handling(dd, rmt); +@@ -14487,6 +14490,7 @@ static void init_rxe(struct hfi1_devdata *dd) + val |= ((4ull & RCV_BYPASS_HDR_SIZE_MASK) << + RCV_BYPASS_HDR_SIZE_SHIFT); + write_csr(dd, RCV_BYPASS, val); ++ return 0; + } + + static void init_other(struct hfi1_devdata *dd) +@@ -15024,7 +15028,10 @@ int hfi1_init_dd(struct hfi1_devdata *dd) + goto bail_cleanup; + + /* set initial RXE CSRs */ +- init_rxe(dd); ++ ret = init_rxe(dd); ++ if (ret) ++ goto bail_cleanup; ++ + /* set initial TXE CSRs */ + init_txe(dd); + /* set initial non-RXE, non-TXE CSRs */ +diff --git a/drivers/infiniband/hw/hfi1/tid_rdma.c b/drivers/infiniband/hw/hfi1/tid_rdma.c +index aa9c8d3ef87b..fe7e7097e00a 100644 +--- a/drivers/infiniband/hw/hfi1/tid_rdma.c ++++ b/drivers/infiniband/hw/hfi1/tid_rdma.c +@@ -1620,6 +1620,7 @@ static int hfi1_kern_exp_rcv_alloc_flows(struct tid_rdma_request *req, + flows[i].req = req; + flows[i].npagesets = 0; + flows[i].pagesets[0].mapped = 0; ++ flows[i].resync_npkts = 0; + } + req->flows = flows; + return 0; +@@ -1673,34 +1674,6 @@ static struct tid_rdma_flow *find_flow_ib(struct tid_rdma_request *req, + return NULL; + } + +-static struct tid_rdma_flow * +-__find_flow_ranged(struct tid_rdma_request *req, u16 head, u16 tail, +- u32 psn, u16 *fidx) +-{ +- for ( ; CIRC_CNT(head, tail, MAX_FLOWS); +- tail = CIRC_NEXT(tail, MAX_FLOWS)) { +- struct tid_rdma_flow *flow = &req->flows[tail]; +- u32 spsn, lpsn; +- +- spsn = full_flow_psn(flow, flow->flow_state.spsn); +- lpsn = full_flow_psn(flow, flow->flow_state.lpsn); +- +- if (cmp_psn(psn, spsn) >= 0 && cmp_psn(psn, lpsn) <= 0) { +- if (fidx) +- *fidx = tail; +- return flow; +- } +- } +- return NULL; +-} +- +-static struct tid_rdma_flow *find_flow(struct tid_rdma_request *req, +- u32 psn, u16 *fidx) +-{ +- return __find_flow_ranged(req, req->setup_head, req->clear_tail, psn, +- fidx); +-} +- + /* TID RDMA READ functions */ + u32 hfi1_build_tid_rdma_read_packet(struct rvt_swqe *wqe, + struct ib_other_headers *ohdr, u32 *bth1, +@@ -2790,19 +2763,7 @@ static bool handle_read_kdeth_eflags(struct hfi1_ctxtdata *rcd, + * to prevent continuous Flow Sequence errors for any + * packets that could be still in the fabric. + */ +- flow = find_flow(req, psn, NULL); +- if (!flow) { +- /* +- * We can't find the IB PSN matching the +- * received KDETH PSN. The only thing we can +- * do at this point is report the error to +- * the QP. +- */ +- hfi1_kern_read_tid_flow_free(qp); +- spin_unlock(&qp->s_lock); +- rvt_rc_error(qp, IB_WC_LOC_QP_OP_ERR); +- return ret; +- } ++ flow = &req->flows[req->clear_tail]; + if (priv->s_flags & HFI1_R_TID_SW_PSN) { + diff = cmp_psn(psn, + flow->flow_state.r_next_psn); +diff --git a/drivers/infiniband/hw/hfi1/verbs.c b/drivers/infiniband/hw/hfi1/verbs.c +index bad3229bad37..27f86b436b9e 100644 +--- a/drivers/infiniband/hw/hfi1/verbs.c ++++ b/drivers/infiniband/hw/hfi1/verbs.c +@@ -54,6 +54,7 @@ + #include + #include + #include ++#include + + #include "hfi.h" + #include "common.h" +@@ -1536,6 +1537,7 @@ static int hfi1_check_ah(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr) + sl = rdma_ah_get_sl(ah_attr); + if (sl >= ARRAY_SIZE(ibp->sl_to_sc)) + return -EINVAL; ++ sl = array_index_nospec(sl, ARRAY_SIZE(ibp->sl_to_sc)); + + sc5 = ibp->sl_to_sc[sl]; + if (sc_to_vlt(dd, sc5) > num_vls && sc_to_vlt(dd, sc5) != 0xf) +diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c +index 5689d742bafb..4c88d6f72574 100644 +--- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c ++++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c +@@ -772,6 +772,8 @@ static int i40iw_query_qp(struct ib_qp *ibqp, + struct i40iw_qp *iwqp = to_iwqp(ibqp); + struct i40iw_sc_qp *qp = &iwqp->sc_qp; + ++ attr->qp_state = iwqp->ibqp_state; ++ attr->cur_qp_state = attr->qp_state; + attr->qp_access_flags = 0; + attr->cap.max_send_wr = qp->qp_uk.sq_size; + attr->cap.max_recv_wr = qp->qp_uk.rq_size; +diff --git a/drivers/infiniband/hw/mlx5/mad.c b/drivers/infiniband/hw/mlx5/mad.c +index 6c529e6f3a01..348c1df69cdc 100644 +--- a/drivers/infiniband/hw/mlx5/mad.c ++++ b/drivers/infiniband/hw/mlx5/mad.c +@@ -200,19 +200,33 @@ static void pma_cnt_assign(struct ib_pma_portcounters *pma_cnt, + vl_15_dropped); + } + +-static int process_pma_cmd(struct mlx5_core_dev *mdev, u8 port_num, ++static int process_pma_cmd(struct mlx5_ib_dev *dev, u8 port_num, + const struct ib_mad *in_mad, struct ib_mad *out_mad) + { +- int err; ++ struct mlx5_core_dev *mdev; ++ bool native_port = true; ++ u8 mdev_port_num; + void *out_cnt; ++ int err; + ++ mdev = mlx5_ib_get_native_port_mdev(dev, port_num, &mdev_port_num); ++ if (!mdev) { ++ /* Fail to get the native port, likely due to 2nd port is still ++ * unaffiliated. In such case default to 1st port and attached ++ * PF device. ++ */ ++ native_port = false; ++ mdev = dev->mdev; ++ mdev_port_num = 1; ++ } + /* Declaring support of extended counters */ + if (in_mad->mad_hdr.attr_id == IB_PMA_CLASS_PORT_INFO) { + struct ib_class_port_info cpi = {}; + + cpi.capability_mask = IB_PMA_CLASS_CAP_EXT_WIDTH; + memcpy((out_mad->data + 40), &cpi, sizeof(cpi)); +- return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY; ++ err = IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY; ++ goto done; + } + + if (in_mad->mad_hdr.attr_id == IB_PMA_PORT_COUNTERS_EXT) { +@@ -221,11 +235,13 @@ static int process_pma_cmd(struct mlx5_core_dev *mdev, u8 port_num, + int sz = MLX5_ST_SZ_BYTES(query_vport_counter_out); + + out_cnt = kvzalloc(sz, GFP_KERNEL); +- if (!out_cnt) +- return IB_MAD_RESULT_FAILURE; ++ if (!out_cnt) { ++ err = IB_MAD_RESULT_FAILURE; ++ goto done; ++ } + + err = mlx5_core_query_vport_counter(mdev, 0, 0, +- port_num, out_cnt, sz); ++ mdev_port_num, out_cnt, sz); + if (!err) + pma_cnt_ext_assign(pma_cnt_ext, out_cnt); + } else { +@@ -234,20 +250,23 @@ static int process_pma_cmd(struct mlx5_core_dev *mdev, u8 port_num, + int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); + + out_cnt = kvzalloc(sz, GFP_KERNEL); +- if (!out_cnt) +- return IB_MAD_RESULT_FAILURE; ++ if (!out_cnt) { ++ err = IB_MAD_RESULT_FAILURE; ++ goto done; ++ } + +- err = mlx5_core_query_ib_ppcnt(mdev, port_num, ++ err = mlx5_core_query_ib_ppcnt(mdev, mdev_port_num, + out_cnt, sz); + if (!err) + pma_cnt_assign(pma_cnt, out_cnt); +- } +- ++ } + kvfree(out_cnt); +- if (err) +- return IB_MAD_RESULT_FAILURE; +- +- return IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY; ++ err = err ? IB_MAD_RESULT_FAILURE : ++ IB_MAD_RESULT_SUCCESS | IB_MAD_RESULT_REPLY; ++done: ++ if (native_port) ++ mlx5_ib_put_native_port_mdev(dev, port_num); ++ return err; + } + + int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, +@@ -259,8 +278,6 @@ int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, + struct mlx5_ib_dev *dev = to_mdev(ibdev); + const struct ib_mad *in_mad = (const struct ib_mad *)in; + struct ib_mad *out_mad = (struct ib_mad *)out; +- struct mlx5_core_dev *mdev; +- u8 mdev_port_num; + int ret; + + if (WARN_ON_ONCE(in_mad_size != sizeof(*in_mad) || +@@ -269,19 +286,14 @@ int mlx5_ib_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num, + + memset(out_mad->data, 0, sizeof(out_mad->data)); + +- mdev = mlx5_ib_get_native_port_mdev(dev, port_num, &mdev_port_num); +- if (!mdev) +- return IB_MAD_RESULT_FAILURE; +- +- if (MLX5_CAP_GEN(mdev, vport_counters) && ++ if (MLX5_CAP_GEN(dev->mdev, vport_counters) && + in_mad->mad_hdr.mgmt_class == IB_MGMT_CLASS_PERF_MGMT && + in_mad->mad_hdr.method == IB_MGMT_METHOD_GET) { +- ret = process_pma_cmd(mdev, mdev_port_num, in_mad, out_mad); ++ ret = process_pma_cmd(dev, port_num, in_mad, out_mad); + } else { + ret = process_mad(ibdev, mad_flags, port_num, in_wc, in_grh, + in_mad, out_mad); + } +- mlx5_ib_put_native_port_mdev(dev, port_num); + return ret; + } + +diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c +index 340290b883fe..a6713a3b6c80 100644 +--- a/drivers/infiniband/hw/mlx5/main.c ++++ b/drivers/infiniband/hw/mlx5/main.c +@@ -1043,15 +1043,19 @@ static int mlx5_ib_query_device(struct ib_device *ibdev, + } + + if (MLX5_CAP_GEN(mdev, tag_matching)) { +- props->tm_caps.max_rndv_hdr_size = MLX5_TM_MAX_RNDV_MSG_SIZE; + props->tm_caps.max_num_tags = + (1 << MLX5_CAP_GEN(mdev, log_tag_matching_list_sz)) - 1; +- props->tm_caps.flags = IB_TM_CAP_RC; + props->tm_caps.max_ops = + 1 << MLX5_CAP_GEN(mdev, log_max_qp_sz); + props->tm_caps.max_sge = MLX5_TM_MAX_SGE; + } + ++ if (MLX5_CAP_GEN(mdev, tag_matching) && ++ MLX5_CAP_GEN(mdev, rndv_offload_rc)) { ++ props->tm_caps.flags = IB_TM_CAP_RNDV_RC; ++ props->tm_caps.max_rndv_hdr_size = MLX5_TM_MAX_RNDV_MSG_SIZE; ++ } ++ + if (MLX5_CAP_GEN(dev->mdev, cq_moderation)) { + props->cq_caps.max_cq_moderation_count = + MLX5_MAX_CQ_COUNT; +diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h +index 40eb8be482e4..f52b845f2f7b 100644 +--- a/drivers/infiniband/hw/mlx5/mlx5_ib.h ++++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h +@@ -480,6 +480,7 @@ struct mlx5_umr_wr { + u64 length; + int access_flags; + u32 mkey; ++ u8 ignore_free_state:1; + }; + + static inline const struct mlx5_umr_wr *umr_wr(const struct ib_send_wr *wr) +diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c +index 5f09699fab98..e54bec2c2965 100644 +--- a/drivers/infiniband/hw/mlx5/mr.c ++++ b/drivers/infiniband/hw/mlx5/mr.c +@@ -545,13 +545,16 @@ void mlx5_mr_cache_free(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) + return; + + c = order2idx(dev, mr->order); +- if (c < 0 || c >= MAX_MR_CACHE_ENTRIES) { +- mlx5_ib_warn(dev, "order %d, cache index %d\n", mr->order, c); +- return; +- } ++ WARN_ON(c < 0 || c >= MAX_MR_CACHE_ENTRIES); + +- if (unreg_umr(dev, mr)) ++ if (unreg_umr(dev, mr)) { ++ mr->allocated_from_cache = false; ++ destroy_mkey(dev, mr); ++ ent = &cache->ent[c]; ++ if (ent->cur < ent->limit) ++ queue_work(cache->wq, &ent->work); + return; ++ } + + ent = &cache->ent[c]; + spin_lock_irq(&ent->lock); +@@ -1373,9 +1376,11 @@ static int unreg_umr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) + return 0; + + umrwr.wr.send_flags = MLX5_IB_SEND_UMR_DISABLE_MR | +- MLX5_IB_SEND_UMR_FAIL_IF_FREE; ++ MLX5_IB_SEND_UMR_UPDATE_PD_ACCESS; + umrwr.wr.opcode = MLX5_IB_WR_UMR; ++ umrwr.pd = dev->umrc.pd; + umrwr.mkey = mr->mmkey.key; ++ umrwr.ignore_free_state = 1; + + return mlx5_ib_post_send_wait(dev, &umrwr); + } +@@ -1578,10 +1583,10 @@ static void clean_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) + mr->sig = NULL; + } + +- mlx5_free_priv_descs(mr); +- +- if (!allocated_from_cache) ++ if (!allocated_from_cache) { + destroy_mkey(dev, mr); ++ mlx5_free_priv_descs(mr); ++ } + } + + static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr) +diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c +index f6623c77443a..6dbca72a73b1 100644 +--- a/drivers/infiniband/hw/mlx5/qp.c ++++ b/drivers/infiniband/hw/mlx5/qp.c +@@ -1718,7 +1718,6 @@ static int create_rss_raw_qp_tir(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, + } + + MLX5_SET(tirc, tirc, rx_hash_fn, MLX5_RX_HASH_FN_TOEPLITZ); +- MLX5_SET(tirc, tirc, rx_hash_symmetric, 1); + memcpy(rss_key, ucmd.rx_hash_key, len); + break; + } +@@ -4262,10 +4261,14 @@ static int set_reg_umr_segment(struct mlx5_ib_dev *dev, + + memset(umr, 0, sizeof(*umr)); + +- if (wr->send_flags & MLX5_IB_SEND_UMR_FAIL_IF_FREE) +- umr->flags = MLX5_UMR_CHECK_FREE; /* fail if free */ +- else +- umr->flags = MLX5_UMR_CHECK_NOT_FREE; /* fail if not free */ ++ if (!umrwr->ignore_free_state) { ++ if (wr->send_flags & MLX5_IB_SEND_UMR_FAIL_IF_FREE) ++ /* fail if free */ ++ umr->flags = MLX5_UMR_CHECK_FREE; ++ else ++ /* fail if not free */ ++ umr->flags = MLX5_UMR_CHECK_NOT_FREE; ++ } + + umr->xlt_octowords = cpu_to_be16(get_xlt_octo(umrwr->xlt_size)); + if (wr->send_flags & MLX5_IB_SEND_UMR_UPDATE_XLT) { +diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c +index aca9f60f9b21..1cbfbd98eb22 100644 +--- a/drivers/infiniband/sw/rxe/rxe_resp.c ++++ b/drivers/infiniband/sw/rxe/rxe_resp.c +@@ -431,6 +431,7 @@ static enum resp_states check_rkey(struct rxe_qp *qp, + qp->resp.va = reth_va(pkt); + qp->resp.rkey = reth_rkey(pkt); + qp->resp.resid = reth_len(pkt); ++ qp->resp.length = reth_len(pkt); + } + access = (pkt->mask & RXE_READ_MASK) ? IB_ACCESS_REMOTE_READ + : IB_ACCESS_REMOTE_WRITE; +@@ -856,7 +857,9 @@ static enum resp_states do_complete(struct rxe_qp *qp, + pkt->mask & RXE_WRITE_MASK) ? + IB_WC_RECV_RDMA_WITH_IMM : IB_WC_RECV; + wc->vendor_err = 0; +- wc->byte_len = wqe->dma.length - wqe->dma.resid; ++ wc->byte_len = (pkt->mask & RXE_IMMDT_MASK && ++ pkt->mask & RXE_WRITE_MASK) ? ++ qp->resp.length : wqe->dma.length - wqe->dma.resid; + + /* fields after byte_len are different between kernel and user + * space +diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h +index e8be7f44e3be..28bfb3ece104 100644 +--- a/drivers/infiniband/sw/rxe/rxe_verbs.h ++++ b/drivers/infiniband/sw/rxe/rxe_verbs.h +@@ -213,6 +213,7 @@ struct rxe_resp_info { + struct rxe_mem *mr; + u32 resid; + u32 rkey; ++ u32 length; + u64 atomic_orig; + + /* SRQ only */ +diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c +index 9b5e11d3fb85..ac0583ff280d 100644 +--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c ++++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c +@@ -1893,12 +1893,6 @@ static void ipoib_child_init(struct net_device *ndev) + struct ipoib_dev_priv *priv = ipoib_priv(ndev); + struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent); + +- dev_hold(priv->parent); +- +- down_write(&ppriv->vlan_rwsem); +- list_add_tail(&priv->list, &ppriv->child_intfs); +- up_write(&ppriv->vlan_rwsem); +- + priv->max_ib_mtu = ppriv->max_ib_mtu; + set_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags); + memcpy(priv->dev->dev_addr, ppriv->dev->dev_addr, INFINIBAND_ALEN); +@@ -1941,6 +1935,17 @@ static int ipoib_ndo_init(struct net_device *ndev) + if (rc) { + pr_warn("%s: failed to initialize device: %s port %d (ret = %d)\n", + priv->ca->name, priv->dev->name, priv->port, rc); ++ return rc; ++ } ++ ++ if (priv->parent) { ++ struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent); ++ ++ dev_hold(priv->parent); ++ ++ down_write(&ppriv->vlan_rwsem); ++ list_add_tail(&priv->list, &ppriv->child_intfs); ++ up_write(&ppriv->vlan_rwsem); + } + + return 0; +@@ -1958,6 +1963,14 @@ static void ipoib_ndo_uninit(struct net_device *dev) + */ + WARN_ON(!list_empty(&priv->child_intfs)); + ++ if (priv->parent) { ++ struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent); ++ ++ down_write(&ppriv->vlan_rwsem); ++ list_del(&priv->list); ++ up_write(&ppriv->vlan_rwsem); ++ } ++ + ipoib_neigh_hash_uninit(dev); + + ipoib_ib_dev_cleanup(dev); +@@ -1969,15 +1982,8 @@ static void ipoib_ndo_uninit(struct net_device *dev) + priv->wq = NULL; + } + +- if (priv->parent) { +- struct ipoib_dev_priv *ppriv = ipoib_priv(priv->parent); +- +- down_write(&ppriv->vlan_rwsem); +- list_del(&priv->list); +- up_write(&ppriv->vlan_rwsem); +- ++ if (priv->parent) + dev_put(priv->parent); +- } + } + + static int ipoib_set_vf_link_state(struct net_device *dev, int vf, int link_state) +@@ -1998,6 +2004,7 @@ static int ipoib_get_vf_config(struct net_device *dev, int vf, + return err; + + ivf->vf = vf; ++ memcpy(ivf->mac, dev->dev_addr, dev->addr_len); + + return 0; + } +diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c +index 4305da2c9037..0b09d0cd9b3c 100644 +--- a/drivers/infiniband/ulp/srp/ib_srp.c ++++ b/drivers/infiniband/ulp/srp/ib_srp.c +@@ -3483,13 +3483,14 @@ static const match_table_t srp_opt_tokens = { + * @net: [in] Network namespace. + * @sa: [out] Address family, IP address and port number. + * @addr_port_str: [in] IP address and port number. ++ * @has_port: [out] Whether or not @addr_port_str includes a port number. + * + * Parse the following address formats: + * - IPv4: :, e.g. 1.2.3.4:5. + * - IPv6: \[\]:, e.g. [1::2:3%4]:5. + */ + static int srp_parse_in(struct net *net, struct sockaddr_storage *sa, +- const char *addr_port_str) ++ const char *addr_port_str, bool *has_port) + { + char *addr_end, *addr = kstrdup(addr_port_str, GFP_KERNEL); + char *port_str; +@@ -3498,9 +3499,12 @@ static int srp_parse_in(struct net *net, struct sockaddr_storage *sa, + if (!addr) + return -ENOMEM; + port_str = strrchr(addr, ':'); +- if (!port_str) +- return -EINVAL; +- *port_str++ = '\0'; ++ if (port_str && strchr(port_str, ']')) ++ port_str = NULL; ++ if (port_str) ++ *port_str++ = '\0'; ++ if (has_port) ++ *has_port = port_str != NULL; + ret = inet_pton_with_scope(net, AF_INET, addr, port_str, sa); + if (ret && addr[0]) { + addr_end = addr + strlen(addr) - 1; +@@ -3522,6 +3526,7 @@ static int srp_parse_options(struct net *net, const char *buf, + char *p; + substring_t args[MAX_OPT_ARGS]; + unsigned long long ull; ++ bool has_port; + int opt_mask = 0; + int token; + int ret = -EINVAL; +@@ -3620,7 +3625,8 @@ static int srp_parse_options(struct net *net, const char *buf, + ret = -ENOMEM; + goto out; + } +- ret = srp_parse_in(net, &target->rdma_cm.src.ss, p); ++ ret = srp_parse_in(net, &target->rdma_cm.src.ss, p, ++ NULL); + if (ret < 0) { + pr_warn("bad source parameter '%s'\n", p); + kfree(p); +@@ -3636,7 +3642,10 @@ static int srp_parse_options(struct net *net, const char *buf, + ret = -ENOMEM; + goto out; + } +- ret = srp_parse_in(net, &target->rdma_cm.dst.ss, p); ++ ret = srp_parse_in(net, &target->rdma_cm.dst.ss, p, ++ &has_port); ++ if (!has_port) ++ ret = -EINVAL; + if (ret < 0) { + pr_warn("bad dest parameter '%s'\n", p); + kfree(p); +diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c +index 8996323ce8d9..34700eda0429 100644 +--- a/drivers/input/mouse/alps.c ++++ b/drivers/input/mouse/alps.c +@@ -21,6 +21,7 @@ + + #include "psmouse.h" + #include "alps.h" ++#include "trackpoint.h" + + /* + * Definitions for ALPS version 3 and 4 command mode protocol +@@ -2861,6 +2862,23 @@ static const struct alps_protocol_info *alps_match_table(unsigned char *e7, + return NULL; + } + ++static bool alps_is_cs19_trackpoint(struct psmouse *psmouse) ++{ ++ u8 param[2] = { 0 }; ++ ++ if (ps2_command(&psmouse->ps2dev, ++ param, MAKE_PS2_CMD(0, 2, TP_READ_ID))) ++ return false; ++ ++ /* ++ * param[0] contains the trackpoint device variant_id while ++ * param[1] contains the firmware_id. So far all alps ++ * trackpoint-only devices have their variant_ids equal ++ * TP_VARIANT_ALPS and their firmware_ids are in 0x20~0x2f range. ++ */ ++ return param[0] == TP_VARIANT_ALPS && ((param[1] & 0xf0) == 0x20); ++} ++ + static int alps_identify(struct psmouse *psmouse, struct alps_data *priv) + { + const struct alps_protocol_info *protocol; +@@ -3161,6 +3179,20 @@ int alps_detect(struct psmouse *psmouse, bool set_properties) + if (error) + return error; + ++ /* ++ * ALPS cs19 is a trackpoint-only device, and uses different ++ * protocol than DualPoint ones, so we return -EINVAL here and let ++ * trackpoint.c drive this device. If the trackpoint driver is not ++ * enabled, the device will fall back to a bare PS/2 mouse. ++ * If ps2_command() fails here, we depend on the immediately ++ * followed psmouse_reset() to reset the device to normal state. ++ */ ++ if (alps_is_cs19_trackpoint(psmouse)) { ++ psmouse_dbg(psmouse, ++ "ALPS CS19 trackpoint-only device detected, ignoring\n"); ++ return -EINVAL; ++ } ++ + /* + * Reset the device to make sure it is fully operational: + * on some laptops, like certain Dell Latitudes, we may +diff --git a/drivers/input/mouse/elantech.c b/drivers/input/mouse/elantech.c +index a4345052abd2..a47c7add4e0e 100644 +--- a/drivers/input/mouse/elantech.c ++++ b/drivers/input/mouse/elantech.c +@@ -1807,6 +1807,30 @@ static int elantech_create_smbus(struct psmouse *psmouse, + leave_breadcrumbs); + } + ++static bool elantech_use_host_notify(struct psmouse *psmouse, ++ struct elantech_device_info *info) ++{ ++ if (ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version)) ++ return true; ++ ++ switch (info->bus) { ++ case ETP_BUS_PS2_ONLY: ++ /* expected case */ ++ break; ++ case ETP_BUS_SMB_HST_NTFY_ONLY: ++ case ETP_BUS_PS2_SMB_HST_NTFY: ++ /* SMbus implementation is stable since 2018 */ ++ if (dmi_get_bios_year() >= 2018) ++ return true; ++ default: ++ psmouse_dbg(psmouse, ++ "Ignoring SMBus bus provider %d\n", info->bus); ++ break; ++ } ++ ++ return false; ++} ++ + /** + * elantech_setup_smbus - called once the PS/2 devices are enumerated + * and decides to instantiate a SMBus InterTouch device. +@@ -1826,7 +1850,7 @@ static int elantech_setup_smbus(struct psmouse *psmouse, + * i2c_blacklist_pnp_ids. + * Old ICs are up to the user to decide. + */ +- if (!ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version) || ++ if (!elantech_use_host_notify(psmouse, info) || + psmouse_matches_pnp_id(psmouse, i2c_blacklist_pnp_ids)) + return -ENXIO; + } +@@ -1846,34 +1870,6 @@ static int elantech_setup_smbus(struct psmouse *psmouse, + return 0; + } + +-static bool elantech_use_host_notify(struct psmouse *psmouse, +- struct elantech_device_info *info) +-{ +- if (ETP_NEW_IC_SMBUS_HOST_NOTIFY(info->fw_version)) +- return true; +- +- switch (info->bus) { +- case ETP_BUS_PS2_ONLY: +- /* expected case */ +- break; +- case ETP_BUS_SMB_ALERT_ONLY: +- /* fall-through */ +- case ETP_BUS_PS2_SMB_ALERT: +- psmouse_dbg(psmouse, "Ignoring SMBus provider through alert protocol.\n"); +- break; +- case ETP_BUS_SMB_HST_NTFY_ONLY: +- /* fall-through */ +- case ETP_BUS_PS2_SMB_HST_NTFY: +- return true; +- default: +- psmouse_dbg(psmouse, +- "Ignoring SMBus bus provider %d.\n", +- info->bus); +- } +- +- return false; +-} +- + int elantech_init_smbus(struct psmouse *psmouse) + { + struct elantech_device_info info; +diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c +index b8ec301025b7..d0e32ae71312 100644 +--- a/drivers/input/mouse/synaptics.c ++++ b/drivers/input/mouse/synaptics.c +@@ -173,13 +173,16 @@ static const char * const smbus_pnp_ids[] = { + "LEN0072", /* X1 Carbon Gen 5 (2017) - Elan/ALPS trackpoint */ + "LEN0073", /* X1 Carbon G5 (Elantech) */ + "LEN0092", /* X1 Carbon 6 */ ++ "LEN0093", /* T480 */ + "LEN0096", /* X280 */ + "LEN0097", /* X280 -> ALPS trackpoint */ ++ "LEN009b", /* T580 */ + "LEN200f", /* T450s */ + "LEN2054", /* E480 */ + "LEN2055", /* E580 */ + "SYN3052", /* HP EliteBook 840 G4 */ + "SYN3221", /* HP 15-ay000 */ ++ "SYN323d", /* HP Spectre X360 13-w013dx */ + NULL + }; + +@@ -1339,7 +1342,9 @@ static int set_input_params(struct psmouse *psmouse, + if (psmouse_matches_pnp_id(psmouse, topbuttonpad_pnp_ids) && + !SYN_CAP_EXT_BUTTONS_STICK(info->ext_cap_10)) + __set_bit(INPUT_PROP_TOPBUTTONPAD, dev->propbit); +- } ++ } else if (SYN_CAP_CLICKPAD2BTN(info->ext_cap_0c) || ++ SYN_CAP_CLICKPAD2BTN2(info->ext_cap_0c)) ++ __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); + + return 0; + } +diff --git a/drivers/input/mouse/synaptics.h b/drivers/input/mouse/synaptics.h +index 08533d1b1b16..e85f840a27b3 100644 +--- a/drivers/input/mouse/synaptics.h ++++ b/drivers/input/mouse/synaptics.h +@@ -83,6 +83,7 @@ + */ + #define SYN_CAP_CLICKPAD(ex0c) ((ex0c) & BIT(20)) /* 1-button ClickPad */ + #define SYN_CAP_CLICKPAD2BTN(ex0c) ((ex0c) & BIT(8)) /* 2-button ClickPad */ ++#define SYN_CAP_CLICKPAD2BTN2(ex0c) ((ex0c) & BIT(21)) /* 2-button ClickPad */ + #define SYN_CAP_MAX_DIMENSIONS(ex0c) ((ex0c) & BIT(17)) + #define SYN_CAP_MIN_DIMENSIONS(ex0c) ((ex0c) & BIT(13)) + #define SYN_CAP_ADV_GESTURE(ex0c) ((ex0c) & BIT(19)) +diff --git a/drivers/input/tablet/gtco.c b/drivers/input/tablet/gtco.c +index 4b8b9d7aa75e..35031228a6d0 100644 +--- a/drivers/input/tablet/gtco.c ++++ b/drivers/input/tablet/gtco.c +@@ -78,6 +78,7 @@ Scott Hill shill@gtcocalcomp.com + + /* Max size of a single report */ + #define REPORT_MAX_SIZE 10 ++#define MAX_COLLECTION_LEVELS 10 + + + /* Bitmask whether pen is in range */ +@@ -223,8 +224,7 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report, + char maintype = 'x'; + char globtype[12]; + int indent = 0; +- char indentstr[10] = ""; +- ++ char indentstr[MAX_COLLECTION_LEVELS + 1] = { 0 }; + + dev_dbg(ddev, "======>>>>>>PARSE<<<<<<======\n"); + +@@ -350,6 +350,13 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report, + case TAG_MAIN_COL_START: + maintype = 'S'; + ++ if (indent == MAX_COLLECTION_LEVELS) { ++ dev_err(ddev, "Collection level %d would exceed limit of %d\n", ++ indent + 1, ++ MAX_COLLECTION_LEVELS); ++ break; ++ } ++ + if (data == 0) { + dev_dbg(ddev, "======>>>>>> Physical\n"); + strcpy(globtype, "Physical"); +@@ -369,8 +376,15 @@ static void parse_hid_report_descriptor(struct gtco *device, char * report, + break; + + case TAG_MAIN_COL_END: +- dev_dbg(ddev, "<<<<<<======\n"); + maintype = 'E'; ++ ++ if (indent == 0) { ++ dev_err(ddev, "Collection level already at zero\n"); ++ break; ++ } ++ ++ dev_dbg(ddev, "<<<<<<======\n"); ++ + indent--; + for (x = 0; x < indent; x++) + indentstr[x] = '-'; +diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c +index a2cec6cacf57..16d70201de4a 100644 +--- a/drivers/input/touchscreen/usbtouchscreen.c ++++ b/drivers/input/touchscreen/usbtouchscreen.c +@@ -1659,6 +1659,8 @@ static int usbtouch_probe(struct usb_interface *intf, + if (!usbtouch || !input_dev) + goto out_free; + ++ mutex_init(&usbtouch->pm_mutex); ++ + type = &usbtouch_dev_info[id->driver_info]; + usbtouch->type = type; + if (!type->process_pkt) +diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c +index 4d5a694f02c2..0fee8f7957ec 100644 +--- a/drivers/iommu/arm-smmu-v3.c ++++ b/drivers/iommu/arm-smmu-v3.c +@@ -1884,9 +1884,13 @@ static int arm_smmu_enable_ats(struct arm_smmu_master *master) + + static void arm_smmu_disable_ats(struct arm_smmu_master *master) + { ++ struct arm_smmu_cmdq_ent cmd; ++ + if (!master->ats_enabled || !dev_is_pci(master->dev)) + return; + ++ arm_smmu_atc_inv_to_cmd(0, 0, 0, &cmd); ++ arm_smmu_atc_inv_master(master, &cmd); + pci_disable_ats(to_pci_dev(master->dev)); + master->ats_enabled = false; + } +@@ -1906,7 +1910,6 @@ static void arm_smmu_detach_dev(struct arm_smmu_master *master) + master->domain = NULL; + arm_smmu_install_ste_for_dev(master); + +- /* Disabling ATS invalidates all ATC entries */ + arm_smmu_disable_ats(master); + } + +diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c +index 162b3236e72c..1ad24367373f 100644 +--- a/drivers/iommu/intel-iommu.c ++++ b/drivers/iommu/intel-iommu.c +@@ -1900,7 +1900,6 @@ static int domain_init(struct dmar_domain *domain, struct intel_iommu *iommu, + + static void domain_exit(struct dmar_domain *domain) + { +- struct page *freelist; + + /* Remove associated devices and clear attached or cached domains */ + rcu_read_lock(); +@@ -1910,9 +1909,12 @@ static void domain_exit(struct dmar_domain *domain) + /* destroy iovas */ + put_iova_domain(&domain->iovad); + +- freelist = domain_unmap(domain, 0, DOMAIN_MAX_PFN(domain->gaw)); ++ if (domain->pgd) { ++ struct page *freelist; + +- dma_free_pagelist(freelist); ++ freelist = domain_unmap(domain, 0, DOMAIN_MAX_PFN(domain->gaw)); ++ dma_free_pagelist(freelist); ++ } + + free_domain_mem(domain); + } +@@ -3752,7 +3754,8 @@ static void intel_unmap(struct device *dev, dma_addr_t dev_addr, size_t size) + + freelist = domain_unmap(domain, start_pfn, last_pfn); + +- if (intel_iommu_strict || (pdev && pdev->untrusted)) { ++ if (intel_iommu_strict || (pdev && pdev->untrusted) || ++ !has_iova_flush_queue(&domain->iovad)) { + iommu_flush_iotlb_psi(iommu, domain, start_pfn, + nrpages, !freelist, 0); + /* free iova */ +diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c +index 9f0a2844371c..30db41e9f15c 100644 +--- a/drivers/iommu/iommu.c ++++ b/drivers/iommu/iommu.c +@@ -225,18 +225,21 @@ static int iommu_insert_resv_region(struct iommu_resv_region *new, + pos = pos->next; + } else if ((start >= a) && (end <= b)) { + if (new->type == type) +- goto done; ++ return 0; + else + pos = pos->next; + } else { + if (new->type == type) { + phys_addr_t new_start = min(a, start); + phys_addr_t new_end = max(b, end); ++ int ret; + + list_del(&entry->list); + entry->start = new_start; + entry->length = new_end - new_start + 1; +- iommu_insert_resv_region(entry, regions); ++ ret = iommu_insert_resv_region(entry, regions); ++ kfree(entry); ++ return ret; + } else { + pos = pos->next; + } +@@ -249,7 +252,6 @@ static int iommu_insert_resv_region(struct iommu_resv_region *new, + return -ENOMEM; + + list_add_tail(®ion->list, pos); +-done: + return 0; + } + +diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c +index d499b2621239..3e1a8a675572 100644 +--- a/drivers/iommu/iova.c ++++ b/drivers/iommu/iova.c +@@ -54,9 +54,14 @@ init_iova_domain(struct iova_domain *iovad, unsigned long granule, + } + EXPORT_SYMBOL_GPL(init_iova_domain); + ++bool has_iova_flush_queue(struct iova_domain *iovad) ++{ ++ return !!iovad->fq; ++} ++ + static void free_iova_flush_queue(struct iova_domain *iovad) + { +- if (!iovad->fq) ++ if (!has_iova_flush_queue(iovad)) + return; + + if (timer_pending(&iovad->fq_timer)) +@@ -74,13 +79,14 @@ static void free_iova_flush_queue(struct iova_domain *iovad) + int init_iova_flush_queue(struct iova_domain *iovad, + iova_flush_cb flush_cb, iova_entry_dtor entry_dtor) + { ++ struct iova_fq __percpu *queue; + int cpu; + + atomic64_set(&iovad->fq_flush_start_cnt, 0); + atomic64_set(&iovad->fq_flush_finish_cnt, 0); + +- iovad->fq = alloc_percpu(struct iova_fq); +- if (!iovad->fq) ++ queue = alloc_percpu(struct iova_fq); ++ if (!queue) + return -ENOMEM; + + iovad->flush_cb = flush_cb; +@@ -89,13 +95,17 @@ int init_iova_flush_queue(struct iova_domain *iovad, + for_each_possible_cpu(cpu) { + struct iova_fq *fq; + +- fq = per_cpu_ptr(iovad->fq, cpu); ++ fq = per_cpu_ptr(queue, cpu); + fq->head = 0; + fq->tail = 0; + + spin_lock_init(&fq->lock); + } + ++ smp_wmb(); ++ ++ iovad->fq = queue; ++ + timer_setup(&iovad->fq_timer, fq_flush_timeout, 0); + atomic_set(&iovad->fq_timer_on, 0); + +@@ -127,8 +137,9 @@ __cached_rbnode_delete_update(struct iova_domain *iovad, struct iova *free) + struct iova *cached_iova; + + cached_iova = rb_entry(iovad->cached32_node, struct iova, node); +- if (free->pfn_hi < iovad->dma_32bit_pfn && +- free->pfn_lo >= cached_iova->pfn_lo) { ++ if (free == cached_iova || ++ (free->pfn_hi < iovad->dma_32bit_pfn && ++ free->pfn_lo >= cached_iova->pfn_lo)) { + iovad->cached32_node = rb_next(&free->node); + iovad->max32_alloc_size = iovad->dma_32bit_pfn; + } +diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c +index 6377cb864f4c..f3e44d6d9255 100644 +--- a/drivers/irqchip/irq-gic-v3.c ++++ b/drivers/irqchip/irq-gic-v3.c +@@ -461,8 +461,12 @@ static void gic_deactivate_unhandled(u32 irqnr) + + static inline void gic_handle_nmi(u32 irqnr, struct pt_regs *regs) + { ++ bool irqs_enabled = interrupts_enabled(regs); + int err; + ++ if (irqs_enabled) ++ nmi_enter(); ++ + if (static_branch_likely(&supports_deactivate_key)) + gic_write_eoir(irqnr); + /* +@@ -474,6 +478,9 @@ static inline void gic_handle_nmi(u32 irqnr, struct pt_regs *regs) + err = handle_domain_nmi(gic_data.domain, irqnr, regs); + if (err) + gic_deactivate_unhandled(irqnr); ++ ++ if (irqs_enabled) ++ nmi_exit(); + } + + static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) +diff --git a/drivers/irqchip/irq-meson-gpio.c b/drivers/irqchip/irq-meson-gpio.c +index 8eb92eb98f54..dcdc23b9dce6 100644 +--- a/drivers/irqchip/irq-meson-gpio.c ++++ b/drivers/irqchip/irq-meson-gpio.c +@@ -60,6 +60,7 @@ static const struct of_device_id meson_irq_gpio_matches[] = { + { .compatible = "amlogic,meson-gxbb-gpio-intc", .data = &gxbb_params }, + { .compatible = "amlogic,meson-gxl-gpio-intc", .data = &gxl_params }, + { .compatible = "amlogic,meson-axg-gpio-intc", .data = &axg_params }, ++ { .compatible = "amlogic,meson-g12a-gpio-intc", .data = &axg_params }, + { } + }; + +diff --git a/drivers/isdn/hardware/mISDN/hfcsusb.c b/drivers/isdn/hardware/mISDN/hfcsusb.c +index 4c99739b937e..0e224232f746 100644 +--- a/drivers/isdn/hardware/mISDN/hfcsusb.c ++++ b/drivers/isdn/hardware/mISDN/hfcsusb.c +@@ -1955,6 +1955,9 @@ hfcsusb_probe(struct usb_interface *intf, const struct usb_device_id *id) + + /* get endpoint base */ + idx = ((ep_addr & 0x7f) - 1) * 2; ++ if (idx > 15) ++ return -EIO; ++ + if (ep_addr & 0x80) + idx++; + attr = ep->desc.bmAttributes; +diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c +index 7d555b110ecd..a600934fdd9c 100644 +--- a/drivers/lightnvm/core.c ++++ b/drivers/lightnvm/core.c +@@ -478,7 +478,7 @@ static void __nvm_remove_target(struct nvm_target *t, bool graceful) + */ + static int nvm_remove_tgt(struct nvm_ioctl_remove *remove) + { +- struct nvm_target *t; ++ struct nvm_target *t = NULL; + struct nvm_dev *dev; + + down_read(&nvm_lock); +diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c +index 773537804319..f546e6f28b8a 100644 +--- a/drivers/lightnvm/pblk-core.c ++++ b/drivers/lightnvm/pblk-core.c +@@ -323,14 +323,16 @@ void pblk_free_rqd(struct pblk *pblk, struct nvm_rq *rqd, int type) + void pblk_bio_free_pages(struct pblk *pblk, struct bio *bio, int off, + int nr_pages) + { +- struct bio_vec bv; +- int i; +- +- WARN_ON(off + nr_pages != bio->bi_vcnt); +- +- for (i = off; i < nr_pages + off; i++) { +- bv = bio->bi_io_vec[i]; +- mempool_free(bv.bv_page, &pblk->page_bio_pool); ++ struct bio_vec *bv; ++ struct page *page; ++ int i, e, nbv = 0; ++ ++ for (i = 0; i < bio->bi_vcnt; i++) { ++ bv = &bio->bi_io_vec[i]; ++ page = bv->bv_page; ++ for (e = 0; e < bv->bv_len; e += PBLK_EXPOSED_PAGE_SIZE, nbv++) ++ if (nbv >= off) ++ mempool_free(page++, &pblk->page_bio_pool); + } + } + +diff --git a/drivers/macintosh/Kconfig b/drivers/macintosh/Kconfig +index 574e122ae105..bd4d86fc8244 100644 +--- a/drivers/macintosh/Kconfig ++++ b/drivers/macintosh/Kconfig +@@ -149,6 +149,13 @@ config INPUT_ADBHID + + If unsure, say Y. + ++config ADB_TRACKPAD_ABSOLUTE ++ bool "Enable absolute mode for adb trackpads" ++ depends on INPUT_ADBHID ++ help ++ Enable absolute mode in adb-base trackpads. This feature adds ++ compatibility with synaptics Xorg / Xfree drivers. ++ + config MAC_EMUMOUSEBTN + tristate "Support for mouse button 2+3 emulation" + depends on SYSCTL && INPUT +diff --git a/drivers/macintosh/adbhid.c b/drivers/macintosh/adbhid.c +index 75482eeab2c4..13f9321e06b2 100644 +--- a/drivers/macintosh/adbhid.c ++++ b/drivers/macintosh/adbhid.c +@@ -262,6 +262,15 @@ static struct adb_ids buttons_ids; + #define ADBMOUSE_MS_A3 8 /* Mouse systems A3 trackball (handler 3) */ + #define ADBMOUSE_MACALLY2 9 /* MacAlly 2-button mouse */ + ++#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE ++#define ABS_XMIN 310 ++#define ABS_XMAX 1700 ++#define ABS_YMIN 200 ++#define ABS_YMAX 1000 ++#define ABS_ZMIN 0 ++#define ABS_ZMAX 55 ++#endif ++ + static void + adbhid_keyboard_input(unsigned char *data, int nb, int apoll) + { +@@ -405,6 +414,9 @@ static void + adbhid_mouse_input(unsigned char *data, int nb, int autopoll) + { + int id = (data[0] >> 4) & 0x0f; ++#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE ++ int btn = 0; int x_axis = 0; int y_axis = 0; int z_axis = 0; ++#endif + + if (!adbhid[id]) { + pr_err("ADB HID on ID %d not yet registered\n", id); +@@ -436,6 +448,17 @@ adbhid_mouse_input(unsigned char *data, int nb, int autopoll) + high bits of y-axis motion. XY is additional + high bits of x-axis motion. + ++ For ADB Absolute motion protocol the data array will contain the ++ following values: ++ ++ BITS COMMENTS ++ data[0] = dddd 1100 ADB command: Talk, register 0, for device dddd. ++ data[1] = byyy yyyy Left button and y-axis motion. ++ data[2] = bxxx xxxx Second button and x-axis motion. ++ data[3] = 1yyy 1xxx Half bits of y-axis and x-axis motion. ++ data[4] = 1yyy 1xxx Higher bits of y-axis and x-axis motion. ++ data[5] = 1zzz 1zzz Higher and lower bits of z-pressure. ++ + MacAlly 2-button mouse protocol. + + For MacAlly 2-button mouse protocol the data array will contain the +@@ -458,8 +481,17 @@ adbhid_mouse_input(unsigned char *data, int nb, int autopoll) + switch (adbhid[id]->mouse_kind) + { + case ADBMOUSE_TRACKPAD: ++#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE ++ x_axis = (data[2] & 0x7f) | ((data[3] & 0x07) << 7) | ++ ((data[4] & 0x07) << 10); ++ y_axis = (data[1] & 0x7f) | ((data[3] & 0x70) << 3) | ++ ((data[4] & 0x70) << 6); ++ z_axis = (data[5] & 0x07) | ((data[5] & 0x70) >> 1); ++ btn = (!(data[1] >> 7)) & 1; ++#else + data[1] = (data[1] & 0x7f) | ((data[1] & data[2]) & 0x80); + data[2] = data[2] | 0x80; ++#endif + break; + case ADBMOUSE_MICROSPEED: + data[1] = (data[1] & 0x7f) | ((data[3] & 0x01) << 7); +@@ -485,17 +517,39 @@ adbhid_mouse_input(unsigned char *data, int nb, int autopoll) + break; + } + +- input_report_key(adbhid[id]->input, BTN_LEFT, !((data[1] >> 7) & 1)); +- input_report_key(adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1)); ++#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE ++ if ( adbhid[id]->mouse_kind == ADBMOUSE_TRACKPAD ) { + +- if (nb >= 4 && adbhid[id]->mouse_kind != ADBMOUSE_TRACKPAD) +- input_report_key(adbhid[id]->input, BTN_RIGHT, !((data[3] >> 7) & 1)); ++ if(z_axis > 30) input_report_key(adbhid[id]->input, BTN_TOUCH, 1); ++ if(z_axis < 25) input_report_key(adbhid[id]->input, BTN_TOUCH, 0); + +- input_report_rel(adbhid[id]->input, REL_X, +- ((data[2]&0x7f) < 64 ? (data[2]&0x7f) : (data[2]&0x7f)-128 )); +- input_report_rel(adbhid[id]->input, REL_Y, +- ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 )); ++ if(z_axis > 0){ ++ input_report_abs(adbhid[id]->input, ABS_X, x_axis); ++ input_report_abs(adbhid[id]->input, ABS_Y, y_axis); ++ input_report_key(adbhid[id]->input, BTN_TOOL_FINGER, 1); ++ input_report_key(adbhid[id]->input, ABS_TOOL_WIDTH, 5); ++ } else { ++ input_report_key(adbhid[id]->input, BTN_TOOL_FINGER, 0); ++ input_report_key(adbhid[id]->input, ABS_TOOL_WIDTH, 0); ++ } ++ ++ input_report_abs(adbhid[id]->input, ABS_PRESSURE, z_axis); ++ input_report_key(adbhid[id]->input, BTN_LEFT, btn); ++ } else { ++#endif ++ input_report_key(adbhid[id]->input, BTN_LEFT, !((data[1] >> 7) & 1)); ++ input_report_key(adbhid[id]->input, BTN_MIDDLE, !((data[2] >> 7) & 1)); ++ ++ if (nb >= 4 && adbhid[id]->mouse_kind != ADBMOUSE_TRACKPAD) ++ input_report_key(adbhid[id]->input, BTN_RIGHT, !((data[3] >> 7) & 1)); + ++ input_report_rel(adbhid[id]->input, REL_X, ++ ((data[2]&0x7f) < 64 ? (data[2]&0x7f) : (data[2]&0x7f)-128 )); ++ input_report_rel(adbhid[id]->input, REL_Y, ++ ((data[1]&0x7f) < 64 ? (data[1]&0x7f) : (data[1]&0x7f)-128 )); ++#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE ++ } ++#endif + input_sync(adbhid[id]->input); + } + +@@ -850,6 +904,15 @@ adbhid_input_register(int id, int default_id, int original_handler_id, + input_dev->keybit[BIT_WORD(BTN_MOUSE)] = BIT_MASK(BTN_LEFT) | + BIT_MASK(BTN_MIDDLE) | BIT_MASK(BTN_RIGHT); + input_dev->relbit[0] = BIT_MASK(REL_X) | BIT_MASK(REL_Y); ++#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE ++ set_bit(EV_ABS, input_dev->evbit); ++ input_set_abs_params(input_dev, ABS_X, ABS_XMIN, ABS_XMAX, 0, 0); ++ input_set_abs_params(input_dev, ABS_Y, ABS_YMIN, ABS_YMAX, 0, 0); ++ input_set_abs_params(input_dev, ABS_PRESSURE, ABS_ZMIN, ABS_ZMAX, 0, 0); ++ set_bit(BTN_TOUCH, input_dev->keybit); ++ set_bit(BTN_TOOL_FINGER, input_dev->keybit); ++ set_bit(ABS_TOOL_WIDTH, input_dev->absbit); ++#endif + break; + + case ADB_MISC: +@@ -1128,7 +1191,11 @@ init_trackpad(int id) + r1_buffer[3], + r1_buffer[4], + r1_buffer[5], ++#ifdef CONFIG_ADB_TRACKPAD_ABSOLUTE ++ 0x00, /* Enable absolute mode */ ++#else + 0x03, /*r1_buffer[6],*/ ++#endif + r1_buffer[7]); + + /* Without this flush, the trackpad may be locked up */ +diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c +index f4b1950d35f3..0b821a5b2db8 100644 +--- a/drivers/mailbox/mailbox.c ++++ b/drivers/mailbox/mailbox.c +@@ -418,11 +418,13 @@ struct mbox_chan *mbox_request_channel_byname(struct mbox_client *cl, + + of_property_for_each_string(np, "mbox-names", prop, mbox_name) { + if (!strncmp(name, mbox_name, strlen(name))) +- break; ++ return mbox_request_channel(cl, index); + index++; + } + +- return mbox_request_channel(cl, index); ++ dev_err(cl->dev, "%s() could not locate channel named \"%s\"\n", ++ __func__, name); ++ return ERR_PTR(-EINVAL); + } + EXPORT_SYMBOL_GPL(mbox_request_channel_byname); + +diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c +index f8986effcb50..6f776823b9ba 100644 +--- a/drivers/md/bcache/alloc.c ++++ b/drivers/md/bcache/alloc.c +@@ -393,6 +393,11 @@ long bch_bucket_alloc(struct cache *ca, unsigned int reserve, bool wait) + struct bucket *b; + long r; + ++ ++ /* No allocation if CACHE_SET_IO_DISABLE bit is set */ ++ if (unlikely(test_bit(CACHE_SET_IO_DISABLE, &ca->set->flags))) ++ return -1; ++ + /* fastpath */ + if (fifo_pop(&ca->free[RESERVE_NONE], r) || + fifo_pop(&ca->free[reserve], r)) +@@ -484,6 +489,10 @@ int __bch_bucket_alloc_set(struct cache_set *c, unsigned int reserve, + { + int i; + ++ /* No allocation if CACHE_SET_IO_DISABLE bit is set */ ++ if (unlikely(test_bit(CACHE_SET_IO_DISABLE, &c->flags))) ++ return -1; ++ + lockdep_assert_held(&c->bucket_lock); + BUG_ON(!n || n > c->caches_loaded || n > MAX_CACHES_PER_SET); + +diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h +index fdf75352e16a..e30a983a68cd 100644 +--- a/drivers/md/bcache/bcache.h ++++ b/drivers/md/bcache/bcache.h +@@ -726,8 +726,6 @@ struct cache_set { + + #define BUCKET_HASH_BITS 12 + struct hlist_head bucket_hash[1 << BUCKET_HASH_BITS]; +- +- DECLARE_HEAP(struct btree *, flush_btree); + }; + + struct bbio { +diff --git a/drivers/md/bcache/io.c b/drivers/md/bcache/io.c +index c25097968319..4d93f07f63e5 100644 +--- a/drivers/md/bcache/io.c ++++ b/drivers/md/bcache/io.c +@@ -58,6 +58,18 @@ void bch_count_backing_io_errors(struct cached_dev *dc, struct bio *bio) + + WARN_ONCE(!dc, "NULL pointer of struct cached_dev"); + ++ /* ++ * Read-ahead requests on a degrading and recovering md raid ++ * (e.g. raid6) device might be failured immediately by md ++ * raid code, which is not a real hardware media failure. So ++ * we shouldn't count failed REQ_RAHEAD bio to dc->io_errors. ++ */ ++ if (bio->bi_opf & REQ_RAHEAD) { ++ pr_warn_ratelimited("%s: Read-ahead I/O failed on backing device, ignore", ++ dc->backing_dev_name); ++ return; ++ } ++ + errors = atomic_add_return(1, &dc->io_errors); + if (errors < dc->error_limit) + pr_err("%s: IO error on backing device, unrecoverable", +diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c +index 12dae9348147..cae2aff5e27a 100644 +--- a/drivers/md/bcache/journal.c ++++ b/drivers/md/bcache/journal.c +@@ -268,7 +268,7 @@ int bch_journal_read(struct cache_set *c, struct list_head *list) + struct journal_replay, + list)->j.seq; + +- return ret; ++ return 0; + #undef read_bucket + } + +@@ -391,12 +391,6 @@ int bch_journal_replay(struct cache_set *s, struct list_head *list) + } + + /* Journalling */ +-#define journal_max_cmp(l, r) \ +- (fifo_idx(&c->journal.pin, btree_current_write(l)->journal) < \ +- fifo_idx(&(c)->journal.pin, btree_current_write(r)->journal)) +-#define journal_min_cmp(l, r) \ +- (fifo_idx(&c->journal.pin, btree_current_write(l)->journal) > \ +- fifo_idx(&(c)->journal.pin, btree_current_write(r)->journal)) + + static void btree_flush_write(struct cache_set *c) + { +@@ -404,35 +398,25 @@ static void btree_flush_write(struct cache_set *c) + * Try to find the btree node with that references the oldest journal + * entry, best is our current candidate and is locked if non NULL: + */ +- struct btree *b; +- int i; ++ struct btree *b, *best; ++ unsigned int i; + + atomic_long_inc(&c->flush_write); +- + retry: +- spin_lock(&c->journal.lock); +- if (heap_empty(&c->flush_btree)) { +- for_each_cached_btree(b, c, i) +- if (btree_current_write(b)->journal) { +- if (!heap_full(&c->flush_btree)) +- heap_add(&c->flush_btree, b, +- journal_max_cmp); +- else if (journal_max_cmp(b, +- heap_peek(&c->flush_btree))) { +- c->flush_btree.data[0] = b; +- heap_sift(&c->flush_btree, 0, +- journal_max_cmp); +- } ++ best = NULL; ++ ++ for_each_cached_btree(b, c, i) ++ if (btree_current_write(b)->journal) { ++ if (!best) ++ best = b; ++ else if (journal_pin_cmp(c, ++ btree_current_write(best)->journal, ++ btree_current_write(b)->journal)) { ++ best = b; + } ++ } + +- for (i = c->flush_btree.used / 2 - 1; i >= 0; --i) +- heap_sift(&c->flush_btree, i, journal_min_cmp); +- } +- +- b = NULL; +- heap_pop(&c->flush_btree, b, journal_min_cmp); +- spin_unlock(&c->journal.lock); +- ++ b = best; + if (b) { + mutex_lock(&b->write_lock); + if (!btree_current_write(b)->journal) { +@@ -811,6 +795,10 @@ atomic_t *bch_journal(struct cache_set *c, + struct journal_write *w; + atomic_t *ret; + ++ /* No journaling if CACHE_SET_IO_DISABLE set already */ ++ if (unlikely(test_bit(CACHE_SET_IO_DISABLE, &c->flags))) ++ return NULL; ++ + if (!CACHE_SYNC(&c->sb)) + return NULL; + +@@ -855,7 +843,6 @@ void bch_journal_free(struct cache_set *c) + free_pages((unsigned long) c->journal.w[1].data, JSET_BITS); + free_pages((unsigned long) c->journal.w[0].data, JSET_BITS); + free_fifo(&c->journal.pin); +- free_heap(&c->flush_btree); + } + + int bch_journal_alloc(struct cache_set *c) +@@ -870,8 +857,7 @@ int bch_journal_alloc(struct cache_set *c) + j->w[0].c = c; + j->w[1].c = c; + +- if (!(init_heap(&c->flush_btree, 128, GFP_KERNEL)) || +- !(init_fifo(&j->pin, JOURNAL_PIN, GFP_KERNEL)) || ++ if (!(init_fifo(&j->pin, JOURNAL_PIN, GFP_KERNEL)) || + !(j->w[0].data = (void *) __get_free_pages(GFP_KERNEL, JSET_BITS)) || + !(j->w[1].data = (void *) __get_free_pages(GFP_KERNEL, JSET_BITS))) + return -ENOMEM; +diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c +index 1b63ac876169..6daf777105fb 100644 +--- a/drivers/md/bcache/super.c ++++ b/drivers/md/bcache/super.c +@@ -40,6 +40,7 @@ static const char invalid_uuid[] = { + + static struct kobject *bcache_kobj; + struct mutex bch_register_lock; ++bool bcache_is_reboot; + LIST_HEAD(bch_cache_sets); + static LIST_HEAD(uncached_devices); + +@@ -49,6 +50,7 @@ static wait_queue_head_t unregister_wait; + struct workqueue_struct *bcache_wq; + struct workqueue_struct *bch_journal_wq; + ++ + #define BTREE_MAX_PAGES (256 * 1024 / PAGE_SIZE) + /* limitation of partitions number on single bcache device */ + #define BCACHE_MINORS 128 +@@ -1190,18 +1192,16 @@ static void cached_dev_free(struct closure *cl) + { + struct cached_dev *dc = container_of(cl, struct cached_dev, disk.cl); + +- mutex_lock(&bch_register_lock); +- + if (test_and_clear_bit(BCACHE_DEV_WB_RUNNING, &dc->disk.flags)) + cancel_writeback_rate_update_dwork(dc); + + if (!IS_ERR_OR_NULL(dc->writeback_thread)) + kthread_stop(dc->writeback_thread); +- if (dc->writeback_write_wq) +- destroy_workqueue(dc->writeback_write_wq); + if (!IS_ERR_OR_NULL(dc->status_update_thread)) + kthread_stop(dc->status_update_thread); + ++ mutex_lock(&bch_register_lock); ++ + if (atomic_read(&dc->running)) + bd_unlink_disk_holder(dc->bdev, dc->disk.disk); + bcache_device_free(&dc->disk); +@@ -1437,8 +1437,6 @@ int bch_flash_dev_create(struct cache_set *c, uint64_t size) + + bool bch_cached_dev_error(struct cached_dev *dc) + { +- struct cache_set *c; +- + if (!dc || test_bit(BCACHE_DEV_CLOSING, &dc->disk.flags)) + return false; + +@@ -1449,21 +1447,6 @@ bool bch_cached_dev_error(struct cached_dev *dc) + pr_err("stop %s: too many IO errors on backing device %s\n", + dc->disk.disk->disk_name, dc->backing_dev_name); + +- /* +- * If the cached device is still attached to a cache set, +- * even dc->io_disable is true and no more I/O requests +- * accepted, cache device internal I/O (writeback scan or +- * garbage collection) may still prevent bcache device from +- * being stopped. So here CACHE_SET_IO_DISABLE should be +- * set to c->flags too, to make the internal I/O to cache +- * device rejected and stopped immediately. +- * If c is NULL, that means the bcache device is not attached +- * to any cache set, then no CACHE_SET_IO_DISABLE bit to set. +- */ +- c = dc->disk.c; +- if (c && test_and_set_bit(CACHE_SET_IO_DISABLE, &c->flags)) +- pr_info("CACHE_SET_IO_DISABLE already set"); +- + bcache_device_stop(&dc->disk); + return true; + } +@@ -1564,7 +1547,7 @@ static void cache_set_flush(struct closure *cl) + kobject_put(&c->internal); + kobject_del(&c->kobj); + +- if (c->gc_thread) ++ if (!IS_ERR_OR_NULL(c->gc_thread)) + kthread_stop(c->gc_thread); + + if (!IS_ERR_OR_NULL(c->root)) +@@ -2301,6 +2284,11 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, + if (!try_module_get(THIS_MODULE)) + return -EBUSY; + ++ /* For latest state of bcache_is_reboot */ ++ smp_mb(); ++ if (bcache_is_reboot) ++ return -EBUSY; ++ + path = kstrndup(buffer, size, GFP_KERNEL); + if (!path) + goto err; +@@ -2380,6 +2368,9 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr, + + static int bcache_reboot(struct notifier_block *n, unsigned long code, void *x) + { ++ if (bcache_is_reboot) ++ return NOTIFY_DONE; ++ + if (code == SYS_DOWN || + code == SYS_HALT || + code == SYS_POWER_OFF) { +@@ -2392,19 +2383,45 @@ static int bcache_reboot(struct notifier_block *n, unsigned long code, void *x) + + mutex_lock(&bch_register_lock); + ++ if (bcache_is_reboot) ++ goto out; ++ ++ /* New registration is rejected since now */ ++ bcache_is_reboot = true; ++ /* ++ * Make registering caller (if there is) on other CPU ++ * core know bcache_is_reboot set to true earlier ++ */ ++ smp_mb(); ++ + if (list_empty(&bch_cache_sets) && + list_empty(&uncached_devices)) + goto out; + ++ mutex_unlock(&bch_register_lock); ++ + pr_info("Stopping all devices:"); + ++ /* ++ * The reason bch_register_lock is not held to call ++ * bch_cache_set_stop() and bcache_device_stop() is to ++ * avoid potential deadlock during reboot, because cache ++ * set or bcache device stopping process will acqurie ++ * bch_register_lock too. ++ * ++ * We are safe here because bcache_is_reboot sets to ++ * true already, register_bcache() will reject new ++ * registration now. bcache_is_reboot also makes sure ++ * bcache_reboot() won't be re-entered on by other thread, ++ * so there is no race in following list iteration by ++ * list_for_each_entry_safe(). ++ */ + list_for_each_entry_safe(c, tc, &bch_cache_sets, list) + bch_cache_set_stop(c); + + list_for_each_entry_safe(dc, tdc, &uncached_devices, list) + bcache_device_stop(&dc->disk); + +- mutex_unlock(&bch_register_lock); + + /* + * Give an early chance for other kthreads and +@@ -2531,6 +2548,8 @@ static int __init bcache_init(void) + bch_debug_init(); + closure_debug_init(); + ++ bcache_is_reboot = false; ++ + return 0; + err: + bcache_exit(); +diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c +index bfb437ffb13c..54cd1727d20c 100644 +--- a/drivers/md/bcache/sysfs.c ++++ b/drivers/md/bcache/sysfs.c +@@ -16,6 +16,8 @@ + #include + #include + ++extern bool bcache_is_reboot; ++ + /* Default is 0 ("writethrough") */ + static const char * const bch_cache_modes[] = { + "writethrough", +@@ -180,7 +182,7 @@ SHOW(__bch_cached_dev) + var_print(writeback_percent); + sysfs_hprint(writeback_rate, + wb ? atomic_long_read(&dc->writeback_rate.rate) << 9 : 0); +- sysfs_hprint(io_errors, atomic_read(&dc->io_errors)); ++ sysfs_printf(io_errors, "%i", atomic_read(&dc->io_errors)); + sysfs_printf(io_error_limit, "%i", dc->error_limit); + sysfs_printf(io_disable, "%i", dc->io_disable); + var_print(writeback_rate_update_seconds); +@@ -271,6 +273,10 @@ STORE(__cached_dev) + struct cache_set *c; + struct kobj_uevent_env *env; + ++ /* no user space access if system is rebooting */ ++ if (bcache_is_reboot) ++ return -EBUSY; ++ + #define d_strtoul(var) sysfs_strtoul(var, dc->var) + #define d_strtoul_nonzero(var) sysfs_strtoul_clamp(var, dc->var, 1, INT_MAX) + #define d_strtoi_h(var) sysfs_hatoi(var, dc->var) +@@ -408,6 +414,10 @@ STORE(bch_cached_dev) + struct cached_dev *dc = container_of(kobj, struct cached_dev, + disk.kobj); + ++ /* no user space access if system is rebooting */ ++ if (bcache_is_reboot) ++ return -EBUSY; ++ + mutex_lock(&bch_register_lock); + size = __cached_dev_store(kobj, attr, buf, size); + +@@ -464,7 +474,7 @@ static struct attribute *bch_cached_dev_files[] = { + &sysfs_writeback_rate_p_term_inverse, + &sysfs_writeback_rate_minimum, + &sysfs_writeback_rate_debug, +- &sysfs_errors, ++ &sysfs_io_errors, + &sysfs_io_error_limit, + &sysfs_io_disable, + &sysfs_dirty_data, +@@ -511,6 +521,10 @@ STORE(__bch_flash_dev) + kobj); + struct uuid_entry *u = &d->c->uuids[d->id]; + ++ /* no user space access if system is rebooting */ ++ if (bcache_is_reboot) ++ return -EBUSY; ++ + sysfs_strtoul(data_csum, d->data_csum); + + if (attr == &sysfs_size) { +@@ -746,6 +760,10 @@ STORE(__bch_cache_set) + struct cache_set *c = container_of(kobj, struct cache_set, kobj); + ssize_t v; + ++ /* no user space access if system is rebooting */ ++ if (bcache_is_reboot) ++ return -EBUSY; ++ + if (attr == &sysfs_unregister) + bch_cache_set_unregister(c); + +@@ -865,6 +883,10 @@ STORE(bch_cache_set_internal) + { + struct cache_set *c = container_of(kobj, struct cache_set, internal); + ++ /* no user space access if system is rebooting */ ++ if (bcache_is_reboot) ++ return -EBUSY; ++ + return bch_cache_set_store(&c->kobj, attr, buf, size); + } + +@@ -1050,6 +1072,10 @@ STORE(__bch_cache) + struct cache *ca = container_of(kobj, struct cache, kobj); + ssize_t v; + ++ /* no user space access if system is rebooting */ ++ if (bcache_is_reboot) ++ return -EBUSY; ++ + if (attr == &sysfs_discard) { + bool v = strtoul_or_return(buf); + +diff --git a/drivers/md/bcache/util.h b/drivers/md/bcache/util.h +index 1fbced94e4cc..c029f7443190 100644 +--- a/drivers/md/bcache/util.h ++++ b/drivers/md/bcache/util.h +@@ -113,8 +113,6 @@ do { \ + + #define heap_full(h) ((h)->used == (h)->size) + +-#define heap_empty(h) ((h)->used == 0) +- + #define DECLARE_FIFO(type, name) \ + struct { \ + size_t front, back, size, mask; \ +diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c +index 73f0efac2b9f..e9ffcea1ca50 100644 +--- a/drivers/md/bcache/writeback.c ++++ b/drivers/md/bcache/writeback.c +@@ -735,6 +735,10 @@ static int bch_writeback_thread(void *arg) + } + } + ++ if (dc->writeback_write_wq) { ++ flush_workqueue(dc->writeback_write_wq); ++ destroy_workqueue(dc->writeback_write_wq); ++ } + cached_dev_put(dc); + wait_for_kthread_stop(); + +@@ -830,6 +834,7 @@ int bch_cached_dev_writeback_start(struct cached_dev *dc) + "bcache_writeback"); + if (IS_ERR(dc->writeback_thread)) { + cached_dev_put(dc); ++ destroy_workqueue(dc->writeback_write_wq); + return PTR_ERR(dc->writeback_thread); + } + dc->writeback_running = true; +diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c +index 2a48ea3f1b30..b6b5acc92ca2 100644 +--- a/drivers/md/dm-bufio.c ++++ b/drivers/md/dm-bufio.c +@@ -1599,9 +1599,7 @@ dm_bufio_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) + unsigned long freed; + + c = container_of(shrink, struct dm_bufio_client, shrinker); +- if (sc->gfp_mask & __GFP_FS) +- dm_bufio_lock(c); +- else if (!dm_bufio_trylock(c)) ++ if (!dm_bufio_trylock(c)) + return SHRINK_STOP; + + freed = __scan(c, sc->nr_to_scan, sc->gfp_mask); +diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c +index 7f0840601737..4c68a7b93d5e 100644 +--- a/drivers/md/dm-thin-metadata.c ++++ b/drivers/md/dm-thin-metadata.c +@@ -2046,16 +2046,19 @@ int dm_pool_register_metadata_threshold(struct dm_pool_metadata *pmd, + + int dm_pool_metadata_set_needs_check(struct dm_pool_metadata *pmd) + { +- int r; ++ int r = -EINVAL; + struct dm_block *sblock; + struct thin_disk_superblock *disk_super; + + pmd_write_lock(pmd); ++ if (pmd->fail_io) ++ goto out; ++ + pmd->flags |= THIN_METADATA_NEEDS_CHECK_FLAG; + + r = superblock_lock(pmd, &sblock); + if (r) { +- DMERR("couldn't read superblock"); ++ DMERR("couldn't lock superblock"); + goto out; + } + +diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c +index d8334cd45d7c..4cdde7a02e94 100644 +--- a/drivers/md/dm-zoned-metadata.c ++++ b/drivers/md/dm-zoned-metadata.c +@@ -1593,30 +1593,6 @@ struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd) + return zone; + } + +-/* +- * Activate a zone (increment its reference count). +- */ +-void dmz_activate_zone(struct dm_zone *zone) +-{ +- set_bit(DMZ_ACTIVE, &zone->flags); +- atomic_inc(&zone->refcount); +-} +- +-/* +- * Deactivate a zone. This decrement the zone reference counter +- * and clears the active state of the zone once the count reaches 0, +- * indicating that all BIOs to the zone have completed. Returns +- * true if the zone was deactivated. +- */ +-void dmz_deactivate_zone(struct dm_zone *zone) +-{ +- if (atomic_dec_and_test(&zone->refcount)) { +- WARN_ON(!test_bit(DMZ_ACTIVE, &zone->flags)); +- clear_bit_unlock(DMZ_ACTIVE, &zone->flags); +- smp_mb__after_atomic(); +- } +-} +- + /* + * Get the zone mapping a chunk, if the chunk is mapped already. + * If no mapping exist and the operation is WRITE, a zone is +diff --git a/drivers/md/dm-zoned.h b/drivers/md/dm-zoned.h +index 12419f0bfe78..ed8de49c9a08 100644 +--- a/drivers/md/dm-zoned.h ++++ b/drivers/md/dm-zoned.h +@@ -115,7 +115,6 @@ enum { + DMZ_BUF, + + /* Zone internal state */ +- DMZ_ACTIVE, + DMZ_RECLAIM, + DMZ_SEQ_WRITE_ERR, + }; +@@ -128,7 +127,6 @@ enum { + #define dmz_is_empty(z) ((z)->wp_block == 0) + #define dmz_is_offline(z) test_bit(DMZ_OFFLINE, &(z)->flags) + #define dmz_is_readonly(z) test_bit(DMZ_READ_ONLY, &(z)->flags) +-#define dmz_is_active(z) test_bit(DMZ_ACTIVE, &(z)->flags) + #define dmz_in_reclaim(z) test_bit(DMZ_RECLAIM, &(z)->flags) + #define dmz_seq_write_err(z) test_bit(DMZ_SEQ_WRITE_ERR, &(z)->flags) + +@@ -188,8 +186,30 @@ void dmz_unmap_zone(struct dmz_metadata *zmd, struct dm_zone *zone); + unsigned int dmz_nr_rnd_zones(struct dmz_metadata *zmd); + unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd); + +-void dmz_activate_zone(struct dm_zone *zone); +-void dmz_deactivate_zone(struct dm_zone *zone); ++/* ++ * Activate a zone (increment its reference count). ++ */ ++static inline void dmz_activate_zone(struct dm_zone *zone) ++{ ++ atomic_inc(&zone->refcount); ++} ++ ++/* ++ * Deactivate a zone. This decrement the zone reference counter ++ * indicating that all BIOs to the zone have completed when the count is 0. ++ */ ++static inline void dmz_deactivate_zone(struct dm_zone *zone) ++{ ++ atomic_dec(&zone->refcount); ++} ++ ++/* ++ * Test if a zone is active, that is, has a refcount > 0. ++ */ ++static inline bool dmz_is_active(struct dm_zone *zone) ++{ ++ return atomic_read(&zone->refcount); ++} + + int dmz_lock_zone_reclaim(struct dm_zone *zone); + void dmz_unlock_zone_reclaim(struct dm_zone *zone); +diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c +index b83bce2beb66..da94cbaa1a9e 100644 +--- a/drivers/md/raid5.c ++++ b/drivers/md/raid5.c +@@ -7672,7 +7672,7 @@ static int raid5_remove_disk(struct mddev *mddev, struct md_rdev *rdev) + static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev) + { + struct r5conf *conf = mddev->private; +- int err = -EEXIST; ++ int ret, err = -EEXIST; + int disk; + struct disk_info *p; + int first = 0; +@@ -7687,7 +7687,14 @@ static int raid5_add_disk(struct mddev *mddev, struct md_rdev *rdev) + * The array is in readonly mode if journal is missing, so no + * write requests running. We should be safe + */ +- log_init(conf, rdev, false); ++ ret = log_init(conf, rdev, false); ++ if (ret) ++ return ret; ++ ++ ret = r5l_start(conf->log); ++ if (ret) ++ return ret; ++ + return 0; + } + if (mddev->recovery_disabled == conf->recovery_disabled) +diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c +index 3cf25abf5807..cfccee87909a 100644 +--- a/drivers/media/common/videobuf2/videobuf2-core.c ++++ b/drivers/media/common/videobuf2/videobuf2-core.c +@@ -207,6 +207,10 @@ static int __vb2_buf_mem_alloc(struct vb2_buffer *vb) + for (plane = 0; plane < vb->num_planes; ++plane) { + unsigned long size = PAGE_ALIGN(vb->planes[plane].length); + ++ /* Did it wrap around? */ ++ if (size < vb->planes[plane].length) ++ goto free; ++ + mem_priv = call_ptr_memop(vb, alloc, + q->alloc_devs[plane] ? : q->dev, + q->dma_attrs, size, q->dma_dir, q->gfp_flags); +diff --git a/drivers/media/common/videobuf2/videobuf2-dma-sg.c b/drivers/media/common/videobuf2/videobuf2-dma-sg.c +index 4a4c49d6085c..0f06f08346ba 100644 +--- a/drivers/media/common/videobuf2/videobuf2-dma-sg.c ++++ b/drivers/media/common/videobuf2/videobuf2-dma-sg.c +@@ -59,7 +59,7 @@ static int vb2_dma_sg_alloc_compacted(struct vb2_dma_sg_buf *buf, + gfp_t gfp_flags) + { + unsigned int last_page = 0; +- int size = buf->size; ++ unsigned long size = buf->size; + + while (size > 0) { + struct page *pages; +diff --git a/drivers/media/dvb-frontends/stv0297.c b/drivers/media/dvb-frontends/stv0297.c +index dac396c95a59..6d5962d5697a 100644 +--- a/drivers/media/dvb-frontends/stv0297.c ++++ b/drivers/media/dvb-frontends/stv0297.c +@@ -682,7 +682,7 @@ static const struct dvb_frontend_ops stv0297_ops = { + .delsys = { SYS_DVBC_ANNEX_A }, + .info = { + .name = "ST STV0297 DVB-C", +- .frequency_min_hz = 470 * MHz, ++ .frequency_min_hz = 47 * MHz, + .frequency_max_hz = 862 * MHz, + .frequency_stepsize_hz = 62500, + .symbol_rate_min = 870000, +diff --git a/drivers/media/dvb-frontends/tua6100.c b/drivers/media/dvb-frontends/tua6100.c +index f7c3e6be8e4d..2483f614d0e7 100644 +--- a/drivers/media/dvb-frontends/tua6100.c ++++ b/drivers/media/dvb-frontends/tua6100.c +@@ -67,8 +67,8 @@ static int tua6100_set_params(struct dvb_frontend *fe) + struct i2c_msg msg1 = { .addr = priv->i2c_address, .flags = 0, .buf = reg1, .len = 4 }; + struct i2c_msg msg2 = { .addr = priv->i2c_address, .flags = 0, .buf = reg2, .len = 3 }; + +-#define _R 4 +-#define _P 32 ++#define _R_VAL 4 ++#define _P_VAL 32 + #define _ri 4000000 + + // setup register 0 +@@ -83,14 +83,14 @@ static int tua6100_set_params(struct dvb_frontend *fe) + else + reg1[1] = 0x0c; + +- if (_P == 64) ++ if (_P_VAL == 64) + reg1[1] |= 0x40; + if (c->frequency >= 1525000) + reg1[1] |= 0x80; + + // register 2 +- reg2[1] = (_R >> 8) & 0x03; +- reg2[2] = _R; ++ reg2[1] = (_R_VAL >> 8) & 0x03; ++ reg2[2] = _R_VAL; + if (c->frequency < 1455000) + reg2[1] |= 0x1c; + else if (c->frequency < 1630000) +@@ -102,18 +102,18 @@ static int tua6100_set_params(struct dvb_frontend *fe) + * The N divisor ratio (note: c->frequency is in kHz, but we + * need it in Hz) + */ +- prediv = (c->frequency * _R) / (_ri / 1000); +- div = prediv / _P; ++ prediv = (c->frequency * _R_VAL) / (_ri / 1000); ++ div = prediv / _P_VAL; + reg1[1] |= (div >> 9) & 0x03; + reg1[2] = div >> 1; + reg1[3] = (div << 7); +- priv->frequency = ((div * _P) * (_ri / 1000)) / _R; ++ priv->frequency = ((div * _P_VAL) * (_ri / 1000)) / _R_VAL; + + // Finally, calculate and store the value for A +- reg1[3] |= (prediv - (div*_P)) & 0x7f; ++ reg1[3] |= (prediv - (div*_P_VAL)) & 0x7f; + +-#undef _R +-#undef _P ++#undef _R_VAL ++#undef _P_VAL + #undef _ri + + if (fe->ops.i2c_gate_ctrl) +diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile +index d8ad9dad495d..fd4ea86dedd5 100644 +--- a/drivers/media/i2c/Makefile ++++ b/drivers/media/i2c/Makefile +@@ -35,7 +35,7 @@ obj-$(CONFIG_VIDEO_ADV748X) += adv748x/ + obj-$(CONFIG_VIDEO_ADV7604) += adv7604.o + obj-$(CONFIG_VIDEO_ADV7842) += adv7842.o + obj-$(CONFIG_VIDEO_AD9389B) += ad9389b.o +-obj-$(CONFIG_VIDEO_ADV7511) += adv7511.o ++obj-$(CONFIG_VIDEO_ADV7511) += adv7511-v4l2.o + obj-$(CONFIG_VIDEO_VPX3220) += vpx3220.o + obj-$(CONFIG_VIDEO_VS6624) += vs6624.o + obj-$(CONFIG_VIDEO_BT819) += bt819.o +diff --git a/drivers/media/i2c/adv7511.c b/drivers/media/i2c/adv7511-v4l2.c +similarity index 99% +rename from drivers/media/i2c/adv7511.c +rename to drivers/media/i2c/adv7511-v4l2.c +index cec5ebb1c9e6..2ad6bdf1a9fc 100644 +--- a/drivers/media/i2c/adv7511.c ++++ b/drivers/media/i2c/adv7511-v4l2.c +@@ -5,6 +5,11 @@ + * Copyright 2013 Cisco Systems, Inc. and/or its affiliates. All rights reserved. + */ + ++/* ++ * This file is named adv7511-v4l2.c so it doesn't conflict with the Analog ++ * Device ADV7511 (config fragment CONFIG_DRM_I2C_ADV7511). ++ */ ++ + + #include + #include +diff --git a/drivers/media/i2c/msp3400-driver.c b/drivers/media/i2c/msp3400-driver.c +index 39530d43590e..a7caf2eb5771 100644 +--- a/drivers/media/i2c/msp3400-driver.c ++++ b/drivers/media/i2c/msp3400-driver.c +@@ -170,7 +170,7 @@ static int msp_read(struct i2c_client *client, int dev, int addr) + break; + dev_warn(&client->dev, "I/O error #%d (read 0x%02x/0x%02x)\n", err, + dev, addr); +- schedule_timeout_interruptible(msecs_to_jiffies(10)); ++ schedule_msec_hrtimeout_interruptible((10)); + } + if (err == 3) { + dev_warn(&client->dev, "resetting chip, sound will go off.\n"); +@@ -211,7 +211,7 @@ static int msp_write(struct i2c_client *client, int dev, int addr, int val) + break; + dev_warn(&client->dev, "I/O error #%d (write 0x%02x/0x%02x)\n", err, + dev, addr); +- schedule_timeout_interruptible(msecs_to_jiffies(10)); ++ schedule_msec_hrtimeout_interruptible((10)); + } + if (err == 3) { + dev_warn(&client->dev, "resetting chip, sound will go off.\n"); +diff --git a/drivers/media/i2c/mt9m111.c b/drivers/media/i2c/mt9m111.c +index 362c3b93636e..5a642b5ad076 100644 +--- a/drivers/media/i2c/mt9m111.c ++++ b/drivers/media/i2c/mt9m111.c +@@ -1245,9 +1245,11 @@ static int mt9m111_probe(struct i2c_client *client, + if (!mt9m111) + return -ENOMEM; + +- ret = mt9m111_probe_fw(client, mt9m111); +- if (ret) +- return ret; ++ if (dev_fwnode(&client->dev)) { ++ ret = mt9m111_probe_fw(client, mt9m111); ++ if (ret) ++ return ret; ++ } + + mt9m111->clk = v4l2_clk_get(&client->dev, "mclk"); + if (IS_ERR(mt9m111->clk)) +diff --git a/drivers/media/i2c/ov7740.c b/drivers/media/i2c/ov7740.c +index 54e80a60aa57..63011d4b4738 100644 +--- a/drivers/media/i2c/ov7740.c ++++ b/drivers/media/i2c/ov7740.c +@@ -785,7 +785,11 @@ static int ov7740_try_fmt_internal(struct v4l2_subdev *sd, + + fsize++; + } +- ++ if (i >= ARRAY_SIZE(ov7740_framesizes)) { ++ fsize = &ov7740_framesizes[0]; ++ fmt->width = fsize->width; ++ fmt->height = fsize->height; ++ } + if (ret_frmsize != NULL) + *ret_frmsize = fsize; + +diff --git a/drivers/media/media-device.c b/drivers/media/media-device.c +index 9ae481ddd975..e19df5165e78 100644 +--- a/drivers/media/media-device.c ++++ b/drivers/media/media-device.c +@@ -494,6 +494,7 @@ static long media_device_enum_links32(struct media_device *mdev, + { + struct media_links_enum links; + compat_uptr_t pads_ptr, links_ptr; ++ int ret; + + memset(&links, 0, sizeof(links)); + +@@ -505,7 +506,14 @@ static long media_device_enum_links32(struct media_device *mdev, + links.pads = compat_ptr(pads_ptr); + links.links = compat_ptr(links_ptr); + +- return media_device_enum_links(mdev, &links); ++ ret = media_device_enum_links(mdev, &links); ++ if (ret) ++ return ret; ++ ++ if (copy_to_user(ulinks->reserved, links.reserved, ++ sizeof(ulinks->reserved))) ++ return -EFAULT; ++ return 0; + } + + #define MEDIA_IOC_ENUM_LINKS32 _IOWR('|', 0x02, struct media_links_enum32) +diff --git a/drivers/media/pci/cx18/cx18-gpio.c b/drivers/media/pci/cx18/cx18-gpio.c +index cf7cfda94107..f63e17489547 100644 +--- a/drivers/media/pci/cx18/cx18-gpio.c ++++ b/drivers/media/pci/cx18/cx18-gpio.c +@@ -81,11 +81,11 @@ static void gpio_reset_seq(struct cx18 *cx, u32 active_lo, u32 active_hi, + + /* Assert */ + gpio_update(cx, mask, ~active_lo); +- schedule_timeout_uninterruptible(msecs_to_jiffies(assert_msecs)); ++ schedule_msec_hrtimeout_uninterruptible((assert_msecs)); + + /* Deassert */ + gpio_update(cx, mask, ~active_hi); +- schedule_timeout_uninterruptible(msecs_to_jiffies(recovery_msecs)); ++ schedule_msec_hrtimeout_uninterruptible((recovery_msecs)); + } + + /* +diff --git a/drivers/media/pci/ivtv/ivtv-gpio.c b/drivers/media/pci/ivtv/ivtv-gpio.c +index 856e7ab7f33e..766a26251337 100644 +--- a/drivers/media/pci/ivtv/ivtv-gpio.c ++++ b/drivers/media/pci/ivtv/ivtv-gpio.c +@@ -105,7 +105,7 @@ void ivtv_reset_ir_gpio(struct ivtv *itv) + curout = (curout & ~0xF) | 1; + write_reg(curout, IVTV_REG_GPIO_OUT); + /* We could use something else for smaller time */ +- schedule_timeout_interruptible(msecs_to_jiffies(1)); ++ schedule_msec_hrtimeout_interruptible((1)); + curout |= 2; + write_reg(curout, IVTV_REG_GPIO_OUT); + curdir &= ~0x80; +@@ -125,11 +125,11 @@ int ivtv_reset_tuner_gpio(void *dev, int component, int cmd, int value) + curout = read_reg(IVTV_REG_GPIO_OUT); + curout &= ~(1 << itv->card->xceive_pin); + write_reg(curout, IVTV_REG_GPIO_OUT); +- schedule_timeout_interruptible(msecs_to_jiffies(1)); ++ schedule_msec_hrtimeout_interruptible((1)); + + curout |= 1 << itv->card->xceive_pin; + write_reg(curout, IVTV_REG_GPIO_OUT); +- schedule_timeout_interruptible(msecs_to_jiffies(1)); ++ schedule_msec_hrtimeout_interruptible((1)); + return 0; + } + +diff --git a/drivers/media/pci/ivtv/ivtv-ioctl.c b/drivers/media/pci/ivtv/ivtv-ioctl.c +index d1e358a2273e..e022ff80e026 100644 +--- a/drivers/media/pci/ivtv/ivtv-ioctl.c ++++ b/drivers/media/pci/ivtv/ivtv-ioctl.c +@@ -1144,7 +1144,7 @@ void ivtv_s_std_dec(struct ivtv *itv, v4l2_std_id std) + TASK_UNINTERRUPTIBLE); + if ((read_reg(IVTV_REG_DEC_LINE_FIELD) >> 16) < 100) + break; +- schedule_timeout(msecs_to_jiffies(25)); ++ schedule_msec_hrtimeout((25)); + } + finish_wait(&itv->vsync_waitq, &wait); + mutex_lock(&itv->serialize_lock); +diff --git a/drivers/media/pci/ivtv/ivtv-streams.c b/drivers/media/pci/ivtv/ivtv-streams.c +index a641f20e3f86..e1b40d2b4bed 100644 +--- a/drivers/media/pci/ivtv/ivtv-streams.c ++++ b/drivers/media/pci/ivtv/ivtv-streams.c +@@ -843,7 +843,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end) + while (!test_bit(IVTV_F_I_EOS, &itv->i_flags) && + time_before(jiffies, + then + msecs_to_jiffies(2000))) { +- schedule_timeout(msecs_to_jiffies(10)); ++ schedule_msec_hrtimeout((10)); + } + + /* To convert jiffies to ms, we must multiply by 1000 +diff --git a/drivers/media/pci/saa7164/saa7164-core.c b/drivers/media/pci/saa7164/saa7164-core.c +index c594aff92e70..9ae04e18e6c6 100644 +--- a/drivers/media/pci/saa7164/saa7164-core.c ++++ b/drivers/media/pci/saa7164/saa7164-core.c +@@ -1112,16 +1112,25 @@ static int saa7164_proc_show(struct seq_file *m, void *v) + return 0; + } + ++static struct proc_dir_entry *saa7164_pe; ++ + static int saa7164_proc_create(void) + { +- struct proc_dir_entry *pe; +- +- pe = proc_create_single("saa7164", S_IRUGO, NULL, saa7164_proc_show); +- if (!pe) ++ saa7164_pe = proc_create_single("saa7164", 0444, NULL, saa7164_proc_show); ++ if (!saa7164_pe) + return -ENOMEM; + + return 0; + } ++ ++static void saa7164_proc_destroy(void) ++{ ++ if (saa7164_pe) ++ remove_proc_entry("saa7164", NULL); ++} ++#else ++static int saa7164_proc_create(void) { return 0; } ++static void saa7164_proc_destroy(void) {} + #endif + + static int saa7164_thread_function(void *data) +@@ -1493,19 +1502,21 @@ static struct pci_driver saa7164_pci_driver = { + + static int __init saa7164_init(void) + { +- printk(KERN_INFO "saa7164 driver loaded\n"); ++ int ret = pci_register_driver(&saa7164_pci_driver); ++ ++ if (ret) ++ return ret; + +-#ifdef CONFIG_PROC_FS + saa7164_proc_create(); +-#endif +- return pci_register_driver(&saa7164_pci_driver); ++ ++ pr_info("saa7164 driver loaded\n"); ++ ++ return 0; + } + + static void __exit saa7164_fini(void) + { +-#ifdef CONFIG_PROC_FS +- remove_proc_entry("saa7164", NULL); +-#endif ++ saa7164_proc_destroy(); + pci_unregister_driver(&saa7164_pci_driver); + } + +diff --git a/drivers/media/platform/aspeed-video.c b/drivers/media/platform/aspeed-video.c +index 8144fe36ad48..de0f192afa8b 100644 +--- a/drivers/media/platform/aspeed-video.c ++++ b/drivers/media/platform/aspeed-video.c +@@ -187,6 +187,7 @@ enum { + VIDEO_STREAMING, + VIDEO_FRAME_INPRG, + VIDEO_STOPPED, ++ VIDEO_CLOCKS_ON, + }; + + struct aspeed_video_addr { +@@ -483,19 +484,29 @@ static void aspeed_video_enable_mode_detect(struct aspeed_video *video) + + static void aspeed_video_off(struct aspeed_video *video) + { ++ if (!test_bit(VIDEO_CLOCKS_ON, &video->flags)) ++ return; ++ + /* Disable interrupts */ + aspeed_video_write(video, VE_INTERRUPT_CTRL, 0); + + /* Turn off the relevant clocks */ + clk_disable_unprepare(video->vclk); + clk_disable_unprepare(video->eclk); ++ ++ clear_bit(VIDEO_CLOCKS_ON, &video->flags); + } + + static void aspeed_video_on(struct aspeed_video *video) + { ++ if (test_bit(VIDEO_CLOCKS_ON, &video->flags)) ++ return; ++ + /* Turn on the relevant clocks */ + clk_prepare_enable(video->eclk); + clk_prepare_enable(video->vclk); ++ ++ set_bit(VIDEO_CLOCKS_ON, &video->flags); + } + + static void aspeed_video_bufs_done(struct aspeed_video *video, +@@ -1589,8 +1600,9 @@ static int aspeed_video_init(struct aspeed_video *video) + return -ENODEV; + } + +- rc = devm_request_irq(dev, irq, aspeed_video_irq, IRQF_SHARED, +- DEVICE_NAME, video); ++ rc = devm_request_threaded_irq(dev, irq, NULL, aspeed_video_irq, ++ IRQF_ONESHOT | IRQF_SHARED, DEVICE_NAME, ++ video); + if (rc < 0) { + dev_err(dev, "Unable to request IRQ %d\n", irq); + return rc; +diff --git a/drivers/media/platform/coda/Makefile b/drivers/media/platform/coda/Makefile +index f13adacd924e..cfe3ef8fad8a 100644 +--- a/drivers/media/platform/coda/Makefile ++++ b/drivers/media/platform/coda/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0-only + ccflags-y += -I$(src) + +-coda-objs := coda-common.o coda-bit.o coda-gdi.o coda-h264.o coda-jpeg.o ++coda-vpu-objs := coda-common.o coda-bit.o coda-gdi.o coda-h264.o coda-jpeg.o + +-obj-$(CONFIG_VIDEO_CODA) += coda.o ++obj-$(CONFIG_VIDEO_CODA) += coda-vpu.o + obj-$(CONFIG_VIDEO_IMX_VDOA) += imx-vdoa.o +diff --git a/drivers/media/platform/coda/coda-bit.c b/drivers/media/platform/coda/coda-bit.c +index 976f6aa69f41..8f918eb7eb77 100644 +--- a/drivers/media/platform/coda/coda-bit.c ++++ b/drivers/media/platform/coda/coda-bit.c +@@ -1739,6 +1739,7 @@ static int __coda_start_decoding(struct coda_ctx *ctx) + v4l2_err(&dev->v4l2_dev, "CODA_COMMAND_SEQ_INIT timeout\n"); + return ret; + } ++ ctx->sequence_offset = ~0U; + ctx->initialized = 1; + + /* Update kfifo out pointer from coda bitstream read pointer */ +@@ -2146,12 +2147,17 @@ static void coda_finish_decode(struct coda_ctx *ctx) + else if (ctx->display_idx < 0) + ctx->hold = true; + } else if (decoded_idx == -2) { ++ if (ctx->display_idx >= 0 && ++ ctx->display_idx < ctx->num_internal_frames) ++ ctx->sequence_offset++; + /* no frame was decoded, we still return remaining buffers */ + } else if (decoded_idx < 0 || decoded_idx >= ctx->num_internal_frames) { + v4l2_err(&dev->v4l2_dev, + "decoded frame index out of range: %d\n", decoded_idx); + } else { +- val = coda_read(dev, CODA_RET_DEC_PIC_FRAME_NUM) - 1; ++ val = coda_read(dev, CODA_RET_DEC_PIC_FRAME_NUM); ++ if (ctx->sequence_offset == -1) ++ ctx->sequence_offset = val; + val -= ctx->sequence_offset; + spin_lock(&ctx->buffer_meta_lock); + if (!list_empty(&ctx->buffer_meta_list)) { +@@ -2304,7 +2310,6 @@ irqreturn_t coda_irq_handler(int irq, void *data) + if (ctx == NULL) { + v4l2_err(&dev->v4l2_dev, + "Instance released before the end of transaction\n"); +- mutex_unlock(&dev->coda_mutex); + return IRQ_HANDLED; + } + +diff --git a/drivers/media/platform/coda/coda-common.c b/drivers/media/platform/coda/coda-common.c +index 6238047273f2..68a585d3af91 100644 +--- a/drivers/media/platform/coda/coda-common.c ++++ b/drivers/media/platform/coda/coda-common.c +@@ -1024,6 +1024,8 @@ static int coda_encoder_cmd(struct file *file, void *fh, + /* Set the stream-end flag on this context */ + ctx->bit_stream_param |= CODA_BIT_STREAM_END_FLAG; + ++ flush_work(&ctx->pic_run_work); ++ + /* If there is no buffer in flight, wake up */ + if (!ctx->streamon_out || ctx->qsequence == ctx->osequence) { + dst_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, +diff --git a/drivers/media/platform/davinci/vpif_capture.c b/drivers/media/platform/davinci/vpif_capture.c +index 61809d2050fa..f0f7ef638c56 100644 +--- a/drivers/media/platform/davinci/vpif_capture.c ++++ b/drivers/media/platform/davinci/vpif_capture.c +@@ -1376,6 +1376,14 @@ static int initialize_vpif(void) + return err; + } + ++static inline void free_vpif_objs(void) ++{ ++ int i; ++ ++ for (i = 0; i < VPIF_CAPTURE_MAX_DEVICES; i++) ++ kfree(vpif_obj.dev[i]); ++} ++ + static int vpif_async_bound(struct v4l2_async_notifier *notifier, + struct v4l2_subdev *subdev, + struct v4l2_async_subdev *asd) +@@ -1645,7 +1653,7 @@ static __init int vpif_probe(struct platform_device *pdev) + err = v4l2_device_register(vpif_dev, &vpif_obj.v4l2_dev); + if (err) { + v4l2_err(vpif_dev->driver, "Error registering v4l2 device\n"); +- goto cleanup; ++ goto vpif_free; + } + + while ((res = platform_get_resource(pdev, IORESOURCE_IRQ, res_idx))) { +@@ -1692,7 +1700,9 @@ static __init int vpif_probe(struct platform_device *pdev) + "registered sub device %s\n", + subdevdata->name); + } +- vpif_probe_complete(); ++ err = vpif_probe_complete(); ++ if (err) ++ goto probe_subdev_out; + } else { + vpif_obj.notifier.ops = &vpif_async_ops; + err = v4l2_async_notifier_register(&vpif_obj.v4l2_dev, +@@ -1711,6 +1721,8 @@ static __init int vpif_probe(struct platform_device *pdev) + kfree(vpif_obj.sd); + vpif_unregister: + v4l2_device_unregister(&vpif_obj.v4l2_dev); ++vpif_free: ++ free_vpif_objs(); + cleanup: + v4l2_async_notifier_cleanup(&vpif_obj.notifier); + +diff --git a/drivers/media/platform/davinci/vpss.c b/drivers/media/platform/davinci/vpss.c +index 3f079ac1b080..be91b0c7d20b 100644 +--- a/drivers/media/platform/davinci/vpss.c ++++ b/drivers/media/platform/davinci/vpss.c +@@ -509,6 +509,11 @@ static int __init vpss_init(void) + return -EBUSY; + + oper_cfg.vpss_regs_base2 = ioremap(VPSS_CLK_CTRL, 4); ++ if (unlikely(!oper_cfg.vpss_regs_base2)) { ++ release_mem_region(VPSS_CLK_CTRL, 4); ++ return -ENOMEM; ++ } ++ + writel(VPSS_CLK_CTRL_VENCCLKEN | + VPSS_CLK_CTRL_DACCLKEN, oper_cfg.vpss_regs_base2); + +diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c b/drivers/media/platform/marvell-ccic/mcam-core.c +index f1b301810260..0a6411b877e9 100644 +--- a/drivers/media/platform/marvell-ccic/mcam-core.c ++++ b/drivers/media/platform/marvell-ccic/mcam-core.c +@@ -200,7 +200,6 @@ struct mcam_vb_buffer { + struct list_head queue; + struct mcam_dma_desc *dma_desc; /* Descriptor virtual address */ + dma_addr_t dma_desc_pa; /* Descriptor physical address */ +- int dma_desc_nent; /* Number of mapped descriptors */ + }; + + static inline struct mcam_vb_buffer *vb_to_mvb(struct vb2_v4l2_buffer *vb) +@@ -608,9 +607,11 @@ static void mcam_dma_contig_done(struct mcam_camera *cam, int frame) + static void mcam_sg_next_buffer(struct mcam_camera *cam) + { + struct mcam_vb_buffer *buf; ++ struct sg_table *sg_table; + + buf = list_first_entry(&cam->buffers, struct mcam_vb_buffer, queue); + list_del_init(&buf->queue); ++ sg_table = vb2_dma_sg_plane_desc(&buf->vb_buf.vb2_buf, 0); + /* + * Very Bad Not Good Things happen if you don't clear + * C1_DESC_ENA before making any descriptor changes. +@@ -618,7 +619,7 @@ static void mcam_sg_next_buffer(struct mcam_camera *cam) + mcam_reg_clear_bit(cam, REG_CTRL1, C1_DESC_ENA); + mcam_reg_write(cam, REG_DMA_DESC_Y, buf->dma_desc_pa); + mcam_reg_write(cam, REG_DESC_LEN_Y, +- buf->dma_desc_nent*sizeof(struct mcam_dma_desc)); ++ sg_table->nents * sizeof(struct mcam_dma_desc)); + mcam_reg_write(cam, REG_DESC_LEN_U, 0); + mcam_reg_write(cam, REG_DESC_LEN_V, 0); + mcam_reg_set_bit(cam, REG_CTRL1, C1_DESC_ENA); +diff --git a/drivers/media/platform/meson/ao-cec-g12a.c b/drivers/media/platform/meson/ao-cec-g12a.c +index 3620a1e310f5..ddfd060625da 100644 +--- a/drivers/media/platform/meson/ao-cec-g12a.c ++++ b/drivers/media/platform/meson/ao-cec-g12a.c +@@ -415,7 +415,6 @@ static const struct regmap_config meson_ao_cec_g12a_cec_regmap_conf = { + .reg_read = meson_ao_cec_g12a_read, + .reg_write = meson_ao_cec_g12a_write, + .max_register = 0xffff, +- .fast_io = true, + }; + + static inline void +diff --git a/drivers/media/platform/qcom/venus/firmware.c b/drivers/media/platform/qcom/venus/firmware.c +index 1eba23409ff3..d3d1748a7ef6 100644 +--- a/drivers/media/platform/qcom/venus/firmware.c ++++ b/drivers/media/platform/qcom/venus/firmware.c +@@ -78,11 +78,11 @@ static int venus_load_fw(struct venus_core *core, const char *fwname, + + ret = of_address_to_resource(node, 0, &r); + if (ret) +- return ret; ++ goto err_put_node; + + ret = request_firmware(&mdt, fwname, dev); + if (ret < 0) +- return ret; ++ goto err_put_node; + + fw_size = qcom_mdt_get_size(mdt); + if (fw_size < 0) { +@@ -116,6 +116,8 @@ static int venus_load_fw(struct venus_core *core, const char *fwname, + memunmap(mem_va); + err_release_fw: + release_firmware(mdt); ++err_put_node: ++ of_node_put(node); + return ret; + } + +diff --git a/drivers/media/platform/rcar_fdp1.c b/drivers/media/platform/rcar_fdp1.c +index 6a90bc4c476e..b8615a288e2b 100644 +--- a/drivers/media/platform/rcar_fdp1.c ++++ b/drivers/media/platform/rcar_fdp1.c +@@ -257,6 +257,8 @@ MODULE_PARM_DESC(debug, "activate debug info"); + #define FD1_IP_H3_ES1 0x02010101 + #define FD1_IP_M3W 0x02010202 + #define FD1_IP_H3 0x02010203 ++#define FD1_IP_M3N 0x02010204 ++#define FD1_IP_E3 0x02010205 + + /* LUTs */ + #define FD1_LUT_DIF_ADJ 0x1000 +@@ -2365,6 +2367,12 @@ static int fdp1_probe(struct platform_device *pdev) + case FD1_IP_H3: + dprintk(fdp1, "FDP1 Version R-Car H3\n"); + break; ++ case FD1_IP_M3N: ++ dprintk(fdp1, "FDP1 Version R-Car M3N\n"); ++ break; ++ case FD1_IP_E3: ++ dprintk(fdp1, "FDP1 Version R-Car E3\n"); ++ break; + default: + dev_err(fdp1->dev, "FDP1 Unidentifiable (0x%08x)\n", + hw_version); +diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c +index 4e936b95018a..481088a83212 100644 +--- a/drivers/media/platform/s5p-mfc/s5p_mfc.c ++++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c +@@ -523,7 +523,8 @@ static void s5p_mfc_handle_seq_done(struct s5p_mfc_ctx *ctx, + dev); + ctx->mv_count = s5p_mfc_hw_call(dev->mfc_ops, get_mv_count, + dev); +- ctx->scratch_buf_size = s5p_mfc_hw_call(dev->mfc_ops, ++ if (FW_HAS_E_MIN_SCRATCH_BUF(dev)) ++ ctx->scratch_buf_size = s5p_mfc_hw_call(dev->mfc_ops, + get_min_scratch_buf_size, dev); + if (ctx->img_width == 0 || ctx->img_height == 0) + ctx->state = MFCINST_ERROR; +diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c +index 2e62f8721fa5..7d52431c2c83 100644 +--- a/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c ++++ b/drivers/media/platform/s5p-mfc/s5p_mfc_pm.c +@@ -34,6 +34,11 @@ int s5p_mfc_init_pm(struct s5p_mfc_dev *dev) + for (i = 0; i < pm->num_clocks; i++) { + pm->clocks[i] = devm_clk_get(pm->device, pm->clk_names[i]); + if (IS_ERR(pm->clocks[i])) { ++ /* additional clocks are optional */ ++ if (i && PTR_ERR(pm->clocks[i]) == -ENOENT) { ++ pm->clocks[i] = NULL; ++ continue; ++ } + mfc_err("Failed to get clock: %s\n", + pm->clk_names[i]); + return PTR_ERR(pm->clocks[i]); +diff --git a/drivers/media/platform/vim2m.c b/drivers/media/platform/vim2m.c +index 243c82b5d537..acd3bd48c7e2 100644 +--- a/drivers/media/platform/vim2m.c ++++ b/drivers/media/platform/vim2m.c +@@ -1359,7 +1359,7 @@ static int vim2m_probe(struct platform_device *pdev) + MEDIA_ENT_F_PROC_VIDEO_SCALER); + if (ret) { + v4l2_err(&dev->v4l2_dev, "Failed to init mem2mem media controller\n"); +- goto error_m2m; ++ goto error_dev; + } + + ret = media_device_register(&dev->mdev); +@@ -1373,11 +1373,11 @@ static int vim2m_probe(struct platform_device *pdev) + #ifdef CONFIG_MEDIA_CONTROLLER + error_m2m_mc: + v4l2_m2m_unregister_media_controller(dev->m2m_dev); +-error_m2m: +- v4l2_m2m_release(dev->m2m_dev); + #endif + error_dev: + video_unregister_device(&dev->vfd); ++ /* vim2m_device_release called by video_unregister_device to release various objects */ ++ return ret; + error_v4l2: + v4l2_device_unregister(&dev->v4l2_dev); + error_free: +diff --git a/drivers/media/platform/vimc/vimc-capture.c b/drivers/media/platform/vimc/vimc-capture.c +index 946dc0908566..664855708fdf 100644 +--- a/drivers/media/platform/vimc/vimc-capture.c ++++ b/drivers/media/platform/vimc/vimc-capture.c +@@ -142,12 +142,15 @@ static int vimc_cap_s_fmt_vid_cap(struct file *file, void *priv, + struct v4l2_format *f) + { + struct vimc_cap_device *vcap = video_drvdata(file); ++ int ret; + + /* Do not change the format while stream is on */ + if (vb2_is_busy(&vcap->queue)) + return -EBUSY; + +- vimc_cap_try_fmt_vid_cap(file, priv, f); ++ ret = vimc_cap_try_fmt_vid_cap(file, priv, f); ++ if (ret) ++ return ret; + + dev_dbg(vcap->dev, "%s: format update: " + "old:%dx%d (0x%x, %d, %d, %d, %d) " +diff --git a/drivers/media/radio/radio-mr800.c b/drivers/media/radio/radio-mr800.c +index f53f9064e1e9..55ea45d72653 100644 +--- a/drivers/media/radio/radio-mr800.c ++++ b/drivers/media/radio/radio-mr800.c +@@ -369,7 +369,7 @@ static int vidioc_s_hw_freq_seek(struct file *file, void *priv, + retval = -ENODATA; + break; + } +- if (schedule_timeout_interruptible(msecs_to_jiffies(10))) { ++ if (schedule_msec_hrtimeout_interruptible((10))) { + retval = -ERESTARTSYS; + break; + } +diff --git a/drivers/media/radio/radio-raremono.c b/drivers/media/radio/radio-raremono.c +index 5e782b3c2fa9..bf1ee654df80 100644 +--- a/drivers/media/radio/radio-raremono.c ++++ b/drivers/media/radio/radio-raremono.c +@@ -271,6 +271,14 @@ static int vidioc_g_frequency(struct file *file, void *priv, + return 0; + } + ++static void raremono_device_release(struct v4l2_device *v4l2_dev) ++{ ++ struct raremono_device *radio = to_raremono_dev(v4l2_dev); ++ ++ kfree(radio->buffer); ++ kfree(radio); ++} ++ + /* File system interface */ + static const struct v4l2_file_operations usb_raremono_fops = { + .owner = THIS_MODULE, +@@ -295,12 +303,14 @@ static int usb_raremono_probe(struct usb_interface *intf, + struct raremono_device *radio; + int retval = 0; + +- radio = devm_kzalloc(&intf->dev, sizeof(struct raremono_device), GFP_KERNEL); +- if (radio) +- radio->buffer = devm_kmalloc(&intf->dev, BUFFER_LENGTH, GFP_KERNEL); +- +- if (!radio || !radio->buffer) ++ radio = kzalloc(sizeof(*radio), GFP_KERNEL); ++ if (!radio) ++ return -ENOMEM; ++ radio->buffer = kmalloc(BUFFER_LENGTH, GFP_KERNEL); ++ if (!radio->buffer) { ++ kfree(radio); + return -ENOMEM; ++ } + + radio->usbdev = interface_to_usbdev(intf); + radio->intf = intf; +@@ -324,7 +334,8 @@ static int usb_raremono_probe(struct usb_interface *intf, + if (retval != 3 || + (get_unaligned_be16(&radio->buffer[1]) & 0xfff) == 0x0242) { + dev_info(&intf->dev, "this is not Thanko's Raremono.\n"); +- return -ENODEV; ++ retval = -ENODEV; ++ goto free_mem; + } + + dev_info(&intf->dev, "Thanko's Raremono connected: (%04X:%04X)\n", +@@ -333,7 +344,7 @@ static int usb_raremono_probe(struct usb_interface *intf, + retval = v4l2_device_register(&intf->dev, &radio->v4l2_dev); + if (retval < 0) { + dev_err(&intf->dev, "couldn't register v4l2_device\n"); +- return retval; ++ goto free_mem; + } + + mutex_init(&radio->lock); +@@ -345,6 +356,7 @@ static int usb_raremono_probe(struct usb_interface *intf, + radio->vdev.ioctl_ops = &usb_raremono_ioctl_ops; + radio->vdev.lock = &radio->lock; + radio->vdev.release = video_device_release_empty; ++ radio->v4l2_dev.release = raremono_device_release; + + usb_set_intfdata(intf, &radio->v4l2_dev); + +@@ -360,6 +372,10 @@ static int usb_raremono_probe(struct usb_interface *intf, + } + dev_err(&intf->dev, "could not register video device\n"); + v4l2_device_unregister(&radio->v4l2_dev); ++ ++free_mem: ++ kfree(radio->buffer); ++ kfree(radio); + return retval; + } + +diff --git a/drivers/media/radio/radio-tea5777.c b/drivers/media/radio/radio-tea5777.c +index 49d4beba341e..ef8e9294c295 100644 +--- a/drivers/media/radio/radio-tea5777.c ++++ b/drivers/media/radio/radio-tea5777.c +@@ -235,7 +235,7 @@ static int radio_tea5777_update_read_reg(struct radio_tea5777 *tea, int wait) + } + + if (wait) { +- if (schedule_timeout_interruptible(msecs_to_jiffies(wait))) ++ if (schedule_msec_hrtimeout_interruptible((wait))) + return -ERESTARTSYS; + } + +diff --git a/drivers/media/radio/tea575x.c b/drivers/media/radio/tea575x.c +index 64613dd145a1..105d97da584e 100644 +--- a/drivers/media/radio/tea575x.c ++++ b/drivers/media/radio/tea575x.c +@@ -405,7 +405,7 @@ int snd_tea575x_s_hw_freq_seek(struct file *file, struct snd_tea575x *tea, + for (;;) { + if (time_after(jiffies, timeout)) + break; +- if (schedule_timeout_interruptible(msecs_to_jiffies(10))) { ++ if (schedule_msec_hrtimeout_interruptible((10))) { + /* some signal arrived, stop search */ + tea->val &= ~TEA575X_BIT_SEARCH; + snd_tea575x_set_freq(tea); +diff --git a/drivers/media/radio/wl128x/fmdrv_v4l2.c b/drivers/media/radio/wl128x/fmdrv_v4l2.c +index c80a6df47f5e..469366dae1d5 100644 +--- a/drivers/media/radio/wl128x/fmdrv_v4l2.c ++++ b/drivers/media/radio/wl128x/fmdrv_v4l2.c +@@ -541,6 +541,7 @@ int fm_v4l2_init_video_device(struct fmdev *fmdev, int radio_nr) + + /* Register with V4L2 subsystem as RADIO device */ + if (video_register_device(&gradio_dev, VFL_TYPE_RADIO, radio_nr)) { ++ v4l2_device_unregister(&fmdev->v4l2_dev); + fmerr("Could not register video device\n"); + return -ENOMEM; + } +@@ -554,6 +555,8 @@ int fm_v4l2_init_video_device(struct fmdev *fmdev, int radio_nr) + if (ret < 0) { + fmerr("(fmdev): Can't init ctrl handler\n"); + v4l2_ctrl_handler_free(&fmdev->ctrl_handler); ++ video_unregister_device(fmdev->radio_dev); ++ v4l2_device_unregister(&fmdev->v4l2_dev); + return -EBUSY; + } + +diff --git a/drivers/media/rc/ir-spi.c b/drivers/media/rc/ir-spi.c +index 66334e8d63ba..c58f2d38a458 100644 +--- a/drivers/media/rc/ir-spi.c ++++ b/drivers/media/rc/ir-spi.c +@@ -161,6 +161,7 @@ static const struct of_device_id ir_spi_of_match[] = { + { .compatible = "ir-spi-led" }, + {}, + }; ++MODULE_DEVICE_TABLE(of, ir_spi_of_match); + + static struct spi_driver ir_spi_driver = { + .probe = ir_spi_probe, +diff --git a/drivers/media/usb/au0828/au0828-core.c b/drivers/media/usb/au0828/au0828-core.c +index f746f6e2f686..a8a72d5fbd12 100644 +--- a/drivers/media/usb/au0828/au0828-core.c ++++ b/drivers/media/usb/au0828/au0828-core.c +@@ -719,6 +719,12 @@ static int au0828_usb_probe(struct usb_interface *interface, + /* Setup */ + au0828_card_setup(dev); + ++ /* ++ * Store the pointer to the au0828_dev so it can be accessed in ++ * au0828_usb_disconnect ++ */ ++ usb_set_intfdata(interface, dev); ++ + /* Analog TV */ + retval = au0828_analog_register(dev, interface); + if (retval) { +@@ -737,12 +743,6 @@ static int au0828_usb_probe(struct usb_interface *interface, + /* Remote controller */ + au0828_rc_register(dev); + +- /* +- * Store the pointer to the au0828_dev so it can be accessed in +- * au0828_usb_disconnect +- */ +- usb_set_intfdata(interface, dev); +- + pr_info("Registered device AU0828 [%s]\n", + dev->board.name == NULL ? "Unset" : dev->board.name); + +diff --git a/drivers/media/usb/cpia2/cpia2_usb.c b/drivers/media/usb/cpia2/cpia2_usb.c +index b2268981c963..17468f7d78ed 100644 +--- a/drivers/media/usb/cpia2/cpia2_usb.c ++++ b/drivers/media/usb/cpia2/cpia2_usb.c +@@ -893,7 +893,6 @@ static void cpia2_usb_disconnect(struct usb_interface *intf) + cpia2_unregister_camera(cam); + v4l2_device_disconnect(&cam->v4l2_dev); + mutex_unlock(&cam->v4l2_lock); +- v4l2_device_put(&cam->v4l2_dev); + + if(cam->buffers) { + DBG("Wakeup waiting processes\n"); +@@ -902,6 +901,8 @@ static void cpia2_usb_disconnect(struct usb_interface *intf) + wake_up_interruptible(&cam->wq_stream); + } + ++ v4l2_device_put(&cam->v4l2_dev); ++ + LOG("CPiA2 camera disconnected.\n"); + } + +diff --git a/drivers/media/usb/dvb-usb/dvb-usb-init.c b/drivers/media/usb/dvb-usb/dvb-usb-init.c +index e97f6edc98de..65f2b1a20ca1 100644 +--- a/drivers/media/usb/dvb-usb/dvb-usb-init.c ++++ b/drivers/media/usb/dvb-usb/dvb-usb-init.c +@@ -284,12 +284,15 @@ EXPORT_SYMBOL(dvb_usb_device_init); + void dvb_usb_device_exit(struct usb_interface *intf) + { + struct dvb_usb_device *d = usb_get_intfdata(intf); +- const char *name = "generic DVB-USB module"; ++ const char *default_name = "generic DVB-USB module"; ++ char name[40]; + + usb_set_intfdata(intf, NULL); + if (d != NULL && d->desc != NULL) { +- name = d->desc->name; ++ strscpy(name, d->desc->name, sizeof(name)); + dvb_usb_exit(d); ++ } else { ++ strscpy(name, default_name, sizeof(name)); + } + info("%s successfully deinitialized and disconnected.", name); + +diff --git a/drivers/media/usb/hdpvr/hdpvr-video.c b/drivers/media/usb/hdpvr/hdpvr-video.c +index 7580fc5f2f12..6a6405b80797 100644 +--- a/drivers/media/usb/hdpvr/hdpvr-video.c ++++ b/drivers/media/usb/hdpvr/hdpvr-video.c +@@ -435,7 +435,7 @@ static ssize_t hdpvr_read(struct file *file, char __user *buffer, size_t count, + /* wait for the first buffer */ + if (!(file->f_flags & O_NONBLOCK)) { + if (wait_event_interruptible(dev->wait_data, +- hdpvr_get_next_buffer(dev))) ++ !list_empty_careful(&dev->rec_buff_list))) + return -ERESTARTSYS; + } + +@@ -461,10 +461,17 @@ static ssize_t hdpvr_read(struct file *file, char __user *buffer, size_t count, + goto err; + } + if (!err) { +- v4l2_dbg(MSG_INFO, hdpvr_debug, &dev->v4l2_dev, +- "timeout: restart streaming\n"); ++ v4l2_info(&dev->v4l2_dev, ++ "timeout: restart streaming\n"); ++ mutex_lock(&dev->io_mutex); + hdpvr_stop_streaming(dev); +- msecs_to_jiffies(4000); ++ mutex_unlock(&dev->io_mutex); ++ /* ++ * The FW needs about 4 seconds after streaming ++ * stopped before it is ready to restart ++ * streaming. ++ */ ++ msleep(4000); + err = hdpvr_start_streaming(dev); + if (err) { + ret = err; +@@ -1127,9 +1134,7 @@ static void hdpvr_device_release(struct video_device *vdev) + struct hdpvr_device *dev = video_get_drvdata(vdev); + + hdpvr_delete(dev); +- mutex_lock(&dev->io_mutex); + flush_work(&dev->worker); +- mutex_unlock(&dev->io_mutex); + + v4l2_device_unregister(&dev->v4l2_dev); + v4l2_ctrl_handler_free(&dev->hdl); +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c +index 70b5cb08d65b..bbf361ce0bd0 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-hdw.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-hdw.c +@@ -1670,7 +1670,7 @@ static int pvr2_decoder_enable(struct pvr2_hdw *hdw,int enablefl) + } + if (!hdw->flag_decoder_missed) { + pvr2_trace(PVR2_TRACE_ERROR_LEGS, +- "WARNING: No decoder present"); ++ "***WARNING*** No decoder present"); + hdw->flag_decoder_missed = !0; + trace_stbit("flag_decoder_missed", + hdw->flag_decoder_missed); +@@ -2356,7 +2356,7 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf, + if (hdw_desc->flag_is_experimental) { + pvr2_trace(PVR2_TRACE_INFO, "**********"); + pvr2_trace(PVR2_TRACE_INFO, +- "WARNING: Support for this device (%s) is experimental.", ++ "***WARNING*** Support for this device (%s) is experimental.", + hdw_desc->description); + pvr2_trace(PVR2_TRACE_INFO, + "Important functionality might not be entirely working."); +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-i2c-core.c b/drivers/media/usb/pvrusb2/pvrusb2-i2c-core.c +index 68e323f8d9cf..275394bafe7d 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-i2c-core.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-i2c-core.c +@@ -333,11 +333,11 @@ static int i2c_hack_cx25840(struct pvr2_hdw *hdw, + + if ((ret != 0) || (*rdata == 0x04) || (*rdata == 0x0a)) { + pvr2_trace(PVR2_TRACE_ERROR_LEGS, +- "WARNING: Detected a wedged cx25840 chip; the device will not work."); ++ "***WARNING*** Detected a wedged cx25840 chip; the device will not work."); + pvr2_trace(PVR2_TRACE_ERROR_LEGS, +- "WARNING: Try power cycling the pvrusb2 device."); ++ "***WARNING*** Try power cycling the pvrusb2 device."); + pvr2_trace(PVR2_TRACE_ERROR_LEGS, +- "WARNING: Disabling further access to the device to prevent other foul-ups."); ++ "***WARNING*** Disabling further access to the device to prevent other foul-ups."); + // This blocks all further communication with the part. + hdw->i2c_func[0x44] = NULL; + pvr2_hdw_render_useless(hdw); +diff --git a/drivers/media/usb/pvrusb2/pvrusb2-std.c b/drivers/media/usb/pvrusb2/pvrusb2-std.c +index 447279b4a545..e7ab41401577 100644 +--- a/drivers/media/usb/pvrusb2/pvrusb2-std.c ++++ b/drivers/media/usb/pvrusb2/pvrusb2-std.c +@@ -343,7 +343,7 @@ struct v4l2_standard *pvr2_std_create_enum(unsigned int *countptr, + bcnt = pvr2_std_id_to_str(buf,sizeof(buf),fmsk); + pvr2_trace( + PVR2_TRACE_ERROR_LEGS, +- "WARNING: Failed to classify the following standard(s): %.*s", ++ "***WARNING*** Failed to classify the following standard(s): %.*s", + bcnt,buf); + } + +diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c +index 26163a5bde7d..e399b9fad757 100644 +--- a/drivers/media/usb/uvc/uvc_ctrl.c ++++ b/drivers/media/usb/uvc/uvc_ctrl.c +@@ -2345,7 +2345,9 @@ void uvc_ctrl_cleanup_device(struct uvc_device *dev) + struct uvc_entity *entity; + unsigned int i; + +- cancel_work_sync(&dev->async_ctrl.work); ++ /* Can be uninitialized if we are aborting on probe error. */ ++ if (dev->async_ctrl.work.func) ++ cancel_work_sync(&dev->async_ctrl.work); + + /* Free controls and control mappings for all entities. */ + list_for_each_entry(entity, &dev->entities, list) { +diff --git a/drivers/media/usb/zr364xx/zr364xx.c b/drivers/media/usb/zr364xx/zr364xx.c +index 37a7992585df..48803eb773ed 100644 +--- a/drivers/media/usb/zr364xx/zr364xx.c ++++ b/drivers/media/usb/zr364xx/zr364xx.c +@@ -694,7 +694,8 @@ static int zr364xx_vidioc_querycap(struct file *file, void *priv, + struct zr364xx_camera *cam = video_drvdata(file); + + strscpy(cap->driver, DRIVER_DESC, sizeof(cap->driver)); +- strscpy(cap->card, cam->udev->product, sizeof(cap->card)); ++ if (cam->udev->product) ++ strscpy(cap->card, cam->udev->product, sizeof(cap->card)); + strscpy(cap->bus_info, dev_name(&cam->udev->dev), + sizeof(cap->bus_info)); + cap->device_caps = V4L2_CAP_VIDEO_CAPTURE | +diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c +index 7d3a33258748..4d385489be6d 100644 +--- a/drivers/media/v4l2-core/v4l2-ctrls.c ++++ b/drivers/media/v4l2-core/v4l2-ctrls.c +@@ -2149,15 +2149,6 @@ static int handler_new_ref(struct v4l2_ctrl_handler *hdl, + if (size_extra_req) + new_ref->p_req.p = &new_ref[1]; + +- if (ctrl->handler == hdl) { +- /* By default each control starts in a cluster of its own. +- new_ref->ctrl is basically a cluster array with one +- element, so that's perfect to use as the cluster pointer. +- But only do this for the handler that owns the control. */ +- ctrl->cluster = &new_ref->ctrl; +- ctrl->ncontrols = 1; +- } +- + INIT_LIST_HEAD(&new_ref->node); + + mutex_lock(hdl->lock); +@@ -2190,6 +2181,15 @@ static int handler_new_ref(struct v4l2_ctrl_handler *hdl, + hdl->buckets[bucket] = new_ref; + if (ctrl_ref) + *ctrl_ref = new_ref; ++ if (ctrl->handler == hdl) { ++ /* By default each control starts in a cluster of its own. ++ * new_ref->ctrl is basically a cluster array with one ++ * element, so that's perfect to use as the cluster pointer. ++ * But only do this for the handler that owns the control. ++ */ ++ ctrl->cluster = &new_ref->ctrl; ++ ctrl->ncontrols = 1; ++ } + + unlock: + mutex_unlock(hdl->lock); +@@ -2369,16 +2369,15 @@ struct v4l2_ctrl *v4l2_ctrl_new_custom(struct v4l2_ctrl_handler *hdl, + v4l2_ctrl_fill(cfg->id, &name, &type, &min, &max, &step, + &def, &flags); + +- is_menu = (cfg->type == V4L2_CTRL_TYPE_MENU || +- cfg->type == V4L2_CTRL_TYPE_INTEGER_MENU); ++ is_menu = (type == V4L2_CTRL_TYPE_MENU || ++ type == V4L2_CTRL_TYPE_INTEGER_MENU); + if (is_menu) + WARN_ON(step); + else + WARN_ON(cfg->menu_skip_mask); +- if (cfg->type == V4L2_CTRL_TYPE_MENU && qmenu == NULL) ++ if (type == V4L2_CTRL_TYPE_MENU && !qmenu) { + qmenu = v4l2_ctrl_get_menu(cfg->id); +- else if (cfg->type == V4L2_CTRL_TYPE_INTEGER_MENU && +- qmenu_int == NULL) { ++ } else if (type == V4L2_CTRL_TYPE_INTEGER_MENU && !qmenu_int) { + handler_set_err(hdl, -EINVAL); + return NULL; + } +diff --git a/drivers/memstick/core/memstick.c b/drivers/memstick/core/memstick.c +index 6cfb293396f2..693ee73eb291 100644 +--- a/drivers/memstick/core/memstick.c ++++ b/drivers/memstick/core/memstick.c +@@ -625,13 +625,18 @@ static int __init memstick_init(void) + return -ENOMEM; + + rc = bus_register(&memstick_bus_type); +- if (!rc) +- rc = class_register(&memstick_host_class); ++ if (rc) ++ goto error_destroy_workqueue; + +- if (!rc) +- return 0; ++ rc = class_register(&memstick_host_class); ++ if (rc) ++ goto error_bus_unregister; ++ ++ return 0; + ++error_bus_unregister: + bus_unregister(&memstick_bus_type); ++error_destroy_workqueue: + destroy_workqueue(workqueue); + + return rc; +diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c +index 2bdc7b02157a..4a31907a4525 100644 +--- a/drivers/mfd/arizona-core.c ++++ b/drivers/mfd/arizona-core.c +@@ -993,7 +993,7 @@ int arizona_dev_init(struct arizona *arizona) + unsigned int reg, val; + int (*apply_patch)(struct arizona *) = NULL; + const struct mfd_cell *subdevs = NULL; +- int n_subdevs, ret, i; ++ int n_subdevs = 0, ret, i; + + dev_set_drvdata(arizona->dev, arizona); + mutex_init(&arizona->clk_lock); +diff --git a/drivers/mfd/cros_ec_dev.c b/drivers/mfd/cros_ec_dev.c +index a5391f96eafd..607383b67cf1 100644 +--- a/drivers/mfd/cros_ec_dev.c ++++ b/drivers/mfd/cros_ec_dev.c +@@ -285,13 +285,15 @@ static void cros_ec_sensors_register(struct cros_ec_dev *ec) + + resp = (struct ec_response_motion_sense *)msg->data; + sensor_num = resp->dump.sensor_count; +- /* Allocate 1 extra sensors in FIFO are needed */ +- sensor_cells = kcalloc(sensor_num + 1, sizeof(struct mfd_cell), ++ /* ++ * Allocate 2 extra sensors if lid angle sensor and/or FIFO are needed. ++ */ ++ sensor_cells = kcalloc(sensor_num + 2, sizeof(struct mfd_cell), + GFP_KERNEL); + if (sensor_cells == NULL) + goto error; + +- sensor_platforms = kcalloc(sensor_num + 1, ++ sensor_platforms = kcalloc(sensor_num, + sizeof(struct cros_ec_sensor_platform), + GFP_KERNEL); + if (sensor_platforms == NULL) +@@ -351,6 +353,11 @@ static void cros_ec_sensors_register(struct cros_ec_dev *ec) + sensor_cells[id].name = "cros-ec-ring"; + id++; + } ++ if (cros_ec_check_features(ec, ++ EC_FEATURE_REFINED_TABLET_MODE_HYSTERESIS)) { ++ sensor_cells[id].name = "cros-ec-lid-angle"; ++ id++; ++ } + + ret = mfd_add_devices(ec->dev, 0, sensor_cells, id, + NULL, 0, NULL); +diff --git a/drivers/mfd/hi655x-pmic.c b/drivers/mfd/hi655x-pmic.c +index f1c51ce309fa..7e3959aaa285 100644 +--- a/drivers/mfd/hi655x-pmic.c ++++ b/drivers/mfd/hi655x-pmic.c +@@ -109,6 +109,8 @@ static int hi655x_pmic_probe(struct platform_device *pdev) + + pmic->regmap = devm_regmap_init_mmio_clk(dev, NULL, base, + &hi655x_regmap_config); ++ if (IS_ERR(pmic->regmap)) ++ return PTR_ERR(pmic->regmap); + + regmap_read(pmic->regmap, HI655X_BUS_ADDR(HI655X_VER_REG), &pmic->ver); + if ((pmic->ver < PMU_VER_START) || (pmic->ver > PMU_VER_END)) { +diff --git a/drivers/mfd/madera-core.c b/drivers/mfd/madera-core.c +index 2a77988d0462..826b971ccb86 100644 +--- a/drivers/mfd/madera-core.c ++++ b/drivers/mfd/madera-core.c +@@ -286,6 +286,7 @@ const struct of_device_id madera_of_match[] = { + { .compatible = "cirrus,wm1840", .data = (void *)WM1840 }, + {} + }; ++MODULE_DEVICE_TABLE(of, madera_of_match); + EXPORT_SYMBOL_GPL(madera_of_match); + + static int madera_get_reset_gpio(struct madera *madera) +diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c +index dbf684c4ebfb..23276a80e3b4 100644 +--- a/drivers/mfd/mfd-core.c ++++ b/drivers/mfd/mfd-core.c +@@ -175,6 +175,7 @@ static int mfd_add_device(struct device *parent, int id, + for_each_child_of_node(parent->of_node, np) { + if (of_device_is_compatible(np, cell->of_compatible)) { + pdev->dev.of_node = np; ++ pdev->dev.fwnode = &np->fwnode; + break; + } + } +diff --git a/drivers/mfd/ucb1x00-core.c b/drivers/mfd/ucb1x00-core.c +index b690796d24d4..448b13da62b4 100644 +--- a/drivers/mfd/ucb1x00-core.c ++++ b/drivers/mfd/ucb1x00-core.c +@@ -250,7 +250,7 @@ unsigned int ucb1x00_adc_read(struct ucb1x00 *ucb, int adc_channel, int sync) + break; + /* yield to other processes */ + set_current_state(TASK_INTERRUPTIBLE); +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + } + + return UCB_ADC_DAT(val); +diff --git a/drivers/misc/eeprom/Kconfig b/drivers/misc/eeprom/Kconfig +index f88094719552..f2abe27010ef 100644 +--- a/drivers/misc/eeprom/Kconfig ++++ b/drivers/misc/eeprom/Kconfig +@@ -5,6 +5,7 @@ config EEPROM_AT24 + tristate "I2C EEPROMs / RAMs / ROMs from most vendors" + depends on I2C && SYSFS + select NVMEM ++ select NVMEM_SYSFS + select REGMAP_I2C + help + Enable this driver to get read/write support to most I2C EEPROMs +@@ -34,6 +35,7 @@ config EEPROM_AT25 + tristate "SPI EEPROMs from most vendors" + depends on SPI && SYSFS + select NVMEM ++ select NVMEM_SYSFS + help + Enable this driver to get read/write support to most SPI EEPROMs, + after you configure the board init code to know about each eeprom +@@ -80,6 +82,7 @@ config EEPROM_93XX46 + depends on SPI && SYSFS + select REGMAP + select NVMEM ++ select NVMEM_SYSFS + help + Driver for the microwire EEPROM chipsets 93xx46x. The driver + supports both read and write commands and also the command to +diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c +index 63aa541c9608..50f0f3c66934 100644 +--- a/drivers/misc/eeprom/at24.c ++++ b/drivers/misc/eeprom/at24.c +@@ -719,7 +719,7 @@ static int at24_probe(struct i2c_client *client) + nvmem_config.name = dev_name(dev); + nvmem_config.dev = dev; + nvmem_config.read_only = !writable; +- nvmem_config.root_only = true; ++ nvmem_config.root_only = !(flags & AT24_FLAG_IRUGO); + nvmem_config.owner = THIS_MODULE; + nvmem_config.compat = true; + nvmem_config.base_dev = dev; +diff --git a/drivers/misc/lkdtm/Makefile b/drivers/misc/lkdtm/Makefile +index 951c984de61a..fb10eafe9bde 100644 +--- a/drivers/misc/lkdtm/Makefile ++++ b/drivers/misc/lkdtm/Makefile +@@ -15,8 +15,7 @@ KCOV_INSTRUMENT_rodata.o := n + + OBJCOPYFLAGS := + OBJCOPYFLAGS_rodata_objcopy.o := \ +- --set-section-flags .text=alloc,readonly \ +- --rename-section .text=.rodata ++ --rename-section .text=.rodata,alloc,readonly,load + targets += rodata.o rodata_objcopy.o + $(obj)/rodata_objcopy.o: $(obj)/rodata.o FORCE + $(call if_changed,objcopy) +diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h +index d74b182e19f3..6c0173772162 100644 +--- a/drivers/misc/mei/hw-me-regs.h ++++ b/drivers/misc/mei/hw-me-regs.h +@@ -81,6 +81,9 @@ + + #define MEI_DEV_ID_ICP_LP 0x34E0 /* Ice Lake Point LP */ + ++#define MEI_DEV_ID_MCC 0x4B70 /* Mule Creek Canyon (EHL) */ ++#define MEI_DEV_ID_MCC_4 0x4B75 /* Mule Creek Canyon 4 (EHL) */ ++ + /* + * MEI HW Section + */ +diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c +index 7a2b3545a7f9..57cb68f5cc64 100644 +--- a/drivers/misc/mei/pci-me.c ++++ b/drivers/misc/mei/pci-me.c +@@ -98,6 +98,9 @@ static const struct pci_device_id mei_me_pci_tbl[] = { + + {MEI_PCI_DEVICE(MEI_DEV_ID_ICP_LP, MEI_ME_PCH12_CFG)}, + ++ {MEI_PCI_DEVICE(MEI_DEV_ID_MCC, MEI_ME_PCH12_CFG)}, ++ {MEI_PCI_DEVICE(MEI_DEV_ID_MCC_4, MEI_ME_PCH8_CFG)}, ++ + /* required last entry */ + {0, } + }; +diff --git a/drivers/misc/sgi-xp/xpc_channel.c b/drivers/misc/sgi-xp/xpc_channel.c +index 8e6607fc8a67..b9ab770bbdb5 100644 +--- a/drivers/misc/sgi-xp/xpc_channel.c ++++ b/drivers/misc/sgi-xp/xpc_channel.c +@@ -834,7 +834,7 @@ xpc_allocate_msg_wait(struct xpc_channel *ch) + + atomic_inc(&ch->n_on_msg_allocate_wq); + prepare_to_wait(&ch->msg_allocate_wq, &wait, TASK_INTERRUPTIBLE); +- ret = schedule_timeout(1); ++ ret = schedule_min_hrtimeout(); + finish_wait(&ch->msg_allocate_wq, &wait); + atomic_dec(&ch->n_on_msg_allocate_wq); + +diff --git a/drivers/misc/vmw_vmci/vmci_context.c b/drivers/misc/vmw_vmci/vmci_context.c +index 300ed69fe2c7..16695366ec92 100644 +--- a/drivers/misc/vmw_vmci/vmci_context.c ++++ b/drivers/misc/vmw_vmci/vmci_context.c +@@ -21,6 +21,9 @@ + #include "vmci_driver.h" + #include "vmci_event.h" + ++/* Use a wide upper bound for the maximum contexts. */ ++#define VMCI_MAX_CONTEXTS 2000 ++ + /* + * List of current VMCI contexts. Contexts can be added by + * vmci_ctx_create() and removed via vmci_ctx_destroy(). +@@ -117,19 +120,22 @@ struct vmci_ctx *vmci_ctx_create(u32 cid, u32 priv_flags, + /* Initialize host-specific VMCI context. */ + init_waitqueue_head(&context->host_context.wait_queue); + +- context->queue_pair_array = vmci_handle_arr_create(0); ++ context->queue_pair_array = ++ vmci_handle_arr_create(0, VMCI_MAX_GUEST_QP_COUNT); + if (!context->queue_pair_array) { + error = -ENOMEM; + goto err_free_ctx; + } + +- context->doorbell_array = vmci_handle_arr_create(0); ++ context->doorbell_array = ++ vmci_handle_arr_create(0, VMCI_MAX_GUEST_DOORBELL_COUNT); + if (!context->doorbell_array) { + error = -ENOMEM; + goto err_free_qp_array; + } + +- context->pending_doorbell_array = vmci_handle_arr_create(0); ++ context->pending_doorbell_array = ++ vmci_handle_arr_create(0, VMCI_MAX_GUEST_DOORBELL_COUNT); + if (!context->pending_doorbell_array) { + error = -ENOMEM; + goto err_free_db_array; +@@ -204,7 +210,7 @@ static int ctx_fire_notification(u32 context_id, u32 priv_flags) + * We create an array to hold the subscribers we find when + * scanning through all contexts. + */ +- subscriber_array = vmci_handle_arr_create(0); ++ subscriber_array = vmci_handle_arr_create(0, VMCI_MAX_CONTEXTS); + if (subscriber_array == NULL) + return VMCI_ERROR_NO_MEM; + +@@ -623,20 +629,26 @@ int vmci_ctx_add_notification(u32 context_id, u32 remote_cid) + + spin_lock(&context->lock); + +- list_for_each_entry(n, &context->notifier_list, node) { +- if (vmci_handle_is_equal(n->handle, notifier->handle)) { +- exists = true; +- break; ++ if (context->n_notifiers < VMCI_MAX_CONTEXTS) { ++ list_for_each_entry(n, &context->notifier_list, node) { ++ if (vmci_handle_is_equal(n->handle, notifier->handle)) { ++ exists = true; ++ break; ++ } + } +- } + +- if (exists) { +- kfree(notifier); +- result = VMCI_ERROR_ALREADY_EXISTS; ++ if (exists) { ++ kfree(notifier); ++ result = VMCI_ERROR_ALREADY_EXISTS; ++ } else { ++ list_add_tail_rcu(¬ifier->node, ++ &context->notifier_list); ++ context->n_notifiers++; ++ result = VMCI_SUCCESS; ++ } + } else { +- list_add_tail_rcu(¬ifier->node, &context->notifier_list); +- context->n_notifiers++; +- result = VMCI_SUCCESS; ++ kfree(notifier); ++ result = VMCI_ERROR_NO_MEM; + } + + spin_unlock(&context->lock); +@@ -721,8 +733,7 @@ static int vmci_ctx_get_chkpt_doorbells(struct vmci_ctx *context, + u32 *buf_size, void **pbuf) + { + struct dbell_cpt_state *dbells; +- size_t n_doorbells; +- int i; ++ u32 i, n_doorbells; + + n_doorbells = vmci_handle_arr_get_size(context->doorbell_array); + if (n_doorbells > 0) { +@@ -860,7 +871,8 @@ int vmci_ctx_rcv_notifications_get(u32 context_id, + spin_lock(&context->lock); + + *db_handle_array = context->pending_doorbell_array; +- context->pending_doorbell_array = vmci_handle_arr_create(0); ++ context->pending_doorbell_array = ++ vmci_handle_arr_create(0, VMCI_MAX_GUEST_DOORBELL_COUNT); + if (!context->pending_doorbell_array) { + context->pending_doorbell_array = *db_handle_array; + *db_handle_array = NULL; +@@ -942,12 +954,11 @@ int vmci_ctx_dbell_create(u32 context_id, struct vmci_handle handle) + return VMCI_ERROR_NOT_FOUND; + + spin_lock(&context->lock); +- if (!vmci_handle_arr_has_entry(context->doorbell_array, handle)) { +- vmci_handle_arr_append_entry(&context->doorbell_array, handle); +- result = VMCI_SUCCESS; +- } else { ++ if (!vmci_handle_arr_has_entry(context->doorbell_array, handle)) ++ result = vmci_handle_arr_append_entry(&context->doorbell_array, ++ handle); ++ else + result = VMCI_ERROR_DUPLICATE_ENTRY; +- } + + spin_unlock(&context->lock); + vmci_ctx_put(context); +@@ -1083,15 +1094,16 @@ int vmci_ctx_notify_dbell(u32 src_cid, + if (!vmci_handle_arr_has_entry( + dst_context->pending_doorbell_array, + handle)) { +- vmci_handle_arr_append_entry( ++ result = vmci_handle_arr_append_entry( + &dst_context->pending_doorbell_array, + handle); +- +- ctx_signal_notify(dst_context); +- wake_up(&dst_context->host_context.wait_queue); +- ++ if (result == VMCI_SUCCESS) { ++ ctx_signal_notify(dst_context); ++ wake_up(&dst_context->host_context.wait_queue); ++ } ++ } else { ++ result = VMCI_SUCCESS; + } +- result = VMCI_SUCCESS; + } + spin_unlock(&dst_context->lock); + } +@@ -1118,13 +1130,11 @@ int vmci_ctx_qp_create(struct vmci_ctx *context, struct vmci_handle handle) + if (context == NULL || vmci_handle_is_invalid(handle)) + return VMCI_ERROR_INVALID_ARGS; + +- if (!vmci_handle_arr_has_entry(context->queue_pair_array, handle)) { +- vmci_handle_arr_append_entry(&context->queue_pair_array, +- handle); +- result = VMCI_SUCCESS; +- } else { ++ if (!vmci_handle_arr_has_entry(context->queue_pair_array, handle)) ++ result = vmci_handle_arr_append_entry( ++ &context->queue_pair_array, handle); ++ else + result = VMCI_ERROR_DUPLICATE_ENTRY; +- } + + return result; + } +diff --git a/drivers/misc/vmw_vmci/vmci_handle_array.c b/drivers/misc/vmw_vmci/vmci_handle_array.c +index c527388f5d7b..de7fee7ead1b 100644 +--- a/drivers/misc/vmw_vmci/vmci_handle_array.c ++++ b/drivers/misc/vmw_vmci/vmci_handle_array.c +@@ -8,24 +8,29 @@ + #include + #include "vmci_handle_array.h" + +-static size_t handle_arr_calc_size(size_t capacity) ++static size_t handle_arr_calc_size(u32 capacity) + { +- return sizeof(struct vmci_handle_arr) + ++ return VMCI_HANDLE_ARRAY_HEADER_SIZE + + capacity * sizeof(struct vmci_handle); + } + +-struct vmci_handle_arr *vmci_handle_arr_create(size_t capacity) ++struct vmci_handle_arr *vmci_handle_arr_create(u32 capacity, u32 max_capacity) + { + struct vmci_handle_arr *array; + ++ if (max_capacity == 0 || capacity > max_capacity) ++ return NULL; ++ + if (capacity == 0) +- capacity = VMCI_HANDLE_ARRAY_DEFAULT_SIZE; ++ capacity = min((u32)VMCI_HANDLE_ARRAY_DEFAULT_CAPACITY, ++ max_capacity); + + array = kmalloc(handle_arr_calc_size(capacity), GFP_ATOMIC); + if (!array) + return NULL; + + array->capacity = capacity; ++ array->max_capacity = max_capacity; + array->size = 0; + + return array; +@@ -36,27 +41,34 @@ void vmci_handle_arr_destroy(struct vmci_handle_arr *array) + kfree(array); + } + +-void vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, +- struct vmci_handle handle) ++int vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, ++ struct vmci_handle handle) + { + struct vmci_handle_arr *array = *array_ptr; + + if (unlikely(array->size >= array->capacity)) { + /* reallocate. */ + struct vmci_handle_arr *new_array; +- size_t new_capacity = array->capacity * VMCI_ARR_CAP_MULT; +- size_t new_size = handle_arr_calc_size(new_capacity); ++ u32 capacity_bump = min(array->max_capacity - array->capacity, ++ array->capacity); ++ size_t new_size = handle_arr_calc_size(array->capacity + ++ capacity_bump); ++ ++ if (array->size >= array->max_capacity) ++ return VMCI_ERROR_NO_MEM; + + new_array = krealloc(array, new_size, GFP_ATOMIC); + if (!new_array) +- return; ++ return VMCI_ERROR_NO_MEM; + +- new_array->capacity = new_capacity; ++ new_array->capacity += capacity_bump; + *array_ptr = array = new_array; + } + + array->entries[array->size] = handle; + array->size++; ++ ++ return VMCI_SUCCESS; + } + + /* +@@ -66,7 +78,7 @@ struct vmci_handle vmci_handle_arr_remove_entry(struct vmci_handle_arr *array, + struct vmci_handle entry_handle) + { + struct vmci_handle handle = VMCI_INVALID_HANDLE; +- size_t i; ++ u32 i; + + for (i = 0; i < array->size; i++) { + if (vmci_handle_is_equal(array->entries[i], entry_handle)) { +@@ -101,7 +113,7 @@ struct vmci_handle vmci_handle_arr_remove_tail(struct vmci_handle_arr *array) + * Handle at given index, VMCI_INVALID_HANDLE if invalid index. + */ + struct vmci_handle +-vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, size_t index) ++vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, u32 index) + { + if (unlikely(index >= array->size)) + return VMCI_INVALID_HANDLE; +@@ -112,7 +124,7 @@ vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, size_t index) + bool vmci_handle_arr_has_entry(const struct vmci_handle_arr *array, + struct vmci_handle entry_handle) + { +- size_t i; ++ u32 i; + + for (i = 0; i < array->size; i++) + if (vmci_handle_is_equal(array->entries[i], entry_handle)) +diff --git a/drivers/misc/vmw_vmci/vmci_handle_array.h b/drivers/misc/vmw_vmci/vmci_handle_array.h +index bd1559a548e9..96193f85be5b 100644 +--- a/drivers/misc/vmw_vmci/vmci_handle_array.h ++++ b/drivers/misc/vmw_vmci/vmci_handle_array.h +@@ -9,32 +9,41 @@ + #define _VMCI_HANDLE_ARRAY_H_ + + #include ++#include + #include + +-#define VMCI_HANDLE_ARRAY_DEFAULT_SIZE 4 +-#define VMCI_ARR_CAP_MULT 2 /* Array capacity multiplier */ +- + struct vmci_handle_arr { +- size_t capacity; +- size_t size; ++ u32 capacity; ++ u32 max_capacity; ++ u32 size; ++ u32 pad; + struct vmci_handle entries[]; + }; + +-struct vmci_handle_arr *vmci_handle_arr_create(size_t capacity); ++#define VMCI_HANDLE_ARRAY_HEADER_SIZE \ ++ offsetof(struct vmci_handle_arr, entries) ++/* Select a default capacity that results in a 64 byte sized array */ ++#define VMCI_HANDLE_ARRAY_DEFAULT_CAPACITY 6 ++/* Make sure that the max array size can be expressed by a u32 */ ++#define VMCI_HANDLE_ARRAY_MAX_CAPACITY \ ++ ((U32_MAX - VMCI_HANDLE_ARRAY_HEADER_SIZE - 1) / \ ++ sizeof(struct vmci_handle)) ++ ++struct vmci_handle_arr *vmci_handle_arr_create(u32 capacity, u32 max_capacity); + void vmci_handle_arr_destroy(struct vmci_handle_arr *array); +-void vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, +- struct vmci_handle handle); ++int vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr, ++ struct vmci_handle handle); + struct vmci_handle vmci_handle_arr_remove_entry(struct vmci_handle_arr *array, + struct vmci_handle + entry_handle); + struct vmci_handle vmci_handle_arr_remove_tail(struct vmci_handle_arr *array); + struct vmci_handle +-vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, size_t index); ++vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, u32 index); + bool vmci_handle_arr_has_entry(const struct vmci_handle_arr *array, + struct vmci_handle entry_handle); + struct vmci_handle *vmci_handle_arr_get_handles(struct vmci_handle_arr *array); + +-static inline size_t vmci_handle_arr_get_size( ++static inline u32 vmci_handle_arr_get_size( + const struct vmci_handle_arr *array) + { + return array->size; +diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c +index 3557d5c51141..245a6fd668c8 100644 +--- a/drivers/mmc/core/queue.c ++++ b/drivers/mmc/core/queue.c +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -430,6 +431,10 @@ int mmc_init_queue(struct mmc_queue *mq, struct mmc_card *card) + goto free_tag_set; + } + ++ if (mmc_host_is_spi(host) && host->use_spi_crc) ++ mq->queue->backing_dev_info->capabilities |= ++ BDI_CAP_STABLE_WRITES; ++ + mq->queue->queuedata = mq; + blk_queue_rq_timeout(mq->queue, 60 * HZ); + +diff --git a/drivers/mmc/host/cavium.c b/drivers/mmc/host/cavium.c +index ed5cefb83768..89deb451e0ac 100644 +--- a/drivers/mmc/host/cavium.c ++++ b/drivers/mmc/host/cavium.c +@@ -374,6 +374,7 @@ static int finish_dma_single(struct cvm_mmc_host *host, struct mmc_data *data) + { + data->bytes_xfered = data->blocks * data->blksz; + data->error = 0; ++ dma_unmap_sg(host->dev, data->sg, data->sg_len, get_dma_dir(data)); + return 1; + } + +@@ -1046,7 +1047,8 @@ int cvm_mmc_of_slot_probe(struct device *dev, struct cvm_mmc_host *host) + mmc->max_segs = 1; + + /* DMA size field can address up to 8 MB */ +- mmc->max_seg_size = 8 * 1024 * 1024; ++ mmc->max_seg_size = min_t(unsigned int, 8 * 1024 * 1024, ++ dma_get_max_seg_size(host->dev)); + mmc->max_req_size = mmc->max_seg_size; + /* External DMA is in 512 byte blocks */ + mmc->max_blk_size = 512; +diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c +index b53b6b7d4dd4..60c3a06e3469 100644 +--- a/drivers/mmc/host/dw_mmc.c ++++ b/drivers/mmc/host/dw_mmc.c +@@ -2034,8 +2034,7 @@ static void dw_mci_tasklet_func(unsigned long priv) + * delayed. Allowing the transfer to take place + * avoids races and keeps things simple. + */ +- if ((err != -ETIMEDOUT) && +- (cmd->opcode == MMC_SEND_TUNING_BLOCK)) { ++ if (err != -ETIMEDOUT) { + state = STATE_SENDING_DATA; + continue; + } +diff --git a/drivers/mmc/host/meson-mx-sdio.c b/drivers/mmc/host/meson-mx-sdio.c +index 2d736e416775..ba9a63db73da 100644 +--- a/drivers/mmc/host/meson-mx-sdio.c ++++ b/drivers/mmc/host/meson-mx-sdio.c +@@ -73,7 +73,7 @@ + #define MESON_MX_SDIO_IRQC_IF_CONFIG_MASK GENMASK(7, 6) + #define MESON_MX_SDIO_IRQC_FORCE_DATA_CLK BIT(8) + #define MESON_MX_SDIO_IRQC_FORCE_DATA_CMD BIT(9) +- #define MESON_MX_SDIO_IRQC_FORCE_DATA_DAT_MASK GENMASK(10, 13) ++ #define MESON_MX_SDIO_IRQC_FORCE_DATA_DAT_MASK GENMASK(13, 10) + #define MESON_MX_SDIO_IRQC_SOFT_RESET BIT(15) + #define MESON_MX_SDIO_IRQC_FORCE_HALT BIT(30) + #define MESON_MX_SDIO_IRQC_HALT_HOLE BIT(31) +diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c +index 5fc76a1993d0..9cf14b359c14 100644 +--- a/drivers/mmc/host/sdhci-msm.c ++++ b/drivers/mmc/host/sdhci-msm.c +@@ -575,11 +575,14 @@ static int msm_init_cm_dll(struct sdhci_host *host) + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host); + int wait_cnt = 50; +- unsigned long flags; ++ unsigned long flags, xo_clk = 0; + u32 config; + const struct sdhci_msm_offset *msm_offset = + msm_host->offset; + ++ if (msm_host->use_14lpp_dll_reset && !IS_ERR_OR_NULL(msm_host->xo_clk)) ++ xo_clk = clk_get_rate(msm_host->xo_clk); ++ + spin_lock_irqsave(&host->lock, flags); + + /* +@@ -627,10 +630,10 @@ static int msm_init_cm_dll(struct sdhci_host *host) + config &= CORE_FLL_CYCLE_CNT; + if (config) + mclk_freq = DIV_ROUND_CLOSEST_ULL((host->clock * 8), +- clk_get_rate(msm_host->xo_clk)); ++ xo_clk); + else + mclk_freq = DIV_ROUND_CLOSEST_ULL((host->clock * 4), +- clk_get_rate(msm_host->xo_clk)); ++ xo_clk); + + config = readl_relaxed(host->ioaddr + + msm_offset->core_dll_config_2); +diff --git a/drivers/mmc/host/sdhci-pci-o2micro.c b/drivers/mmc/host/sdhci-pci-o2micro.c +index dd21315922c8..9dc4548271b4 100644 +--- a/drivers/mmc/host/sdhci-pci-o2micro.c ++++ b/drivers/mmc/host/sdhci-pci-o2micro.c +@@ -395,11 +395,21 @@ int sdhci_pci_o2_probe_slot(struct sdhci_pci_slot *slot) + { + struct sdhci_pci_chip *chip; + struct sdhci_host *host; +- u32 reg; ++ u32 reg, caps; + int ret; + + chip = slot->chip; + host = slot->host; ++ ++ caps = sdhci_readl(host, SDHCI_CAPABILITIES); ++ ++ /* ++ * mmc_select_bus_width() will test the bus to determine the actual bus ++ * width. ++ */ ++ if (caps & SDHCI_CAN_DO_8BIT) ++ host->mmc->caps |= MMC_CAP_8_BIT_DATA; ++ + switch (chip->pdev->device) { + case PCI_DEVICE_ID_O2_SDS0: + case PCI_DEVICE_ID_O2_SEABIRD0: +diff --git a/drivers/mmc/host/sdhci-sprd.c b/drivers/mmc/host/sdhci-sprd.c +index 9a822e2e9f0b..06f84a4d79e0 100644 +--- a/drivers/mmc/host/sdhci-sprd.c ++++ b/drivers/mmc/host/sdhci-sprd.c +@@ -405,6 +405,7 @@ static int sdhci_sprd_probe(struct platform_device *pdev) + sdhci_cleanup_host(host); + + pm_runtime_disable: ++ pm_runtime_put_noidle(&pdev->dev); + pm_runtime_disable(&pdev->dev); + pm_runtime_set_suspended(&pdev->dev); + +diff --git a/drivers/mtd/nand/raw/mtk_nand.c b/drivers/mtd/nand/raw/mtk_nand.c +index dceff28c9a31..23fe19397315 100644 +--- a/drivers/mtd/nand/raw/mtk_nand.c ++++ b/drivers/mtd/nand/raw/mtk_nand.c +@@ -500,7 +500,8 @@ static int mtk_nfc_setup_data_interface(struct nand_chip *chip, int csline, + { + struct mtk_nfc *nfc = nand_get_controller_data(chip); + const struct nand_sdr_timings *timings; +- u32 rate, tpoecs, tprecs, tc2r, tw2r, twh, twst, trlt; ++ u32 rate, tpoecs, tprecs, tc2r, tw2r, twh, twst = 0, trlt = 0; ++ u32 thold; + + timings = nand_get_sdr_timings(conf); + if (IS_ERR(timings)) +@@ -536,11 +537,28 @@ static int mtk_nfc_setup_data_interface(struct nand_chip *chip, int csline, + twh = DIV_ROUND_UP(twh * rate, 1000000) - 1; + twh &= 0xf; + +- twst = timings->tWP_min / 1000; ++ /* Calculate real WE#/RE# hold time in nanosecond */ ++ thold = (twh + 1) * 1000000 / rate; ++ /* nanosecond to picosecond */ ++ thold *= 1000; ++ ++ /* ++ * WE# low level time should be expaned to meet WE# pulse time ++ * and WE# cycle time at the same time. ++ */ ++ if (thold < timings->tWC_min) ++ twst = timings->tWC_min - thold; ++ twst = max(timings->tWP_min, twst) / 1000; + twst = DIV_ROUND_UP(twst * rate, 1000000) - 1; + twst &= 0xf; + +- trlt = max(timings->tREA_max, timings->tRP_min) / 1000; ++ /* ++ * RE# low level time should be expaned to meet RE# pulse time, ++ * RE# access time and RE# cycle time at the same time. ++ */ ++ if (thold < timings->tRC_min) ++ trlt = timings->tRC_min - thold; ++ trlt = max3(trlt, timings->tREA_max, timings->tRP_min) / 1000; + trlt = DIV_ROUND_UP(trlt * rate, 1000000) - 1; + trlt &= 0xf; + +diff --git a/drivers/mtd/nand/raw/nand_micron.c b/drivers/mtd/nand/raw/nand_micron.c +index 1622d3145587..8ca9fad6e6ad 100644 +--- a/drivers/mtd/nand/raw/nand_micron.c ++++ b/drivers/mtd/nand/raw/nand_micron.c +@@ -390,6 +390,14 @@ static int micron_supports_on_die_ecc(struct nand_chip *chip) + (chip->id.data[4] & MICRON_ID_INTERNAL_ECC_MASK) != 0x2) + return MICRON_ON_DIE_UNSUPPORTED; + ++ /* ++ * It seems that there are devices which do not support ECC officially. ++ * At least the MT29F2G08ABAGA / MT29F2G08ABBGA devices supports ++ * enabling the ECC feature but don't reflect that to the READ_ID table. ++ * So we have to guarantee that we disable the ECC feature directly ++ * after we did the READ_ID table command. Later we can evaluate the ++ * ECC_ENABLE support. ++ */ + ret = micron_nand_on_die_ecc_setup(chip, true); + if (ret) + return MICRON_ON_DIE_UNSUPPORTED; +@@ -398,13 +406,13 @@ static int micron_supports_on_die_ecc(struct nand_chip *chip) + if (ret) + return MICRON_ON_DIE_UNSUPPORTED; + +- if (!(id[4] & MICRON_ID_ECC_ENABLED)) +- return MICRON_ON_DIE_UNSUPPORTED; +- + ret = micron_nand_on_die_ecc_setup(chip, false); + if (ret) + return MICRON_ON_DIE_UNSUPPORTED; + ++ if (!(id[4] & MICRON_ID_ECC_ENABLED)) ++ return MICRON_ON_DIE_UNSUPPORTED; ++ + ret = nand_readid_op(chip, 0, id, sizeof(id)); + if (ret) + return MICRON_ON_DIE_UNSUPPORTED; +diff --git a/drivers/mtd/nand/spi/core.c b/drivers/mtd/nand/spi/core.c +index 4c15bb58c623..20560c0b1f5d 100644 +--- a/drivers/mtd/nand/spi/core.c ++++ b/drivers/mtd/nand/spi/core.c +@@ -511,12 +511,12 @@ static int spinand_mtd_read(struct mtd_info *mtd, loff_t from, + if (ret == -EBADMSG) { + ecc_failed = true; + mtd->ecc_stats.failed++; +- ret = 0; + } else { + mtd->ecc_stats.corrected += ret; + max_bitflips = max_t(unsigned int, max_bitflips, ret); + } + ++ ret = 0; + ops->retlen += iter.req.datalen; + ops->oobretlen += iter.req.ooblen; + } +diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c +index 799fc38c5c34..b0aab3a0a1bf 100644 +--- a/drivers/net/bonding/bond_main.c ++++ b/drivers/net/bonding/bond_main.c +@@ -3866,8 +3866,8 @@ static netdev_tx_t bond_xmit_roundrobin(struct sk_buff *skb, + struct net_device *bond_dev) + { + struct bonding *bond = netdev_priv(bond_dev); +- struct iphdr *iph = ip_hdr(skb); + struct slave *slave; ++ int slave_cnt; + u32 slave_id; + + /* Start with the curr_active_slave that joined the bond as the +@@ -3876,23 +3876,32 @@ static netdev_tx_t bond_xmit_roundrobin(struct sk_buff *skb, + * send the join/membership reports. The curr_active_slave found + * will send all of this type of traffic. + */ +- if (iph->protocol == IPPROTO_IGMP && skb->protocol == htons(ETH_P_IP)) { +- slave = rcu_dereference(bond->curr_active_slave); +- if (slave) +- bond_dev_queue_xmit(bond, skb, slave->dev); +- else +- bond_xmit_slave_id(bond, skb, 0); +- } else { +- int slave_cnt = READ_ONCE(bond->slave_cnt); ++ if (skb->protocol == htons(ETH_P_IP)) { ++ int noff = skb_network_offset(skb); ++ struct iphdr *iph; + +- if (likely(slave_cnt)) { +- slave_id = bond_rr_gen_slave_id(bond); +- bond_xmit_slave_id(bond, skb, slave_id % slave_cnt); +- } else { +- bond_tx_drop(bond_dev, skb); ++ if (unlikely(!pskb_may_pull(skb, noff + sizeof(*iph)))) ++ goto non_igmp; ++ ++ iph = ip_hdr(skb); ++ if (iph->protocol == IPPROTO_IGMP) { ++ slave = rcu_dereference(bond->curr_active_slave); ++ if (slave) ++ bond_dev_queue_xmit(bond, skb, slave->dev); ++ else ++ bond_xmit_slave_id(bond, skb, 0); ++ return NETDEV_TX_OK; + } + } + ++non_igmp: ++ slave_cnt = READ_ONCE(bond->slave_cnt); ++ if (likely(slave_cnt)) { ++ slave_id = bond_rr_gen_slave_id(bond); ++ bond_xmit_slave_id(bond, skb, slave_id % slave_cnt); ++ } else { ++ bond_tx_drop(bond_dev, skb); ++ } + return NETDEV_TX_OK; + } + +diff --git a/drivers/net/caif/caif_hsi.c b/drivers/net/caif/caif_hsi.c +index b2f10b6ad6e5..637757144221 100644 +--- a/drivers/net/caif/caif_hsi.c ++++ b/drivers/net/caif/caif_hsi.c +@@ -939,7 +939,7 @@ static void cfhsi_wake_down(struct work_struct *work) + break; + + set_current_state(TASK_INTERRUPTIBLE); +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + retry--; + } + +@@ -1455,7 +1455,7 @@ static void __exit cfhsi_exit_module(void) + rtnl_lock(); + list_for_each_safe(list_node, n, &cfhsi_list) { + cfhsi = list_entry(list_node, struct cfhsi, list); +- unregister_netdev(cfhsi->ndev); ++ unregister_netdevice(cfhsi->ndev); + } + rtnl_unlock(); + } +diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c +index f2fe344593d5..fcec8bcb53d6 100644 +--- a/drivers/net/can/flexcan.c ++++ b/drivers/net/can/flexcan.c +@@ -400,9 +400,10 @@ static void flexcan_enable_wakeup_irq(struct flexcan_priv *priv, bool enable) + priv->write(reg_mcr, ®s->mcr); + } + +-static inline void flexcan_enter_stop_mode(struct flexcan_priv *priv) ++static inline int flexcan_enter_stop_mode(struct flexcan_priv *priv) + { + struct flexcan_regs __iomem *regs = priv->regs; ++ unsigned int ackval; + u32 reg_mcr; + + reg_mcr = priv->read(®s->mcr); +@@ -412,20 +413,37 @@ static inline void flexcan_enter_stop_mode(struct flexcan_priv *priv) + /* enable stop request */ + regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr, + 1 << priv->stm.req_bit, 1 << priv->stm.req_bit); ++ ++ /* get stop acknowledgment */ ++ if (regmap_read_poll_timeout(priv->stm.gpr, priv->stm.ack_gpr, ++ ackval, ackval & (1 << priv->stm.ack_bit), ++ 0, FLEXCAN_TIMEOUT_US)) ++ return -ETIMEDOUT; ++ ++ return 0; + } + +-static inline void flexcan_exit_stop_mode(struct flexcan_priv *priv) ++static inline int flexcan_exit_stop_mode(struct flexcan_priv *priv) + { + struct flexcan_regs __iomem *regs = priv->regs; ++ unsigned int ackval; + u32 reg_mcr; + + /* remove stop request */ + regmap_update_bits(priv->stm.gpr, priv->stm.req_gpr, + 1 << priv->stm.req_bit, 0); + ++ /* get stop acknowledgment */ ++ if (regmap_read_poll_timeout(priv->stm.gpr, priv->stm.ack_gpr, ++ ackval, !(ackval & (1 << priv->stm.ack_bit)), ++ 0, FLEXCAN_TIMEOUT_US)) ++ return -ETIMEDOUT; ++ + reg_mcr = priv->read(®s->mcr); + reg_mcr &= ~FLEXCAN_MCR_SLF_WAK; + priv->write(reg_mcr, ®s->mcr); ++ ++ return 0; + } + + static inline void flexcan_error_irq_enable(const struct flexcan_priv *priv) +@@ -1437,10 +1455,10 @@ static int flexcan_setup_stop_mode(struct platform_device *pdev) + + priv = netdev_priv(dev); + priv->stm.gpr = syscon_node_to_regmap(gpr_np); +- of_node_put(gpr_np); + if (IS_ERR(priv->stm.gpr)) { + dev_dbg(&pdev->dev, "could not find gpr regmap\n"); +- return PTR_ERR(priv->stm.gpr); ++ ret = PTR_ERR(priv->stm.gpr); ++ goto out_put_node; + } + + priv->stm.req_gpr = out_val[1]; +@@ -1455,7 +1473,9 @@ static int flexcan_setup_stop_mode(struct platform_device *pdev) + + device_set_wakeup_capable(&pdev->dev, true); + +- return 0; ++out_put_node: ++ of_node_put(gpr_np); ++ return ret; + } + + static const struct of_device_id flexcan_of_match[] = { +@@ -1612,7 +1632,9 @@ static int __maybe_unused flexcan_suspend(struct device *device) + */ + if (device_may_wakeup(device)) { + enable_irq_wake(dev->irq); +- flexcan_enter_stop_mode(priv); ++ err = flexcan_enter_stop_mode(priv); ++ if (err) ++ return err; + } else { + err = flexcan_chip_disable(priv); + if (err) +@@ -1662,10 +1684,13 @@ static int __maybe_unused flexcan_noirq_resume(struct device *device) + { + struct net_device *dev = dev_get_drvdata(device); + struct flexcan_priv *priv = netdev_priv(dev); ++ int err; + + if (netif_running(dev) && device_may_wakeup(device)) { + flexcan_enable_wakeup_irq(priv, false); +- flexcan_exit_stop_mode(priv); ++ err = flexcan_exit_stop_mode(priv); ++ if (err) ++ return err; + } + + return 0; +diff --git a/drivers/net/can/rcar/rcar_canfd.c b/drivers/net/can/rcar/rcar_canfd.c +index 05410008aa6b..de34a4b82d4a 100644 +--- a/drivers/net/can/rcar/rcar_canfd.c ++++ b/drivers/net/can/rcar/rcar_canfd.c +@@ -1508,10 +1508,11 @@ static int rcar_canfd_rx_poll(struct napi_struct *napi, int quota) + + /* All packets processed */ + if (num_pkts < quota) { +- napi_complete_done(napi, num_pkts); +- /* Enable Rx FIFO interrupts */ +- rcar_canfd_set_bit(priv->base, RCANFD_RFCC(ridx), +- RCANFD_RFCC_RFIE); ++ if (napi_complete_done(napi, num_pkts)) { ++ /* Enable Rx FIFO interrupts */ ++ rcar_canfd_set_bit(priv->base, RCANFD_RFCC(ridx), ++ RCANFD_RFCC_RFIE); ++ } + } + return num_pkts; + } +diff --git a/drivers/net/can/usb/peak_usb/pcan_usb.c b/drivers/net/can/usb/peak_usb/pcan_usb.c +index 15ce5ad1d632..7ab56f64a518 100644 +--- a/drivers/net/can/usb/peak_usb/pcan_usb.c ++++ b/drivers/net/can/usb/peak_usb/pcan_usb.c +@@ -242,7 +242,7 @@ static int pcan_usb_write_mode(struct peak_usb_device *dev, u8 onoff) + } else { + /* the PCAN-USB needs time to init */ + set_current_state(TASK_INTERRUPTIBLE); +- schedule_timeout(msecs_to_jiffies(PCAN_USB_STARTUP_TIMEOUT)); ++ schedule_msec_hrtimeout((PCAN_USB_STARTUP_TIMEOUT)); + } + + return err; +diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.c b/drivers/net/can/usb/peak_usb/pcan_usb_core.c +index 458154c9b482..22b9c8e6d040 100644 +--- a/drivers/net/can/usb/peak_usb/pcan_usb_core.c ++++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.c +@@ -568,16 +568,16 @@ static int peak_usb_ndo_stop(struct net_device *netdev) + dev->state &= ~PCAN_USB_STATE_STARTED; + netif_stop_queue(netdev); + ++ close_candev(netdev); ++ ++ dev->can.state = CAN_STATE_STOPPED; ++ + /* unlink all pending urbs and free used memory */ + peak_usb_unlink_all_urbs(dev); + + if (dev->adapter->dev_stop) + dev->adapter->dev_stop(dev); + +- close_candev(netdev); +- +- dev->can.state = CAN_STATE_STOPPED; +- + /* can set bus off now */ + if (dev->adapter->dev_set_bus) { + int err = dev->adapter->dev_set_bus(dev, 0); +diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c +index 34761c3a6286..47cc1ff5b88e 100644 +--- a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c ++++ b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c +@@ -841,7 +841,7 @@ static int pcan_usb_fd_init(struct peak_usb_device *dev) + goto err_out; + + /* allocate command buffer once for all for the interface */ +- pdev->cmd_buffer_addr = kmalloc(PCAN_UFD_CMD_BUFFER_SIZE, ++ pdev->cmd_buffer_addr = kzalloc(PCAN_UFD_CMD_BUFFER_SIZE, + GFP_KERNEL); + if (!pdev->cmd_buffer_addr) + goto err_out_1; +diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +index 178bb7cff0c1..53cb2f72bdd0 100644 +--- a/drivers/net/can/usb/peak_usb/pcan_usb_pro.c ++++ b/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +@@ -494,7 +494,7 @@ static int pcan_usb_pro_drv_loaded(struct peak_usb_device *dev, int loaded) + u8 *buffer; + int err; + +- buffer = kmalloc(PCAN_USBPRO_FCT_DRVLD_REQ_LEN, GFP_KERNEL); ++ buffer = kzalloc(PCAN_USBPRO_FCT_DRVLD_REQ_LEN, GFP_KERNEL); + if (!buffer) + return -ENOMEM; + +diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c +index 063c7a671b41..2e8b1ab2c6f7 100644 +--- a/drivers/net/dsa/mv88e6xxx/chip.c ++++ b/drivers/net/dsa/mv88e6xxx/chip.c +@@ -4711,6 +4711,8 @@ static int mv88e6xxx_probe(struct mdio_device *mdiodev) + err = PTR_ERR(chip->reset); + goto out; + } ++ if (chip->reset) ++ usleep_range(1000, 2000); + + err = mv88e6xxx_detect(chip); + if (err) +diff --git a/drivers/net/dsa/sja1105/sja1105_main.c b/drivers/net/dsa/sja1105/sja1105_main.c +index 1c3959efebc4..844e038f3dc6 100644 +--- a/drivers/net/dsa/sja1105/sja1105_main.c ++++ b/drivers/net/dsa/sja1105/sja1105_main.c +@@ -734,15 +734,16 @@ static int sja1105_adjust_port_config(struct sja1105_private *priv, int port, + return sja1105_clocking_setup_port(priv, port); + } + +-static void sja1105_adjust_link(struct dsa_switch *ds, int port, +- struct phy_device *phydev) ++static void sja1105_mac_config(struct dsa_switch *ds, int port, ++ unsigned int link_an_mode, ++ const struct phylink_link_state *state) + { + struct sja1105_private *priv = ds->priv; + +- if (!phydev->link) ++ if (!state->link) + sja1105_adjust_port_config(priv, port, 0, false); + else +- sja1105_adjust_port_config(priv, port, phydev->speed, true); ++ sja1105_adjust_port_config(priv, port, state->speed, true); + } + + static void sja1105_phylink_validate(struct dsa_switch *ds, int port, +@@ -1515,9 +1516,9 @@ static int sja1105_set_ageing_time(struct dsa_switch *ds, + static const struct dsa_switch_ops sja1105_switch_ops = { + .get_tag_protocol = sja1105_get_tag_protocol, + .setup = sja1105_setup, +- .adjust_link = sja1105_adjust_link, + .set_ageing_time = sja1105_set_ageing_time, + .phylink_validate = sja1105_phylink_validate, ++ .phylink_mac_config = sja1105_mac_config, + .get_strings = sja1105_get_strings, + .get_ethtool_stats = sja1105_get_ethtool_stats, + .get_sset_count = sja1105_get_sset_count, +diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +index 008ad0ca89ba..4039a9599d79 100644 +--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c ++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +@@ -285,6 +285,9 @@ int bnx2x_tx_int(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata) + hw_cons = le16_to_cpu(*txdata->tx_cons_sb); + sw_cons = txdata->tx_pkt_cons; + ++ /* Ensure subsequent loads occur after hw_cons */ ++ smp_rmb(); ++ + while (sw_cons != hw_cons) { + u16 pkt_cons; + +@@ -1931,8 +1934,7 @@ u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb, + } + + /* select a non-FCoE queue */ +- return netdev_pick_tx(dev, skb, NULL) % +- (BNX2X_NUM_ETH_QUEUES(bp) * bp->max_cos); ++ return netdev_pick_tx(dev, skb, NULL) % (BNX2X_NUM_ETH_QUEUES(bp)); + } + + void bnx2x_set_num_queues(struct bnx2x *bp) +@@ -3857,9 +3859,12 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) + + if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) { + if (!(bp->flags & TX_TIMESTAMPING_EN)) { ++ bp->eth_stats.ptp_skip_tx_ts++; + BNX2X_ERR("Tx timestamping was not enabled, this packet will not be timestamped\n"); + } else if (bp->ptp_tx_skb) { +- BNX2X_ERR("The device supports only a single outstanding packet to timestamp, this packet will not be timestamped\n"); ++ bp->eth_stats.ptp_skip_tx_ts++; ++ netdev_err_once(bp->dev, ++ "Device supports only a single outstanding packet to timestamp, this packet won't be timestamped\n"); + } else { + skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; + /* schedule check for Tx timestamp */ +diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c +index 51fc845de31a..4a0ba6801c9e 100644 +--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c ++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c +@@ -182,7 +182,9 @@ static const struct { + { STATS_OFFSET32(driver_filtered_tx_pkt), + 4, false, "driver_filtered_tx_pkt" }, + { STATS_OFFSET32(eee_tx_lpi), +- 4, true, "Tx LPI entry count"} ++ 4, true, "Tx LPI entry count"}, ++ { STATS_OFFSET32(ptp_skip_tx_ts), ++ 4, false, "ptp_skipped_tx_tstamp" }, + }; + + #define BNX2X_NUM_STATS ARRAY_SIZE(bnx2x_stats_arr) +diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +index 03ac10b1cd1e..2cc14db8f0ec 100644 +--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c ++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +@@ -15214,11 +15214,24 @@ static void bnx2x_ptp_task(struct work_struct *work) + u32 val_seq; + u64 timestamp, ns; + struct skb_shared_hwtstamps shhwtstamps; ++ bool bail = true; ++ int i; ++ ++ /* FW may take a while to complete timestamping; try a bit and if it's ++ * still not complete, may indicate an error state - bail out then. ++ */ ++ for (i = 0; i < 10; i++) { ++ /* Read Tx timestamp registers */ ++ val_seq = REG_RD(bp, port ? NIG_REG_P1_TLLH_PTP_BUF_SEQID : ++ NIG_REG_P0_TLLH_PTP_BUF_SEQID); ++ if (val_seq & 0x10000) { ++ bail = false; ++ break; ++ } ++ msleep(1 << i); ++ } + +- /* Read Tx timestamp registers */ +- val_seq = REG_RD(bp, port ? NIG_REG_P1_TLLH_PTP_BUF_SEQID : +- NIG_REG_P0_TLLH_PTP_BUF_SEQID); +- if (val_seq & 0x10000) { ++ if (!bail) { + /* There is a valid timestamp value */ + timestamp = REG_RD(bp, port ? NIG_REG_P1_TLLH_PTP_BUF_TS_MSB : + NIG_REG_P0_TLLH_PTP_BUF_TS_MSB); +@@ -15233,16 +15246,18 @@ static void bnx2x_ptp_task(struct work_struct *work) + memset(&shhwtstamps, 0, sizeof(shhwtstamps)); + shhwtstamps.hwtstamp = ns_to_ktime(ns); + skb_tstamp_tx(bp->ptp_tx_skb, &shhwtstamps); +- dev_kfree_skb_any(bp->ptp_tx_skb); +- bp->ptp_tx_skb = NULL; + + DP(BNX2X_MSG_PTP, "Tx timestamp, timestamp cycles = %llu, ns = %llu\n", + timestamp, ns); + } else { +- DP(BNX2X_MSG_PTP, "There is no valid Tx timestamp yet\n"); +- /* Reschedule to keep checking for a valid timestamp value */ +- schedule_work(&bp->ptp_task); ++ DP(BNX2X_MSG_PTP, ++ "Tx timestamp is not recorded (register read=%u)\n", ++ val_seq); ++ bp->eth_stats.ptp_skip_tx_ts++; + } ++ ++ dev_kfree_skb_any(bp->ptp_tx_skb); ++ bp->ptp_tx_skb = NULL; + } + + void bnx2x_set_rx_ts(struct bnx2x *bp, struct sk_buff *skb) +diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h +index b2644ed13d06..d55e63692cf3 100644 +--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h ++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_stats.h +@@ -207,6 +207,9 @@ struct bnx2x_eth_stats { + u32 driver_filtered_tx_pkt; + /* src: Clear-on-Read register; Will not survive PMF Migration */ + u32 eee_tx_lpi; ++ ++ /* PTP */ ++ u32 ptp_skip_tx_ts; + }; + + struct bnx2x_eth_q_stats { +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index f758b2e0591f..7afae9d80e75 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -3022,7 +3022,7 @@ static int bnxt_alloc_vnics(struct bnxt *bp) + int num_vnics = 1; + + #ifdef CONFIG_RFS_ACCEL +- if (bp->flags & BNXT_FLAG_RFS) ++ if ((bp->flags & (BNXT_FLAG_RFS | BNXT_FLAG_CHIP_P5)) == BNXT_FLAG_RFS) + num_vnics += bp->rx_nr_rings; + #endif + +@@ -5508,7 +5508,16 @@ static int bnxt_cp_rings_in_use(struct bnxt *bp) + + static int bnxt_get_func_stat_ctxs(struct bnxt *bp) + { +- return bp->cp_nr_rings + bnxt_get_ulp_stat_ctxs(bp); ++ int ulp_stat = bnxt_get_ulp_stat_ctxs(bp); ++ int cp = bp->cp_nr_rings; ++ ++ if (!ulp_stat) ++ return cp; ++ ++ if (bnxt_nq_rings_in_use(bp) > cp + bnxt_get_ulp_msix_num(bp)) ++ return bnxt_get_ulp_msix_base(bp) + ulp_stat; ++ ++ return cp + ulp_stat; + } + + static bool bnxt_need_reserve_rings(struct bnxt *bp) +@@ -7124,6 +7133,9 @@ static int bnxt_alloc_rfs_vnics(struct bnxt *bp) + #ifdef CONFIG_RFS_ACCEL + int i, rc = 0; + ++ if (bp->flags & BNXT_FLAG_CHIP_P5) ++ return 0; ++ + for (i = 0; i < bp->rx_nr_rings; i++) { + struct bnxt_vnic_info *vnic; + u16 vnic_id = i + 1; +@@ -7477,11 +7489,7 @@ unsigned int bnxt_get_avail_cp_rings_for_en(struct bnxt *bp) + + unsigned int bnxt_get_avail_stat_ctxs_for_en(struct bnxt *bp) + { +- unsigned int stat; +- +- stat = bnxt_get_max_func_stat_ctxs(bp) - bnxt_get_ulp_stat_ctxs(bp); +- stat -= bp->cp_nr_rings; +- return stat; ++ return bnxt_get_max_func_stat_ctxs(bp) - bnxt_get_func_stat_ctxs(bp); + } + + int bnxt_get_avail_msix(struct bnxt *bp, int num) +@@ -9587,7 +9595,7 @@ int bnxt_check_rings(struct bnxt *bp, int tx, int rx, bool sh, int tcs, + return -ENOMEM; + + vnics = 1; +- if (bp->flags & BNXT_FLAG_RFS) ++ if ((bp->flags & (BNXT_FLAG_RFS | BNXT_FLAG_CHIP_P5)) == BNXT_FLAG_RFS) + vnics += rx_rings; + + if (bp->flags & BNXT_FLAG_AGG_RINGS) +@@ -10262,10 +10270,10 @@ static void bnxt_remove_one(struct pci_dev *pdev) + bnxt_dcb_free(bp); + kfree(bp->edev); + bp->edev = NULL; ++ bnxt_cleanup_pci(bp); + bnxt_free_ctx_mem(bp); + kfree(bp->ctx); + bp->ctx = NULL; +- bnxt_cleanup_pci(bp); + bnxt_free_port_stats(bp); + free_netdev(dev); + } +@@ -10859,6 +10867,7 @@ static void bnxt_shutdown(struct pci_dev *pdev) + + if (system_state == SYSTEM_POWER_OFF) { + bnxt_clear_int_mode(bp); ++ pci_disable_device(pdev); + pci_wake_from_d3(pdev, bp->wol); + pci_set_power_state(pdev, PCI_D3hot); + } +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +index bfa342a98d08..fc77caf0a076 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c +@@ -157,8 +157,10 @@ static int bnxt_req_msix_vecs(struct bnxt_en_dev *edev, int ulp_id, + + if (BNXT_NEW_RM(bp)) { + struct bnxt_hw_resc *hw_resc = &bp->hw_resc; ++ int resv_msix; + +- avail_msix = hw_resc->resv_irqs - bp->cp_nr_rings; ++ resv_msix = hw_resc->resv_irqs - bp->cp_nr_rings; ++ avail_msix = min_t(int, resv_msix, avail_msix); + edev->ulp_tbl[ulp_id].msix_requested = avail_msix; + } + bnxt_fill_msix_vecs(bp, ent); +diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c +index 41b50e6570ea..2369b4bd63e3 100644 +--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c ++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c +@@ -3083,39 +3083,42 @@ static void bcmgenet_timeout(struct net_device *dev) + netif_tx_wake_all_queues(dev); + } + +-#define MAX_MC_COUNT 16 ++#define MAX_MDF_FILTER 17 + + static inline void bcmgenet_set_mdf_addr(struct bcmgenet_priv *priv, + unsigned char *addr, +- int *i, +- int *mc) ++ int *i) + { +- u32 reg; +- + bcmgenet_umac_writel(priv, addr[0] << 8 | addr[1], + UMAC_MDF_ADDR + (*i * 4)); + bcmgenet_umac_writel(priv, addr[2] << 24 | addr[3] << 16 | + addr[4] << 8 | addr[5], + UMAC_MDF_ADDR + ((*i + 1) * 4)); +- reg = bcmgenet_umac_readl(priv, UMAC_MDF_CTRL); +- reg |= (1 << (MAX_MC_COUNT - *mc)); +- bcmgenet_umac_writel(priv, reg, UMAC_MDF_CTRL); + *i += 2; +- (*mc)++; + } + + static void bcmgenet_set_rx_mode(struct net_device *dev) + { + struct bcmgenet_priv *priv = netdev_priv(dev); + struct netdev_hw_addr *ha; +- int i, mc; ++ int i, nfilter; + u32 reg; + + netif_dbg(priv, hw, dev, "%s: %08X\n", __func__, dev->flags); + +- /* Promiscuous mode */ ++ /* Number of filters needed */ ++ nfilter = netdev_uc_count(dev) + netdev_mc_count(dev) + 2; ++ ++ /* ++ * Turn on promicuous mode for three scenarios ++ * 1. IFF_PROMISC flag is set ++ * 2. IFF_ALLMULTI flag is set ++ * 3. The number of filters needed exceeds the number filters ++ * supported by the hardware. ++ */ + reg = bcmgenet_umac_readl(priv, UMAC_CMD); +- if (dev->flags & IFF_PROMISC) { ++ if ((dev->flags & (IFF_PROMISC | IFF_ALLMULTI)) || ++ (nfilter > MAX_MDF_FILTER)) { + reg |= CMD_PROMISC; + bcmgenet_umac_writel(priv, reg, UMAC_CMD); + bcmgenet_umac_writel(priv, 0, UMAC_MDF_CTRL); +@@ -3125,32 +3128,24 @@ static void bcmgenet_set_rx_mode(struct net_device *dev) + bcmgenet_umac_writel(priv, reg, UMAC_CMD); + } + +- /* UniMac doesn't support ALLMULTI */ +- if (dev->flags & IFF_ALLMULTI) { +- netdev_warn(dev, "ALLMULTI is not supported\n"); +- return; +- } +- + /* update MDF filter */ + i = 0; +- mc = 0; + /* Broadcast */ +- bcmgenet_set_mdf_addr(priv, dev->broadcast, &i, &mc); ++ bcmgenet_set_mdf_addr(priv, dev->broadcast, &i); + /* my own address.*/ +- bcmgenet_set_mdf_addr(priv, dev->dev_addr, &i, &mc); +- /* Unicast list*/ +- if (netdev_uc_count(dev) > (MAX_MC_COUNT - mc)) +- return; ++ bcmgenet_set_mdf_addr(priv, dev->dev_addr, &i); + +- if (!netdev_uc_empty(dev)) +- netdev_for_each_uc_addr(ha, dev) +- bcmgenet_set_mdf_addr(priv, ha->addr, &i, &mc); +- /* Multicast */ +- if (netdev_mc_empty(dev) || netdev_mc_count(dev) >= (MAX_MC_COUNT - mc)) +- return; ++ /* Unicast */ ++ netdev_for_each_uc_addr(ha, dev) ++ bcmgenet_set_mdf_addr(priv, ha->addr, &i); + ++ /* Multicast */ + netdev_for_each_mc_addr(ha, dev) +- bcmgenet_set_mdf_addr(priv, ha->addr, &i, &mc); ++ bcmgenet_set_mdf_addr(priv, ha->addr, &i); ++ ++ /* Enable filters */ ++ reg = GENMASK(MAX_MDF_FILTER - 1, MAX_MDF_FILTER - nfilter); ++ bcmgenet_umac_writel(priv, reg, UMAC_MDF_CTRL); + } + + /* Set the hardware MAC address. */ +diff --git a/drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c b/drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c +index a76529a7662d..c2e92786608b 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c +@@ -1054,14 +1054,12 @@ static void cudbg_t4_fwcache(struct cudbg_init *pdbg_init, + } + } + +-static int cudbg_collect_mem_region(struct cudbg_init *pdbg_init, +- struct cudbg_buffer *dbg_buff, +- struct cudbg_error *cudbg_err, +- u8 mem_type) ++static unsigned long cudbg_mem_region_size(struct cudbg_init *pdbg_init, ++ struct cudbg_error *cudbg_err, ++ u8 mem_type) + { + struct adapter *padap = pdbg_init->adap; + struct cudbg_meminfo mem_info; +- unsigned long size; + u8 mc_idx; + int rc; + +@@ -1075,7 +1073,16 @@ static int cudbg_collect_mem_region(struct cudbg_init *pdbg_init, + if (rc) + return rc; + +- size = mem_info.avail[mc_idx].limit - mem_info.avail[mc_idx].base; ++ return mem_info.avail[mc_idx].limit - mem_info.avail[mc_idx].base; ++} ++ ++static int cudbg_collect_mem_region(struct cudbg_init *pdbg_init, ++ struct cudbg_buffer *dbg_buff, ++ struct cudbg_error *cudbg_err, ++ u8 mem_type) ++{ ++ unsigned long size = cudbg_mem_region_size(pdbg_init, cudbg_err, mem_type); ++ + return cudbg_read_fw_mem(pdbg_init, dbg_buff, mem_type, size, + cudbg_err); + } +diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c +index cfaf8f618d1f..56742fa0c1af 100644 +--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c ++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_tc_flower.c +@@ -67,7 +67,8 @@ static struct ch_tc_pedit_fields pedits[] = { + static struct ch_tc_flower_entry *allocate_flower_entry(void) + { + struct ch_tc_flower_entry *new = kzalloc(sizeof(*new), GFP_KERNEL); +- spin_lock_init(&new->lock); ++ if (new) ++ spin_lock_init(&new->lock); + return new; + } + +diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c +index 82015c8a5ed7..b7a246b33599 100644 +--- a/drivers/net/ethernet/emulex/benet/be_main.c ++++ b/drivers/net/ethernet/emulex/benet/be_main.c +@@ -4697,8 +4697,12 @@ int be_update_queues(struct be_adapter *adapter) + struct net_device *netdev = adapter->netdev; + int status; + +- if (netif_running(netdev)) ++ if (netif_running(netdev)) { ++ /* device cannot transmit now, avoid dev_watchdog timeouts */ ++ netif_carrier_off(netdev); ++ + be_close(netdev); ++ } + + be_cancel_worker(adapter); + +diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c +index 38f10f7dcbc3..831bb709e783 100644 +--- a/drivers/net/ethernet/freescale/fec_main.c ++++ b/drivers/net/ethernet/freescale/fec_main.c +@@ -1689,10 +1689,10 @@ static void fec_get_mac(struct net_device *ndev) + */ + if (!is_valid_ether_addr(iap)) { + /* Report it and use a random ethernet address instead */ +- netdev_err(ndev, "Invalid MAC address: %pM\n", iap); ++ dev_err(&fep->pdev->dev, "Invalid MAC address: %pM\n", iap); + eth_hw_addr_random(ndev); +- netdev_info(ndev, "Using random MAC address: %pM\n", +- ndev->dev_addr); ++ dev_info(&fep->pdev->dev, "Using random MAC address: %pM\n", ++ ndev->dev_addr); + return; + } + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.c b/drivers/net/ethernet/hisilicon/hns3/hnae3.c +index fa8b8506b120..738e01393b68 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hnae3.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.c +@@ -251,6 +251,7 @@ void hnae3_unregister_ae_algo(struct hnae3_ae_algo *ae_algo) + + ae_algo->ops->uninit_ae_dev(ae_dev); + hnae3_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0); ++ ae_dev->ops = NULL; + } + + list_del(&ae_algo->node); +@@ -351,6 +352,7 @@ void hnae3_unregister_ae_dev(struct hnae3_ae_dev *ae_dev) + + ae_algo->ops->uninit_ae_dev(ae_dev); + hnae3_set_bit(ae_dev->flag, HNAE3_DEV_INITED_B, 0); ++ ae_dev->ops = NULL; + } + + list_del(&ae_dev->node); +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +index f326805543a4..66b691b7221f 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +@@ -4,6 +4,9 @@ + #include + #include + #include ++#ifdef CONFIG_RFS_ACCEL ++#include ++#endif + #include + #include + #include +@@ -24,8 +27,7 @@ + #define hns3_set_field(origin, shift, val) ((origin) |= ((val) << (shift))) + #define hns3_tx_bd_count(S) DIV_ROUND_UP(S, HNS3_MAX_BD_SIZE) + +-static void hns3_clear_all_ring(struct hnae3_handle *h); +-static void hns3_force_clear_all_rx_ring(struct hnae3_handle *h); ++static void hns3_clear_all_ring(struct hnae3_handle *h, bool force); + static void hns3_remove_hw_addr(struct net_device *netdev); + + static const char hns3_driver_name[] = "hns3"; +@@ -79,23 +81,6 @@ static irqreturn_t hns3_irq_handle(int irq, void *vector) + return IRQ_HANDLED; + } + +-/* This callback function is used to set affinity changes to the irq affinity +- * masks when the irq_set_affinity_notifier function is used. +- */ +-static void hns3_nic_irq_affinity_notify(struct irq_affinity_notify *notify, +- const cpumask_t *mask) +-{ +- struct hns3_enet_tqp_vector *tqp_vectors = +- container_of(notify, struct hns3_enet_tqp_vector, +- affinity_notify); +- +- tqp_vectors->affinity_mask = *mask; +-} +- +-static void hns3_nic_irq_affinity_release(struct kref *ref) +-{ +-} +- + static void hns3_nic_uninit_irq(struct hns3_nic_priv *priv) + { + struct hns3_enet_tqp_vector *tqp_vectors; +@@ -107,8 +92,7 @@ static void hns3_nic_uninit_irq(struct hns3_nic_priv *priv) + if (tqp_vectors->irq_init_flag != HNS3_VECTOR_INITED) + continue; + +- /* clear the affinity notifier and affinity mask */ +- irq_set_affinity_notifier(tqp_vectors->vector_irq, NULL); ++ /* clear the affinity mask */ + irq_set_affinity_hint(tqp_vectors->vector_irq, NULL); + + /* release the irq resource */ +@@ -161,12 +145,6 @@ static int hns3_nic_init_irq(struct hns3_nic_priv *priv) + return ret; + } + +- tqp_vectors->affinity_notify.notify = +- hns3_nic_irq_affinity_notify; +- tqp_vectors->affinity_notify.release = +- hns3_nic_irq_affinity_release; +- irq_set_affinity_notifier(tqp_vectors->vector_irq, +- &tqp_vectors->affinity_notify); + irq_set_affinity_hint(tqp_vectors->vector_irq, + &tqp_vectors->affinity_mask); + +@@ -340,6 +318,40 @@ static void hns3_tqp_disable(struct hnae3_queue *tqp) + hns3_write_dev(tqp, HNS3_RING_EN_REG, rcb_reg); + } + ++static void hns3_free_rx_cpu_rmap(struct net_device *netdev) ++{ ++#ifdef CONFIG_RFS_ACCEL ++ free_irq_cpu_rmap(netdev->rx_cpu_rmap); ++ netdev->rx_cpu_rmap = NULL; ++#endif ++} ++ ++static int hns3_set_rx_cpu_rmap(struct net_device *netdev) ++{ ++#ifdef CONFIG_RFS_ACCEL ++ struct hns3_nic_priv *priv = netdev_priv(netdev); ++ struct hns3_enet_tqp_vector *tqp_vector; ++ int i, ret; ++ ++ if (!netdev->rx_cpu_rmap) { ++ netdev->rx_cpu_rmap = alloc_irq_cpu_rmap(priv->vector_num); ++ if (!netdev->rx_cpu_rmap) ++ return -ENOMEM; ++ } ++ ++ for (i = 0; i < priv->vector_num; i++) { ++ tqp_vector = &priv->tqp_vector[i]; ++ ret = irq_cpu_rmap_add(netdev->rx_cpu_rmap, ++ tqp_vector->vector_irq); ++ if (ret) { ++ hns3_free_rx_cpu_rmap(netdev); ++ return ret; ++ } ++ } ++#endif ++ return 0; ++} ++ + static int hns3_nic_net_up(struct net_device *netdev) + { + struct hns3_nic_priv *priv = netdev_priv(netdev); +@@ -351,11 +363,16 @@ static int hns3_nic_net_up(struct net_device *netdev) + if (ret) + return ret; + ++ /* the device can work without cpu rmap, only aRFS needs it */ ++ ret = hns3_set_rx_cpu_rmap(netdev); ++ if (ret) ++ netdev_warn(netdev, "set rx cpu rmap fail, ret=%d!\n", ret); ++ + /* get irq resource for all vectors */ + ret = hns3_nic_init_irq(priv); + if (ret) { + netdev_err(netdev, "hns init irq failed! ret=%d\n", ret); +- return ret; ++ goto free_rmap; + } + + clear_bit(HNS3_NIC_STATE_DOWN, &priv->state); +@@ -384,7 +401,8 @@ static int hns3_nic_net_up(struct net_device *netdev) + hns3_vector_disable(&priv->tqp_vector[j]); + + hns3_nic_uninit_irq(priv); +- ++free_rmap: ++ hns3_free_rx_cpu_rmap(netdev); + return ret; + } + +@@ -447,6 +465,20 @@ static int hns3_nic_net_open(struct net_device *netdev) + return 0; + } + ++static void hns3_reset_tx_queue(struct hnae3_handle *h) ++{ ++ struct net_device *ndev = h->kinfo.netdev; ++ struct hns3_nic_priv *priv = netdev_priv(ndev); ++ struct netdev_queue *dev_queue; ++ u32 i; ++ ++ for (i = 0; i < h->kinfo.num_tqps; i++) { ++ dev_queue = netdev_get_tx_queue(ndev, ++ priv->ring_data[i].queue_index); ++ netdev_tx_reset_queue(dev_queue); ++ } ++} ++ + static void hns3_nic_net_down(struct net_device *netdev) + { + struct hns3_nic_priv *priv = netdev_priv(netdev); +@@ -467,10 +499,19 @@ static void hns3_nic_net_down(struct net_device *netdev) + if (ops->stop) + ops->stop(priv->ae_handle); + ++ hns3_free_rx_cpu_rmap(netdev); ++ + /* free irq resources */ + hns3_nic_uninit_irq(priv); + +- hns3_clear_all_ring(priv->ae_handle); ++ /* delay ring buffer clearing to hns3_reset_notify_uninit_enet ++ * during reset process, because driver may not be able ++ * to disable the ring through firmware when downing the netdev. ++ */ ++ if (!hns3_nic_resetting(netdev)) ++ hns3_clear_all_ring(priv->ae_handle, false); ++ ++ hns3_reset_tx_queue(priv->ae_handle); + } + + static int hns3_nic_net_stop(struct net_device *netdev) +@@ -1493,12 +1534,12 @@ static void hns3_nic_get_stats64(struct net_device *netdev, + static int hns3_setup_tc(struct net_device *netdev, void *type_data) + { + struct tc_mqprio_qopt_offload *mqprio_qopt = type_data; +- struct hnae3_handle *h = hns3_get_handle(netdev); +- struct hnae3_knic_private_info *kinfo = &h->kinfo; + u8 *prio_tc = mqprio_qopt->qopt.prio_tc_map; ++ struct hnae3_knic_private_info *kinfo; + u8 tc = mqprio_qopt->qopt.num_tc; + u16 mode = mqprio_qopt->mode; + u8 hw = mqprio_qopt->qopt.hw; ++ struct hnae3_handle *h; + + if (!((hw == TC_MQPRIO_HW_OFFLOAD_TCS && + mode == TC_MQPRIO_MODE_CHANNEL) || (!hw && tc == 0))) +@@ -1510,6 +1551,9 @@ static int hns3_setup_tc(struct net_device *netdev, void *type_data) + if (!netdev) + return -EINVAL; + ++ h = hns3_get_handle(netdev); ++ kinfo = &h->kinfo; ++ + return (kinfo->dcb_ops && kinfo->dcb_ops->setup_tc) ? + kinfo->dcb_ops->setup_tc(h, tc, prio_tc) : -EOPNOTSUPP; + } +@@ -1895,9 +1939,9 @@ static pci_ers_result_t hns3_error_detected(struct pci_dev *pdev, + if (state == pci_channel_io_perm_failure) + return PCI_ERS_RESULT_DISCONNECT; + +- if (!ae_dev) { ++ if (!ae_dev || !ae_dev->ops) { + dev_err(&pdev->dev, +- "Can't recover - error happened during device init\n"); ++ "Can't recover - error happened before device initialized\n"); + return PCI_ERS_RESULT_NONE; + } + +@@ -1916,6 +1960,9 @@ static pci_ers_result_t hns3_slot_reset(struct pci_dev *pdev) + + dev_info(dev, "requesting reset due to PCI error\n"); + ++ if (!ae_dev || !ae_dev->ops) ++ return PCI_ERS_RESULT_NONE; ++ + /* request the reset */ + if (ae_dev->ops->reset_event) { + if (!ae_dev->override_pci_need_reset) +@@ -3331,8 +3378,6 @@ static void hns3_nic_uninit_vector_data(struct hns3_nic_priv *priv) + hns3_free_vector_ring_chain(tqp_vector, &vector_ring_chain); + + if (tqp_vector->irq_init_flag == HNS3_VECTOR_INITED) { +- irq_set_affinity_notifier(tqp_vector->vector_irq, +- NULL); + irq_set_affinity_hint(tqp_vector->vector_irq, NULL); + free_irq(tqp_vector->vector_irq, tqp_vector); + tqp_vector->irq_init_flag = HNS3_VECTOR_NOT_INITED; +@@ -3858,7 +3903,7 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset) + + hns3_del_all_fd_rules(netdev, true); + +- hns3_force_clear_all_rx_ring(handle); ++ hns3_clear_all_ring(handle, true); + + hns3_uninit_phy(netdev); + +@@ -4030,40 +4075,26 @@ static void hns3_force_clear_rx_ring(struct hns3_enet_ring *ring) + } + } + +-static void hns3_force_clear_all_rx_ring(struct hnae3_handle *h) +-{ +- struct net_device *ndev = h->kinfo.netdev; +- struct hns3_nic_priv *priv = netdev_priv(ndev); +- struct hns3_enet_ring *ring; +- u32 i; +- +- for (i = 0; i < h->kinfo.num_tqps; i++) { +- ring = priv->ring_data[i + h->kinfo.num_tqps].ring; +- hns3_force_clear_rx_ring(ring); +- } +-} +- +-static void hns3_clear_all_ring(struct hnae3_handle *h) ++static void hns3_clear_all_ring(struct hnae3_handle *h, bool force) + { + struct net_device *ndev = h->kinfo.netdev; + struct hns3_nic_priv *priv = netdev_priv(ndev); + u32 i; + + for (i = 0; i < h->kinfo.num_tqps; i++) { +- struct netdev_queue *dev_queue; + struct hns3_enet_ring *ring; + + ring = priv->ring_data[i].ring; + hns3_clear_tx_ring(ring); +- dev_queue = netdev_get_tx_queue(ndev, +- priv->ring_data[i].queue_index); +- netdev_tx_reset_queue(dev_queue); + + ring = priv->ring_data[i + h->kinfo.num_tqps].ring; + /* Continue to clear other rings even if clearing some + * rings failed. + */ +- hns3_clear_rx_ring(ring); ++ if (force) ++ hns3_force_clear_rx_ring(ring); ++ else ++ hns3_clear_rx_ring(ring); + } + } + +@@ -4272,7 +4303,8 @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle) + return 0; + } + +- hns3_force_clear_all_rx_ring(handle); ++ hns3_clear_all_ring(handle, true); ++ hns3_reset_tx_queue(priv->ae_handle); + + hns3_nic_uninit_vector_data(priv); + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +index d1588ea6132c..24fce343e7fc 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c +@@ -243,11 +243,13 @@ static int hns3_lp_run_test(struct net_device *ndev, enum hnae3_loop mode) + + skb_get(skb); + tx_ret = hns3_nic_net_xmit(skb, ndev); +- if (tx_ret == NETDEV_TX_OK) ++ if (tx_ret == NETDEV_TX_OK) { + good_cnt++; +- else ++ } else { ++ kfree_skb(skb); + netdev_err(ndev, "hns3_lb_run_test xmit failed: %d\n", + tx_ret); ++ } + } + if (good_cnt != HNS3_NIC_LB_TEST_PKT_NUM) { + ret_val = HNS3_NIC_LB_TEST_TX_CNT_ERR; +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +index d3b1f8cb1155..f2bffc05e902 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +@@ -552,8 +552,7 @@ static u8 *hclge_comm_get_strings(u32 stringset, + return buff; + + for (i = 0; i < size; i++) { +- snprintf(buff, ETH_GSTRING_LEN, +- strs[i].desc); ++ snprintf(buff, ETH_GSTRING_LEN, "%s", strs[i].desc); + buff = buff + ETH_GSTRING_LEN; + } + +@@ -1058,6 +1057,7 @@ static void hclge_parse_copper_link_mode(struct hclge_dev *hdev, + linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, supported); + linkmode_set_bit(ETHTOOL_LINK_MODE_TP_BIT, supported); + linkmode_set_bit(ETHTOOL_LINK_MODE_Pause_BIT, supported); ++ linkmode_set_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, supported); + } + + static void hclge_parse_link_mode(struct hclge_dev *hdev, u8 speed_ability) +@@ -2389,6 +2389,15 @@ static int hclge_mac_init(struct hclge_dev *hdev) + return ret; + } + ++ if (hdev->hw.mac.support_autoneg) { ++ ret = hclge_set_autoneg_en(hdev, hdev->hw.mac.autoneg); ++ if (ret) { ++ dev_err(&hdev->pdev->dev, ++ "Config mac autoneg fail ret=%d\n", ret); ++ return ret; ++ } ++ } ++ + mac->link = 0; + + if (mac->user_fec_mode & BIT(HNAE3_FEC_USER_DEF)) { +@@ -2508,6 +2517,9 @@ static void hclge_update_link_status(struct hclge_dev *hdev) + + static void hclge_update_port_capability(struct hclge_mac *mac) + { ++ /* update fec ability by speed */ ++ hclge_convert_setting_fec(mac); ++ + /* firmware can not identify back plane type, the media type + * read from configuration can help deal it + */ +@@ -2580,6 +2592,11 @@ static int hclge_get_sfp_info(struct hclge_dev *hdev, struct hclge_mac *mac) + mac->speed_ability = le32_to_cpu(resp->speed_ability); + mac->autoneg = resp->autoneg; + mac->support_autoneg = resp->autoneg_ability; ++ mac->speed_type = QUERY_ACTIVE_SPEED; ++ if (!resp->active_fec) ++ mac->fec_mode = 0; ++ else ++ mac->fec_mode = BIT(resp->active_fec); + } else { + mac->speed_type = QUERY_SFP_SPEED; + } +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +index 1e8134892d77..32d6a59b731a 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c +@@ -224,6 +224,13 @@ int hclge_mac_connect_phy(struct hnae3_handle *handle) + linkmode_and(phydev->supported, phydev->supported, mask); + linkmode_copy(phydev->advertising, phydev->supported); + ++ /* supported flag is Pause and Asym Pause, but default advertising ++ * should be rx on, tx on, so need clear Asym Pause in advertising ++ * flag ++ */ ++ linkmode_clear_bit(ETHTOOL_LINK_MODE_Asym_Pause_BIT, ++ phydev->advertising); ++ + return 0; + } + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c +index a7bbb6d3091a..0d53062f7bb5 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c +@@ -54,7 +54,8 @@ static int hclge_shaper_para_calc(u32 ir, u8 shaper_level, + u32 tick; + + /* Calc tick */ +- if (shaper_level >= HCLGE_SHAPER_LVL_CNT) ++ if (shaper_level >= HCLGE_SHAPER_LVL_CNT || ++ ir > HCLGE_ETHER_MAX_RATE) + return -EINVAL; + + tick = tick_array[shaper_level]; +@@ -1124,6 +1125,9 @@ static int hclge_tm_schd_mode_vnet_base_cfg(struct hclge_vport *vport) + int ret; + u8 i; + ++ if (vport->vport_id >= HNAE3_MAX_TC) ++ return -EINVAL; ++ + ret = hclge_tm_pri_schd_mode_cfg(hdev, vport->vport_id); + if (ret) + return ret; +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +index 5d53467ee2d2..3b02745605d4 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +@@ -2512,6 +2512,12 @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev) + return ret; + } + ++ if (pdev->revision >= 0x21) { ++ ret = hclgevf_set_promisc_mode(hdev, true); ++ if (ret) ++ return ret; ++ } ++ + dev_info(&hdev->pdev->dev, "Reset done\n"); + + return 0; +@@ -2591,9 +2597,11 @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) + * firmware makes sure broadcast packets can be accepted. + * For revision 0x21, default to enable broadcast promisc mode. + */ +- ret = hclgevf_set_promisc_mode(hdev, true); +- if (ret) +- goto err_config; ++ if (pdev->revision >= 0x21) { ++ ret = hclgevf_set_promisc_mode(hdev, true); ++ if (ret) ++ goto err_config; ++ } + + /* Initialize RSS for this VF */ + ret = hclgevf_rss_init_hw(hdev); +diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c +index 0e09bede42a2..b081a1ef6859 100644 +--- a/drivers/net/ethernet/intel/e1000e/netdev.c ++++ b/drivers/net/ethernet/intel/e1000e/netdev.c +@@ -4208,7 +4208,7 @@ void e1000e_up(struct e1000_adapter *adapter) + e1000_configure_msix(adapter); + e1000_irq_enable(adapter); + +- netif_start_queue(adapter->netdev); ++ /* Tx queue started by watchdog timer when link is up */ + + e1000e_trigger_lsc(adapter); + } +@@ -4606,6 +4606,7 @@ int e1000e_open(struct net_device *netdev) + pm_runtime_get_sync(&pdev->dev); + + netif_carrier_off(netdev); ++ netif_stop_queue(netdev); + + /* allocate transmit descriptors */ + err = e1000e_setup_tx_resources(adapter->tx_ring); +@@ -4666,7 +4667,6 @@ int e1000e_open(struct net_device *netdev) + e1000_irq_enable(adapter); + + adapter->tx_hang_recheck = false; +- netif_start_queue(netdev); + + hw->mac.get_link_status = true; + pm_runtime_put(&pdev->dev); +@@ -5288,6 +5288,7 @@ static void e1000_watchdog_task(struct work_struct *work) + if (phy->ops.cfg_on_link_up) + phy->ops.cfg_on_link_up(hw); + ++ netif_wake_queue(netdev); + netif_carrier_on(netdev); + + if (!test_bit(__E1000_DOWN, &adapter->state)) +@@ -5301,6 +5302,7 @@ static void e1000_watchdog_task(struct work_struct *work) + /* Link status message must follow this format */ + pr_info("%s NIC Link is Down\n", adapter->netdev->name); + netif_carrier_off(netdev); ++ netif_stop_queue(netdev); + if (!test_bit(__E1000_DOWN, &adapter->state)) + mod_timer(&adapter->phy_info_timer, + round_jiffies(jiffies + 2 * HZ)); +@@ -5308,13 +5310,8 @@ static void e1000_watchdog_task(struct work_struct *work) + /* 8000ES2LAN requires a Rx packet buffer work-around + * on link down event; reset the controller to flush + * the Rx packet buffer. +- * +- * If the link is lost the controller stops DMA, but +- * if there is queued Tx work it cannot be done. So +- * reset the controller to flush the Tx packet buffers. + */ +- if ((adapter->flags & FLAG_RX_NEEDS_RESTART) || +- e1000_desc_unused(tx_ring) + 1 < tx_ring->count) ++ if (adapter->flags & FLAG_RX_NEEDS_RESTART) + adapter->flags |= FLAG_RESTART_NOW; + else + pm_schedule_suspend(netdev->dev.parent, +@@ -5337,6 +5334,14 @@ static void e1000_watchdog_task(struct work_struct *work) + adapter->gotc_old = adapter->stats.gotc; + spin_unlock(&adapter->stats64_lock); + ++ /* If the link is lost the controller stops DMA, but ++ * if there is queued Tx work it cannot be done. So ++ * reset the controller to flush the Tx packet buffers. ++ */ ++ if (!netif_carrier_ok(netdev) && ++ (e1000_desc_unused(tx_ring) + 1 < tx_ring->count)) ++ adapter->flags |= FLAG_RESTART_NOW; ++ + /* If reset is necessary, do it outside of interrupt context. */ + if (adapter->flags & FLAG_RESTART_NOW) { + schedule_work(&adapter->reset_task); +diff --git a/drivers/net/ethernet/intel/iavf/iavf_txrx.c b/drivers/net/ethernet/intel/iavf/iavf_txrx.c +index 06d1509d57f7..26422bc9ca8c 100644 +--- a/drivers/net/ethernet/intel/iavf/iavf_txrx.c ++++ b/drivers/net/ethernet/intel/iavf/iavf_txrx.c +@@ -1236,6 +1236,9 @@ static void iavf_add_rx_frag(struct iavf_ring *rx_ring, + unsigned int truesize = SKB_DATA_ALIGN(size + iavf_rx_offset(rx_ring)); + #endif + ++ if (!size) ++ return; ++ + skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, rx_buffer->page, + rx_buffer->page_offset, size, truesize); + +@@ -1260,6 +1263,9 @@ static struct iavf_rx_buffer *iavf_get_rx_buffer(struct iavf_ring *rx_ring, + { + struct iavf_rx_buffer *rx_buffer; + ++ if (!size) ++ return NULL; ++ + rx_buffer = &rx_ring->rx_bi[rx_ring->next_to_clean]; + prefetchw(rx_buffer->page); + +@@ -1290,7 +1296,7 @@ static struct sk_buff *iavf_construct_skb(struct iavf_ring *rx_ring, + struct iavf_rx_buffer *rx_buffer, + unsigned int size) + { +- void *va = page_address(rx_buffer->page) + rx_buffer->page_offset; ++ void *va; + #if (PAGE_SIZE < 8192) + unsigned int truesize = iavf_rx_pg_size(rx_ring) / 2; + #else +@@ -1299,7 +1305,10 @@ static struct sk_buff *iavf_construct_skb(struct iavf_ring *rx_ring, + unsigned int headlen; + struct sk_buff *skb; + ++ if (!rx_buffer) ++ return NULL; + /* prefetch first cache line of first page */ ++ va = page_address(rx_buffer->page) + rx_buffer->page_offset; + prefetch(va); + #if L1_CACHE_BYTES < 128 + prefetch(va + L1_CACHE_BYTES); +@@ -1354,7 +1363,7 @@ static struct sk_buff *iavf_build_skb(struct iavf_ring *rx_ring, + struct iavf_rx_buffer *rx_buffer, + unsigned int size) + { +- void *va = page_address(rx_buffer->page) + rx_buffer->page_offset; ++ void *va; + #if (PAGE_SIZE < 8192) + unsigned int truesize = iavf_rx_pg_size(rx_ring) / 2; + #else +@@ -1363,7 +1372,10 @@ static struct sk_buff *iavf_build_skb(struct iavf_ring *rx_ring, + #endif + struct sk_buff *skb; + ++ if (!rx_buffer) ++ return NULL; + /* prefetch first cache line of first page */ ++ va = page_address(rx_buffer->page) + rx_buffer->page_offset; + prefetch(va); + #if L1_CACHE_BYTES < 128 + prefetch(va + L1_CACHE_BYTES); +@@ -1398,6 +1410,9 @@ static struct sk_buff *iavf_build_skb(struct iavf_ring *rx_ring, + static void iavf_put_rx_buffer(struct iavf_ring *rx_ring, + struct iavf_rx_buffer *rx_buffer) + { ++ if (!rx_buffer) ++ return; ++ + if (iavf_can_reuse_rx_page(rx_buffer)) { + /* hand second half of page back to the ring */ + iavf_reuse_rx_page(rx_ring, rx_buffer); +@@ -1496,11 +1511,12 @@ static int iavf_clean_rx_irq(struct iavf_ring *rx_ring, int budget) + * verified the descriptor has been written back. + */ + dma_rmb(); ++#define IAVF_RXD_DD BIT(IAVF_RX_DESC_STATUS_DD_SHIFT) ++ if (!iavf_test_staterr(rx_desc, IAVF_RXD_DD)) ++ break; + + size = (qword & IAVF_RXD_QW1_LENGTH_PBUF_MASK) >> + IAVF_RXD_QW1_LENGTH_PBUF_SHIFT; +- if (!size) +- break; + + iavf_trace(clean_rx_irq, rx_ring, rx_desc, skb); + rx_buffer = iavf_get_rx_buffer(rx_ring, size); +@@ -1516,7 +1532,8 @@ static int iavf_clean_rx_irq(struct iavf_ring *rx_ring, int budget) + /* exit if we failed to retrieve a buffer */ + if (!skb) { + rx_ring->rx_stats.alloc_buff_failed++; +- rx_buffer->pagecnt_bias++; ++ if (rx_buffer) ++ rx_buffer->pagecnt_bias++; + break; + } + +diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h +index 792e6e42030e..754c7080c3fc 100644 +--- a/drivers/net/ethernet/intel/ice/ice.h ++++ b/drivers/net/ethernet/intel/ice/ice.h +@@ -451,7 +451,6 @@ int ice_set_rss(struct ice_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size); + int ice_get_rss(struct ice_vsi *vsi, u8 *seed, u8 *lut, u16 lut_size); + void ice_fill_rss_lut(u8 *lut, u16 rss_table_size, u16 rss_size); + void ice_print_link_msg(struct ice_vsi *vsi, bool isup); +-void ice_napi_del(struct ice_vsi *vsi); + #ifdef CONFIG_DCB + int ice_pf_ena_all_vsi(struct ice_pf *pf, bool locked); + void ice_pf_dis_all_vsi(struct ice_pf *pf, bool locked); +diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c +index fbf1eba0cc2a..f14fa51cc704 100644 +--- a/drivers/net/ethernet/intel/ice/ice_lib.c ++++ b/drivers/net/ethernet/intel/ice/ice_lib.c +@@ -2754,19 +2754,14 @@ int ice_vsi_release(struct ice_vsi *vsi) + + if (vsi->type == ICE_VSI_VF) + vf = &pf->vf[vsi->vf_id]; +- /* do not unregister and free netdevs while driver is in the reset +- * recovery pending state. Since reset/rebuild happens through PF +- * service task workqueue, its not a good idea to unregister netdev +- * that is associated to the PF that is running the work queue items +- * currently. This is done to avoid check_flush_dependency() warning +- * on this wq ++ /* do not unregister while driver is in the reset recovery pending ++ * state. Since reset/rebuild happens through PF service task workqueue, ++ * it's not a good idea to unregister netdev that is associated to the ++ * PF that is running the work queue items currently. This is done to ++ * avoid check_flush_dependency() warning on this wq + */ +- if (vsi->netdev && !ice_is_reset_in_progress(pf->state)) { +- ice_napi_del(vsi); ++ if (vsi->netdev && !ice_is_reset_in_progress(pf->state)) + unregister_netdev(vsi->netdev); +- free_netdev(vsi->netdev); +- vsi->netdev = NULL; +- } + + if (test_bit(ICE_FLAG_RSS_ENA, pf->flags)) + ice_rss_clean(vsi); +@@ -2799,6 +2794,13 @@ int ice_vsi_release(struct ice_vsi *vsi) + ice_rm_vsi_lan_cfg(vsi->port_info, vsi->idx); + ice_vsi_delete(vsi); + ice_vsi_free_q_vectors(vsi); ++ ++ /* make sure unregister_netdev() was called by checking __ICE_DOWN */ ++ if (vsi->netdev && test_bit(__ICE_DOWN, vsi->state)) { ++ free_netdev(vsi->netdev); ++ vsi->netdev = NULL; ++ } ++ + ice_vsi_clear_rings(vsi); + + ice_vsi_put_qs(vsi); +diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c +index 7843abf4d44d..1c803106e301 100644 +--- a/drivers/net/ethernet/intel/ice/ice_main.c ++++ b/drivers/net/ethernet/intel/ice/ice_main.c +@@ -1161,16 +1161,16 @@ static void ice_handle_mdd_event(struct ice_pf *pf) + } + } + +- /* see if one of the VFs needs to be reset */ +- for (i = 0; i < pf->num_alloc_vfs && mdd_detected; i++) { ++ /* check to see if one of the VFs caused the MDD */ ++ for (i = 0; i < pf->num_alloc_vfs; i++) { + struct ice_vf *vf = &pf->vf[i]; + +- mdd_detected = false; ++ bool vf_mdd_detected = false; + + reg = rd32(hw, VP_MDET_TX_PQM(i)); + if (reg & VP_MDET_TX_PQM_VALID_M) { + wr32(hw, VP_MDET_TX_PQM(i), 0xFFFF); +- mdd_detected = true; ++ vf_mdd_detected = true; + dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n", + i); + } +@@ -1178,7 +1178,7 @@ static void ice_handle_mdd_event(struct ice_pf *pf) + reg = rd32(hw, VP_MDET_TX_TCLAN(i)); + if (reg & VP_MDET_TX_TCLAN_VALID_M) { + wr32(hw, VP_MDET_TX_TCLAN(i), 0xFFFF); +- mdd_detected = true; ++ vf_mdd_detected = true; + dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n", + i); + } +@@ -1186,7 +1186,7 @@ static void ice_handle_mdd_event(struct ice_pf *pf) + reg = rd32(hw, VP_MDET_TX_TDPU(i)); + if (reg & VP_MDET_TX_TDPU_VALID_M) { + wr32(hw, VP_MDET_TX_TDPU(i), 0xFFFF); +- mdd_detected = true; ++ vf_mdd_detected = true; + dev_info(&pf->pdev->dev, "TX driver issue detected on VF %d\n", + i); + } +@@ -1194,19 +1194,18 @@ static void ice_handle_mdd_event(struct ice_pf *pf) + reg = rd32(hw, VP_MDET_RX(i)); + if (reg & VP_MDET_RX_VALID_M) { + wr32(hw, VP_MDET_RX(i), 0xFFFF); +- mdd_detected = true; ++ vf_mdd_detected = true; + dev_info(&pf->pdev->dev, "RX driver issue detected on VF %d\n", + i); + } + +- if (mdd_detected) { ++ if (vf_mdd_detected) { + vf->num_mdd_events++; +- dev_info(&pf->pdev->dev, +- "Use PF Control I/F to re-enable the VF\n"); +- set_bit(ICE_VF_STATE_DIS, vf->vf_states); ++ if (vf->num_mdd_events > 1) ++ dev_info(&pf->pdev->dev, "VF %d has had %llu MDD events since last boot\n", ++ i, vf->num_mdd_events); + } + } +- + } + + /** +@@ -1667,7 +1666,7 @@ static int ice_req_irq_msix_misc(struct ice_pf *pf) + * ice_napi_del - Remove NAPI handler for the VSI + * @vsi: VSI for which NAPI handler is to be removed + */ +-void ice_napi_del(struct ice_vsi *vsi) ++static void ice_napi_del(struct ice_vsi *vsi) + { + int v_idx; + +diff --git a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c +index a805cbdd69be..81ea77978355 100644 +--- a/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c ++++ b/drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c +@@ -1134,7 +1134,7 @@ static int ice_alloc_vfs(struct ice_pf *pf, u16 num_alloc_vfs) + GFP_KERNEL); + if (!vfs) { + ret = -ENOMEM; +- goto err_unroll_sriov; ++ goto err_pci_disable_sriov; + } + pf->vf = vfs; + +@@ -1154,12 +1154,19 @@ static int ice_alloc_vfs(struct ice_pf *pf, u16 num_alloc_vfs) + pf->num_alloc_vfs = num_alloc_vfs; + + /* VF resources get allocated during reset */ +- if (!ice_reset_all_vfs(pf, true)) ++ if (!ice_reset_all_vfs(pf, true)) { ++ ret = -EIO; + goto err_unroll_sriov; ++ } + + goto err_unroll_intr; + + err_unroll_sriov: ++ pf->vf = NULL; ++ devm_kfree(&pf->pdev->dev, vfs); ++ vfs = NULL; ++ pf->num_alloc_vfs = 0; ++err_pci_disable_sriov: + pci_disable_sriov(pf->pdev); + err_unroll_intr: + /* rearm interrupts here */ +diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c +index 39f33afc479c..005c1693efc8 100644 +--- a/drivers/net/ethernet/intel/igb/igb_main.c ++++ b/drivers/net/ethernet/intel/igb/igb_main.c +@@ -5687,6 +5687,7 @@ static void igb_tx_ctxtdesc(struct igb_ring *tx_ring, + */ + if (tx_ring->launchtime_enable) { + ts = ns_to_timespec64(first->skb->tstamp); ++ first->skb->tstamp = 0; + context_desc->seqnum_seed = cpu_to_le32(ts.tv_nsec / 32); + } else { + context_desc->seqnum_seed = 0; +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +index acba067cc15a..7c52ae8ac005 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +@@ -3226,7 +3226,8 @@ static int ixgbe_get_module_info(struct net_device *dev, + page_swap = true; + } + +- if (sff8472_rev == IXGBE_SFF_SFF_8472_UNSUP || page_swap) { ++ if (sff8472_rev == IXGBE_SFF_SFF_8472_UNSUP || page_swap || ++ !(addr_mode & IXGBE_SFF_DDM_IMPLEMENTED)) { + /* We have a SFP, but it does not support SFF-8472 */ + modinfo->type = ETH_MODULE_SFF_8079; + modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c +index ff85ce5791a3..31629fc7e820 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c +@@ -842,6 +842,9 @@ void ixgbe_ipsec_vf_clear(struct ixgbe_adapter *adapter, u32 vf) + struct ixgbe_ipsec *ipsec = adapter->ipsec; + int i; + ++ if (!ipsec) ++ return; ++ + /* search rx sa table */ + for (i = 0; i < IXGBE_IPSEC_MAX_SA_COUNT && ipsec->num_rx_sa; i++) { + if (!ipsec->rx_tbl[i].used) +diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h +index 214b01085718..6544c4539c0d 100644 +--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h ++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h +@@ -45,6 +45,7 @@ + #define IXGBE_SFF_SOFT_RS_SELECT_10G 0x8 + #define IXGBE_SFF_SOFT_RS_SELECT_1G 0x0 + #define IXGBE_SFF_ADDRESSING_MODE 0x4 ++#define IXGBE_SFF_DDM_IMPLEMENTED 0x40 + #define IXGBE_SFF_QSFP_DA_ACTIVE_CABLE 0x1 + #define IXGBE_SFF_QSFP_DA_PASSIVE_CABLE 0x8 + #define IXGBE_SFF_QSFP_CONNECTOR_NOT_SEPARABLE 0x23 +diff --git a/drivers/net/ethernet/marvell/mvmdio.c b/drivers/net/ethernet/marvell/mvmdio.c +index c5dac6bd2be4..aca878a3f81f 100644 +--- a/drivers/net/ethernet/marvell/mvmdio.c ++++ b/drivers/net/ethernet/marvell/mvmdio.c +@@ -64,7 +64,7 @@ + + struct orion_mdio_dev { + void __iomem *regs; +- struct clk *clk[3]; ++ struct clk *clk[4]; + /* + * If we have access to the error interrupt pin (which is + * somewhat misnamed as it not only reflects internal errors +@@ -319,11 +319,31 @@ static int orion_mdio_probe(struct platform_device *pdev) + + init_waitqueue_head(&dev->smi_busy_wait); + +- for (i = 0; i < ARRAY_SIZE(dev->clk); i++) { +- dev->clk[i] = of_clk_get(pdev->dev.of_node, i); +- if (IS_ERR(dev->clk[i])) +- break; +- clk_prepare_enable(dev->clk[i]); ++ if (pdev->dev.of_node) { ++ for (i = 0; i < ARRAY_SIZE(dev->clk); i++) { ++ dev->clk[i] = of_clk_get(pdev->dev.of_node, i); ++ if (PTR_ERR(dev->clk[i]) == -EPROBE_DEFER) { ++ ret = -EPROBE_DEFER; ++ goto out_clk; ++ } ++ if (IS_ERR(dev->clk[i])) ++ break; ++ clk_prepare_enable(dev->clk[i]); ++ } ++ ++ if (!IS_ERR(of_clk_get(pdev->dev.of_node, ++ ARRAY_SIZE(dev->clk)))) ++ dev_warn(&pdev->dev, ++ "unsupported number of clocks, limiting to the first " ++ __stringify(ARRAY_SIZE(dev->clk)) "\n"); ++ } else { ++ dev->clk[0] = clk_get(&pdev->dev, NULL); ++ if (PTR_ERR(dev->clk[0]) == -EPROBE_DEFER) { ++ ret = -EPROBE_DEFER; ++ goto out_clk; ++ } ++ if (!IS_ERR(dev->clk[0])) ++ clk_prepare_enable(dev->clk[0]); + } + + dev->err_interrupt = platform_get_irq(pdev, 0); +@@ -362,6 +382,7 @@ static int orion_mdio_probe(struct platform_device *pdev) + if (dev->err_interrupt > 0) + writel(0, dev->regs + MVMDIO_ERR_INT_MASK); + ++out_clk: + for (i = 0; i < ARRAY_SIZE(dev->clk); i++) { + if (IS_ERR(dev->clk[i])) + break; +diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c +index a57d17ab91f0..fb06c0aa620a 100644 +--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c ++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_cls.c +@@ -1242,6 +1242,12 @@ int mvpp2_ethtool_cls_rule_ins(struct mvpp2_port *port, + + input.fs = &info->fs; + ++ /* We need to manually set the rss_ctx, since this info isn't present ++ * in info->fs ++ */ ++ if (info->fs.flow_type & FLOW_RSS) ++ input.rss_ctx = info->rss_context; ++ + ethtool_rule = ethtool_rx_flow_rule_create(&input); + if (IS_ERR(ethtool_rule)) { + ret = PTR_ERR(ethtool_rule); +diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +index d8e5241097a9..50ed1bdb632d 100644 +--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c ++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +@@ -3609,6 +3609,7 @@ static int mvpp2_set_mac_address(struct net_device *dev, void *p) + static int mvpp2_change_mtu(struct net_device *dev, int mtu) + { + struct mvpp2_port *port = netdev_priv(dev); ++ bool running = netif_running(dev); + int err; + + if (!IS_ALIGNED(MVPP2_RX_PKT_SIZE(mtu), 8)) { +@@ -3617,40 +3618,24 @@ static int mvpp2_change_mtu(struct net_device *dev, int mtu) + mtu = ALIGN(MVPP2_RX_PKT_SIZE(mtu), 8); + } + +- if (!netif_running(dev)) { +- err = mvpp2_bm_update_mtu(dev, mtu); +- if (!err) { +- port->pkt_size = MVPP2_RX_PKT_SIZE(mtu); +- return 0; +- } +- +- /* Reconfigure BM to the original MTU */ +- err = mvpp2_bm_update_mtu(dev, dev->mtu); +- if (err) +- goto log_error; +- } +- +- mvpp2_stop_dev(port); ++ if (running) ++ mvpp2_stop_dev(port); + + err = mvpp2_bm_update_mtu(dev, mtu); +- if (!err) { ++ if (err) { ++ netdev_err(dev, "failed to change MTU\n"); ++ /* Reconfigure BM to the original MTU */ ++ mvpp2_bm_update_mtu(dev, dev->mtu); ++ } else { + port->pkt_size = MVPP2_RX_PKT_SIZE(mtu); +- goto out_start; + } + +- /* Reconfigure BM to the original MTU */ +- err = mvpp2_bm_update_mtu(dev, dev->mtu); +- if (err) +- goto log_error; +- +-out_start: +- mvpp2_start_dev(port); +- mvpp2_egress_enable(port); +- mvpp2_ingress_enable(port); ++ if (running) { ++ mvpp2_start_dev(port); ++ mvpp2_egress_enable(port); ++ mvpp2_ingress_enable(port); ++ } + +- return 0; +-log_error: +- netdev_err(dev, "failed to change MTU\n"); + return err; + } + +@@ -5609,9 +5594,6 @@ static int mvpp2_remove(struct platform_device *pdev) + + mvpp2_dbgfs_cleanup(priv); + +- flush_workqueue(priv->stats_queue); +- destroy_workqueue(priv->stats_queue); +- + fwnode_for_each_available_child_node(fwnode, port_fwnode) { + if (priv->port_list[i]) { + mutex_destroy(&priv->port_list[i]->gather_stats_lock); +@@ -5620,6 +5602,8 @@ static int mvpp2_remove(struct platform_device *pdev) + i++; + } + ++ destroy_workqueue(priv->stats_queue); ++ + for (i = 0; i < MVPP2_BM_POOLS_NUM; i++) { + struct mvpp2_bm_pool *bm_pool = &priv->bm_pools[i]; + +diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c +index ae2240074d8e..5692c6087bbb 100644 +--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c ++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c +@@ -312,7 +312,8 @@ static void mvpp2_prs_sram_shift_set(struct mvpp2_prs_entry *pe, int shift, + } + + /* Set value */ +- pe->sram[MVPP2_BIT_TO_WORD(MVPP2_PRS_SRAM_SHIFT_OFFS)] = shift & MVPP2_PRS_SRAM_SHIFT_MASK; ++ pe->sram[MVPP2_BIT_TO_WORD(MVPP2_PRS_SRAM_SHIFT_OFFS)] |= ++ shift & MVPP2_PRS_SRAM_SHIFT_MASK; + + /* Reset and set operation */ + mvpp2_prs_sram_bits_clear(pe, MVPP2_PRS_SRAM_OP_SEL_SHIFT_OFFS, +diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c +index fe518c854d1f..c93a6f9b735b 100644 +--- a/drivers/net/ethernet/marvell/sky2.c ++++ b/drivers/net/ethernet/marvell/sky2.c +@@ -4917,6 +4917,13 @@ static const struct dmi_system_id msi_blacklist[] = { + DMI_MATCH(DMI_PRODUCT_NAME, "P-79"), + }, + }, ++ { ++ .ident = "ASUS P6T", ++ .matches = { ++ DMI_MATCH(DMI_BOARD_VENDOR, "ASUSTeK Computer INC."), ++ DMI_MATCH(DMI_BOARD_NAME, "P6T"), ++ }, ++ }, + {} + }; + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/dev.c b/drivers/net/ethernet/mellanox/mlx5/core/dev.c +index f6b1da99e6c2..ba5f46da1c5c 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/dev.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/dev.c +@@ -213,7 +213,7 @@ void mlx5_unregister_device(struct mlx5_core_dev *dev) + struct mlx5_interface *intf; + + mutex_lock(&mlx5_intf_mutex); +- list_for_each_entry(intf, &intf_list, list) ++ list_for_each_entry_reverse(intf, &intf_list, list) + mlx5_remove_device(intf, priv); + list_del(&priv->dev_list); + mutex_unlock(&mlx5_intf_mutex); +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h +index cc6797e24571..cc227a7aa79f 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h +@@ -294,6 +294,7 @@ enum { + MLX5E_RQ_STATE_ENABLED, + MLX5E_RQ_STATE_AM, + MLX5E_RQ_STATE_NO_CSUM_COMPLETE, ++ MLX5E_RQ_STATE_CSUM_FULL, /* cqe_csum_full hw bit is set */ + }; + + struct mlx5e_cq { +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/port.c b/drivers/net/ethernet/mellanox/mlx5/core/en/port.c +index d5e5afbdca6d..f777994f3005 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en/port.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/port.c +@@ -78,9 +78,10 @@ static const u32 mlx5e_ext_link_speed[MLX5E_EXT_LINK_MODES_NUMBER] = { + }; + + static void mlx5e_port_get_speed_arr(struct mlx5_core_dev *mdev, +- const u32 **arr, u32 *size) ++ const u32 **arr, u32 *size, ++ bool force_legacy) + { +- bool ext = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet); ++ bool ext = force_legacy ? false : MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet); + + *size = ext ? ARRAY_SIZE(mlx5e_ext_link_speed) : + ARRAY_SIZE(mlx5e_link_speed); +@@ -152,7 +153,8 @@ int mlx5_port_set_eth_ptys(struct mlx5_core_dev *dev, bool an_disable, + sizeof(out), MLX5_REG_PTYS, 0, 1); + } + +-u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper) ++u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper, ++ bool force_legacy) + { + unsigned long temp = eth_proto_oper; + const u32 *table; +@@ -160,7 +162,7 @@ u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper) + u32 max_size; + int i; + +- mlx5e_port_get_speed_arr(mdev, &table, &max_size); ++ mlx5e_port_get_speed_arr(mdev, &table, &max_size, force_legacy); + i = find_first_bit(&temp, max_size); + if (i < max_size) + speed = table[i]; +@@ -170,6 +172,7 @@ u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper) + int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) + { + struct mlx5e_port_eth_proto eproto; ++ bool force_legacy = false; + bool ext; + int err; + +@@ -177,8 +180,13 @@ int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) + err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto); + if (err) + goto out; +- +- *speed = mlx5e_port_ptys2speed(mdev, eproto.oper); ++ if (ext && !eproto.admin) { ++ force_legacy = true; ++ err = mlx5_port_query_eth_proto(mdev, 1, false, &eproto); ++ if (err) ++ goto out; ++ } ++ *speed = mlx5e_port_ptys2speed(mdev, eproto.oper, force_legacy); + if (!(*speed)) + err = -EINVAL; + +@@ -201,7 +209,7 @@ int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) + if (err) + return err; + +- mlx5e_port_get_speed_arr(mdev, &table, &max_size); ++ mlx5e_port_get_speed_arr(mdev, &table, &max_size, false); + for (i = 0; i < max_size; ++i) + if (eproto.cap & MLX5E_PROT_MASK(i)) + max_speed = max(max_speed, table[i]); +@@ -210,14 +218,15 @@ int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed) + return 0; + } + +-u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed) ++u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed, ++ bool force_legacy) + { + u32 link_modes = 0; + const u32 *table; + u32 max_size; + int i; + +- mlx5e_port_get_speed_arr(mdev, &table, &max_size); ++ mlx5e_port_get_speed_arr(mdev, &table, &max_size, force_legacy); + for (i = 0; i < max_size; ++i) { + if (table[i] == speed) + link_modes |= MLX5E_PROT_MASK(i); +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/port.h b/drivers/net/ethernet/mellanox/mlx5/core/en/port.h +index 70f536ec51c4..4a7f4497692b 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en/port.h ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/port.h +@@ -48,10 +48,12 @@ void mlx5_port_query_eth_autoneg(struct mlx5_core_dev *dev, u8 *an_status, + u8 *an_disable_cap, u8 *an_disable_admin); + int mlx5_port_set_eth_ptys(struct mlx5_core_dev *dev, bool an_disable, + u32 proto_admin, bool ext); +-u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper); ++u32 mlx5e_port_ptys2speed(struct mlx5_core_dev *mdev, u32 eth_proto_oper, ++ bool force_legacy); + int mlx5e_port_linkspeed(struct mlx5_core_dev *mdev, u32 *speed); + int mlx5e_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed); +-u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed); ++u32 mlx5e_port_speed2linkmodes(struct mlx5_core_dev *mdev, u32 speed, ++ bool force_legacy); + + int mlx5e_port_query_pbmc(struct mlx5_core_dev *mdev, void *out); + int mlx5e_port_set_pbmc(struct mlx5_core_dev *mdev, void *in); +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c +index 476dd97f7f2f..f3d98748b211 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_tx.c +@@ -142,22 +142,20 @@ static int mlx5e_tx_reporter_timeout_recover(struct mlx5e_txqsq *sq) + { + struct mlx5_eq_comp *eq = sq->cq.mcq.eq; + u32 eqe_count; +- int ret; + + netdev_err(sq->channel->netdev, "EQ 0x%x: Cons = 0x%x, irqn = 0x%x\n", + eq->core.eqn, eq->core.cons_index, eq->core.irqn); + + eqe_count = mlx5_eq_poll_irq_disabled(eq); +- ret = eqe_count ? false : true; + if (!eqe_count) { + clear_bit(MLX5E_SQ_STATE_ENABLED, &sq->state); +- return ret; ++ return -EIO; + } + + netdev_err(sq->channel->netdev, "Recover %d eqes on EQ 0x%x\n", + eqe_count, eq->core.eqn); + sq->channel->stats->eq_rearm++; +- return ret; ++ return 0; + } + + int mlx5e_tx_reporter_timeout(struct mlx5e_txqsq *sq) +@@ -264,13 +262,13 @@ static int mlx5e_tx_reporter_diagnose(struct devlink_health_reporter *reporter, + + err = mlx5_core_query_sq_state(priv->mdev, sq->sqn, &state); + if (err) +- break; ++ goto unlock; + + err = mlx5e_tx_reporter_build_diagnose_output(fmsg, sq->sqn, + state, + netif_xmit_stopped(sq->txq)); + if (err) +- break; ++ goto unlock; + } + err = devlink_fmsg_arr_pair_nest_end(fmsg); + if (err) +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +index dd764e0471f2..f637d81f08bc 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c +@@ -764,7 +764,7 @@ static void ptys2ethtool_supported_advertised_port(struct ethtool_link_ksettings + } + + static void get_speed_duplex(struct net_device *netdev, +- u32 eth_proto_oper, ++ u32 eth_proto_oper, bool force_legacy, + struct ethtool_link_ksettings *link_ksettings) + { + struct mlx5e_priv *priv = netdev_priv(netdev); +@@ -774,7 +774,7 @@ static void get_speed_duplex(struct net_device *netdev, + if (!netif_carrier_ok(netdev)) + goto out; + +- speed = mlx5e_port_ptys2speed(priv->mdev, eth_proto_oper); ++ speed = mlx5e_port_ptys2speed(priv->mdev, eth_proto_oper, force_legacy); + if (!speed) { + speed = SPEED_UNKNOWN; + goto out; +@@ -893,8 +893,8 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv, + /* Fields: eth_proto_admin and ext_eth_proto_admin are + * mutually exclusive. Hence try reading legacy advertising + * when extended advertising is zero. +- * admin_ext indicates how eth_proto_admin should be +- * interpreted ++ * admin_ext indicates which proto_admin (ext vs. legacy) ++ * should be read and interpreted + */ + admin_ext = ext; + if (ext && !eth_proto_admin) { +@@ -903,7 +903,7 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv, + admin_ext = false; + } + +- eth_proto_oper = MLX5_GET_ETH_PROTO(ptys_reg, out, ext, ++ eth_proto_oper = MLX5_GET_ETH_PROTO(ptys_reg, out, admin_ext, + eth_proto_oper); + eth_proto_lp = MLX5_GET(ptys_reg, out, eth_proto_lp_advertise); + an_disable_admin = MLX5_GET(ptys_reg, out, an_disable_admin); +@@ -918,7 +918,8 @@ int mlx5e_ethtool_get_link_ksettings(struct mlx5e_priv *priv, + get_supported(mdev, eth_proto_cap, link_ksettings); + get_advertising(eth_proto_admin, tx_pause, rx_pause, link_ksettings, + admin_ext); +- get_speed_duplex(priv->netdev, eth_proto_oper, link_ksettings); ++ get_speed_duplex(priv->netdev, eth_proto_oper, !admin_ext, ++ link_ksettings); + + eth_proto_oper = eth_proto_oper ? eth_proto_oper : eth_proto_cap; + +@@ -995,45 +996,69 @@ static u32 mlx5e_ethtool2ptys_ext_adver_link(const unsigned long *link_modes) + return ptys_modes; + } + ++static bool ext_link_mode_requested(const unsigned long *adver) ++{ ++#define MLX5E_MIN_PTYS_EXT_LINK_MODE_BIT ETHTOOL_LINK_MODE_50000baseKR_Full_BIT ++ int size = __ETHTOOL_LINK_MODE_MASK_NBITS - MLX5E_MIN_PTYS_EXT_LINK_MODE_BIT; ++ __ETHTOOL_DECLARE_LINK_MODE_MASK(modes); ++ ++ bitmap_set(modes, MLX5E_MIN_PTYS_EXT_LINK_MODE_BIT, size); ++ return bitmap_intersects(modes, adver, __ETHTOOL_LINK_MODE_MASK_NBITS); ++} ++ ++static bool ext_speed_requested(u32 speed) ++{ ++#define MLX5E_MAX_PTYS_LEGACY_SPEED 100000 ++ return !!(speed > MLX5E_MAX_PTYS_LEGACY_SPEED); ++} ++ ++static bool ext_requested(u8 autoneg, const unsigned long *adver, u32 speed) ++{ ++ bool ext_link_mode = ext_link_mode_requested(adver); ++ bool ext_speed = ext_speed_requested(speed); ++ ++ return autoneg == AUTONEG_ENABLE ? ext_link_mode : ext_speed; ++} ++ + int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv, + const struct ethtool_link_ksettings *link_ksettings) + { + struct mlx5_core_dev *mdev = priv->mdev; + struct mlx5e_port_eth_proto eproto; ++ const unsigned long *adver; + bool an_changes = false; + u8 an_disable_admin; + bool ext_supported; +- bool ext_requested; + u8 an_disable_cap; + bool an_disable; + u32 link_modes; + u8 an_status; ++ u8 autoneg; + u32 speed; ++ bool ext; + int err; + + u32 (*ethtool2ptys_adver_func)(const unsigned long *adver); + +-#define MLX5E_PTYS_EXT ((1ULL << ETHTOOL_LINK_MODE_50000baseKR_Full_BIT) - 1) ++ adver = link_ksettings->link_modes.advertising; ++ autoneg = link_ksettings->base.autoneg; ++ speed = link_ksettings->base.speed; + +- ext_requested = !!(link_ksettings->link_modes.advertising[0] > +- MLX5E_PTYS_EXT || +- link_ksettings->link_modes.advertising[1]); ++ ext = ext_requested(autoneg, adver, speed), + ext_supported = MLX5_CAP_PCAM_FEATURE(mdev, ptys_extended_ethernet); +- ext_requested &= ext_supported; ++ if (!ext_supported && ext) ++ return -EOPNOTSUPP; + +- speed = link_ksettings->base.speed; +- ethtool2ptys_adver_func = ext_requested ? +- mlx5e_ethtool2ptys_ext_adver_link : ++ ethtool2ptys_adver_func = ext ? mlx5e_ethtool2ptys_ext_adver_link : + mlx5e_ethtool2ptys_adver_link; +- err = mlx5_port_query_eth_proto(mdev, 1, ext_requested, &eproto); ++ err = mlx5_port_query_eth_proto(mdev, 1, ext, &eproto); + if (err) { + netdev_err(priv->netdev, "%s: query port eth proto failed: %d\n", + __func__, err); + goto out; + } +- link_modes = link_ksettings->base.autoneg == AUTONEG_ENABLE ? +- ethtool2ptys_adver_func(link_ksettings->link_modes.advertising) : +- mlx5e_port_speed2linkmodes(mdev, speed); ++ link_modes = autoneg == AUTONEG_ENABLE ? ethtool2ptys_adver_func(adver) : ++ mlx5e_port_speed2linkmodes(mdev, speed, !ext); + + link_modes = link_modes & eproto.cap; + if (!link_modes) { +@@ -1046,14 +1071,14 @@ int mlx5e_ethtool_set_link_ksettings(struct mlx5e_priv *priv, + mlx5_port_query_eth_autoneg(mdev, &an_status, &an_disable_cap, + &an_disable_admin); + +- an_disable = link_ksettings->base.autoneg == AUTONEG_DISABLE; ++ an_disable = autoneg == AUTONEG_DISABLE; + an_changes = ((!an_disable && an_disable_admin) || + (an_disable && !an_disable_admin)); + + if (!an_changes && link_modes == eproto.admin) + goto out; + +- mlx5_port_set_eth_ptys(mdev, an_disable, link_modes, ext_requested); ++ mlx5_port_set_eth_ptys(mdev, an_disable, link_modes, ext); + mlx5_toggle_port_link(mdev); + + out: +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +index a8e8350b38aa..882d26b8095d 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +@@ -340,12 +340,11 @@ static inline u64 mlx5e_get_mpwqe_offset(struct mlx5e_rq *rq, u16 wqe_ix) + + static void mlx5e_init_frags_partition(struct mlx5e_rq *rq) + { +- struct mlx5e_wqe_frag_info next_frag, *prev; ++ struct mlx5e_wqe_frag_info next_frag = {}; ++ struct mlx5e_wqe_frag_info *prev = NULL; + int i; + + next_frag.di = &rq->wqe.di[0]; +- next_frag.offset = 0; +- prev = NULL; + + for (i = 0; i < mlx5_wq_cyc_get_size(&rq->wqe.wq); i++) { + struct mlx5e_rq_frag_info *frag_info = &rq->wqe.info.arr[0]; +@@ -855,6 +854,9 @@ static int mlx5e_open_rq(struct mlx5e_channel *c, + if (err) + goto err_destroy_rq; + ++ if (MLX5_CAP_ETH(c->mdev, cqe_checksum_full)) ++ __set_bit(MLX5E_RQ_STATE_CSUM_FULL, &c->rq.state); ++ + if (params->rx_dim_enabled) + __set_bit(MLX5E_RQ_STATE_AM, &c->rq.state); + +@@ -4192,8 +4194,6 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog) + /* no need for full reset when exchanging programs */ + reset = (!priv->channels.params.xdp_prog || !prog); + +- if (was_opened && reset) +- mlx5e_close_locked(netdev); + if (was_opened && !reset) { + /* num_channels is invariant here, so we can take the + * batched reference right upfront. +@@ -4205,20 +4205,31 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog) + } + } + +- /* exchange programs, extra prog reference we got from caller +- * as long as we don't fail from this point onwards. +- */ +- old_prog = xchg(&priv->channels.params.xdp_prog, prog); ++ if (was_opened && reset) { ++ struct mlx5e_channels new_channels = {}; ++ ++ new_channels.params = priv->channels.params; ++ new_channels.params.xdp_prog = prog; ++ mlx5e_set_rq_type(priv->mdev, &new_channels.params); ++ old_prog = priv->channels.params.xdp_prog; ++ ++ err = mlx5e_safe_switch_channels(priv, &new_channels, NULL); ++ if (err) ++ goto unlock; ++ } else { ++ /* exchange programs, extra prog reference we got from caller ++ * as long as we don't fail from this point onwards. ++ */ ++ old_prog = xchg(&priv->channels.params.xdp_prog, prog); ++ } ++ + if (old_prog) + bpf_prog_put(old_prog); + +- if (reset) /* change RQ type according to priv->xdp_prog */ ++ if (!was_opened && reset) /* change RQ type according to priv->xdp_prog */ + mlx5e_set_rq_type(priv->mdev, &priv->channels.params); + +- if (was_opened && reset) +- err = mlx5e_open_locked(netdev); +- +- if (!test_bit(MLX5E_STATE_OPENED, &priv->state) || reset) ++ if (!was_opened || reset) + goto unlock; + + /* exchanging programs w/o reset, we update ref counts on behalf +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +index 13133e7f088e..8a5f9411cac6 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +@@ -873,8 +873,14 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, + if (unlikely(get_ip_proto(skb, network_depth, proto) == IPPROTO_SCTP)) + goto csum_unnecessary; + ++ stats->csum_complete++; + skb->ip_summed = CHECKSUM_COMPLETE; + skb->csum = csum_unfold((__force __sum16)cqe->check_sum); ++ ++ if (test_bit(MLX5E_RQ_STATE_CSUM_FULL, &rq->state)) ++ return; /* CQE csum covers all received bytes */ ++ ++ /* csum might need some fixups ...*/ + if (network_depth > ETH_HLEN) + /* CQE csum is calculated from the IP header and does + * not cover VLAN headers (if present). This will add +@@ -885,7 +891,6 @@ static inline void mlx5e_handle_csum(struct net_device *netdev, + skb->csum); + + mlx5e_skb_padding_csum(skb, network_depth, proto, stats); +- stats->csum_complete++; + return; + } + +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +index e40c60d1631f..ee95f96ead4e 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +@@ -1210,13 +1210,13 @@ static struct mlx5_fc *mlx5e_tc_get_counter(struct mlx5e_tc_flow *flow) + void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe) + { + struct mlx5e_neigh *m_neigh = &nhe->m_neigh; +- u64 bytes, packets, lastuse = 0; + struct mlx5e_tc_flow *flow; + struct mlx5e_encap_entry *e; + struct mlx5_fc *counter; + struct neigh_table *tbl; + bool neigh_used = false; + struct neighbour *n; ++ u64 lastuse; + + if (m_neigh->family == AF_INET) + tbl = &arp_tbl; +@@ -1236,7 +1236,7 @@ void mlx5e_tc_update_neigh_used_value(struct mlx5e_neigh_hash_entry *nhe) + encaps[efi->index]); + if (flow->flags & MLX5E_TC_FLOW_OFFLOADED) { + counter = mlx5e_tc_get_counter(flow); +- mlx5_fc_query_cached(counter, &bytes, &packets, &lastuse); ++ lastuse = mlx5_fc_query_lastuse(counter); + if (time_after((unsigned long)lastuse, nhe->reported_lastuse)) { + neigh_used = true; + break; +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +index 6a921e24cd5e..535221b5256b 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +@@ -939,7 +939,7 @@ int esw_vport_enable_egress_acl(struct mlx5_eswitch *esw, + vport->vport, MLX5_CAP_ESW_EGRESS_ACL(dev, log_max_ft_size)); + + root_ns = mlx5_get_flow_vport_acl_namespace(dev, MLX5_FLOW_NAMESPACE_ESW_EGRESS, +- vport->vport); ++ mlx5_eswitch_vport_num_to_index(esw, vport->vport)); + if (!root_ns) { + esw_warn(dev, "Failed to get E-Switch egress flow namespace for vport (%d)\n", vport->vport); + return -EOPNOTSUPP; +@@ -1057,7 +1057,7 @@ int esw_vport_enable_ingress_acl(struct mlx5_eswitch *esw, + vport->vport, MLX5_CAP_ESW_INGRESS_ACL(dev, log_max_ft_size)); + + root_ns = mlx5_get_flow_vport_acl_namespace(dev, MLX5_FLOW_NAMESPACE_ESW_INGRESS, +- vport->vport); ++ mlx5_eswitch_vport_num_to_index(esw, vport->vport)); + if (!root_ns) { + esw_warn(dev, "Failed to get E-Switch ingress flow namespace for vport (%d)\n", vport->vport); + return -EOPNOTSUPP; +@@ -1882,11 +1882,6 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev) + esw->enabled_vports = 0; + esw->mode = SRIOV_NONE; + esw->offloads.inline_mode = MLX5_INLINE_MODE_NONE; +- if (MLX5_CAP_ESW_FLOWTABLE_FDB(dev, reformat) && +- MLX5_CAP_ESW_FLOWTABLE_FDB(dev, decap)) +- esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_BASIC; +- else +- esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE; + + dev->priv.eswitch = esw; + return 0; +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +index 47b446d30f71..c2beadc41c40 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c +@@ -1840,6 +1840,12 @@ int esw_offloads_init(struct mlx5_eswitch *esw, int vf_nvports, + { + int err; + ++ if (MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, reformat) && ++ MLX5_CAP_ESW_FLOWTABLE_FDB(esw->dev, decap)) ++ esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_BASIC; ++ else ++ esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE; ++ + err = esw_offloads_steering_init(esw, vf_nvports, total_nvports); + if (err) + return err; +@@ -1901,6 +1907,7 @@ void esw_offloads_cleanup(struct mlx5_eswitch *esw) + esw_offloads_devcom_cleanup(esw); + esw_offloads_unload_all_reps(esw, num_vfs); + esw_offloads_steering_cleanup(esw); ++ esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE; + } + + static int esw_mode_from_devlink(u16 mode, u16 *mlx5_mode) +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h +index a08c3d09a50f..2664a05eee00 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h ++++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.h +@@ -68,7 +68,7 @@ enum fs_flow_table_type { + FS_FT_SNIFFER_RX = 0X5, + FS_FT_SNIFFER_TX = 0X6, + FS_FT_RDMA_RX = 0X7, +- FS_FT_MAX_TYPE = FS_FT_SNIFFER_TX, ++ FS_FT_MAX_TYPE = FS_FT_RDMA_RX, + }; + + enum fs_flow_table_op_mod { +@@ -274,7 +274,8 @@ void mlx5_cleanup_fs(struct mlx5_core_dev *dev); + (type == FS_FT_FDB) ? MLX5_CAP_ESW_FLOWTABLE_FDB(mdev, cap) : \ + (type == FS_FT_SNIFFER_RX) ? MLX5_CAP_FLOWTABLE_SNIFFER_RX(mdev, cap) : \ + (type == FS_FT_SNIFFER_TX) ? MLX5_CAP_FLOWTABLE_SNIFFER_TX(mdev, cap) : \ +- (BUILD_BUG_ON_ZERO(FS_FT_SNIFFER_TX != FS_FT_MAX_TYPE))\ ++ (type == FS_FT_RDMA_RX) ? MLX5_CAP_FLOWTABLE_RDMA_RX(mdev, cap) : \ ++ (BUILD_BUG_ON_ZERO(FS_FT_RDMA_RX != FS_FT_MAX_TYPE))\ + ) + + #endif +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c +index c6c28f56aa29..add9db67028f 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_counters.c +@@ -367,6 +367,11 @@ int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter, + } + EXPORT_SYMBOL(mlx5_fc_query); + ++u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter) ++{ ++ return counter->cache.lastuse; ++} ++ + void mlx5_fc_query_cached(struct mlx5_fc *counter, + u64 *bytes, u64 *packets, u64 *lastuse) + { +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c +index 9ca492b430d8..603d294757b4 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c +@@ -698,7 +698,9 @@ static int mlx5_rdma_setup_rn(struct ib_device *ibdev, u8 port_num, + + prof->init(mdev, netdev, prof, ipriv); + +- mlx5e_attach_netdev(epriv); ++ err = mlx5e_attach_netdev(epriv); ++ if (err) ++ goto detach; + netif_carrier_off(netdev); + + /* set rdma_netdev func pointers */ +@@ -714,6 +716,11 @@ static int mlx5_rdma_setup_rn(struct ib_device *ibdev, u8 port_num, + + return 0; + ++detach: ++ prof->cleanup(epriv); ++ if (ipriv->sub_interface) ++ return err; ++ mlx5e_destroy_mdev_resources(mdev); + destroy_ht: + mlx5i_pkey_qpn_ht_cleanup(netdev); + return err; +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/port_tun.c b/drivers/net/ethernet/mellanox/mlx5/core/lib/port_tun.c +index be69c1d7941a..48b5c847b642 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/lib/port_tun.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/port_tun.c +@@ -98,27 +98,12 @@ static int mlx5_set_entropy(struct mlx5_tun_entropy *tun_entropy, + */ + if (entropy_flags.gre_calc_supported && + reformat_type == MLX5_REFORMAT_TYPE_L2_TO_NVGRE) { +- /* Other applications may change the global FW entropy +- * calculations settings. Check that the current entropy value +- * is the negative of the updated value. +- */ +- if (entropy_flags.force_enabled && +- enable == entropy_flags.gre_calc_enabled) { +- mlx5_core_warn(tun_entropy->mdev, +- "Unexpected GRE entropy calc setting - expected %d", +- !entropy_flags.gre_calc_enabled); +- return -EOPNOTSUPP; +- } +- err = mlx5_set_port_gre_tun_entropy_calc(tun_entropy->mdev, enable, +- entropy_flags.force_supported); ++ if (!entropy_flags.force_supported) ++ return 0; ++ err = mlx5_set_port_gre_tun_entropy_calc(tun_entropy->mdev, ++ enable, !enable); + if (err) + return err; +- /* if we turn on the entropy we don't need to force it anymore */ +- if (entropy_flags.force_supported && enable) { +- err = mlx5_set_port_gre_tun_entropy_calc(tun_entropy->mdev, 1, 0); +- if (err) +- return err; +- } + } else if (entropy_flags.calc_supported) { + /* Other applications may change the global FW entropy + * calculations settings. Check that the current entropy value +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +index 23204356ad88..d51442e63aba 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c +@@ -5989,7 +5989,7 @@ static int __init mlxsw_sp_module_init(void) + return 0; + + err_sp2_pci_driver_register: +- mlxsw_pci_driver_unregister(&mlxsw_sp2_pci_driver); ++ mlxsw_pci_driver_unregister(&mlxsw_sp1_pci_driver); + err_sp1_pci_driver_register: + mlxsw_core_driver_unregister(&mlxsw_sp2_driver); + err_sp2_core_driver_register: +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +index 8601b3041acd..332195d96c62 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h +@@ -805,6 +805,7 @@ int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port, + struct tc_prio_qopt_offload *p); + + /* spectrum_fid.c */ ++bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index); + bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid); + struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp, + u16 fid_index); +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c +index 1537f70bc26d..888ba4300bcc 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_buffers.c +@@ -437,8 +437,8 @@ static const struct mlxsw_sp_sb_pr mlxsw_sp1_sb_prs[] = { + MLXSW_SP1_SB_PR_CPU_SIZE, true, false), + }; + +-#define MLXSW_SP2_SB_PR_INGRESS_SIZE 38128752 +-#define MLXSW_SP2_SB_PR_EGRESS_SIZE 38128752 ++#define MLXSW_SP2_SB_PR_INGRESS_SIZE 35297568 ++#define MLXSW_SP2_SB_PR_EGRESS_SIZE 35297568 + #define MLXSW_SP2_SB_PR_CPU_SIZE (256 * 1000) + + /* Order according to mlxsw_sp2_sb_pool_dess */ +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c +index b25048c6c761..21296fa7f7fb 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_dcb.c +@@ -408,14 +408,6 @@ static int mlxsw_sp_port_dcb_app_update(struct mlxsw_sp_port *mlxsw_sp_port) + have_dscp = mlxsw_sp_port_dcb_app_prio_dscp_map(mlxsw_sp_port, + &prio_map); + +- if (!have_dscp) { +- err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port, +- MLXSW_REG_QPTS_TRUST_STATE_PCP); +- if (err) +- netdev_err(mlxsw_sp_port->dev, "Couldn't switch to trust L2\n"); +- return err; +- } +- + mlxsw_sp_port_dcb_app_dscp_prio_map(mlxsw_sp_port, default_prio, + &dscp_map); + err = mlxsw_sp_port_dcb_app_update_qpdpm(mlxsw_sp_port, +@@ -432,6 +424,14 @@ static int mlxsw_sp_port_dcb_app_update(struct mlxsw_sp_port *mlxsw_sp_port) + return err; + } + ++ if (!have_dscp) { ++ err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port, ++ MLXSW_REG_QPTS_TRUST_STATE_PCP); ++ if (err) ++ netdev_err(mlxsw_sp_port->dev, "Couldn't switch to trust L2\n"); ++ return err; ++ } ++ + err = mlxsw_sp_port_dcb_toggle_trust(mlxsw_sp_port, + MLXSW_REG_QPTS_TRUST_STATE_DSCP); + if (err) { +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c +index 46baf3b44309..8df3cb21baa6 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_fid.c +@@ -126,6 +126,16 @@ static const int *mlxsw_sp_packet_type_sfgc_types[] = { + [MLXSW_SP_FLOOD_TYPE_MC] = mlxsw_sp_sfgc_mc_packet_types, + }; + ++bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index) ++{ ++ enum mlxsw_sp_fid_type fid_type = MLXSW_SP_FID_TYPE_DUMMY; ++ struct mlxsw_sp_fid_family *fid_family; ++ ++ fid_family = mlxsw_sp->fid_core->fid_family_arr[fid_type]; ++ ++ return fid_family->start_index == fid_index; ++} ++ + bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid) + { + return fid->fid_family->lag_vid_valid; +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +index 50111f228d77..5ecb45118400 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +@@ -2468,6 +2468,9 @@ static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp, + goto just_remove; + } + ++ if (mlxsw_sp_fid_is_dummy(mlxsw_sp, fid)) ++ goto just_remove; ++ + mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid); + if (!mlxsw_sp_port_vlan) { + netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n"); +@@ -2527,6 +2530,9 @@ static void mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp *mlxsw_sp, + goto just_remove; + } + ++ if (mlxsw_sp_fid_is_dummy(mlxsw_sp, fid)) ++ goto just_remove; ++ + mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid); + if (!mlxsw_sp_port_vlan) { + netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n"); +diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c +index 02ad11e0b0d8..58e76e7cb0d6 100644 +--- a/drivers/net/ethernet/mscc/ocelot.c ++++ b/drivers/net/ethernet/mscc/ocelot.c +@@ -1797,6 +1797,7 @@ EXPORT_SYMBOL(ocelot_init); + + void ocelot_deinit(struct ocelot *ocelot) + { ++ cancel_delayed_work(&ocelot->stats_work); + destroy_workqueue(ocelot->stats_queue); + mutex_destroy(&ocelot->stats_lock); + } +diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c +index fccdb06fc5c5..8c40739e0d1b 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_dev.c ++++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c +@@ -3443,6 +3443,7 @@ static void qed_nvm_info_free(struct qed_hwfn *p_hwfn) + static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn, + void __iomem *p_regview, + void __iomem *p_doorbells, ++ u64 db_phys_addr, + enum qed_pci_personality personality) + { + struct qed_dev *cdev = p_hwfn->cdev; +@@ -3451,6 +3452,7 @@ static int qed_hw_prepare_single(struct qed_hwfn *p_hwfn, + /* Split PCI bars evenly between hwfns */ + p_hwfn->regview = p_regview; + p_hwfn->doorbells = p_doorbells; ++ p_hwfn->db_phys_addr = db_phys_addr; + + if (IS_VF(p_hwfn->cdev)) + return qed_vf_hw_prepare(p_hwfn); +@@ -3546,7 +3548,9 @@ int qed_hw_prepare(struct qed_dev *cdev, + /* Initialize the first hwfn - will learn number of hwfns */ + rc = qed_hw_prepare_single(p_hwfn, + cdev->regview, +- cdev->doorbells, personality); ++ cdev->doorbells, ++ cdev->db_phys_addr, ++ personality); + if (rc) + return rc; + +@@ -3555,22 +3559,25 @@ int qed_hw_prepare(struct qed_dev *cdev, + /* Initialize the rest of the hwfns */ + if (cdev->num_hwfns > 1) { + void __iomem *p_regview, *p_doorbell; +- u8 __iomem *addr; ++ u64 db_phys_addr; ++ u32 offset; + + /* adjust bar offset for second engine */ +- addr = cdev->regview + +- qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, +- BAR_ID_0) / 2; +- p_regview = addr; ++ offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, ++ BAR_ID_0) / 2; ++ p_regview = cdev->regview + offset; + +- addr = cdev->doorbells + +- qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, +- BAR_ID_1) / 2; +- p_doorbell = addr; ++ offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, ++ BAR_ID_1) / 2; ++ ++ p_doorbell = cdev->doorbells + offset; ++ ++ db_phys_addr = cdev->db_phys_addr + offset; + + /* prepare second hw function */ + rc = qed_hw_prepare_single(&cdev->hwfns[1], p_regview, +- p_doorbell, personality); ++ p_doorbell, db_phys_addr, ++ personality); + + /* in case of error, need to free the previously + * initiliazed hwfn 0. +diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c +index ded556b7bab5..eeea8683d99b 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c ++++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c +@@ -2708,6 +2708,8 @@ qed_iwarp_ll2_start(struct qed_hwfn *p_hwfn, + data.input.rx_num_desc = n_ooo_bufs * 2; + data.input.tx_num_desc = data.input.rx_num_desc; + data.input.tx_max_bds_per_packet = QED_IWARP_MAX_BDS_PER_FPDU; ++ data.input.tx_tc = PKT_LB_TC; ++ data.input.tx_dest = QED_LL2_TX_DEST_LB; + data.p_connection_handle = &iwarp_info->ll2_mpa_handle; + data.input.secondary_queue = true; + data.cbs = &cbs; +diff --git a/drivers/net/ethernet/qlogic/qed/qed_rdma.c b/drivers/net/ethernet/qlogic/qed/qed_rdma.c +index 7873d6dfd91f..13802b825d65 100644 +--- a/drivers/net/ethernet/qlogic/qed/qed_rdma.c ++++ b/drivers/net/ethernet/qlogic/qed/qed_rdma.c +@@ -803,7 +803,7 @@ static int qed_rdma_add_user(void *rdma_cxt, + dpi_start_offset + + ((out_params->dpi) * p_hwfn->dpi_size)); + +- out_params->dpi_phys_addr = p_hwfn->cdev->db_phys_addr + ++ out_params->dpi_phys_addr = p_hwfn->db_phys_addr + + dpi_start_offset + + ((out_params->dpi) * p_hwfn->dpi_size); + +diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h +index 4bf20d0651c4..90ad5694e2af 100644 +--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h ++++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h +@@ -51,7 +51,7 @@ struct rmnet_map_dl_csum_trailer { + struct rmnet_map_ul_csum_header { + __be16 csum_start_offset; + u16 csum_insert_offset:14; +- u16 udp_ip4_ind:1; ++ u16 udp_ind:1; + u16 csum_enabled:1; + } __aligned(1); + +diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +index 60189923737a..21d38167f961 100644 +--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c ++++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_map_data.c +@@ -206,9 +206,9 @@ rmnet_map_ipv4_ul_csum_header(void *iphdr, + ul_header->csum_insert_offset = skb->csum_offset; + ul_header->csum_enabled = 1; + if (ip4h->protocol == IPPROTO_UDP) +- ul_header->udp_ip4_ind = 1; ++ ul_header->udp_ind = 1; + else +- ul_header->udp_ip4_ind = 0; ++ ul_header->udp_ind = 0; + + /* Changing remaining fields to network order */ + hdr++; +@@ -239,6 +239,7 @@ rmnet_map_ipv6_ul_csum_header(void *ip6hdr, + struct rmnet_map_ul_csum_header *ul_header, + struct sk_buff *skb) + { ++ struct ipv6hdr *ip6h = (struct ipv6hdr *)ip6hdr; + __be16 *hdr = (__be16 *)ul_header, offset; + + offset = htons((__force u16)(skb_transport_header(skb) - +@@ -246,7 +247,11 @@ rmnet_map_ipv6_ul_csum_header(void *ip6hdr, + ul_header->csum_start_offset = offset; + ul_header->csum_insert_offset = skb->csum_offset; + ul_header->csum_enabled = 1; +- ul_header->udp_ip4_ind = 0; ++ ++ if (ip6h->nexthdr == IPPROTO_UDP) ++ ul_header->udp_ind = 1; ++ else ++ ul_header->udp_ind = 0; + + /* Changing remaining fields to network order */ + hdr++; +@@ -419,7 +424,7 @@ void rmnet_map_checksum_uplink_packet(struct sk_buff *skb, + ul_header->csum_start_offset = 0; + ul_header->csum_insert_offset = 0; + ul_header->csum_enabled = 0; +- ul_header->udp_ip4_ind = 0; ++ ul_header->udp_ind = 0; + + priv->stats.csum_sw++; + } +diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c +index d06a61f00e78..36261b2959b4 100644 +--- a/drivers/net/ethernet/realtek/r8169.c ++++ b/drivers/net/ethernet/realtek/r8169.c +@@ -5157,6 +5157,143 @@ static void rtl_hw_start_8411_2(struct rtl8169_private *tp) + /* disable aspm and clock request before access ephy */ + rtl_hw_aspm_clkreq_enable(tp, false); + rtl_ephy_init(tp, e_info_8411_2); ++ ++ /* The following Realtek-provided magic fixes an issue with the RX unit ++ * getting confused after the PHY having been powered-down. ++ */ ++ r8168_mac_ocp_write(tp, 0xFC28, 0x0000); ++ r8168_mac_ocp_write(tp, 0xFC2A, 0x0000); ++ r8168_mac_ocp_write(tp, 0xFC2C, 0x0000); ++ r8168_mac_ocp_write(tp, 0xFC2E, 0x0000); ++ r8168_mac_ocp_write(tp, 0xFC30, 0x0000); ++ r8168_mac_ocp_write(tp, 0xFC32, 0x0000); ++ r8168_mac_ocp_write(tp, 0xFC34, 0x0000); ++ r8168_mac_ocp_write(tp, 0xFC36, 0x0000); ++ mdelay(3); ++ r8168_mac_ocp_write(tp, 0xFC26, 0x0000); ++ ++ r8168_mac_ocp_write(tp, 0xF800, 0xE008); ++ r8168_mac_ocp_write(tp, 0xF802, 0xE00A); ++ r8168_mac_ocp_write(tp, 0xF804, 0xE00C); ++ r8168_mac_ocp_write(tp, 0xF806, 0xE00E); ++ r8168_mac_ocp_write(tp, 0xF808, 0xE027); ++ r8168_mac_ocp_write(tp, 0xF80A, 0xE04F); ++ r8168_mac_ocp_write(tp, 0xF80C, 0xE05E); ++ r8168_mac_ocp_write(tp, 0xF80E, 0xE065); ++ r8168_mac_ocp_write(tp, 0xF810, 0xC602); ++ r8168_mac_ocp_write(tp, 0xF812, 0xBE00); ++ r8168_mac_ocp_write(tp, 0xF814, 0x0000); ++ r8168_mac_ocp_write(tp, 0xF816, 0xC502); ++ r8168_mac_ocp_write(tp, 0xF818, 0xBD00); ++ r8168_mac_ocp_write(tp, 0xF81A, 0x074C); ++ r8168_mac_ocp_write(tp, 0xF81C, 0xC302); ++ r8168_mac_ocp_write(tp, 0xF81E, 0xBB00); ++ r8168_mac_ocp_write(tp, 0xF820, 0x080A); ++ r8168_mac_ocp_write(tp, 0xF822, 0x6420); ++ r8168_mac_ocp_write(tp, 0xF824, 0x48C2); ++ r8168_mac_ocp_write(tp, 0xF826, 0x8C20); ++ r8168_mac_ocp_write(tp, 0xF828, 0xC516); ++ r8168_mac_ocp_write(tp, 0xF82A, 0x64A4); ++ r8168_mac_ocp_write(tp, 0xF82C, 0x49C0); ++ r8168_mac_ocp_write(tp, 0xF82E, 0xF009); ++ r8168_mac_ocp_write(tp, 0xF830, 0x74A2); ++ r8168_mac_ocp_write(tp, 0xF832, 0x8CA5); ++ r8168_mac_ocp_write(tp, 0xF834, 0x74A0); ++ r8168_mac_ocp_write(tp, 0xF836, 0xC50E); ++ r8168_mac_ocp_write(tp, 0xF838, 0x9CA2); ++ r8168_mac_ocp_write(tp, 0xF83A, 0x1C11); ++ r8168_mac_ocp_write(tp, 0xF83C, 0x9CA0); ++ r8168_mac_ocp_write(tp, 0xF83E, 0xE006); ++ r8168_mac_ocp_write(tp, 0xF840, 0x74F8); ++ r8168_mac_ocp_write(tp, 0xF842, 0x48C4); ++ r8168_mac_ocp_write(tp, 0xF844, 0x8CF8); ++ r8168_mac_ocp_write(tp, 0xF846, 0xC404); ++ r8168_mac_ocp_write(tp, 0xF848, 0xBC00); ++ r8168_mac_ocp_write(tp, 0xF84A, 0xC403); ++ r8168_mac_ocp_write(tp, 0xF84C, 0xBC00); ++ r8168_mac_ocp_write(tp, 0xF84E, 0x0BF2); ++ r8168_mac_ocp_write(tp, 0xF850, 0x0C0A); ++ r8168_mac_ocp_write(tp, 0xF852, 0xE434); ++ r8168_mac_ocp_write(tp, 0xF854, 0xD3C0); ++ r8168_mac_ocp_write(tp, 0xF856, 0x49D9); ++ r8168_mac_ocp_write(tp, 0xF858, 0xF01F); ++ r8168_mac_ocp_write(tp, 0xF85A, 0xC526); ++ r8168_mac_ocp_write(tp, 0xF85C, 0x64A5); ++ r8168_mac_ocp_write(tp, 0xF85E, 0x1400); ++ r8168_mac_ocp_write(tp, 0xF860, 0xF007); ++ r8168_mac_ocp_write(tp, 0xF862, 0x0C01); ++ r8168_mac_ocp_write(tp, 0xF864, 0x8CA5); ++ r8168_mac_ocp_write(tp, 0xF866, 0x1C15); ++ r8168_mac_ocp_write(tp, 0xF868, 0xC51B); ++ r8168_mac_ocp_write(tp, 0xF86A, 0x9CA0); ++ r8168_mac_ocp_write(tp, 0xF86C, 0xE013); ++ r8168_mac_ocp_write(tp, 0xF86E, 0xC519); ++ r8168_mac_ocp_write(tp, 0xF870, 0x74A0); ++ r8168_mac_ocp_write(tp, 0xF872, 0x48C4); ++ r8168_mac_ocp_write(tp, 0xF874, 0x8CA0); ++ r8168_mac_ocp_write(tp, 0xF876, 0xC516); ++ r8168_mac_ocp_write(tp, 0xF878, 0x74A4); ++ r8168_mac_ocp_write(tp, 0xF87A, 0x48C8); ++ r8168_mac_ocp_write(tp, 0xF87C, 0x48CA); ++ r8168_mac_ocp_write(tp, 0xF87E, 0x9CA4); ++ r8168_mac_ocp_write(tp, 0xF880, 0xC512); ++ r8168_mac_ocp_write(tp, 0xF882, 0x1B00); ++ r8168_mac_ocp_write(tp, 0xF884, 0x9BA0); ++ r8168_mac_ocp_write(tp, 0xF886, 0x1B1C); ++ r8168_mac_ocp_write(tp, 0xF888, 0x483F); ++ r8168_mac_ocp_write(tp, 0xF88A, 0x9BA2); ++ r8168_mac_ocp_write(tp, 0xF88C, 0x1B04); ++ r8168_mac_ocp_write(tp, 0xF88E, 0xC508); ++ r8168_mac_ocp_write(tp, 0xF890, 0x9BA0); ++ r8168_mac_ocp_write(tp, 0xF892, 0xC505); ++ r8168_mac_ocp_write(tp, 0xF894, 0xBD00); ++ r8168_mac_ocp_write(tp, 0xF896, 0xC502); ++ r8168_mac_ocp_write(tp, 0xF898, 0xBD00); ++ r8168_mac_ocp_write(tp, 0xF89A, 0x0300); ++ r8168_mac_ocp_write(tp, 0xF89C, 0x051E); ++ r8168_mac_ocp_write(tp, 0xF89E, 0xE434); ++ r8168_mac_ocp_write(tp, 0xF8A0, 0xE018); ++ r8168_mac_ocp_write(tp, 0xF8A2, 0xE092); ++ r8168_mac_ocp_write(tp, 0xF8A4, 0xDE20); ++ r8168_mac_ocp_write(tp, 0xF8A6, 0xD3C0); ++ r8168_mac_ocp_write(tp, 0xF8A8, 0xC50F); ++ r8168_mac_ocp_write(tp, 0xF8AA, 0x76A4); ++ r8168_mac_ocp_write(tp, 0xF8AC, 0x49E3); ++ r8168_mac_ocp_write(tp, 0xF8AE, 0xF007); ++ r8168_mac_ocp_write(tp, 0xF8B0, 0x49C0); ++ r8168_mac_ocp_write(tp, 0xF8B2, 0xF103); ++ r8168_mac_ocp_write(tp, 0xF8B4, 0xC607); ++ r8168_mac_ocp_write(tp, 0xF8B6, 0xBE00); ++ r8168_mac_ocp_write(tp, 0xF8B8, 0xC606); ++ r8168_mac_ocp_write(tp, 0xF8BA, 0xBE00); ++ r8168_mac_ocp_write(tp, 0xF8BC, 0xC602); ++ r8168_mac_ocp_write(tp, 0xF8BE, 0xBE00); ++ r8168_mac_ocp_write(tp, 0xF8C0, 0x0C4C); ++ r8168_mac_ocp_write(tp, 0xF8C2, 0x0C28); ++ r8168_mac_ocp_write(tp, 0xF8C4, 0x0C2C); ++ r8168_mac_ocp_write(tp, 0xF8C6, 0xDC00); ++ r8168_mac_ocp_write(tp, 0xF8C8, 0xC707); ++ r8168_mac_ocp_write(tp, 0xF8CA, 0x1D00); ++ r8168_mac_ocp_write(tp, 0xF8CC, 0x8DE2); ++ r8168_mac_ocp_write(tp, 0xF8CE, 0x48C1); ++ r8168_mac_ocp_write(tp, 0xF8D0, 0xC502); ++ r8168_mac_ocp_write(tp, 0xF8D2, 0xBD00); ++ r8168_mac_ocp_write(tp, 0xF8D4, 0x00AA); ++ r8168_mac_ocp_write(tp, 0xF8D6, 0xE0C0); ++ r8168_mac_ocp_write(tp, 0xF8D8, 0xC502); ++ r8168_mac_ocp_write(tp, 0xF8DA, 0xBD00); ++ r8168_mac_ocp_write(tp, 0xF8DC, 0x0132); ++ ++ r8168_mac_ocp_write(tp, 0xFC26, 0x8000); ++ ++ r8168_mac_ocp_write(tp, 0xFC2A, 0x0743); ++ r8168_mac_ocp_write(tp, 0xFC2C, 0x0801); ++ r8168_mac_ocp_write(tp, 0xFC2E, 0x0BE9); ++ r8168_mac_ocp_write(tp, 0xFC30, 0x02FD); ++ r8168_mac_ocp_write(tp, 0xFC32, 0x0C25); ++ r8168_mac_ocp_write(tp, 0xFC34, 0x00A9); ++ r8168_mac_ocp_write(tp, 0xFC36, 0x012D); ++ + rtl_hw_aspm_clkreq_enable(tp, true); + } + +@@ -6913,13 +7050,18 @@ static int rtl_alloc_irq(struct rtl8169_private *tp) + { + unsigned int flags; + +- if (tp->mac_version <= RTL_GIGA_MAC_VER_06) { ++ switch (tp->mac_version) { ++ case RTL_GIGA_MAC_VER_02 ... RTL_GIGA_MAC_VER_06: + rtl_unlock_config_regs(tp); + RTL_W8(tp, Config2, RTL_R8(tp, Config2) & ~MSIEnable); + rtl_lock_config_regs(tp); ++ /* fall through */ ++ case RTL_GIGA_MAC_VER_07 ... RTL_GIGA_MAC_VER_24: + flags = PCI_IRQ_LEGACY; +- } else { ++ break; ++ default: + flags = PCI_IRQ_ALL_TYPES; ++ break; + } + + return pci_alloc_irq_vectors(tp->pci_dev, 1, 1, flags); +diff --git a/drivers/net/ethernet/rocker/rocker_main.c b/drivers/net/ethernet/rocker/rocker_main.c +index 3e5bc1fc3c46..c245a0f15066 100644 +--- a/drivers/net/ethernet/rocker/rocker_main.c ++++ b/drivers/net/ethernet/rocker/rocker_main.c +@@ -2208,6 +2208,7 @@ static int rocker_router_fib_event(struct notifier_block *nb, + + if (fen_info->fi->fib_nh_is_v6) { + NL_SET_ERR_MSG_MOD(info->extack, "IPv6 gateway with IPv4 route is not supported"); ++ kfree(fib_work); + return notifier_from_errno(-EINVAL); + } + } +diff --git a/drivers/net/ethernet/socionext/netsec.c b/drivers/net/ethernet/socionext/netsec.c +index cba5881b2746..a10ef700f16d 100644 +--- a/drivers/net/ethernet/socionext/netsec.c ++++ b/drivers/net/ethernet/socionext/netsec.c +@@ -1029,7 +1029,6 @@ static void netsec_free_dring(struct netsec_priv *priv, int id) + static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id) + { + struct netsec_desc_ring *dring = &priv->desc_ring[id]; +- int i; + + dring->vaddr = dma_alloc_coherent(priv->dev, DESC_SZ * DESC_NUM, + &dring->desc_dma, GFP_KERNEL); +@@ -1040,19 +1039,6 @@ static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id) + if (!dring->desc) + goto err; + +- if (id == NETSEC_RING_TX) { +- for (i = 0; i < DESC_NUM; i++) { +- struct netsec_de *de; +- +- de = dring->vaddr + (DESC_SZ * i); +- /* de->attr is not going to be accessed by the NIC +- * until netsec_set_tx_de() is called. +- * No need for a dma_wmb() here +- */ +- de->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD; +- } +- } +- + return 0; + err: + netsec_free_dring(priv, id); +@@ -1060,6 +1046,23 @@ static int netsec_alloc_dring(struct netsec_priv *priv, enum ring_id id) + return -ENOMEM; + } + ++static void netsec_setup_tx_dring(struct netsec_priv *priv) ++{ ++ struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_TX]; ++ int i; ++ ++ for (i = 0; i < DESC_NUM; i++) { ++ struct netsec_de *de; ++ ++ de = dring->vaddr + (DESC_SZ * i); ++ /* de->attr is not going to be accessed by the NIC ++ * until netsec_set_tx_de() is called. ++ * No need for a dma_wmb() here ++ */ ++ de->attr = 1U << NETSEC_TX_SHIFT_OWN_FIELD; ++ } ++} ++ + static int netsec_setup_rx_dring(struct netsec_priv *priv) + { + struct netsec_desc_ring *dring = &priv->desc_ring[NETSEC_RING_RX]; +@@ -1361,6 +1364,7 @@ static int netsec_netdev_open(struct net_device *ndev) + + pm_runtime_get_sync(priv->dev); + ++ netsec_setup_tx_dring(priv); + ret = netsec_setup_rx_dring(priv); + if (ret) { + netif_err(priv, probe, priv->ndev, +diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h +index ceb0d23f5041..c265cc5770e8 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/common.h ++++ b/drivers/net/ethernet/stmicro/stmmac/common.h +@@ -251,7 +251,7 @@ struct stmmac_safety_stats { + #define STMMAC_COAL_TX_TIMER 1000 + #define STMMAC_MAX_COAL_TX_TICK 100000 + #define STMMAC_TX_MAX_FRAMES 256 +-#define STMMAC_TX_FRAMES 25 ++#define STMMAC_TX_FRAMES 1 + + /* Packets types */ + enum packets_types { +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +index a69c34f605b1..98a15ba8be9f 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sun8i.c +@@ -884,6 +884,11 @@ static int sun8i_dwmac_set_syscon(struct stmmac_priv *priv) + * address. No need to mask it again. + */ + reg |= 1 << H3_EPHY_ADDR_SHIFT; ++ } else { ++ /* For SoCs without internal PHY the PHY selection bit should be ++ * set to 0 (external PHY). ++ */ ++ reg &= ~H3_EPHY_SELECT; + } + + if (!of_property_read_u32(node, "allwinner,tx-delay-ps", &val)) { +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c +index 9fff81170163..54f4ffb36d60 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c +@@ -206,6 +206,12 @@ static void dwmac1000_set_filter(struct mac_device_info *hw, + GMAC_ADDR_LOW(reg)); + reg++; + } ++ ++ while (reg <= perfect_addr_number) { ++ writel(0, ioaddr + GMAC_ADDR_HIGH(reg)); ++ writel(0, ioaddr + GMAC_ADDR_LOW(reg)); ++ reg++; ++ } + } + + #ifdef FRAME_FILTER_DEBUG +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +index 99d772517242..e3850938cf2f 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c +@@ -443,14 +443,20 @@ static void dwmac4_set_filter(struct mac_device_info *hw, + * are required + */ + value |= GMAC_PACKET_FILTER_PR; +- } else if (!netdev_uc_empty(dev)) { +- int reg = 1; ++ } else { + struct netdev_hw_addr *ha; ++ int reg = 1; + + netdev_for_each_uc_addr(ha, dev) { + dwmac4_set_umac_addr(hw, ha->addr, reg); + reg++; + } ++ ++ while (reg <= GMAC_MAX_PERFECT_ADDRESSES) { ++ writel(0, ioaddr + GMAC_ADDR_HIGH(reg)); ++ writel(0, ioaddr + GMAC_ADDR_LOW(reg)); ++ reg++; ++ } + } + + writel(value, ioaddr + GMAC_PACKET_FILTER); +@@ -468,8 +474,9 @@ static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex, + if (fc & FLOW_RX) { + pr_debug("\tReceive Flow-Control ON\n"); + flow |= GMAC_RX_FLOW_CTRL_RFE; +- writel(flow, ioaddr + GMAC_RX_FLOW_CTRL); + } ++ writel(flow, ioaddr + GMAC_RX_FLOW_CTRL); ++ + if (fc & FLOW_TX) { + pr_debug("\tTransmit Flow-Control ON\n"); + +@@ -477,7 +484,7 @@ static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex, + pr_debug("\tduplex mode: PAUSE %d\n", pause_time); + + for (queue = 0; queue < tx_cnt; queue++) { +- flow |= GMAC_TX_FLOW_CTRL_TFE; ++ flow = GMAC_TX_FLOW_CTRL_TFE; + + if (duplex) + flow |= +@@ -485,6 +492,9 @@ static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex, + + writel(flow, ioaddr + GMAC_QX_TX_FLOW_CTRL(queue)); + } ++ } else { ++ for (queue = 0; queue < tx_cnt; queue++) ++ writel(0, ioaddr + GMAC_QX_TX_FLOW_CTRL(queue)); + } + } + +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +index 06358fe5b245..b14f46a57154 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -2048,6 +2048,9 @@ static int stmmac_napi_check(struct stmmac_priv *priv, u32 chan) + &priv->xstats, chan); + struct stmmac_channel *ch = &priv->channel[chan]; + ++ if (status) ++ status |= handle_rx | handle_tx; ++ + if ((status & handle_rx) && (chan < priv->plat->rx_queues_to_use)) { + stmmac_disable_dma_irq(priv, priv->ioaddr, chan); + napi_schedule_irqoff(&ch->rx_napi); +@@ -3045,17 +3048,8 @@ static netdev_tx_t stmmac_xmit(struct sk_buff *skb, struct net_device *dev) + + /* Manage oversized TCP frames for GMAC4 device */ + if (skb_is_gso(skb) && priv->tso) { +- if (skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { +- /* +- * There is no way to determine the number of TSO +- * capable Queues. Let's use always the Queue 0 +- * because if TSO is supported then at least this +- * one will be capable. +- */ +- skb_set_queue_mapping(skb, 0); +- ++ if (skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) + return stmmac_tso_xmit(skb, dev); +- } + } + + if (unlikely(stmmac_tx_avail(priv, queue) < nfrags + 1)) { +@@ -3872,6 +3866,22 @@ static int stmmac_setup_tc(struct net_device *ndev, enum tc_setup_type type, + } + } + ++static u16 stmmac_select_queue(struct net_device *dev, struct sk_buff *skb, ++ struct net_device *sb_dev) ++{ ++ if (skb_shinfo(skb)->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6)) { ++ /* ++ * There is no way to determine the number of TSO ++ * capable Queues. Let's use always the Queue 0 ++ * because if TSO is supported then at least this ++ * one will be capable. ++ */ ++ return 0; ++ } ++ ++ return netdev_pick_tx(dev, skb, NULL) % dev->real_num_tx_queues; ++} ++ + static int stmmac_set_mac_address(struct net_device *ndev, void *addr) + { + struct stmmac_priv *priv = netdev_priv(ndev); +@@ -4088,6 +4098,7 @@ static const struct net_device_ops stmmac_netdev_ops = { + .ndo_tx_timeout = stmmac_tx_timeout, + .ndo_do_ioctl = stmmac_ioctl, + .ndo_setup_tc = stmmac_setup_tc, ++ .ndo_select_queue = stmmac_select_queue, + #ifdef CONFIG_NET_POLL_CONTROLLER + .ndo_poll_controller = stmmac_poll_controller, + #endif +@@ -4363,8 +4374,9 @@ int stmmac_dvr_probe(struct device *device, + NAPI_POLL_WEIGHT); + } + if (queue < priv->plat->tx_queues_to_use) { +- netif_napi_add(ndev, &ch->tx_napi, stmmac_napi_poll_tx, +- NAPI_POLL_WEIGHT); ++ netif_tx_napi_add(ndev, &ch->tx_napi, ++ stmmac_napi_poll_tx, ++ NAPI_POLL_WEIGHT); + } + } + +diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c +index 634fc484a0b3..4e3026f9abed 100644 +--- a/drivers/net/ethernet/ti/cpsw.c ++++ b/drivers/net/ethernet/ti/cpsw.c +@@ -2179,6 +2179,7 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data, + return ret; + } + ++ slave_data->slave_node = slave_node; + slave_data->phy_node = of_parse_phandle(slave_node, + "phy-handle", 0); + parp = of_get_property(slave_node, "phy_id", &lenp); +@@ -2330,6 +2331,7 @@ static int cpsw_probe_dual_emac(struct cpsw_priv *priv) + + /* register the network device */ + SET_NETDEV_DEV(ndev, cpsw->dev); ++ ndev->dev.of_node = cpsw->slaves[1].data->slave_node; + ret = register_netdev(ndev); + if (ret) + dev_err(cpsw->dev, "cpsw: error registering net device\n"); +@@ -2507,6 +2509,7 @@ static int cpsw_probe(struct platform_device *pdev) + + /* register the network device */ + SET_NETDEV_DEV(ndev, dev); ++ ndev->dev.of_node = cpsw->slaves[0].data->slave_node; + ret = register_netdev(ndev); + if (ret) { + dev_err(dev, "error registering net device\n"); +diff --git a/drivers/net/ethernet/ti/cpsw_priv.h b/drivers/net/ethernet/ti/cpsw_priv.h +index 04795b97ee71..e32f11da2dce 100644 +--- a/drivers/net/ethernet/ti/cpsw_priv.h ++++ b/drivers/net/ethernet/ti/cpsw_priv.h +@@ -272,6 +272,7 @@ struct cpsw_host_regs { + }; + + struct cpsw_slave_data { ++ struct device_node *slave_node; + struct device_node *phy_node; + char phy_id[MII_BUS_ID_SIZE]; + int phy_if; +diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +index 831967f6eff8..65c16772e589 100644 +--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c ++++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c +@@ -615,6 +615,10 @@ static void axienet_start_xmit_done(struct net_device *ndev) + + ndev->stats.tx_packets += packets; + ndev->stats.tx_bytes += size; ++ ++ /* Matches barrier in axienet_start_xmit */ ++ smp_mb(); ++ + netif_wake_queue(ndev); + } + +@@ -670,9 +674,19 @@ axienet_start_xmit(struct sk_buff *skb, struct net_device *ndev) + cur_p = &lp->tx_bd_v[lp->tx_bd_tail]; + + if (axienet_check_tx_bd_space(lp, num_frag)) { +- if (!netif_queue_stopped(ndev)) +- netif_stop_queue(ndev); +- return NETDEV_TX_BUSY; ++ if (netif_queue_stopped(ndev)) ++ return NETDEV_TX_BUSY; ++ ++ netif_stop_queue(ndev); ++ ++ /* Matches barrier in axienet_start_xmit_done */ ++ smp_mb(); ++ ++ /* Space might have just been freed - check again */ ++ if (axienet_check_tx_bd_space(lp, num_frag)) ++ return NETDEV_TX_BUSY; ++ ++ netif_wake_queue(ndev); + } + + if (skb->ip_summed == CHECKSUM_PARTIAL) { +diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c +index fc45b749db46..607f38712b4e 100644 +--- a/drivers/net/gtp.c ++++ b/drivers/net/gtp.c +@@ -285,16 +285,29 @@ static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, struct sk_buff *skb) + return gtp_rx(pctx, skb, hdrlen, gtp->role); + } + +-static void gtp_encap_destroy(struct sock *sk) ++static void __gtp_encap_destroy(struct sock *sk) + { + struct gtp_dev *gtp; + +- gtp = rcu_dereference_sk_user_data(sk); ++ lock_sock(sk); ++ gtp = sk->sk_user_data; + if (gtp) { ++ if (gtp->sk0 == sk) ++ gtp->sk0 = NULL; ++ else ++ gtp->sk1u = NULL; + udp_sk(sk)->encap_type = 0; + rcu_assign_sk_user_data(sk, NULL); + sock_put(sk); + } ++ release_sock(sk); ++} ++ ++static void gtp_encap_destroy(struct sock *sk) ++{ ++ rtnl_lock(); ++ __gtp_encap_destroy(sk); ++ rtnl_unlock(); + } + + static void gtp_encap_disable_sock(struct sock *sk) +@@ -302,7 +315,7 @@ static void gtp_encap_disable_sock(struct sock *sk) + if (!sk) + return; + +- gtp_encap_destroy(sk); ++ __gtp_encap_destroy(sk); + } + + static void gtp_encap_disable(struct gtp_dev *gtp) +@@ -796,7 +809,8 @@ static struct sock *gtp_encap_enable_socket(int fd, int type, + goto out_sock; + } + +- if (rcu_dereference_sk_user_data(sock->sk)) { ++ lock_sock(sock->sk); ++ if (sock->sk->sk_user_data) { + sk = ERR_PTR(-EBUSY); + goto out_sock; + } +@@ -812,6 +826,7 @@ static struct sock *gtp_encap_enable_socket(int fd, int type, + setup_udp_tunnel_sock(sock_net(sock->sk), sock, &tuncfg); + + out_sock: ++ release_sock(sock->sk); + sockfd_put(sock); + return sk; + } +@@ -843,8 +858,13 @@ static int gtp_encap_enable(struct gtp_dev *gtp, struct nlattr *data[]) + + if (data[IFLA_GTP_ROLE]) { + role = nla_get_u32(data[IFLA_GTP_ROLE]); +- if (role > GTP_ROLE_SGSN) ++ if (role > GTP_ROLE_SGSN) { ++ if (sk0) ++ gtp_encap_disable_sock(sk0); ++ if (sk1u) ++ gtp_encap_disable_sock(sk1u); + return -EINVAL; ++ } + } + + gtp->sk0 = sk0; +@@ -945,7 +965,7 @@ static int ipv4_pdp_add(struct gtp_dev *gtp, struct sock *sk, + + } + +- pctx = kmalloc(sizeof(struct pdp_ctx), GFP_KERNEL); ++ pctx = kmalloc(sizeof(*pctx), GFP_ATOMIC); + if (pctx == NULL) + return -ENOMEM; + +@@ -1034,6 +1054,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info) + return -EINVAL; + } + ++ rtnl_lock(); + rcu_read_lock(); + + gtp = gtp_find_dev(sock_net(skb->sk), info->attrs); +@@ -1058,6 +1079,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct genl_info *info) + + out_unlock: + rcu_read_unlock(); ++ rtnl_unlock(); + return err; + } + +@@ -1360,9 +1382,9 @@ late_initcall(gtp_init); + + static void __exit gtp_fini(void) + { +- unregister_pernet_subsys(>p_net_ops); + genl_unregister_family(>p_genl_family); + rtnl_link_unregister(>p_link_ops); ++ unregister_pernet_subsys(>p_net_ops); + + pr_info("GTP module unloaded\n"); + } +diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c +index afdcc5664ea6..3544e1991579 100644 +--- a/drivers/net/hyperv/netvsc_drv.c ++++ b/drivers/net/hyperv/netvsc_drv.c +@@ -836,7 +836,6 @@ int netvsc_recv_callback(struct net_device *net, + + if (unlikely(!skb)) { + ++net_device_ctx->eth_stats.rx_no_memory; +- rcu_read_unlock(); + return NVSP_STAT_FAIL; + } + +diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c +index 75aebf65cd09..8f46aa1ddec0 100644 +--- a/drivers/net/macsec.c ++++ b/drivers/net/macsec.c +@@ -865,6 +865,7 @@ static void macsec_reset_skb(struct sk_buff *skb, struct net_device *dev) + + static void macsec_finalize_skb(struct sk_buff *skb, u8 icv_len, u8 hdr_len) + { ++ skb->ip_summed = CHECKSUM_NONE; + memmove(skb->data + hdr_len, skb->data, 2 * ETH_ALEN); + skb_pull(skb, hdr_len); + pskb_trim_unique(skb, skb->len - icv_len); +@@ -1099,10 +1100,9 @@ static rx_handler_result_t macsec_handle_frame(struct sk_buff **pskb) + } + + skb = skb_unshare(skb, GFP_ATOMIC); +- if (!skb) { +- *pskb = NULL; ++ *pskb = skb; ++ if (!skb) + return RX_HANDLER_CONSUMED; +- } + + pulled_sci = pskb_may_pull(skb, macsec_extra_len(true)); + if (!pulled_sci) { +diff --git a/drivers/net/phy/fixed_phy.c b/drivers/net/phy/fixed_phy.c +index 3ffe46df249e..7c5265fd2b94 100644 +--- a/drivers/net/phy/fixed_phy.c ++++ b/drivers/net/phy/fixed_phy.c +@@ -216,8 +216,10 @@ static struct gpio_desc *fixed_phy_get_gpiod(struct device_node *np) + if (IS_ERR(gpiod)) { + if (PTR_ERR(gpiod) == -EPROBE_DEFER) + return gpiod; +- pr_err("error getting GPIO for fixed link %pOF, proceed without\n", +- fixed_link_node); ++ ++ if (PTR_ERR(gpiod) != -ENOENT) ++ pr_err("error getting GPIO for fixed link %pOF, proceed without\n", ++ fixed_link_node); + gpiod = NULL; + } + +diff --git a/drivers/net/phy/mscc.c b/drivers/net/phy/mscc.c +index 28676af97b42..645d354ffb48 100644 +--- a/drivers/net/phy/mscc.c ++++ b/drivers/net/phy/mscc.c +@@ -2226,8 +2226,8 @@ static int vsc8514_probe(struct phy_device *phydev) + vsc8531->supp_led_modes = VSC85XX_SUPP_LED_MODES; + vsc8531->hw_stats = vsc85xx_hw_stats; + vsc8531->nstats = ARRAY_SIZE(vsc85xx_hw_stats); +- vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats, +- sizeof(u64), GFP_KERNEL); ++ vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, ++ sizeof(u64), GFP_KERNEL); + if (!vsc8531->stats) + return -ENOMEM; + +@@ -2251,8 +2251,8 @@ static int vsc8574_probe(struct phy_device *phydev) + vsc8531->supp_led_modes = VSC8584_SUPP_LED_MODES; + vsc8531->hw_stats = vsc8584_hw_stats; + vsc8531->nstats = ARRAY_SIZE(vsc8584_hw_stats); +- vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats, +- sizeof(u64), GFP_KERNEL); ++ vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, ++ sizeof(u64), GFP_KERNEL); + if (!vsc8531->stats) + return -ENOMEM; + +@@ -2281,8 +2281,8 @@ static int vsc8584_probe(struct phy_device *phydev) + vsc8531->supp_led_modes = VSC8584_SUPP_LED_MODES; + vsc8531->hw_stats = vsc8584_hw_stats; + vsc8531->nstats = ARRAY_SIZE(vsc8584_hw_stats); +- vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats, +- sizeof(u64), GFP_KERNEL); ++ vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, ++ sizeof(u64), GFP_KERNEL); + if (!vsc8531->stats) + return -ENOMEM; + +@@ -2311,8 +2311,8 @@ static int vsc85xx_probe(struct phy_device *phydev) + vsc8531->supp_led_modes = VSC85XX_SUPP_LED_MODES; + vsc8531->hw_stats = vsc85xx_hw_stats; + vsc8531->nstats = ARRAY_SIZE(vsc85xx_hw_stats); +- vsc8531->stats = devm_kmalloc_array(&phydev->mdio.dev, vsc8531->nstats, +- sizeof(u64), GFP_KERNEL); ++ vsc8531->stats = devm_kcalloc(&phydev->mdio.dev, vsc8531->nstats, ++ sizeof(u64), GFP_KERNEL); + if (!vsc8531->stats) + return -ENOMEM; + +diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c +index dcc93a873174..ffa402732aea 100644 +--- a/drivers/net/phy/phy_device.c ++++ b/drivers/net/phy/phy_device.c +@@ -948,6 +948,9 @@ int phy_connect_direct(struct net_device *dev, struct phy_device *phydev, + { + int rc; + ++ if (!dev) ++ return -EINVAL; ++ + rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); + if (rc) + return rc; +@@ -1290,6 +1293,9 @@ struct phy_device *phy_attach(struct net_device *dev, const char *bus_id, + struct device *d; + int rc; + ++ if (!dev) ++ return ERR_PTR(-EINVAL); ++ + /* Search the list of PHY devices on the mdio bus for the + * PHY with the requested name + */ +@@ -1724,6 +1730,12 @@ int genphy_update_link(struct phy_device *phydev) + phydev->link = status & BMSR_LSTATUS ? 1 : 0; + phydev->autoneg_complete = status & BMSR_ANEGCOMPLETE ? 1 : 0; + ++ /* Consider the case that autoneg was started and "aneg complete" ++ * bit has been reset, but "link up" bit not yet. ++ */ ++ if (phydev->autoneg == AUTONEG_ENABLE && !phydev->autoneg_complete) ++ phydev->link = 0; ++ + return 0; + } + EXPORT_SYMBOL(genphy_update_link); +diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c +index 4c0616ba314d..c45ee6e3fe01 100644 +--- a/drivers/net/phy/phylink.c ++++ b/drivers/net/phy/phylink.c +@@ -195,6 +195,8 @@ static int phylink_parse_fixedlink(struct phylink *pl, + pl->supported, true); + linkmode_zero(pl->supported); + phylink_set(pl->supported, MII); ++ phylink_set(pl->supported, Pause); ++ phylink_set(pl->supported, Asym_Pause); + if (s) { + __set_bit(s->bit, pl->supported); + } else { +@@ -912,10 +914,10 @@ void phylink_start(struct phylink *pl) + + if (pl->link_an_mode == MLO_AN_FIXED && !IS_ERR(pl->link_gpio)) + mod_timer(&pl->link_poll, jiffies + HZ); +- if (pl->sfp_bus) +- sfp_upstream_start(pl->sfp_bus); + if (pl->phydev) + phy_start(pl->phydev); ++ if (pl->sfp_bus) ++ sfp_upstream_start(pl->sfp_bus); + } + EXPORT_SYMBOL_GPL(phylink_start); + +@@ -932,10 +934,10 @@ void phylink_stop(struct phylink *pl) + { + ASSERT_RTNL(); + +- if (pl->phydev) +- phy_stop(pl->phydev); + if (pl->sfp_bus) + sfp_upstream_stop(pl->sfp_bus); ++ if (pl->phydev) ++ phy_stop(pl->phydev); + if (pl->link_an_mode == MLO_AN_FIXED && !IS_ERR(pl->link_gpio)) + del_timer_sync(&pl->link_poll); + +diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c +index 71812be0ac64..be0271a51b0a 100644 +--- a/drivers/net/phy/sfp.c ++++ b/drivers/net/phy/sfp.c +@@ -186,10 +186,11 @@ struct sfp { + struct gpio_desc *gpio[GPIO_MAX]; + + bool attached; ++ struct mutex st_mutex; /* Protects state */ + unsigned int state; + struct delayed_work poll; + struct delayed_work timeout; +- struct mutex sm_mutex; ++ struct mutex sm_mutex; /* Protects state machine */ + unsigned char sm_mod_state; + unsigned char sm_dev_state; + unsigned short sm_state; +@@ -514,7 +515,7 @@ static int sfp_hwmon_read_sensor(struct sfp *sfp, int reg, long *value) + + static void sfp_hwmon_to_rx_power(long *value) + { +- *value = DIV_ROUND_CLOSEST(*value, 100); ++ *value = DIV_ROUND_CLOSEST(*value, 10); + } + + static void sfp_hwmon_calibrate(struct sfp *sfp, unsigned int slope, int offset, +@@ -1719,6 +1720,7 @@ static void sfp_check_state(struct sfp *sfp) + { + unsigned int state, i, changed; + ++ mutex_lock(&sfp->st_mutex); + state = sfp_get_state(sfp); + changed = state ^ sfp->state; + changed &= SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT; +@@ -1744,6 +1746,7 @@ static void sfp_check_state(struct sfp *sfp) + sfp_sm_event(sfp, state & SFP_F_LOS ? + SFP_E_LOS_HIGH : SFP_E_LOS_LOW); + rtnl_unlock(); ++ mutex_unlock(&sfp->st_mutex); + } + + static irqreturn_t sfp_irq(int irq, void *data) +@@ -1774,6 +1777,7 @@ static struct sfp *sfp_alloc(struct device *dev) + sfp->dev = dev; + + mutex_init(&sfp->sm_mutex); ++ mutex_init(&sfp->st_mutex); + INIT_DELAYED_WORK(&sfp->poll, sfp_poll); + INIT_DELAYED_WORK(&sfp->timeout, sfp_timeout); + +diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c +index 1d902ecb4aa8..a44dd3c8af63 100644 +--- a/drivers/net/ppp/pppoe.c ++++ b/drivers/net/ppp/pppoe.c +@@ -1115,6 +1115,9 @@ static const struct proto_ops pppoe_ops = { + .recvmsg = pppoe_recvmsg, + .mmap = sock_no_mmap, + .ioctl = pppox_ioctl, ++#ifdef CONFIG_COMPAT ++ .compat_ioctl = pppox_compat_ioctl, ++#endif + }; + + static const struct pppox_proto pppoe_proto = { +diff --git a/drivers/net/ppp/pppox.c b/drivers/net/ppp/pppox.c +index 5ef422a43d70..08364f10a43f 100644 +--- a/drivers/net/ppp/pppox.c ++++ b/drivers/net/ppp/pppox.c +@@ -17,6 +17,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -98,6 +99,18 @@ int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) + + EXPORT_SYMBOL(pppox_ioctl); + ++#ifdef CONFIG_COMPAT ++int pppox_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) ++{ ++ if (cmd == PPPOEIOCSFWD32) ++ cmd = PPPOEIOCSFWD; ++ ++ return pppox_ioctl(sock, cmd, (unsigned long)compat_ptr(arg)); ++} ++ ++EXPORT_SYMBOL(pppox_compat_ioctl); ++#endif ++ + static int pppox_create(struct net *net, struct socket *sock, int protocol, + int kern) + { +diff --git a/drivers/net/ppp/pptp.c b/drivers/net/ppp/pptp.c +index a8e52c8e4128..734de7de03f7 100644 +--- a/drivers/net/ppp/pptp.c ++++ b/drivers/net/ppp/pptp.c +@@ -623,6 +623,9 @@ static const struct proto_ops pptp_ops = { + .recvmsg = sock_no_recvmsg, + .mmap = sock_no_mmap, + .ioctl = pppox_ioctl, ++#ifdef CONFIG_COMPAT ++ .compat_ioctl = pppox_compat_ioctl, ++#endif + }; + + static const struct pppox_proto pppox_pptp_proto = { +diff --git a/drivers/net/tun.c b/drivers/net/tun.c +index d7c55e0fa8f4..192ac47fd055 100644 +--- a/drivers/net/tun.c ++++ b/drivers/net/tun.c +@@ -1600,7 +1600,8 @@ static bool tun_can_build_skb(struct tun_struct *tun, struct tun_file *tfile, + return true; + } + +-static struct sk_buff *__tun_build_skb(struct page_frag *alloc_frag, char *buf, ++static struct sk_buff *__tun_build_skb(struct tun_file *tfile, ++ struct page_frag *alloc_frag, char *buf, + int buflen, int len, int pad) + { + struct sk_buff *skb = build_skb(buf, buflen); +@@ -1610,6 +1611,7 @@ static struct sk_buff *__tun_build_skb(struct page_frag *alloc_frag, char *buf, + + skb_reserve(skb, pad); + skb_put(skb, len); ++ skb_set_owner_w(skb, tfile->socket.sk); + + get_page(alloc_frag->page); + alloc_frag->offset += buflen; +@@ -1687,7 +1689,8 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, + */ + if (hdr->gso_type || !xdp_prog) { + *skb_xdp = 1; +- return __tun_build_skb(alloc_frag, buf, buflen, len, pad); ++ return __tun_build_skb(tfile, alloc_frag, buf, buflen, len, ++ pad); + } + + *skb_xdp = 0; +@@ -1724,7 +1727,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun, + rcu_read_unlock(); + local_bh_enable(); + +- return __tun_build_skb(alloc_frag, buf, buflen, len, pad); ++ return __tun_build_skb(tfile, alloc_frag, buf, buflen, len, pad); + + err_xdp: + put_page(alloc_frag->page); +diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c +index c9bc96310ed4..ef548beba684 100644 +--- a/drivers/net/usb/asix_devices.c ++++ b/drivers/net/usb/asix_devices.c +@@ -226,7 +226,7 @@ static void asix_phy_reset(struct usbnet *dev, unsigned int reset_bits) + static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf) + { + int ret = 0; +- u8 buf[ETH_ALEN]; ++ u8 buf[ETH_ALEN] = {0}; + int i; + unsigned long gpio_bits = dev->driver_info->data; + +@@ -677,7 +677,7 @@ static int asix_resume(struct usb_interface *intf) + static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf) + { + int ret, i; +- u8 buf[ETH_ALEN], chipcode = 0; ++ u8 buf[ETH_ALEN] = {0}, chipcode = 0; + u32 phyid; + struct asix_common_private *priv; + +@@ -1061,7 +1061,7 @@ static const struct net_device_ops ax88178_netdev_ops = { + static int ax88178_bind(struct usbnet *dev, struct usb_interface *intf) + { + int ret; +- u8 buf[ETH_ALEN]; ++ u8 buf[ETH_ALEN] = {0}; + + usbnet_get_endpoints(dev,intf); + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 3d92ea6fcc02..de564401fd4d 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -2674,7 +2674,7 @@ static void lan78xx_terminate_urbs(struct lan78xx_net *dev) + while (!skb_queue_empty(&dev->rxq) && + !skb_queue_empty(&dev->txq) && + !skb_queue_empty(&dev->done)) { +- schedule_timeout(msecs_to_jiffies(UNLINK_TIMEOUT_MS)); ++ schedule_msec_hrtimeout((UNLINK_TIMEOUT_MS)); + set_current_state(TASK_UNINTERRUPTIBLE); + netif_dbg(dev, ifdown, dev->net, + "waited for %d urb completions\n", temp); +diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c +index 72514c46b478..38fa9d1edc04 100644 +--- a/drivers/net/usb/usbnet.c ++++ b/drivers/net/usb/usbnet.c +@@ -759,7 +759,7 @@ static void wait_skb_queue_empty(struct sk_buff_head *q) + spin_lock_irqsave(&q->lock, flags); + while (!skb_queue_empty(q)) { + spin_unlock_irqrestore(&q->lock, flags); +- schedule_timeout(msecs_to_jiffies(UNLINK_TIMEOUT_MS)); ++ schedule_msec_hrtimeout((UNLINK_TIMEOUT_MS)); + set_current_state(TASK_UNINTERRUPTIBLE); + spin_lock_irqsave(&q->lock, flags); + } +diff --git a/drivers/net/vrf.c b/drivers/net/vrf.c +index 311b0cc6eb98..97fb0cb1b97a 100644 +--- a/drivers/net/vrf.c ++++ b/drivers/net/vrf.c +@@ -165,23 +165,29 @@ static int vrf_ip6_local_out(struct net *net, struct sock *sk, + static netdev_tx_t vrf_process_v6_outbound(struct sk_buff *skb, + struct net_device *dev) + { +- const struct ipv6hdr *iph = ipv6_hdr(skb); ++ const struct ipv6hdr *iph; + struct net *net = dev_net(skb->dev); +- struct flowi6 fl6 = { +- /* needed to match OIF rule */ +- .flowi6_oif = dev->ifindex, +- .flowi6_iif = LOOPBACK_IFINDEX, +- .daddr = iph->daddr, +- .saddr = iph->saddr, +- .flowlabel = ip6_flowinfo(iph), +- .flowi6_mark = skb->mark, +- .flowi6_proto = iph->nexthdr, +- .flowi6_flags = FLOWI_FLAG_SKIP_NH_OIF, +- }; ++ struct flowi6 fl6; + int ret = NET_XMIT_DROP; + struct dst_entry *dst; + struct dst_entry *dst_null = &net->ipv6.ip6_null_entry->dst; + ++ if (!pskb_may_pull(skb, ETH_HLEN + sizeof(struct ipv6hdr))) ++ goto err; ++ ++ iph = ipv6_hdr(skb); ++ ++ memset(&fl6, 0, sizeof(fl6)); ++ /* needed to match OIF rule */ ++ fl6.flowi6_oif = dev->ifindex; ++ fl6.flowi6_iif = LOOPBACK_IFINDEX; ++ fl6.daddr = iph->daddr; ++ fl6.saddr = iph->saddr; ++ fl6.flowlabel = ip6_flowinfo(iph); ++ fl6.flowi6_mark = skb->mark; ++ fl6.flowi6_proto = iph->nexthdr; ++ fl6.flowi6_flags = FLOWI_FLAG_SKIP_NH_OIF; ++ + dst = ip6_route_output(net, NULL, &fl6); + if (dst == dst_null) + goto err; +@@ -237,21 +243,27 @@ static int vrf_ip_local_out(struct net *net, struct sock *sk, + static netdev_tx_t vrf_process_v4_outbound(struct sk_buff *skb, + struct net_device *vrf_dev) + { +- struct iphdr *ip4h = ip_hdr(skb); ++ struct iphdr *ip4h; + int ret = NET_XMIT_DROP; +- struct flowi4 fl4 = { +- /* needed to match OIF rule */ +- .flowi4_oif = vrf_dev->ifindex, +- .flowi4_iif = LOOPBACK_IFINDEX, +- .flowi4_tos = RT_TOS(ip4h->tos), +- .flowi4_flags = FLOWI_FLAG_ANYSRC | FLOWI_FLAG_SKIP_NH_OIF, +- .flowi4_proto = ip4h->protocol, +- .daddr = ip4h->daddr, +- .saddr = ip4h->saddr, +- }; ++ struct flowi4 fl4; + struct net *net = dev_net(vrf_dev); + struct rtable *rt; + ++ if (!pskb_may_pull(skb, ETH_HLEN + sizeof(struct iphdr))) ++ goto err; ++ ++ ip4h = ip_hdr(skb); ++ ++ memset(&fl4, 0, sizeof(fl4)); ++ /* needed to match OIF rule */ ++ fl4.flowi4_oif = vrf_dev->ifindex; ++ fl4.flowi4_iif = LOOPBACK_IFINDEX; ++ fl4.flowi4_tos = RT_TOS(ip4h->tos); ++ fl4.flowi4_flags = FLOWI_FLAG_ANYSRC | FLOWI_FLAG_SKIP_NH_OIF; ++ fl4.flowi4_proto = ip4h->protocol; ++ fl4.daddr = ip4h->daddr; ++ fl4.saddr = ip4h->saddr; ++ + rt = ip_route_output_flow(net, &fl4, NULL); + if (IS_ERR(rt)) + goto err; +diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c +index 083f3f0bf37f..b4283f52a09d 100644 +--- a/drivers/net/vxlan.c ++++ b/drivers/net/vxlan.c +@@ -804,6 +804,14 @@ static struct vxlan_fdb *vxlan_fdb_alloc(struct vxlan_dev *vxlan, + return f; + } + ++static void vxlan_fdb_insert(struct vxlan_dev *vxlan, const u8 *mac, ++ __be32 src_vni, struct vxlan_fdb *f) ++{ ++ ++vxlan->addrcnt; ++ hlist_add_head_rcu(&f->hlist, ++ vxlan_fdb_head(vxlan, mac, src_vni)); ++} ++ + static int vxlan_fdb_create(struct vxlan_dev *vxlan, + const u8 *mac, union vxlan_addr *ip, + __u16 state, __be16 port, __be32 src_vni, +@@ -829,18 +837,13 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan, + return rc; + } + +- ++vxlan->addrcnt; +- hlist_add_head_rcu(&f->hlist, +- vxlan_fdb_head(vxlan, mac, src_vni)); +- + *fdb = f; + + return 0; + } + +-static void vxlan_fdb_free(struct rcu_head *head) ++static void __vxlan_fdb_free(struct vxlan_fdb *f) + { +- struct vxlan_fdb *f = container_of(head, struct vxlan_fdb, rcu); + struct vxlan_rdst *rd, *nd; + + list_for_each_entry_safe(rd, nd, &f->remotes, list) { +@@ -850,6 +853,13 @@ static void vxlan_fdb_free(struct rcu_head *head) + kfree(f); + } + ++static void vxlan_fdb_free(struct rcu_head *head) ++{ ++ struct vxlan_fdb *f = container_of(head, struct vxlan_fdb, rcu); ++ ++ __vxlan_fdb_free(f); ++} ++ + static void vxlan_fdb_destroy(struct vxlan_dev *vxlan, struct vxlan_fdb *f, + bool do_notify, bool swdev_notify) + { +@@ -977,6 +987,7 @@ static int vxlan_fdb_update_create(struct vxlan_dev *vxlan, + if (rc < 0) + return rc; + ++ vxlan_fdb_insert(vxlan, mac, src_vni, f); + rc = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), RTM_NEWNEIGH, + swdev_notify, extack); + if (rc) +@@ -3571,12 +3582,17 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev, + if (err) + goto errout; + +- /* notify default fdb entry */ + if (f) { ++ vxlan_fdb_insert(vxlan, all_zeros_mac, ++ vxlan->default_dst.remote_vni, f); ++ ++ /* notify default fdb entry */ + err = vxlan_fdb_notify(vxlan, f, first_remote_rtnl(f), + RTM_NEWNEIGH, true, extack); +- if (err) +- goto errout; ++ if (err) { ++ vxlan_fdb_destroy(vxlan, f, false, false); ++ goto unregister; ++ } + } + + list_add(&vxlan->next, &vn->vxlan_list); +@@ -3588,7 +3604,8 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev, + * destroy the entry by hand here. + */ + if (f) +- vxlan_fdb_destroy(vxlan, f, false, false); ++ __vxlan_fdb_free(f); ++unregister: + if (unregister) + unregister_netdevice(dev); + return err; +diff --git a/drivers/net/wireless/ath/ath10k/debugfs_sta.c b/drivers/net/wireless/ath/ath10k/debugfs_sta.c +index c704ae371c4d..42931a669b02 100644 +--- a/drivers/net/wireless/ath/ath10k/debugfs_sta.c ++++ b/drivers/net/wireless/ath/ath10k/debugfs_sta.c +@@ -663,6 +663,13 @@ static ssize_t ath10k_dbg_sta_dump_tx_stats(struct file *file, + + mutex_lock(&ar->conf_mutex); + ++ if (!arsta->tx_stats) { ++ ath10k_warn(ar, "failed to get tx stats"); ++ mutex_unlock(&ar->conf_mutex); ++ kfree(buf); ++ return 0; ++ } ++ + spin_lock_bh(&ar->data_lock); + for (k = 0; k < ATH10K_STATS_TYPE_MAX; k++) { + for (j = 0; j < ATH10K_COUNTER_TYPE_MAX; j++) { +diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c +index 1acc622d2183..f22840bbc389 100644 +--- a/drivers/net/wireless/ath/ath10k/htt_rx.c ++++ b/drivers/net/wireless/ath/ath10k/htt_rx.c +@@ -2277,7 +2277,9 @@ static void ath10k_htt_rx_tx_compl_ind(struct ath10k *ar, + * Note that with only one concurrent reader and one concurrent + * writer, you don't need extra locking to use these macro. + */ +- if (!kfifo_put(&htt->txdone_fifo, tx_done)) { ++ if (ar->bus_param.dev_type == ATH10K_DEV_TYPE_HL) { ++ ath10k_txrx_tx_unref(htt, &tx_done); ++ } else if (!kfifo_put(&htt->txdone_fifo, tx_done)) { + ath10k_warn(ar, "txdone fifo overrun, msdu_id %d status %d\n", + tx_done.msdu_id, tx_done.status); + ath10k_txrx_tx_unref(htt, &tx_done); +diff --git a/drivers/net/wireless/ath/ath10k/hw.c b/drivers/net/wireless/ath/ath10k/hw.c +index ad082b7d7643..b242085c3c16 100644 +--- a/drivers/net/wireless/ath/ath10k/hw.c ++++ b/drivers/net/wireless/ath/ath10k/hw.c +@@ -158,7 +158,7 @@ const struct ath10k_hw_values qca6174_values = { + }; + + const struct ath10k_hw_values qca99x0_values = { +- .rtc_state_val_on = 5, ++ .rtc_state_val_on = 7, + .ce_count = 12, + .msi_assign_ce_max = 12, + .num_target_ce_config_wlan = 10, +diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c +index 9c703d287333..b500fd427595 100644 +--- a/drivers/net/wireless/ath/ath10k/mac.c ++++ b/drivers/net/wireless/ath/ath10k/mac.c +@@ -1630,6 +1630,10 @@ static int ath10k_mac_setup_prb_tmpl(struct ath10k_vif *arvif) + if (arvif->vdev_type != WMI_VDEV_TYPE_AP) + return 0; + ++ /* For mesh, probe response and beacon share the same template */ ++ if (ieee80211_vif_is_mesh(vif)) ++ return 0; ++ + prb = ieee80211_proberesp_get(hw, vif); + if (!prb) { + ath10k_warn(ar, "failed to get probe resp template from mac80211\n"); +@@ -5588,8 +5592,8 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw, + struct cfg80211_chan_def def; + u32 vdev_param, pdev_param, slottime, preamble; + u16 bitrate, hw_value; +- u8 rate, basic_rate_idx; +- int rateidx, ret = 0, hw_rate_code; ++ u8 rate, basic_rate_idx, rateidx; ++ int ret = 0, hw_rate_code, mcast_rate; + enum nl80211_band band; + const struct ieee80211_supported_band *sband; + +@@ -5776,7 +5780,11 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw, + if (changed & BSS_CHANGED_MCAST_RATE && + !ath10k_mac_vif_chan(arvif->vif, &def)) { + band = def.chan->band; +- rateidx = vif->bss_conf.mcast_rate[band] - 1; ++ mcast_rate = vif->bss_conf.mcast_rate[band]; ++ if (mcast_rate > 0) ++ rateidx = mcast_rate - 1; ++ else ++ rateidx = ffs(vif->bss_conf.basic_rates) - 1; + + if (ar->phy_capability & WHAL_WLAN_11A_CAPABILITY) + rateidx += ATH10K_MAC_FIRST_OFDM_RATE_IDX; +diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c +index 2c27f407a851..6e5f7ae00253 100644 +--- a/drivers/net/wireless/ath/ath10k/pci.c ++++ b/drivers/net/wireless/ath/ath10k/pci.c +@@ -2059,6 +2059,11 @@ static void ath10k_pci_hif_stop(struct ath10k *ar) + + ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot hif stop\n"); + ++ ath10k_pci_irq_disable(ar); ++ ath10k_pci_irq_sync(ar); ++ napi_synchronize(&ar->napi); ++ napi_disable(&ar->napi); ++ + /* Most likely the device has HTT Rx ring configured. The only way to + * prevent the device from accessing (and possible corrupting) host + * memory is to reset the chip now. +@@ -2072,10 +2077,6 @@ static void ath10k_pci_hif_stop(struct ath10k *ar) + */ + ath10k_pci_safe_chip_reset(ar); + +- ath10k_pci_irq_disable(ar); +- ath10k_pci_irq_sync(ar); +- napi_synchronize(&ar->napi); +- napi_disable(&ar->napi); + ath10k_pci_flush(ar); + + spin_lock_irqsave(&ar_pci->ps_lock, flags); +diff --git a/drivers/net/wireless/ath/ath10k/qmi.c b/drivers/net/wireless/ath/ath10k/qmi.c +index a7bc2c70d076..8f8f717a23ee 100644 +--- a/drivers/net/wireless/ath/ath10k/qmi.c ++++ b/drivers/net/wireless/ath/ath10k/qmi.c +@@ -1002,6 +1002,7 @@ int ath10k_qmi_deinit(struct ath10k *ar) + qmi_handle_release(&qmi->qmi_hdl); + cancel_work_sync(&qmi->event_work); + destroy_workqueue(qmi->event_wq); ++ kfree(qmi); + ar_snoc->qmi = NULL; + + return 0; +diff --git a/drivers/net/wireless/ath/ath10k/sdio.c b/drivers/net/wireless/ath/ath10k/sdio.c +index fae56c67766f..28bdf0212538 100644 +--- a/drivers/net/wireless/ath/ath10k/sdio.c ++++ b/drivers/net/wireless/ath/ath10k/sdio.c +@@ -602,6 +602,10 @@ static int ath10k_sdio_mbox_rx_alloc(struct ath10k *ar, + full_len, + last_in_bundle, + last_in_bundle); ++ if (ret) { ++ ath10k_warn(ar, "alloc_rx_pkt error %d\n", ret); ++ goto err; ++ } + } + + ar_sdio->n_rx_pkts = i; +@@ -2077,6 +2081,9 @@ static void ath10k_sdio_remove(struct sdio_func *func) + cancel_work_sync(&ar_sdio->wr_async_work); + ath10k_core_unregister(ar); + ath10k_core_destroy(ar); ++ ++ flush_workqueue(ar_sdio->workqueue); ++ destroy_workqueue(ar_sdio->workqueue); + } + + static const struct sdio_device_id ath10k_sdio_devices[] = { +diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c +index c5818d28f55a..4102df016931 100644 +--- a/drivers/net/wireless/ath/ath10k/txrx.c ++++ b/drivers/net/wireless/ath/ath10k/txrx.c +@@ -150,6 +150,9 @@ struct ath10k_peer *ath10k_peer_find_by_id(struct ath10k *ar, int peer_id) + { + struct ath10k_peer *peer; + ++ if (peer_id >= BITS_PER_TYPE(peer->peer_ids)) ++ return NULL; ++ + lockdep_assert_held(&ar->data_lock); + + list_for_each_entry(peer, &ar->peers, list) +diff --git a/drivers/net/wireless/ath/ath10k/usb.c b/drivers/net/wireless/ath/ath10k/usb.c +index 970cf69ac35f..a3ecf7d77949 100644 +--- a/drivers/net/wireless/ath/ath10k/usb.c ++++ b/drivers/net/wireless/ath/ath10k/usb.c +@@ -1016,7 +1016,7 @@ static int ath10k_usb_probe(struct usb_interface *interface, + } + + /* TODO: remove this once USB support is fully implemented */ +- ath10k_warn(ar, "WARNING: ath10k USB support is incomplete, don't expect anything to work!\n"); ++ ath10k_warn(ar, "Warning: ath10k USB support is incomplete, don't expect anything to work!\n"); + + return 0; + +diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c +index 582fb11f648a..02709fc99034 100644 +--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c ++++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c +@@ -2840,8 +2840,10 @@ ath10k_wmi_tlv_op_gen_mgmt_tx_send(struct ath10k *ar, struct sk_buff *msdu, + if ((ieee80211_is_action(hdr->frame_control) || + ieee80211_is_deauth(hdr->frame_control) || + ieee80211_is_disassoc(hdr->frame_control)) && +- ieee80211_has_protected(hdr->frame_control)) ++ ieee80211_has_protected(hdr->frame_control)) { ++ skb_put(msdu, IEEE80211_CCMP_MIC_LEN); + buf_len += IEEE80211_CCMP_MIC_LEN; ++ } + + buf_len = min_t(u32, buf_len, WMI_TLV_MGMT_TX_FRAME_MAX_LEN); + buf_len = round_up(buf_len, 4); +diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h +index e1c40bb69932..12f57f9adbba 100644 +--- a/drivers/net/wireless/ath/ath10k/wmi.h ++++ b/drivers/net/wireless/ath/ath10k/wmi.h +@@ -4535,9 +4535,10 @@ enum wmi_10_4_stats_id { + }; + + enum wmi_tlv_stats_id { +- WMI_TLV_STAT_PDEV = BIT(0), +- WMI_TLV_STAT_VDEV = BIT(1), +- WMI_TLV_STAT_PEER = BIT(2), ++ WMI_TLV_STAT_PEER = BIT(0), ++ WMI_TLV_STAT_AP = BIT(1), ++ WMI_TLV_STAT_PDEV = BIT(2), ++ WMI_TLV_STAT_VDEV = BIT(3), + WMI_TLV_STAT_PEER_EXTD = BIT(10), + }; + +diff --git a/drivers/net/wireless/ath/ath6kl/wmi.c b/drivers/net/wireless/ath/ath6kl/wmi.c +index 68854c45d0a4..9ab6aa9ded5c 100644 +--- a/drivers/net/wireless/ath/ath6kl/wmi.c ++++ b/drivers/net/wireless/ath/ath6kl/wmi.c +@@ -1176,6 +1176,10 @@ static int ath6kl_wmi_pstream_timeout_event_rx(struct wmi *wmi, u8 *datap, + return -EINVAL; + + ev = (struct wmi_pstream_timeout_event *) datap; ++ if (ev->traffic_class >= WMM_NUM_AC) { ++ ath6kl_err("invalid traffic class: %d\n", ev->traffic_class); ++ return -EINVAL; ++ } + + /* + * When the pstream (fat pipe == AC) timesout, it means there were +@@ -1517,6 +1521,10 @@ static int ath6kl_wmi_cac_event_rx(struct wmi *wmi, u8 *datap, int len, + return -EINVAL; + + reply = (struct wmi_cac_event *) datap; ++ if (reply->ac >= WMM_NUM_AC) { ++ ath6kl_err("invalid AC: %d\n", reply->ac); ++ return -EINVAL; ++ } + + if ((reply->cac_indication == CAC_INDICATION_ADMISSION_RESP) && + (reply->status_code != IEEE80211_TSPEC_STATUS_ADMISS_ACCEPTED)) { +@@ -2633,7 +2641,7 @@ int ath6kl_wmi_delete_pstream_cmd(struct wmi *wmi, u8 if_idx, u8 traffic_class, + u16 active_tsids = 0; + int ret; + +- if (traffic_class > 3) { ++ if (traffic_class >= WMM_NUM_AC) { + ath6kl_err("invalid traffic class: %d\n", traffic_class); + return -EINVAL; + } +diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c +index 8581d917635a..b6773d613f0c 100644 +--- a/drivers/net/wireless/ath/ath9k/hw.c ++++ b/drivers/net/wireless/ath/ath9k/hw.c +@@ -252,8 +252,9 @@ void ath9k_hw_get_channel_centers(struct ath_hw *ah, + /* Chip Revisions */ + /******************/ + +-static void ath9k_hw_read_revisions(struct ath_hw *ah) ++static bool ath9k_hw_read_revisions(struct ath_hw *ah) + { ++ u32 srev; + u32 val; + + if (ah->get_mac_revision) +@@ -269,25 +270,33 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah) + val = REG_READ(ah, AR_SREV); + ah->hw_version.macRev = MS(val, AR_SREV_REVISION2); + } +- return; ++ return true; + case AR9300_DEVID_AR9340: + ah->hw_version.macVersion = AR_SREV_VERSION_9340; +- return; ++ return true; + case AR9300_DEVID_QCA955X: + ah->hw_version.macVersion = AR_SREV_VERSION_9550; +- return; ++ return true; + case AR9300_DEVID_AR953X: + ah->hw_version.macVersion = AR_SREV_VERSION_9531; +- return; ++ return true; + case AR9300_DEVID_QCA956X: + ah->hw_version.macVersion = AR_SREV_VERSION_9561; +- return; ++ return true; + } + +- val = REG_READ(ah, AR_SREV) & AR_SREV_ID; ++ srev = REG_READ(ah, AR_SREV); ++ ++ if (srev == -EIO) { ++ ath_err(ath9k_hw_common(ah), ++ "Failed to read SREV register"); ++ return false; ++ } ++ ++ val = srev & AR_SREV_ID; + + if (val == 0xFF) { +- val = REG_READ(ah, AR_SREV); ++ val = srev; + ah->hw_version.macVersion = + (val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S; + ah->hw_version.macRev = MS(val, AR_SREV_REVISION2); +@@ -306,6 +315,8 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah) + if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE) + ah->is_pciexpress = true; + } ++ ++ return true; + } + + /************************************/ +@@ -559,7 +570,10 @@ static int __ath9k_hw_init(struct ath_hw *ah) + struct ath_common *common = ath9k_hw_common(ah); + int r = 0; + +- ath9k_hw_read_revisions(ah); ++ if (!ath9k_hw_read_revisions(ah)) { ++ ath_err(common, "Could not read hardware revisions"); ++ return -EOPNOTSUPP; ++ } + + switch (ah->hw_version.macVersion) { + case AR_SREV_VERSION_5416_PCI: +diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c +index 4e97f7f3b2a3..06e660858766 100644 +--- a/drivers/net/wireless/ath/ath9k/recv.c ++++ b/drivers/net/wireless/ath/ath9k/recv.c +@@ -815,6 +815,7 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc, + struct ath_common *common = ath9k_hw_common(ah); + struct ieee80211_hdr *hdr; + bool discard_current = sc->rx.discard_next; ++ bool is_phyerr; + + /* + * Discard corrupt descriptors which are marked in +@@ -827,8 +828,11 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc, + + /* + * Discard zero-length packets and packets smaller than an ACK ++ * which are not PHY_ERROR (short radar pulses have a length of 3) + */ +- if (rx_stats->rs_datalen < 10) { ++ is_phyerr = rx_stats->rs_status & ATH9K_RXERR_PHY; ++ if (!rx_stats->rs_datalen || ++ (rx_stats->rs_datalen < 10 && !is_phyerr)) { + RX_STAT_INC(sc, rx_len_err); + goto corrupt; + } +diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c +index b17e1ca40995..3be0aeedb9b5 100644 +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -668,7 +668,8 @@ static bool bf_is_ampdu_not_probing(struct ath_buf *bf) + static void ath_tx_count_airtime(struct ath_softc *sc, + struct ieee80211_sta *sta, + struct ath_buf *bf, +- struct ath_tx_status *ts) ++ struct ath_tx_status *ts, ++ u8 tid) + { + u32 airtime = 0; + int i; +@@ -679,7 +680,7 @@ static void ath_tx_count_airtime(struct ath_softc *sc, + airtime += rate_dur * bf->rates[i].count; + } + +- ieee80211_sta_register_airtime(sta, ts->tid, airtime, 0); ++ ieee80211_sta_register_airtime(sta, tid, airtime, 0); + } + + static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq, +@@ -709,7 +710,7 @@ static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq, + if (sta) { + struct ath_node *an = (struct ath_node *)sta->drv_priv; + tid = ath_get_skb_tid(sc, an, bf->bf_mpdu); +- ath_tx_count_airtime(sc, sta, bf, ts); ++ ath_tx_count_airtime(sc, sta, bf, ts, tid->tidno); + if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY)) + tid->clear_ps_filter = true; + } +diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c +index e7c3f3b8457d..99f1897a775d 100644 +--- a/drivers/net/wireless/ath/carl9170/usb.c ++++ b/drivers/net/wireless/ath/carl9170/usb.c +@@ -128,6 +128,8 @@ static const struct usb_device_id carl9170_usb_ids[] = { + }; + MODULE_DEVICE_TABLE(usb, carl9170_usb_ids); + ++static struct usb_driver carl9170_driver; ++ + static void carl9170_usb_submit_data_urb(struct ar9170 *ar) + { + struct urb *urb; +@@ -966,32 +968,28 @@ static int carl9170_usb_init_device(struct ar9170 *ar) + + static void carl9170_usb_firmware_failed(struct ar9170 *ar) + { +- struct device *parent = ar->udev->dev.parent; +- struct usb_device *udev; +- +- /* +- * Store a copy of the usb_device pointer locally. +- * This is because device_release_driver initiates +- * carl9170_usb_disconnect, which in turn frees our +- * driver context (ar). ++ /* Store a copies of the usb_interface and usb_device pointer locally. ++ * This is because release_driver initiates carl9170_usb_disconnect, ++ * which in turn frees our driver context (ar). + */ +- udev = ar->udev; ++ struct usb_interface *intf = ar->intf; ++ struct usb_device *udev = ar->udev; + + complete(&ar->fw_load_wait); ++ /* at this point 'ar' could be already freed. Don't use it anymore */ ++ ar = NULL; + + /* unbind anything failed */ +- if (parent) +- device_lock(parent); +- +- device_release_driver(&udev->dev); +- if (parent) +- device_unlock(parent); ++ usb_lock_device(udev); ++ usb_driver_release_interface(&carl9170_driver, intf); ++ usb_unlock_device(udev); + +- usb_put_dev(udev); ++ usb_put_intf(intf); + } + + static void carl9170_usb_firmware_finish(struct ar9170 *ar) + { ++ struct usb_interface *intf = ar->intf; + int err; + + err = carl9170_parse_firmware(ar); +@@ -1009,7 +1007,7 @@ static void carl9170_usb_firmware_finish(struct ar9170 *ar) + goto err_unrx; + + complete(&ar->fw_load_wait); +- usb_put_dev(ar->udev); ++ usb_put_intf(intf); + return; + + err_unrx: +@@ -1052,7 +1050,6 @@ static int carl9170_usb_probe(struct usb_interface *intf, + return PTR_ERR(ar); + + udev = interface_to_usbdev(intf); +- usb_get_dev(udev); + ar->udev = udev; + ar->intf = intf; + ar->features = id->driver_info; +@@ -1094,15 +1091,14 @@ static int carl9170_usb_probe(struct usb_interface *intf, + atomic_set(&ar->rx_anch_urbs, 0); + atomic_set(&ar->rx_pool_urbs, 0); + +- usb_get_dev(ar->udev); ++ usb_get_intf(intf); + + carl9170_set_state(ar, CARL9170_STOPPED); + + err = request_firmware_nowait(THIS_MODULE, 1, CARL9170FW_NAME, + &ar->udev->dev, GFP_KERNEL, ar, carl9170_usb_firmware_step2); + if (err) { +- usb_put_dev(udev); +- usb_put_dev(udev); ++ usb_put_intf(intf); + carl9170_free(ar); + } + return err; +@@ -1131,7 +1127,6 @@ static void carl9170_usb_disconnect(struct usb_interface *intf) + + carl9170_release_firmware(ar); + carl9170_free(ar); +- usb_put_dev(udev); + } + + #ifdef CONFIG_PM +diff --git a/drivers/net/wireless/ath/dfs_pattern_detector.c b/drivers/net/wireless/ath/dfs_pattern_detector.c +index d52b31b45df7..a274eb0d1968 100644 +--- a/drivers/net/wireless/ath/dfs_pattern_detector.c ++++ b/drivers/net/wireless/ath/dfs_pattern_detector.c +@@ -111,7 +111,7 @@ static const struct radar_detector_specs jp_radar_ref_types[] = { + JP_PATTERN(0, 0, 1, 1428, 1428, 1, 18, 29, false), + JP_PATTERN(1, 2, 3, 3846, 3846, 1, 18, 29, false), + JP_PATTERN(2, 0, 1, 1388, 1388, 1, 18, 50, false), +- JP_PATTERN(3, 1, 2, 4000, 4000, 1, 18, 50, false), ++ JP_PATTERN(3, 0, 4, 4000, 4000, 1, 18, 50, false), + JP_PATTERN(4, 0, 5, 150, 230, 1, 23, 50, false), + JP_PATTERN(5, 6, 10, 200, 500, 1, 16, 50, false), + JP_PATTERN(6, 11, 20, 200, 500, 1, 12, 50, false), +diff --git a/drivers/net/wireless/ath/wil6210/interrupt.c b/drivers/net/wireless/ath/wil6210/interrupt.c +index 3f5bd177d55f..b00a13d6d530 100644 +--- a/drivers/net/wireless/ath/wil6210/interrupt.c ++++ b/drivers/net/wireless/ath/wil6210/interrupt.c +@@ -296,21 +296,24 @@ void wil_configure_interrupt_moderation(struct wil6210_priv *wil) + static irqreturn_t wil6210_irq_rx(int irq, void *cookie) + { + struct wil6210_priv *wil = cookie; +- u32 isr = wil_ioread32_and_clear(wil->csr + +- HOSTADDR(RGF_DMA_EP_RX_ICR) + +- offsetof(struct RGF_ICR, ICR)); ++ u32 isr; + bool need_unmask = true; + ++ wil6210_mask_irq_rx(wil); ++ ++ isr = wil_ioread32_and_clear(wil->csr + ++ HOSTADDR(RGF_DMA_EP_RX_ICR) + ++ offsetof(struct RGF_ICR, ICR)); ++ + trace_wil6210_irq_rx(isr); + wil_dbg_irq(wil, "ISR RX 0x%08x\n", isr); + + if (unlikely(!isr)) { + wil_err_ratelimited(wil, "spurious IRQ: RX\n"); ++ wil6210_unmask_irq_rx(wil); + return IRQ_NONE; + } + +- wil6210_mask_irq_rx(wil); +- + /* RX_DONE and RX_HTRSH interrupts are the same if interrupt + * moderation is not used. Interrupt moderation may cause RX + * buffer overflow while RX_DONE is delayed. The required +@@ -355,21 +358,24 @@ static irqreturn_t wil6210_irq_rx(int irq, void *cookie) + static irqreturn_t wil6210_irq_rx_edma(int irq, void *cookie) + { + struct wil6210_priv *wil = cookie; +- u32 isr = wil_ioread32_and_clear(wil->csr + +- HOSTADDR(RGF_INT_GEN_RX_ICR) + +- offsetof(struct RGF_ICR, ICR)); ++ u32 isr; + bool need_unmask = true; + ++ wil6210_mask_irq_rx_edma(wil); ++ ++ isr = wil_ioread32_and_clear(wil->csr + ++ HOSTADDR(RGF_INT_GEN_RX_ICR) + ++ offsetof(struct RGF_ICR, ICR)); ++ + trace_wil6210_irq_rx(isr); + wil_dbg_irq(wil, "ISR RX 0x%08x\n", isr); + + if (unlikely(!isr)) { + wil_err(wil, "spurious IRQ: RX\n"); ++ wil6210_unmask_irq_rx_edma(wil); + return IRQ_NONE; + } + +- wil6210_mask_irq_rx_edma(wil); +- + if (likely(isr & BIT_RX_STATUS_IRQ)) { + wil_dbg_irq(wil, "RX status ring\n"); + isr &= ~BIT_RX_STATUS_IRQ; +@@ -403,21 +409,24 @@ static irqreturn_t wil6210_irq_rx_edma(int irq, void *cookie) + static irqreturn_t wil6210_irq_tx_edma(int irq, void *cookie) + { + struct wil6210_priv *wil = cookie; +- u32 isr = wil_ioread32_and_clear(wil->csr + +- HOSTADDR(RGF_INT_GEN_TX_ICR) + +- offsetof(struct RGF_ICR, ICR)); ++ u32 isr; + bool need_unmask = true; + ++ wil6210_mask_irq_tx_edma(wil); ++ ++ isr = wil_ioread32_and_clear(wil->csr + ++ HOSTADDR(RGF_INT_GEN_TX_ICR) + ++ offsetof(struct RGF_ICR, ICR)); ++ + trace_wil6210_irq_tx(isr); + wil_dbg_irq(wil, "ISR TX 0x%08x\n", isr); + + if (unlikely(!isr)) { + wil_err(wil, "spurious IRQ: TX\n"); ++ wil6210_unmask_irq_tx_edma(wil); + return IRQ_NONE; + } + +- wil6210_mask_irq_tx_edma(wil); +- + if (likely(isr & BIT_TX_STATUS_IRQ)) { + wil_dbg_irq(wil, "TX status ring\n"); + isr &= ~BIT_TX_STATUS_IRQ; +@@ -446,21 +455,24 @@ static irqreturn_t wil6210_irq_tx_edma(int irq, void *cookie) + static irqreturn_t wil6210_irq_tx(int irq, void *cookie) + { + struct wil6210_priv *wil = cookie; +- u32 isr = wil_ioread32_and_clear(wil->csr + +- HOSTADDR(RGF_DMA_EP_TX_ICR) + +- offsetof(struct RGF_ICR, ICR)); ++ u32 isr; + bool need_unmask = true; + ++ wil6210_mask_irq_tx(wil); ++ ++ isr = wil_ioread32_and_clear(wil->csr + ++ HOSTADDR(RGF_DMA_EP_TX_ICR) + ++ offsetof(struct RGF_ICR, ICR)); ++ + trace_wil6210_irq_tx(isr); + wil_dbg_irq(wil, "ISR TX 0x%08x\n", isr); + + if (unlikely(!isr)) { + wil_err_ratelimited(wil, "spurious IRQ: TX\n"); ++ wil6210_unmask_irq_tx(wil); + return IRQ_NONE; + } + +- wil6210_mask_irq_tx(wil); +- + if (likely(isr & BIT_DMA_EP_TX_ICR_TX_DONE)) { + wil_dbg_irq(wil, "TX done\n"); + isr &= ~BIT_DMA_EP_TX_ICR_TX_DONE; +@@ -532,20 +544,23 @@ static bool wil_validate_mbox_regs(struct wil6210_priv *wil) + static irqreturn_t wil6210_irq_misc(int irq, void *cookie) + { + struct wil6210_priv *wil = cookie; +- u32 isr = wil_ioread32_and_clear(wil->csr + +- HOSTADDR(RGF_DMA_EP_MISC_ICR) + +- offsetof(struct RGF_ICR, ICR)); ++ u32 isr; ++ ++ wil6210_mask_irq_misc(wil, false); ++ ++ isr = wil_ioread32_and_clear(wil->csr + ++ HOSTADDR(RGF_DMA_EP_MISC_ICR) + ++ offsetof(struct RGF_ICR, ICR)); + + trace_wil6210_irq_misc(isr); + wil_dbg_irq(wil, "ISR MISC 0x%08x\n", isr); + + if (!isr) { + wil_err(wil, "spurious IRQ: MISC\n"); ++ wil6210_unmask_irq_misc(wil, false); + return IRQ_NONE; + } + +- wil6210_mask_irq_misc(wil, false); +- + if (isr & ISR_MISC_FW_ERROR) { + u32 fw_assert_code = wil_r(wil, wil->rgf_fw_assert_code_addr); + u32 ucode_assert_code = +@@ -580,7 +595,7 @@ static irqreturn_t wil6210_irq_misc(int irq, void *cookie) + /* no need to handle HALP ICRs until next vote */ + wil->halp.handle_icr = false; + wil_dbg_irq(wil, "irq_misc: HALP IRQ invoked\n"); +- wil6210_mask_halp(wil); ++ wil6210_mask_irq_misc(wil, true); + complete(&wil->halp.comp); + } + } +diff --git a/drivers/net/wireless/ath/wil6210/txrx.c b/drivers/net/wireless/ath/wil6210/txrx.c +index 4ccfd1404458..d74837cce67f 100644 +--- a/drivers/net/wireless/ath/wil6210/txrx.c ++++ b/drivers/net/wireless/ath/wil6210/txrx.c +@@ -750,6 +750,7 @@ void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev) + [GRO_HELD] = "GRO_HELD", + [GRO_NORMAL] = "GRO_NORMAL", + [GRO_DROP] = "GRO_DROP", ++ [GRO_CONSUMED] = "GRO_CONSUMED", + }; + + wil->txrx_ops.get_netif_rx_params(skb, &cid, &security); +diff --git a/drivers/net/wireless/ath/wil6210/wmi.c b/drivers/net/wireless/ath/wil6210/wmi.c +index d89cd41e78ac..89a75ff29410 100644 +--- a/drivers/net/wireless/ath/wil6210/wmi.c ++++ b/drivers/net/wireless/ath/wil6210/wmi.c +@@ -3220,7 +3220,18 @@ static void wmi_event_handle(struct wil6210_priv *wil, + /* check if someone waits for this event */ + if (wil->reply_id && wil->reply_id == id && + wil->reply_mid == mid) { +- WARN_ON(wil->reply_buf); ++ if (wil->reply_buf) { ++ /* event received while wmi_call is waiting ++ * with a buffer. Such event should be handled ++ * in wmi_recv_cmd function. Handling the event ++ * here means a previous wmi_call was timeout. ++ * Drop the event and do not handle it. ++ */ ++ wil_err(wil, ++ "Old event (%d, %s) while wmi_call is waiting. Drop it and Continue waiting\n", ++ id, eventid2name(id)); ++ return; ++ } + + wmi_evt_call_handler(vif, id, evt_data, + len - sizeof(*wmi)); +diff --git a/drivers/net/wireless/intel/ipw2x00/ipw2100.c b/drivers/net/wireless/intel/ipw2x00/ipw2100.c +index 75c0c29d81f0..f2e9872e2fcc 100644 +--- a/drivers/net/wireless/intel/ipw2x00/ipw2100.c ++++ b/drivers/net/wireless/intel/ipw2x00/ipw2100.c +@@ -816,7 +816,7 @@ static int ipw2100_hw_send_command(struct ipw2100_priv *priv, + * doesn't seem to have as many firmware restart cycles... + * + * As a test, we're sticking in a 1/100s delay here */ +- schedule_timeout_uninterruptible(msecs_to_jiffies(10)); ++ schedule_msec_hrtimeout_uninterruptible((10)); + + return 0; + +@@ -1267,7 +1267,7 @@ static int ipw2100_start_adapter(struct ipw2100_priv *priv) + IPW_DEBUG_FW("Waiting for f/w initialization to complete...\n"); + i = 5000; + do { +- schedule_timeout_uninterruptible(msecs_to_jiffies(40)); ++ schedule_msec_hrtimeout_uninterruptible((40)); + /* Todo... wait for sync command ... */ + + read_register(priv->net_dev, IPW_REG_INTA, &inta); +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c +index 405038ce98d6..7573af2d88ce 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/acpi.c ++++ b/drivers/net/wireless/intel/iwlwifi/fw/acpi.c +@@ -97,7 +97,7 @@ IWL_EXPORT_SYMBOL(iwl_acpi_get_object); + + union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev, + union acpi_object *data, +- int data_size) ++ int data_size, int *tbl_rev) + { + int i; + union acpi_object *wifi_pkg; +@@ -113,16 +113,19 @@ union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev, + /* + * We need at least two packages, one for the revision and one + * for the data itself. Also check that the revision is valid +- * (i.e. it is an integer set to 0). ++ * (i.e. it is an integer smaller than 2, as we currently support only ++ * 2 revisions). + */ + if (data->type != ACPI_TYPE_PACKAGE || + data->package.count < 2 || + data->package.elements[0].type != ACPI_TYPE_INTEGER || +- data->package.elements[0].integer.value != 0) { ++ data->package.elements[0].integer.value > 1) { + IWL_DEBUG_DEV_RADIO(dev, "Unsupported packages structure\n"); + return ERR_PTR(-EINVAL); + } + ++ *tbl_rev = data->package.elements[0].integer.value; ++ + /* loop through all the packages to find the one for WiFi */ + for (i = 1; i < data->package.count; i++) { + union acpi_object *domain; +@@ -151,14 +154,15 @@ int iwl_acpi_get_mcc(struct device *dev, char *mcc) + { + union acpi_object *wifi_pkg, *data; + u32 mcc_val; +- int ret; ++ int ret, tbl_rev; + + data = iwl_acpi_get_object(dev, ACPI_WRDD_METHOD); + if (IS_ERR(data)) + return PTR_ERR(data); + +- wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_WRDD_WIFI_DATA_SIZE); +- if (IS_ERR(wifi_pkg)) { ++ wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_WRDD_WIFI_DATA_SIZE, ++ &tbl_rev); ++ if (IS_ERR(wifi_pkg) || tbl_rev != 0) { + ret = PTR_ERR(wifi_pkg); + goto out_free; + } +@@ -185,6 +189,7 @@ u64 iwl_acpi_get_pwr_limit(struct device *dev) + { + union acpi_object *data, *wifi_pkg; + u64 dflt_pwr_limit; ++ int tbl_rev; + + data = iwl_acpi_get_object(dev, ACPI_SPLC_METHOD); + if (IS_ERR(data)) { +@@ -193,8 +198,8 @@ u64 iwl_acpi_get_pwr_limit(struct device *dev) + } + + wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, +- ACPI_SPLC_WIFI_DATA_SIZE); +- if (IS_ERR(wifi_pkg) || ++ ACPI_SPLC_WIFI_DATA_SIZE, &tbl_rev); ++ if (IS_ERR(wifi_pkg) || tbl_rev != 0 || + wifi_pkg->package.elements[1].integer.value != ACPI_TYPE_INTEGER) { + dflt_pwr_limit = 0; + goto out_free; +@@ -211,14 +216,15 @@ IWL_EXPORT_SYMBOL(iwl_acpi_get_pwr_limit); + int iwl_acpi_get_eckv(struct device *dev, u32 *extl_clk) + { + union acpi_object *wifi_pkg, *data; +- int ret; ++ int ret, tbl_rev; + + data = iwl_acpi_get_object(dev, ACPI_ECKV_METHOD); + if (IS_ERR(data)) + return PTR_ERR(data); + +- wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_ECKV_WIFI_DATA_SIZE); +- if (IS_ERR(wifi_pkg)) { ++ wifi_pkg = iwl_acpi_get_wifi_pkg(dev, data, ACPI_ECKV_WIFI_DATA_SIZE, ++ &tbl_rev); ++ if (IS_ERR(wifi_pkg) || tbl_rev != 0) { + ret = PTR_ERR(wifi_pkg); + goto out_free; + } +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/acpi.h b/drivers/net/wireless/intel/iwlwifi/fw/acpi.h +index f5704e16643f..991a23450999 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/acpi.h ++++ b/drivers/net/wireless/intel/iwlwifi/fw/acpi.h +@@ -97,7 +97,7 @@ + void *iwl_acpi_get_object(struct device *dev, acpi_string method); + union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev, + union acpi_object *data, +- int data_size); ++ int data_size, int *tbl_rev); + + /** + * iwl_acpi_get_mcc - read MCC from ACPI, if available +@@ -131,7 +131,8 @@ static inline void *iwl_acpi_get_object(struct device *dev, acpi_string method) + + static inline union acpi_object *iwl_acpi_get_wifi_pkg(struct device *dev, + union acpi_object *data, +- int data_size) ++ int data_size, ++ int *tbl_rev) + { + return ERR_PTR(-ENOENT); + } +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/api/power.h b/drivers/net/wireless/intel/iwlwifi/fw/api/power.h +index 01f003c6cff9..f195db398bed 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/api/power.h ++++ b/drivers/net/wireless/intel/iwlwifi/fw/api/power.h +@@ -419,14 +419,26 @@ struct iwl_per_chain_offset_group { + struct iwl_per_chain_offset hb; + } __packed; /* PER_CHAIN_LIMIT_OFFSET_GROUP_S_VER_1 */ + ++/** ++ * struct iwl_geo_tx_power_profile_cmd_v1 - struct for GEO_TX_POWER_LIMIT cmd. ++ * @ops: operations, value from &enum iwl_geo_per_chain_offset_operation ++ * @table: offset profile per band. ++ */ ++struct iwl_geo_tx_power_profiles_cmd_v1 { ++ __le32 ops; ++ struct iwl_per_chain_offset_group table[IWL_NUM_GEO_PROFILES]; ++} __packed; /* GEO_TX_POWER_LIMIT_VER_1 */ ++ + /** + * struct iwl_geo_tx_power_profile_cmd - struct for GEO_TX_POWER_LIMIT cmd. + * @ops: operations, value from &enum iwl_geo_per_chain_offset_operation + * @table: offset profile per band. ++ * @table_revision: BIOS table revision. + */ + struct iwl_geo_tx_power_profiles_cmd { + __le32 ops; + struct iwl_per_chain_offset_group table[IWL_NUM_GEO_PROFILES]; ++ __le32 table_revision; + } __packed; /* GEO_TX_POWER_LIMIT */ + + /** +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +index 33d7bc5500db..c875e173771c 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c ++++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c +@@ -2303,8 +2303,6 @@ void iwl_fw_dbg_collect_sync(struct iwl_fw_runtime *fwrt) + /* start recording again if the firmware is not crashed */ + if (!test_bit(STATUS_FW_ERROR, &fwrt->trans->status) && + fwrt->fw->dbg.dest_tlv) { +- /* wait before we collect the data till the DBGC stop */ +- udelay(500); + iwl_fw_dbg_restart_recording(fwrt, ¶ms); + } + } +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.h b/drivers/net/wireless/intel/iwlwifi/fw/dbg.h +index fd0ad220e961..c5c015a66106 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.h ++++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.h +@@ -294,7 +294,10 @@ _iwl_fw_dbg_stop_recording(struct iwl_trans *trans, + } + + iwl_write_umac_prph(trans, DBGC_IN_SAMPLE, 0); +- udelay(100); ++ /* wait for the DBGC to finish writing the internal buffer to DRAM to ++ * avoid halting the HW while writing ++ */ ++ usleep_range(700, 1000); + iwl_write_umac_prph(trans, DBGC_OUT_CTRL, 0); + #ifdef CONFIG_IWLWIFI_DEBUGFS + trans->dbg_rec_on = false; +@@ -324,7 +327,6 @@ _iwl_fw_dbg_restart_recording(struct iwl_trans *trans, + iwl_set_bits_prph(trans, MON_BUFF_SAMPLE_CTL, 0x1); + } else { + iwl_write_umac_prph(trans, DBGC_IN_SAMPLE, params->in_sample); +- udelay(100); + iwl_write_umac_prph(trans, DBGC_OUT_CTRL, params->out_ctrl); + } + } +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/file.h b/drivers/net/wireless/intel/iwlwifi/fw/file.h +index de9243d30135..a74f34a8dffb 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/file.h ++++ b/drivers/net/wireless/intel/iwlwifi/fw/file.h +@@ -286,6 +286,8 @@ typedef unsigned int __bitwise iwl_ucode_tlv_api_t; + * SCAN_OFFLOAD_PROFILES_QUERY_RSP_S. + * @IWL_UCODE_TLV_API_MBSSID_HE: This ucode supports v2 of + * STA_CONTEXT_DOT11AX_API_S ++ * @IWL_UCODE_TLV_CAPA_SAR_TABLE_VER: This ucode supports different sar ++ * version tables. + * + * @NUM_IWL_UCODE_TLV_API: number of bits used + */ +@@ -318,6 +320,7 @@ enum iwl_ucode_tlv_api { + IWL_UCODE_TLV_API_MBSSID_HE = (__force iwl_ucode_tlv_api_t)52, + IWL_UCODE_TLV_API_WOWLAN_TCP_SYN_WAKE = (__force iwl_ucode_tlv_api_t)53, + IWL_UCODE_TLV_API_FTM_RTT_ACCURACY = (__force iwl_ucode_tlv_api_t)54, ++ IWL_UCODE_TLV_API_SAR_TABLE_VER = (__force iwl_ucode_tlv_api_t)55, + + NUM_IWL_UCODE_TLV_API + #ifdef __CHECKER__ +diff --git a/drivers/net/wireless/intel/iwlwifi/fw/smem.c b/drivers/net/wireless/intel/iwlwifi/fw/smem.c +index ff85d69c2a8c..557ee47bffd8 100644 +--- a/drivers/net/wireless/intel/iwlwifi/fw/smem.c ++++ b/drivers/net/wireless/intel/iwlwifi/fw/smem.c +@@ -8,7 +8,7 @@ + * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. + * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH +- * Copyright(c) 2018 Intel Corporation ++ * Copyright(c) 2018 - 2019 Intel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as +@@ -31,7 +31,7 @@ + * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. + * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH + * Copyright(c) 2016 - 2017 Intel Deutschland GmbH +- * Copyright(c) 2018 Intel Corporation ++ * Copyright(c) 2018 - 2019 Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without +@@ -134,6 +134,7 @@ void iwl_get_shared_mem_conf(struct iwl_fw_runtime *fwrt) + .len = { 0, }, + }; + struct iwl_rx_packet *pkt; ++ int ret; + + if (fw_has_capa(&fwrt->fw->ucode_capa, + IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG)) +@@ -141,8 +142,13 @@ void iwl_get_shared_mem_conf(struct iwl_fw_runtime *fwrt) + else + cmd.id = SHARED_MEM_CFG; + +- if (WARN_ON(iwl_trans_send_cmd(fwrt->trans, &cmd))) ++ ret = iwl_trans_send_cmd(fwrt->trans, &cmd); ++ ++ if (ret) { ++ WARN(ret != -ERFKILL, ++ "Could not send the SMEM command: %d\n", ret); + return; ++ } + + pkt = cmd.resp_pkt; + if (fwrt->trans->cfg->device_family >= IWL_DEVICE_FAMILY_22000) +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h +index 553554846009..93da96a7247c 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-csr.h ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-csr.h +@@ -336,6 +336,7 @@ enum { + /* RF_ID value */ + #define CSR_HW_RF_ID_TYPE_JF (0x00105100) + #define CSR_HW_RF_ID_TYPE_HR (0x0010A000) ++#define CSR_HW_RF_ID_TYPE_HR1 (0x0010c100) + #define CSR_HW_RF_ID_TYPE_HRCDB (0x00109F00) + #define CSR_HW_RF_ID_TYPE_GF (0x0010D000) + #define CSR_HW_RF_ID_TYPE_GF4 (0x0010E000) +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +index 153717587aeb..8892707050d5 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +@@ -419,6 +419,8 @@ static int iwl_run_unified_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm) + + lockdep_assert_held(&mvm->mutex); + ++ mvm->rfkill_safe_init_done = false; ++ + iwl_init_notification_wait(&mvm->notif_wait, + &init_wait, + init_complete, +@@ -537,8 +539,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm) + + lockdep_assert_held(&mvm->mutex); + +- if (WARN_ON_ONCE(mvm->rfkill_safe_init_done)) +- return 0; ++ mvm->rfkill_safe_init_done = false; + + iwl_init_notification_wait(&mvm->notif_wait, + &calib_wait, +@@ -681,15 +682,15 @@ static int iwl_mvm_sar_get_wrds_table(struct iwl_mvm *mvm) + { + union acpi_object *wifi_pkg, *table, *data; + bool enabled; +- int ret; ++ int ret, tbl_rev; + + data = iwl_acpi_get_object(mvm->dev, ACPI_WRDS_METHOD); + if (IS_ERR(data)) + return PTR_ERR(data); + + wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data, +- ACPI_WRDS_WIFI_DATA_SIZE); +- if (IS_ERR(wifi_pkg)) { ++ ACPI_WRDS_WIFI_DATA_SIZE, &tbl_rev); ++ if (IS_ERR(wifi_pkg) || tbl_rev != 0) { + ret = PTR_ERR(wifi_pkg); + goto out_free; + } +@@ -718,15 +719,15 @@ static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm) + { + union acpi_object *wifi_pkg, *data; + bool enabled; +- int i, n_profiles, ret; ++ int i, n_profiles, ret, tbl_rev; + + data = iwl_acpi_get_object(mvm->dev, ACPI_EWRD_METHOD); + if (IS_ERR(data)) + return PTR_ERR(data); + + wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data, +- ACPI_EWRD_WIFI_DATA_SIZE); +- if (IS_ERR(wifi_pkg)) { ++ ACPI_EWRD_WIFI_DATA_SIZE, &tbl_rev); ++ if (IS_ERR(wifi_pkg) || tbl_rev != 0) { + ret = PTR_ERR(wifi_pkg); + goto out_free; + } +@@ -752,7 +753,7 @@ static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm) + + for (i = 0; i < n_profiles; i++) { + /* the tables start at element 3 */ +- static int pos = 3; ++ int pos = 3; + + /* The EWRD profiles officially go from 2 to 4, but we + * save them in sar_profiles[1-3] (because we don't +@@ -777,7 +778,7 @@ static int iwl_mvm_sar_get_ewrd_table(struct iwl_mvm *mvm) + static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm) + { + union acpi_object *wifi_pkg, *data; +- int i, j, ret; ++ int i, j, ret, tbl_rev; + int idx = 1; + + data = iwl_acpi_get_object(mvm->dev, ACPI_WGDS_METHOD); +@@ -785,12 +786,13 @@ static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm) + return PTR_ERR(data); + + wifi_pkg = iwl_acpi_get_wifi_pkg(mvm->dev, data, +- ACPI_WGDS_WIFI_DATA_SIZE); +- if (IS_ERR(wifi_pkg)) { ++ ACPI_WGDS_WIFI_DATA_SIZE, &tbl_rev); ++ if (IS_ERR(wifi_pkg) || tbl_rev > 1) { + ret = PTR_ERR(wifi_pkg); + goto out_free; + } + ++ mvm->geo_rev = tbl_rev; + for (i = 0; i < ACPI_NUM_GEO_PROFILES; i++) { + for (j = 0; j < ACPI_GEO_TABLE_SIZE; j++) { + union acpi_object *entry; +@@ -873,21 +875,54 @@ int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b) + return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0, len, &cmd); + } + ++static bool iwl_mvm_sar_geo_support(struct iwl_mvm *mvm) ++{ ++ /* ++ * The GEO_TX_POWER_LIMIT command is not supported on earlier ++ * firmware versions. Unfortunately, we don't have a TLV API ++ * flag to rely on, so rely on the major version which is in ++ * the first byte of ucode_ver. This was implemented ++ * initially on version 38 and then backported to 36, 29 and ++ * 17. ++ */ ++ return IWL_UCODE_SERIAL(mvm->fw->ucode_ver) >= 38 || ++ IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 36 || ++ IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 29 || ++ IWL_UCODE_SERIAL(mvm->fw->ucode_ver) == 17; ++} ++ + int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm) + { + struct iwl_geo_tx_power_profiles_resp *resp; + int ret; ++ u16 len; ++ void *data; ++ struct iwl_geo_tx_power_profiles_cmd geo_cmd; ++ struct iwl_geo_tx_power_profiles_cmd_v1 geo_cmd_v1; ++ struct iwl_host_cmd cmd; ++ ++ if (fw_has_api(&mvm->fw->ucode_capa, IWL_UCODE_TLV_API_SAR_TABLE_VER)) { ++ geo_cmd.ops = ++ cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE); ++ len = sizeof(geo_cmd); ++ data = &geo_cmd; ++ } else { ++ geo_cmd_v1.ops = ++ cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE); ++ len = sizeof(geo_cmd_v1); ++ data = &geo_cmd_v1; ++ } + +- struct iwl_geo_tx_power_profiles_cmd geo_cmd = { +- .ops = cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE), +- }; +- struct iwl_host_cmd cmd = { ++ cmd = (struct iwl_host_cmd){ + .id = WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT), +- .len = { sizeof(geo_cmd), }, ++ .len = { len, }, + .flags = CMD_WANT_SKB, +- .data = { &geo_cmd }, ++ .data = { data }, + }; + ++ if (!iwl_mvm_sar_geo_support(mvm)) ++ return -EOPNOTSUPP; ++ + ret = iwl_mvm_send_cmd(mvm, &cmd); + if (ret) { + IWL_ERR(mvm, "Failed to get geographic profile info %d\n", ret); +@@ -913,13 +948,7 @@ static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm) + int ret, i, j; + u16 cmd_wide_id = WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT); + +- /* +- * This command is not supported on earlier firmware versions. +- * Unfortunately, we don't have a TLV API flag to rely on, so +- * rely on the major version which is in the first byte of +- * ucode_ver. +- */ +- if (IWL_UCODE_SERIAL(mvm->fw->ucode_ver) < 41) ++ if (!iwl_mvm_sar_geo_support(mvm)) + return 0; + + ret = iwl_mvm_sar_get_wgds_table(mvm); +@@ -955,6 +984,16 @@ static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm) + i, j, value[1], value[2], value[0]); + } + } ++ ++ cmd.table_revision = cpu_to_le32(mvm->geo_rev); ++ ++ if (!fw_has_api(&mvm->fw->ucode_capa, ++ IWL_UCODE_TLV_API_SAR_TABLE_VER)) { ++ return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0, ++ sizeof(struct iwl_geo_tx_power_profiles_cmd_v1), ++ &cmd); ++ } ++ + return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0, sizeof(cmd), &cmd); + } + +@@ -1108,10 +1147,13 @@ static int iwl_mvm_load_rt_fw(struct iwl_mvm *mvm) + + iwl_fw_dbg_apply_point(&mvm->fwrt, IWL_FW_INI_APPLY_EARLY); + ++ mvm->rfkill_safe_init_done = false; + ret = iwl_mvm_load_ucode_wait_alive(mvm, IWL_UCODE_REGULAR); + if (ret) + return ret; + ++ mvm->rfkill_safe_init_done = true; ++ + iwl_fw_dbg_apply_point(&mvm->fwrt, IWL_FW_INI_APPLY_AFTER_ALIVE); + + return iwl_init_paging(&mvm->fwrt, mvm->fwrt.cur_fw_img); +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +index fdbabca0280e..3905770b8a1f 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +@@ -207,6 +207,12 @@ static const struct cfg80211_pmsr_capabilities iwl_mvm_pmsr_capa = { + }, + }; + ++static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, ++ enum set_key_cmd cmd, ++ struct ieee80211_vif *vif, ++ struct ieee80211_sta *sta, ++ struct ieee80211_key_conf *key); ++ + void iwl_mvm_ref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type) + { + if (!iwl_mvm_is_d0i3_supported(mvm)) +@@ -468,7 +474,19 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) + ieee80211_hw_set(hw, SUPPORTS_VHT_EXT_NSS_BW); + ieee80211_hw_set(hw, BUFF_MMPDU_TXQ); + ieee80211_hw_set(hw, STA_MMPDU_TXQ); +- ieee80211_hw_set(hw, TX_AMSDU); ++ /* ++ * On older devices, enabling TX A-MSDU occasionally leads to ++ * something getting messed up, the command read from the FIFO ++ * gets out of sync and isn't a TX command, so that we have an ++ * assert EDC. ++ * ++ * It's not clear where the bug is, but since we didn't used to ++ * support A-MSDU until moving the mac80211 iTXQs, just leave it ++ * for older devices. We also don't see this issue on any newer ++ * devices. ++ */ ++ if (mvm->cfg->device_family >= IWL_DEVICE_FAMILY_9000) ++ ieee80211_hw_set(hw, TX_AMSDU); + ieee80211_hw_set(hw, TX_FRAG_LIST); + + if (iwl_mvm_has_tlc_offload(mvm)) { +@@ -2636,7 +2654,7 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw, + { + struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); + struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); +- int ret; ++ int ret, i; + + /* + * iwl_mvm_mac_ctxt_add() might read directly from the device +@@ -2710,6 +2728,20 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw, + /* must be set before quota calculations */ + mvmvif->ap_ibss_active = true; + ++ /* send all the early keys to the device now */ ++ for (i = 0; i < ARRAY_SIZE(mvmvif->ap_early_keys); i++) { ++ struct ieee80211_key_conf *key = mvmvif->ap_early_keys[i]; ++ ++ if (!key) ++ continue; ++ ++ mvmvif->ap_early_keys[i] = NULL; ++ ++ ret = iwl_mvm_mac_set_key(hw, SET_KEY, vif, NULL, key); ++ if (ret) ++ goto out_quota_failed; ++ } ++ + if (vif->type == NL80211_IFTYPE_AP && !vif->p2p) { + iwl_mvm_vif_set_low_latency(mvmvif, true, + LOW_LATENCY_VIF_TYPE); +@@ -3479,11 +3511,12 @@ static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, + struct ieee80211_sta *sta, + struct ieee80211_key_conf *key) + { ++ struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); + struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); + struct iwl_mvm_sta *mvmsta; + struct iwl_mvm_key_pn *ptk_pn; + int keyidx = key->keyidx; +- int ret; ++ int ret, i; + u8 key_offset; + + if (iwlwifi_mod_params.swcrypto) { +@@ -3556,6 +3589,22 @@ static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, + key->hw_key_idx = STA_KEY_IDX_INVALID; + break; + } ++ ++ if (!mvmvif->ap_ibss_active) { ++ for (i = 0; ++ i < ARRAY_SIZE(mvmvif->ap_early_keys); ++ i++) { ++ if (!mvmvif->ap_early_keys[i]) { ++ mvmvif->ap_early_keys[i] = key; ++ break; ++ } ++ } ++ ++ if (i >= ARRAY_SIZE(mvmvif->ap_early_keys)) ++ ret = -ENOSPC; ++ ++ break; ++ } + } + + /* During FW restart, in order to restore the state as it was, +@@ -3624,6 +3673,18 @@ static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, + + break; + case DISABLE_KEY: ++ ret = -ENOENT; ++ for (i = 0; i < ARRAY_SIZE(mvmvif->ap_early_keys); i++) { ++ if (mvmvif->ap_early_keys[i] == key) { ++ mvmvif->ap_early_keys[i] = NULL; ++ ret = 0; ++ } ++ } ++ ++ /* found in pending list - don't do anything else */ ++ if (ret == 0) ++ break; ++ + if (key->hw_key_idx == STA_KEY_IDX_INVALID) { + ret = 0; + break; +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +index 02efcf2189c4..ed8fc9a9204c 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +@@ -501,6 +501,9 @@ struct iwl_mvm_vif { + netdev_features_t features; + + struct iwl_probe_resp_data __rcu *probe_resp_data; ++ ++ /* we can only have 2 GTK + 2 IGTK active at a time */ ++ struct ieee80211_key_conf *ap_early_keys[4]; + }; + + static inline struct iwl_mvm_vif * +@@ -1181,6 +1184,7 @@ struct iwl_mvm { + #ifdef CONFIG_ACPI + struct iwl_mvm_sar_profile sar_profiles[ACPI_SAR_PROFILE_NUM]; + struct iwl_mvm_geo_profile geo_profiles[ACPI_NUM_GEO_PROFILES]; ++ u32 geo_rev; + #endif + }; + +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +index 0c2aabc842f9..a12ee20fb9ab 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c +@@ -726,6 +726,9 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb) + + memcpy(&info, skb->cb, sizeof(info)); + ++ if (WARN_ON_ONCE(skb->len > IEEE80211_MAX_DATA_LEN + hdrlen)) ++ return -1; ++ + if (WARN_ON_ONCE(info.flags & IEEE80211_TX_CTL_AMPDU)) + return -1; + +@@ -828,6 +831,7 @@ iwl_mvm_tx_tso_segment(struct sk_buff *skb, unsigned int num_subframes, + unsigned int tcp_payload_len; + unsigned int mss = skb_shinfo(skb)->gso_size; + bool ipv4 = (skb->protocol == htons(ETH_P_IP)); ++ bool qos = ieee80211_is_data_qos(hdr->frame_control); + u16 ip_base_id = ipv4 ? ntohs(ip_hdr(skb)->id) : 0; + + skb_shinfo(skb)->gso_size = num_subframes * mss; +@@ -861,7 +865,7 @@ iwl_mvm_tx_tso_segment(struct sk_buff *skb, unsigned int num_subframes, + if (tcp_payload_len > mss) { + skb_shinfo(tmp)->gso_size = mss; + } else { +- if (ieee80211_is_data_qos(hdr->frame_control)) { ++ if (qos) { + u8 *qc; + + if (ipv4) +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c +index f496d1bcb643..1719a5ff77a9 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info-gen3.c +@@ -169,7 +169,7 @@ int iwl_pcie_ctxt_info_gen3_init(struct iwl_trans *trans, + + memcpy(iml_img, trans->iml, trans->iml_len); + +- iwl_enable_interrupts(trans); ++ iwl_enable_fw_load_int_ctx_info(trans); + + /* kick FW self load */ + iwl_write64(trans, CSR_CTXT_INFO_ADDR, +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c +index 8969b47bacf2..d38cefbb779e 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/ctxt-info.c +@@ -222,7 +222,7 @@ int iwl_pcie_ctxt_info_init(struct iwl_trans *trans, + + trans_pcie->ctxt_info = ctxt_info; + +- iwl_enable_interrupts(trans); ++ iwl_enable_fw_load_int_ctx_info(trans); + + /* Configure debug, if exists */ + if (iwl_pcie_dbg_on(trans)) +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +index 85973dd57234..dcb3a3768cbd 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h +@@ -874,6 +874,33 @@ static inline void iwl_enable_fw_load_int(struct iwl_trans *trans) + } + } + ++static inline void iwl_enable_fw_load_int_ctx_info(struct iwl_trans *trans) ++{ ++ struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); ++ ++ IWL_DEBUG_ISR(trans, "Enabling ALIVE interrupt only\n"); ++ ++ if (!trans_pcie->msix_enabled) { ++ /* ++ * When we'll receive the ALIVE interrupt, the ISR will call ++ * iwl_enable_fw_load_int_ctx_info again to set the ALIVE ++ * interrupt (which is not really needed anymore) but also the ++ * RX interrupt which will allow us to receive the ALIVE ++ * notification (which is Rx) and continue the flow. ++ */ ++ trans_pcie->inta_mask = CSR_INT_BIT_ALIVE | CSR_INT_BIT_FH_RX; ++ iwl_write32(trans, CSR_INT_MASK, trans_pcie->inta_mask); ++ } else { ++ iwl_enable_hw_int_msk_msix(trans, ++ MSIX_HW_INT_CAUSES_REG_ALIVE); ++ /* ++ * Leave all the FH causes enabled to get the ALIVE ++ * notification. ++ */ ++ iwl_enable_fh_int_msk_msix(trans, trans_pcie->fh_init_mask); ++ } ++} ++ + static inline u16 iwl_pcie_get_cmd_index(const struct iwl_txq *q, u32 index) + { + return index & (q->n_window - 1); +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c +index 31b3591f71d1..e5220905dff1 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c +@@ -1827,26 +1827,26 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) + goto out; + } + +- if (iwl_have_debug_level(IWL_DL_ISR)) { +- /* NIC fires this, but we don't use it, redundant with WAKEUP */ +- if (inta & CSR_INT_BIT_SCD) { +- IWL_DEBUG_ISR(trans, +- "Scheduler finished to transmit the frame/frames.\n"); +- isr_stats->sch++; +- } ++ /* NIC fires this, but we don't use it, redundant with WAKEUP */ ++ if (inta & CSR_INT_BIT_SCD) { ++ IWL_DEBUG_ISR(trans, ++ "Scheduler finished to transmit the frame/frames.\n"); ++ isr_stats->sch++; ++ } + +- /* Alive notification via Rx interrupt will do the real work */ +- if (inta & CSR_INT_BIT_ALIVE) { +- IWL_DEBUG_ISR(trans, "Alive interrupt\n"); +- isr_stats->alive++; +- if (trans->cfg->gen2) { +- /* +- * We can restock, since firmware configured +- * the RFH +- */ +- iwl_pcie_rxmq_restock(trans, trans_pcie->rxq); +- } ++ /* Alive notification via Rx interrupt will do the real work */ ++ if (inta & CSR_INT_BIT_ALIVE) { ++ IWL_DEBUG_ISR(trans, "Alive interrupt\n"); ++ isr_stats->alive++; ++ if (trans->cfg->gen2) { ++ /* ++ * We can restock, since firmware configured ++ * the RFH ++ */ ++ iwl_pcie_rxmq_restock(trans, trans_pcie->rxq); + } ++ ++ handled |= CSR_INT_BIT_ALIVE; + } + + /* Safely ignore these bits for debug checks below */ +@@ -1965,6 +1965,9 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) + /* Re-enable RF_KILL if it occurred */ + else if (handled & CSR_INT_BIT_RF_KILL) + iwl_enable_rfkill_int(trans); ++ /* Re-enable the ALIVE / Rx interrupt if it occurred */ ++ else if (handled & (CSR_INT_BIT_ALIVE | CSR_INT_BIT_FH_RX)) ++ iwl_enable_fw_load_int_ctx_info(trans); + spin_unlock(&trans_pcie->irq_lock); + + out: +@@ -2108,10 +2111,18 @@ irqreturn_t iwl_pcie_irq_msix_handler(int irq, void *dev_id) + return IRQ_NONE; + } + +- if (iwl_have_debug_level(IWL_DL_ISR)) +- IWL_DEBUG_ISR(trans, "ISR inta_fh 0x%08x, enabled 0x%08x\n", +- inta_fh, ++ if (iwl_have_debug_level(IWL_DL_ISR)) { ++ IWL_DEBUG_ISR(trans, ++ "ISR inta_fh 0x%08x, enabled (sw) 0x%08x (hw) 0x%08x\n", ++ inta_fh, trans_pcie->fh_mask, + iwl_read32(trans, CSR_MSIX_FH_INT_MASK_AD)); ++ if (inta_fh & ~trans_pcie->fh_mask) ++ IWL_DEBUG_ISR(trans, ++ "We got a masked interrupt (0x%08x)\n", ++ inta_fh & ~trans_pcie->fh_mask); ++ } ++ ++ inta_fh &= trans_pcie->fh_mask; + + if ((trans_pcie->shared_vec_mask & IWL_SHARED_IRQ_NON_RX) && + inta_fh & MSIX_FH_INT_CAUSES_Q0) { +@@ -2151,11 +2162,18 @@ irqreturn_t iwl_pcie_irq_msix_handler(int irq, void *dev_id) + } + + /* After checking FH register check HW register */ +- if (iwl_have_debug_level(IWL_DL_ISR)) ++ if (iwl_have_debug_level(IWL_DL_ISR)) { + IWL_DEBUG_ISR(trans, +- "ISR inta_hw 0x%08x, enabled 0x%08x\n", +- inta_hw, ++ "ISR inta_hw 0x%08x, enabled (sw) 0x%08x (hw) 0x%08x\n", ++ inta_hw, trans_pcie->hw_mask, + iwl_read32(trans, CSR_MSIX_HW_INT_MASK_AD)); ++ if (inta_hw & ~trans_pcie->hw_mask) ++ IWL_DEBUG_ISR(trans, ++ "We got a masked interrupt 0x%08x\n", ++ inta_hw & ~trans_pcie->hw_mask); ++ } ++ ++ inta_hw &= trans_pcie->hw_mask; + + /* Alive notification via Rx interrupt will do the real work */ + if (inta_hw & MSIX_HW_INT_CAUSES_REG_ALIVE) { +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c +index 8507a7bdcfdd..ea1d2bed502d 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans-gen2.c +@@ -273,6 +273,15 @@ void iwl_trans_pcie_gen2_fw_alive(struct iwl_trans *trans, u32 scd_addr) + * paging memory cannot be freed included since FW will still use it + */ + iwl_pcie_ctxt_info_free(trans); ++ ++ /* ++ * Re-enable all the interrupts, including the RF-Kill one, now that ++ * the firmware is alive. ++ */ ++ iwl_enable_interrupts(trans); ++ mutex_lock(&trans_pcie->mutex); ++ iwl_pcie_check_hw_rf_kill(trans); ++ mutex_unlock(&trans_pcie->mutex); + } + + int iwl_trans_pcie_gen2_start_fw(struct iwl_trans *trans, +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +index dfa1bed124aa..199eddea82a9 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c +@@ -3575,9 +3575,11 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev, + trans->cfg = &iwlax210_2ax_cfg_so_gf4_a0; + } + } else if (cfg == &iwl_ax101_cfg_qu_hr) { +- if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) == +- CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR) && +- trans->hw_rev == CSR_HW_REV_TYPE_QNJ_B0) { ++ if ((CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) == ++ CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR) && ++ trans->hw_rev == CSR_HW_REV_TYPE_QNJ_B0) || ++ (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) == ++ CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR1))) { + trans->cfg = &iwl22000_2ax_cfg_qnj_hr_b0; + } else if (CSR_HW_RF_ID_TYPE_CHIP_ID(trans->hw_rf_id) == + CSR_HW_RF_ID_TYPE_CHIP_ID(CSR_HW_RF_ID_TYPE_HR)) { +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +index fa4245d0d4a8..2f0ba7ef53b8 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +@@ -435,6 +435,8 @@ static void iwl_pcie_tfd_unmap(struct iwl_trans *trans, + DMA_TO_DEVICE); + } + ++ meta->tbs = 0; ++ + if (trans->cfg->use_tfh) { + struct iwl_tfh_tfd *tfd_fh = (void *)tfd; + +diff --git a/drivers/net/wireless/intersil/p54/p54usb.c b/drivers/net/wireless/intersil/p54/p54usb.c +index f937815f0f2c..b94764c88750 100644 +--- a/drivers/net/wireless/intersil/p54/p54usb.c ++++ b/drivers/net/wireless/intersil/p54/p54usb.c +@@ -30,6 +30,8 @@ MODULE_ALIAS("prism54usb"); + MODULE_FIRMWARE("isl3886usb"); + MODULE_FIRMWARE("isl3887usb"); + ++static struct usb_driver p54u_driver; ++ + /* + * Note: + * +@@ -918,9 +920,9 @@ static void p54u_load_firmware_cb(const struct firmware *firmware, + { + struct p54u_priv *priv = context; + struct usb_device *udev = priv->udev; ++ struct usb_interface *intf = priv->intf; + int err; + +- complete(&priv->fw_wait_load); + if (firmware) { + priv->fw = firmware; + err = p54u_start_ops(priv); +@@ -929,26 +931,22 @@ static void p54u_load_firmware_cb(const struct firmware *firmware, + dev_err(&udev->dev, "Firmware not found.\n"); + } + +- if (err) { +- struct device *parent = priv->udev->dev.parent; +- +- dev_err(&udev->dev, "failed to initialize device (%d)\n", err); +- +- if (parent) +- device_lock(parent); ++ complete(&priv->fw_wait_load); ++ /* ++ * At this point p54u_disconnect may have already freed ++ * the "priv" context. Do not use it anymore! ++ */ ++ priv = NULL; + +- device_release_driver(&udev->dev); +- /* +- * At this point p54u_disconnect has already freed +- * the "priv" context. Do not use it anymore! +- */ +- priv = NULL; ++ if (err) { ++ dev_err(&intf->dev, "failed to initialize device (%d)\n", err); + +- if (parent) +- device_unlock(parent); ++ usb_lock_device(udev); ++ usb_driver_release_interface(&p54u_driver, intf); ++ usb_unlock_device(udev); + } + +- usb_put_dev(udev); ++ usb_put_intf(intf); + } + + static int p54u_load_firmware(struct ieee80211_hw *dev, +@@ -969,14 +967,14 @@ static int p54u_load_firmware(struct ieee80211_hw *dev, + dev_info(&priv->udev->dev, "Loading firmware file %s\n", + p54u_fwlist[i].fw); + +- usb_get_dev(udev); ++ usb_get_intf(intf); + err = request_firmware_nowait(THIS_MODULE, 1, p54u_fwlist[i].fw, + device, GFP_KERNEL, priv, + p54u_load_firmware_cb); + if (err) { + dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s " + "(%d)!\n", p54u_fwlist[i].fw, err); +- usb_put_dev(udev); ++ usb_put_intf(intf); + } + + return err; +@@ -1008,8 +1006,6 @@ static int p54u_probe(struct usb_interface *intf, + skb_queue_head_init(&priv->rx_queue); + init_usb_anchor(&priv->submitted); + +- usb_get_dev(udev); +- + /* really lazy and simple way of figuring out if we're a 3887 */ + /* TODO: should just stick the identification in the device table */ + i = intf->altsetting->desc.bNumEndpoints; +@@ -1050,10 +1046,8 @@ static int p54u_probe(struct usb_interface *intf, + priv->upload_fw = p54u_upload_firmware_net2280; + } + err = p54u_load_firmware(dev, intf); +- if (err) { +- usb_put_dev(udev); ++ if (err) + p54_free_common(dev); +- } + return err; + } + +@@ -1069,7 +1063,6 @@ static void p54u_disconnect(struct usb_interface *intf) + wait_for_completion(&priv->fw_wait_load); + p54_unregister_common(dev); + +- usb_put_dev(interface_to_usbdev(intf)); + release_firmware(priv->fw); + p54_free_common(dev); + } +diff --git a/drivers/net/wireless/intersil/p54/txrx.c b/drivers/net/wireless/intersil/p54/txrx.c +index ff9acd1563f4..5892898f8853 100644 +--- a/drivers/net/wireless/intersil/p54/txrx.c ++++ b/drivers/net/wireless/intersil/p54/txrx.c +@@ -139,7 +139,10 @@ static int p54_assign_address(struct p54_common *priv, struct sk_buff *skb) + unlikely(GET_HW_QUEUE(skb) == P54_QUEUE_BEACON)) + priv->beacon_req_id = data->req_id; + +- __skb_queue_after(&priv->tx_queue, target_skb, skb); ++ if (target_skb) ++ __skb_queue_after(&priv->tx_queue, target_skb, skb); ++ else ++ __skb_queue_head(&priv->tx_queue, skb); + spin_unlock_irqrestore(&priv->tx_queue.lock, flags); + return 0; + } +diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h b/drivers/net/wireless/marvell/mwifiex/fw.h +index b73f99dc5a72..1fb76d2f5d3f 100644 +--- a/drivers/net/wireless/marvell/mwifiex/fw.h ++++ b/drivers/net/wireless/marvell/mwifiex/fw.h +@@ -1759,9 +1759,10 @@ struct mwifiex_ie_types_wmm_queue_status { + struct ieee_types_vendor_header { + u8 element_id; + u8 len; +- u8 oui[4]; /* 0~2: oui, 3: oui_type */ +- u8 oui_subtype; +- u8 version; ++ struct { ++ u8 oui[3]; ++ u8 oui_type; ++ } __packed oui; + } __packed; + + struct ieee_types_wmm_parameter { +@@ -1775,6 +1776,9 @@ struct ieee_types_wmm_parameter { + * Version [1] + */ + struct ieee_types_vendor_header vend_hdr; ++ u8 oui_subtype; ++ u8 version; ++ + u8 qos_info_bitmap; + u8 reserved; + struct ieee_types_wmm_ac_parameters ac_params[IEEE80211_NUM_ACS]; +@@ -1792,6 +1796,8 @@ struct ieee_types_wmm_info { + * Version [1] + */ + struct ieee_types_vendor_header vend_hdr; ++ u8 oui_subtype; ++ u8 version; + + u8 qos_info_bitmap; + } __packed; +diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h +index b025ba164412..e39bb5c42c9a 100644 +--- a/drivers/net/wireless/marvell/mwifiex/main.h ++++ b/drivers/net/wireless/marvell/mwifiex/main.h +@@ -124,6 +124,7 @@ enum { + + #define MWIFIEX_MAX_TOTAL_SCAN_TIME (MWIFIEX_TIMER_10S - MWIFIEX_TIMER_1S) + ++#define WPA_GTK_OUI_OFFSET 2 + #define RSN_GTK_OUI_OFFSET 2 + + #define MWIFIEX_OUI_NOT_PRESENT 0 +diff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c +index c269a0de9413..dd02bbd9544e 100644 +--- a/drivers/net/wireless/marvell/mwifiex/scan.c ++++ b/drivers/net/wireless/marvell/mwifiex/scan.c +@@ -181,7 +181,8 @@ mwifiex_is_wpa_oui_present(struct mwifiex_bssdescriptor *bss_desc, u32 cipher) + u8 ret = MWIFIEX_OUI_NOT_PRESENT; + + if (has_vendor_hdr(bss_desc->bcn_wpa_ie, WLAN_EID_VENDOR_SPECIFIC)) { +- iebody = (struct ie_body *) bss_desc->bcn_wpa_ie->data; ++ iebody = (struct ie_body *)((u8 *)bss_desc->bcn_wpa_ie->data + ++ WPA_GTK_OUI_OFFSET); + oui = &mwifiex_wpa_oui[cipher][0]; + ret = mwifiex_search_oui_in_ie(iebody, oui); + if (ret) +@@ -1361,21 +1362,25 @@ int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter, + break; + + case WLAN_EID_VENDOR_SPECIFIC: +- if (element_len + 2 < sizeof(vendor_ie->vend_hdr)) +- return -EINVAL; +- + vendor_ie = (struct ieee_types_vendor_specific *) + current_ptr; + +- if (!memcmp +- (vendor_ie->vend_hdr.oui, wpa_oui, +- sizeof(wpa_oui))) { ++ /* 802.11 requires at least 3-byte OUI. */ ++ if (element_len < sizeof(vendor_ie->vend_hdr.oui.oui)) ++ return -EINVAL; ++ ++ /* Not long enough for a match? Skip it. */ ++ if (element_len < sizeof(wpa_oui)) ++ break; ++ ++ if (!memcmp(&vendor_ie->vend_hdr.oui, wpa_oui, ++ sizeof(wpa_oui))) { + bss_entry->bcn_wpa_ie = + (struct ieee_types_vendor_specific *) + current_ptr; + bss_entry->wpa_offset = (u16) + (current_ptr - bss_entry->beacon_buf); +- } else if (!memcmp(vendor_ie->vend_hdr.oui, wmm_oui, ++ } else if (!memcmp(&vendor_ie->vend_hdr.oui, wmm_oui, + sizeof(wmm_oui))) { + if (total_ie_len == + sizeof(struct ieee_types_wmm_parameter) || +diff --git a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c +index ebc0e41e5d3b..74e50566db1f 100644 +--- a/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c ++++ b/drivers/net/wireless/marvell/mwifiex/sta_ioctl.c +@@ -1351,7 +1351,7 @@ mwifiex_set_gen_ie_helper(struct mwifiex_private *priv, u8 *ie_data_ptr, + /* Test to see if it is a WPA IE, if not, then + * it is a gen IE + */ +- if (!memcmp(pvendor_ie->oui, wpa_oui, ++ if (!memcmp(&pvendor_ie->oui, wpa_oui, + sizeof(wpa_oui))) { + /* IE is a WPA/WPA2 IE so call set_wpa function + */ +@@ -1361,7 +1361,7 @@ mwifiex_set_gen_ie_helper(struct mwifiex_private *priv, u8 *ie_data_ptr, + goto next_ie; + } + +- if (!memcmp(pvendor_ie->oui, wps_oui, ++ if (!memcmp(&pvendor_ie->oui, wps_oui, + sizeof(wps_oui))) { + /* Test to see if it is a WPS IE, + * if so, enable wps session flag +diff --git a/drivers/net/wireless/marvell/mwifiex/wmm.c b/drivers/net/wireless/marvell/mwifiex/wmm.c +index 407b9932ca4d..64916ba15df5 100644 +--- a/drivers/net/wireless/marvell/mwifiex/wmm.c ++++ b/drivers/net/wireless/marvell/mwifiex/wmm.c +@@ -240,7 +240,7 @@ mwifiex_wmm_setup_queue_priorities(struct mwifiex_private *priv, + mwifiex_dbg(priv->adapter, INFO, + "info: WMM Parameter IE: version=%d,\t" + "qos_info Parameter Set Count=%d, Reserved=%#x\n", +- wmm_ie->vend_hdr.version, wmm_ie->qos_info_bitmap & ++ wmm_ie->version, wmm_ie->qos_info_bitmap & + IEEE80211_WMM_IE_AP_QOSINFO_PARAM_SET_CNT_MASK, + wmm_ie->reserved); + +diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c +index b8f48d10f27a..a27bc6791aa7 100644 +--- a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c ++++ b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c +@@ -96,6 +96,9 @@ int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb) + bool unicast, remove_pad, insert_ccmp_hdr = false; + int i, idx; + ++ if (!test_bit(MT76_STATE_RUNNING, &dev->mt76.state)) ++ return -EINVAL; ++ + memset(status, 0, sizeof(*status)); + + unicast = (rxd1 & MT_RXD1_NORMAL_ADDR_TYPE) == MT_RXD1_NORMAL_U2M; +diff --git a/drivers/net/wireless/mediatek/mt7601u/dma.c b/drivers/net/wireless/mediatek/mt7601u/dma.c +index 66d60283e456..f6a0454abe04 100644 +--- a/drivers/net/wireless/mediatek/mt7601u/dma.c ++++ b/drivers/net/wireless/mediatek/mt7601u/dma.c +@@ -185,10 +185,23 @@ static void mt7601u_complete_rx(struct urb *urb) + struct mt7601u_rx_queue *q = &dev->rx_q; + unsigned long flags; + +- spin_lock_irqsave(&dev->rx_lock, flags); ++ /* do no schedule rx tasklet if urb has been unlinked ++ * or the device has been removed ++ */ ++ switch (urb->status) { ++ case -ECONNRESET: ++ case -ESHUTDOWN: ++ case -ENOENT: ++ return; ++ default: ++ dev_err_ratelimited(dev->dev, "rx urb failed: %d\n", ++ urb->status); ++ /* fall through */ ++ case 0: ++ break; ++ } + +- if (mt7601u_urb_has_error(urb)) +- dev_err(dev->dev, "Error: RX urb failed:%d\n", urb->status); ++ spin_lock_irqsave(&dev->rx_lock, flags); + if (WARN_ONCE(q->e[q->end].urb != urb, "RX urb mismatch")) + goto out; + +@@ -220,14 +233,25 @@ static void mt7601u_complete_tx(struct urb *urb) + struct sk_buff *skb; + unsigned long flags; + +- spin_lock_irqsave(&dev->tx_lock, flags); ++ switch (urb->status) { ++ case -ECONNRESET: ++ case -ESHUTDOWN: ++ case -ENOENT: ++ return; ++ default: ++ dev_err_ratelimited(dev->dev, "tx urb failed: %d\n", ++ urb->status); ++ /* fall through */ ++ case 0: ++ break; ++ } + +- if (mt7601u_urb_has_error(urb)) +- dev_err(dev->dev, "Error: TX urb failed:%d\n", urb->status); ++ spin_lock_irqsave(&dev->tx_lock, flags); + if (WARN_ONCE(q->e[q->start].urb != urb, "TX urb mismatch")) + goto out; + + skb = q->e[q->start].skb; ++ q->e[q->start].skb = NULL; + trace_mt_tx_dma_done(dev, skb); + + __skb_queue_tail(&dev->tx_skb_done, skb); +@@ -355,19 +379,9 @@ int mt7601u_dma_enqueue_tx(struct mt7601u_dev *dev, struct sk_buff *skb, + static void mt7601u_kill_rx(struct mt7601u_dev *dev) + { + int i; +- unsigned long flags; +- +- spin_lock_irqsave(&dev->rx_lock, flags); +- +- for (i = 0; i < dev->rx_q.entries; i++) { +- int next = dev->rx_q.end; + +- spin_unlock_irqrestore(&dev->rx_lock, flags); +- usb_poison_urb(dev->rx_q.e[next].urb); +- spin_lock_irqsave(&dev->rx_lock, flags); +- } +- +- spin_unlock_irqrestore(&dev->rx_lock, flags); ++ for (i = 0; i < dev->rx_q.entries; i++) ++ usb_poison_urb(dev->rx_q.e[i].urb); + } + + static int mt7601u_submit_rx_buf(struct mt7601u_dev *dev, +@@ -437,10 +451,10 @@ static void mt7601u_free_tx_queue(struct mt7601u_tx_queue *q) + { + int i; + +- WARN_ON(q->used); +- + for (i = 0; i < q->entries; i++) { + usb_poison_urb(q->e[i].urb); ++ if (q->e[i].skb) ++ mt7601u_tx_status(q->dev, q->e[i].skb); + usb_free_urb(q->e[i].urb); + } + } +diff --git a/drivers/net/wireless/mediatek/mt7601u/tx.c b/drivers/net/wireless/mediatek/mt7601u/tx.c +index 906e19c5f628..f3dff8319a4c 100644 +--- a/drivers/net/wireless/mediatek/mt7601u/tx.c ++++ b/drivers/net/wireless/mediatek/mt7601u/tx.c +@@ -109,9 +109,9 @@ void mt7601u_tx_status(struct mt7601u_dev *dev, struct sk_buff *skb) + info->status.rates[0].idx = -1; + info->flags |= IEEE80211_TX_STAT_ACK; + +- spin_lock(&dev->mac_lock); ++ spin_lock_bh(&dev->mac_lock); + ieee80211_tx_status(dev->hw, skb); +- spin_unlock(&dev->mac_lock); ++ spin_unlock_bh(&dev->mac_lock); + } + + static int mt7601u_skb_rooms(struct mt7601u_dev *dev, struct sk_buff *skb) +diff --git a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c +index 67b81c7221c4..7e3a621b9c0d 100644 +--- a/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c ++++ b/drivers/net/wireless/ralink/rt2x00/rt2x00usb.c +@@ -372,14 +372,9 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) + struct queue_entry *entry = (struct queue_entry *)urb->context; + struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; + +- if (!test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) ++ if (!test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) + return; + +- /* +- * Report the frame as DMA done +- */ +- rt2x00lib_dmadone(entry); +- + /* + * Check if the received data is simply too small + * to be actually valid, or if the urb is signaling +@@ -388,6 +383,11 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) + if (urb->actual_length < entry->queue->desc_size || urb->status) + set_bit(ENTRY_DATA_IO_FAILED, &entry->flags); + ++ /* ++ * Report the frame as DMA done ++ */ ++ rt2x00lib_dmadone(entry); ++ + /* + * Schedule the delayed work for reading the RX status + * from the device. +diff --git a/drivers/net/wireless/realtek/rtlwifi/usb.c b/drivers/net/wireless/realtek/rtlwifi/usb.c +index e24fda5e9087..34d68dbf4b4c 100644 +--- a/drivers/net/wireless/realtek/rtlwifi/usb.c ++++ b/drivers/net/wireless/realtek/rtlwifi/usb.c +@@ -1064,13 +1064,13 @@ int rtl_usb_probe(struct usb_interface *intf, + rtlpriv->cfg->ops->read_eeprom_info(hw); + err = _rtl_usb_init(hw); + if (err) +- goto error_out; ++ goto error_out2; + rtl_usb_init_sw(hw); + /* Init mac80211 sw */ + err = rtl_init_core(hw); + if (err) { + pr_err("Can't allocate sw for mac80211\n"); +- goto error_out; ++ goto error_out2; + } + if (rtlpriv->cfg->ops->init_sw_vars(hw)) { + pr_err("Can't init_sw_vars\n"); +@@ -1091,6 +1091,7 @@ int rtl_usb_probe(struct usb_interface *intf, + + error_out: + rtl_deinit_core(hw); ++error_out2: + _rtl_usb_io_handler_release(hw); + usb_put_dev(udev); + complete(&rtlpriv->firmware_loading_complete); +diff --git a/drivers/nfc/nfcmrvl/main.c b/drivers/nfc/nfcmrvl/main.c +index e65d027b91fa..529be35ac178 100644 +--- a/drivers/nfc/nfcmrvl/main.c ++++ b/drivers/nfc/nfcmrvl/main.c +@@ -244,7 +244,7 @@ void nfcmrvl_chip_reset(struct nfcmrvl_private *priv) + /* Reset possible fault of previous session */ + clear_bit(NFCMRVL_PHY_ERROR, &priv->flags); + +- if (priv->config.reset_n_io) { ++ if (gpio_is_valid(priv->config.reset_n_io)) { + nfc_info(priv->dev, "reset the chip\n"); + gpio_set_value(priv->config.reset_n_io, 0); + usleep_range(5000, 10000); +@@ -255,7 +255,7 @@ void nfcmrvl_chip_reset(struct nfcmrvl_private *priv) + + void nfcmrvl_chip_halt(struct nfcmrvl_private *priv) + { +- if (priv->config.reset_n_io) ++ if (gpio_is_valid(priv->config.reset_n_io)) + gpio_set_value(priv->config.reset_n_io, 0); + } + +diff --git a/drivers/nfc/nfcmrvl/uart.c b/drivers/nfc/nfcmrvl/uart.c +index 9a22056e8d9e..e5a622ce4b95 100644 +--- a/drivers/nfc/nfcmrvl/uart.c ++++ b/drivers/nfc/nfcmrvl/uart.c +@@ -26,7 +26,7 @@ + static unsigned int hci_muxed; + static unsigned int flow_control; + static unsigned int break_control; +-static unsigned int reset_n_io; ++static int reset_n_io = -EINVAL; + + /* + ** NFCMRVL NCI OPS +@@ -231,5 +231,5 @@ MODULE_PARM_DESC(break_control, "Tell if UART driver must drive break signal."); + module_param(hci_muxed, uint, 0); + MODULE_PARM_DESC(hci_muxed, "Tell if transport is muxed in HCI one."); + +-module_param(reset_n_io, uint, 0); ++module_param(reset_n_io, int, 0); + MODULE_PARM_DESC(reset_n_io, "GPIO that is wired to RESET_N signal."); +diff --git a/drivers/nfc/nfcmrvl/usb.c b/drivers/nfc/nfcmrvl/usb.c +index 945cc903d8f1..888e298f610b 100644 +--- a/drivers/nfc/nfcmrvl/usb.c ++++ b/drivers/nfc/nfcmrvl/usb.c +@@ -305,6 +305,7 @@ static int nfcmrvl_probe(struct usb_interface *intf, + + /* No configuration for USB */ + memset(&config, 0, sizeof(config)); ++ config.reset_n_io = -EINVAL; + + nfc_info(&udev->dev, "intf %p id %p\n", intf, id); + +diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c +index 2dca3034fee0..df41f3571dc9 100644 +--- a/drivers/nvdimm/bus.c ++++ b/drivers/nvdimm/bus.c +@@ -73,7 +73,7 @@ static void nvdimm_bus_probe_end(struct nvdimm_bus *nvdimm_bus) + { + nvdimm_bus_lock(&nvdimm_bus->dev); + if (--nvdimm_bus->probe_active == 0) +- wake_up(&nvdimm_bus->probe_wait); ++ wake_up(&nvdimm_bus->wait); + nvdimm_bus_unlock(&nvdimm_bus->dev); + } + +@@ -341,7 +341,7 @@ struct nvdimm_bus *nvdimm_bus_register(struct device *parent, + return NULL; + INIT_LIST_HEAD(&nvdimm_bus->list); + INIT_LIST_HEAD(&nvdimm_bus->mapping_list); +- init_waitqueue_head(&nvdimm_bus->probe_wait); ++ init_waitqueue_head(&nvdimm_bus->wait); + nvdimm_bus->id = ida_simple_get(&nd_ida, 0, 0, GFP_KERNEL); + if (nvdimm_bus->id < 0) { + kfree(nvdimm_bus); +@@ -426,6 +426,9 @@ static int nd_bus_remove(struct device *dev) + list_del_init(&nvdimm_bus->list); + mutex_unlock(&nvdimm_bus_list_mutex); + ++ wait_event(nvdimm_bus->wait, ++ atomic_read(&nvdimm_bus->ioctl_active) == 0); ++ + nd_synchronize(); + device_for_each_child(&nvdimm_bus->dev, NULL, child_unregister); + +@@ -547,13 +550,38 @@ EXPORT_SYMBOL(nd_device_register); + + void nd_device_unregister(struct device *dev, enum nd_async_mode mode) + { ++ bool killed; ++ + switch (mode) { + case ND_ASYNC: ++ /* ++ * In the async case this is being triggered with the ++ * device lock held and the unregistration work needs to ++ * be moved out of line iff this is thread has won the ++ * race to schedule the deletion. ++ */ ++ if (!kill_device(dev)) ++ return; ++ + get_device(dev); + async_schedule_domain(nd_async_device_unregister, dev, + &nd_async_domain); + break; + case ND_SYNC: ++ /* ++ * In the sync case the device is being unregistered due ++ * to a state change of the parent. Claim the kill state ++ * to synchronize against other unregistration requests, ++ * or otherwise let the async path handle it if the ++ * unregistration was already queued. ++ */ ++ device_lock(dev); ++ killed = kill_device(dev); ++ device_unlock(dev); ++ ++ if (!killed) ++ return; ++ + nd_synchronize(); + device_unregister(dev); + break; +@@ -859,10 +887,12 @@ void wait_nvdimm_bus_probe_idle(struct device *dev) + do { + if (nvdimm_bus->probe_active == 0) + break; +- nvdimm_bus_unlock(&nvdimm_bus->dev); +- wait_event(nvdimm_bus->probe_wait, ++ nvdimm_bus_unlock(dev); ++ device_unlock(dev); ++ wait_event(nvdimm_bus->wait, + nvdimm_bus->probe_active == 0); +- nvdimm_bus_lock(&nvdimm_bus->dev); ++ device_lock(dev); ++ nvdimm_bus_lock(dev); + } while (true); + } + +@@ -945,20 +975,19 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, + int read_only, unsigned int ioctl_cmd, unsigned long arg) + { + struct nvdimm_bus_descriptor *nd_desc = nvdimm_bus->nd_desc; +- static char out_env[ND_CMD_MAX_ENVELOPE]; +- static char in_env[ND_CMD_MAX_ENVELOPE]; + const struct nd_cmd_desc *desc = NULL; + unsigned int cmd = _IOC_NR(ioctl_cmd); + struct device *dev = &nvdimm_bus->dev; + void __user *p = (void __user *) arg; ++ char *out_env = NULL, *in_env = NULL; + const char *cmd_name, *dimm_name; + u32 in_len = 0, out_len = 0; + unsigned int func = cmd; + unsigned long cmd_mask; + struct nd_cmd_pkg pkg; + int rc, i, cmd_rc; ++ void *buf = NULL; + u64 buf_len = 0; +- void *buf; + + if (nvdimm) { + desc = nd_cmd_dimm_desc(cmd); +@@ -989,7 +1018,7 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, + case ND_CMD_ARS_START: + case ND_CMD_CLEAR_ERROR: + case ND_CMD_CALL: +- dev_dbg(&nvdimm_bus->dev, "'%s' command while read-only.\n", ++ dev_dbg(dev, "'%s' command while read-only.\n", + nvdimm ? nvdimm_cmd_name(cmd) + : nvdimm_bus_cmd_name(cmd)); + return -EPERM; +@@ -998,6 +1027,9 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, + } + + /* process an input envelope */ ++ in_env = kzalloc(ND_CMD_MAX_ENVELOPE, GFP_KERNEL); ++ if (!in_env) ++ return -ENOMEM; + for (i = 0; i < desc->in_num; i++) { + u32 in_size, copy; + +@@ -1005,14 +1037,17 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, + if (in_size == UINT_MAX) { + dev_err(dev, "%s:%s unknown input size cmd: %s field: %d\n", + __func__, dimm_name, cmd_name, i); +- return -ENXIO; ++ rc = -ENXIO; ++ goto out; + } +- if (in_len < sizeof(in_env)) +- copy = min_t(u32, sizeof(in_env) - in_len, in_size); ++ if (in_len < ND_CMD_MAX_ENVELOPE) ++ copy = min_t(u32, ND_CMD_MAX_ENVELOPE - in_len, in_size); + else + copy = 0; +- if (copy && copy_from_user(&in_env[in_len], p + in_len, copy)) +- return -EFAULT; ++ if (copy && copy_from_user(&in_env[in_len], p + in_len, copy)) { ++ rc = -EFAULT; ++ goto out; ++ } + in_len += in_size; + } + +@@ -1024,6 +1059,12 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, + } + + /* process an output envelope */ ++ out_env = kzalloc(ND_CMD_MAX_ENVELOPE, GFP_KERNEL); ++ if (!out_env) { ++ rc = -ENOMEM; ++ goto out; ++ } ++ + for (i = 0; i < desc->out_num; i++) { + u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i, + (u32 *) in_env, (u32 *) out_env, 0); +@@ -1032,15 +1073,18 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, + if (out_size == UINT_MAX) { + dev_dbg(dev, "%s unknown output size cmd: %s field: %d\n", + dimm_name, cmd_name, i); +- return -EFAULT; ++ rc = -EFAULT; ++ goto out; + } +- if (out_len < sizeof(out_env)) +- copy = min_t(u32, sizeof(out_env) - out_len, out_size); ++ if (out_len < ND_CMD_MAX_ENVELOPE) ++ copy = min_t(u32, ND_CMD_MAX_ENVELOPE - out_len, out_size); + else + copy = 0; + if (copy && copy_from_user(&out_env[out_len], +- p + in_len + out_len, copy)) +- return -EFAULT; ++ p + in_len + out_len, copy)) { ++ rc = -EFAULT; ++ goto out; ++ } + out_len += out_size; + } + +@@ -1048,19 +1092,23 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, + if (buf_len > ND_IOCTL_MAX_BUFLEN) { + dev_dbg(dev, "%s cmd: %s buf_len: %llu > %d\n", dimm_name, + cmd_name, buf_len, ND_IOCTL_MAX_BUFLEN); +- return -EINVAL; ++ rc = -EINVAL; ++ goto out; + } + + buf = vmalloc(buf_len); +- if (!buf) +- return -ENOMEM; ++ if (!buf) { ++ rc = -ENOMEM; ++ goto out; ++ } + + if (copy_from_user(buf, p, buf_len)) { + rc = -EFAULT; + goto out; + } + +- nvdimm_bus_lock(&nvdimm_bus->dev); ++ device_lock(dev); ++ nvdimm_bus_lock(dev); + rc = nd_cmd_clear_to_send(nvdimm_bus, nvdimm, func, buf); + if (rc) + goto out_unlock; +@@ -1075,39 +1123,24 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, + nvdimm_account_cleared_poison(nvdimm_bus, clear_err->address, + clear_err->cleared); + } +- nvdimm_bus_unlock(&nvdimm_bus->dev); + + if (copy_to_user(p, buf, buf_len)) + rc = -EFAULT; + +- vfree(buf); +- return rc; +- +- out_unlock: +- nvdimm_bus_unlock(&nvdimm_bus->dev); +- out: ++out_unlock: ++ nvdimm_bus_unlock(dev); ++ device_unlock(dev); ++out: ++ kfree(in_env); ++ kfree(out_env); + vfree(buf); + return rc; + } + +-static long nd_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +-{ +- long id = (long) file->private_data; +- int rc = -ENXIO, ro; +- struct nvdimm_bus *nvdimm_bus; +- +- ro = ((file->f_flags & O_ACCMODE) == O_RDONLY); +- mutex_lock(&nvdimm_bus_list_mutex); +- list_for_each_entry(nvdimm_bus, &nvdimm_bus_list, list) { +- if (nvdimm_bus->id == id) { +- rc = __nd_ioctl(nvdimm_bus, NULL, ro, cmd, arg); +- break; +- } +- } +- mutex_unlock(&nvdimm_bus_list_mutex); +- +- return rc; +-} ++enum nd_ioctl_mode { ++ BUS_IOCTL, ++ DIMM_IOCTL, ++}; + + static int match_dimm(struct device *dev, void *data) + { +@@ -1122,31 +1155,62 @@ static int match_dimm(struct device *dev, void *data) + return 0; + } + +-static long nvdimm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ++static long nd_ioctl(struct file *file, unsigned int cmd, unsigned long arg, ++ enum nd_ioctl_mode mode) ++ + { +- int rc = -ENXIO, ro; +- struct nvdimm_bus *nvdimm_bus; ++ struct nvdimm_bus *nvdimm_bus, *found = NULL; ++ long id = (long) file->private_data; ++ struct nvdimm *nvdimm = NULL; ++ int rc, ro; + + ro = ((file->f_flags & O_ACCMODE) == O_RDONLY); + mutex_lock(&nvdimm_bus_list_mutex); + list_for_each_entry(nvdimm_bus, &nvdimm_bus_list, list) { +- struct device *dev = device_find_child(&nvdimm_bus->dev, +- file->private_data, match_dimm); +- struct nvdimm *nvdimm; +- +- if (!dev) +- continue; ++ if (mode == DIMM_IOCTL) { ++ struct device *dev; ++ ++ dev = device_find_child(&nvdimm_bus->dev, ++ file->private_data, match_dimm); ++ if (!dev) ++ continue; ++ nvdimm = to_nvdimm(dev); ++ found = nvdimm_bus; ++ } else if (nvdimm_bus->id == id) { ++ found = nvdimm_bus; ++ } + +- nvdimm = to_nvdimm(dev); +- rc = __nd_ioctl(nvdimm_bus, nvdimm, ro, cmd, arg); +- put_device(dev); +- break; ++ if (found) { ++ atomic_inc(&nvdimm_bus->ioctl_active); ++ break; ++ } + } + mutex_unlock(&nvdimm_bus_list_mutex); + ++ if (!found) ++ return -ENXIO; ++ ++ nvdimm_bus = found; ++ rc = __nd_ioctl(nvdimm_bus, nvdimm, ro, cmd, arg); ++ ++ if (nvdimm) ++ put_device(&nvdimm->dev); ++ if (atomic_dec_and_test(&nvdimm_bus->ioctl_active)) ++ wake_up(&nvdimm_bus->wait); ++ + return rc; + } + ++static long bus_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ return nd_ioctl(file, cmd, arg, BUS_IOCTL); ++} ++ ++static long dimm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ return nd_ioctl(file, cmd, arg, DIMM_IOCTL); ++} ++ + static int nd_open(struct inode *inode, struct file *file) + { + long minor = iminor(inode); +@@ -1158,16 +1222,16 @@ static int nd_open(struct inode *inode, struct file *file) + static const struct file_operations nvdimm_bus_fops = { + .owner = THIS_MODULE, + .open = nd_open, +- .unlocked_ioctl = nd_ioctl, +- .compat_ioctl = nd_ioctl, ++ .unlocked_ioctl = bus_ioctl, ++ .compat_ioctl = bus_ioctl, + .llseek = noop_llseek, + }; + + static const struct file_operations nvdimm_fops = { + .owner = THIS_MODULE, + .open = nd_open, +- .unlocked_ioctl = nvdimm_ioctl, +- .compat_ioctl = nvdimm_ioctl, ++ .unlocked_ioctl = dimm_ioctl, ++ .compat_ioctl = dimm_ioctl, + .llseek = noop_llseek, + }; + +diff --git a/drivers/nvdimm/dax_devs.c b/drivers/nvdimm/dax_devs.c +index 49fc18ee0565..6d22b0f83b3b 100644 +--- a/drivers/nvdimm/dax_devs.c ++++ b/drivers/nvdimm/dax_devs.c +@@ -118,7 +118,7 @@ int nd_dax_probe(struct device *dev, struct nd_namespace_common *ndns) + nvdimm_bus_unlock(&ndns->dev); + if (!dax_dev) + return -ENOMEM; +- pfn_sb = devm_kzalloc(dev, sizeof(*pfn_sb), GFP_KERNEL); ++ pfn_sb = devm_kmalloc(dev, sizeof(*pfn_sb), GFP_KERNEL); + nd_pfn->pfn_sb = pfn_sb; + rc = nd_pfn_validate(nd_pfn, DAX_SIG); + dev_dbg(dev, "dax: %s\n", rc == 0 ? dev_name(dax_dev) : ""); +diff --git a/drivers/nvdimm/nd-core.h b/drivers/nvdimm/nd-core.h +index 391e88de3a29..6cd470547106 100644 +--- a/drivers/nvdimm/nd-core.h ++++ b/drivers/nvdimm/nd-core.h +@@ -17,10 +17,11 @@ extern struct workqueue_struct *nvdimm_wq; + + struct nvdimm_bus { + struct nvdimm_bus_descriptor *nd_desc; +- wait_queue_head_t probe_wait; ++ wait_queue_head_t wait; + struct list_head list; + struct device dev; + int id, probe_active; ++ atomic_t ioctl_active; + struct list_head mapping_list; + struct mutex reconfig_mutex; + struct badrange badrange; +diff --git a/drivers/nvdimm/pfn.h b/drivers/nvdimm/pfn.h +index f58b849e455b..dfb2bcda8f5a 100644 +--- a/drivers/nvdimm/pfn.h ++++ b/drivers/nvdimm/pfn.h +@@ -28,6 +28,7 @@ struct nd_pfn_sb { + __le32 end_trunc; + /* minor-version-2 record the base alignment of the mapping */ + __le32 align; ++ /* minor-version-3 guarantee the padding and flags are zero */ + u8 padding[4000]; + __le64 checksum; + }; +diff --git a/drivers/nvdimm/pfn_devs.c b/drivers/nvdimm/pfn_devs.c +index 0f81fc56bbfd..4977424693b0 100644 +--- a/drivers/nvdimm/pfn_devs.c ++++ b/drivers/nvdimm/pfn_devs.c +@@ -412,6 +412,15 @@ static int nd_pfn_clear_memmap_errors(struct nd_pfn *nd_pfn) + return 0; + } + ++/** ++ * nd_pfn_validate - read and validate info-block ++ * @nd_pfn: fsdax namespace runtime state / properties ++ * @sig: 'devdax' or 'fsdax' signature ++ * ++ * Upon return the info-block buffer contents (->pfn_sb) are ++ * indeterminate when validation fails, and a coherent info-block ++ * otherwise. ++ */ + int nd_pfn_validate(struct nd_pfn *nd_pfn, const char *sig) + { + u64 checksum, offset; +@@ -557,7 +566,7 @@ int nd_pfn_probe(struct device *dev, struct nd_namespace_common *ndns) + nvdimm_bus_unlock(&ndns->dev); + if (!pfn_dev) + return -ENOMEM; +- pfn_sb = devm_kzalloc(dev, sizeof(*pfn_sb), GFP_KERNEL); ++ pfn_sb = devm_kmalloc(dev, sizeof(*pfn_sb), GFP_KERNEL); + nd_pfn = to_nd_pfn(pfn_dev); + nd_pfn->pfn_sb = pfn_sb; + rc = nd_pfn_validate(nd_pfn, PFN_SIG); +@@ -694,7 +703,7 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn) + u64 checksum; + int rc; + +- pfn_sb = devm_kzalloc(&nd_pfn->dev, sizeof(*pfn_sb), GFP_KERNEL); ++ pfn_sb = devm_kmalloc(&nd_pfn->dev, sizeof(*pfn_sb), GFP_KERNEL); + if (!pfn_sb) + return -ENOMEM; + +@@ -703,11 +712,14 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn) + sig = DAX_SIG; + else + sig = PFN_SIG; ++ + rc = nd_pfn_validate(nd_pfn, sig); + if (rc != -ENODEV) + return rc; + + /* no info block, do init */; ++ memset(pfn_sb, 0, sizeof(*pfn_sb)); ++ + nd_region = to_nd_region(nd_pfn->dev.parent); + if (nd_region->ro) { + dev_info(&nd_pfn->dev, +@@ -760,7 +772,7 @@ static int nd_pfn_init(struct nd_pfn *nd_pfn) + memcpy(pfn_sb->uuid, nd_pfn->uuid, 16); + memcpy(pfn_sb->parent_uuid, nd_dev_to_uuid(&ndns->dev), 16); + pfn_sb->version_major = cpu_to_le16(1); +- pfn_sb->version_minor = cpu_to_le16(2); ++ pfn_sb->version_minor = cpu_to_le16(3); + pfn_sb->start_pad = cpu_to_le32(start_pad); + pfn_sb->end_trunc = cpu_to_le32(end_trunc); + pfn_sb->align = cpu_to_le32(nd_pfn->align); +diff --git a/drivers/nvdimm/region.c b/drivers/nvdimm/region.c +index ef46cc3a71ae..488c47ac4c4a 100644 +--- a/drivers/nvdimm/region.c ++++ b/drivers/nvdimm/region.c +@@ -34,17 +34,6 @@ static int nd_region_probe(struct device *dev) + if (rc) + return rc; + +- rc = nd_region_register_namespaces(nd_region, &err); +- if (rc < 0) +- return rc; +- +- ndrd = dev_get_drvdata(dev); +- ndrd->ns_active = rc; +- ndrd->ns_count = rc + err; +- +- if (rc && err && rc == err) +- return -ENODEV; +- + if (is_nd_pmem(&nd_region->dev)) { + struct resource ndr_res; + +@@ -60,6 +49,17 @@ static int nd_region_probe(struct device *dev) + nvdimm_badblocks_populate(nd_region, &nd_region->bb, &ndr_res); + } + ++ rc = nd_region_register_namespaces(nd_region, &err); ++ if (rc < 0) ++ return rc; ++ ++ ndrd = dev_get_drvdata(dev); ++ ndrd->ns_active = rc; ++ ndrd->ns_count = rc + err; ++ ++ if (rc && err && rc == err) ++ return -ENODEV; ++ + nd_region->btt_seed = nd_btt_create(nd_region); + nd_region->pfn_seed = nd_pfn_create(nd_region); + nd_region->dax_seed = nd_dax_create(nd_region); +diff --git a/drivers/nvdimm/region_devs.c b/drivers/nvdimm/region_devs.c +index 4fed9ce9c2fe..a15276cdec7d 100644 +--- a/drivers/nvdimm/region_devs.c ++++ b/drivers/nvdimm/region_devs.c +@@ -422,10 +422,12 @@ static ssize_t available_size_show(struct device *dev, + * memory nvdimm_bus_lock() is dropped, but that's userspace's + * problem to not race itself. + */ ++ device_lock(dev); + nvdimm_bus_lock(dev); + wait_nvdimm_bus_probe_idle(dev); + available = nd_region_available_dpa(nd_region); + nvdimm_bus_unlock(dev); ++ device_unlock(dev); + + return sprintf(buf, "%llu\n", available); + } +@@ -437,10 +439,12 @@ static ssize_t max_available_extent_show(struct device *dev, + struct nd_region *nd_region = to_nd_region(dev); + unsigned long long available = 0; + ++ device_lock(dev); + nvdimm_bus_lock(dev); + wait_nvdimm_bus_probe_idle(dev); + available = nd_region_allocatable_dpa(nd_region); + nvdimm_bus_unlock(dev); ++ device_unlock(dev); + + return sprintf(buf, "%llu\n", available); + } +diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c +index 120fb593d1da..5deb4deb3820 100644 +--- a/drivers/nvme/host/core.c ++++ b/drivers/nvme/host/core.c +@@ -11,6 +11,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -2263,17 +2264,15 @@ static void nvme_init_subnqn(struct nvme_subsystem *subsys, struct nvme_ctrl *ct + memset(subsys->subnqn + off, 0, sizeof(subsys->subnqn) - off); + } + +-static void __nvme_release_subsystem(struct nvme_subsystem *subsys) ++static void nvme_release_subsystem(struct device *dev) + { ++ struct nvme_subsystem *subsys = ++ container_of(dev, struct nvme_subsystem, dev); ++ + ida_simple_remove(&nvme_subsystems_ida, subsys->instance); + kfree(subsys); + } + +-static void nvme_release_subsystem(struct device *dev) +-{ +- __nvme_release_subsystem(container_of(dev, struct nvme_subsystem, dev)); +-} +- + static void nvme_destroy_subsystem(struct kref *ref) + { + struct nvme_subsystem *subsys = +@@ -2428,7 +2427,7 @@ static int nvme_init_subsystem(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id) + mutex_lock(&nvme_subsystems_lock); + found = __nvme_find_get_subsystem(subsys->subnqn); + if (found) { +- __nvme_release_subsystem(subsys); ++ put_device(&subsys->dev); + subsys = found; + + if (!nvme_validate_cntlid(subsys, ctrl, id)) { +@@ -3256,6 +3255,10 @@ static int nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid) + goto out_free_ns; + } + ++ if (ctrl->opts && ctrl->opts->data_digest) ++ ns->queue->backing_dev_info->capabilities ++ |= BDI_CAP_STABLE_WRITES; ++ + blk_queue_flag_set(QUEUE_FLAG_NONROT, ns->queue); + if (ctrl->ops->flags & NVME_F_PCI_P2PDMA) + blk_queue_flag_set(QUEUE_FLAG_PCI_P2PDMA, ns->queue); +@@ -3344,6 +3347,14 @@ static void nvme_ns_remove(struct nvme_ns *ns) + return; + + nvme_fault_inject_fini(ns); ++ ++ mutex_lock(&ns->ctrl->subsys->lock); ++ list_del_rcu(&ns->siblings); ++ mutex_unlock(&ns->ctrl->subsys->lock); ++ synchronize_rcu(); /* guarantee not available in head->list */ ++ nvme_mpath_clear_current_path(ns); ++ synchronize_srcu(&ns->head->srcu); /* wait for concurrent submissions */ ++ + if (ns->disk && ns->disk->flags & GENHD_FL_UP) { + del_gendisk(ns->disk); + blk_cleanup_queue(ns->queue); +@@ -3351,16 +3362,10 @@ static void nvme_ns_remove(struct nvme_ns *ns) + blk_integrity_unregister(ns->disk); + } + +- mutex_lock(&ns->ctrl->subsys->lock); +- list_del_rcu(&ns->siblings); +- nvme_mpath_clear_current_path(ns); +- mutex_unlock(&ns->ctrl->subsys->lock); +- + down_write(&ns->ctrl->namespaces_rwsem); + list_del_init(&ns->list); + up_write(&ns->ctrl->namespaces_rwsem); + +- synchronize_srcu(&ns->head->srcu); + nvme_mpath_check_last_path(ns); + nvme_put_ns(ns); + } +diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c +index 499acf07d61a..e942b3e84068 100644 +--- a/drivers/nvme/host/multipath.c ++++ b/drivers/nvme/host/multipath.c +@@ -12,11 +12,6 @@ module_param(multipath, bool, 0444); + MODULE_PARM_DESC(multipath, + "turn on native support for multiple controllers per subsystem"); + +-inline bool nvme_ctrl_use_ana(struct nvme_ctrl *ctrl) +-{ +- return multipath && ctrl->subsys && (ctrl->subsys->cmic & (1 << 3)); +-} +- + /* + * If multipathing is enabled we need to always use the subsystem instance + * number for numbering our devices to avoid conflicts between subsystems that +@@ -614,7 +609,8 @@ int nvme_mpath_init(struct nvme_ctrl *ctrl, struct nvme_id_ctrl *id) + { + int error; + +- if (!nvme_ctrl_use_ana(ctrl)) ++ /* check if multipath is enabled and we have the capability */ ++ if (!multipath || !ctrl->subsys || !(ctrl->subsys->cmic & (1 << 3))) + return 0; + + ctrl->anacap = id->anacap; +diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h +index 55553d293a98..7391cd0a7739 100644 +--- a/drivers/nvme/host/nvme.h ++++ b/drivers/nvme/host/nvme.h +@@ -472,7 +472,11 @@ extern const struct attribute_group *nvme_ns_id_attr_groups[]; + extern const struct block_device_operations nvme_ns_head_ops; + + #ifdef CONFIG_NVME_MULTIPATH +-bool nvme_ctrl_use_ana(struct nvme_ctrl *ctrl); ++static inline bool nvme_ctrl_use_ana(struct nvme_ctrl *ctrl) ++{ ++ return ctrl->ana_log_buf != NULL; ++} ++ + void nvme_set_disk_name(char *disk_name, struct nvme_ns *ns, + struct nvme_ctrl *ctrl, int *flags); + void nvme_failover_req(struct request *req); +diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c +index 524d6bd6d095..f9959eaaa185 100644 +--- a/drivers/nvme/host/pci.c ++++ b/drivers/nvme/host/pci.c +@@ -1456,11 +1456,15 @@ static int nvme_alloc_sq_cmds(struct nvme_dev *dev, struct nvme_queue *nvmeq, + + if (qid && dev->cmb_use_sqes && (dev->cmbsz & NVME_CMBSZ_SQS)) { + nvmeq->sq_cmds = pci_alloc_p2pmem(pdev, SQ_SIZE(depth)); +- nvmeq->sq_dma_addr = pci_p2pmem_virt_to_bus(pdev, +- nvmeq->sq_cmds); +- if (nvmeq->sq_dma_addr) { +- set_bit(NVMEQ_SQ_CMB, &nvmeq->flags); +- return 0; ++ if (nvmeq->sq_cmds) { ++ nvmeq->sq_dma_addr = pci_p2pmem_virt_to_bus(pdev, ++ nvmeq->sq_cmds); ++ if (nvmeq->sq_dma_addr) { ++ set_bit(NVMEQ_SQ_CMB, &nvmeq->flags); ++ return 0; ++ } ++ ++ pci_free_p2pmem(pdev, nvmeq->sq_cmds, SQ_SIZE(depth)); + } + } + +@@ -2068,6 +2072,7 @@ static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) + .priv = dev, + }; + unsigned int irq_queues, this_p_queues; ++ unsigned int nr_cpus = num_possible_cpus(); + + /* + * Poll queues don't need interrupts, but we need at least one IO +@@ -2078,7 +2083,10 @@ static int nvme_setup_irqs(struct nvme_dev *dev, unsigned int nr_io_queues) + this_p_queues = nr_io_queues - 1; + irq_queues = 1; + } else { +- irq_queues = nr_io_queues - this_p_queues + 1; ++ if (nr_cpus < nr_io_queues - this_p_queues) ++ irq_queues = nr_cpus + 1; ++ else ++ irq_queues = nr_io_queues - this_p_queues + 1; + } + dev->io_queues[HCTX_TYPE_POLL] = this_p_queues; + +@@ -2480,11 +2488,13 @@ static void nvme_reset_work(struct work_struct *work) + struct nvme_dev *dev = + container_of(work, struct nvme_dev, ctrl.reset_work); + bool was_suspend = !!(dev->ctrl.ctrl_config & NVME_CC_SHN_NORMAL); +- int result = -ENODEV; ++ int result; + enum nvme_ctrl_state new_state = NVME_CTRL_LIVE; + +- if (WARN_ON(dev->ctrl.state != NVME_CTRL_RESETTING)) ++ if (WARN_ON(dev->ctrl.state != NVME_CTRL_RESETTING)) { ++ result = -ENODEV; + goto out; ++ } + + /* + * If we're called to reset a live controller first shut it down before +@@ -2511,7 +2521,8 @@ static void nvme_reset_work(struct work_struct *work) + * Limit the max command size to prevent iod->sg allocations going + * over a single page. + */ +- dev->ctrl.max_hw_sectors = NVME_MAX_KB_SZ << 1; ++ dev->ctrl.max_hw_sectors = min_t(u32, ++ NVME_MAX_KB_SZ << 1, dma_max_mapping_size(dev->dev) >> 9); + dev->ctrl.max_segments = NVME_MAX_SEGS; + + /* +@@ -2528,6 +2539,7 @@ static void nvme_reset_work(struct work_struct *work) + if (!nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_CONNECTING)) { + dev_warn(dev->ctrl.device, + "failed to mark controller CONNECTING\n"); ++ result = -EBUSY; + goto out; + } + +@@ -2588,6 +2600,7 @@ static void nvme_reset_work(struct work_struct *work) + if (!nvme_change_ctrl_state(&dev->ctrl, new_state)) { + dev_warn(dev->ctrl.device, + "failed to mark controller state %d\n", new_state); ++ result = -ENODEV; + goto out; + } + +@@ -2946,6 +2959,8 @@ static const struct pci_device_id nvme_id_table[] = { + .driver_data = NVME_QUIRK_LIGHTNVM, }, + { PCI_DEVICE(0x1d1d, 0x2601), /* CNEX Granby */ + .driver_data = NVME_QUIRK_LIGHTNVM, }, ++ { PCI_DEVICE(0x10ec, 0x5762), /* ADATA SX6000LNP */ ++ .driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN, }, + { PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_EXPRESS, 0xffffff) }, + { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2001) }, + { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2003) }, +diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c +index 08a2501b9357..606b13d35d16 100644 +--- a/drivers/nvme/host/tcp.c ++++ b/drivers/nvme/host/tcp.c +@@ -860,7 +860,14 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req) + else + flags |= MSG_MORE; + +- ret = kernel_sendpage(queue->sock, page, offset, len, flags); ++ /* can't zcopy slab pages */ ++ if (unlikely(PageSlab(page))) { ++ ret = sock_no_sendpage(queue->sock, page, offset, len, ++ flags); ++ } else { ++ ret = kernel_sendpage(queue->sock, page, offset, len, ++ flags); ++ } + if (ret <= 0) + return ret; + +diff --git a/drivers/opp/core.c b/drivers/opp/core.c +index 3a9789388bfb..6b2f7cadec3c 100644 +--- a/drivers/opp/core.c ++++ b/drivers/opp/core.c +@@ -682,7 +682,7 @@ static int _set_opp_custom(const struct opp_table *opp_table, + + data->old_opp.rate = old_freq; + size = sizeof(*old_supply) * opp_table->regulator_count; +- if (IS_ERR(old_supply)) ++ if (!old_supply) + memset(data->old_opp.supplies, 0, size); + else + memcpy(data->old_opp.supplies, old_supply, size); +diff --git a/drivers/parport/ieee1284.c b/drivers/parport/ieee1284.c +index 90fb73575495..c94048b048a5 100644 +--- a/drivers/parport/ieee1284.c ++++ b/drivers/parport/ieee1284.c +@@ -208,7 +208,7 @@ int parport_wait_peripheral(struct parport *port, + /* parport_wait_event didn't time out, but the + * peripheral wasn't actually ready either. + * Wait for another 10ms. */ +- schedule_timeout_interruptible(msecs_to_jiffies(10)); ++ schedule_msec_hrtimeout_interruptible((10)); + } + } + +diff --git a/drivers/parport/ieee1284_ops.c b/drivers/parport/ieee1284_ops.c +index 5d41dda6da4e..34705f6b423f 100644 +--- a/drivers/parport/ieee1284_ops.c ++++ b/drivers/parport/ieee1284_ops.c +@@ -537,7 +537,7 @@ size_t parport_ieee1284_ecp_read_data (struct parport *port, + /* Yield the port for a while. */ + if (count && dev->port->irq != PARPORT_IRQ_NONE) { + parport_release (dev); +- schedule_timeout_interruptible(msecs_to_jiffies(40)); ++ schedule_msec_hrtimeout_interruptible((40)); + parport_claim_or_block (dev); + } + else +diff --git a/drivers/pci/controller/dwc/pci-dra7xx.c b/drivers/pci/controller/dwc/pci-dra7xx.c +index 419451efd58c..4234ddb4722f 100644 +--- a/drivers/pci/controller/dwc/pci-dra7xx.c ++++ b/drivers/pci/controller/dwc/pci-dra7xx.c +@@ -26,6 +26,7 @@ + #include + #include + #include ++#include + + #include "../../pci.h" + #include "pcie-designware.h" +diff --git a/drivers/pci/controller/dwc/pcie-qcom.c b/drivers/pci/controller/dwc/pcie-qcom.c +index 0ed235d560e3..5d1713069d14 100644 +--- a/drivers/pci/controller/dwc/pcie-qcom.c ++++ b/drivers/pci/controller/dwc/pcie-qcom.c +@@ -178,6 +178,8 @@ static void qcom_ep_reset_assert(struct qcom_pcie *pcie) + + static void qcom_ep_reset_deassert(struct qcom_pcie *pcie) + { ++ /* Ensure that PERST has been asserted for at least 100 ms */ ++ msleep(100); + gpiod_set_value_cansleep(pcie->reset, 0); + usleep_range(PERST_DELAY_US, PERST_DELAY_US + 500); + } +diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c +index 82acd6155adf..40b625458afa 100644 +--- a/drivers/pci/controller/pci-hyperv.c ++++ b/drivers/pci/controller/pci-hyperv.c +@@ -1875,6 +1875,7 @@ static void hv_pci_devices_present(struct hv_pcibus_device *hbus, + static void hv_eject_device_work(struct work_struct *work) + { + struct pci_eject_response *ejct_pkt; ++ struct hv_pcibus_device *hbus; + struct hv_pci_dev *hpdev; + struct pci_dev *pdev; + unsigned long flags; +@@ -1885,6 +1886,7 @@ static void hv_eject_device_work(struct work_struct *work) + } ctxt; + + hpdev = container_of(work, struct hv_pci_dev, wrk); ++ hbus = hpdev->hbus; + + WARN_ON(hpdev->state != hv_pcichild_ejecting); + +@@ -1895,8 +1897,7 @@ static void hv_eject_device_work(struct work_struct *work) + * because hbus->pci_bus may not exist yet. + */ + wslot = wslot_to_devfn(hpdev->desc.win_slot.slot); +- pdev = pci_get_domain_bus_and_slot(hpdev->hbus->sysdata.domain, 0, +- wslot); ++ pdev = pci_get_domain_bus_and_slot(hbus->sysdata.domain, 0, wslot); + if (pdev) { + pci_lock_rescan_remove(); + pci_stop_and_remove_bus_device(pdev); +@@ -1904,9 +1905,9 @@ static void hv_eject_device_work(struct work_struct *work) + pci_unlock_rescan_remove(); + } + +- spin_lock_irqsave(&hpdev->hbus->device_list_lock, flags); ++ spin_lock_irqsave(&hbus->device_list_lock, flags); + list_del(&hpdev->list_entry); +- spin_unlock_irqrestore(&hpdev->hbus->device_list_lock, flags); ++ spin_unlock_irqrestore(&hbus->device_list_lock, flags); + + if (hpdev->pci_slot) + pci_destroy_slot(hpdev->pci_slot); +@@ -1915,7 +1916,7 @@ static void hv_eject_device_work(struct work_struct *work) + ejct_pkt = (struct pci_eject_response *)&ctxt.pkt.message; + ejct_pkt->message_type.type = PCI_EJECTION_COMPLETE; + ejct_pkt->wslot.slot = hpdev->desc.win_slot.slot; +- vmbus_sendpacket(hpdev->hbus->hdev->channel, ejct_pkt, ++ vmbus_sendpacket(hbus->hdev->channel, ejct_pkt, + sizeof(*ejct_pkt), (unsigned long)&ctxt.pkt, + VM_PKT_DATA_INBAND, 0); + +@@ -1924,7 +1925,9 @@ static void hv_eject_device_work(struct work_struct *work) + /* For the two refs got in new_pcichild_device() */ + put_pcichild(hpdev); + put_pcichild(hpdev); +- put_hvpcibus(hpdev->hbus); ++ /* hpdev has been freed. Do not use it any more. */ ++ ++ put_hvpcibus(hbus); + } + + /** +diff --git a/drivers/pci/controller/pcie-mobiveil.c b/drivers/pci/controller/pcie-mobiveil.c +index 77052a0712d0..387a20f3c240 100644 +--- a/drivers/pci/controller/pcie-mobiveil.c ++++ b/drivers/pci/controller/pcie-mobiveil.c +@@ -501,6 +501,12 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) + return err; + } + ++ /* setup bus numbers */ ++ value = csr_readl(pcie, PCI_PRIMARY_BUS); ++ value &= 0xff000000; ++ value |= 0x00ff0100; ++ csr_writel(pcie, value, PCI_PRIMARY_BUS); ++ + /* + * program Bus Master Enable Bit in Command Register in PAB Config + * Space +@@ -540,7 +546,7 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) + resource_size(pcie->ob_io_res)); + + /* memory inbound translation window */ +- program_ib_windows(pcie, WIN_NUM_1, 0, MEM_WINDOW_TYPE, IB_WIN_SIZE); ++ program_ib_windows(pcie, WIN_NUM_0, 0, MEM_WINDOW_TYPE, IB_WIN_SIZE); + + /* Get the I/O and memory ranges from DT */ + resource_list_for_each_entry_safe(win, tmp, &pcie->resources) { +@@ -552,11 +558,18 @@ static int mobiveil_host_init(struct mobiveil_pcie *pcie) + if (type) { + /* configure outbound translation window */ + program_ob_windows(pcie, pcie->ob_wins_configured, +- win->res->start, 0, type, +- resource_size(win->res)); ++ win->res->start, ++ win->res->start - win->offset, ++ type, resource_size(win->res)); + } + } + ++ /* fixup for PCIe class register */ ++ value = csr_readl(pcie, PAB_INTP_AXI_PIO_CLASS); ++ value &= 0xff; ++ value |= (PCI_CLASS_BRIDGE_PCI << 16); ++ csr_writel(pcie, value, PAB_INTP_AXI_PIO_CLASS); ++ + /* setup MSI hardware registers */ + mobiveil_pcie_enable_msi(pcie); + +@@ -797,9 +810,6 @@ static int mobiveil_pcie_probe(struct platform_device *pdev) + goto error; + } + +- /* fixup for PCIe class register */ +- csr_writel(pcie, 0x060402ab, PAB_INTP_AXI_PIO_CLASS); +- + /* initialize the IRQ domains */ + ret = mobiveil_pcie_init_irq_domain(pcie); + if (ret) { +diff --git a/drivers/pci/controller/pcie-xilinx-nwl.c b/drivers/pci/controller/pcie-xilinx-nwl.c +index 3b031f00a94a..45c0f344ccd1 100644 +--- a/drivers/pci/controller/pcie-xilinx-nwl.c ++++ b/drivers/pci/controller/pcie-xilinx-nwl.c +@@ -482,15 +482,13 @@ static int nwl_irq_domain_alloc(struct irq_domain *domain, unsigned int virq, + int i; + + mutex_lock(&msi->lock); +- bit = bitmap_find_next_zero_area(msi->bitmap, INT_PCI_MSI_NR, 0, +- nr_irqs, 0); +- if (bit >= INT_PCI_MSI_NR) { ++ bit = bitmap_find_free_region(msi->bitmap, INT_PCI_MSI_NR, ++ get_count_order(nr_irqs)); ++ if (bit < 0) { + mutex_unlock(&msi->lock); + return -ENOSPC; + } + +- bitmap_set(msi->bitmap, bit, nr_irqs); +- + for (i = 0; i < nr_irqs; i++) { + irq_domain_set_info(domain, virq + i, bit + i, &nwl_irq_chip, + domain->host_data, handle_simple_irq, +@@ -508,7 +506,8 @@ static void nwl_irq_domain_free(struct irq_domain *domain, unsigned int virq, + struct nwl_msi *msi = &pcie->msi; + + mutex_lock(&msi->lock); +- bitmap_clear(msi->bitmap, data->hwirq, nr_irqs); ++ bitmap_release_region(msi->bitmap, data->hwirq, ++ get_count_order(nr_irqs)); + mutex_unlock(&msi->lock); + } + +diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c b/drivers/pci/endpoint/functions/pci-epf-test.c +index 27806987e93b..7d41e6684b87 100644 +--- a/drivers/pci/endpoint/functions/pci-epf-test.c ++++ b/drivers/pci/endpoint/functions/pci-epf-test.c +@@ -434,10 +434,16 @@ static int pci_epf_test_alloc_space(struct pci_epf *epf) + int bar; + enum pci_barno test_reg_bar = epf_test->test_reg_bar; + const struct pci_epc_features *epc_features; ++ size_t test_reg_size; + + epc_features = epf_test->epc_features; + +- base = pci_epf_alloc_space(epf, sizeof(struct pci_epf_test_reg), ++ if (epc_features->bar_fixed_size[test_reg_bar]) ++ test_reg_size = bar_size[test_reg_bar]; ++ else ++ test_reg_size = sizeof(struct pci_epf_test_reg); ++ ++ base = pci_epf_alloc_space(epf, test_reg_size, + test_reg_bar, epc_features->align); + if (!base) { + dev_err(dev, "Failed to allocated register space\n"); +diff --git a/drivers/pci/of.c b/drivers/pci/of.c +index 73d5adec0a28..bc7b27a28795 100644 +--- a/drivers/pci/of.c ++++ b/drivers/pci/of.c +@@ -22,12 +22,15 @@ void pci_set_of_node(struct pci_dev *dev) + return; + dev->dev.of_node = of_pci_find_child_device(dev->bus->dev.of_node, + dev->devfn); ++ if (dev->dev.of_node) ++ dev->dev.fwnode = &dev->dev.of_node->fwnode; + } + + void pci_release_of_node(struct pci_dev *dev) + { + of_node_put(dev->dev.of_node); + dev->dev.of_node = NULL; ++ dev->dev.fwnode = NULL; + } + + void pci_set_bus_of_node(struct pci_bus *bus) +@@ -41,13 +44,18 @@ void pci_set_bus_of_node(struct pci_bus *bus) + if (node && of_property_read_bool(node, "external-facing")) + bus->self->untrusted = true; + } ++ + bus->dev.of_node = node; ++ ++ if (bus->dev.of_node) ++ bus->dev.fwnode = &bus->dev.of_node->fwnode; + } + + void pci_release_bus_of_node(struct pci_bus *bus) + { + of_node_put(bus->dev.of_node); + bus->dev.of_node = NULL; ++ bus->dev.fwnode = NULL; + } + + struct device_node * __weak pcibios_get_phb_of_node(struct pci_bus *bus) +diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c +index ca3793002e2f..74c3df250d9c 100644 +--- a/drivers/pci/pci-driver.c ++++ b/drivers/pci/pci-driver.c +@@ -414,6 +414,9 @@ static int pci_device_probe(struct device *dev) + struct pci_dev *pci_dev = to_pci_dev(dev); + struct pci_driver *drv = to_pci_driver(dev->driver); + ++ if (!pci_device_can_probe(pci_dev)) ++ return -ENODEV; ++ + pci_assign_irq(pci_dev); + + error = pcibios_alloc_irq(pci_dev); +@@ -421,12 +424,10 @@ static int pci_device_probe(struct device *dev) + return error; + + pci_dev_get(pci_dev); +- if (pci_device_can_probe(pci_dev)) { +- error = __pci_device_probe(drv, pci_dev); +- if (error) { +- pcibios_free_irq(pci_dev); +- pci_dev_put(pci_dev); +- } ++ error = __pci_device_probe(drv, pci_dev); ++ if (error) { ++ pcibios_free_irq(pci_dev); ++ pci_dev_put(pci_dev); + } + + return error; +diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c +index 6d27475e39b2..4e83c347de5d 100644 +--- a/drivers/pci/pci-sysfs.c ++++ b/drivers/pci/pci-sysfs.c +@@ -477,7 +477,7 @@ static ssize_t remove_store(struct device *dev, struct device_attribute *attr, + pci_stop_and_remove_bus_device_locked(to_pci_dev(dev)); + return count; + } +-static struct device_attribute dev_remove_attr = __ATTR(remove, ++static struct device_attribute dev_remove_attr = __ATTR_IGNORE_LOCKDEP(remove, + (S_IWUSR|S_IWGRP), + NULL, remove_store); + +diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c +index 8abc843b1615..088fcdc8d2b4 100644 +--- a/drivers/pci/pci.c ++++ b/drivers/pci/pci.c +@@ -2065,6 +2065,13 @@ static void pci_pme_list_scan(struct work_struct *work) + */ + if (bridge && bridge->current_state != PCI_D0) + continue; ++ /* ++ * If the device is in D3cold it should not be ++ * polled either. ++ */ ++ if (pme_dev->dev->current_state == PCI_D3cold) ++ continue; ++ + pci_pme_wakeup(pme_dev->dev, NULL); + } else { + list_del(&pme_dev->list); +diff --git a/drivers/perf/arm_pmu.c b/drivers/perf/arm_pmu.c +index 2d06b8095a19..df352b334ea7 100644 +--- a/drivers/perf/arm_pmu.c ++++ b/drivers/perf/arm_pmu.c +@@ -723,8 +723,8 @@ static int cpu_pm_pmu_notify(struct notifier_block *b, unsigned long cmd, + cpu_pm_pmu_setup(armpmu, cmd); + break; + case CPU_PM_EXIT: +- cpu_pm_pmu_setup(armpmu, cmd); + case CPU_PM_ENTER_FAILED: ++ cpu_pm_pmu_setup(armpmu, cmd); + armpmu->start(armpmu); + break; + default: +diff --git a/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c b/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c +index 6233a7979a93..ac322d643c7a 100644 +--- a/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c ++++ b/drivers/phy/amlogic/phy-meson-g12a-usb3-pcie.c +@@ -188,7 +188,7 @@ static const struct regmap_config phy_g12a_usb3_pcie_cr_regmap_conf = { + .reg_read = phy_g12a_usb3_pcie_cr_bus_read, + .reg_write = phy_g12a_usb3_pcie_cr_bus_write, + .max_register = 0xffff, +- .fast_io = true, ++ .disable_locking = true, + }; + + static int phy_g12a_usb3_init(struct phy *phy) +diff --git a/drivers/phy/qualcomm/phy-qcom-qmp.c b/drivers/phy/qualcomm/phy-qcom-qmp.c +index cd91b4179b10..43abdfd0deed 100644 +--- a/drivers/phy/qualcomm/phy-qcom-qmp.c ++++ b/drivers/phy/qualcomm/phy-qcom-qmp.c +@@ -1074,6 +1074,7 @@ static const struct qmp_phy_cfg msm8996_pciephy_cfg = { + + .start_ctrl = PCS_START | PLL_READY_GATE_EN, + .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL, ++ .mask_pcs_ready = PHYSTATUS, + .mask_com_pcs_ready = PCS_READY, + + .has_phy_com_ctrl = true, +@@ -1253,6 +1254,7 @@ static const struct qmp_phy_cfg msm8998_pciephy_cfg = { + + .start_ctrl = SERDES_START | PCS_START, + .pwrdn_ctrl = SW_PWRDN | REFCLK_DRV_DSBL, ++ .mask_pcs_ready = PHYSTATUS, + .mask_com_pcs_ready = PCS_READY, + }; + +@@ -1547,7 +1549,7 @@ static int qcom_qmp_phy_enable(struct phy *phy) + status = pcs + cfg->regs[QPHY_PCS_READY_STATUS]; + mask = cfg->mask_pcs_ready; + +- ret = readl_poll_timeout(status, val, !(val & mask), 1, ++ ret = readl_poll_timeout(status, val, val & mask, 1, + PHY_INIT_COMPLETE_TIMEOUT); + if (ret) { + dev_err(qmp->dev, "phy initialization timed-out\n"); +diff --git a/drivers/phy/renesas/phy-rcar-gen2.c b/drivers/phy/renesas/phy-rcar-gen2.c +index 8dc5710d9c98..2926e4937301 100644 +--- a/drivers/phy/renesas/phy-rcar-gen2.c ++++ b/drivers/phy/renesas/phy-rcar-gen2.c +@@ -391,6 +391,7 @@ static int rcar_gen2_phy_probe(struct platform_device *pdev) + error = of_property_read_u32(np, "reg", &channel_num); + if (error || channel_num > 2) { + dev_err(dev, "Invalid \"reg\" property\n"); ++ of_node_put(np); + return error; + } + channel->select_mask = select_mask[channel_num]; +@@ -406,6 +407,7 @@ static int rcar_gen2_phy_probe(struct platform_device *pdev) + data->gen2_phy_ops); + if (IS_ERR(phy->phy)) { + dev_err(dev, "Failed to create PHY\n"); ++ of_node_put(np); + return PTR_ERR(phy->phy); + } + phy_set_drvdata(phy->phy, phy); +diff --git a/drivers/phy/renesas/phy-rcar-gen3-usb2.c b/drivers/phy/renesas/phy-rcar-gen3-usb2.c +index 1322185a00a2..8ffba67568ec 100644 +--- a/drivers/phy/renesas/phy-rcar-gen3-usb2.c ++++ b/drivers/phy/renesas/phy-rcar-gen3-usb2.c +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -106,6 +107,7 @@ struct rcar_gen3_chan { + struct rcar_gen3_phy rphys[NUM_OF_PHYS]; + struct regulator *vbus; + struct work_struct work; ++ struct mutex lock; /* protects rphys[...].powered */ + enum usb_dr_mode dr_mode; + bool extcon_host; + bool is_otg_channel; +@@ -437,15 +439,16 @@ static int rcar_gen3_phy_usb2_power_on(struct phy *p) + struct rcar_gen3_chan *channel = rphy->ch; + void __iomem *usb2_base = channel->base; + u32 val; +- int ret; ++ int ret = 0; + ++ mutex_lock(&channel->lock); + if (!rcar_gen3_are_all_rphys_power_off(channel)) +- return 0; ++ goto out; + + if (channel->vbus) { + ret = regulator_enable(channel->vbus); + if (ret) +- return ret; ++ goto out; + } + + val = readl(usb2_base + USB2_USBCTR); +@@ -454,7 +457,10 @@ static int rcar_gen3_phy_usb2_power_on(struct phy *p) + val &= ~USB2_USBCTR_PLL_RST; + writel(val, usb2_base + USB2_USBCTR); + ++out: ++ /* The powered flag should be set for any other phys anyway */ + rphy->powered = true; ++ mutex_unlock(&channel->lock); + + return 0; + } +@@ -465,14 +471,18 @@ static int rcar_gen3_phy_usb2_power_off(struct phy *p) + struct rcar_gen3_chan *channel = rphy->ch; + int ret = 0; + ++ mutex_lock(&channel->lock); + rphy->powered = false; + + if (!rcar_gen3_are_all_rphys_power_off(channel)) +- return 0; ++ goto out; + + if (channel->vbus) + ret = regulator_disable(channel->vbus); + ++out: ++ mutex_unlock(&channel->lock); ++ + return ret; + } + +@@ -639,6 +649,7 @@ static int rcar_gen3_phy_usb2_probe(struct platform_device *pdev) + if (!phy_usb2_ops) + return -EINVAL; + ++ mutex_init(&channel->lock); + for (i = 0; i < NUM_OF_PHYS; i++) { + channel->rphys[i].phy = devm_phy_create(dev, NULL, + phy_usb2_ops); +diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c +index 807a3263d849..62a622159006 100644 +--- a/drivers/pinctrl/pinctrl-rockchip.c ++++ b/drivers/pinctrl/pinctrl-rockchip.c +@@ -3204,6 +3204,7 @@ static int rockchip_get_bank_data(struct rockchip_pin_bank *bank, + base, + &rockchip_regmap_config); + } ++ of_node_put(node); + } + + bank->irq = irq_of_parse_and_map(bank->of_node, 0); +diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig +index 5d5cc6111081..a2b36f2eb1c0 100644 +--- a/drivers/platform/x86/Kconfig ++++ b/drivers/platform/x86/Kconfig +@@ -623,9 +623,28 @@ config THINKPAD_ACPI_HOTKEY_POLL + If you are not sure, say Y here. The driver enables polling only if + it is strictly necessary to do so. + ++config THINKPAD_EC ++ tristate ++ ---help--- ++ This is a low-level driver for accessing the ThinkPad H8S embedded ++ controller over the LPC bus (not to be confused with the ACPI Embedded ++ Controller interface). ++ ++config TP_SMAPI ++ tristate "ThinkPad SMAPI Support" ++ select THINKPAD_EC ++ default n ++ help ++ This adds SMAPI support on Lenovo/IBM ThinkPads, for features such ++ as battery charging control. For more information about this driver ++ see . ++ ++ If you have a Lenovo/IBM ThinkPad laptop, say Y or M here. ++ + config SENSORS_HDAPS + tristate "Thinkpad Hard Drive Active Protection System (hdaps)" + depends on INPUT ++ select THINKPAD_EC + select INPUT_POLLDEV + help + This driver provides support for the IBM Hard Drive Active Protection +@@ -1317,7 +1336,7 @@ config HUAWEI_WMI + + config PCENGINES_APU2 + tristate "PC Engines APUv2/3 front button and LEDs driver" +- depends on INPUT && INPUT_KEYBOARD ++ depends on INPUT && INPUT_KEYBOARD && GPIOLIB + depends on LEDS_CLASS + select GPIO_AMD_FCH + select KEYBOARD_GPIO_POLLED +diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile +index 87b0069bd781..a0535f9f2aac 100644 +--- a/drivers/platform/x86/Makefile ++++ b/drivers/platform/x86/Makefile +@@ -39,6 +39,8 @@ obj-$(CONFIG_TC1100_WMI) += tc1100-wmi.o + obj-$(CONFIG_SONY_LAPTOP) += sony-laptop.o + obj-$(CONFIG_IDEAPAD_LAPTOP) += ideapad-laptop.o + obj-$(CONFIG_THINKPAD_ACPI) += thinkpad_acpi.o ++obj-$(CONFIG_THINKPAD_EC) += thinkpad_ec.o ++obj-$(CONFIG_TP_SMAPI) += tp_smapi.o + obj-$(CONFIG_SENSORS_HDAPS) += hdaps.o + obj-$(CONFIG_FUJITSU_LAPTOP) += fujitsu-laptop.o + obj-$(CONFIG_FUJITSU_TABLET) += fujitsu-tablet.o +diff --git a/drivers/platform/x86/asus-wmi.c b/drivers/platform/x86/asus-wmi.c +index 9b18a184e0aa..abfa99d18fea 100644 +--- a/drivers/platform/x86/asus-wmi.c ++++ b/drivers/platform/x86/asus-wmi.c +@@ -85,6 +85,7 @@ static bool ashs_present(void) + struct bios_args { + u32 arg0; + u32 arg1; ++ u32 arg2; /* At least TUF Gaming series uses 3 dword input buffer. */ + } __packed; + + /* +@@ -211,11 +212,13 @@ static void asus_wmi_input_exit(struct asus_wmi *asus) + asus->inputdev = NULL; + } + +-int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval) ++static int asus_wmi_evaluate_method3(u32 method_id, ++ u32 arg0, u32 arg1, u32 arg2, u32 *retval) + { + struct bios_args args = { + .arg0 = arg0, + .arg1 = arg1, ++ .arg2 = arg2, + }; + struct acpi_buffer input = { (acpi_size) sizeof(args), &args }; + struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; +@@ -247,6 +250,11 @@ int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval) + + return 0; + } ++ ++int asus_wmi_evaluate_method(u32 method_id, u32 arg0, u32 arg1, u32 *retval) ++{ ++ return asus_wmi_evaluate_method3(method_id, arg0, arg1, 0, retval); ++} + EXPORT_SYMBOL_GPL(asus_wmi_evaluate_method); + + static int asus_wmi_evaluate_method_agfn(const struct acpi_buffer args) +diff --git a/drivers/platform/x86/hdaps.c b/drivers/platform/x86/hdaps.c +index 3adcb0de0193..5e4232be23d6 100644 +--- a/drivers/platform/x86/hdaps.c ++++ b/drivers/platform/x86/hdaps.c +@@ -3,7 +3,7 @@ + * hdaps.c - driver for IBM's Hard Drive Active Protection System + * + * Copyright (C) 2005 Robert Love +- * Copyright (C) 2005 Jesper Juhl ++ * Copyright (C) 2005 Jesper Juhl + * + * The HardDisk Active Protection System (hdaps) is present in IBM ThinkPads + * starting with the R40, T41, and X40. It provides a basic two-axis +@@ -18,266 +18,384 @@ + + #include + #include +-#include ++#include + #include +-#include + #include + #include + #include + #include +-#include +- +-#define HDAPS_LOW_PORT 0x1600 /* first port used by hdaps */ +-#define HDAPS_NR_PORTS 0x30 /* number of ports: 0x1600 - 0x162f */ +- +-#define HDAPS_PORT_STATE 0x1611 /* device state */ +-#define HDAPS_PORT_YPOS 0x1612 /* y-axis position */ +-#define HDAPS_PORT_XPOS 0x1614 /* x-axis position */ +-#define HDAPS_PORT_TEMP1 0x1616 /* device temperature, in Celsius */ +-#define HDAPS_PORT_YVAR 0x1617 /* y-axis variance (what is this?) */ +-#define HDAPS_PORT_XVAR 0x1619 /* x-axis variance (what is this?) */ +-#define HDAPS_PORT_TEMP2 0x161b /* device temperature (again?) */ +-#define HDAPS_PORT_UNKNOWN 0x161c /* what is this? */ +-#define HDAPS_PORT_KMACT 0x161d /* keyboard or mouse activity */ +- +-#define STATE_FRESH 0x50 /* accelerometer data is fresh */ ++#include ++#include ++#include ++ ++/* Embedded controller accelerometer read command and its result: */ ++static const struct thinkpad_ec_row ec_accel_args = ++ { .mask = 0x0001, .val = {0x11} }; ++#define EC_ACCEL_IDX_READOUTS 0x1 /* readouts included in this read */ ++ /* First readout, if READOUTS>=1: */ ++#define EC_ACCEL_IDX_YPOS1 0x2 /* y-axis position word */ ++#define EC_ACCEL_IDX_XPOS1 0x4 /* x-axis position word */ ++#define EC_ACCEL_IDX_TEMP1 0x6 /* device temperature in Celsius */ ++ /* Second readout, if READOUTS>=2: */ ++#define EC_ACCEL_IDX_XPOS2 0x7 /* y-axis position word */ ++#define EC_ACCEL_IDX_YPOS2 0x9 /* x-axis position word */ ++#define EC_ACCEL_IDX_TEMP2 0xb /* device temperature in Celsius */ ++#define EC_ACCEL_IDX_QUEUED 0xc /* Number of queued readouts left */ ++#define EC_ACCEL_IDX_KMACT 0xd /* keyboard or mouse activity */ ++#define EC_ACCEL_IDX_RETVAL 0xf /* command return value, good=0x00 */ + + #define KEYBD_MASK 0x20 /* set if keyboard activity */ + #define MOUSE_MASK 0x40 /* set if mouse activity */ +-#define KEYBD_ISSET(n) (!! (n & KEYBD_MASK)) /* keyboard used? */ +-#define MOUSE_ISSET(n) (!! (n & MOUSE_MASK)) /* mouse used? */ + +-#define INIT_TIMEOUT_MSECS 4000 /* wait up to 4s for device init ... */ +-#define INIT_WAIT_MSECS 200 /* ... in 200ms increments */ ++#define READ_TIMEOUT_MSECS 100 /* wait this long for device read */ ++#define RETRY_MSECS 3 /* retry delay */ + +-#define HDAPS_POLL_INTERVAL 50 /* poll for input every 1/20s (50 ms)*/ + #define HDAPS_INPUT_FUZZ 4 /* input event threshold */ + #define HDAPS_INPUT_FLAT 4 +- +-#define HDAPS_X_AXIS (1 << 0) +-#define HDAPS_Y_AXIS (1 << 1) +-#define HDAPS_BOTH_AXES (HDAPS_X_AXIS | HDAPS_Y_AXIS) +- ++#define KMACT_REMEMBER_PERIOD (HZ/10) /* keyboard/mouse persistence */ ++ ++/* Input IDs */ ++#define HDAPS_INPUT_VENDOR PCI_VENDOR_ID_IBM ++#define HDAPS_INPUT_PRODUCT 0x5054 /* "TP", shared with thinkpad_acpi */ ++#define HDAPS_INPUT_JS_VERSION 0x6801 /* Joystick emulation input device */ ++#define HDAPS_INPUT_RAW_VERSION 0x4801 /* Raw accelerometer input device */ ++ ++/* Axis orientation. */ ++/* The unnatural bit-representation of inversions is for backward ++ * compatibility with the"invert=1" module parameter. */ ++#define HDAPS_ORIENT_INVERT_XY 0x01 /* Invert both X and Y axes. */ ++#define HDAPS_ORIENT_INVERT_X 0x02 /* Invert the X axis (uninvert if ++ * already inverted by INVERT_XY). */ ++#define HDAPS_ORIENT_SWAP 0x04 /* Swap the axes. The swap occurs ++ * before inverting X or Y. */ ++#define HDAPS_ORIENT_MAX 0x07 ++#define HDAPS_ORIENT_UNDEFINED 0xFF /* Placeholder during initialization */ ++#define HDAPS_ORIENT_INVERT_Y (HDAPS_ORIENT_INVERT_XY | HDAPS_ORIENT_INVERT_X) ++ ++static struct timer_list hdaps_timer; + static struct platform_device *pdev; +-static struct input_polled_dev *hdaps_idev; +-static unsigned int hdaps_invert; +-static u8 km_activity; +-static int rest_x; +-static int rest_y; +- +-static DEFINE_MUTEX(hdaps_mtx); +- +-/* +- * __get_latch - Get the value from a given port. Callers must hold hdaps_mtx. +- */ +-static inline u8 __get_latch(u16 port) ++static struct input_dev *hdaps_idev; /* joystick-like device with fuzz */ ++static struct input_dev *hdaps_idev_raw; /* raw hdaps sensor readouts */ ++static unsigned int hdaps_invert = HDAPS_ORIENT_UNDEFINED; ++static int needs_calibration; ++ ++/* Configuration: */ ++static int sampling_rate = 50; /* Sampling rate */ ++static int oversampling_ratio = 5; /* Ratio between our sampling rate and ++ * EC accelerometer sampling rate */ ++static int running_avg_filter_order = 2; /* EC running average filter order */ ++ ++/* Latest state readout: */ ++static int pos_x, pos_y; /* position */ ++static int temperature; /* temperature */ ++static int stale_readout = 1; /* last read invalid */ ++static int rest_x, rest_y; /* calibrated rest position */ ++ ++/* Last time we saw keyboard and mouse activity: */ ++static u64 last_keyboard_jiffies = INITIAL_JIFFIES; ++static u64 last_mouse_jiffies = INITIAL_JIFFIES; ++static u64 last_update_jiffies = INITIAL_JIFFIES; ++ ++/* input device use count */ ++static int hdaps_users; ++static DEFINE_MUTEX(hdaps_users_mtx); ++ ++/* Some models require an axis transformation to the standard representation */ ++static void transform_axes(int *x, int *y) + { +- return inb(port) & 0xff; ++ if (hdaps_invert & HDAPS_ORIENT_SWAP) { ++ int z; ++ z = *x; ++ *x = *y; ++ *y = z; ++ } ++ if (hdaps_invert & HDAPS_ORIENT_INVERT_XY) { ++ *x = -*x; ++ *y = -*y; ++ } ++ if (hdaps_invert & HDAPS_ORIENT_INVERT_X) ++ *x = -*x; + } + +-/* +- * __check_latch - Check a port latch for a given value. Returns zero if the +- * port contains the given value. Callers must hold hdaps_mtx. ++/** ++ * __hdaps_update - query current state, with locks already acquired ++ * @fast: if nonzero, do one quick attempt without retries. ++ * ++ * Query current accelerometer state and update global state variables. ++ * Also prefetches the next query. Caller must hold controller lock. + */ +-static inline int __check_latch(u16 port, u8 val) ++static int __hdaps_update(int fast) + { +- if (__get_latch(port) == val) +- return 0; +- return -EINVAL; +-} ++ /* Read data: */ ++ struct thinkpad_ec_row data; ++ int ret; + +-/* +- * __wait_latch - Wait up to 100us for a port latch to get a certain value, +- * returning zero if the value is obtained. Callers must hold hdaps_mtx. +- */ +-static int __wait_latch(u16 port, u8 val) +-{ +- unsigned int i; ++ data.mask = (1 << EC_ACCEL_IDX_READOUTS) | (1 << EC_ACCEL_IDX_KMACT) | ++ (3 << EC_ACCEL_IDX_YPOS1) | (3 << EC_ACCEL_IDX_XPOS1) | ++ (1 << EC_ACCEL_IDX_TEMP1) | (1 << EC_ACCEL_IDX_RETVAL); ++ if (fast) ++ ret = thinkpad_ec_try_read_row(&ec_accel_args, &data); ++ else ++ ret = thinkpad_ec_read_row(&ec_accel_args, &data); ++ thinkpad_ec_prefetch_row(&ec_accel_args); /* Prefetch even if error */ ++ if (ret) ++ return ret; + +- for (i = 0; i < 20; i++) { +- if (!__check_latch(port, val)) +- return 0; +- udelay(5); ++ /* Check status: */ ++ if (data.val[EC_ACCEL_IDX_RETVAL] != 0x00) { ++ pr_warn("read RETVAL=0x%02x\n", ++ data.val[EC_ACCEL_IDX_RETVAL]); ++ return -EIO; + } + +- return -EIO; ++ if (data.val[EC_ACCEL_IDX_READOUTS] < 1) ++ return -EBUSY; /* no pending readout, try again later */ ++ ++ /* Parse position data: */ ++ pos_x = *(s16 *)(data.val+EC_ACCEL_IDX_XPOS1); ++ pos_y = *(s16 *)(data.val+EC_ACCEL_IDX_YPOS1); ++ transform_axes(&pos_x, &pos_y); ++ ++ /* Keyboard and mouse activity status is cleared as soon as it's read, ++ * so applications will eat each other's events. Thus we remember any ++ * event for KMACT_REMEMBER_PERIOD jiffies. ++ */ ++ if (data.val[EC_ACCEL_IDX_KMACT] & KEYBD_MASK) ++ last_keyboard_jiffies = get_jiffies_64(); ++ if (data.val[EC_ACCEL_IDX_KMACT] & MOUSE_MASK) ++ last_mouse_jiffies = get_jiffies_64(); ++ ++ temperature = data.val[EC_ACCEL_IDX_TEMP1]; ++ ++ last_update_jiffies = get_jiffies_64(); ++ stale_readout = 0; ++ if (needs_calibration) { ++ rest_x = pos_x; ++ rest_y = pos_y; ++ needs_calibration = 0; ++ } ++ ++ return 0; + } + +-/* +- * __device_refresh - request a refresh from the accelerometer. Does not wait +- * for refresh to complete. Callers must hold hdaps_mtx. ++/** ++ * hdaps_update - acquire locks and query current state ++ * ++ * Query current accelerometer state and update global state variables. ++ * Also prefetches the next query. ++ * Retries until timeout if the accelerometer is not in ready status (common). ++ * Does its own locking. + */ +-static void __device_refresh(void) ++static int hdaps_update(void) + { +- udelay(200); +- if (inb(0x1604) != STATE_FRESH) { +- outb(0x11, 0x1610); +- outb(0x01, 0x161f); ++ u64 age = get_jiffies_64() - last_update_jiffies; ++ int total, ret; ++ ++ if (!stale_readout && age < (9*HZ)/(10*sampling_rate)) ++ return 0; /* already updated recently */ ++ for (total = 0; total < READ_TIMEOUT_MSECS; total += RETRY_MSECS) { ++ ret = thinkpad_ec_lock(); ++ if (ret) ++ return ret; ++ ret = __hdaps_update(0); ++ thinkpad_ec_unlock(); ++ ++ if (!ret) ++ return 0; ++ if (ret != -EBUSY) ++ break; ++ msleep(RETRY_MSECS); + } ++ return ret; + } + +-/* +- * __device_refresh_sync - request a synchronous refresh from the +- * accelerometer. We wait for the refresh to complete. Returns zero if +- * successful and nonzero on error. Callers must hold hdaps_mtx. ++/** ++ * hdaps_set_power - enable or disable power to the accelerometer. ++ * Returns zero on success and negative error code on failure. Can sleep. + */ +-static int __device_refresh_sync(void) ++static int hdaps_set_power(int on) + { +- __device_refresh(); +- return __wait_latch(0x1604, STATE_FRESH); ++ struct thinkpad_ec_row args = ++ { .mask = 0x0003, .val = {0x14, on?0x01:0x00} }; ++ struct thinkpad_ec_row data = { .mask = 0x8000 }; ++ int ret = thinkpad_ec_read_row(&args, &data); ++ if (ret) ++ return ret; ++ if (data.val[0xF] != 0x00) ++ return -EIO; ++ return 0; + } + +-/* +- * __device_complete - indicate to the accelerometer that we are done reading +- * data, and then initiate an async refresh. Callers must hold hdaps_mtx. ++/** ++ * hdaps_set_ec_config - set accelerometer parameters. ++ * @ec_rate: embedded controller sampling rate ++ * @order: embedded controller running average filter order ++ * (Normally we have @ec_rate = sampling_rate * oversampling_ratio.) ++ * Returns zero on success and negative error code on failure. Can sleep. + */ +-static inline void __device_complete(void) ++static int hdaps_set_ec_config(int ec_rate, int order) + { +- inb(0x161f); +- inb(0x1604); +- __device_refresh(); ++ struct thinkpad_ec_row args = { .mask = 0x000F, ++ .val = {0x10, (u8)ec_rate, (u8)(ec_rate>>8), order} }; ++ struct thinkpad_ec_row data = { .mask = 0x8000 }; ++ int ret = thinkpad_ec_read_row(&args, &data); ++ pr_debug("setting ec_rate=%d, filter_order=%d\n", ec_rate, order); ++ if (ret) ++ return ret; ++ if (data.val[0xF] == 0x03) { ++ pr_warn("config param out of range\n"); ++ return -EINVAL; ++ } ++ if (data.val[0xF] == 0x06) { ++ pr_warn("config change already pending\n"); ++ return -EBUSY; ++ } ++ if (data.val[0xF] != 0x00) { ++ pr_warn("config change error, ret=%d\n", ++ data.val[0xF]); ++ return -EIO; ++ } ++ return 0; + } + +-/* +- * hdaps_readb_one - reads a byte from a single I/O port, placing the value in +- * the given pointer. Returns zero on success or a negative error on failure. +- * Can sleep. ++/** ++ * hdaps_get_ec_config - get accelerometer parameters. ++ * @ec_rate: embedded controller sampling rate ++ * @order: embedded controller running average filter order ++ * Returns zero on success and negative error code on failure. Can sleep. + */ +-static int hdaps_readb_one(unsigned int port, u8 *val) ++static int hdaps_get_ec_config(int *ec_rate, int *order) + { +- int ret; +- +- mutex_lock(&hdaps_mtx); +- +- /* do a sync refresh -- we need to be sure that we read fresh data */ +- ret = __device_refresh_sync(); ++ const struct thinkpad_ec_row args = ++ { .mask = 0x0003, .val = {0x17, 0x82} }; ++ struct thinkpad_ec_row data = { .mask = 0x801F }; ++ int ret = thinkpad_ec_read_row(&args, &data); + if (ret) +- goto out; +- +- *val = inb(port); +- __device_complete(); +- +-out: +- mutex_unlock(&hdaps_mtx); +- return ret; ++ return ret; ++ if (data.val[0xF] != 0x00) ++ return -EIO; ++ if (!(data.val[0x1] & 0x01)) ++ return -ENXIO; /* accelerometer polling not enabled */ ++ if (data.val[0x1] & 0x02) ++ return -EBUSY; /* config change in progress, retry later */ ++ *ec_rate = data.val[0x2] | ((int)(data.val[0x3]) << 8); ++ *order = data.val[0x4]; ++ return 0; + } + +-/* __hdaps_read_pair - internal lockless helper for hdaps_read_pair(). */ +-static int __hdaps_read_pair(unsigned int port1, unsigned int port2, +- int *x, int *y) ++/** ++ * hdaps_get_ec_mode - get EC accelerometer mode ++ * Returns zero on success and negative error code on failure. Can sleep. ++ */ ++static int hdaps_get_ec_mode(u8 *mode) + { +- /* do a sync refresh -- we need to be sure that we read fresh data */ +- if (__device_refresh_sync()) ++ const struct thinkpad_ec_row args = ++ { .mask = 0x0001, .val = {0x13} }; ++ struct thinkpad_ec_row data = { .mask = 0x8002 }; ++ int ret = thinkpad_ec_read_row(&args, &data); ++ if (ret) ++ return ret; ++ if (data.val[0xF] != 0x00) { ++ pr_warn("accelerometer not implemented (0x%02x)\n", ++ data.val[0xF]); + return -EIO; +- +- *y = inw(port2); +- *x = inw(port1); +- km_activity = inb(HDAPS_PORT_KMACT); +- __device_complete(); +- +- /* hdaps_invert is a bitvector to negate the axes */ +- if (hdaps_invert & HDAPS_X_AXIS) +- *x = -*x; +- if (hdaps_invert & HDAPS_Y_AXIS) +- *y = -*y; +- ++ } ++ *mode = data.val[0x1]; + return 0; + } + +-/* +- * hdaps_read_pair - reads the values from a pair of ports, placing the values +- * in the given pointers. Returns zero on success. Can sleep. ++/** ++ * hdaps_check_ec - checks something about the EC. ++ * Follows the clean-room spec for HDAPS; we don't know what it means. ++ * Returns zero on success and negative error code on failure. Can sleep. + */ +-static int hdaps_read_pair(unsigned int port1, unsigned int port2, +- int *val1, int *val2) ++static int hdaps_check_ec(void) + { +- int ret; +- +- mutex_lock(&hdaps_mtx); +- ret = __hdaps_read_pair(port1, port2, val1, val2); +- mutex_unlock(&hdaps_mtx); +- +- return ret; ++ const struct thinkpad_ec_row args = ++ { .mask = 0x0003, .val = {0x17, 0x81} }; ++ struct thinkpad_ec_row data = { .mask = 0x800E }; ++ int ret = thinkpad_ec_read_row(&args, &data); ++ if (ret) ++ return ret; ++ if (!((data.val[0x1] == 0x00 && data.val[0x2] == 0x60) || /* cleanroom spec */ ++ (data.val[0x1] == 0x01 && data.val[0x2] == 0x00)) || /* seen on T61 */ ++ data.val[0x3] != 0x00 || data.val[0xF] != 0x00) { ++ pr_warn("hdaps_check_ec: bad response (0x%x,0x%x,0x%x,0x%x)\n", ++ data.val[0x1], data.val[0x2], ++ data.val[0x3], data.val[0xF]); ++ return -EIO; ++ } ++ return 0; + } + +-/* +- * hdaps_device_init - initialize the accelerometer. Returns zero on success +- * and negative error code on failure. Can sleep. ++/** ++ * hdaps_device_init - initialize the accelerometer. ++ * ++ * Call several embedded controller functions to test and initialize the ++ * accelerometer. ++ * Returns zero on success and negative error code on failure. Can sleep. + */ ++#define FAILED_INIT(msg) pr_err("init failed at: %s\n", msg) + static int hdaps_device_init(void) + { +- int total, ret = -ENXIO; ++ int ret; ++ u8 mode; + +- mutex_lock(&hdaps_mtx); ++ ret = thinkpad_ec_lock(); ++ if (ret) ++ return ret; + +- outb(0x13, 0x1610); +- outb(0x01, 0x161f); +- if (__wait_latch(0x161f, 0x00)) +- goto out; ++ if (hdaps_get_ec_mode(&mode)) ++ { FAILED_INIT("hdaps_get_ec_mode failed"); goto bad; } + +- /* +- * Most ThinkPads return 0x01. +- * +- * Others--namely the R50p, T41p, and T42p--return 0x03. These laptops +- * have "inverted" axises. +- * +- * The 0x02 value occurs when the chip has been previously initialized. +- */ +- if (__check_latch(0x1611, 0x03) && +- __check_latch(0x1611, 0x02) && +- __check_latch(0x1611, 0x01)) +- goto out; ++ pr_debug("initial mode latch is 0x%02x\n", mode); ++ if (mode == 0x00) ++ { FAILED_INIT("accelerometer not available"); goto bad; } + +- printk(KERN_DEBUG "hdaps: initial latch check good (0x%02x)\n", +- __get_latch(0x1611)); ++ if (hdaps_check_ec()) ++ { FAILED_INIT("hdaps_check_ec failed"); goto bad; } + +- outb(0x17, 0x1610); +- outb(0x81, 0x1611); +- outb(0x01, 0x161f); +- if (__wait_latch(0x161f, 0x00)) +- goto out; +- if (__wait_latch(0x1611, 0x00)) +- goto out; +- if (__wait_latch(0x1612, 0x60)) +- goto out; +- if (__wait_latch(0x1613, 0x00)) +- goto out; +- outb(0x14, 0x1610); +- outb(0x01, 0x1611); +- outb(0x01, 0x161f); +- if (__wait_latch(0x161f, 0x00)) +- goto out; +- outb(0x10, 0x1610); +- outb(0xc8, 0x1611); +- outb(0x00, 0x1612); +- outb(0x02, 0x1613); +- outb(0x01, 0x161f); +- if (__wait_latch(0x161f, 0x00)) +- goto out; +- if (__device_refresh_sync()) +- goto out; +- if (__wait_latch(0x1611, 0x00)) +- goto out; +- +- /* we have done our dance, now let's wait for the applause */ +- for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) { +- int x, y; ++ if (hdaps_set_power(1)) ++ { FAILED_INIT("hdaps_set_power failed"); goto bad; } + +- /* a read of the device helps push it into action */ +- __hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y); +- if (!__wait_latch(0x1611, 0x02)) { +- ret = 0; +- break; +- } ++ if (hdaps_set_ec_config(sampling_rate*oversampling_ratio, ++ running_avg_filter_order)) ++ { FAILED_INIT("hdaps_set_ec_config failed"); goto bad; } + +- msleep(INIT_WAIT_MSECS); +- } ++ thinkpad_ec_invalidate(); ++ udelay(200); + +-out: +- mutex_unlock(&hdaps_mtx); ++ /* Just prefetch instead of reading, to avoid ~1sec delay on load */ ++ ret = thinkpad_ec_prefetch_row(&ec_accel_args); ++ if (ret) ++ { FAILED_INIT("initial prefetch failed"); goto bad; } ++ goto good; ++bad: ++ thinkpad_ec_invalidate(); ++ ret = -ENXIO; ++good: ++ stale_readout = 1; ++ thinkpad_ec_unlock(); + return ret; + } + ++/** ++ * hdaps_device_shutdown - power off the accelerometer ++ * Returns nonzero on failure. Can sleep. ++ */ ++static int hdaps_device_shutdown(void) ++{ ++ int ret; ++ ret = hdaps_set_power(0); ++ if (ret) { ++ pr_warn("cannot power off\n"); ++ return ret; ++ } ++ ret = hdaps_set_ec_config(0, 1); ++ if (ret) ++ pr_warn("cannot stop EC sampling\n"); ++ return ret; ++} + + /* Device model stuff */ + +@@ -294,13 +412,29 @@ static int hdaps_probe(struct platform_device *dev) + } + + #ifdef CONFIG_PM_SLEEP ++static int hdaps_suspend(struct device *dev) ++{ ++ /* Don't do hdaps polls until resume re-initializes the sensor. */ ++ del_timer_sync(&hdaps_timer); ++ hdaps_device_shutdown(); /* ignore errors, effect is negligible */ ++ return 0; ++} ++ + static int hdaps_resume(struct device *dev) + { +- return hdaps_device_init(); ++ int ret = hdaps_device_init(); ++ if (ret) ++ return ret; ++ ++ mutex_lock(&hdaps_users_mtx); ++ if (hdaps_users) ++ mod_timer(&hdaps_timer, jiffies + HZ/sampling_rate); ++ mutex_unlock(&hdaps_users_mtx); ++ return 0; + } + #endif + +-static SIMPLE_DEV_PM_OPS(hdaps_pm, NULL, hdaps_resume); ++static SIMPLE_DEV_PM_OPS(hdaps_pm, hdaps_suspend, hdaps_resume); + + static struct platform_driver hdaps_driver = { + .probe = hdaps_probe, +@@ -310,30 +444,51 @@ static struct platform_driver hdaps_driver = { + }, + }; + +-/* +- * hdaps_calibrate - Set our "resting" values. Callers must hold hdaps_mtx. ++/** ++ * hdaps_calibrate - set our "resting" values. ++ * Does its own locking. + */ + static void hdaps_calibrate(void) + { +- __hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &rest_x, &rest_y); ++ needs_calibration = 1; ++ hdaps_update(); ++ /* If that fails, the mousedev poll will take care of things later. */ + } + +-static void hdaps_mousedev_poll(struct input_polled_dev *dev) ++/* Timer handler for updating the input device. Runs in softirq context, ++ * so avoid lenghty or blocking operations. ++ */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0) ++static void hdaps_mousedev_poll(unsigned long unused) ++#else ++static void hdaps_mousedev_poll(struct timer_list *unused) ++#endif + { +- struct input_dev *input_dev = dev->input; +- int x, y; ++ int ret; + +- mutex_lock(&hdaps_mtx); ++ stale_readout = 1; + +- if (__hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y)) +- goto out; ++ /* Cannot sleep. Try nonblockingly. If we fail, try again later. */ ++ if (thinkpad_ec_try_lock()) ++ goto keep_active; + +- input_report_abs(input_dev, ABS_X, x - rest_x); +- input_report_abs(input_dev, ABS_Y, y - rest_y); +- input_sync(input_dev); ++ ret = __hdaps_update(1); /* fast update, we're in softirq context */ ++ thinkpad_ec_unlock(); ++ /* Any of "successful", "not yet ready" and "not prefetched"? */ ++ if (ret != 0 && ret != -EBUSY && ret != -ENODATA) { ++ pr_err("poll failed, disabling updates\n"); ++ return; ++ } + +-out: +- mutex_unlock(&hdaps_mtx); ++keep_active: ++ /* Even if we failed now, pos_x,y may have been updated earlier: */ ++ input_report_abs(hdaps_idev, ABS_X, pos_x - rest_x); ++ input_report_abs(hdaps_idev, ABS_Y, pos_y - rest_y); ++ input_sync(hdaps_idev); ++ input_report_abs(hdaps_idev_raw, ABS_X, pos_x); ++ input_report_abs(hdaps_idev_raw, ABS_Y, pos_y); ++ input_sync(hdaps_idev_raw); ++ mod_timer(&hdaps_timer, jiffies + HZ/sampling_rate); + } + + +@@ -342,65 +497,41 @@ static void hdaps_mousedev_poll(struct input_polled_dev *dev) + static ssize_t hdaps_position_show(struct device *dev, + struct device_attribute *attr, char *buf) + { +- int ret, x, y; +- +- ret = hdaps_read_pair(HDAPS_PORT_XPOS, HDAPS_PORT_YPOS, &x, &y); ++ int ret = hdaps_update(); + if (ret) + return ret; +- +- return sprintf(buf, "(%d,%d)\n", x, y); +-} +- +-static ssize_t hdaps_variance_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- int ret, x, y; +- +- ret = hdaps_read_pair(HDAPS_PORT_XVAR, HDAPS_PORT_YVAR, &x, &y); +- if (ret) +- return ret; +- +- return sprintf(buf, "(%d,%d)\n", x, y); ++ return sprintf(buf, "(%d,%d)\n", pos_x, pos_y); + } + + static ssize_t hdaps_temp1_show(struct device *dev, + struct device_attribute *attr, char *buf) + { +- u8 uninitialized_var(temp); +- int ret; +- +- ret = hdaps_readb_one(HDAPS_PORT_TEMP1, &temp); +- if (ret) +- return ret; +- +- return sprintf(buf, "%u\n", temp); +-} +- +-static ssize_t hdaps_temp2_show(struct device *dev, +- struct device_attribute *attr, char *buf) +-{ +- u8 uninitialized_var(temp); +- int ret; +- +- ret = hdaps_readb_one(HDAPS_PORT_TEMP2, &temp); ++ int ret = hdaps_update(); + if (ret) + return ret; +- +- return sprintf(buf, "%u\n", temp); ++ return sprintf(buf, "%d\n", temperature); + } + + static ssize_t hdaps_keyboard_activity_show(struct device *dev, + struct device_attribute *attr, + char *buf) + { +- return sprintf(buf, "%u\n", KEYBD_ISSET(km_activity)); ++ int ret = hdaps_update(); ++ if (ret) ++ return ret; ++ return sprintf(buf, "%u\n", ++ get_jiffies_64() < last_keyboard_jiffies + KMACT_REMEMBER_PERIOD); + } + + static ssize_t hdaps_mouse_activity_show(struct device *dev, + struct device_attribute *attr, + char *buf) + { +- return sprintf(buf, "%u\n", MOUSE_ISSET(km_activity)); ++ int ret = hdaps_update(); ++ if (ret) ++ return ret; ++ return sprintf(buf, "%u\n", ++ get_jiffies_64() < last_mouse_jiffies + KMACT_REMEMBER_PERIOD); + } + + static ssize_t hdaps_calibrate_show(struct device *dev, +@@ -413,10 +544,7 @@ static ssize_t hdaps_calibrate_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) + { +- mutex_lock(&hdaps_mtx); + hdaps_calibrate(); +- mutex_unlock(&hdaps_mtx); +- + return count; + } + +@@ -433,7 +561,7 @@ static ssize_t hdaps_invert_store(struct device *dev, + int invert; + + if (sscanf(buf, "%d", &invert) != 1 || +- invert < 0 || invert > HDAPS_BOTH_AXES) ++ invert < 0 || invert > HDAPS_ORIENT_MAX) + return -EINVAL; + + hdaps_invert = invert; +@@ -442,24 +570,128 @@ static ssize_t hdaps_invert_store(struct device *dev, + return count; + } + ++static ssize_t hdaps_sampling_rate_show( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ return sprintf(buf, "%d\n", sampling_rate); ++} ++ ++static ssize_t hdaps_sampling_rate_store( ++ struct device *dev, struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ int rate, ret; ++ if (sscanf(buf, "%d", &rate) != 1 || rate > HZ || rate <= 0) { ++ pr_warn("must have 0ident); +- return 1; +-} +- + /* hdaps_dmi_match_invert - found an inverted match. */ + static int __init hdaps_dmi_match_invert(const struct dmi_system_id *id) + { +- hdaps_invert = (unsigned long)id->driver_data; +- pr_info("inverting axis (%u) readings\n", hdaps_invert); +- return hdaps_dmi_match(id); ++ unsigned int orient = (kernel_ulong_t) id->driver_data; ++ hdaps_invert = orient; ++ pr_info("%s detected, setting orientation %u\n", id->ident, orient); ++ return 1; /* stop enumeration */ + } + +-#define HDAPS_DMI_MATCH_INVERT(vendor, model, axes) { \ ++#define HDAPS_DMI_MATCH_INVERT(vendor, model, orient) { \ + .ident = vendor " " model, \ + .callback = hdaps_dmi_match_invert, \ +- .driver_data = (void *)axes, \ ++ .driver_data = (void *)(orient), \ + .matches = { \ + DMI_MATCH(DMI_BOARD_VENDOR, vendor), \ + DMI_MATCH(DMI_PRODUCT_VERSION, model) \ + } \ + } + +-#define HDAPS_DMI_MATCH_NORMAL(vendor, model) \ +- HDAPS_DMI_MATCH_INVERT(vendor, model, 0) +- +-/* Note that HDAPS_DMI_MATCH_NORMAL("ThinkPad T42") would match +- "ThinkPad T42p", so the order of the entries matters. +- If your ThinkPad is not recognized, please update to latest +- BIOS. This is especially the case for some R52 ThinkPads. */ +-static const struct dmi_system_id hdaps_whitelist[] __initconst = { +- HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad R50p", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R50"), +- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R51"), +- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad R52"), +- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61i", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T41p", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T41"), +- HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T42p", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T42"), +- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad T43"), +- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T400", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61p", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad X40"), +- HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad X41", HDAPS_Y_AXIS), +- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61s", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_NORMAL("IBM", "ThinkPad Z60m"), +- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad Z61m", HDAPS_BOTH_AXES), +- HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad Z61p", HDAPS_BOTH_AXES), ++/* List of models with abnormal axis configuration. ++ Note that HDAPS_DMI_MATCH_NORMAL("ThinkPad T42") would match ++ "ThinkPad T42p", and enumeration stops after first match, ++ so the order of the entries matters. */ ++const struct dmi_system_id hdaps_whitelist[] __initconst = { ++ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad R50p", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad R60", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T41p", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad T42p", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad X40", HDAPS_ORIENT_INVERT_Y), ++ HDAPS_DMI_MATCH_INVERT("IBM", "ThinkPad X41", HDAPS_ORIENT_INVERT_Y), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R60", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R61", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R400", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad R500", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T60", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T61", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60 Tablet", HDAPS_ORIENT_INVERT_Y), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60s", HDAPS_ORIENT_INVERT_Y), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X60", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_X), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X61", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_X), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T400s", HDAPS_ORIENT_INVERT_X), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T400", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T410s", HDAPS_ORIENT_SWAP), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T410", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T500", HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad T510", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_X | HDAPS_ORIENT_INVERT_Y), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad W510", HDAPS_ORIENT_MAX), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad W520", HDAPS_ORIENT_MAX), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X200s", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X200", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_X | HDAPS_ORIENT_INVERT_Y), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X201 Tablet", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X201s", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_XY), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X201", HDAPS_ORIENT_SWAP | HDAPS_ORIENT_INVERT_X), ++ HDAPS_DMI_MATCH_INVERT("LENOVO", "ThinkPad X220", HDAPS_ORIENT_SWAP), + { .ident = NULL } + }; + + static int __init hdaps_init(void) + { +- struct input_dev *idev; + int ret; + +- if (!dmi_check_system(hdaps_whitelist)) { +- pr_warn("supported laptop not found!\n"); +- ret = -ENODEV; +- goto out; +- } +- +- if (!request_region(HDAPS_LOW_PORT, HDAPS_NR_PORTS, "hdaps")) { +- ret = -ENXIO; +- goto out; +- } +- ++ /* Determine axis orientation orientation */ ++ if (hdaps_invert == HDAPS_ORIENT_UNDEFINED) /* set by module param? */ ++ if (dmi_check_system(hdaps_whitelist) < 1) /* in whitelist? */ ++ hdaps_invert = 0; /* default */ ++ ++ /* Init timer before platform_driver_register, in case of suspend */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(4,15,0) ++ init_timer(&hdaps_timer); ++ hdaps_timer.function = hdaps_mousedev_poll; ++#else ++ timer_setup(&hdaps_timer, hdaps_mousedev_poll, 0); ++#endif + ret = platform_driver_register(&hdaps_driver); + if (ret) +- goto out_region; ++ goto out; + + pdev = platform_device_register_simple("hdaps", -1, NULL, 0); + if (IS_ERR(pdev)) { +@@ -559,47 +789,79 @@ static int __init hdaps_init(void) + if (ret) + goto out_device; + +- hdaps_idev = input_allocate_polled_device(); ++ hdaps_idev = input_allocate_device(); + if (!hdaps_idev) { + ret = -ENOMEM; + goto out_group; + } + +- hdaps_idev->poll = hdaps_mousedev_poll; +- hdaps_idev->poll_interval = HDAPS_POLL_INTERVAL; +- +- /* initial calibrate for the input device */ +- hdaps_calibrate(); ++ hdaps_idev_raw = input_allocate_device(); ++ if (!hdaps_idev_raw) { ++ ret = -ENOMEM; ++ goto out_idev_first; ++ } + +- /* initialize the input class */ +- idev = hdaps_idev->input; +- idev->name = "hdaps"; +- idev->phys = "isa1600/input0"; +- idev->id.bustype = BUS_ISA; +- idev->dev.parent = &pdev->dev; +- idev->evbit[0] = BIT_MASK(EV_ABS); +- input_set_abs_params(idev, ABS_X, ++ /* calibration for the input device (deferred to avoid delay) */ ++ needs_calibration = 1; ++ ++ /* initialize the joystick-like fuzzed input device */ ++ hdaps_idev->name = "ThinkPad HDAPS joystick emulation"; ++ hdaps_idev->phys = "hdaps/input0"; ++ hdaps_idev->id.bustype = BUS_HOST; ++ hdaps_idev->id.vendor = HDAPS_INPUT_VENDOR; ++ hdaps_idev->id.product = HDAPS_INPUT_PRODUCT; ++ hdaps_idev->id.version = HDAPS_INPUT_JS_VERSION; ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ++ hdaps_idev->cdev.dev = &pdev->dev; ++#endif ++ hdaps_idev->evbit[0] = BIT(EV_ABS); ++ hdaps_idev->open = hdaps_mousedev_open; ++ hdaps_idev->close = hdaps_mousedev_close; ++ input_set_abs_params(hdaps_idev, ABS_X, + -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT); +- input_set_abs_params(idev, ABS_Y, ++ input_set_abs_params(hdaps_idev, ABS_Y, + -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT); + +- ret = input_register_polled_device(hdaps_idev); ++ ret = input_register_device(hdaps_idev); + if (ret) + goto out_idev; + +- pr_info("driver successfully loaded\n"); ++ /* initialize the raw data input device */ ++ hdaps_idev_raw->name = "ThinkPad HDAPS accelerometer data"; ++ hdaps_idev_raw->phys = "hdaps/input1"; ++ hdaps_idev_raw->id.bustype = BUS_HOST; ++ hdaps_idev_raw->id.vendor = HDAPS_INPUT_VENDOR; ++ hdaps_idev_raw->id.product = HDAPS_INPUT_PRODUCT; ++ hdaps_idev_raw->id.version = HDAPS_INPUT_RAW_VERSION; ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,25) ++ hdaps_idev_raw->cdev.dev = &pdev->dev; ++#endif ++ hdaps_idev_raw->evbit[0] = BIT(EV_ABS); ++ hdaps_idev_raw->open = hdaps_mousedev_open; ++ hdaps_idev_raw->close = hdaps_mousedev_close; ++ input_set_abs_params(hdaps_idev_raw, ABS_X, -32768, 32767, 0, 0); ++ input_set_abs_params(hdaps_idev_raw, ABS_Y, -32768, 32767, 0, 0); ++ ++ ret = input_register_device(hdaps_idev_raw); ++ if (ret) ++ goto out_idev_reg_first; ++ ++ pr_info("driver successfully loaded.\n"); + return 0; + ++out_idev_reg_first: ++ input_unregister_device(hdaps_idev); + out_idev: +- input_free_polled_device(hdaps_idev); ++ input_free_device(hdaps_idev_raw); ++out_idev_first: ++ input_free_device(hdaps_idev); + out_group: + sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group); + out_device: + platform_device_unregister(pdev); + out_driver: + platform_driver_unregister(&hdaps_driver); +-out_region: +- release_region(HDAPS_LOW_PORT, HDAPS_NR_PORTS); ++ hdaps_device_shutdown(); + out: + pr_warn("driver init failed (ret=%d)!\n", ret); + return ret; +@@ -607,12 +869,12 @@ static int __init hdaps_init(void) + + static void __exit hdaps_exit(void) + { +- input_unregister_polled_device(hdaps_idev); +- input_free_polled_device(hdaps_idev); ++ input_unregister_device(hdaps_idev_raw); ++ input_unregister_device(hdaps_idev); ++ hdaps_device_shutdown(); /* ignore errors, effect is negligible */ + sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group); + platform_device_unregister(pdev); + platform_driver_unregister(&hdaps_driver); +- release_region(HDAPS_LOW_PORT, HDAPS_NR_PORTS); + + pr_info("driver unloaded\n"); + } +@@ -620,9 +882,8 @@ static void __exit hdaps_exit(void) + module_init(hdaps_init); + module_exit(hdaps_exit); + +-module_param_named(invert, hdaps_invert, int, 0); +-MODULE_PARM_DESC(invert, "invert data along each axis. 1 invert x-axis, " +- "2 invert y-axis, 3 invert both axes."); ++module_param_named(invert, hdaps_invert, uint, 0); ++MODULE_PARM_DESC(invert, "axis orientation code"); + + MODULE_AUTHOR("Robert Love"); + MODULE_DESCRIPTION("IBM Hard Drive Active Protection System (HDAPS) driver"); +diff --git a/drivers/platform/x86/intel_ips.c b/drivers/platform/x86/intel_ips.c +index bffe548187ee..c2918ee3e100 100644 +--- a/drivers/platform/x86/intel_ips.c ++++ b/drivers/platform/x86/intel_ips.c +@@ -798,7 +798,7 @@ static int ips_adjust(void *data) + ips_gpu_lower(ips); + + sleep: +- schedule_timeout_interruptible(msecs_to_jiffies(IPS_ADJUST_PERIOD)); ++ schedule_msec_hrtimeout_interruptible((IPS_ADJUST_PERIOD)); + } while (!kthread_should_stop()); + + dev_dbg(ips->dev, "ips-adjust thread stopped\n"); +@@ -974,7 +974,7 @@ static int ips_monitor(void *data) + seqno_timestamp = get_jiffies_64(); + + old_cpu_power = thm_readl(THM_CEC); +- schedule_timeout_interruptible(msecs_to_jiffies(IPS_SAMPLE_PERIOD)); ++ schedule_msec_hrtimeout_interruptible((IPS_SAMPLE_PERIOD)); + + /* Collect an initial average */ + for (i = 0; i < IPS_SAMPLE_COUNT; i++) { +@@ -1001,7 +1001,7 @@ static int ips_monitor(void *data) + mchp_samples[i] = mchp; + } + +- schedule_timeout_interruptible(msecs_to_jiffies(IPS_SAMPLE_PERIOD)); ++ schedule_msec_hrtimeout_interruptible((IPS_SAMPLE_PERIOD)); + if (kthread_should_stop()) + break; + } +@@ -1028,7 +1028,7 @@ static int ips_monitor(void *data) + * us to reduce the sample frequency if the CPU and GPU are idle. + */ + old_cpu_power = thm_readl(THM_CEC); +- schedule_timeout_interruptible(msecs_to_jiffies(IPS_SAMPLE_PERIOD)); ++ schedule_msec_hrtimeout_interruptible((IPS_SAMPLE_PERIOD)); + last_sample_period = IPS_SAMPLE_PERIOD; + + timer_setup(&ips->timer, monitor_timeout, TIMER_DEFERRABLE); +diff --git a/drivers/platform/x86/thinkpad_ec.c b/drivers/platform/x86/thinkpad_ec.c +new file mode 100644 +index 000000000000..597614bc17e6 +--- /dev/null ++++ b/drivers/platform/x86/thinkpad_ec.c +@@ -0,0 +1,513 @@ ++/* ++ * thinkpad_ec.c - ThinkPad embedded controller LPC3 functions ++ * ++ * The embedded controller on ThinkPad laptops has a non-standard interface, ++ * where LPC channel 3 of the H8S EC chip is hooked up to IO ports ++ * 0x1600-0x161F and implements (a special case of) the H8S LPC protocol. ++ * The EC LPC interface provides various system management services (currently ++ * known: battery information and accelerometer readouts). This driver ++ * provides access and mutual exclusion for the EC interface. ++* ++ * The LPC protocol and terminology are documented here: ++ * "H8S/2104B Group Hardware Manual", ++ * http://documentation.renesas.com/eng/products/mpumcu/rej09b0300_2140bhm.pdf ++ * ++ * Copyright (C) 2006-2007 Shem Multinymous ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,26) ++ #include ++#else ++ #include ++#endif ++ ++#define TP_VERSION "0.42" ++ ++MODULE_AUTHOR("Shem Multinymous"); ++MODULE_DESCRIPTION("ThinkPad embedded controller hardware access"); ++MODULE_VERSION(TP_VERSION); ++MODULE_LICENSE("GPL"); ++ ++/* IO ports used by embedded controller LPC channel 3: */ ++#define TPC_BASE_PORT 0x1600 ++#define TPC_NUM_PORTS 0x20 ++#define TPC_STR3_PORT 0x1604 /* Reads H8S EC register STR3 */ ++#define TPC_TWR0_PORT 0x1610 /* Mapped to H8S EC register TWR0MW/SW */ ++#define TPC_TWR15_PORT 0x161F /* Mapped to H8S EC register TWR15. */ ++ /* (and port TPC_TWR0_PORT+i is mapped to H8S reg TWRi for 00x%02x", \ ++ msg, args->val[0x0], args->val[0xF], code) ++ ++/* State of request prefetching: */ ++static u8 prefetch_arg0, prefetch_argF; /* Args of last prefetch */ ++static u64 prefetch_jiffies; /* time of prefetch, or: */ ++#define TPC_PREFETCH_NONE INITIAL_JIFFIES /* No prefetch */ ++#define TPC_PREFETCH_JUNK (INITIAL_JIFFIES+1) /* Ignore prefetch */ ++ ++/* Locking: */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) ++static DECLARE_MUTEX(thinkpad_ec_mutex); ++#else ++static DEFINE_SEMAPHORE(thinkpad_ec_mutex); ++#endif ++ ++/* Kludge in case the ACPI DSDT reserves the ports we need. */ ++static bool force_io; /* Willing to do IO to ports we couldn't reserve? */ ++static int reserved_io; /* Successfully reserved the ports? */ ++module_param_named(force_io, force_io, bool, 0600); ++MODULE_PARM_DESC(force_io, "Force IO even if region already reserved (0=off, 1=on)"); ++ ++/** ++ * thinkpad_ec_lock - get lock on the ThinkPad EC ++ * ++ * Get exclusive lock for accesing the ThinkPad embedded controller LPC3 ++ * interface. Returns 0 iff lock acquired. ++ */ ++int thinkpad_ec_lock(void) ++{ ++ int ret; ++ ret = down_interruptible(&thinkpad_ec_mutex); ++ return ret; ++} ++EXPORT_SYMBOL_GPL(thinkpad_ec_lock); ++ ++/** ++ * thinkpad_ec_try_lock - try getting lock on the ThinkPad EC ++ * ++ * Try getting an exclusive lock for accesing the ThinkPad embedded ++ * controller LPC3. Returns immediately if lock is not available; neither ++ * blocks nor sleeps. Returns 0 iff lock acquired . ++ */ ++int thinkpad_ec_try_lock(void) ++{ ++ return down_trylock(&thinkpad_ec_mutex); ++} ++EXPORT_SYMBOL_GPL(thinkpad_ec_try_lock); ++ ++/** ++ * thinkpad_ec_unlock - release lock on ThinkPad EC ++ * ++ * Release a previously acquired exclusive lock on the ThinkPad ebmedded ++ * controller LPC3 interface. ++ */ ++void thinkpad_ec_unlock(void) ++{ ++ up(&thinkpad_ec_mutex); ++} ++EXPORT_SYMBOL_GPL(thinkpad_ec_unlock); ++ ++/** ++ * thinkpad_ec_request_row - tell embedded controller to prepare a row ++ * @args Input register arguments ++ * ++ * Requests a data row by writing to H8S LPC registers TRW0 through TWR15 (or ++ * a subset thereof) following the protocol prescribed by the "H8S/2104B Group ++ * Hardware Manual". Does sanity checks via status register STR3. ++ */ ++static int thinkpad_ec_request_row(const struct thinkpad_ec_row *args) ++{ ++ u8 str3; ++ int i; ++ ++ /* EC protocol requires write to TWR0 (function code): */ ++ if (!(args->mask & 0x0001)) { ++ printk(KERN_ERR MSG_FMT("bad args->mask=0x%02x", args->mask)); ++ return -EINVAL; ++ } ++ ++ /* Check initial STR3 status: */ ++ str3 = inb(TPC_STR3_PORT) & H8S_STR3_MASK; ++ if (str3 & H8S_STR3_OBF3B) { /* data already pending */ ++ inb(TPC_TWR15_PORT); /* marks end of previous transaction */ ++ if (prefetch_jiffies == TPC_PREFETCH_NONE) ++ printk(KERN_WARNING REQ_FMT( ++ "EC has result from unrequested transaction", ++ str3)); ++ return -EBUSY; /* EC will be ready in a few usecs */ ++ } else if (str3 == H8S_STR3_SWMF) { /* busy with previous request */ ++ if (prefetch_jiffies == TPC_PREFETCH_NONE) ++ printk(KERN_WARNING REQ_FMT( ++ "EC is busy with unrequested transaction", ++ str3)); ++ return -EBUSY; /* data will be pending in a few usecs */ ++ } else if (str3 != 0x00) { /* unexpected status? */ ++ printk(KERN_WARNING REQ_FMT("unexpected initial STR3", str3)); ++ return -EIO; ++ } ++ ++ /* Send TWR0MW: */ ++ outb(args->val[0], TPC_TWR0_PORT); ++ str3 = inb(TPC_STR3_PORT) & H8S_STR3_MASK; ++ if (str3 != H8S_STR3_MWMF) { /* not accepted? */ ++ printk(KERN_WARNING REQ_FMT("arg0 rejected", str3)); ++ return -EIO; ++ } ++ ++ /* Send TWR1 through TWR14: */ ++ for (i = 1; i < TP_CONTROLLER_ROW_LEN-1; i++) ++ if ((args->mask>>i)&1) ++ outb(args->val[i], TPC_TWR0_PORT+i); ++ ++ /* Send TWR15 (default to 0x01). This marks end of command. */ ++ outb((args->mask & 0x8000) ? args->val[0xF] : 0x01, TPC_TWR15_PORT); ++ ++ /* Wait until EC starts writing its reply (~60ns on average). ++ * Releasing locks before this happens may cause an EC hang ++ * due to firmware bug! ++ */ ++ for (i = 0; i < TPC_REQUEST_RETRIES; i++) { ++ str3 = inb(TPC_STR3_PORT) & H8S_STR3_MASK; ++ if (str3 & H8S_STR3_SWMF) /* EC started replying */ ++ return 0; ++ else if (!(str3 & ~(H8S_STR3_IBF3B|H8S_STR3_MWMF))) ++ /* Normal progress (the EC hasn't seen the request ++ * yet, or is processing it). Wait it out. */ ++ ndelay(TPC_REQUEST_NDELAY); ++ else { /* weird EC status */ ++ printk(KERN_WARNING ++ REQ_FMT("bad end STR3", str3)); ++ return -EIO; ++ } ++ } ++ printk(KERN_WARNING REQ_FMT("EC is mysteriously silent", str3)); ++ return -EIO; ++} ++ ++/** ++ * thinkpad_ec_read_data - read pre-requested row-data from EC ++ * @args Input register arguments of pre-requested rows ++ * @data Output register values ++ * ++ * Reads current row data from the controller, assuming it's already ++ * requested. Follows the H8S spec for register access and status checks. ++ */ ++static int thinkpad_ec_read_data(const struct thinkpad_ec_row *args, ++ struct thinkpad_ec_row *data) ++{ ++ int i; ++ u8 str3 = inb(TPC_STR3_PORT) & H8S_STR3_MASK; ++ /* Once we make a request, STR3 assumes the sequence of values listed ++ * in the following 'if' as it reads the request and writes its data. ++ * It takes about a few dozen nanosecs total, with very high variance. ++ */ ++ if (str3 == (H8S_STR3_IBF3B|H8S_STR3_MWMF) || ++ str3 == 0x00 || /* the 0x00 is indistinguishable from idle EC! */ ++ str3 == H8S_STR3_SWMF) ++ return -EBUSY; /* not ready yet */ ++ /* Finally, the EC signals output buffer full: */ ++ if (str3 != (H8S_STR3_OBF3B|H8S_STR3_SWMF)) { ++ printk(KERN_WARNING ++ REQ_FMT("bad initial STR3", str3)); ++ return -EIO; ++ } ++ ++ /* Read first byte (signals start of read transactions): */ ++ data->val[0] = inb(TPC_TWR0_PORT); ++ /* Optionally read 14 more bytes: */ ++ for (i = 1; i < TP_CONTROLLER_ROW_LEN-1; i++) ++ if ((data->mask >> i)&1) ++ data->val[i] = inb(TPC_TWR0_PORT+i); ++ /* Read last byte from 0x161F (signals end of read transaction): */ ++ data->val[0xF] = inb(TPC_TWR15_PORT); ++ ++ /* Readout still pending? */ ++ str3 = inb(TPC_STR3_PORT) & H8S_STR3_MASK; ++ if (str3 & H8S_STR3_OBF3B) ++ printk(KERN_WARNING ++ REQ_FMT("OBF3B=1 after read", str3)); ++ /* If port 0x161F returns 0x80 too often, the EC may lock up. Warn: */ ++ if (data->val[0xF] == 0x80) ++ printk(KERN_WARNING ++ REQ_FMT("0x161F reports error", data->val[0xF])); ++ return 0; ++} ++ ++/** ++ * thinkpad_ec_is_row_fetched - is the given row currently prefetched? ++ * ++ * To keep things simple we compare only the first and last args; ++ * this suffices for all known cases. ++ */ ++static int thinkpad_ec_is_row_fetched(const struct thinkpad_ec_row *args) ++{ ++ return (prefetch_jiffies != TPC_PREFETCH_NONE) && ++ (prefetch_jiffies != TPC_PREFETCH_JUNK) && ++ (prefetch_arg0 == args->val[0]) && ++ (prefetch_argF == args->val[0xF]) && ++ (get_jiffies_64() < prefetch_jiffies + TPC_PREFETCH_TIMEOUT); ++} ++ ++/** ++ * thinkpad_ec_read_row - request and read data from ThinkPad EC ++ * @args Input register arguments ++ * @data Output register values ++ * ++ * Read a data row from the ThinkPad embedded controller LPC3 interface. ++ * Does fetching and retrying if needed. The row is specified by an ++ * array of 16 bytes, some of which may be undefined (but the first is ++ * mandatory). These bytes are given in @args->val[], where @args->val[i] is ++ * used iff (@args->mask>>i)&1). The resulting row data is stored in ++ * @data->val[], but is only guaranteed to be valid for indices corresponding ++ * to set bit in @data->mask. That is, if @data->mask&(1<val[i] is undefined. ++ * ++ * Returns -EBUSY on transient error and -EIO on abnormal condition. ++ * Caller must hold controller lock. ++ */ ++int thinkpad_ec_read_row(const struct thinkpad_ec_row *args, ++ struct thinkpad_ec_row *data) ++{ ++ int retries, ret; ++ ++ if (thinkpad_ec_is_row_fetched(args)) ++ goto read_row; /* already requested */ ++ ++ /* Request the row */ ++ for (retries = 0; retries < TPC_READ_RETRIES; ++retries) { ++ ret = thinkpad_ec_request_row(args); ++ if (!ret) ++ goto read_row; ++ if (ret != -EBUSY) ++ break; ++ ndelay(TPC_READ_NDELAY); ++ } ++ printk(KERN_ERR REQ_FMT("failed requesting row", ret)); ++ goto out; ++ ++read_row: ++ /* Read the row's data */ ++ for (retries = 0; retries < TPC_READ_RETRIES; ++retries) { ++ ret = thinkpad_ec_read_data(args, data); ++ if (!ret) ++ goto out; ++ if (ret != -EBUSY) ++ break; ++ ndelay(TPC_READ_NDELAY); ++ } ++ ++ printk(KERN_ERR REQ_FMT("failed waiting for data", ret)); ++ ++out: ++ prefetch_jiffies = TPC_PREFETCH_JUNK; ++ return ret; ++} ++EXPORT_SYMBOL_GPL(thinkpad_ec_read_row); ++ ++/** ++ * thinkpad_ec_try_read_row - try reading prefetched data from ThinkPad EC ++ * @args Input register arguments ++ * @data Output register values ++ * ++ * Try reading a data row from the ThinkPad embedded controller LPC3 ++ * interface, if this raw was recently prefetched using ++ * thinkpad_ec_prefetch_row(). Does not fetch, retry or block. ++ * The parameters have the same meaning as in thinkpad_ec_read_row(). ++ * ++ * Returns -EBUSY is data not ready and -ENODATA if row not prefetched. ++ * Caller must hold controller lock. ++ */ ++int thinkpad_ec_try_read_row(const struct thinkpad_ec_row *args, ++ struct thinkpad_ec_row *data) ++{ ++ int ret; ++ if (!thinkpad_ec_is_row_fetched(args)) { ++ ret = -ENODATA; ++ } else { ++ ret = thinkpad_ec_read_data(args, data); ++ if (!ret) ++ prefetch_jiffies = TPC_PREFETCH_NONE; /* eaten up */ ++ } ++ return ret; ++} ++EXPORT_SYMBOL_GPL(thinkpad_ec_try_read_row); ++ ++/** ++ * thinkpad_ec_prefetch_row - prefetch data from ThinkPad EC ++ * @args Input register arguments ++ * ++ * Prefetch a data row from the ThinkPad embedded controller LCP3 ++ * interface. A subsequent call to thinkpad_ec_read_row() with the ++ * same arguments will be faster, and a subsequent call to ++ * thinkpad_ec_try_read_row() stands a good chance of succeeding if ++ * done neither too soon nor too late. See ++ * thinkpad_ec_read_row() for the meaning of @args. ++ * ++ * Returns -EBUSY on transient error and -EIO on abnormal condition. ++ * Caller must hold controller lock. ++ */ ++int thinkpad_ec_prefetch_row(const struct thinkpad_ec_row *args) ++{ ++ int ret; ++ ret = thinkpad_ec_request_row(args); ++ if (ret) { ++ prefetch_jiffies = TPC_PREFETCH_JUNK; ++ } else { ++ prefetch_jiffies = get_jiffies_64(); ++ prefetch_arg0 = args->val[0x0]; ++ prefetch_argF = args->val[0xF]; ++ } ++ return ret; ++} ++EXPORT_SYMBOL_GPL(thinkpad_ec_prefetch_row); ++ ++/** ++ * thinkpad_ec_invalidate - invalidate prefetched ThinkPad EC data ++ * ++ * Invalidate the data prefetched via thinkpad_ec_prefetch_row() from the ++ * ThinkPad embedded controller LPC3 interface. ++ * Must be called before unlocking by any code that accesses the controller ++ * ports directly. ++ */ ++void thinkpad_ec_invalidate(void) ++{ ++ prefetch_jiffies = TPC_PREFETCH_JUNK; ++} ++EXPORT_SYMBOL_GPL(thinkpad_ec_invalidate); ++ ++ ++/*** Checking for EC hardware ***/ ++ ++/** ++ * thinkpad_ec_test - verify the EC is present and follows protocol ++ * ++ * Ensure the EC LPC3 channel really works on this machine by making ++ * an EC request and seeing if the EC follows the documented H8S protocol. ++ * The requested row just reads battery status, so it should be harmless to ++ * access it (on a correct EC). ++ * This test writes to IO ports, so execute only after checking DMI. ++ */ ++static int __init thinkpad_ec_test(void) ++{ ++ int ret; ++ const struct thinkpad_ec_row args = /* battery 0 basic status */ ++ { .mask = 0x8001, .val = {0x01,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x00} }; ++ struct thinkpad_ec_row data = { .mask = 0x0000 }; ++ ret = thinkpad_ec_lock(); ++ if (ret) ++ return ret; ++ ret = thinkpad_ec_read_row(&args, &data); ++ thinkpad_ec_unlock(); ++ return ret; ++} ++ ++/* Search all DMI device names of a given type for a substring */ ++static int __init dmi_find_substring(int type, const char *substr) ++{ ++ const struct dmi_device *dev = NULL; ++ while ((dev = dmi_find_device(type, NULL, dev))) { ++ if (strstr(dev->name, substr)) ++ return 1; ++ } ++ return 0; ++} ++ ++#define TP_DMI_MATCH(vendor,model) { \ ++ .ident = vendor " " model, \ ++ .matches = { \ ++ DMI_MATCH(DMI_BOARD_VENDOR, vendor), \ ++ DMI_MATCH(DMI_PRODUCT_VERSION, model) \ ++ } \ ++} ++ ++/* Check DMI for existence of ThinkPad embedded controller */ ++static int __init check_dmi_for_ec(void) ++{ ++ /* A few old models that have a good EC but don't report it in DMI */ ++ struct dmi_system_id tp_whitelist[] = { ++ TP_DMI_MATCH("IBM", "ThinkPad A30"), ++ TP_DMI_MATCH("IBM", "ThinkPad T23"), ++ TP_DMI_MATCH("IBM", "ThinkPad X24"), ++ TP_DMI_MATCH("LENOVO", "ThinkPad"), ++ { .ident = NULL } ++ }; ++ return dmi_find_substring(DMI_DEV_TYPE_OEM_STRING, ++ "IBM ThinkPad Embedded Controller") || ++ dmi_check_system(tp_whitelist); ++} ++ ++/*** Init and cleanup ***/ ++ ++static int __init thinkpad_ec_init(void) ++{ ++ if (!check_dmi_for_ec()) { ++ printk(KERN_WARNING ++ "thinkpad_ec: no ThinkPad embedded controller!\n"); ++ return -ENODEV; ++ } ++ ++ if (request_region(TPC_BASE_PORT, TPC_NUM_PORTS, "thinkpad_ec")) { ++ reserved_io = 1; ++ } else { ++ printk(KERN_ERR "thinkpad_ec: cannot claim IO ports %#x-%#x... ", ++ TPC_BASE_PORT, ++ TPC_BASE_PORT + TPC_NUM_PORTS - 1); ++ if (force_io) { ++ printk("forcing use of unreserved IO ports.\n"); ++ } else { ++ printk("consider using force_io=1.\n"); ++ return -ENXIO; ++ } ++ } ++ prefetch_jiffies = TPC_PREFETCH_JUNK; ++ if (thinkpad_ec_test()) { ++ printk(KERN_ERR "thinkpad_ec: initial ec test failed\n"); ++ if (reserved_io) ++ release_region(TPC_BASE_PORT, TPC_NUM_PORTS); ++ return -ENXIO; ++ } ++ printk(KERN_INFO "thinkpad_ec: thinkpad_ec " TP_VERSION " loaded.\n"); ++ return 0; ++} ++ ++static void __exit thinkpad_ec_exit(void) ++{ ++ if (reserved_io) ++ release_region(TPC_BASE_PORT, TPC_NUM_PORTS); ++ printk(KERN_INFO "thinkpad_ec: unloaded.\n"); ++} ++ ++module_init(thinkpad_ec_init); ++module_exit(thinkpad_ec_exit); +diff --git a/drivers/platform/x86/tp_smapi.c b/drivers/platform/x86/tp_smapi.c +new file mode 100644 +index 000000000000..209cb6487e24 +--- /dev/null ++++ b/drivers/platform/x86/tp_smapi.c +@@ -0,0 +1,1493 @@ ++/* ++ * tp_smapi.c - ThinkPad SMAPI support ++ * ++ * This driver exposes some features of the System Management Application ++ * Program Interface (SMAPI) BIOS found on ThinkPad laptops. It works on ++ * models in which the SMAPI BIOS runs in SMM and is invoked by writing ++ * to the APM control port 0xB2. ++ * It also exposes battery status information, obtained from the ThinkPad ++ * embedded controller (via the thinkpad_ec module). ++ * Ancient ThinkPad models use a different interface, supported by the ++ * "thinkpad" module from "tpctl". ++ * ++ * Many of the battery status values obtained from the EC simply mirror ++ * values provided by the battery's Smart Battery System (SBS) interface, so ++ * their meaning is defined by the Smart Battery Data Specification (see ++ * http://sbs-forum.org/specs/sbdat110.pdf). References to this SBS spec ++ * are given in the code where relevant. ++ * ++ * Copyright (C) 2006 Shem Multinymous . ++ * SMAPI access code based on the mwave driver by Mike Sullivan. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include /* CMOS defines */ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define TP_VERSION "0.42" ++#define TP_DESC "ThinkPad SMAPI Support" ++#define TP_DIR "smapi" ++ ++MODULE_AUTHOR("Shem Multinymous"); ++MODULE_DESCRIPTION(TP_DESC); ++MODULE_VERSION(TP_VERSION); ++MODULE_LICENSE("GPL"); ++ ++static struct platform_device *pdev; ++ ++static int tp_debug; ++module_param_named(debug, tp_debug, int, 0600); ++MODULE_PARM_DESC(debug, "Debug level (0=off, 1=on)"); ++ ++/* A few macros for printk()ing: */ ++#define TPRINTK(level, fmt, args...) \ ++ dev_printk(level, &(pdev->dev), "%s: " fmt "\n", __func__, ## args) ++#define DPRINTK(fmt, args...) \ ++ do { if (tp_debug) TPRINTK(KERN_DEBUG, fmt, ## args); } while (0) ++ ++/********************************************************************* ++ * SMAPI interface ++ */ ++ ++/* SMAPI functions (register BX when making the SMM call). */ ++#define SMAPI_GET_INHIBIT_CHARGE 0x2114 ++#define SMAPI_SET_INHIBIT_CHARGE 0x2115 ++#define SMAPI_GET_THRESH_START 0x2116 ++#define SMAPI_SET_THRESH_START 0x2117 ++#define SMAPI_GET_FORCE_DISCHARGE 0x2118 ++#define SMAPI_SET_FORCE_DISCHARGE 0x2119 ++#define SMAPI_GET_THRESH_STOP 0x211a ++#define SMAPI_SET_THRESH_STOP 0x211b ++ ++/* SMAPI error codes (see ThinkPad 770 Technical Reference Manual p.83 at ++ http://www-307.ibm.com/pc/support/site.wss/document.do?lndocid=PFAN-3TUQQD */ ++#define SMAPI_RETCODE_EOF 0xff ++static struct { u8 rc; char *msg; int ret; } smapi_retcode[] = ++{ ++ {0x00, "OK", 0}, ++ {0x53, "SMAPI function is not available", -ENXIO}, ++ {0x81, "Invalid parameter", -EINVAL}, ++ {0x86, "Function is not supported by SMAPI BIOS", -EOPNOTSUPP}, ++ {0x90, "System error", -EIO}, ++ {0x91, "System is invalid", -EIO}, ++ {0x92, "System is busy, -EBUSY"}, ++ {0xa0, "Device error (disk read error)", -EIO}, ++ {0xa1, "Device is busy", -EBUSY}, ++ {0xa2, "Device is not attached", -ENXIO}, ++ {0xa3, "Device is disbled", -EIO}, ++ {0xa4, "Request parameter is out of range", -EINVAL}, ++ {0xa5, "Request parameter is not accepted", -EINVAL}, ++ {0xa6, "Transient error", -EBUSY}, /* ? */ ++ {SMAPI_RETCODE_EOF, "Unknown error code", -EIO} ++}; ++ ++ ++#define SMAPI_MAX_RETRIES 10 ++#define SMAPI_PORT2 0x4F /* fixed port, meaning unclear */ ++static unsigned short smapi_port; /* APM control port, normally 0xB2 */ ++ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,37) ++static DECLARE_MUTEX(smapi_mutex); ++#else ++static DEFINE_SEMAPHORE(smapi_mutex); ++#endif ++ ++/** ++ * find_smapi_port - read SMAPI port from NVRAM ++ */ ++static int __init find_smapi_port(void) ++{ ++ u16 smapi_id = 0; ++ unsigned short port = 0; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&rtc_lock, flags); ++ smapi_id = CMOS_READ(0x7C); ++ smapi_id |= (CMOS_READ(0x7D) << 8); ++ spin_unlock_irqrestore(&rtc_lock, flags); ++ ++ if (smapi_id != 0x5349) { ++ printk(KERN_ERR "SMAPI not supported (ID=0x%x)\n", smapi_id); ++ return -ENXIO; ++ } ++ spin_lock_irqsave(&rtc_lock, flags); ++ port = CMOS_READ(0x7E); ++ port |= (CMOS_READ(0x7F) << 8); ++ spin_unlock_irqrestore(&rtc_lock, flags); ++ if (port == 0) { ++ printk(KERN_ERR "unable to read SMAPI port number\n"); ++ return -ENXIO; ++ } ++ return port; ++} ++ ++/** ++ * smapi_request - make a SMAPI call ++ * @inEBX, @inECX, @inEDI, @inESI: input registers ++ * @outEBX, @outECX, @outEDX, @outEDI, @outESI: outputs registers ++ * @msg: textual error message ++ * Invokes the SMAPI SMBIOS with the given input and outpu args. ++ * All outputs are optional (can be %NULL). ++ * Returns 0 when successful, and a negative errno constant ++ * (see smapi_retcode above) upon failure. ++ */ ++static int smapi_request(u32 inEBX, u32 inECX, ++ u32 inEDI, u32 inESI, ++ u32 *outEBX, u32 *outECX, u32 *outEDX, ++ u32 *outEDI, u32 *outESI, const char **msg) ++{ ++ int ret = 0; ++ int i; ++ int retries; ++ u8 rc; ++ /* Must use local vars for output regs, due to reg pressure. */ ++ u32 tmpEAX, tmpEBX, tmpECX, tmpEDX, tmpEDI, tmpESI; ++ ++ for (retries = 0; retries < SMAPI_MAX_RETRIES; ++retries) { ++ DPRINTK("req_in: BX=%x CX=%x DI=%x SI=%x", ++ inEBX, inECX, inEDI, inESI); ++ ++ /* SMAPI's SMBIOS call and thinkpad_ec end up using use ++ * different interfaces to the same chip, so play it safe. */ ++ ret = thinkpad_ec_lock(); ++ if (ret) ++ return ret; ++ ++ __asm__ __volatile__( ++ "movl $0x00005380,%%eax\n\t" ++ "movl %6,%%ebx\n\t" ++ "movl %7,%%ecx\n\t" ++ "movl %8,%%edi\n\t" ++ "movl %9,%%esi\n\t" ++ "xorl %%edx,%%edx\n\t" ++ "movw %10,%%dx\n\t" ++ "out %%al,%%dx\n\t" /* trigger SMI to SMBIOS */ ++ "out %%al,$0x4F\n\t" ++ "movl %%eax,%0\n\t" ++ "movl %%ebx,%1\n\t" ++ "movl %%ecx,%2\n\t" ++ "movl %%edx,%3\n\t" ++ "movl %%edi,%4\n\t" ++ "movl %%esi,%5\n\t" ++ :"=m"(tmpEAX), ++ "=m"(tmpEBX), ++ "=m"(tmpECX), ++ "=m"(tmpEDX), ++ "=m"(tmpEDI), ++ "=m"(tmpESI) ++ :"m"(inEBX), "m"(inECX), "m"(inEDI), "m"(inESI), ++ "m"((u16)smapi_port) ++ :"%eax", "%ebx", "%ecx", "%edx", "%edi", ++ "%esi"); ++ ++ thinkpad_ec_invalidate(); ++ thinkpad_ec_unlock(); ++ ++ /* Don't let the next SMAPI access happen too quickly, ++ * may case problems. (We're hold smapi_mutex). */ ++ msleep(50); ++ ++ if (outEBX) *outEBX = tmpEBX; ++ if (outECX) *outECX = tmpECX; ++ if (outEDX) *outEDX = tmpEDX; ++ if (outESI) *outESI = tmpESI; ++ if (outEDI) *outEDI = tmpEDI; ++ ++ /* Look up error code */ ++ rc = (tmpEAX>>8)&0xFF; ++ for (i = 0; smapi_retcode[i].rc != SMAPI_RETCODE_EOF && ++ smapi_retcode[i].rc != rc; ++i) {} ++ ret = smapi_retcode[i].ret; ++ if (msg) ++ *msg = smapi_retcode[i].msg; ++ ++ DPRINTK("req_out: AX=%x BX=%x CX=%x DX=%x DI=%x SI=%x r=%d", ++ tmpEAX, tmpEBX, tmpECX, tmpEDX, tmpEDI, tmpESI, ret); ++ if (ret) ++ TPRINTK(KERN_NOTICE, "SMAPI error: %s (func=%x)", ++ smapi_retcode[i].msg, inEBX); ++ ++ if (ret != -EBUSY) ++ return ret; ++ } ++ return ret; ++} ++ ++/* Convenience wrapper: discard output arguments */ ++static int smapi_write(u32 inEBX, u32 inECX, ++ u32 inEDI, u32 inESI, const char **msg) ++{ ++ return smapi_request(inEBX, inECX, inEDI, inESI, ++ NULL, NULL, NULL, NULL, NULL, msg); ++} ++ ++ ++/********************************************************************* ++ * Specific SMAPI services ++ * All of these functions return 0 upon success, and a negative errno ++ * constant (see smapi_retcode) on failure. ++ */ ++ ++enum thresh_type { ++ THRESH_STOP = 0, /* the code assumes this is 0 for brevity */ ++ THRESH_START ++}; ++#define THRESH_NAME(which) ((which == THRESH_START) ? "start" : "stop") ++ ++/** ++ * __get_real_thresh - read battery charge start/stop threshold from SMAPI ++ * @bat: battery number (0 or 1) ++ * @which: THRESH_START or THRESH_STOP ++ * @thresh: 1..99, 0=default 1..99, 0=default (pass this as-is to SMAPI) ++ * @outEDI: some additional state that needs to be preserved, meaning unknown ++ * @outESI: some additional state that needs to be preserved, meaning unknown ++ */ ++static int __get_real_thresh(int bat, enum thresh_type which, int *thresh, ++ u32 *outEDI, u32 *outESI) ++{ ++ u32 ebx = (which == THRESH_START) ? SMAPI_GET_THRESH_START ++ : SMAPI_GET_THRESH_STOP; ++ u32 ecx = (bat+1)<<8; ++ const char *msg; ++ int ret = smapi_request(ebx, ecx, 0, 0, NULL, ++ &ecx, NULL, outEDI, outESI, &msg); ++ if (ret) { ++ TPRINTK(KERN_NOTICE, "cannot get %s_thresh of bat=%d: %s", ++ THRESH_NAME(which), bat, msg); ++ return ret; ++ } ++ if (!(ecx&0x00000100)) { ++ TPRINTK(KERN_NOTICE, "cannot get %s_thresh of bat=%d: ecx=0%x", ++ THRESH_NAME(which), bat, ecx); ++ return -EIO; ++ } ++ if (thresh) ++ *thresh = ecx&0xFF; ++ return 0; ++} ++ ++/** ++ * get_real_thresh - read battery charge start/stop threshold from SMAPI ++ * @bat: battery number (0 or 1) ++ * @which: THRESH_START or THRESH_STOP ++ * @thresh: 1..99, 0=default (passes as-is to SMAPI) ++ */ ++static int get_real_thresh(int bat, enum thresh_type which, int *thresh) ++{ ++ return __get_real_thresh(bat, which, thresh, NULL, NULL); ++} ++ ++/** ++ * set_real_thresh - write battery start/top charge threshold to SMAPI ++ * @bat: battery number (0 or 1) ++ * @which: THRESH_START or THRESH_STOP ++ * @thresh: 1..99, 0=default (passes as-is to SMAPI) ++ */ ++static int set_real_thresh(int bat, enum thresh_type which, int thresh) ++{ ++ u32 ebx = (which == THRESH_START) ? SMAPI_SET_THRESH_START ++ : SMAPI_SET_THRESH_STOP; ++ u32 ecx = ((bat+1)<<8) + thresh; ++ u32 getDI, getSI; ++ const char *msg; ++ int ret; ++ ++ /* verify read before writing */ ++ ret = __get_real_thresh(bat, which, NULL, &getDI, &getSI); ++ if (ret) ++ return ret; ++ ++ ret = smapi_write(ebx, ecx, getDI, getSI, &msg); ++ if (ret) ++ TPRINTK(KERN_NOTICE, "set %s to %d for bat=%d failed: %s", ++ THRESH_NAME(which), thresh, bat, msg); ++ else ++ TPRINTK(KERN_INFO, "set %s to %d for bat=%d", ++ THRESH_NAME(which), thresh, bat); ++ return ret; ++} ++ ++/** ++ * __get_inhibit_charge_minutes - get inhibit charge period from SMAPI ++ * @bat: battery number (0 or 1) ++ * @minutes: period in minutes (1..65535 minutes, 0=disabled) ++ * @outECX: some additional state that needs to be preserved, meaning unknown ++ * Note that @minutes is the originally set value, it does not count down. ++ */ ++static int __get_inhibit_charge_minutes(int bat, int *minutes, u32 *outECX) ++{ ++ u32 ecx = (bat+1)<<8; ++ u32 esi; ++ const char *msg; ++ int ret = smapi_request(SMAPI_GET_INHIBIT_CHARGE, ecx, 0, 0, ++ NULL, &ecx, NULL, NULL, &esi, &msg); ++ if (ret) { ++ TPRINTK(KERN_NOTICE, "failed for bat=%d: %s", bat, msg); ++ return ret; ++ } ++ if (!(ecx&0x0100)) { ++ TPRINTK(KERN_NOTICE, "bad ecx=0x%x for bat=%d", ecx, bat); ++ return -EIO; ++ } ++ if (minutes) ++ *minutes = (ecx&0x0001)?esi:0; ++ if (outECX) ++ *outECX = ecx; ++ return 0; ++} ++ ++/** ++ * get_inhibit_charge_minutes - get inhibit charge period from SMAPI ++ * @bat: battery number (0 or 1) ++ * @minutes: period in minutes (1..65535 minutes, 0=disabled) ++ * Note that @minutes is the originally set value, it does not count down. ++ */ ++static int get_inhibit_charge_minutes(int bat, int *minutes) ++{ ++ return __get_inhibit_charge_minutes(bat, minutes, NULL); ++} ++ ++/** ++ * set_inhibit_charge_minutes - write inhibit charge period to SMAPI ++ * @bat: battery number (0 or 1) ++ * @minutes: period in minutes (1..65535 minutes, 0=disabled) ++ */ ++static int set_inhibit_charge_minutes(int bat, int minutes) ++{ ++ u32 ecx; ++ const char *msg; ++ int ret; ++ ++ /* verify read before writing */ ++ ret = __get_inhibit_charge_minutes(bat, NULL, &ecx); ++ if (ret) ++ return ret; ++ ++ ecx = ((bat+1)<<8) | (ecx&0x00FE) | (minutes > 0 ? 0x0001 : 0x0000); ++ if (minutes > 0xFFFF) ++ minutes = 0xFFFF; ++ ret = smapi_write(SMAPI_SET_INHIBIT_CHARGE, ecx, 0, minutes, &msg); ++ if (ret) ++ TPRINTK(KERN_NOTICE, ++ "set to %d failed for bat=%d: %s", minutes, bat, msg); ++ else ++ TPRINTK(KERN_INFO, "set to %d for bat=%d\n", minutes, bat); ++ return ret; ++} ++ ++ ++/** ++ * get_force_discharge - get status of forced discharging from SMAPI ++ * @bat: battery number (0 or 1) ++ * @enabled: 1 if forced discharged is enabled, 0 if not ++ */ ++static int get_force_discharge(int bat, int *enabled) ++{ ++ u32 ecx = (bat+1)<<8; ++ const char *msg; ++ int ret = smapi_request(SMAPI_GET_FORCE_DISCHARGE, ecx, 0, 0, ++ NULL, &ecx, NULL, NULL, NULL, &msg); ++ if (ret) { ++ TPRINTK(KERN_NOTICE, "failed for bat=%d: %s", bat, msg); ++ return ret; ++ } ++ *enabled = (!(ecx&0x00000100) && (ecx&0x00000001))?1:0; ++ return 0; ++} ++ ++/** ++ * set_force_discharge - write status of forced discharging to SMAPI ++ * @bat: battery number (0 or 1) ++ * @enabled: 1 if forced discharged is enabled, 0 if not ++ */ ++static int set_force_discharge(int bat, int enabled) ++{ ++ u32 ecx = (bat+1)<<8; ++ const char *msg; ++ int ret = smapi_request(SMAPI_GET_FORCE_DISCHARGE, ecx, 0, 0, ++ NULL, &ecx, NULL, NULL, NULL, &msg); ++ if (ret) { ++ TPRINTK(KERN_NOTICE, "get failed for bat=%d: %s", bat, msg); ++ return ret; ++ } ++ if (ecx&0x00000100) { ++ TPRINTK(KERN_NOTICE, "cannot force discharge bat=%d", bat); ++ return -EIO; ++ } ++ ++ ecx = ((bat+1)<<8) | (ecx&0x000000FA) | (enabled?0x00000001:0); ++ ret = smapi_write(SMAPI_SET_FORCE_DISCHARGE, ecx, 0, 0, &msg); ++ if (ret) ++ TPRINTK(KERN_NOTICE, "set to %d failed for bat=%d: %s", ++ enabled, bat, msg); ++ else ++ TPRINTK(KERN_INFO, "set to %d for bat=%d", enabled, bat); ++ return ret; ++} ++ ++ ++/********************************************************************* ++ * Wrappers to threshold-related SMAPI functions, which handle default ++ * thresholds and related quirks. ++ */ ++ ++/* Minimum, default and minimum difference for battery charging thresholds: */ ++#define MIN_THRESH_DELTA 4 /* Min delta between start and stop thresh */ ++#define MIN_THRESH_START 2 ++#define MAX_THRESH_START (100-MIN_THRESH_DELTA) ++#define MIN_THRESH_STOP (MIN_THRESH_START + MIN_THRESH_DELTA) ++#define MAX_THRESH_STOP 100 ++#define DEFAULT_THRESH_START MAX_THRESH_START ++#define DEFAULT_THRESH_STOP MAX_THRESH_STOP ++ ++/* The GUI of IBM's Battery Maximizer seems to show a start threshold that ++ * is 1 more than the value we set/get via SMAPI. Since the threshold is ++ * maintained across reboot, this can be confusing. So we kludge our ++ * interface for interoperability: */ ++#define BATMAX_FIX 1 ++ ++/* Get charge start/stop threshold (1..100), ++ * substituting default values if needed and applying BATMAT_FIX. */ ++static int get_thresh(int bat, enum thresh_type which, int *thresh) ++{ ++ int ret = get_real_thresh(bat, which, thresh); ++ if (ret) ++ return ret; ++ if (*thresh == 0) ++ *thresh = (which == THRESH_START) ? DEFAULT_THRESH_START ++ : DEFAULT_THRESH_STOP; ++ else if (which == THRESH_START) ++ *thresh += BATMAX_FIX; ++ return 0; ++} ++ ++ ++/* Set charge start/stop threshold (1..100), ++ * substituting default values if needed and applying BATMAT_FIX. */ ++static int set_thresh(int bat, enum thresh_type which, int thresh) ++{ ++ if (which == THRESH_STOP && thresh == DEFAULT_THRESH_STOP) ++ thresh = 0; /* 100 is out of range, but default means 100 */ ++ if (which == THRESH_START) ++ thresh -= BATMAX_FIX; ++ return set_real_thresh(bat, which, thresh); ++} ++ ++/********************************************************************* ++ * ThinkPad embedded controller readout and basic functions ++ */ ++ ++/** ++ * read_tp_ec_row - read data row from the ThinkPad embedded controller ++ * @arg0: EC command code ++ * @bat: battery number, 0 or 1 ++ * @j: the byte value to be used for "junk" (unused) input/outputs ++ * @dataval: result vector ++ */ ++static int read_tp_ec_row(u8 arg0, int bat, u8 j, u8 *dataval) ++{ ++ int ret; ++ const struct thinkpad_ec_row args = { .mask = 0xFFFF, ++ .val = {arg0, j,j,j,j,j,j,j,j,j,j,j,j,j,j, (u8)bat} }; ++ struct thinkpad_ec_row data = { .mask = 0xFFFF }; ++ ++ ret = thinkpad_ec_lock(); ++ if (ret) ++ return ret; ++ ret = thinkpad_ec_read_row(&args, &data); ++ thinkpad_ec_unlock(); ++ memcpy(dataval, &data.val, TP_CONTROLLER_ROW_LEN); ++ return ret; ++} ++ ++/** ++ * power_device_present - check for presence of battery or AC power ++ * @bat: 0 for battery 0, 1 for battery 1, otherwise AC power ++ * Returns 1 if present, 0 if not present, negative if error. ++ */ ++static int power_device_present(int bat) ++{ ++ u8 row[TP_CONTROLLER_ROW_LEN]; ++ u8 test; ++ int ret = read_tp_ec_row(1, bat, 0, row); ++ if (ret) ++ return ret; ++ switch (bat) { ++ case 0: test = 0x40; break; /* battery 0 */ ++ case 1: test = 0x20; break; /* battery 1 */ ++ default: test = 0x80; /* AC power */ ++ } ++ return (row[0] & test) ? 1 : 0; ++} ++ ++/** ++ * bat_has_status - check if battery can report detailed status ++ * @bat: 0 for battery 0, 1 for battery 1 ++ * Returns 1 if yes, 0 if no, negative if error. ++ */ ++static int bat_has_status(int bat) ++{ ++ u8 row[TP_CONTROLLER_ROW_LEN]; ++ int ret = read_tp_ec_row(1, bat, 0, row); ++ if (ret) ++ return ret; ++ if ((row[0] & (bat?0x20:0x40)) == 0) /* no battery */ ++ return 0; ++ if ((row[1] & (0x60)) == 0) /* no status */ ++ return 0; ++ return 1; ++} ++ ++/** ++ * get_tp_ec_bat_16 - read a 16-bit value from EC battery status data ++ * @arg0: first argument to EC ++ * @off: offset in row returned from EC ++ * @bat: battery (0 or 1) ++ * @val: the 16-bit value obtained ++ * Returns nonzero on error. ++ */ ++static int get_tp_ec_bat_16(u8 arg0, int offset, int bat, u16 *val) ++{ ++ u8 row[TP_CONTROLLER_ROW_LEN]; ++ int ret; ++ if (bat_has_status(bat) != 1) ++ return -ENXIO; ++ ret = read_tp_ec_row(arg0, bat, 0, row); ++ if (ret) ++ return ret; ++ *val = *(u16 *)(row+offset); ++ return 0; ++} ++ ++/********************************************************************* ++ * sysfs attributes for batteries - ++ * definitions and helper functions ++ */ ++ ++/* A custom device attribute struct which holds a battery number */ ++struct bat_device_attribute { ++ struct device_attribute dev_attr; ++ int bat; ++}; ++ ++/** ++ * attr_get_bat - get the battery to which the attribute belongs ++ */ ++static int attr_get_bat(struct device_attribute *attr) ++{ ++ return container_of(attr, struct bat_device_attribute, dev_attr)->bat; ++} ++ ++/** ++ * show_tp_ec_bat_u16 - show an unsigned 16-bit battery attribute ++ * @arg0: specified 1st argument of EC raw to read ++ * @offset: byte offset in EC raw data ++ * @mul: correction factor to multiply by ++ * @na_msg: string to output is value not available (0xFFFFFFFF) ++ * @attr: battery attribute ++ * @buf: output buffer ++ * The 16-bit value is read from the EC, treated as unsigned, ++ * transformed as x->mul*x, and printed to the buffer. ++ * If the value is 0xFFFFFFFF and na_msg!=%NULL, na_msg is printed instead. ++ */ ++static ssize_t show_tp_ec_bat_u16(u8 arg0, int offset, int mul, ++ const char *na_msg, ++ struct device_attribute *attr, char *buf) ++{ ++ u16 val; ++ int ret = get_tp_ec_bat_16(arg0, offset, attr_get_bat(attr), &val); ++ if (ret) ++ return ret; ++ if (na_msg && val == 0xFFFF) ++ return sprintf(buf, "%s\n", na_msg); ++ else ++ return sprintf(buf, "%u\n", mul*(unsigned int)val); ++} ++ ++/** ++ * show_tp_ec_bat_s16 - show an signed 16-bit battery attribute ++ * @arg0: specified 1st argument of EC raw to read ++ * @offset: byte offset in EC raw data ++ * @mul: correction factor to multiply by ++ * @add: correction term to add after multiplication ++ * @attr: battery attribute ++ * @buf: output buffer ++ * The 16-bit value is read from the EC, treated as signed, ++ * transformed as x->mul*x+add, and printed to the buffer. ++ */ ++static ssize_t show_tp_ec_bat_s16(u8 arg0, int offset, int mul, int add, ++ struct device_attribute *attr, char *buf) ++{ ++ u16 val; ++ int ret = get_tp_ec_bat_16(arg0, offset, attr_get_bat(attr), &val); ++ if (ret) ++ return ret; ++ return sprintf(buf, "%d\n", mul*(s16)val+add); ++} ++ ++/** ++ * show_tp_ec_bat_str - show a string from EC battery status data ++ * @arg0: specified 1st argument of EC raw to read ++ * @offset: byte offset in EC raw data ++ * @maxlen: maximum string length ++ * @attr: battery attribute ++ * @buf: output buffer ++ */ ++static ssize_t show_tp_ec_bat_str(u8 arg0, int offset, int maxlen, ++ struct device_attribute *attr, char *buf) ++{ ++ int bat = attr_get_bat(attr); ++ u8 row[TP_CONTROLLER_ROW_LEN]; ++ int ret; ++ if (bat_has_status(bat) != 1) ++ return -ENXIO; ++ ret = read_tp_ec_row(arg0, bat, 0, row); ++ if (ret) ++ return ret; ++ strncpy(buf, (char *)row+offset, maxlen); ++ buf[maxlen] = 0; ++ strcat(buf, "\n"); ++ return strlen(buf); ++} ++ ++/** ++ * show_tp_ec_bat_power - show a power readout from EC battery status data ++ * @arg0: specified 1st argument of EC raw to read ++ * @offV: byte offset of voltage in EC raw data ++ * @offI: byte offset of current in EC raw data ++ * @attr: battery attribute ++ * @buf: output buffer ++ * Computes the power as current*voltage from the two given readout offsets. ++ */ ++static ssize_t show_tp_ec_bat_power(u8 arg0, int offV, int offI, ++ struct device_attribute *attr, char *buf) ++{ ++ u8 row[TP_CONTROLLER_ROW_LEN]; ++ int milliamp, millivolt, ret; ++ int bat = attr_get_bat(attr); ++ if (bat_has_status(bat) != 1) ++ return -ENXIO; ++ ret = read_tp_ec_row(1, bat, 0, row); ++ if (ret) ++ return ret; ++ millivolt = *(u16 *)(row+offV); ++ milliamp = *(s16 *)(row+offI); ++ return sprintf(buf, "%d\n", milliamp*millivolt/1000); /* units: mW */ ++} ++ ++/** ++ * show_tp_ec_bat_date - decode and show a date from EC battery status data ++ * @arg0: specified 1st argument of EC raw to read ++ * @offset: byte offset in EC raw data ++ * @attr: battery attribute ++ * @buf: output buffer ++ */ ++static ssize_t show_tp_ec_bat_date(u8 arg0, int offset, ++ struct device_attribute *attr, char *buf) ++{ ++ u8 row[TP_CONTROLLER_ROW_LEN]; ++ u16 v; ++ int ret; ++ int day, month, year; ++ int bat = attr_get_bat(attr); ++ if (bat_has_status(bat) != 1) ++ return -ENXIO; ++ ret = read_tp_ec_row(arg0, bat, 0, row); ++ if (ret) ++ return ret; ++ ++ /* Decode bit-packed: v = day | (month<<5) | ((year-1980)<<9) */ ++ v = *(u16 *)(row+offset); ++ day = v & 0x1F; ++ month = (v >> 5) & 0xF; ++ year = (v >> 9) + 1980; ++ ++ return sprintf(buf, "%04d-%02d-%02d\n", year, month, day); ++} ++ ++ ++/********************************************************************* ++ * sysfs attribute I/O for batteries - ++ * the actual attribute show/store functions ++ */ ++ ++static ssize_t show_battery_start_charge_thresh(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ int thresh; ++ int bat = attr_get_bat(attr); ++ int ret = get_thresh(bat, THRESH_START, &thresh); ++ if (ret) ++ return ret; ++ return sprintf(buf, "%d\n", thresh); /* units: percent */ ++} ++ ++static ssize_t show_battery_stop_charge_thresh(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ int thresh; ++ int bat = attr_get_bat(attr); ++ int ret = get_thresh(bat, THRESH_STOP, &thresh); ++ if (ret) ++ return ret; ++ return sprintf(buf, "%d\n", thresh); /* units: percent */ ++} ++ ++/** ++ * store_battery_start_charge_thresh - store battery_start_charge_thresh attr ++ * Since this is a kernel<->user interface, we ensure a valid state for ++ * the hardware. We do this by clamping the requested threshold to the ++ * valid range and, if necessary, moving the other threshold so that ++ * it's MIN_THRESH_DELTA away from this one. ++ */ ++static ssize_t store_battery_start_charge_thresh(struct device *dev, ++ struct device_attribute *attr, const char *buf, size_t count) ++{ ++ int thresh, other_thresh, ret; ++ int bat = attr_get_bat(attr); ++ ++ if (sscanf(buf, "%d", &thresh) != 1 || thresh < 1 || thresh > 100) ++ return -EINVAL; ++ ++ if (thresh < MIN_THRESH_START) /* clamp up to MIN_THRESH_START */ ++ thresh = MIN_THRESH_START; ++ if (thresh > MAX_THRESH_START) /* clamp down to MAX_THRESH_START */ ++ thresh = MAX_THRESH_START; ++ ++ down(&smapi_mutex); ++ ret = get_thresh(bat, THRESH_STOP, &other_thresh); ++ if (ret != -EOPNOTSUPP && ret != -ENXIO) { ++ if (ret) /* other threshold is set? */ ++ goto out; ++ ret = get_real_thresh(bat, THRESH_START, NULL); ++ if (ret) /* this threshold is set? */ ++ goto out; ++ if (other_thresh < thresh+MIN_THRESH_DELTA) { ++ /* move other thresh to keep it above this one */ ++ ret = set_thresh(bat, THRESH_STOP, ++ thresh+MIN_THRESH_DELTA); ++ if (ret) ++ goto out; ++ } ++ } ++ ret = set_thresh(bat, THRESH_START, thresh); ++out: ++ up(&smapi_mutex); ++ return count; ++ ++} ++ ++/** ++ * store_battery_stop_charge_thresh - store battery_stop_charge_thresh attr ++ * Since this is a kernel<->user interface, we ensure a valid state for ++ * the hardware. We do this by clamping the requested threshold to the ++ * valid range and, if necessary, moving the other threshold so that ++ * it's MIN_THRESH_DELTA away from this one. ++ */ ++static ssize_t store_battery_stop_charge_thresh(struct device *dev, ++ struct device_attribute *attr, const char *buf, size_t count) ++{ ++ int thresh, other_thresh, ret; ++ int bat = attr_get_bat(attr); ++ ++ if (sscanf(buf, "%d", &thresh) != 1 || thresh < 1 || thresh > 100) ++ return -EINVAL; ++ ++ if (thresh < MIN_THRESH_STOP) /* clamp up to MIN_THRESH_STOP */ ++ thresh = MIN_THRESH_STOP; ++ ++ down(&smapi_mutex); ++ ret = get_thresh(bat, THRESH_START, &other_thresh); ++ if (ret != -EOPNOTSUPP && ret != -ENXIO) { /* other threshold exists? */ ++ if (ret) ++ goto out; ++ /* this threshold exists? */ ++ ret = get_real_thresh(bat, THRESH_STOP, NULL); ++ if (ret) ++ goto out; ++ if (other_thresh >= thresh-MIN_THRESH_DELTA) { ++ /* move other thresh to be below this one */ ++ ret = set_thresh(bat, THRESH_START, ++ thresh-MIN_THRESH_DELTA); ++ if (ret) ++ goto out; ++ } ++ } ++ ret = set_thresh(bat, THRESH_STOP, thresh); ++out: ++ up(&smapi_mutex); ++ return count; ++} ++ ++static ssize_t show_battery_inhibit_charge_minutes(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ int minutes; ++ int bat = attr_get_bat(attr); ++ int ret = get_inhibit_charge_minutes(bat, &minutes); ++ if (ret) ++ return ret; ++ return sprintf(buf, "%d\n", minutes); /* units: minutes */ ++} ++ ++static ssize_t store_battery_inhibit_charge_minutes(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ int ret; ++ int minutes; ++ int bat = attr_get_bat(attr); ++ if (sscanf(buf, "%d", &minutes) != 1 || minutes < 0) { ++ TPRINTK(KERN_ERR, "inhibit_charge_minutes: " ++ "must be a non-negative integer"); ++ return -EINVAL; ++ } ++ ret = set_inhibit_charge_minutes(bat, minutes); ++ if (ret) ++ return ret; ++ return count; ++} ++ ++static ssize_t show_battery_force_discharge(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ int enabled; ++ int bat = attr_get_bat(attr); ++ int ret = get_force_discharge(bat, &enabled); ++ if (ret) ++ return ret; ++ return sprintf(buf, "%d\n", enabled); /* type: boolean */ ++} ++ ++static ssize_t store_battery_force_discharge(struct device *dev, ++ struct device_attribute *attr, const char *buf, size_t count) ++{ ++ int ret; ++ int enabled; ++ int bat = attr_get_bat(attr); ++ if (sscanf(buf, "%d", &enabled) != 1 || enabled < 0 || enabled > 1) ++ return -EINVAL; ++ ret = set_force_discharge(bat, enabled); ++ if (ret) ++ return ret; ++ return count; ++} ++ ++static ssize_t show_battery_installed( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ int bat = attr_get_bat(attr); ++ int ret = power_device_present(bat); ++ if (ret < 0) ++ return ret; ++ return sprintf(buf, "%d\n", ret); /* type: boolean */ ++} ++ ++static ssize_t show_battery_state( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ u8 row[TP_CONTROLLER_ROW_LEN]; ++ const char *txt; ++ int ret; ++ int bat = attr_get_bat(attr); ++ if (bat_has_status(bat) != 1) ++ return sprintf(buf, "none\n"); ++ ret = read_tp_ec_row(1, bat, 0, row); ++ if (ret) ++ return ret; ++ switch (row[1] & 0xf0) { ++ case 0xc0: txt = "idle"; break; ++ case 0xd0: txt = "discharging"; break; ++ case 0xe0: txt = "charging"; break; ++ default: return sprintf(buf, "unknown (0x%x)\n", row[1]); ++ } ++ return sprintf(buf, "%s\n", txt); /* type: string from fixed set */ ++} ++ ++static ssize_t show_battery_manufacturer( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* type: string. SBS spec v1.1 p34: ManufacturerName() */ ++ return show_tp_ec_bat_str(4, 2, TP_CONTROLLER_ROW_LEN-2, attr, buf); ++} ++ ++static ssize_t show_battery_model( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* type: string. SBS spec v1.1 p34: DeviceName() */ ++ return show_tp_ec_bat_str(5, 2, TP_CONTROLLER_ROW_LEN-2, attr, buf); ++} ++ ++static ssize_t show_battery_barcoding( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* type: string */ ++ return show_tp_ec_bat_str(7, 2, TP_CONTROLLER_ROW_LEN-2, attr, buf); ++} ++ ++static ssize_t show_battery_chemistry( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* type: string. SBS spec v1.1 p34-35: DeviceChemistry() */ ++ return show_tp_ec_bat_str(6, 2, 5, attr, buf); ++} ++ ++static ssize_t show_battery_voltage( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mV. SBS spec v1.1 p24: Voltage() */ ++ return show_tp_ec_bat_u16(1, 6, 1, NULL, attr, buf); ++} ++ ++static ssize_t show_battery_design_voltage( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mV. SBS spec v1.1 p32: DesignVoltage() */ ++ return show_tp_ec_bat_u16(3, 4, 1, NULL, attr, buf); ++} ++ ++static ssize_t show_battery_charging_max_voltage( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mV. SBS spec v1.1 p37,39: ChargingVoltage() */ ++ return show_tp_ec_bat_u16(9, 8, 1, NULL, attr, buf); ++} ++ ++static ssize_t show_battery_group0_voltage( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mV */ ++ return show_tp_ec_bat_u16(0xA, 12, 1, NULL, attr, buf); ++} ++ ++static ssize_t show_battery_group1_voltage( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mV */ ++ return show_tp_ec_bat_u16(0xA, 10, 1, NULL, attr, buf); ++} ++ ++static ssize_t show_battery_group2_voltage( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mV */ ++ return show_tp_ec_bat_u16(0xA, 8, 1, NULL, attr, buf); ++} ++ ++static ssize_t show_battery_group3_voltage( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mV */ ++ return show_tp_ec_bat_u16(0xA, 6, 1, NULL, attr, buf); ++} ++ ++static ssize_t show_battery_current_now( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mA. SBS spec v1.1 p24: Current() */ ++ return show_tp_ec_bat_s16(1, 8, 1, 0, attr, buf); ++} ++ ++static ssize_t show_battery_current_avg( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mA. SBS spec v1.1 p24: AverageCurrent() */ ++ return show_tp_ec_bat_s16(1, 10, 1, 0, attr, buf); ++} ++ ++static ssize_t show_battery_charging_max_current( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mA. SBS spec v1.1 p36,38: ChargingCurrent() */ ++ return show_tp_ec_bat_s16(9, 6, 1, 0, attr, buf); ++} ++ ++static ssize_t show_battery_power_now( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mW. SBS spec v1.1: Voltage()*Current() */ ++ return show_tp_ec_bat_power(1, 6, 8, attr, buf); ++} ++ ++static ssize_t show_battery_power_avg( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mW. SBS spec v1.1: Voltage()*AverageCurrent() */ ++ return show_tp_ec_bat_power(1, 6, 10, attr, buf); ++} ++ ++static ssize_t show_battery_remaining_percent( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: percent. SBS spec v1.1 p25: RelativeStateOfCharge() */ ++ return show_tp_ec_bat_u16(1, 12, 1, NULL, attr, buf); ++} ++ ++static ssize_t show_battery_remaining_percent_error( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: percent. SBS spec v1.1 p25: MaxError() */ ++ return show_tp_ec_bat_u16(9, 4, 1, NULL, attr, buf); ++} ++ ++static ssize_t show_battery_remaining_charging_time( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: minutes. SBS spec v1.1 p27: AverageTimeToFull() */ ++ return show_tp_ec_bat_u16(2, 8, 1, "not_charging", attr, buf); ++} ++ ++static ssize_t show_battery_remaining_running_time( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: minutes. SBS spec v1.1 p27: RunTimeToEmpty() */ ++ return show_tp_ec_bat_u16(2, 6, 1, "not_discharging", attr, buf); ++} ++ ++static ssize_t show_battery_remaining_running_time_now( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: minutes. SBS spec v1.1 p27: RunTimeToEmpty() */ ++ return show_tp_ec_bat_u16(2, 4, 1, "not_discharging", attr, buf); ++} ++ ++static ssize_t show_battery_remaining_capacity( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mWh. SBS spec v1.1 p26. */ ++ return show_tp_ec_bat_u16(1, 14, 10, "", attr, buf); ++} ++ ++static ssize_t show_battery_last_full_capacity( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mWh. SBS spec v1.1 p26: FullChargeCapacity() */ ++ return show_tp_ec_bat_u16(2, 2, 10, "", attr, buf); ++} ++ ++static ssize_t show_battery_design_capacity( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: mWh. SBS spec v1.1 p32: DesignCapacity() */ ++ return show_tp_ec_bat_u16(3, 2, 10, "", attr, buf); ++} ++ ++static ssize_t show_battery_cycle_count( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: ordinal. SBS spec v1.1 p32: CycleCount() */ ++ return show_tp_ec_bat_u16(2, 12, 1, "", attr, buf); ++} ++ ++static ssize_t show_battery_temperature( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* units: millicelsius. SBS spec v1.1: Temperature()*10 */ ++ return show_tp_ec_bat_s16(1, 4, 100, -273100, attr, buf); ++} ++ ++static ssize_t show_battery_serial( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* type: int. SBS spec v1.1 p34: SerialNumber() */ ++ return show_tp_ec_bat_u16(3, 10, 1, "", attr, buf); ++} ++ ++static ssize_t show_battery_manufacture_date( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* type: YYYY-MM-DD. SBS spec v1.1 p34: ManufactureDate() */ ++ return show_tp_ec_bat_date(3, 8, attr, buf); ++} ++ ++static ssize_t show_battery_first_use_date( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ /* type: YYYY-MM-DD */ ++ return show_tp_ec_bat_date(8, 2, attr, buf); ++} ++ ++/** ++ * show_battery_dump - show the battery's dump attribute ++ * The dump attribute gives a hex dump of all EC readouts related to a ++ * battery. Some of the enumerated values don't really exist (i.e., the ++ * EC function just leaves them untouched); we use a kludge to detect and ++ * denote these. ++ */ ++#define MIN_DUMP_ARG0 0x00 ++#define MAX_DUMP_ARG0 0x0a /* 0x0b is useful too but hangs old EC firmware */ ++static ssize_t show_battery_dump( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ int i; ++ char *p = buf; ++ int bat = attr_get_bat(attr); ++ u8 arg0; /* first argument to EC */ ++ u8 rowa[TP_CONTROLLER_ROW_LEN], ++ rowb[TP_CONTROLLER_ROW_LEN]; ++ const u8 junka = 0xAA, ++ junkb = 0x55; /* junk values for testing changes */ ++ int ret; ++ ++ for (arg0 = MIN_DUMP_ARG0; arg0 <= MAX_DUMP_ARG0; ++arg0) { ++ if ((p-buf) > PAGE_SIZE-TP_CONTROLLER_ROW_LEN*5) ++ return -ENOMEM; /* don't overflow sysfs buf */ ++ /* Read raw twice with different junk values, ++ * to detect unused output bytes which are left unchaged: */ ++ ret = read_tp_ec_row(arg0, bat, junka, rowa); ++ if (ret) ++ return ret; ++ ret = read_tp_ec_row(arg0, bat, junkb, rowb); ++ if (ret) ++ return ret; ++ for (i = 0; i < TP_CONTROLLER_ROW_LEN; i++) { ++ if (rowa[i] == junka && rowb[i] == junkb) ++ p += sprintf(p, "-- "); /* unused by EC */ ++ else ++ p += sprintf(p, "%02x ", rowa[i]); ++ } ++ p += sprintf(p, "\n"); ++ } ++ return p-buf; ++} ++ ++ ++/********************************************************************* ++ * sysfs attribute I/O, other than batteries ++ */ ++ ++static ssize_t show_ac_connected( ++ struct device *dev, struct device_attribute *attr, char *buf) ++{ ++ int ret = power_device_present(0xFF); ++ if (ret < 0) ++ return ret; ++ return sprintf(buf, "%d\n", ret); /* type: boolean */ ++} ++ ++/********************************************************************* ++ * The the "smapi_request" sysfs attribute executes a raw SMAPI call. ++ * You write to make a request and read to get the result. The state ++ * is saved globally rather than per fd (sysfs limitation), so ++ * simultaenous requests may get each other's results! So this is for ++ * development and debugging only. ++ */ ++#define MAX_SMAPI_ATTR_ANSWER_LEN 128 ++static char smapi_attr_answer[MAX_SMAPI_ATTR_ANSWER_LEN] = ""; ++ ++static ssize_t show_smapi_request(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ int ret = snprintf(buf, PAGE_SIZE, "%s", smapi_attr_answer); ++ smapi_attr_answer[0] = '\0'; ++ return ret; ++} ++ ++static ssize_t store_smapi_request(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ unsigned int inEBX, inECX, inEDI, inESI; ++ u32 outEBX, outECX, outEDX, outEDI, outESI; ++ const char *msg; ++ int ret; ++ if (sscanf(buf, "%x %x %x %x", &inEBX, &inECX, &inEDI, &inESI) != 4) { ++ smapi_attr_answer[0] = '\0'; ++ return -EINVAL; ++ } ++ ret = smapi_request( ++ inEBX, inECX, inEDI, inESI, ++ &outEBX, &outECX, &outEDX, &outEDI, &outESI, &msg); ++ snprintf(smapi_attr_answer, MAX_SMAPI_ATTR_ANSWER_LEN, ++ "%x %x %x %x %x %d '%s'\n", ++ (unsigned int)outEBX, (unsigned int)outECX, ++ (unsigned int)outEDX, (unsigned int)outEDI, ++ (unsigned int)outESI, ret, msg); ++ if (ret) ++ return ret; ++ else ++ return count; ++} ++ ++/********************************************************************* ++ * Power management: the embedded controller forgets the battery ++ * thresholds when the system is suspended to disk and unplugged from ++ * AC and battery, so we restore it upon resume. ++ */ ++ ++static int saved_threshs[4] = {-1, -1, -1, -1}; /* -1 = don't know */ ++ ++static int tp_suspend(struct platform_device *dev, pm_message_t state) ++{ ++ int restore = (state.event == PM_EVENT_HIBERNATE || ++ state.event == PM_EVENT_FREEZE); ++ if (!restore || get_real_thresh(0, THRESH_STOP , &saved_threshs[0])) ++ saved_threshs[0] = -1; ++ if (!restore || get_real_thresh(0, THRESH_START, &saved_threshs[1])) ++ saved_threshs[1] = -1; ++ if (!restore || get_real_thresh(1, THRESH_STOP , &saved_threshs[2])) ++ saved_threshs[2] = -1; ++ if (!restore || get_real_thresh(1, THRESH_START, &saved_threshs[3])) ++ saved_threshs[3] = -1; ++ DPRINTK("suspend saved: %d %d %d %d", saved_threshs[0], ++ saved_threshs[1], saved_threshs[2], saved_threshs[3]); ++ return 0; ++} ++ ++static int tp_resume(struct platform_device *dev) ++{ ++ DPRINTK("resume restoring: %d %d %d %d", saved_threshs[0], ++ saved_threshs[1], saved_threshs[2], saved_threshs[3]); ++ if (saved_threshs[0] >= 0) ++ set_real_thresh(0, THRESH_STOP , saved_threshs[0]); ++ if (saved_threshs[1] >= 0) ++ set_real_thresh(0, THRESH_START, saved_threshs[1]); ++ if (saved_threshs[2] >= 0) ++ set_real_thresh(1, THRESH_STOP , saved_threshs[2]); ++ if (saved_threshs[3] >= 0) ++ set_real_thresh(1, THRESH_START, saved_threshs[3]); ++ return 0; ++} ++ ++ ++/********************************************************************* ++ * Driver model ++ */ ++ ++static struct platform_driver tp_driver = { ++ .suspend = tp_suspend, ++ .resume = tp_resume, ++ .driver = { ++ .name = "smapi", ++ .owner = THIS_MODULE ++ }, ++}; ++ ++ ++/********************************************************************* ++ * Sysfs device model ++ */ ++ ++/* Attributes in /sys/devices/platform/smapi/ */ ++ ++static DEVICE_ATTR(ac_connected, 0444, show_ac_connected, NULL); ++static DEVICE_ATTR(smapi_request, 0600, show_smapi_request, ++ store_smapi_request); ++ ++static struct attribute *tp_root_attributes[] = { ++ &dev_attr_ac_connected.attr, ++ &dev_attr_smapi_request.attr, ++ NULL ++}; ++static struct attribute_group tp_root_attribute_group = { ++ .attrs = tp_root_attributes ++}; ++ ++/* Attributes under /sys/devices/platform/smapi/BAT{0,1}/ : ++ * Every attribute needs to be defined (i.e., statically allocated) for ++ * each battery, and then referenced in the attribute list of each battery. ++ * We use preprocessor voodoo to avoid duplicating the list of attributes 4 ++ * times. The preprocessor output is just normal sysfs attributes code. ++ */ ++ ++/** ++ * FOREACH_BAT_ATTR - invoke the given macros on all our battery attributes ++ * @_BAT: battery number (0 or 1) ++ * @_ATTR_RW: macro to invoke for each read/write attribute ++ * @_ATTR_R: macro to invoke for each read-only attribute ++ */ ++#define FOREACH_BAT_ATTR(_BAT, _ATTR_RW, _ATTR_R) \ ++ _ATTR_RW(_BAT, start_charge_thresh) \ ++ _ATTR_RW(_BAT, stop_charge_thresh) \ ++ _ATTR_RW(_BAT, inhibit_charge_minutes) \ ++ _ATTR_RW(_BAT, force_discharge) \ ++ _ATTR_R(_BAT, installed) \ ++ _ATTR_R(_BAT, state) \ ++ _ATTR_R(_BAT, manufacturer) \ ++ _ATTR_R(_BAT, model) \ ++ _ATTR_R(_BAT, barcoding) \ ++ _ATTR_R(_BAT, chemistry) \ ++ _ATTR_R(_BAT, voltage) \ ++ _ATTR_R(_BAT, group0_voltage) \ ++ _ATTR_R(_BAT, group1_voltage) \ ++ _ATTR_R(_BAT, group2_voltage) \ ++ _ATTR_R(_BAT, group3_voltage) \ ++ _ATTR_R(_BAT, current_now) \ ++ _ATTR_R(_BAT, current_avg) \ ++ _ATTR_R(_BAT, charging_max_current) \ ++ _ATTR_R(_BAT, power_now) \ ++ _ATTR_R(_BAT, power_avg) \ ++ _ATTR_R(_BAT, remaining_percent) \ ++ _ATTR_R(_BAT, remaining_percent_error) \ ++ _ATTR_R(_BAT, remaining_charging_time) \ ++ _ATTR_R(_BAT, remaining_running_time) \ ++ _ATTR_R(_BAT, remaining_running_time_now) \ ++ _ATTR_R(_BAT, remaining_capacity) \ ++ _ATTR_R(_BAT, last_full_capacity) \ ++ _ATTR_R(_BAT, design_voltage) \ ++ _ATTR_R(_BAT, charging_max_voltage) \ ++ _ATTR_R(_BAT, design_capacity) \ ++ _ATTR_R(_BAT, cycle_count) \ ++ _ATTR_R(_BAT, temperature) \ ++ _ATTR_R(_BAT, serial) \ ++ _ATTR_R(_BAT, manufacture_date) \ ++ _ATTR_R(_BAT, first_use_date) \ ++ _ATTR_R(_BAT, dump) ++ ++/* Define several macros we will feed into FOREACH_BAT_ATTR: */ ++ ++#define DEFINE_BAT_ATTR_RW(_BAT,_NAME) \ ++ static struct bat_device_attribute dev_attr_##_NAME##_##_BAT = { \ ++ .dev_attr = __ATTR(_NAME, 0644, show_battery_##_NAME, \ ++ store_battery_##_NAME), \ ++ .bat = _BAT \ ++ }; ++ ++#define DEFINE_BAT_ATTR_R(_BAT,_NAME) \ ++ static struct bat_device_attribute dev_attr_##_NAME##_##_BAT = { \ ++ .dev_attr = __ATTR(_NAME, 0644, show_battery_##_NAME, 0), \ ++ .bat = _BAT \ ++ }; ++ ++#define REF_BAT_ATTR(_BAT,_NAME) \ ++ &dev_attr_##_NAME##_##_BAT.dev_attr.attr, ++ ++/* This provide all attributes for one battery: */ ++ ++#define PROVIDE_BAT_ATTRS(_BAT) \ ++ FOREACH_BAT_ATTR(_BAT, DEFINE_BAT_ATTR_RW, DEFINE_BAT_ATTR_R) \ ++ static struct attribute *tp_bat##_BAT##_attributes[] = { \ ++ FOREACH_BAT_ATTR(_BAT, REF_BAT_ATTR, REF_BAT_ATTR) \ ++ NULL \ ++ }; \ ++ static struct attribute_group tp_bat##_BAT##_attribute_group = { \ ++ .name = "BAT" #_BAT, \ ++ .attrs = tp_bat##_BAT##_attributes \ ++ }; ++ ++/* Finally genereate the attributes: */ ++ ++PROVIDE_BAT_ATTRS(0) ++PROVIDE_BAT_ATTRS(1) ++ ++/* List of attribute groups */ ++ ++static struct attribute_group *attr_groups[] = { ++ &tp_root_attribute_group, ++ &tp_bat0_attribute_group, ++ &tp_bat1_attribute_group, ++ NULL ++}; ++ ++ ++/********************************************************************* ++ * Init and cleanup ++ */ ++ ++static struct attribute_group **next_attr_group; /* next to register */ ++ ++static int __init tp_init(void) ++{ ++ int ret; ++ printk(KERN_INFO "tp_smapi " TP_VERSION " loading...\n"); ++ ++ ret = find_smapi_port(); ++ if (ret < 0) ++ goto err; ++ else ++ smapi_port = ret; ++ ++ if (!request_region(smapi_port, 1, "smapi")) { ++ printk(KERN_ERR "tp_smapi cannot claim port 0x%x\n", ++ smapi_port); ++ ret = -ENXIO; ++ goto err; ++ } ++ ++ if (!request_region(SMAPI_PORT2, 1, "smapi")) { ++ printk(KERN_ERR "tp_smapi cannot claim port 0x%x\n", ++ SMAPI_PORT2); ++ ret = -ENXIO; ++ goto err_port1; ++ } ++ ++ ret = platform_driver_register(&tp_driver); ++ if (ret) ++ goto err_port2; ++ ++ pdev = platform_device_alloc("smapi", -1); ++ if (!pdev) { ++ ret = -ENOMEM; ++ goto err_driver; ++ } ++ ++ ret = platform_device_add(pdev); ++ if (ret) ++ goto err_device_free; ++ ++ for (next_attr_group = attr_groups; *next_attr_group; ++ ++next_attr_group) { ++ ret = sysfs_create_group(&pdev->dev.kobj, *next_attr_group); ++ if (ret) ++ goto err_attr; ++ } ++ ++ printk(KERN_INFO "tp_smapi successfully loaded (smapi_port=0x%x).\n", ++ smapi_port); ++ return 0; ++ ++err_attr: ++ while (--next_attr_group >= attr_groups) ++ sysfs_remove_group(&pdev->dev.kobj, *next_attr_group); ++ platform_device_unregister(pdev); ++err_device_free: ++ platform_device_put(pdev); ++err_driver: ++ platform_driver_unregister(&tp_driver); ++err_port2: ++ release_region(SMAPI_PORT2, 1); ++err_port1: ++ release_region(smapi_port, 1); ++err: ++ printk(KERN_ERR "tp_smapi init failed (ret=%d)!\n", ret); ++ return ret; ++} ++ ++static void __exit tp_exit(void) ++{ ++ while (next_attr_group && --next_attr_group >= attr_groups) ++ sysfs_remove_group(&pdev->dev.kobj, *next_attr_group); ++ platform_device_unregister(pdev); ++ platform_driver_unregister(&tp_driver); ++ release_region(SMAPI_PORT2, 1); ++ if (smapi_port) ++ release_region(smapi_port, 1); ++ ++ printk(KERN_INFO "tp_smapi unloaded.\n"); ++} ++ ++module_init(tp_init); ++module_exit(tp_exit); +diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c +index 3a546ec10d90..22a65ad4e46e 100644 +--- a/drivers/pps/pps.c ++++ b/drivers/pps/pps.c +@@ -152,6 +152,14 @@ static long pps_cdev_ioctl(struct file *file, + pps->params.mode |= PPS_CANWAIT; + pps->params.api_version = PPS_API_VERS; + ++ /* ++ * Clear unused fields of pps_kparams to avoid leaking ++ * uninitialized data of the PPS_SETPARAMS caller via ++ * PPS_GETPARAMS ++ */ ++ pps->params.assert_off_tu.flags = 0; ++ pps->params.clear_off_tu.flags = 0; ++ + spin_unlock_irq(&pps->lock); + + break; +diff --git a/drivers/rapidio/devices/rio_mport_cdev.c b/drivers/rapidio/devices/rio_mport_cdev.c +index ce7a90e68042..8155f59ece38 100644 +--- a/drivers/rapidio/devices/rio_mport_cdev.c ++++ b/drivers/rapidio/devices/rio_mport_cdev.c +@@ -1686,6 +1686,7 @@ static int rio_mport_add_riodev(struct mport_cdev_priv *priv, + + if (copy_from_user(&dev_info, arg, sizeof(dev_info))) + return -EFAULT; ++ dev_info.name[sizeof(dev_info.name) - 1] = '\0'; + + rmcd_debug(RDEV, "name:%s ct:0x%x did:0x%x hc:0x%x", dev_info.name, + dev_info.comptag, dev_info.destid, dev_info.hopcount); +@@ -1817,6 +1818,7 @@ static int rio_mport_del_riodev(struct mport_cdev_priv *priv, void __user *arg) + + if (copy_from_user(&dev_info, arg, sizeof(dev_info))) + return -EFAULT; ++ dev_info.name[sizeof(dev_info.name) - 1] = '\0'; + + mport = priv->md->mport; + +diff --git a/drivers/ras/cec.c b/drivers/ras/cec.c +index 673f8a128397..f5795adc5a6e 100644 +--- a/drivers/ras/cec.c ++++ b/drivers/ras/cec.c +@@ -369,7 +369,9 @@ static int pfn_set(void *data, u64 val) + { + *(u64 *)data = val; + +- return cec_add_elem(val); ++ cec_add_elem(val); ++ ++ return 0; + } + + DEFINE_DEBUGFS_ATTRIBUTE(pfn_ops, u64_get, pfn_set, "0x%llx\n"); +diff --git a/drivers/regulator/88pm800.c b/drivers/regulator/88pm800-regulator.c +similarity index 100% +rename from drivers/regulator/88pm800.c +rename to drivers/regulator/88pm800-regulator.c +diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile +index 93f53840e8f1..486edf784c13 100644 +--- a/drivers/regulator/Makefile ++++ b/drivers/regulator/Makefile +@@ -11,7 +11,7 @@ obj-$(CONFIG_REGULATOR_VIRTUAL_CONSUMER) += virtual.o + obj-$(CONFIG_REGULATOR_USERSPACE_CONSUMER) += userspace-consumer.o + + obj-$(CONFIG_REGULATOR_88PG86X) += 88pg86x.o +-obj-$(CONFIG_REGULATOR_88PM800) += 88pm800.o ++obj-$(CONFIG_REGULATOR_88PM800) += 88pm800-regulator.o + obj-$(CONFIG_REGULATOR_88PM8607) += 88pm8607.o + obj-$(CONFIG_REGULATOR_CPCAP) += cpcap-regulator.o + obj-$(CONFIG_REGULATOR_AAT2870) += aat2870-regulator.o +diff --git a/drivers/regulator/da9211-regulator.c b/drivers/regulator/da9211-regulator.c +index da37b4ccd834..0309823d2c72 100644 +--- a/drivers/regulator/da9211-regulator.c ++++ b/drivers/regulator/da9211-regulator.c +@@ -289,6 +289,8 @@ static struct da9211_pdata *da9211_parse_regulators_dt( + 0, + GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE, + "da9211-enable"); ++ if (IS_ERR(pdata->gpiod_ren[n])) ++ pdata->gpiod_ren[n] = NULL; + n++; + } + +diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c +index 134c62db36c5..8812c2c3cfc2 100644 +--- a/drivers/regulator/s2mps11.c ++++ b/drivers/regulator/s2mps11.c +@@ -372,8 +372,8 @@ static const struct regulator_desc s2mps11_regulators[] = { + regulator_desc_s2mps11_buck1_4(4), + regulator_desc_s2mps11_buck5, + regulator_desc_s2mps11_buck67810(6, MIN_600_MV, STEP_6_25_MV), +- regulator_desc_s2mps11_buck67810(7, MIN_600_MV, STEP_12_5_MV), +- regulator_desc_s2mps11_buck67810(8, MIN_600_MV, STEP_12_5_MV), ++ regulator_desc_s2mps11_buck67810(7, MIN_750_MV, STEP_12_5_MV), ++ regulator_desc_s2mps11_buck67810(8, MIN_750_MV, STEP_12_5_MV), + regulator_desc_s2mps11_buck9, + regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV), + }; +@@ -821,9 +821,12 @@ static void s2mps14_pmic_dt_parse_ext_control_gpio(struct platform_device *pdev, + 0, + GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE, + "s2mps11-regulator"); +- if (IS_ERR(gpio[reg])) { ++ if (PTR_ERR(gpio[reg]) == -ENOENT) ++ gpio[reg] = NULL; ++ else if (IS_ERR(gpio[reg])) { + dev_err(&pdev->dev, "Failed to get control GPIO for %d/%s\n", + reg, rdata[reg].name); ++ gpio[reg] = NULL; + continue; + } + if (gpio[reg]) +diff --git a/drivers/regulator/s5m8767.c b/drivers/regulator/s5m8767.c +index bb9d1a083299..6ca27e9d5ef7 100644 +--- a/drivers/regulator/s5m8767.c ++++ b/drivers/regulator/s5m8767.c +@@ -574,7 +574,9 @@ static int s5m8767_pmic_dt_parse_pdata(struct platform_device *pdev, + 0, + GPIOD_OUT_HIGH | GPIOD_FLAGS_BIT_NONEXCLUSIVE, + "s5m8767"); +- if (IS_ERR(rdata->ext_control_gpiod)) ++ if (PTR_ERR(rdata->ext_control_gpiod) == -ENOENT) ++ rdata->ext_control_gpiod = NULL; ++ else if (IS_ERR(rdata->ext_control_gpiod)) + return PTR_ERR(rdata->ext_control_gpiod); + + rdata->id = i; +diff --git a/drivers/regulator/tps65090-regulator.c b/drivers/regulator/tps65090-regulator.c +index ca39b3d55123..10ea4b5a0f55 100644 +--- a/drivers/regulator/tps65090-regulator.c ++++ b/drivers/regulator/tps65090-regulator.c +@@ -371,11 +371,12 @@ static struct tps65090_platform_data *tps65090_parse_dt_reg_data( + "dcdc-ext-control-gpios", 0, + gflags, + "tps65090"); +- if (IS_ERR(rpdata->gpiod)) +- return ERR_CAST(rpdata->gpiod); +- if (!rpdata->gpiod) ++ if (PTR_ERR(rpdata->gpiod) == -ENOENT) { + dev_err(&pdev->dev, + "could not find DCDC external control GPIO\n"); ++ rpdata->gpiod = NULL; ++ } else if (IS_ERR(rpdata->gpiod)) ++ return ERR_CAST(rpdata->gpiod); + } + + if (of_property_read_u32(tps65090_matches[idx].of_node, +diff --git a/drivers/remoteproc/remoteproc_core.c b/drivers/remoteproc/remoteproc_core.c +index 8b5363223eaa..5031c6806908 100644 +--- a/drivers/remoteproc/remoteproc_core.c ++++ b/drivers/remoteproc/remoteproc_core.c +@@ -512,6 +512,7 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc, + /* Initialise vdev subdevice */ + snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index); + rvdev->dev.parent = rproc->dev.parent; ++ rvdev->dev.dma_pfn_offset = rproc->dev.parent->dma_pfn_offset; + rvdev->dev.release = rproc_rvdev_release; + dev_set_name(&rvdev->dev, "%s#%s", dev_name(rvdev->dev.parent), name); + dev_set_drvdata(&rvdev->dev, rvdev); +diff --git a/drivers/rtc/rtc-wm8350.c b/drivers/rtc/rtc-wm8350.c +index 2018614f258f..fc19b312c345 100644 +--- a/drivers/rtc/rtc-wm8350.c ++++ b/drivers/rtc/rtc-wm8350.c +@@ -114,7 +114,7 @@ static int wm8350_rtc_settime(struct device *dev, struct rtc_time *tm) + /* Wait until confirmation of stopping */ + do { + rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL); +- schedule_timeout_uninterruptible(msecs_to_jiffies(1)); ++ schedule_msec_hrtimeout_uninterruptible((1)); + } while (--retries && !(rtc_ctrl & WM8350_RTC_STS)); + + if (!retries) { +@@ -197,7 +197,7 @@ static int wm8350_rtc_stop_alarm(struct wm8350 *wm8350) + /* Wait until confirmation of stopping */ + do { + rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL); +- schedule_timeout_uninterruptible(msecs_to_jiffies(1)); ++ schedule_msec_hrtimeout_uninterruptible((1)); + } while (retries-- && !(rtc_ctrl & WM8350_RTC_ALMSTS)); + + if (!(rtc_ctrl & WM8350_RTC_ALMSTS)) +@@ -220,7 +220,7 @@ static int wm8350_rtc_start_alarm(struct wm8350 *wm8350) + /* Wait until confirmation */ + do { + rtc_ctrl = wm8350_reg_read(wm8350, WM8350_RTC_TIME_CONTROL); +- schedule_timeout_uninterruptible(msecs_to_jiffies(1)); ++ schedule_msec_hrtimeout_uninterruptible((1)); + } while (retries-- && rtc_ctrl & WM8350_RTC_ALMSTS); + + if (rtc_ctrl & WM8350_RTC_ALMSTS) +diff --git a/drivers/s390/block/dasd_alias.c b/drivers/s390/block/dasd_alias.c +index b9ce93e9df89..99f86612f775 100644 +--- a/drivers/s390/block/dasd_alias.c ++++ b/drivers/s390/block/dasd_alias.c +@@ -383,6 +383,20 @@ suborder_not_supported(struct dasd_ccw_req *cqr) + char msg_format; + char msg_no; + ++ /* ++ * intrc values ENODEV, ENOLINK and EPERM ++ * will be optained from sleep_on to indicate that no ++ * IO operation can be started ++ */ ++ if (cqr->intrc == -ENODEV) ++ return 1; ++ ++ if (cqr->intrc == -ENOLINK) ++ return 1; ++ ++ if (cqr->intrc == -EPERM) ++ return 1; ++ + sense = dasd_get_sense(&cqr->irb); + if (!sense) + return 0; +@@ -447,12 +461,8 @@ static int read_unit_address_configuration(struct dasd_device *device, + lcu->flags &= ~NEED_UAC_UPDATE; + spin_unlock_irqrestore(&lcu->lock, flags); + +- do { +- rc = dasd_sleep_on(cqr); +- if (rc && suborder_not_supported(cqr)) +- return -EOPNOTSUPP; +- } while (rc && (cqr->retries > 0)); +- if (rc) { ++ rc = dasd_sleep_on(cqr); ++ if (rc && !suborder_not_supported(cqr)) { + spin_lock_irqsave(&lcu->lock, flags); + lcu->flags |= NEED_UAC_UPDATE; + spin_unlock_irqrestore(&lcu->lock, flags); +diff --git a/drivers/s390/char/sclp_early.c b/drivers/s390/char/sclp_early.c +index 6c90aa725f23..e71992a3c55f 100644 +--- a/drivers/s390/char/sclp_early.c ++++ b/drivers/s390/char/sclp_early.c +@@ -41,7 +41,6 @@ static void __init sclp_early_facilities_detect(struct read_info_sccb *sccb) + sclp.has_hvs = !!(sccb->fac119 & 0x80); + sclp.has_kss = !!(sccb->fac98 & 0x01); + sclp.has_sipl = !!(sccb->cbl & 0x02); +- sclp.has_sipl_g2 = !!(sccb->cbl & 0x04); + if (sccb->fac85 & 0x02) + S390_lowcore.machine_flags |= MACHINE_FLAG_ESOP; + if (sccb->fac91 & 0x40) +diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c +index 7b7620de2acd..7f5adf02f095 100644 +--- a/drivers/s390/cio/qdio_main.c ++++ b/drivers/s390/cio/qdio_main.c +@@ -736,6 +736,7 @@ static int get_outbound_buffer_frontier(struct qdio_q *q, unsigned int start) + + switch (state) { + case SLSB_P_OUTPUT_EMPTY: ++ case SLSB_P_OUTPUT_PENDING: + /* the adapter got it */ + DBF_DEV_EVENT(DBF_INFO, q->irq_ptr, + "out empty:%1d %02x", q->nr, count); +@@ -1557,13 +1558,13 @@ static int handle_outbound(struct qdio_q *q, unsigned int callflags, + rc = qdio_kick_outbound_q(q, phys_aob); + } else if (need_siga_sync(q)) { + rc = qdio_siga_sync_q(q); ++ } else if (count < QDIO_MAX_BUFFERS_PER_Q && ++ get_buf_state(q, prev_buf(bufnr), &state, 0) > 0 && ++ state == SLSB_CU_OUTPUT_PRIMED) { ++ /* The previous buffer is not processed yet, tack on. */ ++ qperf_inc(q, fast_requeue); + } else { +- /* try to fast requeue buffers */ +- get_buf_state(q, prev_buf(bufnr), &state, 0); +- if (state != SLSB_CU_OUTPUT_PRIMED) +- rc = qdio_kick_outbound_q(q, 0); +- else +- qperf_inc(q, fast_requeue); ++ rc = qdio_kick_outbound_q(q, 0); + } + + /* in case of SIGA errors we must process the error immediately */ +diff --git a/drivers/s390/cio/qdio_setup.c b/drivers/s390/cio/qdio_setup.c +index 99d7d2566a3a..d4101cecdc8d 100644 +--- a/drivers/s390/cio/qdio_setup.c ++++ b/drivers/s390/cio/qdio_setup.c +@@ -150,6 +150,7 @@ static int __qdio_allocate_qs(struct qdio_q **irq_ptr_qs, int nr_queues) + return -ENOMEM; + } + irq_ptr_qs[i] = q; ++ INIT_LIST_HEAD(&q->entry); + } + return 0; + } +@@ -178,6 +179,7 @@ static void setup_queues_misc(struct qdio_q *q, struct qdio_irq *irq_ptr, + q->mask = 1 << (31 - i); + q->nr = i; + q->handler = handler; ++ INIT_LIST_HEAD(&q->entry); + } + + static void setup_storage_lists(struct qdio_q *q, struct qdio_irq *irq_ptr, +diff --git a/drivers/s390/cio/qdio_thinint.c b/drivers/s390/cio/qdio_thinint.c +index 28d59ac2204c..d9763bbecbf9 100644 +--- a/drivers/s390/cio/qdio_thinint.c ++++ b/drivers/s390/cio/qdio_thinint.c +@@ -79,7 +79,6 @@ void tiqdio_add_input_queues(struct qdio_irq *irq_ptr) + mutex_lock(&tiq_list_lock); + list_add_rcu(&irq_ptr->input_qs[0]->entry, &tiq_list); + mutex_unlock(&tiq_list_lock); +- xchg(irq_ptr->dsci, 1 << 7); + } + + void tiqdio_remove_input_queues(struct qdio_irq *irq_ptr) +@@ -87,14 +86,14 @@ void tiqdio_remove_input_queues(struct qdio_irq *irq_ptr) + struct qdio_q *q; + + q = irq_ptr->input_qs[0]; +- /* if establish triggered an error */ +- if (!q || !q->entry.prev || !q->entry.next) ++ if (!q) + return; + + mutex_lock(&tiq_list_lock); + list_del_rcu(&q->entry); + mutex_unlock(&tiq_list_lock); + synchronize_rcu(); ++ INIT_LIST_HEAD(&q->entry); + } + + static inline int has_multiple_inq_on_dsci(struct qdio_irq *irq_ptr) +diff --git a/drivers/s390/cio/vfio_ccw_cp.c b/drivers/s390/cio/vfio_ccw_cp.c +index 0e79799e9a71..79eb40bdaf9f 100644 +--- a/drivers/s390/cio/vfio_ccw_cp.c ++++ b/drivers/s390/cio/vfio_ccw_cp.c +@@ -89,8 +89,10 @@ static int pfn_array_alloc_pin(struct pfn_array *pa, struct device *mdev, + sizeof(*pa->pa_iova_pfn) + + sizeof(*pa->pa_pfn), + GFP_KERNEL); +- if (unlikely(!pa->pa_iova_pfn)) ++ if (unlikely(!pa->pa_iova_pfn)) { ++ pa->pa_nr = 0; + return -ENOMEM; ++ } + pa->pa_pfn = pa->pa_iova_pfn + pa->pa_nr; + + pa->pa_iova_pfn[0] = pa->pa_iova >> PAGE_SHIFT; +diff --git a/drivers/s390/cio/vfio_ccw_drv.c b/drivers/s390/cio/vfio_ccw_drv.c +index 9125f7f4e64c..8a8fbde7e186 100644 +--- a/drivers/s390/cio/vfio_ccw_drv.c ++++ b/drivers/s390/cio/vfio_ccw_drv.c +@@ -88,7 +88,7 @@ static void vfio_ccw_sch_io_todo(struct work_struct *work) + (SCSW_ACTL_DEVACT | SCSW_ACTL_SCHACT)); + if (scsw_is_solicited(&irb->scsw)) { + cp_update_scsw(&private->cp, &irb->scsw); +- if (is_final) ++ if (is_final && private->state == VFIO_CCW_STATE_CP_PENDING) + cp_free(&private->cp); + } + mutex_lock(&private->io_mutex); +diff --git a/drivers/s390/scsi/zfcp_erp.c b/drivers/s390/scsi/zfcp_erp.c +index e8fc28dba8df..96f0d34e9459 100644 +--- a/drivers/s390/scsi/zfcp_erp.c ++++ b/drivers/s390/scsi/zfcp_erp.c +@@ -11,6 +11,7 @@ + #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt + + #include ++#include + #include "zfcp_ext.h" + #include "zfcp_reqlist.h" + +@@ -217,6 +218,12 @@ static struct zfcp_erp_action *zfcp_erp_setup_act(enum zfcp_erp_act_type need, + struct zfcp_erp_action *erp_action; + struct zfcp_scsi_dev *zfcp_sdev; + ++ if (WARN_ON_ONCE(need != ZFCP_ERP_ACTION_REOPEN_LUN && ++ need != ZFCP_ERP_ACTION_REOPEN_PORT && ++ need != ZFCP_ERP_ACTION_REOPEN_PORT_FORCED && ++ need != ZFCP_ERP_ACTION_REOPEN_ADAPTER)) ++ return NULL; ++ + switch (need) { + case ZFCP_ERP_ACTION_REOPEN_LUN: + zfcp_sdev = sdev_to_zfcp(sdev); +diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c +index d94496ee6883..296bbc3c4606 100644 +--- a/drivers/s390/scsi/zfcp_fsf.c ++++ b/drivers/s390/scsi/zfcp_fsf.c +@@ -11,6 +11,7 @@ + #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt + + #include ++#include + #include + #include + #include "zfcp_ext.h" +@@ -741,6 +742,7 @@ static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio, + + static int zfcp_fsf_req_send(struct zfcp_fsf_req *req) + { ++ const bool is_srb = zfcp_fsf_req_is_status_read_buffer(req); + struct zfcp_adapter *adapter = req->adapter; + struct zfcp_qdio *qdio = adapter->qdio; + int req_id = req->req_id; +@@ -757,8 +759,20 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req) + return -EIO; + } + ++ /* ++ * NOTE: DO NOT TOUCH ASYNC req PAST THIS POINT. ++ * ONLY TOUCH SYNC req AGAIN ON req->completion. ++ * ++ * The request might complete and be freed concurrently at any point ++ * now. This is not protected by the QDIO-lock (req_q_lock). So any ++ * uncontrolled access after this might result in an use-after-free bug. ++ * Only if the request doesn't have ZFCP_STATUS_FSFREQ_CLEANUP set, and ++ * when it is completed via req->completion, is it safe to use req ++ * again. ++ */ ++ + /* Don't increase for unsolicited status */ +- if (!zfcp_fsf_req_is_status_read_buffer(req)) ++ if (!is_srb) + adapter->fsf_req_seq_no++; + adapter->req_no++; + +@@ -805,6 +819,7 @@ int zfcp_fsf_status_read(struct zfcp_qdio *qdio) + retval = zfcp_fsf_req_send(req); + if (retval) + goto failed_req_send; ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + + goto out; + +@@ -914,8 +929,10 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_cmnd(struct scsi_cmnd *scmnd) + req->qtcb->bottom.support.req_handle = (u64) old_req_id; + + zfcp_fsf_start_timer(req, ZFCP_FSF_SCSI_ER_TIMEOUT); +- if (!zfcp_fsf_req_send(req)) ++ if (!zfcp_fsf_req_send(req)) { ++ /* NOTE: DO NOT TOUCH req, UNTIL IT COMPLETES! */ + goto out; ++ } + + out_error_free: + zfcp_fsf_req_free(req); +@@ -1098,6 +1115,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, + ret = zfcp_fsf_req_send(req); + if (ret) + goto failed_send; ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + + goto out; + +@@ -1198,6 +1216,7 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, + ret = zfcp_fsf_req_send(req); + if (ret) + goto failed_send; ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + + goto out; + +@@ -1243,6 +1262,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) + zfcp_fsf_req_free(req); + erp_action->fsf_req_id = 0; + } ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + out: + spin_unlock_irq(&qdio->req_q_lock); + return retval; +@@ -1279,8 +1299,10 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio, + zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); + retval = zfcp_fsf_req_send(req); + spin_unlock_irq(&qdio->req_q_lock); +- if (!retval) ++ if (!retval) { ++ /* NOTE: ONLY TOUCH SYNC req AGAIN ON req->completion. */ + wait_for_completion(&req->completion); ++ } + + zfcp_fsf_req_free(req); + return retval; +@@ -1330,6 +1352,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action) + zfcp_fsf_req_free(req); + erp_action->fsf_req_id = 0; + } ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + out: + spin_unlock_irq(&qdio->req_q_lock); + return retval; +@@ -1372,8 +1395,10 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio, + retval = zfcp_fsf_req_send(req); + spin_unlock_irq(&qdio->req_q_lock); + +- if (!retval) ++ if (!retval) { ++ /* NOTE: ONLY TOUCH SYNC req AGAIN ON req->completion. */ + wait_for_completion(&req->completion); ++ } + + zfcp_fsf_req_free(req); + +@@ -1493,6 +1518,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) + erp_action->fsf_req_id = 0; + put_device(&port->dev); + } ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + out: + spin_unlock_irq(&qdio->req_q_lock); + return retval; +@@ -1557,6 +1583,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action) + zfcp_fsf_req_free(req); + erp_action->fsf_req_id = 0; + } ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + out: + spin_unlock_irq(&qdio->req_q_lock); + return retval; +@@ -1600,6 +1627,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) + { + struct zfcp_qdio *qdio = wka_port->adapter->qdio; + struct zfcp_fsf_req *req; ++ unsigned long req_id = 0; + int retval = -EIO; + + spin_lock_irq(&qdio->req_q_lock); +@@ -1622,14 +1650,17 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) + hton24(req->qtcb->bottom.support.d_id, wka_port->d_id); + req->data = wka_port; + ++ req_id = req->req_id; ++ + zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); + retval = zfcp_fsf_req_send(req); + if (retval) + zfcp_fsf_req_free(req); ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + out: + spin_unlock_irq(&qdio->req_q_lock); + if (!retval) +- zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req->req_id); ++ zfcp_dbf_rec_run_wka("fsowp_1", wka_port, req_id); + return retval; + } + +@@ -1655,6 +1686,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) + { + struct zfcp_qdio *qdio = wka_port->adapter->qdio; + struct zfcp_fsf_req *req; ++ unsigned long req_id = 0; + int retval = -EIO; + + spin_lock_irq(&qdio->req_q_lock); +@@ -1677,14 +1709,17 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) + req->data = wka_port; + req->qtcb->header.port_handle = wka_port->handle; + ++ req_id = req->req_id; ++ + zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); + retval = zfcp_fsf_req_send(req); + if (retval) + zfcp_fsf_req_free(req); ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + out: + spin_unlock_irq(&qdio->req_q_lock); + if (!retval) +- zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req->req_id); ++ zfcp_dbf_rec_run_wka("fscwp_1", wka_port, req_id); + return retval; + } + +@@ -1776,6 +1811,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action) + zfcp_fsf_req_free(req); + erp_action->fsf_req_id = 0; + } ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + out: + spin_unlock_irq(&qdio->req_q_lock); + return retval; +@@ -1899,6 +1935,7 @@ int zfcp_fsf_open_lun(struct zfcp_erp_action *erp_action) + zfcp_fsf_req_free(req); + erp_action->fsf_req_id = 0; + } ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + out: + spin_unlock_irq(&qdio->req_q_lock); + return retval; +@@ -1987,6 +2024,7 @@ int zfcp_fsf_close_lun(struct zfcp_erp_action *erp_action) + zfcp_fsf_req_free(req); + erp_action->fsf_req_id = 0; + } ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + out: + spin_unlock_irq(&qdio->req_q_lock); + return retval; +@@ -2299,6 +2337,7 @@ int zfcp_fsf_fcp_cmnd(struct scsi_cmnd *scsi_cmnd) + retval = zfcp_fsf_req_send(req); + if (unlikely(retval)) + goto failed_scsi_cmnd; ++ /* NOTE: DO NOT TOUCH req PAST THIS POINT! */ + + goto out; + +@@ -2373,8 +2412,10 @@ struct zfcp_fsf_req *zfcp_fsf_fcp_task_mgmt(struct scsi_device *sdev, + zfcp_fc_fcp_tm(fcp_cmnd, sdev, tm_flags); + + zfcp_fsf_start_timer(req, ZFCP_FSF_SCSI_ER_TIMEOUT); +- if (!zfcp_fsf_req_send(req)) ++ if (!zfcp_fsf_req_send(req)) { ++ /* NOTE: DO NOT TOUCH req, UNTIL IT COMPLETES! */ + goto out; ++ } + + zfcp_fsf_req_free(req); + req = NULL; +diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig +index 61da513fc0ed..dcb9c643e5e8 100644 +--- a/drivers/scsi/Kconfig ++++ b/drivers/scsi/Kconfig +@@ -1516,4 +1516,6 @@ source "drivers/scsi/pcmcia/Kconfig" + + source "drivers/scsi/device_handler/Kconfig" + ++source "drivers/scsi/vhba/Kconfig" ++ + endmenu +diff --git a/drivers/scsi/Makefile b/drivers/scsi/Makefile +index 8826111fdf4a..35e70562b6e2 100644 +--- a/drivers/scsi/Makefile ++++ b/drivers/scsi/Makefile +@@ -151,6 +151,7 @@ obj-$(CONFIG_CHR_DEV_SCH) += ch.o + obj-$(CONFIG_SCSI_ENCLOSURE) += ses.o + + obj-$(CONFIG_SCSI_HISI_SAS) += hisi_sas/ ++obj-$(CONFIG_VHBA) += vhba/ + + # This goes last, so that "real" scsi devices probe earlier + obj-$(CONFIG_SCSI_DEBUG) += scsi_debug.o +diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c +index fe0535affc14..d9fa9cf2fd8b 100644 +--- a/drivers/scsi/NCR5380.c ++++ b/drivers/scsi/NCR5380.c +@@ -709,6 +709,8 @@ static void NCR5380_main(struct work_struct *work) + NCR5380_information_transfer(instance); + done = 0; + } ++ if (!hostdata->connected) ++ NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); + spin_unlock_irq(&hostdata->lock); + if (!done) + cond_resched(); +@@ -1110,8 +1112,6 @@ static bool NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd) + spin_lock_irq(&hostdata->lock); + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); + NCR5380_reselect(instance); +- if (!hostdata->connected) +- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); + shost_printk(KERN_ERR, instance, "reselection after won arbitration?\n"); + goto out; + } +@@ -1119,7 +1119,6 @@ static bool NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd) + if (err < 0) { + spin_lock_irq(&hostdata->lock); + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); +- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); + + /* Can't touch cmd if it has been reclaimed by the scsi ML */ + if (!hostdata->selecting) +@@ -1157,7 +1156,6 @@ static bool NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd) + if (err < 0) { + shost_printk(KERN_ERR, instance, "select: REQ timeout\n"); + NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE); +- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); + goto out; + } + if (!hostdata->selecting) { +@@ -1763,10 +1761,8 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) + scmd_printk(KERN_INFO, cmd, + "switching to slow handshake\n"); + cmd->device->borken = 1; +- sink = 1; +- do_abort(instance); +- cmd->result = DID_ERROR << 16; +- /* XXX - need to source or sink data here, as appropriate */ ++ do_reset(instance); ++ bus_reset_cleanup(instance); + } + } else { + /* Transfer a small chunk so that the +@@ -1826,9 +1822,6 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) + */ + NCR5380_write(TARGET_COMMAND_REG, 0); + +- /* Enable reselect interrupts */ +- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); +- + maybe_release_dma_irq(instance); + return; + case MESSAGE_REJECT: +@@ -1860,8 +1853,6 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) + */ + NCR5380_write(TARGET_COMMAND_REG, 0); + +- /* Enable reselect interrupts */ +- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); + #ifdef SUN3_SCSI_VME + dregs->csr |= CSR_DMA_ENABLE; + #endif +@@ -1964,7 +1955,6 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) + cmd->result = DID_ERROR << 16; + complete_cmd(instance, cmd); + maybe_release_dma_irq(instance); +- NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); + return; + } + msgout = NOP; +diff --git a/drivers/scsi/NCR5380.h b/drivers/scsi/NCR5380.h +index efca509b92b0..5935fd6d1a05 100644 +--- a/drivers/scsi/NCR5380.h ++++ b/drivers/scsi/NCR5380.h +@@ -235,7 +235,7 @@ struct NCR5380_cmd { + #define NCR5380_PIO_CHUNK_SIZE 256 + + /* Time limit (ms) to poll registers when IRQs are disabled, e.g. during PDMA */ +-#define NCR5380_REG_POLL_TIME 15 ++#define NCR5380_REG_POLL_TIME 10 + + static inline struct scsi_cmnd *NCR5380_to_scmd(struct NCR5380_cmd *ncmd_ptr) + { +diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c +index f0066f8a1786..4971104b1817 100644 +--- a/drivers/scsi/device_handler/scsi_dh_alua.c ++++ b/drivers/scsi/device_handler/scsi_dh_alua.c +@@ -40,6 +40,7 @@ + #define ALUA_FAILOVER_TIMEOUT 60 + #define ALUA_FAILOVER_RETRIES 5 + #define ALUA_RTPG_DELAY_MSECS 5 ++#define ALUA_RTPG_RETRY_DELAY 2 + + /* device handler flags */ + #define ALUA_OPTIMIZE_STPG 0x01 +@@ -682,7 +683,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_port_group *pg) + case SCSI_ACCESS_STATE_TRANSITIONING: + if (time_before(jiffies, pg->expiry)) { + /* State transition, retry */ +- pg->interval = 2; ++ pg->interval = ALUA_RTPG_RETRY_DELAY; + err = SCSI_DH_RETRY; + } else { + struct alua_dh_data *h; +@@ -807,6 +808,8 @@ static void alua_rtpg_work(struct work_struct *work) + spin_lock_irqsave(&pg->lock, flags); + pg->flags &= ~ALUA_PG_RUNNING; + pg->flags |= ALUA_PG_RUN_RTPG; ++ if (!pg->interval) ++ pg->interval = ALUA_RTPG_RETRY_DELAY; + spin_unlock_irqrestore(&pg->lock, flags); + queue_delayed_work(kaluad_wq, &pg->rtpg_work, + pg->interval * HZ); +@@ -818,6 +821,8 @@ static void alua_rtpg_work(struct work_struct *work) + spin_lock_irqsave(&pg->lock, flags); + if (err == SCSI_DH_RETRY || pg->flags & ALUA_PG_RUN_RTPG) { + pg->flags &= ~ALUA_PG_RUNNING; ++ if (!pg->interval && !(pg->flags & ALUA_PG_RUN_RTPG)) ++ pg->interval = ALUA_RTPG_RETRY_DELAY; + pg->flags |= ALUA_PG_RUN_RTPG; + spin_unlock_irqrestore(&pg->lock, flags); + queue_delayed_work(kaluad_wq, &pg->rtpg_work, +diff --git a/drivers/scsi/fcoe/fcoe_ctlr.c b/drivers/scsi/fcoe/fcoe_ctlr.c +index 590ec8009f52..9e444b1846ce 100644 +--- a/drivers/scsi/fcoe/fcoe_ctlr.c ++++ b/drivers/scsi/fcoe/fcoe_ctlr.c +@@ -2005,7 +2005,7 @@ EXPORT_SYMBOL_GPL(fcoe_wwn_from_mac); + */ + static inline struct fcoe_rport *fcoe_ctlr_rport(struct fc_rport_priv *rdata) + { +- return (struct fcoe_rport *)(rdata + 1); ++ return container_of(rdata, struct fcoe_rport, rdata); + } + + /** +@@ -2269,7 +2269,7 @@ static void fcoe_ctlr_vn_start(struct fcoe_ctlr *fip) + */ + static int fcoe_ctlr_vn_parse(struct fcoe_ctlr *fip, + struct sk_buff *skb, +- struct fc_rport_priv *rdata) ++ struct fcoe_rport *frport) + { + struct fip_header *fiph; + struct fip_desc *desc = NULL; +@@ -2277,16 +2277,12 @@ static int fcoe_ctlr_vn_parse(struct fcoe_ctlr *fip, + struct fip_wwn_desc *wwn = NULL; + struct fip_vn_desc *vn = NULL; + struct fip_size_desc *size = NULL; +- struct fcoe_rport *frport; + size_t rlen; + size_t dlen; + u32 desc_mask = 0; + u32 dtype; + u8 sub; + +- memset(rdata, 0, sizeof(*rdata) + sizeof(*frport)); +- frport = fcoe_ctlr_rport(rdata); +- + fiph = (struct fip_header *)skb->data; + frport->flags = ntohs(fiph->fip_flags); + +@@ -2349,15 +2345,17 @@ static int fcoe_ctlr_vn_parse(struct fcoe_ctlr *fip, + if (dlen != sizeof(struct fip_wwn_desc)) + goto len_err; + wwn = (struct fip_wwn_desc *)desc; +- rdata->ids.node_name = get_unaligned_be64(&wwn->fd_wwn); ++ frport->rdata.ids.node_name = ++ get_unaligned_be64(&wwn->fd_wwn); + break; + case FIP_DT_VN_ID: + if (dlen != sizeof(struct fip_vn_desc)) + goto len_err; + vn = (struct fip_vn_desc *)desc; + memcpy(frport->vn_mac, vn->fd_mac, ETH_ALEN); +- rdata->ids.port_id = ntoh24(vn->fd_fc_id); +- rdata->ids.port_name = get_unaligned_be64(&vn->fd_wwpn); ++ frport->rdata.ids.port_id = ntoh24(vn->fd_fc_id); ++ frport->rdata.ids.port_name = ++ get_unaligned_be64(&vn->fd_wwpn); + break; + case FIP_DT_FC4F: + if (dlen != sizeof(struct fip_fc4_feat)) +@@ -2738,10 +2736,7 @@ static int fcoe_ctlr_vn_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) + { + struct fip_header *fiph; + enum fip_vn2vn_subcode sub; +- struct { +- struct fc_rport_priv rdata; +- struct fcoe_rport frport; +- } buf; ++ struct fcoe_rport frport = { }; + int rc, vlan_id = 0; + + fiph = (struct fip_header *)skb->data; +@@ -2757,7 +2752,7 @@ static int fcoe_ctlr_vn_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) + goto drop; + } + +- rc = fcoe_ctlr_vn_parse(fip, skb, &buf.rdata); ++ rc = fcoe_ctlr_vn_parse(fip, skb, &frport); + if (rc) { + LIBFCOE_FIP_DBG(fip, "vn_recv vn_parse error %d\n", rc); + goto drop; +@@ -2766,19 +2761,19 @@ static int fcoe_ctlr_vn_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) + mutex_lock(&fip->ctlr_mutex); + switch (sub) { + case FIP_SC_VN_PROBE_REQ: +- fcoe_ctlr_vn_probe_req(fip, &buf.rdata); ++ fcoe_ctlr_vn_probe_req(fip, &frport.rdata); + break; + case FIP_SC_VN_PROBE_REP: +- fcoe_ctlr_vn_probe_reply(fip, &buf.rdata); ++ fcoe_ctlr_vn_probe_reply(fip, &frport.rdata); + break; + case FIP_SC_VN_CLAIM_NOTIFY: +- fcoe_ctlr_vn_claim_notify(fip, &buf.rdata); ++ fcoe_ctlr_vn_claim_notify(fip, &frport.rdata); + break; + case FIP_SC_VN_CLAIM_REP: +- fcoe_ctlr_vn_claim_resp(fip, &buf.rdata); ++ fcoe_ctlr_vn_claim_resp(fip, &frport.rdata); + break; + case FIP_SC_VN_BEACON: +- fcoe_ctlr_vn_beacon(fip, &buf.rdata); ++ fcoe_ctlr_vn_beacon(fip, &frport.rdata); + break; + default: + LIBFCOE_FIP_DBG(fip, "vn_recv unknown subcode %d\n", sub); +@@ -2802,22 +2797,18 @@ static int fcoe_ctlr_vn_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) + */ + static int fcoe_ctlr_vlan_parse(struct fcoe_ctlr *fip, + struct sk_buff *skb, +- struct fc_rport_priv *rdata) ++ struct fcoe_rport *frport) + { + struct fip_header *fiph; + struct fip_desc *desc = NULL; + struct fip_mac_desc *macd = NULL; + struct fip_wwn_desc *wwn = NULL; +- struct fcoe_rport *frport; + size_t rlen; + size_t dlen; + u32 desc_mask = 0; + u32 dtype; + u8 sub; + +- memset(rdata, 0, sizeof(*rdata) + sizeof(*frport)); +- frport = fcoe_ctlr_rport(rdata); +- + fiph = (struct fip_header *)skb->data; + frport->flags = ntohs(fiph->fip_flags); + +@@ -2871,7 +2862,8 @@ static int fcoe_ctlr_vlan_parse(struct fcoe_ctlr *fip, + if (dlen != sizeof(struct fip_wwn_desc)) + goto len_err; + wwn = (struct fip_wwn_desc *)desc; +- rdata->ids.node_name = get_unaligned_be64(&wwn->fd_wwn); ++ frport->rdata.ids.node_name = ++ get_unaligned_be64(&wwn->fd_wwn); + break; + default: + LIBFCOE_FIP_DBG(fip, "unexpected descriptor type %x " +@@ -2982,22 +2974,19 @@ static int fcoe_ctlr_vlan_recv(struct fcoe_ctlr *fip, struct sk_buff *skb) + { + struct fip_header *fiph; + enum fip_vlan_subcode sub; +- struct { +- struct fc_rport_priv rdata; +- struct fcoe_rport frport; +- } buf; ++ struct fcoe_rport frport = { }; + int rc; + + fiph = (struct fip_header *)skb->data; + sub = fiph->fip_subcode; +- rc = fcoe_ctlr_vlan_parse(fip, skb, &buf.rdata); ++ rc = fcoe_ctlr_vlan_parse(fip, skb, &frport); + if (rc) { + LIBFCOE_FIP_DBG(fip, "vlan_recv vlan_parse error %d\n", rc); + goto drop; + } + mutex_lock(&fip->ctlr_mutex); + if (sub == FIP_SC_VL_REQ) +- fcoe_ctlr_vlan_disc_reply(fip, &buf.rdata); ++ fcoe_ctlr_vlan_disc_reply(fip, &frport.rdata); + mutex_unlock(&fip->ctlr_mutex); + + drop: +diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c +index 80608b53897b..84051b538fa8 100644 +--- a/drivers/scsi/fnic/fnic_scsi.c ++++ b/drivers/scsi/fnic/fnic_scsi.c +@@ -216,7 +216,7 @@ int fnic_fw_reset_handler(struct fnic *fnic) + + /* wait for io cmpl */ + while (atomic_read(&fnic->in_flight)) +- schedule_timeout(msecs_to_jiffies(1)); ++ schedule_msec_hrtimeout((1)); + + spin_lock_irqsave(&fnic->wq_copy_lock[0], flags); + +@@ -2273,7 +2273,7 @@ static int fnic_clean_pending_aborts(struct fnic *fnic, + } + } + +- schedule_timeout(msecs_to_jiffies(2 * fnic->config.ed_tov)); ++ schedule_msec_hrtimeout((2 * fnic->config.ed_tov)); + + /* walk again to check, if IOs are still pending in fw */ + if (fnic_is_abts_pending(fnic, lr_sc)) +diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c +index acd16e0d52cf..8cdbac076a1b 100644 +--- a/drivers/scsi/ibmvscsi/ibmvfc.c ++++ b/drivers/scsi/ibmvscsi/ibmvfc.c +@@ -4864,8 +4864,8 @@ static int ibmvfc_remove(struct vio_dev *vdev) + + spin_lock_irqsave(vhost->host->host_lock, flags); + ibmvfc_purge_requests(vhost, DID_ERROR); +- ibmvfc_free_event_pool(vhost); + spin_unlock_irqrestore(vhost->host->host_lock, flags); ++ ibmvfc_free_event_pool(vhost); + + ibmvfc_free_mem(vhost); + spin_lock(&ibmvfc_driver_lock); +diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c +index e0f3852fdad1..da6e97d8dc3b 100644 +--- a/drivers/scsi/libfc/fc_rport.c ++++ b/drivers/scsi/libfc/fc_rport.c +@@ -128,6 +128,7 @@ EXPORT_SYMBOL(fc_rport_lookup); + struct fc_rport_priv *fc_rport_create(struct fc_lport *lport, u32 port_id) + { + struct fc_rport_priv *rdata; ++ size_t rport_priv_size = sizeof(*rdata); + + lockdep_assert_held(&lport->disc.disc_mutex); + +@@ -135,7 +136,9 @@ struct fc_rport_priv *fc_rport_create(struct fc_lport *lport, u32 port_id) + if (rdata) + return rdata; + +- rdata = kzalloc(sizeof(*rdata) + lport->rport_priv_size, GFP_KERNEL); ++ if (lport->rport_priv_size > 0) ++ rport_priv_size = lport->rport_priv_size; ++ rdata = kzalloc(rport_priv_size, GFP_KERNEL); + if (!rdata) + return NULL; + +diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c +index ba996fbde89b..ba4879b50382 100644 +--- a/drivers/scsi/lpfc/lpfc_scsi.c ++++ b/drivers/scsi/lpfc/lpfc_scsi.c +@@ -5007,7 +5007,7 @@ lpfc_reset_flush_io_context(struct lpfc_vport *vport, uint16_t tgt_id, + tgt_id, lun_id, context); + later = msecs_to_jiffies(2 * vport->cfg_devloss_tmo * 1000) + jiffies; + while (time_after(later, jiffies) && cnt) { +- schedule_timeout_uninterruptible(msecs_to_jiffies(20)); ++ schedule_msec_hrtimeout_uninterruptible((20)); + cnt = lpfc_sli_sum_iocb(vport, tgt_id, lun_id, context); + } + if (cnt) { +diff --git a/drivers/scsi/mac_scsi.c b/drivers/scsi/mac_scsi.c +index dba9517d9553..c5169d31c966 100644 +--- a/drivers/scsi/mac_scsi.c ++++ b/drivers/scsi/mac_scsi.c +@@ -4,6 +4,8 @@ + * + * Copyright 1998, Michael Schmitz + * ++ * Copyright 2019 Finn Thain ++ * + * derived in part from: + */ + /* +@@ -12,6 +14,7 @@ + * Copyright 1995, Russell King + */ + ++#include + #include + #include + #include +@@ -53,7 +56,7 @@ static int setup_cmd_per_lun = -1; + module_param(setup_cmd_per_lun, int, 0); + static int setup_sg_tablesize = -1; + module_param(setup_sg_tablesize, int, 0); +-static int setup_use_pdma = -1; ++static int setup_use_pdma = 512; + module_param(setup_use_pdma, int, 0); + static int setup_hostid = -1; + module_param(setup_hostid, int, 0); +@@ -90,101 +93,217 @@ static int __init mac_scsi_setup(char *str) + __setup("mac5380=", mac_scsi_setup); + #endif /* !MODULE */ + +-/* Pseudo DMA asm originally by Ove Edlund */ +- +-#define CP_IO_TO_MEM(s,d,n) \ +-__asm__ __volatile__ \ +- (" cmp.w #4,%2\n" \ +- " bls 8f\n" \ +- " move.w %1,%%d0\n" \ +- " neg.b %%d0\n" \ +- " and.w #3,%%d0\n" \ +- " sub.w %%d0,%2\n" \ +- " bra 2f\n" \ +- " 1: move.b (%0),(%1)+\n" \ +- " 2: dbf %%d0,1b\n" \ +- " move.w %2,%%d0\n" \ +- " lsr.w #5,%%d0\n" \ +- " bra 4f\n" \ +- " 3: move.l (%0),(%1)+\n" \ +- "31: move.l (%0),(%1)+\n" \ +- "32: move.l (%0),(%1)+\n" \ +- "33: move.l (%0),(%1)+\n" \ +- "34: move.l (%0),(%1)+\n" \ +- "35: move.l (%0),(%1)+\n" \ +- "36: move.l (%0),(%1)+\n" \ +- "37: move.l (%0),(%1)+\n" \ +- " 4: dbf %%d0,3b\n" \ +- " move.w %2,%%d0\n" \ +- " lsr.w #2,%%d0\n" \ +- " and.w #7,%%d0\n" \ +- " bra 6f\n" \ +- " 5: move.l (%0),(%1)+\n" \ +- " 6: dbf %%d0,5b\n" \ +- " and.w #3,%2\n" \ +- " bra 8f\n" \ +- " 7: move.b (%0),(%1)+\n" \ +- " 8: dbf %2,7b\n" \ +- " moveq.l #0, %2\n" \ +- " 9: \n" \ +- ".section .fixup,\"ax\"\n" \ +- " .even\n" \ +- "91: moveq.l #1, %2\n" \ +- " jra 9b\n" \ +- "94: moveq.l #4, %2\n" \ +- " jra 9b\n" \ +- ".previous\n" \ +- ".section __ex_table,\"a\"\n" \ +- " .align 4\n" \ +- " .long 1b,91b\n" \ +- " .long 3b,94b\n" \ +- " .long 31b,94b\n" \ +- " .long 32b,94b\n" \ +- " .long 33b,94b\n" \ +- " .long 34b,94b\n" \ +- " .long 35b,94b\n" \ +- " .long 36b,94b\n" \ +- " .long 37b,94b\n" \ +- " .long 5b,94b\n" \ +- " .long 7b,91b\n" \ +- ".previous" \ +- : "=a"(s), "=a"(d), "=d"(n) \ +- : "0"(s), "1"(d), "2"(n) \ +- : "d0") ++/* ++ * According to "Inside Macintosh: Devices", Mac OS requires disk drivers to ++ * specify the number of bytes between the delays expected from a SCSI target. ++ * This allows the operating system to "prevent bus errors when a target fails ++ * to deliver the next byte within the processor bus error timeout period." ++ * Linux SCSI drivers lack knowledge of the timing behaviour of SCSI targets ++ * so bus errors are unavoidable. ++ * ++ * If a MOVE.B instruction faults, we assume that zero bytes were transferred ++ * and simply retry. That assumption probably depends on target behaviour but ++ * seems to hold up okay. The NOP provides synchronization: without it the ++ * fault can sometimes occur after the program counter has moved past the ++ * offending instruction. Post-increment addressing can't be used. ++ */ ++ ++#define MOVE_BYTE(operands) \ ++ asm volatile ( \ ++ "1: moveb " operands " \n" \ ++ "11: nop \n" \ ++ " addq #1,%0 \n" \ ++ " subq #1,%1 \n" \ ++ "40: \n" \ ++ " \n" \ ++ ".section .fixup,\"ax\" \n" \ ++ ".even \n" \ ++ "90: movel #1, %2 \n" \ ++ " jra 40b \n" \ ++ ".previous \n" \ ++ " \n" \ ++ ".section __ex_table,\"a\" \n" \ ++ ".align 4 \n" \ ++ ".long 1b,90b \n" \ ++ ".long 11b,90b \n" \ ++ ".previous \n" \ ++ : "+a" (addr), "+r" (n), "+r" (result) : "a" (io)) ++ ++/* ++ * If a MOVE.W (or MOVE.L) instruction faults, it cannot be retried because ++ * the residual byte count would be uncertain. In that situation the MOVE_WORD ++ * macro clears n in the fixup section to abort the transfer. ++ */ ++ ++#define MOVE_WORD(operands) \ ++ asm volatile ( \ ++ "1: movew " operands " \n" \ ++ "11: nop \n" \ ++ " subq #2,%1 \n" \ ++ "40: \n" \ ++ " \n" \ ++ ".section .fixup,\"ax\" \n" \ ++ ".even \n" \ ++ "90: movel #0, %1 \n" \ ++ " movel #2, %2 \n" \ ++ " jra 40b \n" \ ++ ".previous \n" \ ++ " \n" \ ++ ".section __ex_table,\"a\" \n" \ ++ ".align 4 \n" \ ++ ".long 1b,90b \n" \ ++ ".long 11b,90b \n" \ ++ ".previous \n" \ ++ : "+a" (addr), "+r" (n), "+r" (result) : "a" (io)) ++ ++#define MOVE_16_WORDS(operands) \ ++ asm volatile ( \ ++ "1: movew " operands " \n" \ ++ "2: movew " operands " \n" \ ++ "3: movew " operands " \n" \ ++ "4: movew " operands " \n" \ ++ "5: movew " operands " \n" \ ++ "6: movew " operands " \n" \ ++ "7: movew " operands " \n" \ ++ "8: movew " operands " \n" \ ++ "9: movew " operands " \n" \ ++ "10: movew " operands " \n" \ ++ "11: movew " operands " \n" \ ++ "12: movew " operands " \n" \ ++ "13: movew " operands " \n" \ ++ "14: movew " operands " \n" \ ++ "15: movew " operands " \n" \ ++ "16: movew " operands " \n" \ ++ "17: nop \n" \ ++ " subl #32,%1 \n" \ ++ "40: \n" \ ++ " \n" \ ++ ".section .fixup,\"ax\" \n" \ ++ ".even \n" \ ++ "90: movel #0, %1 \n" \ ++ " movel #2, %2 \n" \ ++ " jra 40b \n" \ ++ ".previous \n" \ ++ " \n" \ ++ ".section __ex_table,\"a\" \n" \ ++ ".align 4 \n" \ ++ ".long 1b,90b \n" \ ++ ".long 2b,90b \n" \ ++ ".long 3b,90b \n" \ ++ ".long 4b,90b \n" \ ++ ".long 5b,90b \n" \ ++ ".long 6b,90b \n" \ ++ ".long 7b,90b \n" \ ++ ".long 8b,90b \n" \ ++ ".long 9b,90b \n" \ ++ ".long 10b,90b \n" \ ++ ".long 11b,90b \n" \ ++ ".long 12b,90b \n" \ ++ ".long 13b,90b \n" \ ++ ".long 14b,90b \n" \ ++ ".long 15b,90b \n" \ ++ ".long 16b,90b \n" \ ++ ".long 17b,90b \n" \ ++ ".previous \n" \ ++ : "+a" (addr), "+r" (n), "+r" (result) : "a" (io)) ++ ++#define MAC_PDMA_DELAY 32 ++ ++static inline int mac_pdma_recv(void __iomem *io, unsigned char *start, int n) ++{ ++ unsigned char *addr = start; ++ int result = 0; ++ ++ if (n >= 1) { ++ MOVE_BYTE("%3@,%0@"); ++ if (result) ++ goto out; ++ } ++ if (n >= 1 && ((unsigned long)addr & 1)) { ++ MOVE_BYTE("%3@,%0@"); ++ if (result) ++ goto out; ++ } ++ while (n >= 32) ++ MOVE_16_WORDS("%3@,%0@+"); ++ while (n >= 2) ++ MOVE_WORD("%3@,%0@+"); ++ if (result) ++ return start - addr; /* Negated to indicate uncertain length */ ++ if (n == 1) ++ MOVE_BYTE("%3@,%0@"); ++out: ++ return addr - start; ++} ++ ++static inline int mac_pdma_send(unsigned char *start, void __iomem *io, int n) ++{ ++ unsigned char *addr = start; ++ int result = 0; ++ ++ if (n >= 1) { ++ MOVE_BYTE("%0@,%3@"); ++ if (result) ++ goto out; ++ } ++ if (n >= 1 && ((unsigned long)addr & 1)) { ++ MOVE_BYTE("%0@,%3@"); ++ if (result) ++ goto out; ++ } ++ while (n >= 32) ++ MOVE_16_WORDS("%0@+,%3@"); ++ while (n >= 2) ++ MOVE_WORD("%0@+,%3@"); ++ if (result) ++ return start - addr; /* Negated to indicate uncertain length */ ++ if (n == 1) ++ MOVE_BYTE("%0@,%3@"); ++out: ++ return addr - start; ++} + + static inline int macscsi_pread(struct NCR5380_hostdata *hostdata, + unsigned char *dst, int len) + { + u8 __iomem *s = hostdata->pdma_io + (INPUT_DATA_REG << 4); + unsigned char *d = dst; +- int n = len; +- int transferred; ++ ++ hostdata->pdma_residual = len; + + while (!NCR5380_poll_politely(hostdata, BUS_AND_STATUS_REG, + BASR_DRQ | BASR_PHASE_MATCH, + BASR_DRQ | BASR_PHASE_MATCH, HZ / 64)) { +- CP_IO_TO_MEM(s, d, n); ++ int bytes; + +- transferred = d - dst - n; +- hostdata->pdma_residual = len - transferred; ++ bytes = mac_pdma_recv(s, d, min(hostdata->pdma_residual, 512)); + +- /* No bus error. */ +- if (n == 0) ++ if (bytes > 0) { ++ d += bytes; ++ hostdata->pdma_residual -= bytes; ++ } ++ ++ if (hostdata->pdma_residual == 0) + return 0; + +- /* Target changed phase early? */ + if (NCR5380_poll_politely2(hostdata, STATUS_REG, SR_REQ, SR_REQ, +- BUS_AND_STATUS_REG, BASR_ACK, BASR_ACK, HZ / 64) < 0) +- scmd_printk(KERN_ERR, hostdata->connected, ++ BUS_AND_STATUS_REG, BASR_ACK, ++ BASR_ACK, HZ / 64) < 0) ++ scmd_printk(KERN_DEBUG, hostdata->connected, + "%s: !REQ and !ACK\n", __func__); + if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) + return 0; + ++ if (bytes == 0) ++ udelay(MAC_PDMA_DELAY); ++ ++ if (bytes >= 0) ++ continue; ++ + dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host, +- "%s: bus error (%d/%d)\n", __func__, transferred, len); ++ "%s: bus error (%d/%d)\n", __func__, d - dst, len); + NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host); +- d = dst + transferred; +- n = len - transferred; ++ return -1; + } + + scmd_printk(KERN_ERR, hostdata->connected, +@@ -193,93 +312,27 @@ static inline int macscsi_pread(struct NCR5380_hostdata *hostdata, + return -1; + } + +- +-#define CP_MEM_TO_IO(s,d,n) \ +-__asm__ __volatile__ \ +- (" cmp.w #4,%2\n" \ +- " bls 8f\n" \ +- " move.w %0,%%d0\n" \ +- " neg.b %%d0\n" \ +- " and.w #3,%%d0\n" \ +- " sub.w %%d0,%2\n" \ +- " bra 2f\n" \ +- " 1: move.b (%0)+,(%1)\n" \ +- " 2: dbf %%d0,1b\n" \ +- " move.w %2,%%d0\n" \ +- " lsr.w #5,%%d0\n" \ +- " bra 4f\n" \ +- " 3: move.l (%0)+,(%1)\n" \ +- "31: move.l (%0)+,(%1)\n" \ +- "32: move.l (%0)+,(%1)\n" \ +- "33: move.l (%0)+,(%1)\n" \ +- "34: move.l (%0)+,(%1)\n" \ +- "35: move.l (%0)+,(%1)\n" \ +- "36: move.l (%0)+,(%1)\n" \ +- "37: move.l (%0)+,(%1)\n" \ +- " 4: dbf %%d0,3b\n" \ +- " move.w %2,%%d0\n" \ +- " lsr.w #2,%%d0\n" \ +- " and.w #7,%%d0\n" \ +- " bra 6f\n" \ +- " 5: move.l (%0)+,(%1)\n" \ +- " 6: dbf %%d0,5b\n" \ +- " and.w #3,%2\n" \ +- " bra 8f\n" \ +- " 7: move.b (%0)+,(%1)\n" \ +- " 8: dbf %2,7b\n" \ +- " moveq.l #0, %2\n" \ +- " 9: \n" \ +- ".section .fixup,\"ax\"\n" \ +- " .even\n" \ +- "91: moveq.l #1, %2\n" \ +- " jra 9b\n" \ +- "94: moveq.l #4, %2\n" \ +- " jra 9b\n" \ +- ".previous\n" \ +- ".section __ex_table,\"a\"\n" \ +- " .align 4\n" \ +- " .long 1b,91b\n" \ +- " .long 3b,94b\n" \ +- " .long 31b,94b\n" \ +- " .long 32b,94b\n" \ +- " .long 33b,94b\n" \ +- " .long 34b,94b\n" \ +- " .long 35b,94b\n" \ +- " .long 36b,94b\n" \ +- " .long 37b,94b\n" \ +- " .long 5b,94b\n" \ +- " .long 7b,91b\n" \ +- ".previous" \ +- : "=a"(s), "=a"(d), "=d"(n) \ +- : "0"(s), "1"(d), "2"(n) \ +- : "d0") +- + static inline int macscsi_pwrite(struct NCR5380_hostdata *hostdata, + unsigned char *src, int len) + { + unsigned char *s = src; + u8 __iomem *d = hostdata->pdma_io + (OUTPUT_DATA_REG << 4); +- int n = len; +- int transferred; ++ ++ hostdata->pdma_residual = len; + + while (!NCR5380_poll_politely(hostdata, BUS_AND_STATUS_REG, + BASR_DRQ | BASR_PHASE_MATCH, + BASR_DRQ | BASR_PHASE_MATCH, HZ / 64)) { +- CP_MEM_TO_IO(s, d, n); ++ int bytes; + +- transferred = s - src - n; +- hostdata->pdma_residual = len - transferred; ++ bytes = mac_pdma_send(s, d, min(hostdata->pdma_residual, 512)); + +- /* Target changed phase early? */ +- if (NCR5380_poll_politely2(hostdata, STATUS_REG, SR_REQ, SR_REQ, +- BUS_AND_STATUS_REG, BASR_ACK, BASR_ACK, HZ / 64) < 0) +- scmd_printk(KERN_ERR, hostdata->connected, +- "%s: !REQ and !ACK\n", __func__); +- if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) +- return 0; ++ if (bytes > 0) { ++ s += bytes; ++ hostdata->pdma_residual -= bytes; ++ } + +- /* No bus error. */ +- if (n == 0) { ++ if (hostdata->pdma_residual == 0) { + if (NCR5380_poll_politely(hostdata, TARGET_COMMAND_REG, + TCR_LAST_BYTE_SENT, + TCR_LAST_BYTE_SENT, HZ / 64) < 0) +@@ -288,17 +341,29 @@ static inline int macscsi_pwrite(struct NCR5380_hostdata *hostdata, + return 0; + } + ++ if (NCR5380_poll_politely2(hostdata, STATUS_REG, SR_REQ, SR_REQ, ++ BUS_AND_STATUS_REG, BASR_ACK, ++ BASR_ACK, HZ / 64) < 0) ++ scmd_printk(KERN_DEBUG, hostdata->connected, ++ "%s: !REQ and !ACK\n", __func__); ++ if (!(NCR5380_read(BUS_AND_STATUS_REG) & BASR_PHASE_MATCH)) ++ return 0; ++ ++ if (bytes == 0) ++ udelay(MAC_PDMA_DELAY); ++ ++ if (bytes >= 0) ++ continue; ++ + dsprintk(NDEBUG_PSEUDO_DMA, hostdata->host, +- "%s: bus error (%d/%d)\n", __func__, transferred, len); ++ "%s: bus error (%d/%d)\n", __func__, s - src, len); + NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host); +- s = src + transferred; +- n = len - transferred; ++ return -1; + } + + scmd_printk(KERN_ERR, hostdata->connected, + "%s: phase mismatch or !DRQ\n", __func__); + NCR5380_dprint(NDEBUG_PSEUDO_DMA, hostdata->host); +- + return -1; + } + +@@ -306,7 +371,7 @@ static int macscsi_dma_xfer_len(struct NCR5380_hostdata *hostdata, + struct scsi_cmnd *cmd) + { + if (hostdata->flags & FLAG_NO_PSEUDO_DMA || +- cmd->SCp.this_residual < 16) ++ cmd->SCp.this_residual < setup_use_pdma) + return 0; + + return cmd->SCp.this_residual; +diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c +index 3dd1df472dc6..5f30016e9b64 100644 +--- a/drivers/scsi/megaraid/megaraid_sas_base.c ++++ b/drivers/scsi/megaraid/megaraid_sas_base.c +@@ -3045,6 +3045,7 @@ megasas_fw_crash_buffer_show(struct device *cdev, + u32 size; + unsigned long buff_addr; + unsigned long dmachunk = CRASH_DMA_BUF_SIZE; ++ unsigned long chunk_left_bytes; + unsigned long src_addr; + unsigned long flags; + u32 buff_offset; +@@ -3070,6 +3071,8 @@ megasas_fw_crash_buffer_show(struct device *cdev, + } + + size = (instance->fw_crash_buffer_size * dmachunk) - buff_offset; ++ chunk_left_bytes = dmachunk - (buff_offset % dmachunk); ++ size = (size > chunk_left_bytes) ? chunk_left_bytes : size; + size = (size >= PAGE_SIZE) ? (PAGE_SIZE - 1) : size; + + src_addr = (unsigned long)instance->crash_buf[buff_offset / dmachunk] + +@@ -6155,7 +6158,8 @@ megasas_get_target_prop(struct megasas_instance *instance, + int ret; + struct megasas_cmd *cmd; + struct megasas_dcmd_frame *dcmd; +- u16 targetId = (sdev->channel % 2) + sdev->id; ++ u16 targetId = ((sdev->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + ++ sdev->id; + + cmd = megasas_get_cmd(instance); + +diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c +index 8aacbd1e7db2..f2d61d023bcb 100644 +--- a/drivers/scsi/mpt3sas/mpt3sas_base.c ++++ b/drivers/scsi/mpt3sas/mpt3sas_base.c +@@ -2683,6 +2683,8 @@ _base_config_dma_addressing(struct MPT3SAS_ADAPTER *ioc, struct pci_dev *pdev) + { + u64 required_mask, coherent_mask; + struct sysinfo s; ++ /* Set 63 bit DMA mask for all SAS3 and SAS35 controllers */ ++ int dma_mask = (ioc->hba_mpi_version_belonged > MPI2_VERSION) ? 63 : 64; + + if (ioc->is_mcpu_endpoint) + goto try_32bit; +@@ -2692,17 +2694,17 @@ _base_config_dma_addressing(struct MPT3SAS_ADAPTER *ioc, struct pci_dev *pdev) + goto try_32bit; + + if (ioc->dma_mask) +- coherent_mask = DMA_BIT_MASK(64); ++ coherent_mask = DMA_BIT_MASK(dma_mask); + else + coherent_mask = DMA_BIT_MASK(32); + +- if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)) || ++ if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(dma_mask)) || + dma_set_coherent_mask(&pdev->dev, coherent_mask)) + goto try_32bit; + + ioc->base_add_sg_single = &_base_add_sg_single_64; + ioc->sge_size = sizeof(Mpi2SGESimple64_t); +- ioc->dma_mask = 64; ++ ioc->dma_mask = dma_mask; + goto out; + + try_32bit: +@@ -2724,7 +2726,7 @@ static int + _base_change_consistent_dma_mask(struct MPT3SAS_ADAPTER *ioc, + struct pci_dev *pdev) + { +- if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) { ++ if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(ioc->dma_mask))) { + if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) + return -ENODEV; + } +@@ -4631,7 +4633,7 @@ _base_allocate_memory_pools(struct MPT3SAS_ADAPTER *ioc) + total_sz += sz; + } while (ioc->rdpq_array_enable && (++i < ioc->reply_queue_count)); + +- if (ioc->dma_mask == 64) { ++ if (ioc->dma_mask > 32) { + if (_base_change_consistent_dma_mask(ioc, ioc->pdev) != 0) { + ioc_warn(ioc, "no suitable consistent DMA mask for %s\n", + pci_name(ioc->pdev)); +diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c +index 65d0a10c76ad..40f392569664 100644 +--- a/drivers/scsi/scsi_lib.c ++++ b/drivers/scsi/scsi_lib.c +@@ -72,11 +72,11 @@ int scsi_init_sense_cache(struct Scsi_Host *shost) + struct kmem_cache *cache; + int ret = 0; + ++ mutex_lock(&scsi_sense_cache_mutex); + cache = scsi_select_sense_cache(shost->unchecked_isa_dma); + if (cache) +- return 0; ++ goto exit; + +- mutex_lock(&scsi_sense_cache_mutex); + if (shost->unchecked_isa_dma) { + scsi_sense_isadma_cache = + kmem_cache_create("scsi_sense_cache(DMA)", +@@ -92,7 +92,7 @@ int scsi_init_sense_cache(struct Scsi_Host *shost) + if (!scsi_sense_cache) + ret = -ENOMEM; + } +- ++ exit: + mutex_unlock(&scsi_sense_cache_mutex); + return ret; + } +diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c +index 7334024b64f1..e73bf0193a8f 100644 +--- a/drivers/scsi/sd_zbc.c ++++ b/drivers/scsi/sd_zbc.c +@@ -9,6 +9,8 @@ + */ + + #include ++#include ++#include + + #include + +@@ -50,7 +52,7 @@ static void sd_zbc_parse_report(struct scsi_disk *sdkp, u8 *buf, + /** + * sd_zbc_do_report_zones - Issue a REPORT ZONES scsi command. + * @sdkp: The target disk +- * @buf: Buffer to use for the reply ++ * @buf: vmalloc-ed buffer to use for the reply + * @buflen: the buffer size + * @lba: Start LBA of the report + * @partial: Do partial report +@@ -79,7 +81,6 @@ static int sd_zbc_do_report_zones(struct scsi_disk *sdkp, unsigned char *buf, + put_unaligned_be32(buflen, &cmd[10]); + if (partial) + cmd[14] = ZBC_REPORT_ZONE_PARTIAL; +- memset(buf, 0, buflen); + + result = scsi_execute_req(sdp, cmd, DMA_FROM_DEVICE, + buf, buflen, &sshdr, +@@ -103,6 +104,53 @@ static int sd_zbc_do_report_zones(struct scsi_disk *sdkp, unsigned char *buf, + return 0; + } + ++/* ++ * Maximum number of zones to get with one report zones command. ++ */ ++#define SD_ZBC_REPORT_MAX_ZONES 8192U ++ ++/** ++ * Allocate a buffer for report zones reply. ++ * @sdkp: The target disk ++ * @nr_zones: Maximum number of zones to report ++ * @buflen: Size of the buffer allocated ++ * ++ * Try to allocate a reply buffer for the number of requested zones. ++ * The size of the buffer allocated may be smaller than requested to ++ * satify the device constraint (max_hw_sectors, max_segments, etc). ++ * ++ * Return the address of the allocated buffer and update @buflen with ++ * the size of the allocated buffer. ++ */ ++static void *sd_zbc_alloc_report_buffer(struct scsi_disk *sdkp, ++ unsigned int nr_zones, size_t *buflen) ++{ ++ struct request_queue *q = sdkp->disk->queue; ++ size_t bufsize; ++ void *buf; ++ ++ /* ++ * Report zone buffer size should be at most 64B times the number of ++ * zones requested plus the 64B reply header, but should be at least ++ * SECTOR_SIZE for ATA devices. ++ * Make sure that this size does not exceed the hardware capabilities. ++ * Furthermore, since the report zone command cannot be split, make ++ * sure that the allocated buffer can always be mapped by limiting the ++ * number of pages allocated to the HBA max segments limit. ++ */ ++ nr_zones = min(nr_zones, SD_ZBC_REPORT_MAX_ZONES); ++ bufsize = roundup((nr_zones + 1) * 64, 512); ++ bufsize = min_t(size_t, bufsize, ++ queue_max_hw_sectors(q) << SECTOR_SHIFT); ++ bufsize = min_t(size_t, bufsize, queue_max_segments(q) << PAGE_SHIFT); ++ ++ buf = vzalloc(bufsize); ++ if (buf) ++ *buflen = bufsize; ++ ++ return buf; ++} ++ + /** + * sd_zbc_report_zones - Disk report zones operation. + * @disk: The target disk +@@ -118,30 +166,23 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector, + gfp_t gfp_mask) + { + struct scsi_disk *sdkp = scsi_disk(disk); +- unsigned int i, buflen, nrz = *nr_zones; ++ unsigned int i, nrz = *nr_zones; + unsigned char *buf; +- size_t offset = 0; ++ size_t buflen = 0, offset = 0; + int ret = 0; + + if (!sd_is_zoned(sdkp)) + /* Not a zoned device */ + return -EOPNOTSUPP; + +- /* +- * Get a reply buffer for the number of requested zones plus a header, +- * without exceeding the device maximum command size. For ATA disks, +- * buffers must be aligned to 512B. +- */ +- buflen = min(queue_max_hw_sectors(disk->queue) << 9, +- roundup((nrz + 1) * 64, 512)); +- buf = kmalloc(buflen, gfp_mask); ++ buf = sd_zbc_alloc_report_buffer(sdkp, nrz, &buflen); + if (!buf) + return -ENOMEM; + + ret = sd_zbc_do_report_zones(sdkp, buf, buflen, + sectors_to_logical(sdkp->device, sector), true); + if (ret) +- goto out_free_buf; ++ goto out; + + nrz = min(nrz, get_unaligned_be32(&buf[0]) / 64); + for (i = 0; i < nrz; i++) { +@@ -152,8 +193,8 @@ int sd_zbc_report_zones(struct gendisk *disk, sector_t sector, + + *nr_zones = nrz; + +-out_free_buf: +- kfree(buf); ++out: ++ kvfree(buf); + + return ret; + } +@@ -287,8 +328,6 @@ static int sd_zbc_check_zoned_characteristics(struct scsi_disk *sdkp, + return 0; + } + +-#define SD_ZBC_BUF_SIZE 131072U +- + /** + * sd_zbc_check_zones - Check the device capacity and zone sizes + * @sdkp: Target disk +@@ -304,22 +343,28 @@ static int sd_zbc_check_zoned_characteristics(struct scsi_disk *sdkp, + */ + static int sd_zbc_check_zones(struct scsi_disk *sdkp, u32 *zblocks) + { ++ size_t bufsize, buflen; ++ unsigned int noio_flag; + u64 zone_blocks = 0; + sector_t max_lba, block = 0; + unsigned char *buf; + unsigned char *rec; +- unsigned int buf_len; +- unsigned int list_length; + int ret; + u8 same; + ++ /* Do all memory allocations as if GFP_NOIO was specified */ ++ noio_flag = memalloc_noio_save(); ++ + /* Get a buffer */ +- buf = kmalloc(SD_ZBC_BUF_SIZE, GFP_KERNEL); +- if (!buf) +- return -ENOMEM; ++ buf = sd_zbc_alloc_report_buffer(sdkp, SD_ZBC_REPORT_MAX_ZONES, ++ &bufsize); ++ if (!buf) { ++ ret = -ENOMEM; ++ goto out; ++ } + + /* Do a report zone to get max_lba and the same field */ +- ret = sd_zbc_do_report_zones(sdkp, buf, SD_ZBC_BUF_SIZE, 0, false); ++ ret = sd_zbc_do_report_zones(sdkp, buf, bufsize, 0, false); + if (ret) + goto out_free; + +@@ -355,12 +400,12 @@ static int sd_zbc_check_zones(struct scsi_disk *sdkp, u32 *zblocks) + do { + + /* Parse REPORT ZONES header */ +- list_length = get_unaligned_be32(&buf[0]) + 64; ++ buflen = min_t(size_t, get_unaligned_be32(&buf[0]) + 64, ++ bufsize); + rec = buf + 64; +- buf_len = min(list_length, SD_ZBC_BUF_SIZE); + + /* Parse zone descriptors */ +- while (rec < buf + buf_len) { ++ while (rec < buf + buflen) { + u64 this_zone_blocks = get_unaligned_be64(&rec[8]); + + if (zone_blocks == 0) { +@@ -376,8 +421,8 @@ static int sd_zbc_check_zones(struct scsi_disk *sdkp, u32 *zblocks) + } + + if (block < sdkp->capacity) { +- ret = sd_zbc_do_report_zones(sdkp, buf, SD_ZBC_BUF_SIZE, +- block, true); ++ ret = sd_zbc_do_report_zones(sdkp, buf, bufsize, block, ++ true); + if (ret) + goto out_free; + } +@@ -408,7 +453,8 @@ static int sd_zbc_check_zones(struct scsi_disk *sdkp, u32 *zblocks) + } + + out_free: +- kfree(buf); ++ memalloc_noio_restore(noio_flag); ++ kvfree(buf); + + return ret; + } +@@ -417,7 +463,7 @@ int sd_zbc_read_zones(struct scsi_disk *sdkp, unsigned char *buf) + { + struct gendisk *disk = sdkp->disk; + unsigned int nr_zones; +- u32 zone_blocks; ++ u32 zone_blocks = 0; + int ret; + + if (!sd_is_zoned(sdkp)) +diff --git a/drivers/scsi/snic/snic_scsi.c b/drivers/scsi/snic/snic_scsi.c +index b3650c989ed4..7ed1fb285754 100644 +--- a/drivers/scsi/snic/snic_scsi.c ++++ b/drivers/scsi/snic/snic_scsi.c +@@ -2353,7 +2353,7 @@ snic_reset(struct Scsi_Host *shost, struct scsi_cmnd *sc) + + /* Wait for all the IOs that are entered in Qcmd */ + while (atomic_read(&snic->ios_inflight)) +- schedule_timeout(msecs_to_jiffies(1)); ++ schedule_msec_hrtimeout((1)); + + ret = snic_issue_hba_reset(snic, sc); + if (ret) { +diff --git a/drivers/scsi/vhba/Kconfig b/drivers/scsi/vhba/Kconfig +new file mode 100644 +index 000000000000..7ccb7d8dc25c +--- /dev/null ++++ b/drivers/scsi/vhba/Kconfig +@@ -0,0 +1,9 @@ ++config VHBA ++ tristate "Virtual (SCSI) Host Bus Adapter" ++ depends on SCSI ++ ---help--- ++ This is the in-kernel part of CDEmu, a CD/DVD-ROM device ++ emulator. ++ ++ This driver can also be built as a module. If so, the module ++ will be called vhba. +diff --git a/drivers/scsi/vhba/Makefile b/drivers/scsi/vhba/Makefile +new file mode 100644 +index 000000000000..736824872fe5 +--- /dev/null ++++ b/drivers/scsi/vhba/Makefile +@@ -0,0 +1,4 @@ ++VHBA_VERSION := 20190410 ++ ++obj-$(CONFIG_VHBA) += vhba.o ++ccflags-y := -DVHBA_VERSION=\"$(VHBA_VERSION)\" -Werror +diff --git a/drivers/scsi/vhba/vhba.c b/drivers/scsi/vhba/vhba.c +new file mode 100644 +index 000000000000..0ad712138c87 +--- /dev/null ++++ b/drivers/scsi/vhba/vhba.c +@@ -0,0 +1,1083 @@ ++/* ++ * vhba.c ++ * ++ * Copyright (C) 2007-2012 Chia-I Wu ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ */ ++ ++#include ++ ++#include ++#include ++#include ++#include ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) ++#include ++#else ++#include ++#endif ++#include ++#include ++#include ++#include ++#ifdef CONFIG_COMPAT ++#include ++#endif ++#include ++#include ++#include ++#include ++#include ++ ++/* scatterlist.page_link and sg_page() were introduced in 2.6.24 */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) ++#define USE_SG_PAGE ++#include ++#endif ++ ++MODULE_AUTHOR("Chia-I Wu"); ++MODULE_VERSION(VHBA_VERSION); ++MODULE_DESCRIPTION("Virtual SCSI HBA"); ++MODULE_LICENSE("GPL"); ++ ++#ifdef DEBUG ++#define DPRINTK(fmt, args...) printk(KERN_DEBUG "%s: " fmt, __FUNCTION__, ## args) ++#else ++#define DPRINTK(fmt, args...) ++#endif ++ ++/* scmd_dbg was introduced in 3.15 */ ++#ifndef scmd_dbg ++#define scmd_dbg(scmd, fmt, a...) \ ++ dev_dbg(&(scmd)->device->sdev_gendev, fmt, ##a) ++#endif ++ ++#ifndef scmd_warn ++#define scmd_warn(scmd, fmt, a...) \ ++ dev_warn(&(scmd)->device->sdev_gendev, fmt, ##a) ++#endif ++ ++#define VHBA_MAX_SECTORS_PER_IO 256 ++#define VHBA_MAX_ID 32 ++#define VHBA_CAN_QUEUE 32 ++#define VHBA_INVALID_ID VHBA_MAX_ID ++#define VHBA_KBUF_SIZE PAGE_SIZE ++ ++#define DATA_TO_DEVICE(dir) ((dir) == DMA_TO_DEVICE || (dir) == DMA_BIDIRECTIONAL) ++#define DATA_FROM_DEVICE(dir) ((dir) == DMA_FROM_DEVICE || (dir) == DMA_BIDIRECTIONAL) ++ ++ ++/* SCSI macros were introduced in 2.6.23 */ ++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 23) ++#define scsi_sg_count(cmd) ((cmd)->use_sg) ++#define scsi_sglist(cmd) ((cmd)->request_buffer) ++#define scsi_bufflen(cmd) ((cmd)->request_bufflen) ++#define scsi_set_resid(cmd, to_read) {(cmd)->resid = (to_read);} ++#endif ++ ++/* 1-argument form of k[un]map_atomic was introduced in 2.6.37-rc1; ++ 2-argument form was deprecated in 3.4-rc1 */ ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 37) ++#define vhba_kmap_atomic kmap_atomic ++#define vhba_kunmap_atomic kunmap_atomic ++#else ++#define vhba_kmap_atomic(page) kmap_atomic(page, KM_USER0) ++#define vhba_kunmap_atomic(page) kunmap_atomic(page, KM_USER0) ++#endif ++ ++ ++enum vhba_req_state { ++ VHBA_REQ_FREE, ++ VHBA_REQ_PENDING, ++ VHBA_REQ_READING, ++ VHBA_REQ_SENT, ++ VHBA_REQ_WRITING, ++}; ++ ++struct vhba_command { ++ struct scsi_cmnd *cmd; ++ unsigned long serial_number; ++ int status; ++ struct list_head entry; ++}; ++ ++struct vhba_device { ++ uint id; ++ spinlock_t cmd_lock; ++ struct list_head cmd_list; ++ wait_queue_head_t cmd_wq; ++ atomic_t refcnt; ++ ++ unsigned char *kbuf; ++ size_t kbuf_size; ++ ++ unsigned long cmd_count; ++}; ++ ++struct vhba_host { ++ struct Scsi_Host *shost; ++ spinlock_t cmd_lock; ++ int cmd_next; ++ struct vhba_command commands[VHBA_CAN_QUEUE]; ++ spinlock_t dev_lock; ++ struct vhba_device *devices[VHBA_MAX_ID]; ++ int num_devices; ++ DECLARE_BITMAP(chgmap, VHBA_MAX_ID); ++ int chgtype[VHBA_MAX_ID]; ++ struct work_struct scan_devices; ++}; ++ ++#define MAX_COMMAND_SIZE 16 ++ ++struct vhba_request { ++ __u32 tag; ++ __u32 lun; ++ __u8 cdb[MAX_COMMAND_SIZE]; ++ __u8 cdb_len; ++ __u32 data_len; ++}; ++ ++struct vhba_response { ++ __u32 tag; ++ __u32 status; ++ __u32 data_len; ++}; ++ ++static struct vhba_command *vhba_alloc_command (void); ++static void vhba_free_command (struct vhba_command *vcmd); ++ ++static struct platform_device vhba_platform_device; ++ ++static struct vhba_device *vhba_device_alloc (void) ++{ ++ struct vhba_device *vdev; ++ ++ vdev = kzalloc(sizeof(struct vhba_device), GFP_KERNEL); ++ if (!vdev) { ++ return NULL; ++ } ++ ++ vdev->id = VHBA_INVALID_ID; ++ spin_lock_init(&vdev->cmd_lock); ++ INIT_LIST_HEAD(&vdev->cmd_list); ++ init_waitqueue_head(&vdev->cmd_wq); ++ atomic_set(&vdev->refcnt, 1); ++ ++ vdev->kbuf = NULL; ++ vdev->kbuf_size = 0; ++ ++ vdev->cmd_count = 0; ++ ++ return vdev; ++} ++ ++static void vhba_device_put (struct vhba_device *vdev) ++{ ++ if (atomic_dec_and_test(&vdev->refcnt)) { ++ kfree(vdev); ++ } ++} ++ ++static struct vhba_device *vhba_device_get (struct vhba_device *vdev) ++{ ++ atomic_inc(&vdev->refcnt); ++ ++ return vdev; ++} ++ ++static int vhba_device_queue (struct vhba_device *vdev, struct scsi_cmnd *cmd) ++{ ++ struct vhba_command *vcmd; ++ unsigned long flags; ++ ++ vcmd = vhba_alloc_command(); ++ if (!vcmd) { ++ return SCSI_MLQUEUE_HOST_BUSY; ++ } ++ ++ vcmd->cmd = cmd; ++ ++ spin_lock_irqsave(&vdev->cmd_lock, flags); ++ vcmd->serial_number = vdev->cmd_count++; ++ list_add_tail(&vcmd->entry, &vdev->cmd_list); ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ ++ wake_up_interruptible(&vdev->cmd_wq); ++ ++ return 0; ++} ++ ++static int vhba_device_dequeue (struct vhba_device *vdev, struct scsi_cmnd *cmd) ++{ ++ struct vhba_command *vcmd; ++ int retval; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&vdev->cmd_lock, flags); ++ list_for_each_entry(vcmd, &vdev->cmd_list, entry) { ++ if (vcmd->cmd == cmd) { ++ list_del_init(&vcmd->entry); ++ break; ++ } ++ } ++ ++ /* command not found */ ++ if (&vcmd->entry == &vdev->cmd_list) { ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ return SUCCESS; ++ } ++ ++ while (vcmd->status == VHBA_REQ_READING || vcmd->status == VHBA_REQ_WRITING) { ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ scmd_dbg(cmd, "wait for I/O before aborting\n"); ++ schedule_timeout(1); ++ spin_lock_irqsave(&vdev->cmd_lock, flags); ++ } ++ ++ retval = (vcmd->status == VHBA_REQ_SENT) ? FAILED : SUCCESS; ++ ++ vhba_free_command(vcmd); ++ ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ ++ return retval; ++} ++ ++static inline void vhba_scan_devices_add (struct vhba_host *vhost, int id) ++{ ++ struct scsi_device *sdev; ++ ++ sdev = scsi_device_lookup(vhost->shost, 0, id, 0); ++ if (!sdev) { ++ scsi_add_device(vhost->shost, 0, id, 0); ++ } else { ++ dev_warn(&vhost->shost->shost_gendev, "tried to add an already-existing device 0:%d:0!\n", id); ++ scsi_device_put(sdev); ++ } ++} ++ ++static inline void vhba_scan_devices_remove (struct vhba_host *vhost, int id) ++{ ++ struct scsi_device *sdev; ++ ++ sdev = scsi_device_lookup(vhost->shost, 0, id, 0); ++ if (sdev) { ++ scsi_remove_device(sdev); ++ scsi_device_put(sdev); ++ } else { ++ dev_warn(&vhost->shost->shost_gendev, "tried to remove non-existing device 0:%d:0!\n", id); ++ } ++} ++ ++static void vhba_scan_devices (struct work_struct *work) ++{ ++ struct vhba_host *vhost = container_of(work, struct vhba_host, scan_devices); ++ unsigned long flags; ++ int id, change, exists; ++ ++ while (1) { ++ spin_lock_irqsave(&vhost->dev_lock, flags); ++ ++ id = find_first_bit(vhost->chgmap, vhost->shost->max_id); ++ if (id >= vhost->shost->max_id) { ++ spin_unlock_irqrestore(&vhost->dev_lock, flags); ++ break; ++ } ++ change = vhost->chgtype[id]; ++ exists = vhost->devices[id] != NULL; ++ ++ vhost->chgtype[id] = 0; ++ clear_bit(id, vhost->chgmap); ++ ++ spin_unlock_irqrestore(&vhost->dev_lock, flags); ++ ++ if (change < 0) { ++ dev_dbg(&vhost->shost->shost_gendev, "trying to remove target 0:%d:0\n", id); ++ vhba_scan_devices_remove(vhost, id); ++ } else if (change > 0) { ++ dev_dbg(&vhost->shost->shost_gendev, "trying to add target 0:%d:0\n", id); ++ vhba_scan_devices_add(vhost, id); ++ } else { ++ /* quick sequence of add/remove or remove/add; we determine ++ which one it was by checking if device structure exists */ ++ if (exists) { ++ /* remove followed by add: remove and (re)add */ ++ dev_dbg(&vhost->shost->shost_gendev, "trying to (re)add target 0:%d:0\n", id); ++ vhba_scan_devices_remove(vhost, id); ++ vhba_scan_devices_add(vhost, id); ++ } else { ++ /* add followed by remove: no-op */ ++ dev_dbg(&vhost->shost->shost_gendev, "no-op for target 0:%d:0\n", id); ++ } ++ } ++ } ++} ++ ++static int vhba_add_device (struct vhba_device *vdev) ++{ ++ struct vhba_host *vhost; ++ int i; ++ unsigned long flags; ++ ++ vhost = platform_get_drvdata(&vhba_platform_device); ++ ++ vhba_device_get(vdev); ++ ++ spin_lock_irqsave(&vhost->dev_lock, flags); ++ if (vhost->num_devices >= vhost->shost->max_id) { ++ spin_unlock_irqrestore(&vhost->dev_lock, flags); ++ vhba_device_put(vdev); ++ return -EBUSY; ++ } ++ ++ for (i = 0; i < vhost->shost->max_id; i++) { ++ if (vhost->devices[i] == NULL) { ++ vdev->id = i; ++ vhost->devices[i] = vdev; ++ vhost->num_devices++; ++ set_bit(vdev->id, vhost->chgmap); ++ vhost->chgtype[vdev->id]++; ++ break; ++ } ++ } ++ spin_unlock_irqrestore(&vhost->dev_lock, flags); ++ ++ schedule_work(&vhost->scan_devices); ++ ++ return 0; ++} ++ ++static int vhba_remove_device (struct vhba_device *vdev) ++{ ++ struct vhba_host *vhost; ++ unsigned long flags; ++ ++ vhost = platform_get_drvdata(&vhba_platform_device); ++ ++ spin_lock_irqsave(&vhost->dev_lock, flags); ++ set_bit(vdev->id, vhost->chgmap); ++ vhost->chgtype[vdev->id]--; ++ vhost->devices[vdev->id] = NULL; ++ vhost->num_devices--; ++ vdev->id = VHBA_INVALID_ID; ++ spin_unlock_irqrestore(&vhost->dev_lock, flags); ++ ++ vhba_device_put(vdev); ++ ++ schedule_work(&vhost->scan_devices); ++ ++ return 0; ++} ++ ++static struct vhba_device *vhba_lookup_device (int id) ++{ ++ struct vhba_host *vhost; ++ struct vhba_device *vdev = NULL; ++ unsigned long flags; ++ ++ vhost = platform_get_drvdata(&vhba_platform_device); ++ ++ if (likely(id < vhost->shost->max_id)) { ++ spin_lock_irqsave(&vhost->dev_lock, flags); ++ vdev = vhost->devices[id]; ++ if (vdev) { ++ vdev = vhba_device_get(vdev); ++ } ++ ++ spin_unlock_irqrestore(&vhost->dev_lock, flags); ++ } ++ ++ return vdev; ++} ++ ++static struct vhba_command *vhba_alloc_command (void) ++{ ++ struct vhba_host *vhost; ++ struct vhba_command *vcmd; ++ unsigned long flags; ++ int i; ++ ++ vhost = platform_get_drvdata(&vhba_platform_device); ++ ++ spin_lock_irqsave(&vhost->cmd_lock, flags); ++ ++ vcmd = vhost->commands + vhost->cmd_next++; ++ if (vcmd->status != VHBA_REQ_FREE) { ++ for (i = 0; i < vhost->shost->can_queue; i++) { ++ vcmd = vhost->commands + i; ++ ++ if (vcmd->status == VHBA_REQ_FREE) { ++ vhost->cmd_next = i + 1; ++ break; ++ } ++ } ++ ++ if (i == vhost->shost->can_queue) { ++ vcmd = NULL; ++ } ++ } ++ ++ if (vcmd) { ++ vcmd->status = VHBA_REQ_PENDING; ++ } ++ ++ vhost->cmd_next %= vhost->shost->can_queue; ++ ++ spin_unlock_irqrestore(&vhost->cmd_lock, flags); ++ ++ return vcmd; ++} ++ ++static void vhba_free_command (struct vhba_command *vcmd) ++{ ++ struct vhba_host *vhost; ++ unsigned long flags; ++ ++ vhost = platform_get_drvdata(&vhba_platform_device); ++ ++ spin_lock_irqsave(&vhost->cmd_lock, flags); ++ vcmd->status = VHBA_REQ_FREE; ++ spin_unlock_irqrestore(&vhost->cmd_lock, flags); ++} ++ ++static int vhba_queuecommand_lck (struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *)) ++{ ++ struct vhba_device *vdev; ++ int retval; ++ ++ scmd_dbg(cmd, "queue %p\n", cmd); ++ ++ vdev = vhba_lookup_device(cmd->device->id); ++ if (!vdev) { ++ scmd_dbg(cmd, "no such device\n"); ++ ++ cmd->result = DID_NO_CONNECT << 16; ++ done(cmd); ++ ++ return 0; ++ } ++ ++ cmd->scsi_done = done; ++ retval = vhba_device_queue(vdev, cmd); ++ ++ vhba_device_put(vdev); ++ ++ return retval; ++} ++ ++#ifdef DEF_SCSI_QCMD ++DEF_SCSI_QCMD(vhba_queuecommand) ++#else ++#define vhba_queuecommand vhba_queuecommand_lck ++#endif ++ ++static int vhba_abort (struct scsi_cmnd *cmd) ++{ ++ struct vhba_device *vdev; ++ int retval = SUCCESS; ++ ++ scmd_warn(cmd, "abort %p\n", cmd); ++ ++ vdev = vhba_lookup_device(cmd->device->id); ++ if (vdev) { ++ retval = vhba_device_dequeue(vdev, cmd); ++ vhba_device_put(vdev); ++ } else { ++ cmd->result = DID_NO_CONNECT << 16; ++ } ++ ++ return retval; ++} ++ ++static struct scsi_host_template vhba_template = { ++ .module = THIS_MODULE, ++ .name = "vhba", ++ .proc_name = "vhba", ++ .queuecommand = vhba_queuecommand, ++ .eh_abort_handler = vhba_abort, ++ .can_queue = VHBA_CAN_QUEUE, ++ .this_id = -1, ++ .cmd_per_lun = 1, ++ .max_sectors = VHBA_MAX_SECTORS_PER_IO, ++ .sg_tablesize = 256, ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0) ++ .max_segment_size = VHBA_KBUF_SIZE, ++#endif ++}; ++ ++static ssize_t do_request (struct vhba_device *vdev, unsigned long cmd_serial_number, struct scsi_cmnd *cmd, char __user *buf, size_t buf_len) ++{ ++ struct vhba_request vreq; ++ ssize_t ret; ++ ++ scmd_dbg(cmd, "request %lu (%p), cdb 0x%x, bufflen %d, use_sg %d\n", ++ cmd_serial_number, cmd, cmd->cmnd[0], scsi_bufflen(cmd), scsi_sg_count(cmd)); ++ ++ ret = sizeof(vreq); ++ if (DATA_TO_DEVICE(cmd->sc_data_direction)) { ++ ret += scsi_bufflen(cmd); ++ } ++ ++ if (ret > buf_len) { ++ scmd_warn(cmd, "buffer too small (%zd < %zd) for a request\n", buf_len, ret); ++ return -EIO; ++ } ++ ++ vreq.tag = cmd_serial_number; ++ vreq.lun = cmd->device->lun; ++ memcpy(vreq.cdb, cmd->cmnd, MAX_COMMAND_SIZE); ++ vreq.cdb_len = cmd->cmd_len; ++ vreq.data_len = scsi_bufflen(cmd); ++ ++ if (copy_to_user(buf, &vreq, sizeof(vreq))) { ++ return -EFAULT; ++ } ++ ++ if (DATA_TO_DEVICE(cmd->sc_data_direction) && vreq.data_len) { ++ buf += sizeof(vreq); ++ ++ if (scsi_sg_count(cmd)) { ++ unsigned char *kaddr, *uaddr; ++ struct scatterlist *sg = scsi_sglist(cmd); ++ int i; ++ ++ uaddr = (unsigned char *) buf; ++ ++ for (i = 0; i < scsi_sg_count(cmd); i++) { ++ size_t len = sg[i].length; ++ ++ if (len > vdev->kbuf_size) { ++ scmd_warn(cmd, "segment size (%zu) exceeds kbuf size (%zu)!", len, vdev->kbuf_size); ++ len = vdev->kbuf_size; ++ } ++ ++#ifdef USE_SG_PAGE ++ kaddr = vhba_kmap_atomic(sg_page(&sg[i])); ++#else ++ kaddr = vhba_kmap_atomic(sg[i].page); ++#endif ++ memcpy(vdev->kbuf, kaddr + sg[i].offset, len); ++ vhba_kunmap_atomic(kaddr); ++ ++ if (copy_to_user(uaddr, vdev->kbuf, len)) { ++ return -EFAULT; ++ } ++ uaddr += len; ++ } ++ } else { ++ if (copy_to_user(buf, scsi_sglist(cmd), vreq.data_len)) { ++ return -EFAULT; ++ } ++ } ++ } ++ ++ return ret; ++} ++ ++static ssize_t do_response (struct vhba_device *vdev, unsigned long cmd_serial_number, struct scsi_cmnd *cmd, const char __user *buf, size_t buf_len, struct vhba_response *res) ++{ ++ ssize_t ret = 0; ++ ++ scmd_dbg(cmd, "response %lu (%p), status %x, data len %d, use_sg %d\n", ++ cmd_serial_number, cmd, res->status, res->data_len, scsi_sg_count(cmd)); ++ ++ if (res->status) { ++ unsigned char sense_stack[SCSI_SENSE_BUFFERSIZE]; ++ ++ if (res->data_len > SCSI_SENSE_BUFFERSIZE) { ++ scmd_warn(cmd, "truncate sense (%d < %d)", SCSI_SENSE_BUFFERSIZE, res->data_len); ++ res->data_len = SCSI_SENSE_BUFFERSIZE; ++ } ++ ++ /* Copy via temporary buffer on stack in order to avoid problems ++ with PAX on grsecurity-enabled kernels */ ++ if (copy_from_user(sense_stack, buf, res->data_len)) { ++ return -EFAULT; ++ } ++ memcpy(cmd->sense_buffer, sense_stack, res->data_len); ++ ++ cmd->result = res->status; ++ ++ ret += res->data_len; ++ } else if (DATA_FROM_DEVICE(cmd->sc_data_direction) && scsi_bufflen(cmd)) { ++ size_t to_read; ++ ++ if (res->data_len > scsi_bufflen(cmd)) { ++ scmd_warn(cmd, "truncate data (%d < %d)\n", scsi_bufflen(cmd), res->data_len); ++ res->data_len = scsi_bufflen(cmd); ++ } ++ ++ to_read = res->data_len; ++ ++ if (scsi_sg_count(cmd)) { ++ unsigned char *kaddr, *uaddr; ++ struct scatterlist *sg = scsi_sglist(cmd); ++ int i; ++ ++ uaddr = (unsigned char *)buf; ++ ++ for (i = 0; i < scsi_sg_count(cmd); i++) { ++ size_t len = (sg[i].length < to_read) ? sg[i].length : to_read; ++ ++ if (len > vdev->kbuf_size) { ++ scmd_warn(cmd, "segment size (%zu) exceeds kbuf size (%zu)!", len, vdev->kbuf_size); ++ len = vdev->kbuf_size; ++ } ++ ++ if (copy_from_user(vdev->kbuf, uaddr, len)) { ++ return -EFAULT; ++ } ++ uaddr += len; ++ ++#ifdef USE_SG_PAGE ++ kaddr = vhba_kmap_atomic(sg_page(&sg[i])); ++#else ++ kaddr = vhba_kmap_atomic(sg[i].page); ++#endif ++ memcpy(kaddr + sg[i].offset, vdev->kbuf, len); ++ vhba_kunmap_atomic(kaddr); ++ ++ to_read -= len; ++ if (to_read == 0) { ++ break; ++ } ++ } ++ } else { ++ if (copy_from_user(scsi_sglist(cmd), buf, res->data_len)) { ++ return -EFAULT; ++ } ++ ++ to_read -= res->data_len; ++ } ++ ++ scsi_set_resid(cmd, to_read); ++ ++ ret += res->data_len - to_read; ++ } ++ ++ return ret; ++} ++ ++static inline struct vhba_command *next_command (struct vhba_device *vdev) ++{ ++ struct vhba_command *vcmd; ++ ++ list_for_each_entry(vcmd, &vdev->cmd_list, entry) { ++ if (vcmd->status == VHBA_REQ_PENDING) { ++ break; ++ } ++ } ++ ++ if (&vcmd->entry == &vdev->cmd_list) { ++ vcmd = NULL; ++ } ++ ++ return vcmd; ++} ++ ++static inline struct vhba_command *match_command (struct vhba_device *vdev, u32 tag) ++{ ++ struct vhba_command *vcmd; ++ ++ list_for_each_entry(vcmd, &vdev->cmd_list, entry) { ++ if (vcmd->serial_number == tag) { ++ break; ++ } ++ } ++ ++ if (&vcmd->entry == &vdev->cmd_list) { ++ vcmd = NULL; ++ } ++ ++ return vcmd; ++} ++ ++static struct vhba_command *wait_command (struct vhba_device *vdev, unsigned long flags) ++{ ++ struct vhba_command *vcmd; ++ DEFINE_WAIT(wait); ++ ++ while (!(vcmd = next_command(vdev))) { ++ if (signal_pending(current)) { ++ break; ++ } ++ ++ prepare_to_wait(&vdev->cmd_wq, &wait, TASK_INTERRUPTIBLE); ++ ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ ++ schedule(); ++ ++ spin_lock_irqsave(&vdev->cmd_lock, flags); ++ } ++ ++ finish_wait(&vdev->cmd_wq, &wait); ++ if (vcmd) { ++ vcmd->status = VHBA_REQ_READING; ++ } ++ ++ return vcmd; ++} ++ ++static ssize_t vhba_ctl_read (struct file *file, char __user *buf, size_t buf_len, loff_t *offset) ++{ ++ struct vhba_device *vdev; ++ struct vhba_command *vcmd; ++ ssize_t ret; ++ unsigned long flags; ++ ++ vdev = file->private_data; ++ ++ /* Get next command */ ++ if (file->f_flags & O_NONBLOCK) { ++ /* Non-blocking variant */ ++ spin_lock_irqsave(&vdev->cmd_lock, flags); ++ vcmd = next_command(vdev); ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ ++ if (!vcmd) { ++ return -EWOULDBLOCK; ++ } ++ } else { ++ /* Blocking variant */ ++ spin_lock_irqsave(&vdev->cmd_lock, flags); ++ vcmd = wait_command(vdev, flags); ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ ++ if (!vcmd) { ++ return -ERESTARTSYS; ++ } ++ } ++ ++ ret = do_request(vdev, vcmd->serial_number, vcmd->cmd, buf, buf_len); ++ ++ spin_lock_irqsave(&vdev->cmd_lock, flags); ++ if (ret >= 0) { ++ vcmd->status = VHBA_REQ_SENT; ++ *offset += ret; ++ } else { ++ vcmd->status = VHBA_REQ_PENDING; ++ } ++ ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ ++ return ret; ++} ++ ++static ssize_t vhba_ctl_write (struct file *file, const char __user *buf, size_t buf_len, loff_t *offset) ++{ ++ struct vhba_device *vdev; ++ struct vhba_command *vcmd; ++ struct vhba_response res; ++ ssize_t ret; ++ unsigned long flags; ++ ++ if (buf_len < sizeof(res)) { ++ return -EIO; ++ } ++ ++ if (copy_from_user(&res, buf, sizeof(res))) { ++ return -EFAULT; ++ } ++ ++ vdev = file->private_data; ++ ++ spin_lock_irqsave(&vdev->cmd_lock, flags); ++ vcmd = match_command(vdev, res.tag); ++ if (!vcmd || vcmd->status != VHBA_REQ_SENT) { ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ DPRINTK("not expecting response\n"); ++ return -EIO; ++ } ++ vcmd->status = VHBA_REQ_WRITING; ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ ++ ret = do_response(vdev, vcmd->serial_number, vcmd->cmd, buf + sizeof(res), buf_len - sizeof(res), &res); ++ ++ spin_lock_irqsave(&vdev->cmd_lock, flags); ++ if (ret >= 0) { ++ vcmd->cmd->scsi_done(vcmd->cmd); ++ ret += sizeof(res); ++ ++ /* don't compete with vhba_device_dequeue */ ++ if (!list_empty(&vcmd->entry)) { ++ list_del_init(&vcmd->entry); ++ vhba_free_command(vcmd); ++ } ++ } else { ++ vcmd->status = VHBA_REQ_SENT; ++ } ++ ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ ++ return ret; ++} ++ ++static long vhba_ctl_ioctl (struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ struct vhba_device *vdev = file->private_data; ++ struct vhba_host *vhost; ++ struct scsi_device *sdev; ++ ++ switch (cmd) { ++ case 0xBEEF001: { ++ vhost = platform_get_drvdata(&vhba_platform_device); ++ sdev = scsi_device_lookup(vhost->shost, 0, vdev->id, 0); ++ ++ if (sdev) { ++ int id[4] = { ++ sdev->host->host_no, ++ sdev->channel, ++ sdev->id, ++ sdev->lun ++ }; ++ ++ scsi_device_put(sdev); ++ ++ if (copy_to_user((void *)arg, id, sizeof(id))) { ++ return -EFAULT; ++ } ++ ++ return 0; ++ } else { ++ return -ENODEV; ++ } ++ } ++ } ++ ++ return -ENOTTY; ++} ++ ++#ifdef CONFIG_COMPAT ++static long vhba_ctl_compat_ioctl (struct file *file, unsigned int cmd, unsigned long arg) ++{ ++ unsigned long compat_arg = (unsigned long)compat_ptr(arg); ++ return vhba_ctl_ioctl(file, cmd, compat_arg); ++} ++#endif ++ ++static unsigned int vhba_ctl_poll (struct file *file, poll_table *wait) ++{ ++ struct vhba_device *vdev = file->private_data; ++ unsigned int mask = 0; ++ unsigned long flags; ++ ++ poll_wait(file, &vdev->cmd_wq, wait); ++ ++ spin_lock_irqsave(&vdev->cmd_lock, flags); ++ if (next_command(vdev)) { ++ mask |= POLLIN | POLLRDNORM; ++ } ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ ++ return mask; ++} ++ ++static int vhba_ctl_open (struct inode *inode, struct file *file) ++{ ++ struct vhba_device *vdev; ++ int retval; ++ ++ DPRINTK("open\n"); ++ ++ /* check if vhba is probed */ ++ if (!platform_get_drvdata(&vhba_platform_device)) { ++ return -ENODEV; ++ } ++ ++ vdev = vhba_device_alloc(); ++ if (!vdev) { ++ return -ENOMEM; ++ } ++ ++ vdev->kbuf_size = VHBA_KBUF_SIZE; ++ vdev->kbuf = kmalloc(vdev->kbuf_size, GFP_KERNEL); ++ if (!vdev->kbuf) { ++ return -ENOMEM; ++ } ++ ++ if (!(retval = vhba_add_device(vdev))) { ++ file->private_data = vdev; ++ } ++ ++ vhba_device_put(vdev); ++ ++ return retval; ++} ++ ++static int vhba_ctl_release (struct inode *inode, struct file *file) ++{ ++ struct vhba_device *vdev; ++ struct vhba_command *vcmd; ++ unsigned long flags; ++ ++ DPRINTK("release\n"); ++ ++ vdev = file->private_data; ++ ++ vhba_device_get(vdev); ++ vhba_remove_device(vdev); ++ ++ spin_lock_irqsave(&vdev->cmd_lock, flags); ++ list_for_each_entry(vcmd, &vdev->cmd_list, entry) { ++ WARN_ON(vcmd->status == VHBA_REQ_READING || vcmd->status == VHBA_REQ_WRITING); ++ ++ scmd_warn(vcmd->cmd, "device released with command %lu (%p)\n", vcmd->serial_number, vcmd->cmd); ++ vcmd->cmd->result = DID_NO_CONNECT << 16; ++ vcmd->cmd->scsi_done(vcmd->cmd); ++ ++ vhba_free_command(vcmd); ++ } ++ INIT_LIST_HEAD(&vdev->cmd_list); ++ spin_unlock_irqrestore(&vdev->cmd_lock, flags); ++ ++ kfree(vdev->kbuf); ++ vdev->kbuf = NULL; ++ ++ vhba_device_put(vdev); ++ ++ return 0; ++} ++ ++static struct file_operations vhba_ctl_fops = { ++ .owner = THIS_MODULE, ++ .open = vhba_ctl_open, ++ .release = vhba_ctl_release, ++ .read = vhba_ctl_read, ++ .write = vhba_ctl_write, ++ .poll = vhba_ctl_poll, ++ .unlocked_ioctl = vhba_ctl_ioctl, ++#ifdef CONFIG_COMPAT ++ .compat_ioctl = vhba_ctl_compat_ioctl, ++#endif ++}; ++ ++static struct miscdevice vhba_miscdev = { ++ .minor = MISC_DYNAMIC_MINOR, ++ .name = "vhba_ctl", ++ .fops = &vhba_ctl_fops, ++}; ++ ++static int vhba_probe (struct platform_device *pdev) ++{ ++ struct Scsi_Host *shost; ++ struct vhba_host *vhost; ++ int i; ++ ++ shost = scsi_host_alloc(&vhba_template, sizeof(struct vhba_host)); ++ if (!shost) { ++ return -ENOMEM; ++ } ++ ++ shost->max_id = VHBA_MAX_ID; ++ /* we don't support lun > 0 */ ++ shost->max_lun = 1; ++ shost->max_cmd_len = MAX_COMMAND_SIZE; ++ ++ vhost = (struct vhba_host *)shost->hostdata; ++ memset(vhost, 0, sizeof(*vhost)); ++ ++ vhost->shost = shost; ++ vhost->num_devices = 0; ++ spin_lock_init(&vhost->dev_lock); ++ spin_lock_init(&vhost->cmd_lock); ++ INIT_WORK(&vhost->scan_devices, vhba_scan_devices); ++ vhost->cmd_next = 0; ++ for (i = 0; i < vhost->shost->can_queue; i++) { ++ vhost->commands[i].status = VHBA_REQ_FREE; ++ } ++ ++ platform_set_drvdata(pdev, vhost); ++ ++ if (scsi_add_host(shost, &pdev->dev)) { ++ scsi_host_put(shost); ++ return -ENOMEM; ++ } ++ ++ return 0; ++} ++ ++static int vhba_remove (struct platform_device *pdev) ++{ ++ struct vhba_host *vhost; ++ struct Scsi_Host *shost; ++ ++ vhost = platform_get_drvdata(pdev); ++ shost = vhost->shost; ++ ++ scsi_remove_host(shost); ++ scsi_host_put(shost); ++ ++ return 0; ++} ++ ++static void vhba_release (struct device * dev) ++{ ++ return; ++} ++ ++static struct platform_device vhba_platform_device = { ++ .name = "vhba", ++ .id = -1, ++ .dev = { ++ .release = vhba_release, ++ }, ++}; ++ ++static struct platform_driver vhba_platform_driver = { ++ .driver = { ++ .owner = THIS_MODULE, ++ .name = "vhba", ++ }, ++ .probe = vhba_probe, ++ .remove = vhba_remove, ++}; ++ ++static int __init vhba_init (void) ++{ ++ int ret; ++ ++ ret = platform_device_register(&vhba_platform_device); ++ if (ret < 0) { ++ return ret; ++ } ++ ++ ret = platform_driver_register(&vhba_platform_driver); ++ if (ret < 0) { ++ platform_device_unregister(&vhba_platform_device); ++ return ret; ++ } ++ ++ ret = misc_register(&vhba_miscdev); ++ if (ret < 0) { ++ platform_driver_unregister(&vhba_platform_driver); ++ platform_device_unregister(&vhba_platform_device); ++ return ret; ++ } ++ ++ return 0; ++} ++ ++static void __exit vhba_exit(void) ++{ ++ misc_deregister(&vhba_miscdev); ++ platform_driver_unregister(&vhba_platform_driver); ++ platform_device_unregister(&vhba_platform_device); ++} ++ ++module_init(vhba_init); ++module_exit(vhba_exit); ++ +diff --git a/drivers/soc/imx/soc-imx8.c b/drivers/soc/imx/soc-imx8.c +index fc6429f9170a..79a3d922a4a9 100644 +--- a/drivers/soc/imx/soc-imx8.c ++++ b/drivers/soc/imx/soc-imx8.c +@@ -73,7 +73,7 @@ static int __init imx8_soc_init(void) + + soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); + if (!soc_dev_attr) +- return -ENODEV; ++ return -ENOMEM; + + soc_dev_attr->family = "Freescale i.MX"; + +@@ -83,8 +83,10 @@ static int __init imx8_soc_init(void) + goto free_soc; + + id = of_match_node(imx8_soc_match, root); +- if (!id) ++ if (!id) { ++ ret = -ENODEV; + goto free_soc; ++ } + + of_node_put(root); + +@@ -96,20 +98,25 @@ static int __init imx8_soc_init(void) + } + + soc_dev_attr->revision = imx8_revision(soc_rev); +- if (!soc_dev_attr->revision) ++ if (!soc_dev_attr->revision) { ++ ret = -ENOMEM; + goto free_soc; ++ } + + soc_dev = soc_device_register(soc_dev_attr); +- if (IS_ERR(soc_dev)) ++ if (IS_ERR(soc_dev)) { ++ ret = PTR_ERR(soc_dev); + goto free_rev; ++ } + + return 0; + + free_rev: +- kfree(soc_dev_attr->revision); ++ if (strcmp(soc_dev_attr->revision, "unknown")) ++ kfree(soc_dev_attr->revision); + free_soc: + kfree(soc_dev_attr); + of_node_put(root); +- return -ENODEV; ++ return ret; + } + device_initcall(imx8_soc_init); +diff --git a/drivers/soc/qcom/rpmpd.c b/drivers/soc/qcom/rpmpd.c +index 005326050c23..235d01870dd8 100644 +--- a/drivers/soc/qcom/rpmpd.c ++++ b/drivers/soc/qcom/rpmpd.c +@@ -226,7 +226,7 @@ static int rpmpd_set_performance(struct generic_pm_domain *domain, + struct rpmpd *pd = domain_to_rpmpd(domain); + + if (state > MAX_RPMPD_STATE) +- goto out; ++ state = MAX_RPMPD_STATE; + + mutex_lock(&rpmpd_lock); + +diff --git a/drivers/spi/spi-bcm2835.c b/drivers/spi/spi-bcm2835.c +index 402c1efcd762..6435b8652159 100644 +--- a/drivers/spi/spi-bcm2835.c ++++ b/drivers/spi/spi-bcm2835.c +@@ -764,7 +764,8 @@ static int bcm2835_spi_transfer_one(struct spi_master *master, + bcm2835_wr(bs, BCM2835_SPI_CLK, cdiv); + + /* handle all the 3-wire mode */ +- if ((spi->mode & SPI_3WIRE) && (tfr->rx_buf)) ++ if (spi->mode & SPI_3WIRE && tfr->rx_buf && ++ tfr->rx_buf != master->dummy_rx) + cs |= BCM2835_SPI_CS_REN; + else + cs &= ~BCM2835_SPI_CS_REN; +diff --git a/drivers/spi/spi-rockchip.c b/drivers/spi/spi-rockchip.c +index 9b91188a85f9..2cc6d9951b52 100644 +--- a/drivers/spi/spi-rockchip.c ++++ b/drivers/spi/spi-rockchip.c +@@ -417,7 +417,7 @@ static int rockchip_spi_prepare_dma(struct rockchip_spi *rs, + .direction = DMA_MEM_TO_DEV, + .dst_addr = rs->dma_addr_tx, + .dst_addr_width = rs->n_bytes, +- .dst_maxburst = rs->fifo_len / 2, ++ .dst_maxburst = rs->fifo_len / 4, + }; + + dmaengine_slave_config(master->dma_tx, &txconf); +@@ -518,7 +518,7 @@ static void rockchip_spi_config(struct rockchip_spi *rs, + else + writel_relaxed(rs->fifo_len / 2 - 1, rs->regs + ROCKCHIP_SPI_RXFTLR); + +- writel_relaxed(rs->fifo_len / 2 - 1, rs->regs + ROCKCHIP_SPI_DMATDLR); ++ writel_relaxed(rs->fifo_len / 2, rs->regs + ROCKCHIP_SPI_DMATDLR); + writel_relaxed(0, rs->regs + ROCKCHIP_SPI_DMARDLR); + writel_relaxed(dmacr, rs->regs + ROCKCHIP_SPI_DMACR); + +diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c +index 5e4654032bfa..29916e446143 100644 +--- a/drivers/spi/spi.c ++++ b/drivers/spi/spi.c +@@ -2286,11 +2286,6 @@ int spi_register_controller(struct spi_controller *ctlr) + if (status) + return status; + +- /* even if it's just one always-selected device, there must +- * be at least one chipselect +- */ +- if (ctlr->num_chipselect == 0) +- return -EINVAL; + if (ctlr->bus_num >= 0) { + /* devices with a fixed bus num must check-in with the num */ + mutex_lock(&board_lock); +@@ -2361,6 +2356,13 @@ int spi_register_controller(struct spi_controller *ctlr) + } + } + ++ /* ++ * Even if it's just one always-selected device, there must ++ * be at least one chipselect. ++ */ ++ if (!ctlr->num_chipselect) ++ return -EINVAL; ++ + status = device_add(&ctlr->dev); + if (status < 0) { + /* free bus id */ +diff --git a/drivers/staging/android/ion/ion_page_pool.c b/drivers/staging/android/ion/ion_page_pool.c +index fd4995fb676e..f85ec5b16b65 100644 +--- a/drivers/staging/android/ion/ion_page_pool.c ++++ b/drivers/staging/android/ion/ion_page_pool.c +@@ -8,11 +8,14 @@ + #include + #include + #include ++#include + + #include "ion.h" + + static inline struct page *ion_page_pool_alloc_pages(struct ion_page_pool *pool) + { ++ if (fatal_signal_pending(current)) ++ return NULL; + return alloc_pages(pool->gfp_mask, pool->order); + } + +diff --git a/drivers/staging/comedi/drivers/amplc_pci230.c b/drivers/staging/comedi/drivers/amplc_pci230.c +index 65f60c2b702a..f7e673121864 100644 +--- a/drivers/staging/comedi/drivers/amplc_pci230.c ++++ b/drivers/staging/comedi/drivers/amplc_pci230.c +@@ -2330,7 +2330,8 @@ static irqreturn_t pci230_interrupt(int irq, void *d) + devpriv->intr_running = false; + spin_unlock_irqrestore(&devpriv->isr_spinlock, irqflags); + +- comedi_handle_events(dev, s_ao); ++ if (s_ao) ++ comedi_handle_events(dev, s_ao); + comedi_handle_events(dev, s_ai); + + return IRQ_HANDLED; +diff --git a/drivers/staging/comedi/drivers/dt282x.c b/drivers/staging/comedi/drivers/dt282x.c +index 3be927f1d3a9..e15e33ed94ae 100644 +--- a/drivers/staging/comedi/drivers/dt282x.c ++++ b/drivers/staging/comedi/drivers/dt282x.c +@@ -557,7 +557,8 @@ static irqreturn_t dt282x_interrupt(int irq, void *d) + } + #endif + comedi_handle_events(dev, s); +- comedi_handle_events(dev, s_ao); ++ if (s_ao) ++ comedi_handle_events(dev, s_ao); + + return IRQ_RETVAL(handled); + } +diff --git a/drivers/staging/comedi/drivers/ni_mio_common.c b/drivers/staging/comedi/drivers/ni_mio_common.c +index c175227009f1..a8b3611b1441 100644 +--- a/drivers/staging/comedi/drivers/ni_mio_common.c ++++ b/drivers/staging/comedi/drivers/ni_mio_common.c +@@ -4742,7 +4742,7 @@ static int cs5529_wait_for_idle(struct comedi_device *dev) + if ((status & NI67XX_CAL_STATUS_BUSY) == 0) + break; + set_current_state(TASK_INTERRUPTIBLE); +- if (schedule_timeout(1)) ++ if (schedule_min_hrtimeout()) + return -EIO; + } + if (i == timeout) { +diff --git a/drivers/staging/fbtft/fbtft-core.c b/drivers/staging/fbtft/fbtft-core.c +index 9b07badf4c6c..bc750250ccd6 100644 +--- a/drivers/staging/fbtft/fbtft-core.c ++++ b/drivers/staging/fbtft/fbtft-core.c +@@ -76,21 +76,18 @@ static int fbtft_request_one_gpio(struct fbtft_par *par, + struct gpio_desc **gpiop) + { + struct device *dev = par->info->device; +- struct device_node *node = dev->of_node; + int ret = 0; + +- if (of_find_property(node, name, NULL)) { +- *gpiop = devm_gpiod_get_index(dev, dev->driver->name, index, +- GPIOD_OUT_HIGH); +- if (IS_ERR(*gpiop)) { +- ret = PTR_ERR(*gpiop); +- dev_err(dev, +- "Failed to request %s GPIO:%d\n", name, ret); +- return ret; +- } +- fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' GPIO\n", +- __func__, name); ++ *gpiop = devm_gpiod_get_index_optional(dev, name, index, ++ GPIOD_OUT_HIGH); ++ if (IS_ERR(*gpiop)) { ++ ret = PTR_ERR(*gpiop); ++ dev_err(dev, ++ "Failed to request %s GPIO: %d\n", name, ret); ++ return ret; + } ++ fbtft_par_dbg(DEBUG_REQUEST_GPIOS, par, "%s: '%s' GPIO\n", ++ __func__, name); + + return ret; + } +@@ -103,34 +100,34 @@ static int fbtft_request_gpios_dt(struct fbtft_par *par) + if (!par->info->device->of_node) + return -EINVAL; + +- ret = fbtft_request_one_gpio(par, "reset-gpios", 0, &par->gpio.reset); ++ ret = fbtft_request_one_gpio(par, "reset", 0, &par->gpio.reset); + if (ret) + return ret; +- ret = fbtft_request_one_gpio(par, "dc-gpios", 0, &par->gpio.dc); ++ ret = fbtft_request_one_gpio(par, "dc", 0, &par->gpio.dc); + if (ret) + return ret; +- ret = fbtft_request_one_gpio(par, "rd-gpios", 0, &par->gpio.rd); ++ ret = fbtft_request_one_gpio(par, "rd", 0, &par->gpio.rd); + if (ret) + return ret; +- ret = fbtft_request_one_gpio(par, "wr-gpios", 0, &par->gpio.wr); ++ ret = fbtft_request_one_gpio(par, "wr", 0, &par->gpio.wr); + if (ret) + return ret; +- ret = fbtft_request_one_gpio(par, "cs-gpios", 0, &par->gpio.cs); ++ ret = fbtft_request_one_gpio(par, "cs", 0, &par->gpio.cs); + if (ret) + return ret; +- ret = fbtft_request_one_gpio(par, "latch-gpios", 0, &par->gpio.latch); ++ ret = fbtft_request_one_gpio(par, "latch", 0, &par->gpio.latch); + if (ret) + return ret; + for (i = 0; i < 16; i++) { +- ret = fbtft_request_one_gpio(par, "db-gpios", i, ++ ret = fbtft_request_one_gpio(par, "db", i, + &par->gpio.db[i]); + if (ret) + return ret; +- ret = fbtft_request_one_gpio(par, "led-gpios", i, ++ ret = fbtft_request_one_gpio(par, "led", i, + &par->gpio.led[i]); + if (ret) + return ret; +- ret = fbtft_request_one_gpio(par, "aux-gpios", i, ++ ret = fbtft_request_one_gpio(par, "aux", i, + &par->gpio.aux[i]); + if (ret) + return ret; +@@ -234,9 +231,9 @@ static void fbtft_reset(struct fbtft_par *par) + if (!par->gpio.reset) + return; + fbtft_par_dbg(DEBUG_RESET, par, "%s()\n", __func__); +- gpiod_set_value_cansleep(par->gpio.reset, 0); +- usleep_range(20, 40); + gpiod_set_value_cansleep(par->gpio.reset, 1); ++ usleep_range(20, 40); ++ gpiod_set_value_cansleep(par->gpio.reset, 0); + msleep(120); + } + +diff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c +index e3c3e427309a..f73edaf6ce87 100644 +--- a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c ++++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c +@@ -1086,6 +1086,7 @@ static int port_switchdev_event(struct notifier_block *unused, + dev_hold(dev); + break; + default: ++ kfree(switchdev_work); + return NOTIFY_DONE; + } + +diff --git a/drivers/staging/gasket/apex_driver.c b/drivers/staging/gasket/apex_driver.c +index 2be45ee9d061..464648ee2036 100644 +--- a/drivers/staging/gasket/apex_driver.c ++++ b/drivers/staging/gasket/apex_driver.c +@@ -532,7 +532,7 @@ static ssize_t sysfs_show(struct device *device, struct device_attribute *attr, + break; + case ATTR_KERNEL_HIB_SIMPLE_PAGE_TABLE_SIZE: + ret = scnprintf(buf, PAGE_SIZE, "%u\n", +- gasket_page_table_num_entries( ++ gasket_page_table_num_simple_entries( + gasket_dev->page_table[0])); + break; + case ATTR_KERNEL_HIB_NUM_ACTIVE_PAGES: +diff --git a/drivers/staging/kpc2000/TODO b/drivers/staging/kpc2000/TODO +index 8c7af29fefae..ed951acc829a 100644 +--- a/drivers/staging/kpc2000/TODO ++++ b/drivers/staging/kpc2000/TODO +@@ -1,7 +1,6 @@ + - the kpc_spi driver doesn't seem to let multiple transactions (to different instances of the core) happen in parallel... + - The kpc_i2c driver is a hot mess, it should probably be cleaned up a ton. It functions against current hardware though. + - pcard->card_num in kp2000_pcie_probe() is a global variable and needs atomic / locking / something better. +-- probe_core_uio() probably needs error handling + - the loop in kp2000_probe_cores() that uses probe_core_uio() also probably needs error handling + - would be nice if the AIO fileops in kpc_dma could be made to work + - probably want to add a CONFIG_ option to control compilation of the AIO functions +diff --git a/drivers/staging/kpc2000/kpc2000/cell_probe.c b/drivers/staging/kpc2000/kpc2000/cell_probe.c +index e0dba91e7fa8..d6b57f550876 100644 +--- a/drivers/staging/kpc2000/kpc2000/cell_probe.c ++++ b/drivers/staging/kpc2000/kpc2000/cell_probe.c +@@ -295,6 +295,7 @@ int probe_core_uio(unsigned int core_num, struct kp2000_device *pcard, char *na + kudev->dev = device_create(kpc_uio_class, &pcard->pdev->dev, MKDEV(0,0), kudev, "%s.%d.%d.%d", kudev->uioinfo.name, pcard->card_num, cte.type, kudev->core_num); + if (IS_ERR(kudev->dev)) { + dev_err(&pcard->pdev->dev, "probe_core_uio device_create failed!\n"); ++ kfree(kudev); + return -ENODEV; + } + dev_set_drvdata(kudev->dev, kudev); +@@ -302,6 +303,8 @@ int probe_core_uio(unsigned int core_num, struct kp2000_device *pcard, char *na + rv = uio_register_device(kudev->dev, &kudev->uioinfo); + if (rv){ + dev_err(&pcard->pdev->dev, "probe_core_uio failed uio_register_device: %d\n", rv); ++ put_device(kudev->dev); ++ kfree(kudev); + return rv; + } + +diff --git a/drivers/staging/kpc2000/kpc_spi/spi_driver.c b/drivers/staging/kpc2000/kpc_spi/spi_driver.c +index 86df16547a92..2f535022dc03 100644 +--- a/drivers/staging/kpc2000/kpc_spi/spi_driver.c ++++ b/drivers/staging/kpc2000/kpc_spi/spi_driver.c +@@ -333,7 +333,7 @@ kp_spi_transfer_one_message(struct spi_master *master, struct spi_message *m) + list_for_each_entry(transfer, &m->transfers, transfer_list) { + if (transfer->tx_buf == NULL && transfer->rx_buf == NULL && transfer->len) { + status = -EINVAL; +- break; ++ goto error; + } + + /* transfer */ +@@ -371,7 +371,7 @@ kp_spi_transfer_one_message(struct spi_master *master, struct spi_message *m) + + if (count != transfer->len) { + status = -EIO; +- break; ++ goto error; + } + } + +@@ -389,6 +389,10 @@ kp_spi_transfer_one_message(struct spi_master *master, struct spi_message *m) + /* done work */ + spi_finalize_current_message(master); + return 0; ++ ++ error: ++ m->status = status; ++ return status; + } + + static void +diff --git a/drivers/staging/media/davinci_vpfe/dm365_ipipe.c b/drivers/staging/media/davinci_vpfe/dm365_ipipe.c +index 30e2edc0cec5..b88855c7ffe8 100644 +--- a/drivers/staging/media/davinci_vpfe/dm365_ipipe.c ++++ b/drivers/staging/media/davinci_vpfe/dm365_ipipe.c +@@ -1251,10 +1251,10 @@ static int ipipe_s_config(struct v4l2_subdev *sd, struct vpfe_ipipe_config *cfg) + struct vpfe_ipipe_device *ipipe = v4l2_get_subdevdata(sd); + unsigned int i; + int rval = 0; ++ struct ipipe_module_params *params; + + for (i = 0; i < ARRAY_SIZE(ipipe_modules); i++) { + const struct ipipe_module_if *module_if; +- struct ipipe_module_params *params; + void *from, *to; + size_t size; + +@@ -1265,25 +1265,30 @@ static int ipipe_s_config(struct v4l2_subdev *sd, struct vpfe_ipipe_config *cfg) + from = *(void **)((void *)cfg + module_if->config_offset); + + params = kmalloc(sizeof(*params), GFP_KERNEL); ++ if (!params) ++ return -ENOMEM; + to = (void *)params + module_if->param_offset; + size = module_if->param_size; + + if (to && from && size) { + if (copy_from_user(to, (void __user *)from, size)) { + rval = -EFAULT; +- break; ++ goto error_free; + } + rval = module_if->set(ipipe, to); + if (rval) +- goto error; ++ goto error_free; + } else if (to && !from && size) { + rval = module_if->set(ipipe, NULL); + if (rval) +- goto error; ++ goto error_free; + } + kfree(params); + } +-error: ++ return rval; ++ ++error_free: ++ kfree(params); + return rval; + } + +diff --git a/drivers/staging/media/davinci_vpfe/vpfe_video.c b/drivers/staging/media/davinci_vpfe/vpfe_video.c +index 510202a3b091..84cca18e3e9d 100644 +--- a/drivers/staging/media/davinci_vpfe/vpfe_video.c ++++ b/drivers/staging/media/davinci_vpfe/vpfe_video.c +@@ -419,6 +419,9 @@ static int vpfe_open(struct file *file) + /* If decoder is not initialized. initialize it */ + if (!video->initialized && vpfe_update_pipe_state(video)) { + mutex_unlock(&video->lock); ++ v4l2_fh_del(&handle->vfh); ++ v4l2_fh_exit(&handle->vfh); ++ kfree(handle); + return -ENODEV; + } + /* Increment device users counter */ +diff --git a/drivers/staging/media/imx/imx7-mipi-csis.c b/drivers/staging/media/imx/imx7-mipi-csis.c +index 19455f425416..7d7bdfdd852a 100644 +--- a/drivers/staging/media/imx/imx7-mipi-csis.c ++++ b/drivers/staging/media/imx/imx7-mipi-csis.c +@@ -456,13 +456,9 @@ static void mipi_csis_set_params(struct csi_state *state) + MIPI_CSIS_CMN_CTRL_UPDATE_SHADOW_CTRL); + } + +-static void mipi_csis_clk_enable(struct csi_state *state) ++static int mipi_csis_clk_enable(struct csi_state *state) + { +- int ret; +- +- ret = clk_bulk_prepare_enable(state->num_clks, state->clks); +- if (ret < 0) +- dev_err(state->dev, "failed to enable clocks\n"); ++ return clk_bulk_prepare_enable(state->num_clks, state->clks); + } + + static void mipi_csis_clk_disable(struct csi_state *state) +@@ -973,7 +969,11 @@ static int mipi_csis_probe(struct platform_device *pdev) + if (ret < 0) + return ret; + +- mipi_csis_clk_enable(state); ++ ret = mipi_csis_clk_enable(state); ++ if (ret < 0) { ++ dev_err(state->dev, "failed to enable clocks: %d\n", ret); ++ return ret; ++ } + + ret = devm_request_irq(dev, state->irq, mipi_csis_irq_handler, + 0, dev_name(dev), state); +diff --git a/drivers/staging/mt7621-pci/pci-mt7621.c b/drivers/staging/mt7621-pci/pci-mt7621.c +index 03d919a94552..93763d40e3a1 100644 +--- a/drivers/staging/mt7621-pci/pci-mt7621.c ++++ b/drivers/staging/mt7621-pci/pci-mt7621.c +@@ -40,7 +40,7 @@ + /* MediaTek specific configuration registers */ + #define PCIE_FTS_NUM 0x70c + #define PCIE_FTS_NUM_MASK GENMASK(15, 8) +-#define PCIE_FTS_NUM_L0(x) ((x) & 0xff << 8) ++#define PCIE_FTS_NUM_L0(x) (((x) & 0xff) << 8) + + /* rt_sysc_membase relative registers */ + #define RALINK_PCIE_CLK_GEN 0x7c +diff --git a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c +index a7230c0c7b23..8f5a8ac1b010 100644 +--- a/drivers/staging/rtl8712/rtl871x_ioctl_linux.c ++++ b/drivers/staging/rtl8712/rtl871x_ioctl_linux.c +@@ -124,10 +124,91 @@ static inline void handle_group_key(struct ieee_param *param, + } + } + +-static noinline_for_stack char *translate_scan(struct _adapter *padapter, +- struct iw_request_info *info, +- struct wlan_network *pnetwork, +- char *start, char *stop) ++static noinline_for_stack char *translate_scan_wpa(struct iw_request_info *info, ++ struct wlan_network *pnetwork, ++ struct iw_event *iwe, ++ char *start, char *stop) ++{ ++ /* parsing WPA/WPA2 IE */ ++ u8 buf[MAX_WPA_IE_LEN]; ++ u8 wpa_ie[255], rsn_ie[255]; ++ u16 wpa_len = 0, rsn_len = 0; ++ int n, i; ++ ++ r8712_get_sec_ie(pnetwork->network.IEs, ++ pnetwork->network.IELength, rsn_ie, &rsn_len, ++ wpa_ie, &wpa_len); ++ if (wpa_len > 0) { ++ memset(buf, 0, MAX_WPA_IE_LEN); ++ n = sprintf(buf, "wpa_ie="); ++ for (i = 0; i < wpa_len; i++) { ++ n += snprintf(buf + n, MAX_WPA_IE_LEN - n, ++ "%02x", wpa_ie[i]); ++ if (n >= MAX_WPA_IE_LEN) ++ break; ++ } ++ memset(iwe, 0, sizeof(*iwe)); ++ iwe->cmd = IWEVCUSTOM; ++ iwe->u.data.length = (u16)strlen(buf); ++ start = iwe_stream_add_point(info, start, stop, ++ iwe, buf); ++ memset(iwe, 0, sizeof(*iwe)); ++ iwe->cmd = IWEVGENIE; ++ iwe->u.data.length = (u16)wpa_len; ++ start = iwe_stream_add_point(info, start, stop, ++ iwe, wpa_ie); ++ } ++ if (rsn_len > 0) { ++ memset(buf, 0, MAX_WPA_IE_LEN); ++ n = sprintf(buf, "rsn_ie="); ++ for (i = 0; i < rsn_len; i++) { ++ n += snprintf(buf + n, MAX_WPA_IE_LEN - n, ++ "%02x", rsn_ie[i]); ++ if (n >= MAX_WPA_IE_LEN) ++ break; ++ } ++ memset(iwe, 0, sizeof(*iwe)); ++ iwe->cmd = IWEVCUSTOM; ++ iwe->u.data.length = strlen(buf); ++ start = iwe_stream_add_point(info, start, stop, ++ iwe, buf); ++ memset(iwe, 0, sizeof(*iwe)); ++ iwe->cmd = IWEVGENIE; ++ iwe->u.data.length = rsn_len; ++ start = iwe_stream_add_point(info, start, stop, iwe, ++ rsn_ie); ++ } ++ ++ return start; ++} ++ ++static noinline_for_stack char *translate_scan_wps(struct iw_request_info *info, ++ struct wlan_network *pnetwork, ++ struct iw_event *iwe, ++ char *start, char *stop) ++{ ++ /* parsing WPS IE */ ++ u8 wps_ie[512]; ++ uint wps_ielen; ++ ++ if (r8712_get_wps_ie(pnetwork->network.IEs, ++ pnetwork->network.IELength, ++ wps_ie, &wps_ielen)) { ++ if (wps_ielen > 2) { ++ iwe->cmd = IWEVGENIE; ++ iwe->u.data.length = (u16)wps_ielen; ++ start = iwe_stream_add_point(info, start, stop, ++ iwe, wps_ie); ++ } ++ } ++ ++ return start; ++} ++ ++static char *translate_scan(struct _adapter *padapter, ++ struct iw_request_info *info, ++ struct wlan_network *pnetwork, ++ char *start, char *stop) + { + struct iw_event iwe; + struct ieee80211_ht_cap *pht_capie; +@@ -240,73 +321,11 @@ static noinline_for_stack char *translate_scan(struct _adapter *padapter, + /* Check if we added any event */ + if ((current_val - start) > iwe_stream_lcp_len(info)) + start = current_val; +- /* parsing WPA/WPA2 IE */ +- { +- u8 buf[MAX_WPA_IE_LEN]; +- u8 wpa_ie[255], rsn_ie[255]; +- u16 wpa_len = 0, rsn_len = 0; +- int n; +- +- r8712_get_sec_ie(pnetwork->network.IEs, +- pnetwork->network.IELength, rsn_ie, &rsn_len, +- wpa_ie, &wpa_len); +- if (wpa_len > 0) { +- memset(buf, 0, MAX_WPA_IE_LEN); +- n = sprintf(buf, "wpa_ie="); +- for (i = 0; i < wpa_len; i++) { +- n += snprintf(buf + n, MAX_WPA_IE_LEN - n, +- "%02x", wpa_ie[i]); +- if (n >= MAX_WPA_IE_LEN) +- break; +- } +- memset(&iwe, 0, sizeof(iwe)); +- iwe.cmd = IWEVCUSTOM; +- iwe.u.data.length = (u16)strlen(buf); +- start = iwe_stream_add_point(info, start, stop, +- &iwe, buf); +- memset(&iwe, 0, sizeof(iwe)); +- iwe.cmd = IWEVGENIE; +- iwe.u.data.length = (u16)wpa_len; +- start = iwe_stream_add_point(info, start, stop, +- &iwe, wpa_ie); +- } +- if (rsn_len > 0) { +- memset(buf, 0, MAX_WPA_IE_LEN); +- n = sprintf(buf, "rsn_ie="); +- for (i = 0; i < rsn_len; i++) { +- n += snprintf(buf + n, MAX_WPA_IE_LEN - n, +- "%02x", rsn_ie[i]); +- if (n >= MAX_WPA_IE_LEN) +- break; +- } +- memset(&iwe, 0, sizeof(iwe)); +- iwe.cmd = IWEVCUSTOM; +- iwe.u.data.length = strlen(buf); +- start = iwe_stream_add_point(info, start, stop, +- &iwe, buf); +- memset(&iwe, 0, sizeof(iwe)); +- iwe.cmd = IWEVGENIE; +- iwe.u.data.length = rsn_len; +- start = iwe_stream_add_point(info, start, stop, &iwe, +- rsn_ie); +- } +- } + +- { /* parsing WPS IE */ +- u8 wps_ie[512]; +- uint wps_ielen; ++ start = translate_scan_wpa(info, pnetwork, &iwe, start, stop); ++ ++ start = translate_scan_wps(info, pnetwork, &iwe, start, stop); + +- if (r8712_get_wps_ie(pnetwork->network.IEs, +- pnetwork->network.IELength, +- wps_ie, &wps_ielen)) { +- if (wps_ielen > 2) { +- iwe.cmd = IWEVGENIE; +- iwe.u.data.length = (u16)wps_ielen; +- start = iwe_stream_add_point(info, start, stop, +- &iwe, wps_ie); +- } +- } +- } + /* Add quality statistics */ + iwe.cmd = IWEVQUAL; + rssi = r8712_signal_scale_mapping(pnetwork->network.Rssi); +diff --git a/drivers/staging/rts5208/rtsx.c b/drivers/staging/rts5208/rtsx.c +index fa597953e9a0..685cf842badc 100644 +--- a/drivers/staging/rts5208/rtsx.c ++++ b/drivers/staging/rts5208/rtsx.c +@@ -490,7 +490,7 @@ static int rtsx_polling_thread(void *__dev) + + for (;;) { + set_current_state(TASK_INTERRUPTIBLE); +- schedule_timeout(msecs_to_jiffies(POLLING_INTERVAL)); ++ schedule_msec_hrtimeout((POLLING_INTERVAL)); + + /* lock the device pointers */ + mutex_lock(&dev->dev_mutex); +diff --git a/drivers/staging/speakup/speakup_acntpc.c b/drivers/staging/speakup/speakup_acntpc.c +index c94328a5bd4a..6e7d4671aa69 100644 +--- a/drivers/staging/speakup/speakup_acntpc.c ++++ b/drivers/staging/speakup/speakup_acntpc.c +@@ -198,7 +198,7 @@ static void do_catch_up(struct spk_synth *synth) + full_time_val = full_time->u.n.value; + spin_unlock_irqrestore(&speakup_info.spinlock, flags); + if (synth_full()) { +- schedule_timeout(msecs_to_jiffies(full_time_val)); ++ schedule_msec_hrtimeout((full_time_val)); + continue; + } + set_current_state(TASK_RUNNING); +@@ -226,7 +226,7 @@ static void do_catch_up(struct spk_synth *synth) + jiffy_delta_val = jiffy_delta->u.n.value; + delay_time_val = delay_time->u.n.value; + spin_unlock_irqrestore(&speakup_info.spinlock, flags); +- schedule_timeout(msecs_to_jiffies(delay_time_val)); ++ schedule_msec_hrtimeout(delay_time_val); + jiff_max = jiffies + jiffy_delta_val; + } + } +diff --git a/drivers/staging/speakup/speakup_apollo.c b/drivers/staging/speakup/speakup_apollo.c +index 0877b4044c28..627102d048c1 100644 +--- a/drivers/staging/speakup/speakup_apollo.c ++++ b/drivers/staging/speakup/speakup_apollo.c +@@ -165,7 +165,7 @@ static void do_catch_up(struct spk_synth *synth) + if (!synth->io_ops->synth_out(synth, ch)) { + synth->io_ops->tiocmset(0, UART_MCR_RTS); + synth->io_ops->tiocmset(UART_MCR_RTS, 0); +- schedule_timeout(msecs_to_jiffies(full_time_val)); ++ schedule_msec_hrtimeout(full_time_val); + continue; + } + if (time_after_eq(jiffies, jiff_max) && (ch == SPACE)) { +diff --git a/drivers/staging/speakup/speakup_decext.c b/drivers/staging/speakup/speakup_decext.c +index ddbb7e97d118..f9502addc765 100644 +--- a/drivers/staging/speakup/speakup_decext.c ++++ b/drivers/staging/speakup/speakup_decext.c +@@ -176,7 +176,7 @@ static void do_catch_up(struct spk_synth *synth) + if (ch == '\n') + ch = 0x0D; + if (synth_full() || !synth->io_ops->synth_out(synth, ch)) { +- schedule_timeout(msecs_to_jiffies(delay_time_val)); ++ schedule_msec_hrtimeout(delay_time_val); + continue; + } + set_current_state(TASK_RUNNING); +diff --git a/drivers/staging/speakup/speakup_decpc.c b/drivers/staging/speakup/speakup_decpc.c +index 798c42dfa16c..d85b41db67a3 100644 +--- a/drivers/staging/speakup/speakup_decpc.c ++++ b/drivers/staging/speakup/speakup_decpc.c +@@ -394,7 +394,7 @@ static void do_catch_up(struct spk_synth *synth) + if (ch == '\n') + ch = 0x0D; + if (dt_sendchar(ch)) { +- schedule_timeout(msecs_to_jiffies(delay_time_val)); ++ schedule_msec_hrtimeout((delay_time_val)); + continue; + } + set_current_state(TASK_RUNNING); +diff --git a/drivers/staging/speakup/speakup_dectlk.c b/drivers/staging/speakup/speakup_dectlk.c +index dccb4ea29d37..8ecead307d04 100644 +--- a/drivers/staging/speakup/speakup_dectlk.c ++++ b/drivers/staging/speakup/speakup_dectlk.c +@@ -244,7 +244,7 @@ static void do_catch_up(struct spk_synth *synth) + if (ch == '\n') + ch = 0x0D; + if (synth_full_val || !synth->io_ops->synth_out(synth, ch)) { +- schedule_timeout(msecs_to_jiffies(delay_time_val)); ++ schedule_msec_hrtimeout(delay_time_val); + continue; + } + set_current_state(TASK_RUNNING); +diff --git a/drivers/staging/speakup/speakup_dtlk.c b/drivers/staging/speakup/speakup_dtlk.c +index dbebed0eeeec..6d83c13ca4a6 100644 +--- a/drivers/staging/speakup/speakup_dtlk.c ++++ b/drivers/staging/speakup/speakup_dtlk.c +@@ -211,7 +211,7 @@ static void do_catch_up(struct spk_synth *synth) + delay_time_val = delay_time->u.n.value; + spin_unlock_irqrestore(&speakup_info.spinlock, flags); + if (synth_full()) { +- schedule_timeout(msecs_to_jiffies(delay_time_val)); ++ schedule_msec_hrtimeout((delay_time_val)); + continue; + } + set_current_state(TASK_RUNNING); +@@ -227,7 +227,7 @@ static void do_catch_up(struct spk_synth *synth) + delay_time_val = delay_time->u.n.value; + jiffy_delta_val = jiffy_delta->u.n.value; + spin_unlock_irqrestore(&speakup_info.spinlock, flags); +- schedule_timeout(msecs_to_jiffies(delay_time_val)); ++ schedule_msec_hrtimeout((delay_time_val)); + jiff_max = jiffies + jiffy_delta_val; + } + } +diff --git a/drivers/staging/speakup/speakup_keypc.c b/drivers/staging/speakup/speakup_keypc.c +index 414827e888fc..cb31c9176daa 100644 +--- a/drivers/staging/speakup/speakup_keypc.c ++++ b/drivers/staging/speakup/speakup_keypc.c +@@ -199,7 +199,7 @@ static void do_catch_up(struct spk_synth *synth) + full_time_val = full_time->u.n.value; + spin_unlock_irqrestore(&speakup_info.spinlock, flags); + if (synth_full()) { +- schedule_timeout(msecs_to_jiffies(full_time_val)); ++ schedule_msec_hrtimeout((full_time_val)); + continue; + } + set_current_state(TASK_RUNNING); +@@ -232,7 +232,7 @@ static void do_catch_up(struct spk_synth *synth) + jiffy_delta_val = jiffy_delta->u.n.value; + delay_time_val = delay_time->u.n.value; + spin_unlock_irqrestore(&speakup_info.spinlock, flags); +- schedule_timeout(msecs_to_jiffies(delay_time_val)); ++ schedule_msec_hrtimeout(delay_time_val); + jiff_max = jiffies + jiffy_delta_val; + } + } +diff --git a/drivers/staging/speakup/synth.c b/drivers/staging/speakup/synth.c +index 3568bfb89912..a5540729a9ee 100644 +--- a/drivers/staging/speakup/synth.c ++++ b/drivers/staging/speakup/synth.c +@@ -98,7 +98,7 @@ static void _spk_do_catch_up(struct spk_synth *synth, int unicode) + else + ret = synth->io_ops->synth_out(synth, ch); + if (!ret) { +- schedule_timeout(msecs_to_jiffies(full_time_val)); ++ schedule_msec_hrtimeout(full_time_val); + continue; + } + if (time_after_eq(jiffies, jiff_max) && (ch == SPACE)) { +@@ -108,11 +108,9 @@ static void _spk_do_catch_up(struct spk_synth *synth, int unicode) + full_time_val = full_time->u.n.value; + spin_unlock_irqrestore(&speakup_info.spinlock, flags); + if (synth->io_ops->synth_out(synth, synth->procspeech)) +- schedule_timeout( +- msecs_to_jiffies(delay_time_val)); ++ schedule_msec_hrtimeout(delay_time_val); + else +- schedule_timeout( +- msecs_to_jiffies(full_time_val)); ++ schedule_msec_hrtimeout(full_time_val); + jiff_max = jiffies + jiffy_delta_val; + } + set_current_state(TASK_RUNNING); +diff --git a/drivers/staging/unisys/visornic/visornic_main.c b/drivers/staging/unisys/visornic/visornic_main.c +index 1c1a470d2e50..cbac00e586b0 100644 +--- a/drivers/staging/unisys/visornic/visornic_main.c ++++ b/drivers/staging/unisys/visornic/visornic_main.c +@@ -549,7 +549,7 @@ static int visornic_disable_with_timeout(struct net_device *netdev, + } + set_current_state(TASK_INTERRUPTIBLE); + spin_unlock_irqrestore(&devdata->priv_lock, flags); +- wait += schedule_timeout(msecs_to_jiffies(10)); ++ wait += schedule_msec_hrtimeout((10)); + spin_lock_irqsave(&devdata->priv_lock, flags); + } + +@@ -560,7 +560,7 @@ static int visornic_disable_with_timeout(struct net_device *netdev, + while (1) { + set_current_state(TASK_INTERRUPTIBLE); + spin_unlock_irqrestore(&devdata->priv_lock, flags); +- schedule_timeout(msecs_to_jiffies(10)); ++ schedule_msec_hrtimeout((10)); + spin_lock_irqsave(&devdata->priv_lock, flags); + if (atomic_read(&devdata->usage)) + break; +@@ -714,7 +714,7 @@ static int visornic_enable_with_timeout(struct net_device *netdev, + } + set_current_state(TASK_INTERRUPTIBLE); + spin_unlock_irqrestore(&devdata->priv_lock, flags); +- wait += schedule_timeout(msecs_to_jiffies(10)); ++ wait += schedule_msec_hrtimeout((10)); + spin_lock_irqsave(&devdata->priv_lock, flags); + } + +diff --git a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +index 68f08dc18da9..5e9187edeef4 100644 +--- a/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c ++++ b/drivers/staging/vc04_services/bcm2835-camera/bcm2835-camera.c +@@ -336,16 +336,13 @@ static void buffer_cb(struct vchiq_mmal_instance *instance, + return; + } else if (length == 0) { + /* stream ended */ +- if (buf) { +- /* this should only ever happen if the port is +- * disabled and there are buffers still queued ++ if (dev->capture.frame_count) { ++ /* empty buffer whilst capturing - expected to be an ++ * EOS, so grab another frame + */ +- vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); +- pr_debug("Empty buffer"); +- } else if (dev->capture.frame_count) { +- /* grab another frame */ + if (is_capturing(dev)) { +- pr_debug("Grab another frame"); ++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "Grab another frame"); + vchiq_mmal_port_parameter_set( + instance, + dev->capture.camera_port, +@@ -353,8 +350,14 @@ static void buffer_cb(struct vchiq_mmal_instance *instance, + &dev->capture.frame_count, + sizeof(dev->capture.frame_count)); + } ++ if (vchiq_mmal_submit_buffer(instance, port, buf)) ++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "Failed to return EOS buffer"); + } else { +- /* signal frame completion */ ++ /* stopping streaming. ++ * return buffer, and signal frame completion ++ */ ++ vb2_buffer_done(&buf->vb.vb2_buf, VB2_BUF_STATE_ERROR); + complete(&dev->capture.frame_cmplt); + } + } else { +@@ -576,6 +579,7 @@ static void stop_streaming(struct vb2_queue *vq) + int ret; + unsigned long timeout; + struct bm2835_mmal_dev *dev = vb2_get_drv_priv(vq); ++ struct vchiq_mmal_port *port = dev->capture.port; + + v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, "%s: dev:%p\n", + __func__, dev); +@@ -599,12 +603,6 @@ static void stop_streaming(struct vb2_queue *vq) + &dev->capture.frame_count, + sizeof(dev->capture.frame_count)); + +- /* wait for last frame to complete */ +- timeout = wait_for_completion_timeout(&dev->capture.frame_cmplt, HZ); +- if (timeout == 0) +- v4l2_err(&dev->v4l2_dev, +- "timed out waiting for frame completion\n"); +- + v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, + "disabling connection\n"); + +@@ -619,6 +617,21 @@ static void stop_streaming(struct vb2_queue *vq) + ret); + } + ++ /* wait for all buffers to be returned */ ++ while (atomic_read(&port->buffers_with_vpu)) { ++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "%s: Waiting for buffers to be returned - %d outstanding\n", ++ __func__, atomic_read(&port->buffers_with_vpu)); ++ timeout = wait_for_completion_timeout(&dev->capture.frame_cmplt, ++ HZ); ++ if (timeout == 0) { ++ v4l2_err(&dev->v4l2_dev, "%s: Timeout waiting for buffers to be returned - %d outstanding\n", ++ __func__, ++ atomic_read(&port->buffers_with_vpu)); ++ break; ++ } ++ } ++ + if (disable_camera(dev) < 0) + v4l2_err(&dev->v4l2_dev, "Failed to disable camera\n"); + } +diff --git a/drivers/staging/vc04_services/bcm2835-camera/controls.c b/drivers/staging/vc04_services/bcm2835-camera/controls.c +index dade79738a29..12ac3ef61fe6 100644 +--- a/drivers/staging/vc04_services/bcm2835-camera/controls.c ++++ b/drivers/staging/vc04_services/bcm2835-camera/controls.c +@@ -603,15 +603,28 @@ static int ctrl_set_bitrate(struct bm2835_mmal_dev *dev, + struct v4l2_ctrl *ctrl, + const struct bm2835_mmal_v4l2_ctrl *mmal_ctrl) + { ++ int ret; + struct vchiq_mmal_port *encoder_out; + + dev->capture.encode_bitrate = ctrl->val; + + encoder_out = &dev->component[MMAL_COMPONENT_VIDEO_ENCODE]->output[0]; + +- return vchiq_mmal_port_parameter_set(dev->instance, encoder_out, +- mmal_ctrl->mmal_id, &ctrl->val, +- sizeof(ctrl->val)); ++ ret = vchiq_mmal_port_parameter_set(dev->instance, encoder_out, ++ mmal_ctrl->mmal_id, &ctrl->val, ++ sizeof(ctrl->val)); ++ ++ v4l2_dbg(1, bcm2835_v4l2_debug, &dev->v4l2_dev, ++ "%s: After: mmal_ctrl:%p ctrl id:0x%x ctrl val:%d ret %d(%d)\n", ++ __func__, mmal_ctrl, ctrl->id, ctrl->val, ret, ++ (ret == 0 ? 0 : -EINVAL)); ++ ++ /* ++ * Older firmware versions (pre July 2019) have a bug in handling ++ * MMAL_PARAMETER_VIDEO_BIT_RATE that result in the call ++ * returning -MMAL_MSG_STATUS_EINVAL. So ignore errors from this call. ++ */ ++ return 0; + } + + static int ctrl_set_bitrate_mode(struct bm2835_mmal_dev *dev, +diff --git a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c b/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c +index 16af735af5c3..29761f6c3b55 100644 +--- a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c ++++ b/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.c +@@ -161,7 +161,8 @@ struct vchiq_mmal_instance { + void *bulk_scratch; + + struct idr context_map; +- spinlock_t context_map_lock; ++ /* protect accesses to context_map */ ++ struct mutex context_map_lock; + + /* component to use next */ + int component_idx; +@@ -184,10 +185,10 @@ get_msg_context(struct vchiq_mmal_instance *instance) + * that when we service the VCHI reply, we can look up what + * message is being replied to. + */ +- spin_lock(&instance->context_map_lock); ++ mutex_lock(&instance->context_map_lock); + handle = idr_alloc(&instance->context_map, msg_context, + 0, 0, GFP_KERNEL); +- spin_unlock(&instance->context_map_lock); ++ mutex_unlock(&instance->context_map_lock); + + if (handle < 0) { + kfree(msg_context); +@@ -211,9 +212,9 @@ release_msg_context(struct mmal_msg_context *msg_context) + { + struct vchiq_mmal_instance *instance = msg_context->instance; + +- spin_lock(&instance->context_map_lock); ++ mutex_lock(&instance->context_map_lock); + idr_remove(&instance->context_map, msg_context->handle); +- spin_unlock(&instance->context_map_lock); ++ mutex_unlock(&instance->context_map_lock); + kfree(msg_context); + } + +@@ -239,6 +240,8 @@ static void buffer_work_cb(struct work_struct *work) + struct mmal_msg_context *msg_context = + container_of(work, struct mmal_msg_context, u.bulk.work); + ++ atomic_dec(&msg_context->u.bulk.port->buffers_with_vpu); ++ + msg_context->u.bulk.port->buffer_cb(msg_context->u.bulk.instance, + msg_context->u.bulk.port, + msg_context->u.bulk.status, +@@ -287,8 +290,6 @@ static int bulk_receive(struct vchiq_mmal_instance *instance, + + /* store length */ + msg_context->u.bulk.buffer_used = rd_len; +- msg_context->u.bulk.mmal_flags = +- msg->u.buffer_from_host.buffer_header.flags; + msg_context->u.bulk.dts = msg->u.buffer_from_host.buffer_header.dts; + msg_context->u.bulk.pts = msg->u.buffer_from_host.buffer_header.pts; + +@@ -379,6 +380,8 @@ buffer_from_host(struct vchiq_mmal_instance *instance, + /* initialise work structure ready to schedule callback */ + INIT_WORK(&msg_context->u.bulk.work, buffer_work_cb); + ++ atomic_inc(&port->buffers_with_vpu); ++ + /* prep the buffer from host message */ + memset(&m, 0xbc, sizeof(m)); /* just to make debug clearer */ + +@@ -447,6 +450,9 @@ static void buffer_to_host_cb(struct vchiq_mmal_instance *instance, + return; + } + ++ msg_context->u.bulk.mmal_flags = ++ msg->u.buffer_from_host.buffer_header.flags; ++ + if (msg->h.status != MMAL_MSG_STATUS_SUCCESS) { + /* message reception had an error */ + pr_warn("error %d in reply\n", msg->h.status); +@@ -1323,16 +1329,6 @@ static int port_enable(struct vchiq_mmal_instance *instance, + if (port->enabled) + return 0; + +- /* ensure there are enough buffers queued to cover the buffer headers */ +- if (port->buffer_cb) { +- hdr_count = 0; +- list_for_each(buf_head, &port->buffers) { +- hdr_count++; +- } +- if (hdr_count < port->current_buffer.num) +- return -ENOSPC; +- } +- + ret = port_action_port(instance, port, + MMAL_MSG_PORT_ACTION_TYPE_ENABLE); + if (ret) +@@ -1849,7 +1845,7 @@ int vchiq_mmal_init(struct vchiq_mmal_instance **out_instance) + + instance->bulk_scratch = vmalloc(PAGE_SIZE); + +- spin_lock_init(&instance->context_map_lock); ++ mutex_init(&instance->context_map_lock); + idr_init_base(&instance->context_map, 1); + + params.callback_param = instance; +diff --git a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.h b/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.h +index 22b839ecd5f0..b0ee1716525b 100644 +--- a/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.h ++++ b/drivers/staging/vc04_services/bcm2835-camera/mmal-vchiq.h +@@ -71,6 +71,9 @@ struct vchiq_mmal_port { + struct list_head buffers; + /* lock to serialise adding and removing buffers from list */ + spinlock_t slock; ++ ++ /* Count of buffers the VPU has yet to return */ ++ atomic_t buffers_with_vpu; + /* callback on buffer completion */ + vchiq_mmal_buffer_cb buffer_cb; + /* callback context */ +diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c +index c557c9953724..aa20fcaefa9d 100644 +--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c ++++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_2835_arm.c +@@ -523,7 +523,7 @@ create_pagelist(char __user *buf, size_t count, unsigned short type) + (g_cache_line_size - 1)))) { + char *fragments; + +- if (down_killable(&g_free_fragments_sema)) { ++ if (down_interruptible(&g_free_fragments_sema) != 0) { + cleanup_pagelistinfo(pagelistinfo); + return NULL; + } +diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +index ab7d6a0ce94c..62d8f599e765 100644 +--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c ++++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +@@ -532,7 +532,8 @@ add_completion(VCHIQ_INSTANCE_T instance, VCHIQ_REASON_T reason, + vchiq_log_trace(vchiq_arm_log_level, + "%s - completion queue full", __func__); + DEBUG_COUNT(COMPLETION_QUEUE_FULL_COUNT); +- if (wait_for_completion_killable(&instance->remove_event)) { ++ if (wait_for_completion_interruptible( ++ &instance->remove_event)) { + vchiq_log_info(vchiq_arm_log_level, + "service_callback interrupted"); + return VCHIQ_RETRY; +@@ -643,7 +644,7 @@ service_callback(VCHIQ_REASON_T reason, struct vchiq_header *header, + } + + DEBUG_TRACE(SERVICE_CALLBACK_LINE); +- if (wait_for_completion_killable( ++ if (wait_for_completion_interruptible( + &user_service->remove_event) + != 0) { + vchiq_log_info(vchiq_arm_log_level, +@@ -978,7 +979,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + has been closed until the client library calls the + CLOSE_DELIVERED ioctl, signalling close_event. */ + if (user_service->close_pending && +- wait_for_completion_killable( ++ wait_for_completion_interruptible( + &user_service->close_event)) + status = VCHIQ_RETRY; + break; +@@ -1154,7 +1155,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + + DEBUG_TRACE(AWAIT_COMPLETION_LINE); + mutex_unlock(&instance->completion_mutex); +- rc = wait_for_completion_killable( ++ rc = wait_for_completion_interruptible( + &instance->insert_event); + mutex_lock(&instance->completion_mutex); + if (rc != 0) { +@@ -1324,7 +1325,7 @@ vchiq_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + do { + spin_unlock(&msg_queue_spinlock); + DEBUG_TRACE(DEQUEUE_MESSAGE_LINE); +- if (wait_for_completion_killable( ++ if (wait_for_completion_interruptible( + &user_service->insert_event)) { + vchiq_log_info(vchiq_arm_log_level, + "DEQUEUE_MESSAGE interrupted"); +@@ -2328,7 +2329,7 @@ vchiq_keepalive_thread_func(void *v) + while (1) { + long rc = 0, uc = 0; + +- if (wait_for_completion_killable(&arm_state->ka_evt) ++ if (wait_for_completion_interruptible(&arm_state->ka_evt) + != 0) { + vchiq_log_error(vchiq_susp_log_level, + "%s interrupted", __func__); +@@ -2579,7 +2580,7 @@ block_resume(struct vchiq_arm_state *arm_state) + write_unlock_bh(&arm_state->susp_res_lock); + vchiq_log_info(vchiq_susp_log_level, "%s wait for previously " + "blocked clients", __func__); +- if (wait_for_completion_killable_timeout( ++ if (wait_for_completion_interruptible_timeout( + &arm_state->blocked_blocker, timeout_val) + <= 0) { + vchiq_log_error(vchiq_susp_log_level, "%s wait for " +@@ -2605,7 +2606,7 @@ block_resume(struct vchiq_arm_state *arm_state) + write_unlock_bh(&arm_state->susp_res_lock); + vchiq_log_info(vchiq_susp_log_level, "%s wait for resume", + __func__); +- if (wait_for_completion_killable_timeout( ++ if (wait_for_completion_interruptible_timeout( + &arm_state->vc_resume_complete, timeout_val) + <= 0) { + vchiq_log_error(vchiq_susp_log_level, "%s wait for " +@@ -2812,7 +2813,7 @@ vchiq_arm_force_suspend(struct vchiq_state *state) + do { + write_unlock_bh(&arm_state->susp_res_lock); + +- rc = wait_for_completion_killable_timeout( ++ rc = wait_for_completion_interruptible_timeout( + &arm_state->vc_suspend_complete, + msecs_to_jiffies(FORCE_SUSPEND_TIMEOUT_MS)); + +@@ -2908,7 +2909,7 @@ vchiq_arm_allow_resume(struct vchiq_state *state) + write_unlock_bh(&arm_state->susp_res_lock); + + if (resume) { +- if (wait_for_completion_killable( ++ if (wait_for_completion_interruptible( + &arm_state->vc_resume_complete) < 0) { + vchiq_log_error(vchiq_susp_log_level, + "%s interrupted", __func__); +diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c +index 0c387b6473a5..44bfa890e0e5 100644 +--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c ++++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c +@@ -395,13 +395,21 @@ remote_event_create(wait_queue_head_t *wq, struct remote_event *event) + init_waitqueue_head(wq); + } + ++/* ++ * All the event waiting routines in VCHIQ used a custom semaphore ++ * implementation that filtered most signals. This achieved a behaviour similar ++ * to the "killable" family of functions. While cleaning up this code all the ++ * routines where switched to the "interruptible" family of functions, as the ++ * former was deemed unjustified and the use "killable" set all VCHIQ's ++ * threads in D state. ++ */ + static inline int + remote_event_wait(wait_queue_head_t *wq, struct remote_event *event) + { + if (!event->fired) { + event->armed = 1; + dsb(sy); +- if (wait_event_killable(*wq, event->fired)) { ++ if (wait_event_interruptible(*wq, event->fired)) { + event->armed = 0; + return 0; + } +@@ -560,7 +568,7 @@ reserve_space(struct vchiq_state *state, size_t space, int is_blocking) + remote_event_signal(&state->remote->trigger); + + if (!is_blocking || +- (wait_for_completion_killable( ++ (wait_for_completion_interruptible( + &state->slot_available_event))) + return NULL; /* No space available */ + } +@@ -830,7 +838,7 @@ queue_message(struct vchiq_state *state, struct vchiq_service *service, + spin_unlock("a_spinlock); + mutex_unlock(&state->slot_mutex); + +- if (wait_for_completion_killable( ++ if (wait_for_completion_interruptible( + &state->data_quota_event)) + return VCHIQ_RETRY; + +@@ -861,7 +869,7 @@ queue_message(struct vchiq_state *state, struct vchiq_service *service, + service_quota->slot_use_count); + VCHIQ_SERVICE_STATS_INC(service, quota_stalls); + mutex_unlock(&state->slot_mutex); +- if (wait_for_completion_killable( ++ if (wait_for_completion_interruptible( + &service_quota->quota_event)) + return VCHIQ_RETRY; + if (service->closing) +@@ -1710,7 +1718,8 @@ parse_rx_slots(struct vchiq_state *state) + &service->bulk_rx : &service->bulk_tx; + + DEBUG_TRACE(PARSE_LINE); +- if (mutex_lock_killable(&service->bulk_mutex)) { ++ if (mutex_lock_killable( ++ &service->bulk_mutex) != 0) { + DEBUG_TRACE(PARSE_LINE); + goto bail_not_ready; + } +@@ -2428,7 +2437,7 @@ vchiq_open_service_internal(struct vchiq_service *service, int client_id) + QMFLAGS_IS_BLOCKING); + if (status == VCHIQ_SUCCESS) { + /* Wait for the ACK/NAK */ +- if (wait_for_completion_killable(&service->remove_event)) { ++ if (wait_for_completion_interruptible(&service->remove_event)) { + status = VCHIQ_RETRY; + vchiq_release_service_internal(service); + } else if ((service->srvstate != VCHIQ_SRVSTATE_OPEN) && +@@ -2795,7 +2804,7 @@ vchiq_connect_internal(struct vchiq_state *state, VCHIQ_INSTANCE_T instance) + } + + if (state->conn_state == VCHIQ_CONNSTATE_CONNECTING) { +- if (wait_for_completion_killable(&state->connect)) ++ if (wait_for_completion_interruptible(&state->connect)) + return VCHIQ_RETRY; + + vchiq_set_conn_state(state, VCHIQ_CONNSTATE_CONNECTED); +@@ -2894,7 +2903,7 @@ vchiq_close_service(VCHIQ_SERVICE_HANDLE_T handle) + } + + while (1) { +- if (wait_for_completion_killable(&service->remove_event)) { ++ if (wait_for_completion_interruptible(&service->remove_event)) { + status = VCHIQ_RETRY; + break; + } +@@ -2955,7 +2964,7 @@ vchiq_remove_service(VCHIQ_SERVICE_HANDLE_T handle) + request_poll(service->state, service, VCHIQ_POLL_REMOVE); + } + while (1) { +- if (wait_for_completion_killable(&service->remove_event)) { ++ if (wait_for_completion_interruptible(&service->remove_event)) { + status = VCHIQ_RETRY; + break; + } +@@ -3038,7 +3047,7 @@ VCHIQ_STATUS_T vchiq_bulk_transfer(VCHIQ_SERVICE_HANDLE_T handle, + VCHIQ_SERVICE_STATS_INC(service, bulk_stalls); + do { + mutex_unlock(&service->bulk_mutex); +- if (wait_for_completion_killable( ++ if (wait_for_completion_interruptible( + &service->bulk_remove_event)) { + status = VCHIQ_RETRY; + goto error_exit; +@@ -3115,7 +3124,7 @@ VCHIQ_STATUS_T vchiq_bulk_transfer(VCHIQ_SERVICE_HANDLE_T handle, + + if (bulk_waiter) { + bulk_waiter->bulk = bulk; +- if (wait_for_completion_killable(&bulk_waiter->event)) ++ if (wait_for_completion_interruptible(&bulk_waiter->event)) + status = VCHIQ_RETRY; + else if (bulk_waiter->actual == VCHIQ_BULK_ACTUAL_ABORTED) + status = VCHIQ_ERROR; +diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c +index 6c519d8e48cb..8ee85c5e6f77 100644 +--- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c ++++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_util.c +@@ -50,7 +50,7 @@ void vchiu_queue_push(struct vchiu_queue *queue, struct vchiq_header *header) + return; + + while (queue->write == queue->read + queue->size) { +- if (wait_for_completion_killable(&queue->pop)) ++ if (wait_for_completion_interruptible(&queue->pop)) + flush_signals(current); + } + +@@ -63,7 +63,7 @@ void vchiu_queue_push(struct vchiu_queue *queue, struct vchiq_header *header) + struct vchiq_header *vchiu_queue_peek(struct vchiu_queue *queue) + { + while (queue->write == queue->read) { +- if (wait_for_completion_killable(&queue->push)) ++ if (wait_for_completion_interruptible(&queue->push)) + flush_signals(current); + } + +@@ -77,7 +77,7 @@ struct vchiq_header *vchiu_queue_pop(struct vchiu_queue *queue) + struct vchiq_header *header; + + while (queue->write == queue->read) { +- if (wait_for_completion_killable(&queue->push)) ++ if (wait_for_completion_interruptible(&queue->push)) + flush_signals(current); + } + +diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c +index ccafcc2c87ac..70433f756d8e 100644 +--- a/drivers/staging/vt6656/main_usb.c ++++ b/drivers/staging/vt6656/main_usb.c +@@ -402,16 +402,19 @@ static void vnt_free_int_bufs(struct vnt_private *priv) + kfree(priv->int_buf.data_buf); + } + +-static bool vnt_alloc_bufs(struct vnt_private *priv) ++static int vnt_alloc_bufs(struct vnt_private *priv) + { ++ int ret = 0; + struct vnt_usb_send_context *tx_context; + struct vnt_rcb *rcb; + int ii; + + for (ii = 0; ii < priv->num_tx_context; ii++) { + tx_context = kmalloc(sizeof(*tx_context), GFP_KERNEL); +- if (!tx_context) ++ if (!tx_context) { ++ ret = -ENOMEM; + goto free_tx; ++ } + + priv->tx_context[ii] = tx_context; + tx_context->priv = priv; +@@ -419,16 +422,20 @@ static bool vnt_alloc_bufs(struct vnt_private *priv) + + /* allocate URBs */ + tx_context->urb = usb_alloc_urb(0, GFP_KERNEL); +- if (!tx_context->urb) ++ if (!tx_context->urb) { ++ ret = -ENOMEM; + goto free_tx; ++ } + + tx_context->in_use = false; + } + + for (ii = 0; ii < priv->num_rcb; ii++) { + priv->rcb[ii] = kzalloc(sizeof(*priv->rcb[ii]), GFP_KERNEL); +- if (!priv->rcb[ii]) ++ if (!priv->rcb[ii]) { ++ ret = -ENOMEM; + goto free_rx_tx; ++ } + + rcb = priv->rcb[ii]; + +@@ -436,39 +443,46 @@ static bool vnt_alloc_bufs(struct vnt_private *priv) + + /* allocate URBs */ + rcb->urb = usb_alloc_urb(0, GFP_KERNEL); +- if (!rcb->urb) ++ if (!rcb->urb) { ++ ret = -ENOMEM; + goto free_rx_tx; ++ } + + rcb->skb = dev_alloc_skb(priv->rx_buf_sz); +- if (!rcb->skb) ++ if (!rcb->skb) { ++ ret = -ENOMEM; + goto free_rx_tx; ++ } + + rcb->in_use = false; + + /* submit rx urb */ +- if (vnt_submit_rx_urb(priv, rcb)) ++ ret = vnt_submit_rx_urb(priv, rcb); ++ if (ret) + goto free_rx_tx; + } + + priv->interrupt_urb = usb_alloc_urb(0, GFP_KERNEL); +- if (!priv->interrupt_urb) ++ if (!priv->interrupt_urb) { ++ ret = -ENOMEM; + goto free_rx_tx; ++ } + + priv->int_buf.data_buf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL); + if (!priv->int_buf.data_buf) { +- usb_free_urb(priv->interrupt_urb); +- goto free_rx_tx; ++ ret = -ENOMEM; ++ goto free_rx_tx_urb; + } + +- return true; ++ return 0; + ++free_rx_tx_urb: ++ usb_free_urb(priv->interrupt_urb); + free_rx_tx: + vnt_free_rx_bufs(priv); +- + free_tx: + vnt_free_tx_bufs(priv); +- +- return false; ++ return ret; + } + + static void vnt_tx_80211(struct ieee80211_hw *hw, +diff --git a/drivers/staging/wilc1000/wilc_netdev.c b/drivers/staging/wilc1000/wilc_netdev.c +index ba78c08a17f1..5338d7d2b248 100644 +--- a/drivers/staging/wilc1000/wilc_netdev.c ++++ b/drivers/staging/wilc1000/wilc_netdev.c +@@ -530,17 +530,17 @@ static int wilc_wlan_initialize(struct net_device *dev, struct wilc_vif *vif) + goto fail_locks; + } + +- if (wl->gpio_irq && init_irq(dev)) { +- ret = -EIO; +- goto fail_locks; +- } +- + ret = wlan_initialize_threads(dev); + if (ret < 0) { + ret = -EIO; + goto fail_wilc_wlan; + } + ++ if (wl->gpio_irq && init_irq(dev)) { ++ ret = -EIO; ++ goto fail_threads; ++ } ++ + if (!wl->dev_irq_num && + wl->hif_func->enable_interrupt && + wl->hif_func->enable_interrupt(wl)) { +@@ -596,7 +596,7 @@ static int wilc_wlan_initialize(struct net_device *dev, struct wilc_vif *vif) + fail_irq_init: + if (wl->dev_irq_num) + deinit_irq(dev); +- ++fail_threads: + wlan_deinitialize_threads(dev); + fail_wilc_wlan: + wilc_wlan_cleanup(dev); +diff --git a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c +index f6825727bf77..3592b545246c 100644 +--- a/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c ++++ b/drivers/staging/wilc1000/wilc_wfi_cfgoperations.c +@@ -1789,6 +1789,7 @@ void wilc_deinit_host_int(struct net_device *net) + + priv->p2p_listen_state = false; + ++ flush_workqueue(vif->wilc->hif_workqueue); + mutex_destroy(&priv->scan_req_lock); + ret = wilc_deinit(vif); + +diff --git a/drivers/tty/Kconfig b/drivers/tty/Kconfig +index 3b1d312bb175..6b434c7234f0 100644 +--- a/drivers/tty/Kconfig ++++ b/drivers/tty/Kconfig +@@ -76,6 +76,19 @@ config VT_CONSOLE_SLEEP + def_bool y + depends on VT_CONSOLE && PM_SLEEP + ++config NR_TTY_DEVICES ++ int "Maximum tty device number" ++ depends on VT ++ range 12 63 ++ default 63 ++ ---help--- ++ This option is used to change the number of tty devices in /dev. ++ The default value is 63. The lowest number you can set is 12, ++ 63 is also the upper limit so we don't overrun the serial ++ consoles. ++ ++ If unsure, say 63. ++ + config HW_CONSOLE + bool + depends on VT && !UML +diff --git a/drivers/tty/serial/8250/8250_port.c b/drivers/tty/serial/8250/8250_port.c +index d2f3310abe54..eb2e2d141c01 100644 +--- a/drivers/tty/serial/8250/8250_port.c ++++ b/drivers/tty/serial/8250/8250_port.c +@@ -1869,13 +1869,13 @@ int serial8250_handle_irq(struct uart_port *port, unsigned int iir) + + status = serial_port_in(port, UART_LSR); + +- if (status & (UART_LSR_DR | UART_LSR_BI) && +- iir & UART_IIR_RDI) { ++ if (status & (UART_LSR_DR | UART_LSR_BI)) { + if (!up->dma || handle_rx_dma(up, iir)) + status = serial8250_rx_chars(up, status); + } + serial8250_modem_status(up); +- if ((!up->dma || up->dma->tx_err) && (status & UART_LSR_THRE)) ++ if ((!up->dma || up->dma->tx_err) && (status & UART_LSR_THRE) && ++ (up->ier & UART_IER_THRI)) + serial8250_tx_chars(up); + + uart_unlock_and_check_sysrq(port, flags); +diff --git a/drivers/tty/serial/cpm_uart/cpm_uart_core.c b/drivers/tty/serial/cpm_uart/cpm_uart_core.c +index b929c7ae3a27..7bab9a3eda92 100644 +--- a/drivers/tty/serial/cpm_uart/cpm_uart_core.c ++++ b/drivers/tty/serial/cpm_uart/cpm_uart_core.c +@@ -407,7 +407,16 @@ static int cpm_uart_startup(struct uart_port *port) + clrbits16(&pinfo->sccp->scc_sccm, UART_SCCM_RX); + } + cpm_uart_initbd(pinfo); +- cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX); ++ if (IS_SMC(pinfo)) { ++ out_be32(&pinfo->smcup->smc_rstate, 0); ++ out_be32(&pinfo->smcup->smc_tstate, 0); ++ out_be16(&pinfo->smcup->smc_rbptr, ++ in_be16(&pinfo->smcup->smc_rbase)); ++ out_be16(&pinfo->smcup->smc_tbptr, ++ in_be16(&pinfo->smcup->smc_tbase)); ++ } else { ++ cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX); ++ } + } + /* Install interrupt handler. */ + retval = request_irq(port->irq, cpm_uart_int, 0, "cpm_uart", port); +@@ -861,16 +870,14 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo) + (u8 __iomem *)pinfo->tx_bd_base - DPRAM_BASE); + + /* +- * In case SMC1 is being relocated... ++ * In case SMC is being relocated... + */ +-#if defined (CONFIG_I2C_SPI_SMC1_UCODE_PATCH) + out_be16(&up->smc_rbptr, in_be16(&pinfo->smcup->smc_rbase)); + out_be16(&up->smc_tbptr, in_be16(&pinfo->smcup->smc_tbase)); + out_be32(&up->smc_rstate, 0); + out_be32(&up->smc_tstate, 0); + out_be16(&up->smc_brkcr, 1); /* number of break chars */ + out_be16(&up->smc_brkec, 0); +-#endif + + /* Set up the uart parameters in the + * parameter ram. +@@ -884,8 +891,6 @@ static void cpm_uart_init_smc(struct uart_cpm_port *pinfo) + out_be16(&up->smc_brkec, 0); + out_be16(&up->smc_brkcr, 1); + +- cpm_line_cr_cmd(pinfo, CPM_CR_INIT_TRX); +- + /* Set UART mode, 8 bit, no parity, one stop. + * Enable receive and transmit. + */ +diff --git a/drivers/tty/serial/digicolor-usart.c b/drivers/tty/serial/digicolor-usart.c +index f460cca139e2..13ac36e2da4f 100644 +--- a/drivers/tty/serial/digicolor-usart.c ++++ b/drivers/tty/serial/digicolor-usart.c +@@ -541,7 +541,11 @@ static int __init digicolor_uart_init(void) + if (ret) + return ret; + +- return platform_driver_register(&digicolor_uart_platform); ++ ret = platform_driver_register(&digicolor_uart_platform); ++ if (ret) ++ uart_unregister_driver(&digicolor_uart); ++ ++ return ret; + } + module_init(digicolor_uart_init); + +diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c +index 8b752e895053..10db3e54ac9e 100644 +--- a/drivers/tty/serial/imx.c ++++ b/drivers/tty/serial/imx.c +@@ -383,6 +383,7 @@ static void imx_uart_ucrs_restore(struct imx_port *sport, + } + #endif + ++/* called with port.lock taken and irqs caller dependent */ + static void imx_uart_rts_active(struct imx_port *sport, u32 *ucr2) + { + *ucr2 &= ~(UCR2_CTSC | UCR2_CTS); +@@ -391,6 +392,7 @@ static void imx_uart_rts_active(struct imx_port *sport, u32 *ucr2) + mctrl_gpio_set(sport->gpios, sport->port.mctrl); + } + ++/* called with port.lock taken and irqs caller dependent */ + static void imx_uart_rts_inactive(struct imx_port *sport, u32 *ucr2) + { + *ucr2 &= ~UCR2_CTSC; +@@ -400,6 +402,7 @@ static void imx_uart_rts_inactive(struct imx_port *sport, u32 *ucr2) + mctrl_gpio_set(sport->gpios, sport->port.mctrl); + } + ++/* called with port.lock taken and irqs caller dependent */ + static void imx_uart_rts_auto(struct imx_port *sport, u32 *ucr2) + { + *ucr2 |= UCR2_CTSC; +@@ -1549,6 +1552,16 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios, + old_csize = CS8; + } + ++ del_timer_sync(&sport->timer); ++ ++ /* ++ * Ask the core to calculate the divisor for us. ++ */ ++ baud = uart_get_baud_rate(port, termios, old, 50, port->uartclk / 16); ++ quot = uart_get_divisor(port, baud); ++ ++ spin_lock_irqsave(&sport->port.lock, flags); ++ + if ((termios->c_cflag & CSIZE) == CS8) + ucr2 = UCR2_WS | UCR2_SRST | UCR2_IRTS; + else +@@ -1592,16 +1605,6 @@ imx_uart_set_termios(struct uart_port *port, struct ktermios *termios, + ucr2 |= UCR2_PROE; + } + +- del_timer_sync(&sport->timer); +- +- /* +- * Ask the core to calculate the divisor for us. +- */ +- baud = uart_get_baud_rate(port, termios, old, 50, port->uartclk / 16); +- quot = uart_get_divisor(port, baud); +- +- spin_lock_irqsave(&sport->port.lock, flags); +- + sport->port.read_status_mask = 0; + if (termios->c_iflag & INPCK) + sport->port.read_status_mask |= (URXD_FRMERR | URXD_PRERR); +diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c +index e5aebbf5f302..c3afd128b8fc 100644 +--- a/drivers/tty/serial/max310x.c ++++ b/drivers/tty/serial/max310x.c +@@ -496,37 +496,48 @@ static bool max310x_reg_precious(struct device *dev, unsigned int reg) + + static int max310x_set_baud(struct uart_port *port, int baud) + { +- unsigned int mode = 0, clk = port->uartclk, div = clk / baud; ++ unsigned int mode = 0, div = 0, frac = 0, c = 0, F = 0; + +- /* Check for minimal value for divider */ +- if (div < 16) +- div = 16; +- +- if (clk % baud && (div / 16) < 0x8000) { ++ /* ++ * Calculate the integer divisor first. Select a proper mode ++ * in case if the requested baud is too high for the pre-defined ++ * clocks frequency. ++ */ ++ div = port->uartclk / baud; ++ if (div < 8) { ++ /* Mode x4 */ ++ c = 4; ++ mode = MAX310X_BRGCFG_4XMODE_BIT; ++ } else if (div < 16) { + /* Mode x2 */ ++ c = 8; + mode = MAX310X_BRGCFG_2XMODE_BIT; +- clk = port->uartclk * 2; +- div = clk / baud; +- +- if (clk % baud && (div / 16) < 0x8000) { +- /* Mode x4 */ +- mode = MAX310X_BRGCFG_4XMODE_BIT; +- clk = port->uartclk * 4; +- div = clk / baud; +- } ++ } else { ++ c = 16; + } + +- max310x_port_write(port, MAX310X_BRGDIVMSB_REG, (div / 16) >> 8); +- max310x_port_write(port, MAX310X_BRGDIVLSB_REG, div / 16); +- max310x_port_write(port, MAX310X_BRGCFG_REG, (div % 16) | mode); ++ /* Calculate the divisor in accordance with the fraction coefficient */ ++ div /= c; ++ F = c*baud; ++ ++ /* Calculate the baud rate fraction */ ++ if (div > 0) ++ frac = (16*(port->uartclk % F)) / F; ++ else ++ div = 1; ++ ++ max310x_port_write(port, MAX310X_BRGDIVMSB_REG, div >> 8); ++ max310x_port_write(port, MAX310X_BRGDIVLSB_REG, div); ++ max310x_port_write(port, MAX310X_BRGCFG_REG, frac | mode); + +- return DIV_ROUND_CLOSEST(clk, div); ++ /* Return the actual baud rate we just programmed */ ++ return (16*port->uartclk) / (c*(16*div + frac)); + } + + static int max310x_update_best_err(unsigned long f, long *besterr) + { + /* Use baudrate 115200 for calculate error */ +- long err = f % (115200 * 16); ++ long err = f % (460800 * 16); + + if ((*besterr < 0) || (*besterr > err)) { + *besterr = err; +diff --git a/drivers/tty/serial/msm_serial.c b/drivers/tty/serial/msm_serial.c +index 23833ad952ba..3657a24913fc 100644 +--- a/drivers/tty/serial/msm_serial.c ++++ b/drivers/tty/serial/msm_serial.c +@@ -383,10 +383,14 @@ static void msm_request_rx_dma(struct msm_port *msm_port, resource_size_t base) + + static inline void msm_wait_for_xmitr(struct uart_port *port) + { ++ unsigned int timeout = 500000; ++ + while (!(msm_read(port, UART_SR) & UART_SR_TX_EMPTY)) { + if (msm_read(port, UART_ISR) & UART_ISR_TX_READY) + break; + udelay(1); ++ if (!timeout--) ++ break; + } + msm_write(port, UART_CR_CMD_RESET_TX_READY, UART_CR); + } +diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c +index 83f4dd0bfd74..4223cb496764 100644 +--- a/drivers/tty/serial/serial_core.c ++++ b/drivers/tty/serial/serial_core.c +@@ -1777,6 +1777,7 @@ static int uart_port_activate(struct tty_port *port, struct tty_struct *tty) + { + struct uart_state *state = container_of(port, struct uart_state, port); + struct uart_port *uport; ++ int ret; + + uport = uart_port_check(state); + if (!uport || uport->flags & UPF_DEAD) +@@ -1787,7 +1788,11 @@ static int uart_port_activate(struct tty_port *port, struct tty_struct *tty) + /* + * Start up the serial port. + */ +- return uart_startup(tty, state, 0); ++ ret = uart_startup(tty, state, 0); ++ if (ret > 0) ++ tty_port_set_active(port, 1); ++ ++ return ret; + } + + static const char *uart_type(struct uart_port *port) +diff --git a/drivers/tty/serial/serial_mctrl_gpio.c b/drivers/tty/serial/serial_mctrl_gpio.c +index 39ed56214cd3..2b400189be91 100644 +--- a/drivers/tty/serial/serial_mctrl_gpio.c ++++ b/drivers/tty/serial/serial_mctrl_gpio.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + + #include "serial_mctrl_gpio.h" + +@@ -116,6 +117,19 @@ struct mctrl_gpios *mctrl_gpio_init_noauto(struct device *dev, unsigned int idx) + + for (i = 0; i < UART_GPIO_MAX; i++) { + enum gpiod_flags flags; ++ char *gpio_str; ++ bool present; ++ ++ /* Check if GPIO property exists and continue if not */ ++ gpio_str = kasprintf(GFP_KERNEL, "%s-gpios", ++ mctrl_gpios_desc[i].name); ++ if (!gpio_str) ++ continue; ++ ++ present = device_property_present(dev, gpio_str); ++ kfree(gpio_str); ++ if (!present) ++ continue; + + if (mctrl_gpios_desc[i].dir_out) + flags = GPIOD_OUT_LOW; +diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c +index abc705716aa0..d18c680aa64b 100644 +--- a/drivers/tty/serial/sh-sci.c ++++ b/drivers/tty/serial/sh-sci.c +@@ -1398,6 +1398,7 @@ static void sci_dma_tx_work_fn(struct work_struct *work) + struct circ_buf *xmit = &port->state->xmit; + unsigned long flags; + dma_addr_t buf; ++ int head, tail; + + /* + * DMA is idle now. +@@ -1407,16 +1408,23 @@ static void sci_dma_tx_work_fn(struct work_struct *work) + * consistent xmit buffer state. + */ + spin_lock_irq(&port->lock); +- buf = s->tx_dma_addr + (xmit->tail & (UART_XMIT_SIZE - 1)); ++ head = xmit->head; ++ tail = xmit->tail; ++ buf = s->tx_dma_addr + (tail & (UART_XMIT_SIZE - 1)); + s->tx_dma_len = min_t(unsigned int, +- CIRC_CNT(xmit->head, xmit->tail, UART_XMIT_SIZE), +- CIRC_CNT_TO_END(xmit->head, xmit->tail, UART_XMIT_SIZE)); +- spin_unlock_irq(&port->lock); ++ CIRC_CNT(head, tail, UART_XMIT_SIZE), ++ CIRC_CNT_TO_END(head, tail, UART_XMIT_SIZE)); ++ if (!s->tx_dma_len) { ++ /* Transmit buffer has been flushed */ ++ spin_unlock_irq(&port->lock); ++ return; ++ } + + desc = dmaengine_prep_slave_single(chan, buf, s->tx_dma_len, + DMA_MEM_TO_DEV, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + if (!desc) { ++ spin_unlock_irq(&port->lock); + dev_warn(port->dev, "Failed preparing Tx DMA descriptor\n"); + goto switch_to_pio; + } +@@ -1424,18 +1432,18 @@ static void sci_dma_tx_work_fn(struct work_struct *work) + dma_sync_single_for_device(chan->device->dev, buf, s->tx_dma_len, + DMA_TO_DEVICE); + +- spin_lock_irq(&port->lock); + desc->callback = sci_dma_tx_complete; + desc->callback_param = s; +- spin_unlock_irq(&port->lock); + s->cookie_tx = dmaengine_submit(desc); + if (dma_submit_error(s->cookie_tx)) { ++ spin_unlock_irq(&port->lock); + dev_warn(port->dev, "Failed submitting Tx DMA descriptor\n"); + goto switch_to_pio; + } + ++ spin_unlock_irq(&port->lock); + dev_dbg(port->dev, "%s: %p: %d...%d, cookie %d\n", +- __func__, xmit->buf, xmit->tail, xmit->head, s->cookie_tx); ++ __func__, xmit->buf, tail, head, s->cookie_tx); + + dma_async_issue_pending(chan); + return; +@@ -1648,11 +1656,18 @@ static void sci_free_dma(struct uart_port *port) + + static void sci_flush_buffer(struct uart_port *port) + { ++ struct sci_port *s = to_sci_port(port); ++ + /* + * In uart_flush_buffer(), the xmit circular buffer has just been +- * cleared, so we have to reset tx_dma_len accordingly. ++ * cleared, so we have to reset tx_dma_len accordingly, and stop any ++ * pending transfers + */ +- to_sci_port(port)->tx_dma_len = 0; ++ s->tx_dma_len = 0; ++ if (s->chan_tx) { ++ dmaengine_terminate_async(s->chan_tx); ++ s->cookie_tx = -EINVAL; ++ } + } + #else /* !CONFIG_SERIAL_SH_SCI_DMA */ + static inline void sci_request_dma(struct uart_port *port) +diff --git a/drivers/tty/serial/sunhv.c b/drivers/tty/serial/sunhv.c +index 63e34d868de8..f8503f8fc44e 100644 +--- a/drivers/tty/serial/sunhv.c ++++ b/drivers/tty/serial/sunhv.c +@@ -397,7 +397,7 @@ static const struct uart_ops sunhv_pops = { + static struct uart_driver sunhv_reg = { + .owner = THIS_MODULE, + .driver_name = "sunhv", +- .dev_name = "ttyS", ++ .dev_name = "ttyHV", + .major = TTY_MAJOR, + }; + +diff --git a/drivers/tty/serial/xilinx_uartps.c b/drivers/tty/serial/xilinx_uartps.c +index 605354fd60b1..9dcc4d855ddd 100644 +--- a/drivers/tty/serial/xilinx_uartps.c ++++ b/drivers/tty/serial/xilinx_uartps.c +@@ -29,12 +29,12 @@ + + #define CDNS_UART_TTY_NAME "ttyPS" + #define CDNS_UART_NAME "xuartps" +-#define CDNS_UART_MAJOR 0 /* use dynamic node allocation */ + #define CDNS_UART_FIFO_SIZE 64 /* FIFO size */ + #define CDNS_UART_REGISTER_SPACE 0x1000 + + /* Rx Trigger level */ + static int rx_trigger_level = 56; ++static int uartps_major; + module_param(rx_trigger_level, uint, S_IRUGO); + MODULE_PARM_DESC(rx_trigger_level, "Rx trigger level, 1-63 bytes"); + +@@ -1517,7 +1517,7 @@ static int cdns_uart_probe(struct platform_device *pdev) + cdns_uart_uart_driver->owner = THIS_MODULE; + cdns_uart_uart_driver->driver_name = driver_name; + cdns_uart_uart_driver->dev_name = CDNS_UART_TTY_NAME; +- cdns_uart_uart_driver->major = CDNS_UART_MAJOR; ++ cdns_uart_uart_driver->major = uartps_major; + cdns_uart_uart_driver->minor = cdns_uart_data->id; + cdns_uart_uart_driver->nr = 1; + +@@ -1546,6 +1546,7 @@ static int cdns_uart_probe(struct platform_device *pdev) + goto err_out_id; + } + ++ uartps_major = cdns_uart_uart_driver->tty_driver->major; + cdns_uart_data->cdns_uart_driver = cdns_uart_uart_driver; + + /* +diff --git a/drivers/tty/tty_ldsem.c b/drivers/tty/tty_ldsem.c +index 717292c1c0df..60ff236a3d63 100644 +--- a/drivers/tty/tty_ldsem.c ++++ b/drivers/tty/tty_ldsem.c +@@ -93,8 +93,7 @@ static void __ldsem_wake_readers(struct ld_semaphore *sem) + + list_for_each_entry_safe(waiter, next, &sem->read_wait, list) { + tsk = waiter->task; +- smp_mb(); +- waiter->task = NULL; ++ smp_store_release(&waiter->task, NULL); + wake_up_process(tsk); + put_task_struct(tsk); + } +@@ -194,7 +193,7 @@ down_read_failed(struct ld_semaphore *sem, long count, long timeout) + for (;;) { + set_current_state(TASK_UNINTERRUPTIBLE); + +- if (!waiter.task) ++ if (!smp_load_acquire(&waiter.task)) + break; + if (!timeout) + break; +diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c +index fa783531ee88..86130e8d35f9 100644 +--- a/drivers/usb/core/devio.c ++++ b/drivers/usb/core/devio.c +@@ -63,7 +63,7 @@ struct usb_dev_state { + unsigned int discsignr; + struct pid *disc_pid; + const struct cred *cred; +- void __user *disccontext; ++ sigval_t disccontext; + unsigned long ifclaimed; + u32 disabled_bulk_eps; + bool privileges_dropped; +@@ -90,6 +90,7 @@ struct async { + unsigned int ifnum; + void __user *userbuffer; + void __user *userurb; ++ sigval_t userurb_sigval; + struct urb *urb; + struct usb_memory *usbm; + unsigned int mem_usage; +@@ -582,22 +583,19 @@ static void async_completed(struct urb *urb) + { + struct async *as = urb->context; + struct usb_dev_state *ps = as->ps; +- struct kernel_siginfo sinfo; + struct pid *pid = NULL; + const struct cred *cred = NULL; + unsigned long flags; +- int signr; ++ sigval_t addr; ++ int signr, errno; + + spin_lock_irqsave(&ps->lock, flags); + list_move_tail(&as->asynclist, &ps->async_completed); + as->status = urb->status; + signr = as->signr; + if (signr) { +- clear_siginfo(&sinfo); +- sinfo.si_signo = as->signr; +- sinfo.si_errno = as->status; +- sinfo.si_code = SI_ASYNCIO; +- sinfo.si_addr = as->userurb; ++ errno = as->status; ++ addr = as->userurb_sigval; + pid = get_pid(as->pid); + cred = get_cred(as->cred); + } +@@ -615,7 +613,7 @@ static void async_completed(struct urb *urb) + spin_unlock_irqrestore(&ps->lock, flags); + + if (signr) { +- kill_pid_info_as_cred(sinfo.si_signo, &sinfo, pid, cred); ++ kill_pid_usb_asyncio(signr, errno, addr, pid, cred); + put_pid(pid); + put_cred(cred); + } +@@ -1427,7 +1425,7 @@ find_memory_area(struct usb_dev_state *ps, const struct usbdevfs_urb *uurb) + + static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb, + struct usbdevfs_iso_packet_desc __user *iso_frame_desc, +- void __user *arg) ++ void __user *arg, sigval_t userurb_sigval) + { + struct usbdevfs_iso_packet_desc *isopkt = NULL; + struct usb_host_endpoint *ep; +@@ -1727,6 +1725,7 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb + isopkt = NULL; + as->ps = ps; + as->userurb = arg; ++ as->userurb_sigval = userurb_sigval; + if (as->usbm) { + unsigned long uurb_start = (unsigned long)uurb->buffer; + +@@ -1789,8 +1788,6 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb + return 0; + + error: +- if (as && as->usbm) +- dec_usb_memory_use_count(as->usbm, &as->usbm->urb_use_count); + kfree(isopkt); + kfree(dr); + if (as) +@@ -1801,13 +1798,17 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb + static int proc_submiturb(struct usb_dev_state *ps, void __user *arg) + { + struct usbdevfs_urb uurb; ++ sigval_t userurb_sigval; + + if (copy_from_user(&uurb, arg, sizeof(uurb))) + return -EFAULT; + ++ memset(&userurb_sigval, 0, sizeof(userurb_sigval)); ++ userurb_sigval.sival_ptr = arg; ++ + return proc_do_submiturb(ps, &uurb, + (((struct usbdevfs_urb __user *)arg)->iso_frame_desc), +- arg); ++ arg, userurb_sigval); + } + + static int proc_unlinkurb(struct usb_dev_state *ps, void __user *arg) +@@ -1977,7 +1978,7 @@ static int proc_disconnectsignal_compat(struct usb_dev_state *ps, void __user *a + if (copy_from_user(&ds, arg, sizeof(ds))) + return -EFAULT; + ps->discsignr = ds.signr; +- ps->disccontext = compat_ptr(ds.context); ++ ps->disccontext.sival_int = ds.context; + return 0; + } + +@@ -2005,13 +2006,17 @@ static int get_urb32(struct usbdevfs_urb *kurb, + static int proc_submiturb_compat(struct usb_dev_state *ps, void __user *arg) + { + struct usbdevfs_urb uurb; ++ sigval_t userurb_sigval; + + if (get_urb32(&uurb, (struct usbdevfs_urb32 __user *)arg)) + return -EFAULT; + ++ memset(&userurb_sigval, 0, sizeof(userurb_sigval)); ++ userurb_sigval.sival_int = ptr_to_compat(arg); ++ + return proc_do_submiturb(ps, &uurb, + ((struct usbdevfs_urb32 __user *)arg)->iso_frame_desc, +- arg); ++ arg, userurb_sigval); + } + + static int processcompl_compat(struct async *as, void __user * __user *arg) +@@ -2092,7 +2097,7 @@ static int proc_disconnectsignal(struct usb_dev_state *ps, void __user *arg) + if (copy_from_user(&ds, arg, sizeof(ds))) + return -EFAULT; + ps->discsignr = ds.signr; +- ps->disccontext = ds.context; ++ ps->disccontext.sival_ptr = ds.context; + return 0; + } + +@@ -2614,22 +2619,15 @@ const struct file_operations usbdev_file_operations = { + static void usbdev_remove(struct usb_device *udev) + { + struct usb_dev_state *ps; +- struct kernel_siginfo sinfo; + + while (!list_empty(&udev->filelist)) { + ps = list_entry(udev->filelist.next, struct usb_dev_state, list); + destroy_all_async(ps); + wake_up_all(&ps->wait); + list_del_init(&ps->list); +- if (ps->discsignr) { +- clear_siginfo(&sinfo); +- sinfo.si_signo = ps->discsignr; +- sinfo.si_errno = EPIPE; +- sinfo.si_code = SI_ASYNCIO; +- sinfo.si_addr = ps->disccontext; +- kill_pid_info_as_cred(ps->discsignr, &sinfo, +- ps->disc_pid, ps->cred); +- } ++ if (ps->discsignr) ++ kill_pid_usb_asyncio(ps->discsignr, EPIPE, ps->disccontext, ++ ps->disc_pid, ps->cred); + } + } + +diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c +index 2f94568ba385..2844366dc173 100644 +--- a/drivers/usb/core/hub.c ++++ b/drivers/usb/core/hub.c +@@ -3617,6 +3617,7 @@ static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port, + struct usb_device *hdev; + struct usb_device *udev; + int connect_change = 0; ++ u16 link_state; + int ret; + + hdev = hub->hdev; +@@ -3626,9 +3627,11 @@ static int hub_handle_remote_wakeup(struct usb_hub *hub, unsigned int port, + return 0; + usb_clear_port_feature(hdev, port, USB_PORT_FEAT_C_SUSPEND); + } else { ++ link_state = portstatus & USB_PORT_STAT_LINK_STATE; + if (!udev || udev->state != USB_STATE_SUSPENDED || +- (portstatus & USB_PORT_STAT_LINK_STATE) != +- USB_SS_PORT_LS_U0) ++ (link_state != USB_SS_PORT_LS_U0 && ++ link_state != USB_SS_PORT_LS_U1 && ++ link_state != USB_SS_PORT_LS_U2)) + return 0; + } + +@@ -3999,6 +4002,9 @@ static int usb_set_lpm_timeout(struct usb_device *udev, + * control transfers to set the hub timeout or enable device-initiated U1/U2 + * will be successful. + * ++ * If the control transfer to enable device-initiated U1/U2 entry fails, then ++ * hub-initiated U1/U2 will be disabled. ++ * + * If we cannot set the parent hub U1/U2 timeout, we attempt to let the xHCI + * driver know about it. If that call fails, it should be harmless, and just + * take up more slightly more bus bandwidth for unnecessary U1/U2 exit latency. +@@ -4053,23 +4059,24 @@ static void usb_enable_link_state(struct usb_hcd *hcd, struct usb_device *udev, + * host know that this link state won't be enabled. + */ + hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state); +- } else { +- /* Only a configured device will accept the Set Feature +- * U1/U2_ENABLE +- */ +- if (udev->actconfig) +- usb_set_device_initiated_lpm(udev, state, true); ++ return; ++ } + +- /* As soon as usb_set_lpm_timeout(timeout) returns 0, the +- * hub-initiated LPM is enabled. Thus, LPM is enabled no +- * matter the result of usb_set_device_initiated_lpm(). +- * The only difference is whether device is able to initiate +- * LPM. +- */ ++ /* Only a configured device will accept the Set Feature ++ * U1/U2_ENABLE ++ */ ++ if (udev->actconfig && ++ usb_set_device_initiated_lpm(udev, state, true) == 0) { + if (state == USB3_LPM_U1) + udev->usb3_lpm_u1_enabled = 1; + else if (state == USB3_LPM_U2) + udev->usb3_lpm_u2_enabled = 1; ++ } else { ++ /* Don't request U1/U2 entry if the device ++ * cannot transition to U1/U2. ++ */ ++ usb_set_lpm_timeout(udev, state, 0); ++ hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state); + } + } + +diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c +index 8b499d643461..8e41d70fd298 100644 +--- a/drivers/usb/dwc2/core.c ++++ b/drivers/usb/dwc2/core.c +@@ -531,7 +531,7 @@ int dwc2_core_reset(struct dwc2_hsotg *hsotg, bool skip_wait) + } + + /* Wait for AHB master IDLE state */ +- if (dwc2_hsotg_wait_bit_set(hsotg, GRSTCTL, GRSTCTL_AHBIDLE, 50)) { ++ if (dwc2_hsotg_wait_bit_set(hsotg, GRSTCTL, GRSTCTL_AHBIDLE, 10000)) { + dev_warn(hsotg->dev, "%s: HANG! AHB Idle timeout GRSTCTL GRSTCTL_AHBIDLE\n", + __func__); + return -EBUSY; +diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c +index 4aff1d8dbc4f..6e9e172010fc 100644 +--- a/drivers/usb/dwc3/core.c ++++ b/drivers/usb/dwc3/core.c +@@ -1423,11 +1423,6 @@ static int dwc3_probe(struct platform_device *pdev) + dwc->regs = regs; + dwc->regs_size = resource_size(&dwc_res); + +- if (!dwc3_core_is_valid(dwc)) { +- dev_err(dwc->dev, "this is not a DesignWare USB3 DRD Core\n"); +- return -ENODEV; +- } +- + dwc3_get_properties(dwc); + + dwc->reset = devm_reset_control_get_optional_shared(dev, NULL); +@@ -1460,6 +1455,12 @@ static int dwc3_probe(struct platform_device *pdev) + if (ret) + goto unprepare_clks; + ++ if (!dwc3_core_is_valid(dwc)) { ++ dev_err(dwc->dev, "this is not a DesignWare USB3 DRD Core\n"); ++ ret = -ENODEV; ++ goto disable_clks; ++ } ++ + platform_set_drvdata(pdev, dwc); + dwc3_cache_hwparams(dwc); + +@@ -1525,6 +1526,7 @@ static int dwc3_probe(struct platform_device *pdev) + pm_runtime_put_sync(&pdev->dev); + pm_runtime_disable(&pdev->dev); + ++disable_clks: + clk_bulk_disable(dwc->num_clks, dwc->clks); + unprepare_clks: + clk_bulk_unprepare(dwc->num_clks, dwc->clks); +diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c +index 47be961f1bf3..213ff03c8a9f 100644 +--- a/drivers/usb/gadget/function/f_fs.c ++++ b/drivers/usb/gadget/function/f_fs.c +@@ -997,7 +997,6 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) + * earlier + */ + gadget = epfile->ffs->gadget; +- io_data->use_sg = gadget->sg_supported && data_len > PAGE_SIZE; + + spin_lock_irq(&epfile->ffs->eps_lock); + /* In the meantime, endpoint got disabled or changed. */ +@@ -1012,6 +1011,8 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data) + */ + if (io_data->read) + data_len = usb_ep_align_maybe(gadget, ep->ep, data_len); ++ ++ io_data->use_sg = gadget->sg_supported && data_len > PAGE_SIZE; + spin_unlock_irq(&epfile->ffs->eps_lock); + + data = ffs_alloc_buffer(io_data, data_len); +@@ -1182,11 +1183,12 @@ static ssize_t ffs_epfile_write_iter(struct kiocb *kiocb, struct iov_iter *from) + ENTER(); + + if (!is_sync_kiocb(kiocb)) { +- p = kmalloc(sizeof(io_data), GFP_KERNEL); ++ p = kzalloc(sizeof(io_data), GFP_KERNEL); + if (unlikely(!p)) + return -ENOMEM; + p->aio = true; + } else { ++ memset(p, 0, sizeof(*p)); + p->aio = false; + } + +@@ -1218,11 +1220,12 @@ static ssize_t ffs_epfile_read_iter(struct kiocb *kiocb, struct iov_iter *to) + ENTER(); + + if (!is_sync_kiocb(kiocb)) { +- p = kmalloc(sizeof(io_data), GFP_KERNEL); ++ p = kzalloc(sizeof(io_data), GFP_KERNEL); + if (unlikely(!p)) + return -ENOMEM; + p->aio = true; + } else { ++ memset(p, 0, sizeof(*p)); + p->aio = false; + } + +diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c +index 737bd77a575d..2929bb47a618 100644 +--- a/drivers/usb/gadget/function/u_ether.c ++++ b/drivers/usb/gadget/function/u_ether.c +@@ -186,11 +186,12 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags) + out = dev->port_usb->out_ep; + else + out = NULL; +- spin_unlock_irqrestore(&dev->lock, flags); + + if (!out) ++ { ++ spin_unlock_irqrestore(&dev->lock, flags); + return -ENOTCONN; +- ++ } + + /* Padding up to RX_EXTRA handles minor disagreements with host. + * Normally we use the USB "terminate on short read" convention; +@@ -214,6 +215,7 @@ rx_submit(struct eth_dev *dev, struct usb_request *req, gfp_t gfp_flags) + + if (dev->port_usb->is_fixed) + size = max_t(size_t, size, dev->port_usb->fixed_out_len); ++ spin_unlock_irqrestore(&dev->lock, flags); + + skb = __netdev_alloc_skb(dev->net, size + NET_IP_ALIGN, gfp_flags); + if (skb == NULL) { +diff --git a/drivers/usb/host/hwa-hc.c b/drivers/usb/host/hwa-hc.c +index 09a8ebd95588..6968b9f2b76b 100644 +--- a/drivers/usb/host/hwa-hc.c ++++ b/drivers/usb/host/hwa-hc.c +@@ -159,7 +159,7 @@ static int hwahc_op_start(struct usb_hcd *usb_hcd) + return result; + + error_set_cluster_id: +- wusb_cluster_id_put(wusbhc->cluster_id); ++ wusb_cluster_id_put(addr); + error_cluster_id_get: + goto out; + +diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c +index 3ce71cbfbb58..ad05c27b3a7b 100644 +--- a/drivers/usb/host/pci-quirks.c ++++ b/drivers/usb/host/pci-quirks.c +@@ -205,7 +205,7 @@ int usb_amd_find_chipset_info(void) + { + unsigned long flags; + struct amd_chipset_info info; +- int ret; ++ int need_pll_quirk = 0; + + spin_lock_irqsave(&amd_lock, flags); + +@@ -219,21 +219,28 @@ int usb_amd_find_chipset_info(void) + spin_unlock_irqrestore(&amd_lock, flags); + + if (!amd_chipset_sb_type_init(&info)) { +- ret = 0; + goto commit; + } + +- /* Below chipset generations needn't enable AMD PLL quirk */ +- if (info.sb_type.gen == AMD_CHIPSET_UNKNOWN || +- info.sb_type.gen == AMD_CHIPSET_SB600 || +- info.sb_type.gen == AMD_CHIPSET_YANGTZE || +- (info.sb_type.gen == AMD_CHIPSET_SB700 && +- info.sb_type.rev > 0x3b)) { ++ switch (info.sb_type.gen) { ++ case AMD_CHIPSET_SB700: ++ need_pll_quirk = info.sb_type.rev <= 0x3B; ++ break; ++ case AMD_CHIPSET_SB800: ++ case AMD_CHIPSET_HUDSON2: ++ case AMD_CHIPSET_BOLTON: ++ need_pll_quirk = 1; ++ break; ++ default: ++ need_pll_quirk = 0; ++ break; ++ } ++ ++ if (!need_pll_quirk) { + if (info.smbus_dev) { + pci_dev_put(info.smbus_dev); + info.smbus_dev = NULL; + } +- ret = 0; + goto commit; + } + +@@ -252,7 +259,7 @@ int usb_amd_find_chipset_info(void) + } + } + +- ret = info.probe_result = 1; ++ need_pll_quirk = info.probe_result = 1; + printk(KERN_DEBUG "QUIRK: Enable AMD PLL fix\n"); + + commit: +@@ -263,7 +270,7 @@ int usb_amd_find_chipset_info(void) + + /* Mark that we where here */ + amd_chipset.probe_count++; +- ret = amd_chipset.probe_result; ++ need_pll_quirk = amd_chipset.probe_result; + + spin_unlock_irqrestore(&amd_lock, flags); + +@@ -277,7 +284,7 @@ int usb_amd_find_chipset_info(void) + spin_unlock_irqrestore(&amd_lock, flags); + } + +- return ret; ++ return need_pll_quirk; + } + EXPORT_SYMBOL_GPL(usb_amd_find_chipset_info); + +diff --git a/drivers/usb/host/xhci-rcar.c b/drivers/usb/host/xhci-rcar.c +index 671bce18782c..8616c52849c6 100644 +--- a/drivers/usb/host/xhci-rcar.c ++++ b/drivers/usb/host/xhci-rcar.c +@@ -238,10 +238,15 @@ int xhci_rcar_init_quirk(struct usb_hcd *hcd) + * pointers. So, this driver clears the AC64 bit of xhci->hcc_params + * to call dma_set_coherent_mask(dev, DMA_BIT_MASK(32)) in + * xhci_gen_setup(). ++ * ++ * And, since the firmware/internal CPU control the USBSTS.STS_HALT ++ * and the process speed is down when the roothub port enters U3, ++ * long delay for the handshake of STS_HALT is neeed in xhci_suspend(). + */ + if (xhci_rcar_is_gen2(hcd->self.controller) || +- xhci_rcar_is_gen3(hcd->self.controller)) +- xhci->quirks |= XHCI_NO_64BIT_SUPPORT; ++ xhci_rcar_is_gen3(hcd->self.controller)) { ++ xhci->quirks |= XHCI_NO_64BIT_SUPPORT | XHCI_SLOW_SUSPEND; ++ } + + if (!xhci_rcar_wait_for_pll_active(hcd)) + return -ETIMEDOUT; +diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h +index 92e764c54154..fabbce1c542a 100644 +--- a/drivers/usb/host/xhci.h ++++ b/drivers/usb/host/xhci.h +@@ -2170,7 +2170,8 @@ static inline bool xhci_urb_suitable_for_idt(struct urb *urb) + if (!usb_endpoint_xfer_isoc(&urb->ep->desc) && usb_urb_dir_out(urb) && + usb_endpoint_maxp(&urb->ep->desc) >= TRB_IDT_MAX_SIZE && + urb->transfer_buffer_length <= TRB_IDT_MAX_SIZE && +- !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP)) ++ !(urb->transfer_flags & URB_NO_TRANSFER_DMA_MAP) && ++ !urb->num_sgs) + return true; + + return false; +diff --git a/drivers/usb/misc/iowarrior.c b/drivers/usb/misc/iowarrior.c +index ba05dd80a020..f5bed9f29e56 100644 +--- a/drivers/usb/misc/iowarrior.c ++++ b/drivers/usb/misc/iowarrior.c +@@ -866,19 +866,20 @@ static void iowarrior_disconnect(struct usb_interface *interface) + dev = usb_get_intfdata(interface); + mutex_lock(&iowarrior_open_disc_lock); + usb_set_intfdata(interface, NULL); ++ /* prevent device read, write and ioctl */ ++ dev->present = 0; + + minor = dev->minor; ++ mutex_unlock(&iowarrior_open_disc_lock); ++ /* give back our minor - this will call close() locks need to be dropped at this point*/ + +- /* give back our minor */ + usb_deregister_dev(interface, &iowarrior_class); + + mutex_lock(&dev->mutex); + + /* prevent device read, write and ioctl */ +- dev->present = 0; + + mutex_unlock(&dev->mutex); +- mutex_unlock(&iowarrior_open_disc_lock); + + if (dev->opened) { + /* There is a process that holds a filedescriptor to the device , +diff --git a/drivers/usb/misc/rio500.c b/drivers/usb/misc/rio500.c +index 27e9c78a791e..a32d61a79ab8 100644 +--- a/drivers/usb/misc/rio500.c ++++ b/drivers/usb/misc/rio500.c +@@ -51,6 +51,7 @@ struct rio_usb_data { + char *obuf, *ibuf; /* transfer buffers */ + char bulk_in_ep, bulk_out_ep; /* Endpoint assignments */ + wait_queue_head_t wait_q; /* for timeouts */ ++ struct mutex lock; /* general race avoidance */ + }; + + static DEFINE_MUTEX(rio500_mutex); +@@ -62,8 +63,10 @@ static int open_rio(struct inode *inode, struct file *file) + + /* against disconnect() */ + mutex_lock(&rio500_mutex); ++ mutex_lock(&(rio->lock)); + + if (rio->isopen || !rio->present) { ++ mutex_unlock(&(rio->lock)); + mutex_unlock(&rio500_mutex); + return -EBUSY; + } +@@ -71,6 +74,7 @@ static int open_rio(struct inode *inode, struct file *file) + + init_waitqueue_head(&rio->wait_q); + ++ mutex_unlock(&(rio->lock)); + + dev_info(&rio->rio_dev->dev, "Rio opened.\n"); + mutex_unlock(&rio500_mutex); +@@ -84,6 +88,7 @@ static int close_rio(struct inode *inode, struct file *file) + + /* against disconnect() */ + mutex_lock(&rio500_mutex); ++ mutex_lock(&(rio->lock)); + + rio->isopen = 0; + if (!rio->present) { +@@ -95,6 +100,7 @@ static int close_rio(struct inode *inode, struct file *file) + } else { + dev_info(&rio->rio_dev->dev, "Rio closed.\n"); + } ++ mutex_unlock(&(rio->lock)); + mutex_unlock(&rio500_mutex); + return 0; + } +@@ -109,7 +115,7 @@ static long ioctl_rio(struct file *file, unsigned int cmd, unsigned long arg) + int retries; + int retval=0; + +- mutex_lock(&rio500_mutex); ++ mutex_lock(&(rio->lock)); + /* Sanity check to make sure rio is connected, powered, etc */ + if (rio->present == 0 || rio->rio_dev == NULL) { + retval = -ENODEV; +@@ -253,7 +259,7 @@ static long ioctl_rio(struct file *file, unsigned int cmd, unsigned long arg) + + + err_out: +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + return retval; + } + +@@ -273,12 +279,12 @@ write_rio(struct file *file, const char __user *buffer, + int errn = 0; + int intr; + +- intr = mutex_lock_interruptible(&rio500_mutex); ++ intr = mutex_lock_interruptible(&(rio->lock)); + if (intr) + return -EINTR; + /* Sanity check to make sure rio is connected, powered, etc */ + if (rio->present == 0 || rio->rio_dev == NULL) { +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + return -ENODEV; + } + +@@ -301,7 +307,7 @@ write_rio(struct file *file, const char __user *buffer, + goto error; + } + if (signal_pending(current)) { +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + return bytes_written ? bytes_written : -EINTR; + } + +@@ -339,12 +345,12 @@ write_rio(struct file *file, const char __user *buffer, + buffer += copy_size; + } while (count > 0); + +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + + return bytes_written ? bytes_written : -EIO; + + error: +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + return errn; + } + +@@ -361,12 +367,12 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos) + char *ibuf; + int intr; + +- intr = mutex_lock_interruptible(&rio500_mutex); ++ intr = mutex_lock_interruptible(&(rio->lock)); + if (intr) + return -EINTR; + /* Sanity check to make sure rio is connected, powered, etc */ + if (rio->present == 0 || rio->rio_dev == NULL) { +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + return -ENODEV; + } + +@@ -377,11 +383,11 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos) + + while (count > 0) { + if (signal_pending(current)) { +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + return read_count ? read_count : -EINTR; + } + if (!rio->rio_dev) { +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + return -ENODEV; + } + this_read = (count >= IBUF_SIZE) ? IBUF_SIZE : count; +@@ -399,7 +405,7 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos) + count = this_read = partial; + } else if (result == -ETIMEDOUT || result == 15) { /* FIXME: 15 ??? */ + if (!maxretry--) { +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + dev_err(&rio->rio_dev->dev, + "read_rio: maxretry timeout\n"); + return -ETIME; +@@ -409,19 +415,19 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos) + finish_wait(&rio->wait_q, &wait); + continue; + } else if (result != -EREMOTEIO) { +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + dev_err(&rio->rio_dev->dev, + "Read Whoops - result:%d partial:%u this_read:%u\n", + result, partial, this_read); + return -EIO; + } else { +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + return (0); + } + + if (this_read) { + if (copy_to_user(buffer, ibuf, this_read)) { +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + return -EFAULT; + } + count -= this_read; +@@ -429,7 +435,7 @@ read_rio(struct file *file, char __user *buffer, size_t count, loff_t * ppos) + buffer += this_read; + } + } +- mutex_unlock(&rio500_mutex); ++ mutex_unlock(&(rio->lock)); + return read_count; + } + +@@ -494,6 +500,8 @@ static int probe_rio(struct usb_interface *intf, + } + dev_dbg(&intf->dev, "ibuf address:%p\n", rio->ibuf); + ++ mutex_init(&(rio->lock)); ++ + usb_set_intfdata (intf, rio); + rio->present = 1; + bail_out: +@@ -511,10 +519,12 @@ static void disconnect_rio(struct usb_interface *intf) + if (rio) { + usb_deregister_dev(intf, &usb_rio_class); + ++ mutex_lock(&(rio->lock)); + if (rio->isopen) { + rio->isopen = 0; + /* better let it finish - the release will do whats needed */ + rio->rio_dev = NULL; ++ mutex_unlock(&(rio->lock)); + mutex_unlock(&rio500_mutex); + return; + } +@@ -524,6 +534,7 @@ static void disconnect_rio(struct usb_interface *intf) + dev_info(&intf->dev, "USB Rio disconnected.\n"); + + rio->present = 0; ++ mutex_unlock(&(rio->lock)); + } + mutex_unlock(&rio500_mutex); + } +diff --git a/drivers/usb/misc/usb251xb.c b/drivers/usb/misc/usb251xb.c +index 4d6ae3795a88..6ca9111d150a 100644 +--- a/drivers/usb/misc/usb251xb.c ++++ b/drivers/usb/misc/usb251xb.c +@@ -375,7 +375,8 @@ static int usb251xb_connect(struct usb251xb *hub) + + #ifdef CONFIG_OF + static void usb251xb_get_ports_field(struct usb251xb *hub, +- const char *prop_name, u8 port_cnt, u8 *fld) ++ const char *prop_name, u8 port_cnt, ++ bool ds_only, u8 *fld) + { + struct device *dev = hub->dev; + struct property *prop; +@@ -383,7 +384,7 @@ static void usb251xb_get_ports_field(struct usb251xb *hub, + u32 port; + + of_property_for_each_u32(dev->of_node, prop_name, prop, p, port) { +- if ((port >= 1) && (port <= port_cnt)) ++ if ((port >= ds_only ? 1 : 0) && (port <= port_cnt)) + *fld |= BIT(port); + else + dev_warn(dev, "port %u doesn't exist\n", port); +@@ -501,15 +502,15 @@ static int usb251xb_get_ofdata(struct usb251xb *hub, + + hub->non_rem_dev = USB251XB_DEF_NON_REMOVABLE_DEVICES; + usb251xb_get_ports_field(hub, "non-removable-ports", data->port_cnt, +- &hub->non_rem_dev); ++ true, &hub->non_rem_dev); + + hub->port_disable_sp = USB251XB_DEF_PORT_DISABLE_SELF; + usb251xb_get_ports_field(hub, "sp-disabled-ports", data->port_cnt, +- &hub->port_disable_sp); ++ true, &hub->port_disable_sp); + + hub->port_disable_bp = USB251XB_DEF_PORT_DISABLE_BUS; + usb251xb_get_ports_field(hub, "bp-disabled-ports", data->port_cnt, +- &hub->port_disable_bp); ++ true, &hub->port_disable_bp); + + hub->max_power_sp = USB251XB_DEF_MAX_POWER_SELF; + if (!of_property_read_u32(np, "sp-max-total-current-microamp", +@@ -573,9 +574,7 @@ static int usb251xb_get_ofdata(struct usb251xb *hub, + */ + hub->port_swap = USB251XB_DEF_PORT_SWAP; + usb251xb_get_ports_field(hub, "swap-dx-lanes", data->port_cnt, +- &hub->port_swap); +- if (of_get_property(np, "swap-us-lanes", NULL)) +- hub->port_swap |= BIT(0); ++ false, &hub->port_swap); + + /* The following parameters are currently not exposed to devicetree, but + * may be as soon as needed. +diff --git a/drivers/usb/misc/yurex.c b/drivers/usb/misc/yurex.c +index 7b306aa22d25..6715a128e6c8 100644 +--- a/drivers/usb/misc/yurex.c ++++ b/drivers/usb/misc/yurex.c +@@ -92,7 +92,6 @@ static void yurex_delete(struct kref *kref) + + dev_dbg(&dev->interface->dev, "%s\n", __func__); + +- usb_put_dev(dev->udev); + if (dev->cntl_urb) { + usb_kill_urb(dev->cntl_urb); + kfree(dev->cntl_req); +@@ -108,6 +107,7 @@ static void yurex_delete(struct kref *kref) + dev->int_buffer, dev->urb->transfer_dma); + usb_free_urb(dev->urb); + } ++ usb_put_dev(dev->udev); + kfree(dev); + } + +diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c +index 39fa2fc1b8b7..6036cbae8c78 100644 +--- a/drivers/usb/renesas_usbhs/fifo.c ++++ b/drivers/usb/renesas_usbhs/fifo.c +@@ -802,9 +802,8 @@ static int __usbhsf_dma_map_ctrl(struct usbhs_pkt *pkt, int map) + } + + static void usbhsf_dma_complete(void *arg); +-static void xfer_work(struct work_struct *work) ++static void usbhsf_dma_xfer_preparing(struct usbhs_pkt *pkt) + { +- struct usbhs_pkt *pkt = container_of(work, struct usbhs_pkt, work); + struct usbhs_pipe *pipe = pkt->pipe; + struct usbhs_fifo *fifo; + struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); +@@ -812,12 +811,10 @@ static void xfer_work(struct work_struct *work) + struct dma_chan *chan; + struct device *dev = usbhs_priv_to_dev(priv); + enum dma_transfer_direction dir; +- unsigned long flags; + +- usbhs_lock(priv, flags); + fifo = usbhs_pipe_to_fifo(pipe); + if (!fifo) +- goto xfer_work_end; ++ return; + + chan = usbhsf_dma_chan_get(fifo, pkt); + dir = usbhs_pipe_is_dir_in(pipe) ? DMA_DEV_TO_MEM : DMA_MEM_TO_DEV; +@@ -826,7 +823,7 @@ static void xfer_work(struct work_struct *work) + pkt->trans, dir, + DMA_PREP_INTERRUPT | DMA_CTRL_ACK); + if (!desc) +- goto xfer_work_end; ++ return; + + desc->callback = usbhsf_dma_complete; + desc->callback_param = pipe; +@@ -834,7 +831,7 @@ static void xfer_work(struct work_struct *work) + pkt->cookie = dmaengine_submit(desc); + if (pkt->cookie < 0) { + dev_err(dev, "Failed to submit dma descriptor\n"); +- goto xfer_work_end; ++ return; + } + + dev_dbg(dev, " %s %d (%d/ %d)\n", +@@ -845,8 +842,17 @@ static void xfer_work(struct work_struct *work) + dma_async_issue_pending(chan); + usbhsf_dma_start(pipe, fifo); + usbhs_pipe_enable(pipe); ++} ++ ++static void xfer_work(struct work_struct *work) ++{ ++ struct usbhs_pkt *pkt = container_of(work, struct usbhs_pkt, work); ++ struct usbhs_pipe *pipe = pkt->pipe; ++ struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); ++ unsigned long flags; + +-xfer_work_end: ++ usbhs_lock(priv, flags); ++ usbhsf_dma_xfer_preparing(pkt); + usbhs_unlock(priv, flags); + } + +@@ -899,8 +905,13 @@ static int usbhsf_dma_prepare_push(struct usbhs_pkt *pkt, int *is_done) + pkt->trans = len; + + usbhsf_tx_irq_ctrl(pipe, 0); +- INIT_WORK(&pkt->work, xfer_work); +- schedule_work(&pkt->work); ++ /* FIXME: Workaound for usb dmac that driver can be used in atomic */ ++ if (usbhs_get_dparam(priv, has_usb_dmac)) { ++ usbhsf_dma_xfer_preparing(pkt); ++ } else { ++ INIT_WORK(&pkt->work, xfer_work); ++ schedule_work(&pkt->work); ++ } + + return 0; + +@@ -1006,8 +1017,7 @@ static int usbhsf_dma_prepare_pop_with_usb_dmac(struct usbhs_pkt *pkt, + + pkt->trans = pkt->length; + +- INIT_WORK(&pkt->work, xfer_work); +- schedule_work(&pkt->work); ++ usbhsf_dma_xfer_preparing(pkt); + + return 0; + +diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c +index 1d8461ae2c34..23669a584bae 100644 +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -1029,6 +1029,7 @@ static const struct usb_device_id id_table_combined[] = { + { USB_DEVICE(AIRBUS_DS_VID, AIRBUS_DS_P8GR) }, + /* EZPrototypes devices */ + { USB_DEVICE(EZPROTOTYPES_VID, HJELMSLUND_USB485_ISO_PID) }, ++ { USB_DEVICE_INTERFACE_NUMBER(UNJO_VID, UNJO_ISODEBUG_V1_PID, 1) }, + { } /* Terminating entry */ + }; + +diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h +index 5755f0df0025..f12d806220b4 100644 +--- a/drivers/usb/serial/ftdi_sio_ids.h ++++ b/drivers/usb/serial/ftdi_sio_ids.h +@@ -1543,3 +1543,9 @@ + #define CHETCO_SEASMART_DISPLAY_PID 0xA5AD /* SeaSmart NMEA2000 Display */ + #define CHETCO_SEASMART_LITE_PID 0xA5AE /* SeaSmart Lite USB Adapter */ + #define CHETCO_SEASMART_ANALOG_PID 0xA5AF /* SeaSmart Analog Adapter */ ++ ++/* ++ * Unjo AB ++ */ ++#define UNJO_VID 0x22B7 ++#define UNJO_ISODEBUG_V1_PID 0x150D +diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c +index a0aaf0635359..c1582fbd1150 100644 +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -1343,6 +1343,7 @@ static const struct usb_device_id option_ids[] = { + .driver_info = RSVD(4) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0414, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0417, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_INTERFACE_CLASS(ZTE_VENDOR_ID, 0x0601, 0xff) }, /* GosunCn ZTE WeLink ME3630 (RNDIS mode) */ + { USB_DEVICE_INTERFACE_CLASS(ZTE_VENDOR_ID, 0x0602, 0xff) }, /* GosunCn ZTE WeLink ME3630 (MBIM mode) */ + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), + .driver_info = RSVD(4) }, +diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c +index 59190d88fa9f..556bb4fa0bee 100644 +--- a/drivers/usb/storage/scsiglue.c ++++ b/drivers/usb/storage/scsiglue.c +@@ -28,6 +28,8 @@ + * status of a command. + */ + ++#include ++#include + #include + #include + +@@ -99,6 +101,7 @@ static int slave_alloc (struct scsi_device *sdev) + static int slave_configure(struct scsi_device *sdev) + { + struct us_data *us = host_to_us(sdev->host); ++ struct device *dev = us->pusb_dev->bus->sysdev; + + /* + * Many devices have trouble transferring more than 32KB at a time, +@@ -128,6 +131,14 @@ static int slave_configure(struct scsi_device *sdev) + blk_queue_max_hw_sectors(sdev->request_queue, 2048); + } + ++ /* ++ * The max_hw_sectors should be up to maximum size of a mapping for ++ * the device. Otherwise, a DMA API might fail on swiotlb environment. ++ */ ++ blk_queue_max_hw_sectors(sdev->request_queue, ++ min_t(size_t, queue_max_hw_sectors(sdev->request_queue), ++ dma_max_mapping_size(dev) >> SECTOR_SHIFT)); ++ + /* + * Some USB host controllers can't do DMA; they have to use PIO. + * They indicate this by setting their dma_mask to NULL. For +diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c +index fba32d84e578..15abe1d9958f 100644 +--- a/drivers/usb/typec/tcpm/tcpm.c ++++ b/drivers/usb/typec/tcpm/tcpm.c +@@ -379,7 +379,8 @@ static enum tcpm_state tcpm_default_state(struct tcpm_port *port) + return SNK_UNATTACHED; + else if (port->try_role == TYPEC_SOURCE) + return SRC_UNATTACHED; +- else if (port->tcpc->config->default_role == TYPEC_SINK) ++ else if (port->tcpc->config && ++ port->tcpc->config->default_role == TYPEC_SINK) + return SNK_UNATTACHED; + /* Fall through to return SRC_UNATTACHED */ + } else if (port->port_type == TYPEC_PORT_SNK) { +@@ -586,7 +587,20 @@ static void tcpm_debugfs_init(struct tcpm_port *port) + + static void tcpm_debugfs_exit(struct tcpm_port *port) + { ++ int i; ++ ++ mutex_lock(&port->logbuffer_lock); ++ for (i = 0; i < LOG_BUFFER_ENTRIES; i++) { ++ kfree(port->logbuffer[i]); ++ port->logbuffer[i] = NULL; ++ } ++ mutex_unlock(&port->logbuffer_lock); ++ + debugfs_remove(port->dentry); ++ if (list_empty(&rootdir->d_subdirs)) { ++ debugfs_remove(rootdir); ++ rootdir = NULL; ++ } + } + + #else +@@ -1095,7 +1109,8 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt, + break; + case CMD_ATTENTION: + /* Attention command does not have response */ +- typec_altmode_attention(adev, p[1]); ++ if (adev) ++ typec_altmode_attention(adev, p[1]); + return 0; + default: + break; +@@ -1147,20 +1162,26 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt, + } + break; + case CMD_ENTER_MODE: +- typec_altmode_update_active(pdev, true); +- +- if (typec_altmode_vdm(adev, p[0], &p[1], cnt)) { +- response[0] = VDO(adev->svid, 1, CMD_EXIT_MODE); +- response[0] |= VDO_OPOS(adev->mode); +- return 1; ++ if (adev && pdev) { ++ typec_altmode_update_active(pdev, true); ++ ++ if (typec_altmode_vdm(adev, p[0], &p[1], cnt)) { ++ response[0] = VDO(adev->svid, 1, ++ CMD_EXIT_MODE); ++ response[0] |= VDO_OPOS(adev->mode); ++ return 1; ++ } + } + return 0; + case CMD_EXIT_MODE: +- typec_altmode_update_active(pdev, false); ++ if (adev && pdev) { ++ typec_altmode_update_active(pdev, false); + +- /* Back to USB Operation */ +- WARN_ON(typec_altmode_notify(adev, TYPEC_STATE_USB, +- NULL)); ++ /* Back to USB Operation */ ++ WARN_ON(typec_altmode_notify(adev, ++ TYPEC_STATE_USB, ++ NULL)); ++ } + break; + default: + break; +@@ -1170,8 +1191,10 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt, + switch (cmd) { + case CMD_ENTER_MODE: + /* Back to USB Operation */ +- WARN_ON(typec_altmode_notify(adev, TYPEC_STATE_USB, +- NULL)); ++ if (adev) ++ WARN_ON(typec_altmode_notify(adev, ++ TYPEC_STATE_USB, ++ NULL)); + break; + default: + break; +@@ -1182,7 +1205,8 @@ static int tcpm_pd_svdm(struct tcpm_port *port, const __le32 *payload, int cnt, + } + + /* Informing the alternate mode drivers about everything */ +- typec_altmode_vdm(adev, p[0], &p[1], cnt); ++ if (adev) ++ typec_altmode_vdm(adev, p[0], &p[1], cnt); + + return rlen; + } +@@ -4114,7 +4138,7 @@ static int tcpm_try_role(const struct typec_capability *cap, int role) + mutex_lock(&port->lock); + if (tcpc->try_role) + ret = tcpc->try_role(tcpc, role); +- if (!ret && !tcpc->config->try_role_hw) ++ if (!ret && (!tcpc->config || !tcpc->config->try_role_hw)) + port->try_role = role; + port->try_src_count = 0; + port->try_snk_count = 0; +@@ -4701,7 +4725,7 @@ static int tcpm_copy_caps(struct tcpm_port *port, + port->typec_caps.prefer_role = tcfg->default_role; + port->typec_caps.type = tcfg->type; + port->typec_caps.data = tcfg->data; +- port->self_powered = port->tcpc->config->self_powered; ++ port->self_powered = tcfg->self_powered; + + return 0; + } +diff --git a/drivers/usb/typec/tps6598x.c b/drivers/usb/typec/tps6598x.c +index c674abe3cf99..a38d1409f15b 100644 +--- a/drivers/usb/typec/tps6598x.c ++++ b/drivers/usb/typec/tps6598x.c +@@ -41,7 +41,7 @@ + #define TPS_STATUS_VCONN(s) (!!((s) & BIT(7))) + + /* TPS_REG_SYSTEM_CONF bits */ +-#define TPS_SYSCONF_PORTINFO(c) ((c) & 3) ++#define TPS_SYSCONF_PORTINFO(c) ((c) & 7) + + enum { + TPS_PORTINFO_SINK, +@@ -127,7 +127,7 @@ tps6598x_block_read(struct tps6598x *tps, u8 reg, void *val, size_t len) + } + + static int tps6598x_block_write(struct tps6598x *tps, u8 reg, +- void *val, size_t len) ++ const void *val, size_t len) + { + u8 data[TPS_MAX_LEN + 1]; + +@@ -173,7 +173,7 @@ static inline int tps6598x_write64(struct tps6598x *tps, u8 reg, u64 val) + static inline int + tps6598x_write_4cc(struct tps6598x *tps, u8 reg, const char *val) + { +- return tps6598x_block_write(tps, reg, &val, sizeof(u32)); ++ return tps6598x_block_write(tps, reg, val, 4); + } + + static int tps6598x_read_partner_identity(struct tps6598x *tps) +diff --git a/drivers/usb/typec/ucsi/ucsi_ccg.c b/drivers/usb/typec/ucsi/ucsi_ccg.c +index bf63074675fc..c274a36c2fe4 100644 +--- a/drivers/usb/typec/ucsi/ucsi_ccg.c ++++ b/drivers/usb/typec/ucsi/ucsi_ccg.c +@@ -963,7 +963,7 @@ static int do_flash(struct ucsi_ccg *uc, enum enum_flash_mode mode) + ******************************************************************************/ + static int ccg_fw_update(struct ucsi_ccg *uc, enum enum_flash_mode flash_mode) + { +- int err; ++ int err = 0; + + while (flash_mode != FLASH_NOT_NEEDED) { + err = do_flash(uc, flash_mode); +diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c +index d57ebdd616d9..247e5585af5d 100644 +--- a/drivers/vhost/net.c ++++ b/drivers/vhost/net.c +@@ -35,7 +35,7 @@ + + #include "vhost.h" + +-static int experimental_zcopytx = 1; ++static int experimental_zcopytx = 0; + module_param(experimental_zcopytx, int, 0444); + MODULE_PARM_DESC(experimental_zcopytx, "Enable Zero Copy TX;" + " 1 -Enable; 0 - Disable"); +diff --git a/drivers/video/fbdev/omap/hwa742.c b/drivers/video/fbdev/omap/hwa742.c +index cfe63932f825..71c00ef772a3 100644 +--- a/drivers/video/fbdev/omap/hwa742.c ++++ b/drivers/video/fbdev/omap/hwa742.c +@@ -913,7 +913,7 @@ static void hwa742_resume(void) + if (hwa742_read_reg(HWA742_PLL_DIV_REG) & (1 << 7)) + break; + set_current_state(TASK_UNINTERRUPTIBLE); +- schedule_timeout(msecs_to_jiffies(5)); ++ schedule_msec_hrtimeout((5)); + } + hwa742_set_update_mode(hwa742.update_mode_before_suspend); + } +diff --git a/drivers/video/fbdev/pxafb.c b/drivers/video/fbdev/pxafb.c +index d59c8a59f582..e103cce28de7 100644 +--- a/drivers/video/fbdev/pxafb.c ++++ b/drivers/video/fbdev/pxafb.c +@@ -1287,7 +1287,7 @@ static int pxafb_smart_thread(void *arg) + mutex_unlock(&fbi->ctrlr_lock); + + set_current_state(TASK_INTERRUPTIBLE); +- schedule_timeout(msecs_to_jiffies(30)); ++ schedule_msec_hrtimeout((30)); + } + + pr_debug("%s(): task ending\n", __func__); +diff --git a/drivers/video/logo/Kconfig b/drivers/video/logo/Kconfig +index 6d6f8c08792d..8cf2481b6a4a 100644 +--- a/drivers/video/logo/Kconfig ++++ b/drivers/video/logo/Kconfig +@@ -16,56 +16,117 @@ config FB_LOGO_EXTRA + depends on FB=y + default y if SPU_BASE + ++comment "Available logos" ++ ++config LOGO_ZEN_CLUT224 ++ bool "224-color Zen Kernel/Meditating Tux logo" ++ default y ++ + config LOGO_LINUX_MONO + bool "Standard black and white Linux logo" +- default y ++ default n + + config LOGO_LINUX_VGA16 + bool "Standard 16-color Linux logo" +- default y ++ default n + + config LOGO_LINUX_CLUT224 + bool "Standard 224-color Linux logo" +- default y ++ default n ++ ++config LOGO_OLDZEN_CLUT224 ++ bool "224-color Old Zen Kernel logo" ++ depends on LOGO ++ default n ++ ++config LOGO_ARCH_CLUT224 ++ bool "224-color Arch Linux logo" ++ depends on LOGO ++ default n ++ ++config LOGO_GENTOO_CLUT224 ++ bool "224-color Gentoo Linux logo" ++ depends on LOGO ++ default n ++ ++config LOGO_EXHERBO_CLUT224 ++ bool "224-color Exherbo Linux logo" ++ depends on LOGO ++ default n ++ ++config LOGO_SLACKWARE_CLUT224 ++ bool "224-color Slackware Linux logo" ++ depends on LOGO ++ default n ++ ++config LOGO_DEBIAN_CLUT224 ++ bool "224-color Debian Linux logo" ++ depends on LOGO ++ default n ++ ++config LOGO_FEDORASIMPLE_CLUT224 ++ bool "224-color Fedora Simple Linux logo" ++ depends on LOGO ++ default n ++ ++config LOGO_FEDORAGLOSSY_CLUT224 ++ bool "224-color Fedora Glossy Linux logo" ++ depends on LOGO ++ default n ++ ++config LOGO_TITS_CLUT224 ++ bool "224-color Tits logo" ++ depends on LOGO ++ default n ++ ++config LOGO_BSD_CLUT224 ++ bool "224-color BSD Devil logo" ++ depends on LOGO ++ default n ++ ++config LOGO_FBSD_CLUT224 ++ bool "224-color FreeBSD logo" ++ depends on LOGO ++ default n + + config LOGO_DEC_CLUT224 + bool "224-color Digital Equipment Corporation Linux logo" + depends on MACH_DECSTATION || ALPHA +- default y ++ default n + + config LOGO_MAC_CLUT224 + bool "224-color Macintosh Linux logo" + depends on MAC +- default y ++ default n + + config LOGO_PARISC_CLUT224 + bool "224-color PA-RISC Linux logo" + depends on PARISC +- default y ++ default n + + config LOGO_SGI_CLUT224 + bool "224-color SGI Linux logo" + depends on SGI_IP22 || SGI_IP27 || SGI_IP32 +- default y ++ default n + + config LOGO_SUN_CLUT224 + bool "224-color Sun Linux logo" + depends on SPARC +- default y ++ default n + + config LOGO_SUPERH_MONO + bool "Black and white SuperH Linux logo" + depends on SUPERH +- default y ++ default n + + config LOGO_SUPERH_VGA16 + bool "16-color SuperH Linux logo" + depends on SUPERH +- default y ++ default n + + config LOGO_SUPERH_CLUT224 + bool "224-color SuperH Linux logo" + depends on SUPERH +- default y ++ default n + + endif # LOGO +diff --git a/drivers/video/logo/Makefile b/drivers/video/logo/Makefile +index 228a89b9bdd1..679f1cbbf2af 100644 +--- a/drivers/video/logo/Makefile ++++ b/drivers/video/logo/Makefile +@@ -5,6 +5,18 @@ obj-$(CONFIG_LOGO) += logo.o + obj-$(CONFIG_LOGO_LINUX_MONO) += logo_linux_mono.o + obj-$(CONFIG_LOGO_LINUX_VGA16) += logo_linux_vga16.o + obj-$(CONFIG_LOGO_LINUX_CLUT224) += logo_linux_clut224.o ++obj-$(CONFIG_LOGO_ZEN_CLUT224) += logo_zen_clut224.o ++obj-$(CONFIG_LOGO_OLDZEN_CLUT224) += logo_oldzen_clut224.o ++obj-$(CONFIG_LOGO_ARCH_CLUT224) += logo_arch_clut224.o ++obj-$(CONFIG_LOGO_GENTOO_CLUT224) += logo_gentoo_clut224.o ++obj-$(CONFIG_LOGO_EXHERBO_CLUT224) += logo_exherbo_clut224.o ++obj-$(CONFIG_LOGO_SLACKWARE_CLUT224) += logo_slackware_clut224.o ++obj-$(CONFIG_LOGO_DEBIAN_CLUT224) += logo_debian_clut224.o ++obj-$(CONFIG_LOGO_FEDORASIMPLE_CLUT224) += logo_fedorasimple_clut224.o ++obj-$(CONFIG_LOGO_FEDORAGLOSSY_CLUT224) += logo_fedoraglossy_clut224.o ++obj-$(CONFIG_LOGO_TITS_CLUT224) += logo_tits_clut224.o ++obj-$(CONFIG_LOGO_BSD_CLUT224) += logo_bsd_clut224.o ++obj-$(CONFIG_LOGO_FBSD_CLUT224) += logo_fbsd_clut224.o + obj-$(CONFIG_LOGO_DEC_CLUT224) += logo_dec_clut224.o + obj-$(CONFIG_LOGO_MAC_CLUT224) += logo_mac_clut224.o + obj-$(CONFIG_LOGO_PARISC_CLUT224) += logo_parisc_clut224.o +diff --git a/drivers/video/logo/logo.c b/drivers/video/logo/logo.c +index 141f15a9a459..8a04b9cfb5b3 100644 +--- a/drivers/video/logo/logo.c ++++ b/drivers/video/logo/logo.c +@@ -99,6 +99,54 @@ const struct linux_logo * __ref fb_find_logo(int depth) + #ifdef CONFIG_LOGO_SUPERH_CLUT224 + /* SuperH Linux logo */ + logo = &logo_superh_clut224; ++#endif ++#ifdef CONFIG_LOGO_ZEN_CLUT224 ++ /* Zen-Kernel logo */ ++ logo = &logo_zen_clut224; ++#endif ++#ifdef CONFIG_LOGO_OLDZEN_CLUT224 ++ /* Old Zen-Kernel logo */ ++ logo = &logo_oldzen_clut224; ++#endif ++#ifdef CONFIG_LOGO_ARCH_CLUT224 ++ /* Arch Linux logo */ ++ logo = &logo_arch_clut224; ++#endif ++#ifdef CONFIG_LOGO_GENTOO_CLUT224 ++ /* Gentoo Linux logo */ ++ logo = &logo_gentoo_clut224; ++#endif ++#ifdef CONFIG_LOGO_EXHERBO_CLUT224 ++ /* Exherbo Linux logo */ ++ logo = &logo_exherbo_clut224; ++#endif ++#ifdef CONFIG_LOGO_SLACKWARE_CLUT224 ++ /* Slackware Linux logo */ ++ logo = &logo_slackware_clut224; ++#endif ++#ifdef CONFIG_LOGO_DEBIAN_CLUT224 ++ /* Debian Linux logo */ ++ logo = &logo_debian_clut224; ++#endif ++#ifdef CONFIG_LOGO_FEDORASIMPLE_CLUT224 ++ /* Fedora Simple logo */ ++ logo = &logo_fedorasimple_clut224; ++#endif ++#ifdef CONFIG_LOGO_FEDORAGLOSSY_CLUT224 ++ /* Fedora Glossy logo */ ++ logo = &logo_fedoraglossy_clut224; ++#endif ++#ifdef CONFIG_LOGO_TITS_CLUT224 ++ /* Tits logo */ ++ logo = &logo_tits_clut224; ++#endif ++#ifdef CONFIG_LOGO_BSD_CLUT224 ++ /* BSD logo */ ++ logo = &logo_bsd_clut224; ++#endif ++#ifdef CONFIG_LOGO_FBSD_CLUT224 ++ /* Free BSD logo */ ++ logo = &logo_fbsd_clut224; + #endif + } + return logo; +diff --git a/drivers/video/logo/logo_arch_clut224.ppm b/drivers/video/logo/logo_arch_clut224.ppm +new file mode 100644 +index 000000000000..e4d8daa69d28 +--- /dev/null ++++ b/drivers/video/logo/logo_arch_clut224.ppm +@@ -0,0 +1,43204 @@ ++P3 ++# CREATOR: GIMP PNM Filter Version 1.1 ++120 120 ++255 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++10 ++110 ++160 ++33 ++122 ++166 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++27 ++151 ++213 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++4 ++45 ++68 ++13 ++147 ++209 ++13 ++147 ++209 ++17 ++73 ++101 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++24 ++137 ++199 ++13 ++147 ++209 ++13 ++147 ++209 ++54 ++155 ++212 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++7 ++10 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++48 ++164 ++219 ++3 ++23 ++31 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++33 ++133 ++182 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++24 ++150 ++212 ++40 ++160 ++215 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++65 ++166 ++216 ++5 ++11 ++14 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++3 ++76 ++109 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++65 ++166 ++216 ++54 ++136 ++181 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++42 ++161 ++216 ++48 ++164 ++219 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++9 ++18 ++24 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++17 ++148 ++210 ++48 ++164 ++219 ++40 ++90 ++118 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++37 ++132 ++189 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++65 ++166 ++216 ++48 ++164 ++219 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++48 ++164 ++219 ++48 ++164 ++219 ++11 ++35 ++49 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++25 ++87 ++120 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++27 ++151 ++213 ++62 ++163 ++214 ++62 ++163 ++214 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++65 ++166 ++216 ++48 ++164 ++219 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++17 ++148 ++210 ++17 ++148 ++210 ++17 ++148 ++210 ++17 ++148 ++210 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++62 ++163 ++214 ++48 ++164 ++219 ++36 ++86 ++115 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++10 ++110 ++160 ++21 ++149 ++211 ++21 ++149 ++211 ++17 ++148 ++210 ++17 ++148 ++210 ++17 ++148 ++210 ++17 ++148 ++210 ++17 ++148 ++210 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++49 ++151 ++208 ++48 ++164 ++219 ++65 ++166 ++216 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++17 ++148 ++210 ++24 ++150 ++212 ++21 ++149 ++211 ++13 ++147 ++209 ++13 ++147 ++209 ++21 ++149 ++211 ++17 ++148 ++210 ++17 ++148 ++210 ++17 ++148 ++210 ++17 ++148 ++210 ++17 ++148 ++210 ++13 ++147 ++209 ++65 ++166 ++216 ++65 ++166 ++216 ++11 ++35 ++49 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++74 ++106 ++31 ++155 ++211 ++24 ++150 ++212 ++24 ++150 ++212 ++27 ++151 ++213 ++17 ++148 ++210 ++21 ++149 ++211 ++13 ++147 ++209 ++13 ++147 ++209 ++49 ++151 ++208 ++21 ++149 ++211 ++17 ++148 ++210 ++17 ++148 ++210 ++48 ++164 ++219 ++65 ++166 ++216 ++62 ++163 ++214 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++24 ++150 ++212 ++17 ++148 ++210 ++31 ++155 ++211 ++17 ++148 ++210 ++17 ++148 ++210 ++2 ++145 ++206 ++31 ++155 ++211 ++31 ++155 ++211 ++27 ++151 ++213 ++21 ++149 ++211 ++49 ++151 ++208 ++21 ++149 ++211 ++21 ++149 ++211 ++49 ++151 ++208 ++65 ++166 ++216 ++65 ++166 ++216 ++5 ++18 ++28 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++27 ++39 ++27 ++151 ++213 ++27 ++151 ++213 ++49 ++151 ++208 ++24 ++150 ++212 ++24 ++150 ++212 ++31 ++155 ++211 ++24 ++150 ++212 ++21 ++149 ++211 ++24 ++150 ++212 ++27 ++151 ++213 ++27 ++151 ++213 ++2 ++145 ++206 ++21 ++149 ++211 ++21 ++149 ++211 ++72 ++171 ++221 ++62 ++163 ++214 ++48 ++154 ++203 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++143 ++204 ++31 ++155 ++211 ++31 ++155 ++211 ++24 ++150 ++212 ++31 ++155 ++211 ++27 ++151 ++213 ++24 ++150 ++212 ++24 ++150 ++212 ++31 ++155 ++211 ++31 ++155 ++211 ++21 ++149 ++211 ++31 ++155 ++211 ++31 ++155 ++211 ++21 ++149 ++211 ++27 ++151 ++213 ++62 ++163 ++214 ++67 ++167 ++217 ++67 ++167 ++217 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++31 ++155 ++211 ++31 ++155 ++211 ++31 ++155 ++211 ++31 ++155 ++211 ++24 ++150 ++212 ++24 ++150 ++212 ++24 ++150 ++212 ++21 ++149 ++211 ++31 ++155 ++211 ++29 ++152 ++214 ++21 ++149 ++211 ++17 ++148 ++210 ++31 ++155 ++211 ++17 ++148 ++210 ++24 ++150 ++212 ++49 ++151 ++208 ++67 ++167 ++217 ++67 ++167 ++217 ++49 ++132 ++177 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++29 ++108 ++153 ++51 ++153 ++210 ++51 ++153 ++210 ++31 ++155 ++211 ++31 ++155 ++211 ++24 ++150 ++212 ++24 ++150 ++212 ++31 ++155 ++211 ++31 ++155 ++211 ++24 ++150 ++212 ++24 ++150 ++212 ++27 ++151 ++213 ++27 ++151 ++213 ++49 ++151 ++208 ++21 ++149 ++211 ++21 ++149 ++211 ++27 ++151 ++213 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++49 ++151 ++208 ++31 ++155 ++211 ++51 ++153 ++210 ++29 ++152 ++214 ++32 ++153 ++215 ++32 ++153 ++215 ++29 ++152 ++214 ++31 ++155 ++211 ++24 ++150 ++212 ++24 ++150 ++212 ++24 ++150 ++212 ++31 ++155 ++211 ++24 ++150 ++212 ++31 ++155 ++211 ++31 ++155 ++211 ++27 ++151 ++213 ++24 ++150 ++212 ++62 ++163 ++214 ++68 ++168 ++218 ++68 ++168 ++218 ++40 ++90 ++118 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++71 ++103 ++33 ++156 ++212 ++31 ++155 ++211 ++31 ++155 ++211 ++31 ++155 ++211 ++49 ++151 ++208 ++29 ++152 ++214 ++31 ++155 ++211 ++31 ++155 ++211 ++32 ++153 ++215 ++24 ++150 ++212 ++24 ++150 ++212 ++31 ++155 ++211 ++31 ++155 ++211 ++24 ++150 ++212 ++31 ++155 ++211 ++31 ++155 ++211 ++24 ++150 ++212 ++29 ++152 ++214 ++78 ++167 ++212 ++68 ++168 ++218 ++65 ++166 ++216 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++31 ++155 ++211 ++31 ++155 ++211 ++33 ++156 ++212 ++32 ++153 ++215 ++32 ++153 ++215 ++51 ++153 ++210 ++51 ++153 ++210 ++31 ++155 ++211 ++49 ++151 ++208 ++29 ++152 ++214 ++29 ++152 ++214 ++31 ++155 ++211 ++32 ++153 ++215 ++31 ++155 ++211 ++31 ++155 ++211 ++24 ++150 ++212 ++24 ++150 ++212 ++24 ++150 ++212 ++31 ++155 ++211 ++68 ++168 ++218 ++69 ++169 ++219 ++71 ++170 ++220 ++16 ++56 ++73 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++11 ++35 ++49 ++33 ++156 ++212 ++33 ++156 ++212 ++53 ++154 ++211 ++53 ++154 ++211 ++31 ++155 ++211 ++31 ++155 ++211 ++31 ++155 ++211 ++51 ++153 ++210 ++31 ++155 ++211 ++31 ++155 ++211 ++31 ++155 ++211 ++51 ++153 ++210 ++51 ++153 ++210 ++29 ++152 ++214 ++51 ++153 ++210 ++31 ++155 ++211 ++31 ++155 ++211 ++24 ++150 ++212 ++31 ++155 ++211 ++31 ++155 ++211 ++69 ++169 ++219 ++69 ++169 ++219 ++65 ++166 ++216 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++49 ++151 ++208 ++32 ++153 ++215 ++33 ++156 ++212 ++32 ++153 ++215 ++54 ++155 ++212 ++31 ++155 ++211 ++32 ++153 ++215 ++32 ++153 ++215 ++33 ++156 ++212 ++31 ++155 ++211 ++32 ++153 ++215 ++29 ++152 ++214 ++51 ++153 ++210 ++32 ++153 ++215 ++31 ++155 ++211 ++31 ++155 ++211 ++29 ++152 ++214 ++31 ++155 ++211 ++51 ++153 ++210 ++31 ++155 ++211 ++31 ++155 ++211 ++68 ++168 ++218 ++82 ++170 ++215 ++69 ++169 ++219 ++12 ++30 ++39 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++18 ++23 ++54 ++155 ++212 ++54 ++155 ++212 ++33 ++156 ++212 ++33 ++156 ++212 ++33 ++156 ++212 ++33 ++156 ++212 ++38 ++159 ++214 ++53 ++154 ++211 ++53 ++154 ++211 ++33 ++156 ++212 ++31 ++155 ++211 ++31 ++155 ++211 ++33 ++156 ++212 ++32 ++153 ++215 ++32 ++153 ++215 ++31 ++155 ++211 ++31 ++155 ++211 ++51 ++153 ++210 ++31 ++155 ++211 ++31 ++155 ++211 ++31 ++155 ++211 ++44 ++162 ++217 ++82 ++170 ++215 ++71 ++170 ++220 ++62 ++163 ++214 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++41 ++147 ++203 ++42 ++161 ++216 ++38 ++159 ++214 ++54 ++155 ++212 ++38 ++159 ++214 ++38 ++159 ++214 ++32 ++153 ++215 ++33 ++156 ++212 ++32 ++153 ++215 ++32 ++153 ++215 ++54 ++155 ++212 ++54 ++155 ++212 ++32 ++153 ++215 ++31 ++155 ++211 ++31 ++155 ++211 ++32 ++153 ++215 ++32 ++153 ++215 ++33 ++156 ++212 ++31 ++155 ++211 ++49 ++151 ++208 ++31 ++155 ++211 ++49 ++151 ++208 ++32 ++153 ++215 ++72 ++171 ++221 ++71 ++170 ++220 ++71 ++170 ++220 ++8 ++27 ++35 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++9 ++12 ++42 ++161 ++216 ++42 ++161 ++216 ++54 ++155 ++212 ++54 ++155 ++212 ++42 ++161 ++216 ++54 ++155 ++212 ++54 ++155 ++212 ++38 ++159 ++214 ++38 ++159 ++214 ++38 ++159 ++214 ++54 ++155 ++212 ++38 ++159 ++214 ++33 ++156 ++212 ++33 ++156 ++212 ++33 ++156 ++212 ++53 ++154 ++211 ++32 ++153 ++215 ++32 ++153 ++215 ++31 ++155 ++211 ++33 ++156 ++212 ++32 ++153 ++215 ++32 ++153 ++215 ++32 ++153 ++215 ++62 ++163 ++214 ++82 ++170 ++215 ++72 ++171 ++221 ++55 ++159 ++209 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++42 ++139 ++189 ++44 ++162 ++217 ++44 ++162 ++217 ++54 ++155 ++212 ++42 ++161 ++216 ++42 ++161 ++216 ++54 ++155 ++212 ++54 ++155 ++212 ++42 ++161 ++216 ++38 ++159 ++214 ++54 ++155 ++212 ++54 ++155 ++212 ++40 ++160 ++215 ++54 ++155 ++212 ++33 ++156 ++212 ++38 ++159 ++214 ++54 ++155 ++212 ++54 ++155 ++212 ++33 ++156 ++212 ++33 ++156 ++212 ++53 ++154 ++211 ++33 ++156 ++212 ++31 ++155 ++211 ++31 ++155 ++211 ++54 ++155 ++212 ++72 ++171 ++221 ++72 ++171 ++221 ++71 ++170 ++220 ++5 ++11 ++14 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++44 ++162 ++217 ++55 ++159 ++209 ++54 ++155 ++212 ++54 ++155 ++212 ++54 ++155 ++212 ++54 ++155 ++212 ++54 ++155 ++212 ++42 ++161 ++216 ++42 ++161 ++216 ++42 ++161 ++216 ++42 ++161 ++216 ++42 ++161 ++216 ++54 ++155 ++212 ++38 ++159 ++214 ++38 ++159 ++214 ++38 ++159 ++214 ++38 ++159 ++214 ++38 ++159 ++214 ++33 ++156 ++212 ++54 ++155 ++212 ++54 ++155 ++212 ++33 ++156 ++212 ++53 ++154 ++211 ++32 ++153 ++215 ++33 ++156 ++212 ++68 ++168 ++218 ++74 ++172 ++223 ++72 ++171 ++221 ++48 ++154 ++203 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++13 ++51 ++74 ++40 ++160 ++215 ++55 ++159 ++209 ++42 ++161 ++216 ++42 ++161 ++216 ++54 ++155 ++212 ++40 ++160 ++215 ++62 ++163 ++214 ++44 ++162 ++217 ++42 ++161 ++216 ++54 ++155 ++212 ++54 ++155 ++212 ++42 ++161 ++216 ++54 ++155 ++212 ++54 ++155 ++212 ++54 ++155 ++212 ++54 ++155 ++212 ++54 ++155 ++212 ++38 ++159 ++214 ++54 ++155 ++212 ++40 ++160 ++215 ++32 ++153 ++215 ++54 ++155 ++212 ++33 ++156 ++212 ++38 ++159 ++214 ++33 ++156 ++212 ++31 ++155 ++211 ++83 ++172 ++217 ++74 ++172 ++223 ++82 ++170 ++215 ++0 ++7 ++10 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++24 ++70 ++92 ++48 ++164 ++219 ++62 ++163 ++214 ++54 ++155 ++212 ++54 ++155 ++212 ++55 ++159 ++209 ++46 ++163 ++218 ++54 ++155 ++212 ++46 ++163 ++218 ++55 ++159 ++209 ++54 ++155 ++212 ++54 ++155 ++212 ++42 ++161 ++216 ++42 ++161 ++216 ++42 ++161 ++216 ++42 ++161 ++216 ++42 ++161 ++216 ++54 ++155 ++212 ++38 ++159 ++214 ++54 ++155 ++212 ++38 ++159 ++214 ++40 ++160 ++215 ++32 ++153 ++215 ++54 ++155 ++212 ++54 ++155 ++212 ++33 ++156 ++212 ++72 ++171 ++221 ++74 ++172 ++223 ++74 ++172 ++223 ++53 ++145 ++195 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++23 ++77 ++105 ++44 ++162 ++217 ++48 ++164 ++219 ++44 ++162 ++217 ++54 ++155 ++212 ++42 ++161 ++216 ++46 ++163 ++218 ++62 ++163 ++214 ++40 ++160 ++215 ++55 ++159 ++209 ++44 ++162 ++217 ++40 ++160 ++215 ++33 ++156 ++212 ++54 ++155 ++212 ++54 ++155 ++212 ++42 ++161 ++216 ++54 ++155 ++212 ++42 ++161 ++216 ++42 ++161 ++216 ++42 ++161 ++216 ++54 ++155 ++212 ++38 ++159 ++214 ++38 ++159 ++214 ++40 ++160 ++215 ++40 ++160 ++215 ++33 ++156 ++212 ++74 ++172 ++223 ++83 ++172 ++217 ++74 ++172 ++223 ++0 ++7 ++10 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++36 ++86 ++115 ++48 ++164 ++219 ++44 ++162 ++217 ++44 ++162 ++217 ++54 ++155 ++212 ++62 ++163 ++214 ++46 ++163 ++218 ++40 ++160 ++215 ++42 ++161 ++216 ++44 ++162 ++217 ++46 ++163 ++218 ++55 ++159 ++209 ++44 ++162 ++217 ++33 ++156 ++212 ++55 ++159 ++209 ++42 ++161 ++216 ++54 ++155 ++212 ++42 ++161 ++216 ++42 ++161 ++216 ++54 ++155 ++212 ++42 ++161 ++216 ++42 ++161 ++216 ++38 ++159 ++214 ++54 ++155 ++212 ++38 ++159 ++214 ++74 ++172 ++223 ++74 ++172 ++223 ++86 ++174 ++219 ++54 ++136 ++181 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++23 ++88 ++115 ++5 ++18 ++28 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++24 ++70 ++92 ++62 ++163 ++214 ++54 ++155 ++212 ++62 ++163 ++214 ++44 ++162 ++217 ++54 ++155 ++212 ++48 ++164 ++219 ++48 ++164 ++219 ++54 ++155 ++212 ++42 ++161 ++216 ++48 ++164 ++219 ++42 ++161 ++216 ++54 ++155 ++212 ++40 ++160 ++215 ++54 ++155 ++212 ++40 ++160 ++215 ++40 ++160 ++215 ++54 ++155 ++212 ++42 ++161 ++216 ++42 ++161 ++216 ++42 ++161 ++216 ++42 ++161 ++216 ++42 ++161 ++216 ++54 ++155 ++212 ++42 ++161 ++216 ++74 ++172 ++223 ++86 ++174 ++219 ++83 ++172 ++217 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++62 ++163 ++214 ++67 ++167 ++217 ++36 ++86 ++115 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++16 ++56 ++73 ++62 ++163 ++214 ++46 ++163 ++218 ++62 ++163 ++214 ++44 ++162 ++217 ++46 ++163 ++218 ++44 ++162 ++217 ++62 ++163 ++214 ++44 ++162 ++217 ++46 ++163 ++218 ++54 ++155 ++212 ++54 ++155 ++212 ++42 ++161 ++216 ++55 ++159 ++209 ++54 ++155 ++212 ++55 ++159 ++209 ++54 ++155 ++212 ++55 ++159 ++209 ++54 ++155 ++212 ++42 ++161 ++216 ++54 ++155 ++212 ++42 ++161 ++216 ++54 ++155 ++212 ++42 ++161 ++216 ++74 ++172 ++223 ++86 ++174 ++219 ++86 ++174 ++219 ++57 ++132 ++172 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++23 ++88 ++115 ++62 ++163 ++214 ++48 ++164 ++219 ++48 ++164 ++219 ++42 ++151 ++200 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++18 ++42 ++55 ++44 ++162 ++217 ++62 ++163 ++214 ++48 ++164 ++219 ++62 ++163 ++214 ++54 ++155 ++212 ++44 ++162 ++217 ++65 ++166 ++216 ++46 ++163 ++218 ++48 ++164 ++219 ++44 ++162 ++217 ++62 ++163 ++214 ++42 ++161 ++216 ++62 ++163 ++214 ++46 ++163 ++218 ++44 ++162 ++217 ++54 ++155 ++212 ++55 ++159 ++209 ++54 ++155 ++212 ++40 ++160 ++215 ++40 ++160 ++215 ++54 ++155 ++212 ++42 ++161 ++216 ++55 ++159 ++209 ++86 ++174 ++219 ++86 ++174 ++219 ++85 ++173 ++218 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++62 ++163 ++214 ++62 ++163 ++214 ++62 ++163 ++214 ++48 ++164 ++219 ++60 ++162 ++212 ++62 ++163 ++214 ++16 ++56 ++73 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++16 ++23 ++62 ++163 ++214 ++44 ++162 ++217 ++62 ++163 ++214 ++46 ++163 ++218 ++48 ++164 ++219 ++62 ++163 ++214 ++46 ++163 ++218 ++62 ++163 ++214 ++62 ++163 ++214 ++44 ++162 ++217 ++67 ++167 ++217 ++44 ++162 ++217 ++54 ++155 ++212 ++54 ++155 ++212 ++42 ++161 ++216 ++48 ++164 ++219 ++54 ++155 ++212 ++54 ++155 ++212 ++40 ++160 ++215 ++42 ++161 ++216 ++62 ++163 ++214 ++40 ++160 ++215 ++74 ++172 ++223 ++90 ++177 ++222 ++87 ++175 ++220 ++28 ++73 ++96 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++19 ++48 ++67 ++48 ++164 ++219 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++48 ++164 ++219 ++60 ++162 ++212 ++62 ++163 ++214 ++8 ++27 ++35 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++1 ++4 ++54 ++155 ++212 ++67 ++167 ++217 ++68 ++168 ++218 ++65 ++166 ++216 ++62 ++163 ++214 ++62 ++163 ++214 ++65 ++166 ++216 ++62 ++163 ++214 ++62 ++163 ++214 ++44 ++162 ++217 ++48 ++164 ++219 ++54 ++155 ++212 ++62 ++163 ++214 ++48 ++164 ++219 ++62 ++163 ++214 ++54 ++155 ++212 ++42 ++161 ++216 ++54 ++155 ++212 ++46 ++163 ++218 ++42 ++161 ++216 ++42 ++161 ++216 ++54 ++155 ++212 ++87 ++175 ++220 ++87 ++175 ++220 ++85 ++173 ++218 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++67 ++167 ++217 ++65 ++166 ++216 ++67 ++167 ++217 ++65 ++166 ++216 ++62 ++163 ++214 ++65 ++166 ++216 ++48 ++164 ++219 ++65 ++166 ++216 ++62 ++163 ++214 ++65 ++166 ++216 ++53 ++145 ++195 ++0 ++7 ++10 ++0 ++2 ++0 ++0 ++4 ++7 ++58 ++151 ++195 ++54 ++155 ++212 ++48 ++164 ++219 ++69 ++169 ++219 ++48 ++164 ++219 ++46 ++163 ++218 ++48 ++164 ++219 ++46 ++163 ++218 ++54 ++155 ++212 ++62 ++163 ++214 ++54 ++155 ++212 ++44 ++162 ++217 ++42 ++161 ++216 ++62 ++163 ++214 ++48 ++164 ++219 ++44 ++162 ++217 ++54 ++155 ++212 ++44 ++162 ++217 ++54 ++155 ++212 ++38 ++159 ++214 ++48 ++164 ++219 ++83 ++172 ++217 ++90 ++177 ++222 ++90 ++177 ++222 ++30 ++93 ++120 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++22 ++45 ++59 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++72 ++171 ++221 ++65 ++166 ++216 ++48 ++164 ++219 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++33 ++133 ++182 ++0 ++4 ++7 ++0 ++1 ++4 ++34 ++104 ++137 ++62 ++163 ++214 ++62 ++163 ++214 ++62 ++163 ++214 ++62 ++163 ++214 ++67 ++167 ++217 ++69 ++169 ++219 ++62 ++163 ++214 ++62 ++163 ++214 ++48 ++164 ++219 ++62 ++163 ++214 ++62 ++163 ++214 ++62 ++163 ++214 ++48 ++164 ++219 ++65 ++166 ++216 ++42 ++161 ++216 ++48 ++164 ++219 ++48 ++164 ++219 ++44 ++162 ++217 ++55 ++159 ++209 ++38 ++159 ++214 ++88 ++176 ++221 ++88 ++176 ++221 ++85 ++173 ++218 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++65 ++166 ++216 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++67 ++167 ++217 ++62 ++163 ++214 ++65 ++166 ++216 ++62 ++163 ++214 ++48 ++164 ++219 ++68 ++168 ++218 ++36 ++115 ++153 ++0 ++4 ++7 ++17 ++35 ++44 ++62 ++163 ++214 ++65 ++166 ++216 ++62 ++163 ++214 ++48 ++164 ++219 ++48 ++164 ++219 ++62 ++163 ++214 ++67 ++167 ++217 ++68 ++168 ++218 ++62 ++163 ++214 ++65 ++166 ++216 ++62 ++163 ++214 ++44 ++162 ++217 ++65 ++166 ++216 ++62 ++163 ++214 ++62 ++163 ++214 ++48 ++164 ++219 ++62 ++163 ++214 ++44 ++162 ++217 ++54 ++155 ++212 ++72 ++171 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++40 ++90 ++118 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++26 ++49 ++63 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++67 ++167 ++217 ++48 ++164 ++219 ++48 ++164 ++219 ++65 ++166 ++216 ++62 ++163 ++214 ++31 ++134 ++178 ++5 ++11 ++14 ++48 ++154 ++203 ++60 ++162 ++212 ++48 ++164 ++219 ++62 ++163 ++214 ++48 ++164 ++219 ++68 ++168 ++218 ++48 ++164 ++219 ++62 ++163 ++214 ++62 ++163 ++214 ++68 ++168 ++218 ++62 ++163 ++214 ++48 ++164 ++219 ++65 ++166 ++216 ++54 ++155 ++212 ++62 ++163 ++214 ++44 ++162 ++217 ++48 ++164 ++219 ++62 ++163 ++214 ++42 ++161 ++216 ++90 ++177 ++222 ++88 ++176 ++221 ++85 ++173 ++218 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++62 ++163 ++214 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++67 ++167 ++217 ++65 ++166 ++216 ++62 ++163 ++214 ++62 ++163 ++214 ++48 ++154 ++203 ++53 ++127 ++166 ++48 ++164 ++219 ++65 ++166 ++216 ++62 ++163 ++214 ++48 ++164 ++219 ++62 ++163 ++214 ++54 ++155 ++212 ++69 ++169 ++219 ++48 ++164 ++219 ++67 ++167 ++217 ++48 ++164 ++219 ++62 ++163 ++214 ++46 ++163 ++218 ++62 ++163 ++214 ++62 ++163 ++214 ++46 ++163 ++218 ++46 ++163 ++218 ++46 ++163 ++218 ++74 ++172 ++223 ++90 ++177 ++222 ++90 ++177 ++222 ++25 ++99 ++131 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++22 ++45 ++59 ++78 ++167 ++212 ++78 ++167 ++212 ++69 ++169 ++219 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++48 ++164 ++219 ++48 ++164 ++219 ++62 ++163 ++214 ++48 ++164 ++219 ++62 ++163 ++214 ++65 ++166 ++216 ++48 ++164 ++219 ++48 ++164 ++219 ++60 ++162 ++212 ++48 ++164 ++219 ++64 ++165 ++215 ++62 ++163 ++214 ++71 ++170 ++220 ++48 ++164 ++219 ++62 ++163 ++214 ++48 ++164 ++219 ++62 ++163 ++214 ++62 ++163 ++214 ++44 ++162 ++217 ++62 ++163 ++214 ++62 ++163 ++214 ++90 ++177 ++222 ++90 ++177 ++222 ++74 ++172 ++223 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++78 ++167 ++212 ++71 ++170 ++220 ++69 ++169 ++219 ++69 ++169 ++219 ++69 ++169 ++219 ++69 ++169 ++219 ++69 ++169 ++219 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++68 ++168 ++218 ++65 ++166 ++216 ++62 ++163 ++214 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++48 ++164 ++219 ++65 ++166 ++216 ++48 ++164 ++219 ++48 ++164 ++219 ++62 ++163 ++214 ++48 ++164 ++219 ++62 ++163 ++214 ++48 ++164 ++219 ++54 ++155 ++212 ++48 ++164 ++219 ++69 ++169 ++219 ++62 ++163 ++214 ++78 ++167 ++212 ++102 ++181 ++221 ++90 ++177 ++222 ++34 ++104 ++137 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++19 ++48 ++67 ++71 ++170 ++220 ++71 ++170 ++220 ++69 ++169 ++219 ++78 ++167 ++212 ++71 ++170 ++220 ++78 ++167 ++212 ++71 ++170 ++220 ++69 ++169 ++219 ++69 ++169 ++219 ++71 ++170 ++220 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++68 ++168 ++218 ++65 ++166 ++216 ++62 ++163 ++214 ++65 ++166 ++216 ++48 ++164 ++219 ++48 ++164 ++219 ++48 ++164 ++219 ++48 ++164 ++219 ++62 ++163 ++214 ++48 ++164 ++219 ++62 ++163 ++214 ++62 ++163 ++214 ++62 ++163 ++214 ++65 ++166 ++216 ++48 ++164 ++219 ++62 ++163 ++214 ++90 ++177 ++222 ++88 ++176 ++221 ++87 ++175 ++220 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++69 ++169 ++219 ++82 ++170 ++215 ++82 ++170 ++215 ++69 ++169 ++219 ++71 ++170 ++220 ++82 ++170 ++215 ++71 ++170 ++220 ++78 ++167 ++212 ++78 ++167 ++212 ++71 ++170 ++220 ++69 ++169 ++219 ++71 ++170 ++220 ++78 ++167 ++212 ++69 ++169 ++219 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++68 ++168 ++218 ++62 ++163 ++214 ++62 ++163 ++214 ++65 ++166 ++216 ++62 ++163 ++214 ++65 ++166 ++216 ++48 ++164 ++219 ++64 ++165 ++215 ++62 ++163 ++214 ++48 ++164 ++219 ++48 ++164 ++219 ++62 ++163 ++214 ++62 ++163 ++214 ++65 ++166 ++216 ++91 ++178 ++224 ++91 ++178 ++224 ++21 ++105 ++143 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++22 ++61 ++78 ++74 ++172 ++223 ++82 ++170 ++215 ++82 ++170 ++215 ++72 ++171 ++221 ++72 ++171 ++221 ++71 ++170 ++220 ++71 ++170 ++220 ++82 ++170 ++215 ++69 ++169 ++219 ++71 ++170 ++220 ++69 ++169 ++219 ++69 ++169 ++219 ++69 ++169 ++219 ++69 ++169 ++219 ++69 ++169 ++219 ++69 ++169 ++219 ++69 ++169 ++219 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++62 ++163 ++214 ++65 ++166 ++216 ++62 ++163 ++214 ++65 ++166 ++216 ++48 ++164 ++219 ++48 ++164 ++219 ++65 ++166 ++216 ++65 ++166 ++216 ++60 ++162 ++212 ++60 ++162 ++212 ++48 ++164 ++219 ++91 ++178 ++224 ++91 ++178 ++224 ++88 ++176 ++221 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++1 ++4 ++82 ++170 ++215 ++74 ++172 ++223 ++83 ++172 ++217 ++83 ++172 ++217 ++83 ++172 ++217 ++82 ++170 ++215 ++72 ++171 ++221 ++72 ++171 ++221 ++82 ++170 ++215 ++71 ++170 ++220 ++69 ++169 ++219 ++71 ++170 ++220 ++71 ++170 ++220 ++82 ++170 ++215 ++69 ++169 ++219 ++71 ++170 ++220 ++69 ++169 ++219 ++71 ++170 ++220 ++69 ++169 ++219 ++78 ++167 ++212 ++69 ++169 ++219 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++67 ++167 ++217 ++65 ++166 ++216 ++62 ++163 ++214 ++62 ++163 ++214 ++65 ++166 ++216 ++48 ++164 ++219 ++67 ++167 ++217 ++65 ++166 ++216 ++62 ++163 ++214 ++90 ++177 ++222 ++91 ++178 ++224 ++48 ++115 ++149 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++45 ++104 ++131 ++74 ++172 ++223 ++83 ++172 ++217 ++74 ++172 ++223 ++83 ++172 ++217 ++74 ++172 ++223 ++83 ++172 ++217 ++83 ++172 ++217 ++83 ++172 ++217 ++82 ++170 ++215 ++82 ++170 ++215 ++82 ++170 ++215 ++82 ++170 ++215 ++82 ++170 ++215 ++71 ++170 ++220 ++69 ++169 ++219 ++71 ++170 ++220 ++71 ++170 ++220 ++71 ++170 ++220 ++69 ++169 ++219 ++69 ++169 ++219 ++71 ++170 ++220 ++69 ++169 ++219 ++78 ++167 ++212 ++69 ++169 ++219 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++68 ++168 ++218 ++62 ++163 ++214 ++48 ++164 ++219 ++48 ++164 ++219 ++48 ++164 ++219 ++67 ++167 ++217 ++71 ++170 ++220 ++91 ++178 ++224 ++91 ++178 ++224 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++85 ++173 ++218 ++74 ++172 ++223 ++85 ++173 ++218 ++85 ++173 ++218 ++74 ++172 ++223 ++74 ++172 ++223 ++74 ++172 ++223 ++83 ++172 ++217 ++74 ++172 ++223 ++83 ++172 ++217 ++83 ++172 ++217 ++83 ++172 ++217 ++72 ++171 ++221 ++72 ++171 ++221 ++72 ++171 ++221 ++72 ++171 ++221 ++71 ++170 ++220 ++82 ++170 ++215 ++82 ++170 ++215 ++71 ++170 ++220 ++82 ++170 ++215 ++69 ++169 ++219 ++78 ++167 ++212 ++69 ++169 ++219 ++69 ++169 ++219 ++78 ++167 ++212 ++69 ++169 ++219 ++69 ++169 ++219 ++69 ++169 ++219 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++68 ++168 ++218 ++48 ++164 ++219 ++62 ++163 ++214 ++62 ++163 ++214 ++90 ++177 ++222 ++91 ++178 ++224 ++50 ++145 ++189 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++48 ++115 ++149 ++86 ++174 ++219 ++88 ++176 ++221 ++88 ++176 ++221 ++86 ++174 ++219 ++86 ++174 ++219 ++85 ++173 ++218 ++86 ++174 ++219 ++85 ++173 ++218 ++83 ++172 ++217 ++83 ++172 ++217 ++83 ++172 ++217 ++74 ++172 ++223 ++83 ++172 ++217 ++83 ++172 ++217 ++74 ++172 ++223 ++72 ++171 ++221 ++82 ++170 ++215 ++82 ++170 ++215 ++72 ++171 ++221 ++71 ++170 ++220 ++71 ++170 ++220 ++82 ++170 ++215 ++71 ++170 ++220 ++82 ++170 ++215 ++69 ++169 ++219 ++69 ++169 ++219 ++69 ++169 ++219 ++68 ++168 ++218 ++69 ++169 ++219 ++68 ++168 ++218 ++68 ++168 ++218 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++68 ++168 ++218 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++62 ++163 ++214 ++102 ++181 ++221 ++91 ++178 ++224 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++88 ++176 ++221 ++87 ++175 ++220 ++88 ++176 ++221 ++74 ++172 ++223 ++86 ++174 ++219 ++86 ++174 ++219 ++88 ++176 ++221 ++85 ++173 ++218 ++86 ++174 ++219 ++74 ++172 ++223 ++85 ++173 ++218 ++74 ++172 ++223 ++74 ++172 ++223 ++83 ++172 ++217 ++83 ++172 ++217 ++83 ++172 ++217 ++74 ++172 ++223 ++74 ++172 ++223 ++74 ++172 ++223 ++82 ++170 ++215 ++82 ++170 ++215 ++82 ++170 ++215 ++78 ++167 ++212 ++48 ++164 ++219 ++29 ++152 ++214 ++17 ++148 ++210 ++7 ++146 ++208 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++49 ++151 ++208 ++33 ++156 ++212 ++48 ++164 ++219 ++65 ++166 ++216 ++62 ++163 ++214 ++67 ++167 ++217 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++88 ++176 ++221 ++95 ++181 ++227 ++50 ++145 ++189 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++64 ++129 ++163 ++87 ++175 ++220 ++87 ++175 ++220 ++87 ++175 ++220 ++87 ++175 ++220 ++87 ++175 ++220 ++74 ++172 ++223 ++86 ++174 ++219 ++86 ++174 ++219 ++88 ++176 ++221 ++86 ++174 ++219 ++86 ++174 ++219 ++85 ++173 ++218 ++86 ++174 ++219 ++85 ++173 ++218 ++74 ++172 ++223 ++74 ++172 ++223 ++83 ++172 ++217 ++83 ++172 ++217 ++82 ++170 ++215 ++55 ++159 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++51 ++153 ++210 ++62 ++163 ++214 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++65 ++166 ++216 ++93 ++180 ++226 ++91 ++178 ++224 ++2 ++9 ++12 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++88 ++176 ++221 ++88 ++176 ++221 ++87 ++175 ++220 ++87 ++175 ++220 ++87 ++175 ++220 ++90 ++177 ++222 ++88 ++176 ++221 ++74 ++172 ++223 ++74 ++172 ++223 ++86 ++174 ++219 ++74 ++172 ++223 ++86 ++174 ++219 ++86 ++174 ++219 ++74 ++172 ++223 ++85 ++173 ++218 ++74 ++172 ++223 ++71 ++170 ++220 ++24 ++150 ++212 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++31 ++155 ++211 ++62 ++163 ++214 ++69 ++169 ++219 ++102 ++181 ++221 ++66 ++157 ++202 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++68 ++139 ++173 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++87 ++175 ++220 ++87 ++175 ++220 ++87 ++175 ++220 ++87 ++175 ++220 ++91 ++178 ++224 ++87 ++175 ++220 ++74 ++172 ++223 ++86 ++174 ++219 ++86 ++174 ++219 ++29 ++152 ++214 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++65 ++166 ++216 ++93 ++180 ++226 ++5 ++11 ++14 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++87 ++175 ++220 ++87 ++175 ++220 ++74 ++172 ++223 ++82 ++170 ++215 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++62 ++163 ++214 ++55 ++159 ++209 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++76 ++157 ++196 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++87 ++175 ++220 ++62 ++163 ++214 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++24 ++150 ++212 ++48 ++164 ++219 ++5 ++18 ++28 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++5 ++11 ++14 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++68 ++168 ++218 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++48 ++164 ++219 ++62 ++163 ++214 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++73 ++163 ++208 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++78 ++167 ++212 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++67 ++167 ++217 ++0 ++7 ++10 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++1 ++0 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++83 ++172 ++217 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++17 ++148 ++210 ++42 ++151 ++200 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++73 ++163 ++208 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++83 ++172 ++217 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++54 ++155 ++212 ++2 ++27 ++39 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++13 ++16 ++88 ++176 ++221 ++88 ++176 ++221 ++88 ++176 ++221 ++86 ++174 ++219 ++21 ++149 ++211 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++55 ++159 ++209 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++78 ++167 ++212 ++88 ++176 ++221 ++87 ++175 ++220 ++33 ++156 ++212 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++17 ++148 ++210 ++14 ++38 ++51 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++12 ++30 ++39 ++88 ++176 ++221 ++71 ++170 ++220 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++31 ++155 ++211 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++102 ++181 ++221 ++17 ++148 ++210 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++8 ++135 ++190 ++3 ++28 ++41 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++5 ++18 ++28 ++7 ++123 ++172 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++19 ++48 ++67 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++10 ++42 ++60 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++143 ++204 ++1 ++4 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++1 ++4 ++16 ++137 ++192 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++139 ++199 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++23 ++115 ++165 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++60 ++88 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++65 ++92 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++8 ++135 ++190 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++10 ++110 ++160 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++33 ++120 ++170 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++85 ++122 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++6 ++88 ++126 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++7 ++10 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++17 ++148 ++210 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++90 ++129 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++5 ++18 ++28 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++17 ++102 ++146 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++10 ++110 ++160 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++129 ++183 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++17 ++148 ++210 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++1 ++11 ++20 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++8 ++33 ++46 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++139 ++199 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++16 ++137 ++192 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++24 ++126 ++182 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++17 ++148 ++210 ++4 ++14 ++21 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++22 ++30 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++90 ++129 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++5 ++11 ++14 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++28 ++141 ++196 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++24 ++37 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++4 ++45 ++68 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++26 ++97 ++136 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++19 ++113 ++163 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++4 ++14 ++21 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++10 ++42 ++60 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++71 ++103 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++6 ++31 ++44 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++17 ++148 ++210 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++34 ++143 ++199 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++60 ++88 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++9 ++99 ++143 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++27 ++117 ++167 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++10 ++69 ++97 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++6 ++39 ++56 ++23 ++115 ++165 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++6 ++39 ++56 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++85 ++122 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++28 ++141 ++196 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++27 ++39 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++24 ++126 ++182 ++0 ++4 ++7 ++0 ++4 ++7 ++18 ++92 ++131 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++31 ++129 ++185 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++9 ++12 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++17 ++102 ++146 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++9 ++12 ++19 ++113 ++163 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++11 ++61 ++83 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++33 ++133 ++182 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++27 ++117 ++167 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++85 ++122 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++5 ++11 ++14 ++33 ++133 ++182 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++5 ++11 ++14 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++2 ++111 ++154 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++1 ++4 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++24 ++137 ++199 ++5 ++11 ++14 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++3 ++6 ++20 ++127 ++176 ++13 ++147 ++209 ++2 ++111 ++154 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++139 ++199 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++118 ++167 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++9 ++99 ++143 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++9 ++12 ++37 ++132 ++189 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++27 ++39 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++27 ++117 ++167 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++1 ++4 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++1 ++0 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++139 ++199 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++57 ++84 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++60 ++87 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++24 ++137 ++199 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++9 ++12 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++17 ++102 ++146 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++3 ++36 ++54 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++37 ++132 ++189 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++96 ++140 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++3 ++76 ++109 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++143 ++204 ++5 ++11 ++14 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++129 ++183 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++51 ++74 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++123 ++172 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++4 ++45 ++68 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++2 ++111 ++154 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++7 ++10 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++17 ++102 ++146 ++0 ++24 ++37 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++5 ++18 ++28 ++22 ++104 ++148 ++0 ++143 ++204 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++139 ++199 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++28 ++141 ++196 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++24 ++126 ++182 ++6 ++39 ++56 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++1 ++0 ++0 ++2 ++0 ++6 ++39 ++56 ++24 ++126 ++182 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++6 ++39 ++56 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++28 ++141 ++196 ++5 ++67 ++94 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++1 ++4 ++0 ++4 ++7 ++0 ++63 ++90 ++34 ++143 ++199 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++17 ++102 ++146 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++3 ++76 ++109 ++0 ++4 ++7 ++0 ++1 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++3 ++76 ++109 ++24 ++137 ++199 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++21 ++149 ++211 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++3 ++76 ++109 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++123 ++172 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++7 ++10 ++33 ++120 ++170 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++16 ++123 ++179 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++13 ++90 ++129 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++13 ++90 ++129 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++29 ++108 ++153 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++139 ++199 ++8 ++27 ++35 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++27 ++39 ++34 ++143 ++199 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++37 ++132 ++189 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++31 ++129 ++185 ++5 ++11 ++14 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++9 ++12 ++37 ++132 ++189 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++20 ++28 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++31 ++129 ++185 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++23 ++115 ++165 ++0 ++1 ++4 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++1 ++4 ++2 ++111 ++154 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++28 ++141 ++196 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++13 ++90 ++129 ++0 ++1 ++4 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++1 ++0 ++0 ++85 ++122 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++2 ++9 ++12 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++127 ++181 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++118 ++167 ++0 ++1 ++4 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++29 ++108 ++153 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++24 ++137 ++199 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++2 ++9 ++12 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++19 ++113 ++163 ++0 ++1 ++4 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++10 ++110 ++160 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++24 ++37 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++139 ++199 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++118 ++167 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++29 ++108 ++153 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++3 ++23 ++31 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++129 ++183 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++33 ++120 ++170 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++10 ++42 ++60 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++118 ++167 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++0 ++118 ++167 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++7 ++146 ++208 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++85 ++122 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++24 ++126 ++182 ++0 ++7 ++10 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++33 ++120 ++170 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++96 ++140 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++7 ++146 ++208 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++143 ++204 ++0 ++7 ++10 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++5 ++11 ++14 ++0 ++143 ++204 ++13 ++147 ++209 ++13 ++147 ++209 ++13 ++147 ++209 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++29 ++108 ++153 ++13 ++147 ++209 ++7 ++146 ++208 ++17 ++54 ++77 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++17 ++54 ++77 ++7 ++146 ++208 ++13 ++147 ++209 ++0 ++118 ++167 ++0 ++2 ++0 ++0 ++4 ++7 ++7 ++146 ++208 ++17 ++102 ++146 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++4 ++7 ++17 ++102 ++146 ++7 ++146 ++208 ++0 ++4 ++7 ++27 ++117 ++167 ++0 ++4 ++7 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++0 ++2 ++0 ++27 ++117 ++167 +diff --git a/drivers/video/logo/logo_bsd_clut224.ppm b/drivers/video/logo/logo_bsd_clut224.ppm +new file mode 100644 +index 000000000000..408f0282aa9e +--- /dev/null ++++ b/drivers/video/logo/logo_bsd_clut224.ppm +@@ -0,0 +1,2403 @@ ++P3 ++120 120 ++255 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++4 0 1 7 1 3 1 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 28 8 14 ++51 24 39 16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 9 3 6 39 15 26 61 26 49 58 26 51 ++18 7 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 57 17 29 89 29 45 73 26 48 61 26 49 22 7 12 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 6 10 ++102 29 42 132 43 63 76 28 47 52 25 42 22 7 12 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 4 0 1 16 5 9 3 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 69 20 33 154 39 54 ++159 46 62 89 29 45 49 25 40 18 7 11 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 16 5 9 102 29 42 41 13 21 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 97 28 42 185 38 47 145 39 54 ++89 29 45 58 26 51 16 5 9 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 4 0 1 132 30 39 148 30 39 ++28 8 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 41 13 21 132 30 39 185 38 47 152 40 56 105 35 55 ++76 28 47 22 7 12 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 41 13 21 185 38 47 ++124 30 42 36 11 20 1 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 ++117 31 42 185 38 47 185 38 47 152 40 56 105 35 55 76 28 47 ++59 25 44 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 4 0 1 121 30 42 ++185 38 47 102 29 42 48 19 31 9 3 6 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 123 33 45 ++185 38 47 185 38 47 159 38 55 105 35 55 76 28 47 73 26 48 ++49 25 40 4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 13 21 ++185 38 47 132 30 39 71 23 37 41 14 25 4 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 4 0 1 117 31 42 185 38 47 ++185 38 47 171 39 51 118 34 52 88 29 45 76 28 47 62 26 49 ++52 24 38 18 7 11 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 10 4 6 16 5 9 16 5 9 ++18 7 11 18 7 11 16 5 9 10 4 6 16 5 9 7 2 4 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 1 3 ++148 30 39 152 32 42 67 22 35 54 21 35 35 12 21 4 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 69 20 33 185 38 47 185 38 47 ++185 38 47 159 35 49 105 35 55 89 29 45 76 28 47 62 26 49 ++60 25 40 42 17 30 3 1 1 0 0 0 0 0 0 0 0 0 ++1 0 0 41 13 21 79 27 44 118 34 52 124 30 42 121 30 42 ++142 34 47 121 30 42 86 29 44 68 23 35 60 22 36 52 24 38 ++42 17 30 30 10 18 16 5 9 9 3 6 9 3 6 3 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++148 30 39 185 38 47 71 23 37 50 18 33 49 25 40 35 12 21 ++7 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 10 4 6 185 38 47 185 38 47 185 38 47 ++185 38 47 140 36 52 105 35 55 89 29 45 76 28 47 67 27 47 ++56 25 45 52 24 38 48 19 31 39 15 26 30 10 18 31 10 18 ++89 29 45 129 39 59 159 38 55 171 39 51 171 39 51 171 39 51 ++159 38 55 138 37 53 119 34 51 105 35 55 88 29 45 76 28 47 ++76 28 47 62 26 49 57 25 43 49 25 40 48 19 31 31 10 18 ++10 4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ++132 30 39 185 38 47 121 30 42 64 24 39 49 25 40 48 19 31 ++10 4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 102 29 42 185 38 47 185 38 47 185 38 47 ++185 38 47 131 38 56 105 35 55 89 29 45 67 27 47 64 25 43 ++64 25 43 105 35 55 121 37 56 79 28 45 65 27 44 105 35 55 ++159 46 62 159 46 62 159 38 55 171 39 51 171 39 51 144 40 57 ++135 40 58 121 37 56 105 35 55 105 35 55 105 35 55 89 29 45 ++88 29 45 67 27 47 61 26 49 58 26 51 52 25 42 49 25 40 ++48 19 31 35 12 21 7 2 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++97 28 42 185 38 47 148 30 39 71 23 37 52 24 38 42 17 30 ++35 12 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 36 11 20 171 39 51 185 38 47 185 38 47 185 38 47 ++185 38 47 140 40 59 105 35 55 76 28 47 58 20 33 102 29 42 ++140 36 52 171 39 51 159 38 55 119 40 62 105 35 55 143 45 64 ++166 48 64 159 46 62 159 46 62 144 40 57 100 28 46 89 29 45 ++86 29 44 73 26 42 76 28 47 88 29 45 89 29 45 105 35 55 ++105 35 55 88 29 45 67 27 47 61 26 49 56 25 45 52 25 42 ++52 25 42 52 25 42 49 25 40 30 10 18 7 2 4 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 1 ++97 28 42 185 38 47 142 31 41 69 20 33 57 25 43 50 18 33 ++42 17 30 10 4 6 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 31 10 18 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 139 38 56 79 27 44 71 23 37 124 30 42 185 38 47 ++185 38 47 185 38 47 185 38 47 166 48 64 152 49 69 166 48 64 ++185 38 47 166 48 64 143 45 64 112 32 46 117 31 42 141 31 41 ++144 31 43 123 33 48 79 27 44 60 26 44 76 28 47 76 28 47 ++105 35 55 105 35 55 89 29 45 88 29 45 73 26 42 60 26 44 ++56 25 45 52 25 42 49 25 40 49 25 40 40 15 29 16 5 9 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 12 21 ++132 30 39 185 38 47 132 30 39 71 23 37 50 18 33 49 25 40 ++42 17 30 30 10 18 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 36 11 20 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 110 32 46 71 23 37 142 31 41 185 38 47 185 38 47 ++185 38 47 171 39 51 166 48 64 166 48 64 185 38 47 185 38 47 ++185 38 47 185 38 47 171 39 51 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 140 36 52 86 29 44 59 25 44 67 27 47 ++89 29 45 113 41 62 113 41 62 97 28 42 100 28 46 88 29 45 ++65 27 44 58 26 51 56 25 45 49 25 40 52 25 42 42 17 30 ++28 8 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 41 14 25 97 28 42 ++148 30 39 162 38 49 117 31 42 67 23 37 49 25 40 42 17 30 ++42 17 30 35 12 21 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 41 13 21 185 38 47 185 38 47 185 38 47 185 38 47 ++159 35 49 71 23 37 141 31 41 185 38 47 185 38 47 141 31 41 ++117 31 42 113 41 62 118 50 79 113 41 62 166 48 64 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 129 39 59 67 27 47 56 25 45 ++76 28 47 105 35 55 133 35 50 112 32 46 110 32 46 100 28 46 ++89 29 45 86 29 44 73 26 48 62 26 49 58 26 51 52 25 42 ++49 25 40 39 15 26 9 3 6 0 0 0 0 0 0 3 1 1 ++10 4 6 20 6 10 47 16 28 69 20 33 135 30 41 185 38 47 ++185 38 47 152 32 42 97 28 42 63 22 36 50 18 33 48 19 31 ++50 18 33 39 15 26 4 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 41 13 21 185 38 47 185 38 47 185 38 47 171 39 51 ++97 28 42 132 31 43 185 38 47 171 39 51 102 29 42 118 50 79 ++167 135 158 210 187 199 171 141 162 108 54 86 152 40 56 185 38 47 ++185 38 47 185 38 47 171 39 51 121 30 42 132 30 39 152 32 42 ++185 38 47 185 38 47 185 38 47 185 38 47 118 34 52 61 26 49 ++67 27 47 89 29 45 128 33 49 128 33 49 123 33 48 120 32 46 ++120 32 46 120 32 46 100 28 46 76 28 47 73 26 48 65 27 44 ++68 23 35 66 24 37 65 27 44 47 16 28 28 8 14 69 20 33 ++102 29 42 132 30 39 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 124 30 42 79 27 44 60 22 36 51 24 39 50 18 33 ++48 19 31 40 15 29 9 3 6 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 36 11 20 185 38 47 185 38 47 185 38 47 102 29 42 ++117 31 42 185 38 47 171 39 51 112 32 46 148 114 145 233 215 221 ++253 249 249 238 222 225 148 114 145 113 41 62 185 38 47 185 38 47 ++171 39 51 125 35 52 134 49 77 148 114 145 148 114 145 131 80 105 ++113 41 62 154 38 52 185 38 47 185 38 47 171 39 51 88 29 45 ++76 28 47 105 35 55 119 34 51 133 35 50 135 32 45 128 33 49 ++128 33 49 133 35 50 118 34 52 100 28 46 89 29 45 86 29 44 ++100 28 46 121 30 42 135 30 41 135 30 41 148 30 39 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++132 30 39 73 26 42 65 27 44 65 27 44 57 25 43 49 25 40 ++42 17 30 50 18 33 18 7 11 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 7 1 3 141 31 41 185 38 47 145 31 41 97 28 42 ++185 38 47 162 38 49 110 32 46 191 162 183 248 240 240 253 249 249 ++243 232 234 210 187 199 131 80 105 119 40 62 185 38 47 185 38 47 ++128 41 59 159 124 153 226 205 215 231 213 218 226 205 215 228 209 216 ++171 141 162 118 50 79 138 32 45 185 38 47 185 38 47 119 34 51 ++88 29 45 119 40 62 119 40 62 125 41 61 124 34 50 128 33 49 ++128 33 49 128 33 49 124 34 50 118 34 52 110 32 46 119 34 51 ++136 33 46 142 31 41 152 32 42 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 132 30 39 ++97 28 42 71 23 37 66 25 40 57 25 43 49 25 40 42 17 30 ++42 17 30 50 18 33 18 7 11 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 57 17 29 171 39 51 97 28 42 148 30 39 ++185 38 47 97 28 42 167 135 158 253 249 249 253 249 249 243 232 234 ++241 229 231 202 176 194 113 41 62 171 39 51 185 38 47 133 35 50 ++167 135 158 253 249 249 245 236 237 234 219 224 231 213 218 228 209 216 ++219 198 209 148 114 145 86 29 44 171 39 51 185 38 47 159 38 55 ++119 34 51 122 42 63 132 43 63 122 42 63 121 37 56 128 33 49 ++123 33 48 119 34 51 123 32 47 110 32 46 118 34 52 140 36 52 ++145 31 41 152 32 42 162 38 49 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 152 32 42 132 30 39 97 28 42 ++71 23 37 71 23 37 65 27 44 56 25 45 49 25 40 42 17 30 ++42 17 30 42 17 30 18 6 10 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 22 7 12 113 41 62 102 29 42 185 38 47 ++116 30 44 148 114 145 245 236 237 253 249 249 248 240 240 238 224 228 ++243 232 234 167 135 158 141 31 41 185 38 47 162 38 49 141 92 121 ++245 236 237 253 249 249 248 240 240 243 232 234 238 224 228 233 215 221 ++226 205 215 171 141 162 108 54 86 135 30 41 185 38 47 185 38 47 ++152 40 56 135 40 58 141 42 59 135 40 58 128 33 49 133 35 50 ++133 35 50 128 33 49 123 32 47 105 35 55 105 35 55 131 38 56 ++138 32 45 136 31 43 148 30 39 152 32 42 185 38 47 185 38 47 ++185 38 47 171 39 51 142 31 41 117 31 42 97 28 42 86 29 44 ++68 23 35 66 24 37 58 24 38 49 25 40 48 19 31 42 17 30 ++49 25 40 42 17 30 10 4 6 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 7 1 3 73 26 42 145 39 54 144 31 43 ++120 71 102 238 222 225 253 249 249 253 249 249 241 229 231 241 229 231 ++228 209 216 131 80 105 171 39 51 185 38 47 131 80 105 238 224 228 ++253 249 249 248 240 240 238 222 225 238 222 225 238 224 228 238 222 225 ++228 209 216 180 150 172 108 66 98 102 29 42 185 38 47 185 38 47 ++185 38 47 159 38 55 171 39 51 150 36 50 133 35 50 133 31 44 ++129 33 45 120 32 46 128 33 49 128 33 49 121 37 56 128 33 49 ++128 33 49 125 31 44 141 31 41 148 30 39 152 32 42 148 30 39 ++135 30 41 132 30 39 124 30 42 102 29 42 86 29 44 71 23 37 ++65 27 44 56 25 45 51 24 39 49 25 40 50 18 33 48 19 31 ++42 17 30 39 15 26 7 2 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 97 28 42 162 38 49 126 41 60 ++210 187 199 253 249 249 253 249 249 248 240 240 238 224 228 245 236 237 ++196 169 185 136 33 46 185 38 47 143 45 64 196 169 185 253 249 249 ++253 249 249 243 232 234 238 224 228 238 224 228 238 224 228 238 222 225 ++231 213 218 180 150 172 138 88 121 89 29 45 171 39 51 185 38 47 ++185 38 47 185 38 47 171 39 51 150 36 50 142 33 47 135 31 44 ++125 31 44 117 31 44 112 32 46 138 34 49 117 31 44 120 32 46 ++120 32 46 117 31 44 136 31 43 144 31 43 148 30 39 121 30 42 ++117 31 42 102 29 42 97 28 42 73 26 42 65 27 44 60 26 44 ++52 25 42 49 25 40 50 18 33 50 18 33 49 25 40 42 17 30 ++38 12 21 28 8 14 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 18 7 11 117 31 42 132 30 39 167 135 158 ++248 240 240 253 249 249 253 249 249 245 236 237 245 236 237 245 236 237 ++148 114 145 159 38 55 159 38 55 171 141 162 253 249 249 253 249 249 ++248 240 240 243 232 234 233 215 221 234 219 224 241 229 231 231 213 218 ++238 222 225 191 162 183 137 96 131 105 35 55 162 38 49 185 38 47 ++185 38 47 171 39 51 171 39 51 159 35 49 142 33 47 133 32 44 ++123 33 45 117 31 42 132 30 39 123 32 47 118 34 52 118 34 52 ++112 32 46 117 31 44 117 31 44 117 31 42 117 31 42 97 28 42 ++97 28 42 86 29 44 71 23 37 60 25 40 52 25 42 56 25 45 ++49 25 40 49 25 40 49 25 40 49 25 40 48 19 31 42 17 30 ++47 16 28 7 2 4 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 41 13 21 140 36 52 110 32 46 226 205 215 ++233 215 221 233 215 221 241 229 231 241 229 231 243 232 234 233 215 221 ++152 49 69 159 35 49 131 80 105 241 229 231 253 249 249 248 240 240 ++241 229 231 241 229 231 238 222 225 238 224 228 241 229 231 238 222 225 ++233 215 221 202 176 194 148 114 145 108 54 86 152 32 42 185 38 47 ++185 38 47 185 38 47 171 39 51 153 36 50 139 38 56 128 33 49 ++117 31 44 125 31 44 131 32 43 117 31 44 113 41 62 110 32 46 ++117 31 44 133 32 44 117 31 42 89 29 45 89 29 45 86 29 44 ++71 23 37 64 25 43 60 26 44 49 25 40 49 25 40 49 25 40 ++49 25 40 49 25 40 49 25 40 50 18 33 42 17 30 35 12 21 ++16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 57 17 29 135 30 41 159 124 153 196 169 185 ++191 162 183 140 102 127 108 66 98 210 187 199 248 240 240 196 169 185 ++143 45 64 159 46 63 180 150 172 245 236 237 253 249 249 248 240 240 ++241 229 231 231 213 218 241 229 231 241 229 231 238 222 225 238 222 225 ++228 209 216 191 162 183 159 124 153 108 54 86 141 31 41 185 38 47 ++185 38 47 185 38 47 185 38 47 150 36 50 140 36 52 125 31 44 ++123 33 45 121 30 42 116 30 44 102 29 42 110 32 46 112 32 46 ++110 32 46 102 29 42 86 29 44 73 26 42 67 27 47 56 25 45 ++52 25 42 52 25 42 52 25 42 49 25 40 49 25 40 49 25 40 ++49 25 40 49 25 40 42 17 30 40 15 29 35 12 21 10 4 6 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 97 28 42 152 49 69 191 162 183 141 92 121 ++228 209 216 108 66 98 50 18 33 140 102 127 243 232 234 131 80 105 ++148 37 53 134 49 77 180 150 172 191 162 183 196 169 185 210 187 199 ++241 229 231 233 215 221 231 213 218 238 224 228 238 222 225 238 222 225 ++233 215 221 202 176 194 159 124 153 93 57 98 124 30 42 185 38 47 ++185 38 47 185 38 47 185 38 47 146 36 50 133 35 50 124 30 42 ++125 31 44 124 30 42 110 32 46 102 29 42 97 28 42 97 28 42 ++97 28 42 71 23 37 57 25 43 56 25 45 56 25 45 52 25 42 ++49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 ++49 25 40 49 25 40 49 25 40 31 10 18 7 2 4 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 4 0 1 102 29 42 141 92 121 131 80 105 180 150 172 ++196 169 185 58 26 51 52 25 42 120 71 102 202 176 194 121 37 56 ++135 40 58 71 23 37 108 54 86 210 187 199 108 54 86 89 29 45 ++202 176 194 243 232 234 238 224 228 234 219 224 241 229 231 238 222 225 ++233 215 221 202 176 194 159 124 153 108 54 86 124 30 42 185 38 47 ++185 38 47 185 38 47 185 38 47 162 38 49 159 35 49 135 31 44 ++125 31 44 121 30 42 117 31 42 97 28 42 86 29 44 67 23 37 ++52 24 38 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 ++49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 ++49 25 40 49 25 40 35 12 21 7 2 4 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 10 4 6 97 28 42 131 80 105 76 28 47 137 96 131 ++93 57 98 54 21 35 50 18 33 108 54 86 159 124 153 125 35 52 ++89 29 45 48 19 31 159 124 153 191 162 183 51 24 39 54 19 32 ++131 80 105 243 232 234 245 236 237 243 232 234 241 229 231 238 224 228 ++228 209 216 202 176 194 167 135 158 93 57 98 121 30 42 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 152 32 42 129 33 45 ++121 30 42 117 31 42 97 28 42 71 23 37 67 22 35 54 21 35 ++52 24 38 56 25 45 52 25 42 49 25 40 52 25 42 49 25 40 ++49 25 40 49 25 40 49 25 40 48 19 31 50 18 33 42 17 30 ++50 18 33 22 7 12 1 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 10 4 6 86 29 44 79 27 44 60 25 40 49 25 40 ++57 25 43 56 25 45 52 20 33 108 54 86 134 49 77 129 39 59 ++71 23 37 60 25 40 196 169 185 167 135 158 50 18 33 52 25 42 ++76 28 47 219 198 209 248 240 240 241 229 231 245 236 237 238 224 228 ++231 213 218 202 176 194 159 124 153 93 57 98 132 30 39 185 38 47 ++185 38 47 185 38 47 185 38 47 171 39 51 152 32 42 132 30 39 ++124 30 42 102 29 42 86 29 44 71 23 37 67 22 35 52 24 38 ++52 25 42 49 25 40 52 25 42 49 25 40 49 25 40 49 25 40 ++49 25 40 49 25 40 49 25 40 42 17 30 42 17 30 28 8 14 ++22 7 12 3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 57 17 29 138 37 53 65 27 44 61 26 49 56 25 45 ++51 24 39 49 25 40 58 24 38 88 29 45 144 40 57 135 40 58 ++63 22 36 52 25 42 167 135 158 120 71 102 49 25 40 56 25 45 ++67 27 47 196 169 185 248 240 240 243 232 234 245 236 237 238 224 228 ++219 198 209 196 169 185 137 96 131 76 28 47 159 35 49 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 152 32 42 142 31 41 ++135 30 41 121 30 42 97 28 42 71 23 37 61 21 34 50 18 33 ++52 25 42 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 ++49 25 40 49 25 40 48 19 31 35 12 21 16 5 9 1 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++22 7 12 152 32 42 148 37 50 66 25 40 67 27 47 61 26 49 ++52 25 42 52 25 42 54 21 35 79 27 44 154 39 54 113 41 62 ++60 25 40 61 26 49 58 26 51 62 26 49 56 25 45 56 25 45 ++61 21 34 167 135 158 248 240 240 238 222 225 243 232 234 238 222 225 ++228 209 216 180 150 172 137 96 131 79 28 45 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 171 39 51 159 35 49 135 30 41 ++132 30 39 124 30 42 102 29 42 71 23 37 67 22 35 48 16 29 ++49 25 40 52 25 42 49 25 40 49 25 40 49 25 40 50 18 33 ++42 17 30 41 14 25 22 7 12 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 57 17 29 ++162 38 49 185 38 47 171 39 51 97 28 42 60 23 38 65 27 44 ++60 26 44 60 26 44 57 17 29 131 32 43 159 38 55 89 29 45 ++57 25 43 61 26 49 56 25 45 61 26 49 61 26 49 61 26 49 ++65 27 44 171 141 162 243 232 234 243 232 234 245 236 237 233 215 221 ++219 198 209 171 141 162 120 71 102 100 28 46 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 171 39 51 150 36 50 135 31 44 ++121 30 42 121 30 42 102 29 42 86 29 44 61 21 34 56 22 36 ++49 25 40 52 25 42 52 25 42 49 25 40 49 25 40 42 17 30 ++48 19 31 22 7 12 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 10 4 6 97 28 42 185 38 47 ++185 38 47 185 38 47 185 38 47 159 35 49 117 31 42 71 23 37 ++71 23 37 71 23 37 124 30 42 185 38 47 171 39 51 97 28 42 ++60 26 44 62 26 49 52 25 42 61 26 49 61 26 49 67 27 47 ++73 26 48 171 141 162 243 232 234 245 236 237 243 232 234 231 213 218 ++202 176 194 159 124 153 93 57 98 131 38 56 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 171 39 51 159 35 49 135 32 45 ++124 30 42 117 31 42 102 29 42 71 23 37 61 21 34 52 24 38 ++49 25 40 49 25 40 52 25 42 52 25 42 49 25 40 40 15 29 ++36 11 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 7 2 4 102 29 42 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 133 32 44 71 23 37 ++73 26 42 110 32 46 153 36 50 171 39 51 171 39 51 112 32 46 ++67 27 47 61 26 49 61 26 49 61 26 49 56 25 45 57 25 43 ++105 35 55 210 187 199 245 236 237 241 229 231 231 213 218 233 215 221 ++210 187 199 146 108 143 76 28 47 159 35 49 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 152 32 42 138 32 45 ++117 31 42 110 32 46 97 28 42 71 23 37 60 23 38 51 24 39 ++51 24 39 49 25 40 52 25 42 52 25 42 49 25 40 49 25 40 ++16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 38 12 21 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 135 30 41 124 30 42 152 32 42 ++171 39 51 171 39 51 153 36 50 136 31 43 171 39 51 171 39 51 ++89 29 45 67 27 47 56 25 45 60 26 44 60 22 36 67 22 35 ++159 124 153 243 232 234 243 232 234 233 215 221 231 213 218 226 205 215 ++180 150 172 108 66 98 97 28 42 185 38 47 185 38 47 185 38 47 ++185 38 47 171 39 51 171 39 51 171 39 51 153 36 50 135 32 45 ++123 32 47 102 29 42 97 28 42 71 23 37 60 25 40 57 25 43 ++49 25 40 49 25 40 52 25 42 52 25 42 49 25 40 49 25 40 ++16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 10 4 6 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 7 2 4 110 32 46 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 148 30 39 148 30 39 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 171 39 51 162 38 49 185 38 47 ++120 32 46 71 23 37 56 25 45 57 25 43 61 21 34 108 54 86 ++219 198 209 241 229 231 233 215 221 238 222 225 226 205 215 191 162 183 ++137 96 131 105 35 55 171 39 51 185 38 47 185 38 47 185 38 47 ++185 38 47 159 38 55 159 38 55 162 38 49 144 40 57 136 33 46 ++112 32 46 110 32 46 86 29 44 73 26 42 64 24 39 57 25 43 ++56 25 45 58 26 51 58 26 51 58 26 51 49 25 40 49 25 40 ++9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 3 1 1 108 66 98 120 71 102 140 102 127 ++93 57 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 10 4 6 153 36 50 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 135 30 41 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 159 38 55 159 38 55 ++150 39 55 105 35 55 66 25 40 60 23 38 76 28 47 167 135 158 ++248 240 240 253 249 249 243 232 234 233 215 221 202 176 194 148 114 145 ++108 66 98 121 37 56 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 171 39 51 171 39 51 171 39 51 150 39 55 138 34 49 ++112 32 46 102 29 42 97 28 42 71 23 37 67 23 37 60 26 44 ++61 26 49 58 26 51 58 26 51 52 25 42 49 25 40 49 25 40 ++9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 1 0 0 93 57 98 202 176 194 ++167 135 158 108 66 98 42 17 30 0 0 0 0 0 0 0 0 0 ++0 0 0 7 2 4 152 32 42 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 132 30 39 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 152 40 56 128 41 59 ++121 37 56 119 40 62 105 35 55 79 27 44 105 35 55 148 114 145 ++180 150 172 191 162 183 148 114 145 141 92 121 108 54 86 108 54 86 ++86 29 44 124 37 57 159 35 49 171 39 51 185 38 47 185 38 47 ++153 36 50 159 46 62 171 39 51 171 39 51 152 32 42 135 32 45 ++110 32 46 102 29 42 86 29 44 71 23 37 52 24 38 60 26 44 ++58 26 51 58 26 51 58 26 51 52 25 42 49 25 40 49 25 40 ++9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 88 121 ++146 108 143 58 26 51 58 26 51 10 4 6 0 0 0 0 0 0 ++0 0 0 7 2 4 141 31 41 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 135 30 41 148 30 39 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 171 39 51 143 45 64 123 43 68 ++113 41 62 105 35 55 105 35 55 136 44 65 131 38 56 105 35 55 ++105 35 55 116 30 44 116 30 44 102 29 42 117 31 42 124 30 42 ++132 30 39 153 36 50 159 35 49 171 39 51 171 39 51 159 35 49 ++153 36 50 144 40 57 150 39 55 154 39 54 159 38 55 123 33 45 ++102 29 42 97 28 42 86 29 44 73 26 42 51 24 39 58 26 51 ++58 26 51 58 26 51 52 25 42 52 25 42 49 25 40 39 15 26 ++4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 58 26 51 ++196 169 185 93 57 98 58 26 51 42 17 30 3 1 1 0 0 0 ++0 0 0 7 2 4 97 28 42 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 171 39 51 116 30 44 132 30 39 185 38 47 ++185 38 47 171 39 51 159 46 63 143 45 66 134 49 77 108 54 86 ++108 54 86 108 54 86 76 28 47 119 34 51 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++171 39 51 154 39 54 144 40 57 140 36 52 142 33 47 120 32 46 ++102 29 42 89 29 45 86 29 44 65 27 44 56 25 45 58 26 51 ++58 26 51 58 26 51 52 25 42 52 25 42 52 25 42 35 12 21 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 25 40 ++171 141 162 120 71 102 93 57 98 93 57 98 18 7 11 0 0 0 ++0 0 0 0 0 0 36 11 20 171 39 51 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 159 38 55 112 32 46 110 32 46 ++117 31 44 119 40 62 113 41 62 89 29 45 88 29 45 76 28 47 ++76 28 47 105 35 55 76 28 47 110 32 46 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 171 39 51 159 35 49 159 35 49 136 33 46 110 32 46 ++102 29 42 86 29 44 73 26 42 59 25 44 61 26 49 58 26 51 ++58 26 51 58 26 51 58 26 51 49 25 40 49 25 40 30 10 18 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++49 25 40 22 7 12 7 2 4 93 57 98 93 57 98 0 0 0 ++0 0 0 0 0 0 18 7 11 133 35 50 185 38 47 185 38 47 ++185 38 47 154 39 54 141 40 57 159 46 63 166 48 64 138 34 49 ++116 30 44 105 35 55 113 41 62 105 35 55 105 35 55 121 37 56 ++105 35 55 113 41 62 113 41 62 135 40 58 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 171 39 51 154 38 52 128 33 49 101 29 42 ++86 29 44 79 28 45 67 27 47 61 26 49 56 25 45 52 25 42 ++58 26 51 58 26 51 52 25 42 49 25 40 49 25 40 16 5 9 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 25 40 ++138 88 121 148 114 145 140 102 127 148 114 145 30 10 18 0 0 0 ++0 0 0 0 0 0 0 0 0 18 7 11 137 96 131 40 15 29 ++0 0 0 0 0 0 0 0 0 58 24 38 159 46 62 185 38 47 ++185 38 47 141 43 61 89 29 45 86 29 44 140 36 52 185 38 47 ++171 39 51 171 39 51 159 38 55 159 38 55 166 48 64 166 48 64 ++166 48 64 159 46 63 152 49 69 166 48 64 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 159 35 49 124 34 50 118 34 52 100 28 46 ++86 29 44 67 27 47 67 27 47 58 26 51 58 26 51 58 26 51 ++58 26 51 58 26 51 58 26 51 52 25 42 40 15 29 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 15 26 ++171 141 162 146 108 143 146 108 143 120 71 102 30 10 18 0 0 0 ++0 0 0 0 0 0 0 0 0 1 0 0 108 66 98 95 59 101 ++0 0 0 0 0 0 0 0 0 0 0 0 35 12 21 117 31 44 ++171 39 51 171 39 51 135 40 58 79 28 45 77 27 45 141 40 57 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 ++171 39 51 159 38 55 133 35 50 121 37 56 105 35 55 105 35 55 ++88 29 45 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 ++58 26 51 58 26 51 49 25 40 39 15 26 7 2 4 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 ++140 102 127 76 28 47 58 26 51 93 57 98 39 15 26 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 30 10 18 137 96 131 ++39 15 26 0 0 0 0 0 0 0 0 0 0 0 0 4 0 1 ++79 27 44 144 45 67 159 46 63 134 49 77 88 29 45 89 29 45 ++152 40 56 171 39 51 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 166 48 64 159 46 63 159 38 55 159 38 55 150 39 55 ++140 40 59 119 40 62 113 41 62 105 35 55 105 35 55 88 29 45 ++67 27 47 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 ++58 26 51 52 25 42 40 15 29 7 2 4 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++140 102 127 93 57 98 76 28 47 58 26 51 93 57 98 30 10 18 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 148 114 145 ++58 26 51 3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 28 8 14 61 21 34 105 35 55 118 50 79 88 29 45 ++102 29 42 152 40 56 166 48 64 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 166 48 64 159 46 63 ++141 43 61 125 41 61 105 35 55 105 35 55 105 35 55 105 35 55 ++105 35 55 122 42 63 113 41 62 105 35 55 88 29 45 73 26 48 ++67 27 47 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 ++52 25 42 35 12 21 1 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++140 102 127 49 25 40 35 12 21 58 26 51 93 57 98 58 26 51 ++49 25 40 30 10 18 16 5 9 0 0 0 52 25 42 138 88 121 ++40 15 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 16 5 9 51 24 39 105 35 55 ++76 28 47 105 35 55 143 45 64 166 48 64 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 171 39 51 166 48 64 159 46 63 134 49 77 118 50 79 ++113 41 62 66 24 37 61 21 34 79 27 44 76 28 47 76 28 47 ++88 29 45 105 35 55 105 35 55 76 28 47 58 26 51 58 26 51 ++58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 ++40 15 29 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 42 17 30 93 57 98 ++58 26 51 58 26 51 58 26 51 93 57 98 108 66 98 58 26 51 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 5 9 ++42 17 30 77 27 45 105 35 55 128 41 59 166 48 64 166 48 64 ++166 48 64 185 38 47 171 39 51 171 39 51 166 48 64 159 46 62 ++159 38 55 159 46 62 139 44 66 118 50 79 108 54 86 76 28 47 ++73 26 42 73 26 42 89 29 45 113 41 62 118 50 79 123 42 67 ++122 42 63 113 41 62 105 35 55 73 26 48 58 26 51 58 26 51 ++58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 39 15 26 ++3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 10 4 6 140 102 127 159 124 153 120 71 102 ++140 102 127 140 102 127 131 80 105 131 80 105 108 66 98 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 15 26 ++58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 42 17 30 ++1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 18 7 11 47 16 28 79 27 44 119 40 62 145 47 69 ++152 49 69 152 49 69 152 49 69 145 47 69 145 47 69 136 44 65 ++125 41 61 113 41 62 105 35 55 76 28 47 76 28 47 97 28 42 ++117 31 44 128 41 59 128 42 60 128 42 60 124 42 65 113 41 62 ++105 35 55 105 35 55 105 35 55 88 29 45 76 28 47 58 26 51 ++58 26 51 58 26 51 58 26 51 49 25 40 30 10 18 4 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 39 15 26 202 176 194 226 205 215 ++202 176 194 191 162 183 159 124 153 131 80 105 35 12 21 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++52 25 42 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 ++22 7 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 9 3 6 1 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 18 6 10 73 26 42 105 35 55 ++105 35 55 113 41 62 113 41 62 113 41 62 113 41 62 105 35 55 ++105 35 55 76 28 47 79 27 44 101 29 42 129 33 45 150 39 55 ++144 40 57 136 33 46 125 35 52 113 41 62 105 35 55 105 35 55 ++105 35 55 105 35 55 88 29 45 76 28 47 58 26 51 58 26 51 ++58 26 51 52 25 42 49 25 40 22 7 12 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 18 7 11 159 124 153 ++146 108 143 146 108 143 148 114 145 108 66 98 10 4 6 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 ++93 57 98 93 63 110 58 26 51 58 26 51 58 26 51 58 26 51 ++56 25 45 18 7 11 7 2 4 3 1 1 39 15 26 124 30 42 ++152 32 42 159 38 55 171 39 51 97 28 42 7 1 3 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 4 0 1 57 17 29 ++121 37 56 105 35 55 100 28 46 97 28 42 86 29 44 86 29 44 ++97 28 42 117 31 42 141 33 45 153 36 50 153 36 50 140 36 52 ++128 33 49 105 35 55 105 35 55 105 35 55 89 29 45 105 35 55 ++105 35 55 76 28 47 67 27 47 58 26 51 58 26 51 58 26 51 ++52 25 42 49 25 40 16 5 9 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 ++93 57 98 93 63 110 93 57 98 108 66 98 131 80 105 42 17 30 ++49 25 40 76 28 47 67 27 47 42 17 30 76 28 47 140 102 127 ++171 141 162 93 63 110 58 26 51 42 17 30 58 26 51 58 26 51 ++58 26 51 58 26 51 76 28 47 65 27 44 152 32 42 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 112 32 46 39 15 26 ++3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++20 6 10 69 20 33 139 37 53 159 38 55 159 35 49 162 38 49 ++159 38 55 162 38 49 150 36 50 142 32 45 124 34 50 105 35 55 ++105 35 55 88 29 45 105 35 55 105 35 55 89 29 45 89 29 45 ++105 35 55 88 29 45 76 28 47 58 26 51 58 26 51 52 25 42 ++52 25 42 39 15 26 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 10 4 6 58 26 51 58 26 51 58 26 51 93 57 98 ++108 66 98 131 80 105 137 96 131 159 124 153 167 135 158 137 96 131 ++58 26 51 22 7 12 7 2 4 0 0 0 9 3 6 35 12 21 ++49 25 40 58 26 51 58 26 51 112 32 46 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 153 36 50 105 35 55 58 26 51 ++18 7 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 3 1 1 42 17 30 97 28 42 119 34 51 128 33 49 ++131 38 56 122 40 63 105 35 55 105 35 55 88 29 45 76 28 47 ++76 28 47 73 26 42 105 35 55 105 35 55 105 35 55 105 35 55 ++105 35 55 105 35 55 89 29 45 76 28 47 58 26 51 52 25 42 ++49 25 40 18 7 11 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 3 1 1 22 7 12 18 7 11 22 7 12 ++30 10 18 30 10 18 40 15 29 42 17 30 30 10 18 9 3 6 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++28 8 14 58 26 51 58 26 51 118 34 52 185 38 47 185 38 47 ++185 38 47 185 38 47 171 39 51 118 34 52 58 26 51 58 26 51 ++49 25 40 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 3 1 1 57 17 29 79 27 44 71 23 37 ++73 26 42 71 23 37 79 27 44 67 23 37 68 23 35 79 27 44 ++86 29 44 105 35 55 124 35 54 128 33 49 135 32 45 138 32 45 ++128 33 49 119 34 51 100 28 46 86 29 44 58 26 51 58 26 51 ++48 19 31 16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 0 0 39 15 26 58 26 51 76 28 47 152 32 42 185 38 47 ++185 38 47 185 38 47 135 40 58 76 28 47 58 26 51 58 26 51 ++30 10 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 57 17 29 139 44 68 139 38 56 ++135 30 41 117 31 42 116 30 44 123 32 47 125 35 52 135 40 58 ++135 40 58 140 36 52 152 32 42 162 38 49 162 38 49 185 38 47 ++162 38 49 152 32 42 128 33 49 100 28 46 62 26 49 58 26 51 ++52 25 42 22 7 12 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 30 10 18 76 28 47 119 40 62 102 29 42 142 34 47 ++150 36 50 128 41 59 105 35 55 76 28 47 58 26 51 48 19 31 ++1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 7 2 4 118 34 52 159 46 63 171 39 51 ++185 38 47 171 39 51 171 39 51 171 39 51 171 39 51 171 39 51 ++171 39 51 162 38 49 171 39 51 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 171 39 51 118 34 52 76 28 47 56 25 45 ++58 26 51 30 10 18 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 31 10 18 154 39 54 185 38 47 150 36 50 123 33 45 ++112 32 46 105 35 55 105 35 55 76 28 47 61 26 49 67 27 47 ++1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 1 0 0 61 21 34 166 48 64 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 138 32 45 76 28 47 56 25 45 ++49 25 40 42 17 30 1 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 0 0 117 31 42 185 38 47 185 38 47 185 38 47 185 38 47 ++162 38 49 125 41 61 105 35 55 67 27 47 61 21 34 61 26 49 ++39 15 26 22 7 12 18 7 11 7 2 4 3 1 1 3 1 1 ++30 10 18 66 25 40 139 38 56 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 100 28 46 61 26 49 ++49 25 40 49 25 40 20 6 10 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++28 8 14 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 139 44 68 108 54 86 73 26 48 57 25 43 58 26 51 ++58 26 51 58 26 51 58 26 51 56 25 45 52 25 42 56 25 45 ++73 26 48 113 41 62 152 49 69 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 171 39 51 162 38 49 162 38 49 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 132 30 39 76 28 47 ++58 26 51 49 25 40 35 12 21 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++41 13 21 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++166 48 64 134 49 77 108 54 86 76 28 47 67 27 47 73 26 48 ++58 26 51 58 26 51 58 26 51 58 26 51 61 26 49 61 26 49 ++108 54 86 105 35 55 105 35 55 119 34 51 133 32 44 148 30 39 ++152 32 42 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 159 35 49 159 35 49 159 35 49 159 35 49 171 39 51 ++185 38 47 185 38 47 185 38 47 171 39 51 125 31 44 79 27 44 ++58 26 51 49 25 40 40 15 29 10 4 6 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++36 11 20 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++152 40 56 118 50 79 108 54 86 76 28 47 66 25 40 76 28 47 ++58 26 51 58 26 51 58 26 51 58 26 51 61 26 49 76 28 47 ++113 41 62 133 35 50 150 39 55 162 38 49 162 38 49 148 30 39 ++132 30 39 132 30 39 132 30 39 154 39 54 159 46 62 154 39 54 ++146 36 50 138 34 49 138 37 53 135 40 58 141 40 57 150 36 50 ++159 35 49 171 39 51 185 38 47 150 36 50 105 35 55 79 28 45 ++58 26 51 52 25 42 49 25 40 30 10 18 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++7 2 4 117 31 44 171 39 51 185 38 47 166 48 64 145 47 69 ++118 50 79 108 54 86 105 35 55 73 26 42 76 28 47 105 35 55 ++76 28 47 58 26 51 58 26 51 58 26 51 52 24 38 64 24 39 ++121 37 56 171 39 51 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 152 32 42 121 30 42 102 29 42 124 34 50 ++124 35 54 113 41 62 113 41 62 113 41 62 113 41 62 118 34 52 ++133 35 50 159 35 49 159 35 49 133 35 50 88 29 45 79 28 45 ++58 26 51 52 25 42 49 25 40 42 17 30 10 4 6 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 16 5 9 105 35 55 113 41 62 100 28 46 89 29 45 ++76 28 47 76 28 47 73 26 42 76 28 47 105 35 55 105 35 55 ++58 26 51 58 26 51 58 26 51 58 26 51 56 25 45 60 22 36 ++101 29 42 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 124 30 42 86 29 44 ++105 35 55 105 35 55 105 35 55 76 28 47 76 28 47 105 35 55 ++100 28 46 116 30 44 152 32 42 138 34 49 79 28 45 62 26 49 ++52 25 42 52 25 42 49 25 40 49 25 40 28 8 14 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 7 2 4 60 26 44 110 32 46 102 29 42 ++97 28 42 118 34 52 121 37 56 113 41 62 113 41 62 73 26 48 ++58 26 51 58 26 51 58 26 51 61 26 49 62 26 49 52 25 42 ++71 23 37 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 133 35 50 ++97 28 42 86 29 44 76 28 47 73 26 48 76 28 47 88 29 45 ++69 20 33 79 27 44 139 38 56 125 35 52 76 28 47 58 26 51 ++58 26 51 52 25 42 49 25 40 49 25 40 30 10 18 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 1 0 0 57 17 29 152 32 42 ++185 38 47 166 48 64 123 43 68 108 54 86 105 35 55 58 26 51 ++58 26 51 58 24 38 58 26 51 58 26 51 56 25 45 54 19 32 ++105 35 55 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++159 35 49 117 31 42 86 29 44 71 23 37 71 23 37 67 23 37 ++71 23 37 116 30 44 138 37 53 105 35 55 76 28 47 58 26 51 ++58 26 51 52 25 42 49 25 40 49 25 40 35 12 21 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 8 14 ++102 29 42 110 32 46 105 35 55 76 28 47 65 27 44 61 26 49 ++49 25 40 56 25 45 58 26 51 58 26 51 58 20 33 71 23 37 ++159 38 55 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 171 39 51 150 36 50 128 33 49 118 34 52 89 29 45 ++89 29 45 105 35 55 89 29 45 73 26 48 61 26 49 58 26 51 ++52 25 42 52 25 42 49 25 40 49 25 40 39 15 26 1 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 3 1 1 10 4 6 35 12 21 58 26 51 ++58 26 51 58 26 51 58 26 51 49 25 40 69 20 33 171 39 51 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 ++171 39 51 151 38 54 133 35 50 121 37 56 105 35 55 105 35 55 ++76 28 47 62 26 49 73 26 48 58 26 51 58 26 51 58 26 51 ++52 25 42 52 25 42 49 25 40 49 25 40 40 15 29 9 3 6 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 4 6 ++51 24 39 56 25 45 66 25 40 110 32 46 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 139 37 53 ++125 35 52 118 34 52 105 35 55 105 35 55 88 29 45 76 28 47 ++62 26 49 61 26 49 62 26 49 58 26 51 56 25 45 49 25 40 ++52 25 42 52 25 42 49 25 40 42 17 30 42 17 30 22 7 12 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++10 4 6 71 23 37 119 34 51 159 38 55 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 171 39 51 152 32 42 138 34 46 118 34 52 ++105 35 55 89 29 45 76 28 47 76 28 47 73 26 48 73 26 48 ++62 26 49 58 26 51 61 26 49 52 25 42 52 25 42 58 26 51 ++58 26 51 49 25 40 49 25 40 48 19 31 50 18 33 28 8 14 ++1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 48 16 29 125 41 61 128 42 60 145 39 54 171 39 51 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 159 38 55 141 40 57 124 34 50 100 28 46 89 29 45 ++86 29 44 76 28 47 73 26 48 67 27 47 58 26 51 62 26 49 ++58 26 51 56 25 45 56 25 45 58 26 51 58 26 51 58 26 51 ++52 25 42 49 25 40 49 25 40 42 17 30 35 12 21 16 5 9 ++1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 22 7 12 89 29 45 113 41 62 118 50 79 122 42 63 ++132 43 63 144 40 57 159 38 55 153 36 50 171 39 51 150 39 55 ++135 40 58 128 41 59 113 41 62 105 35 55 105 35 55 76 28 47 ++73 26 48 73 26 48 73 26 48 58 26 51 58 26 51 58 26 51 ++58 26 51 58 26 51 58 26 51 58 26 51 52 25 42 49 25 40 ++49 25 40 49 25 40 49 25 40 50 18 33 20 6 10 1 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 7 2 4 56 22 36 76 28 47 105 35 55 113 41 62 ++118 50 79 113 41 62 123 43 68 113 41 62 122 40 63 119 40 62 ++113 41 62 105 35 55 105 35 55 89 29 45 76 28 47 73 26 48 ++73 26 48 73 26 48 58 26 51 58 26 51 58 26 51 58 26 51 ++58 26 51 58 26 51 58 26 51 52 25 42 52 25 42 49 25 40 ++49 25 40 48 19 31 42 17 30 42 17 30 22 7 12 1 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 31 10 18 69 20 33 86 29 44 89 29 45 ++105 35 55 105 35 55 118 50 79 113 41 62 113 41 62 105 35 55 ++105 35 55 105 35 55 105 35 55 76 28 47 73 26 48 67 27 47 ++58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 ++58 26 51 58 26 51 52 25 42 49 25 40 49 25 40 49 25 40 ++49 25 40 50 18 33 40 15 29 48 16 29 16 5 9 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 86 29 44 97 28 42 105 35 55 88 29 45 ++88 29 45 105 35 55 113 41 62 113 41 62 108 54 86 108 54 86 ++105 35 55 105 35 55 76 28 47 76 28 47 73 26 48 58 26 51 ++58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 52 25 42 ++49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 50 18 33 ++42 17 30 39 15 26 38 12 21 28 8 14 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 28 8 14 185 38 47 162 38 49 86 29 44 79 28 45 ++76 28 47 113 41 62 118 50 79 108 54 86 108 54 86 108 54 86 ++105 35 55 76 28 47 76 28 47 62 26 49 62 26 49 58 26 51 ++58 26 51 56 25 45 52 25 42 52 25 42 49 25 40 49 25 40 ++49 25 40 49 25 40 49 25 40 48 19 31 42 17 30 39 15 26 ++39 15 26 38 12 21 42 17 30 28 8 14 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 57 17 29 185 38 47 185 38 47 171 39 51 119 34 51 ++89 29 45 105 35 55 108 54 86 108 54 86 108 54 86 108 54 86 ++73 26 48 73 26 48 62 26 49 73 26 48 58 26 51 58 26 51 ++58 26 51 58 26 51 52 25 42 49 25 40 49 25 40 49 25 40 ++49 25 40 48 19 31 42 17 30 39 15 26 39 15 26 42 17 30 ++42 17 30 49 25 40 52 25 42 35 12 21 4 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 69 20 33 185 38 47 185 38 47 185 38 47 185 38 47 ++154 39 54 119 40 62 105 35 55 105 35 55 105 35 55 105 35 55 ++76 28 47 73 26 48 62 26 49 58 26 51 58 26 51 56 25 45 ++61 26 49 49 25 40 42 17 30 50 18 33 48 19 31 42 17 30 ++42 17 30 42 17 30 42 17 30 49 25 40 49 25 40 58 26 51 ++58 26 51 49 25 40 48 19 31 42 17 30 7 1 3 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 69 20 33 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 166 48 64 135 40 58 105 35 55 88 29 45 88 29 45 ++76 28 47 62 26 49 60 26 44 52 24 38 49 25 40 49 25 40 ++57 25 43 58 24 38 52 24 38 49 25 40 49 25 40 50 18 33 ++49 25 40 50 18 33 48 19 31 52 25 42 58 26 51 58 26 51 ++58 26 51 52 25 42 48 19 31 42 17 30 4 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 41 13 21 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 152 40 56 119 34 51 105 35 55 ++88 29 45 76 28 47 65 27 44 64 25 43 65 27 44 73 26 48 ++76 28 47 76 28 47 76 28 47 60 26 44 48 19 31 42 17 30 ++48 19 31 49 25 40 49 25 40 42 17 30 52 25 42 52 25 42 ++52 25 42 52 25 42 49 25 40 48 19 31 10 4 6 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 16 5 9 152 32 42 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 166 48 64 134 49 77 ++119 40 62 113 41 62 105 35 55 105 35 55 105 35 55 105 35 55 ++105 35 55 88 29 45 105 35 55 76 28 47 73 26 48 58 24 38 ++42 17 30 42 17 30 42 17 30 42 17 30 42 17 30 42 17 30 ++52 25 42 56 25 45 49 25 40 49 25 40 30 10 18 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 9 3 6 102 29 42 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 171 39 51 ++152 49 69 152 40 56 141 42 59 131 42 64 126 41 60 105 35 55 ++105 35 55 113 41 62 105 35 55 88 29 45 105 35 55 105 35 55 ++61 26 49 48 19 31 49 25 40 42 17 30 42 17 30 42 17 30 ++48 19 31 49 25 40 49 25 40 49 25 40 40 15 29 3 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 16 5 9 159 35 49 185 38 47 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++166 48 64 166 48 64 159 46 63 144 40 57 136 44 65 125 41 61 ++113 41 62 113 41 62 105 35 55 105 35 55 105 35 55 105 35 55 ++76 28 47 61 26 49 48 19 31 48 19 31 48 19 31 42 17 30 ++49 25 40 49 25 40 50 18 33 49 25 40 42 17 30 22 7 12 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 36 11 20 171 39 51 185 38 47 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 185 38 47 171 39 51 154 39 54 144 40 57 128 42 60 ++113 41 62 105 35 55 105 35 55 105 35 55 105 35 55 76 28 47 ++73 26 48 58 26 51 58 26 51 49 25 40 42 17 30 42 17 30 ++42 17 30 49 25 40 42 17 30 48 19 31 49 25 40 42 17 30 ++7 2 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 28 8 14 152 32 42 ++185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 185 38 47 ++185 38 47 171 39 51 159 46 62 144 40 57 144 40 57 129 39 59 ++113 41 62 105 35 55 105 35 55 105 35 55 76 28 47 73 26 48 ++58 26 51 58 26 51 58 26 51 58 26 51 52 25 42 42 17 30 ++42 17 30 42 17 30 48 19 31 49 25 40 49 25 40 49 25 40 ++35 12 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 11 20 ++144 40 57 152 40 56 152 40 56 159 38 55 159 38 55 166 48 64 ++166 48 64 159 46 63 145 47 69 130 43 63 119 40 62 105 35 55 ++105 35 55 105 35 55 105 35 55 93 57 98 76 28 47 58 26 51 ++58 26 51 58 26 51 58 26 51 58 26 51 52 25 42 49 25 40 ++49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 ++48 19 31 16 5 9 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 ++86 29 44 118 50 79 118 50 79 118 50 79 129 39 59 136 44 65 ++126 41 60 123 42 67 118 50 79 108 54 86 108 54 86 105 35 55 ++105 35 55 105 35 55 76 28 47 73 26 48 58 26 51 58 26 51 ++58 26 51 58 26 51 58 26 51 49 25 40 49 25 40 52 25 42 ++49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 ++48 19 31 36 11 20 9 3 6 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 30 10 18 ++108 54 86 76 28 47 105 35 55 113 41 62 118 50 79 113 41 62 ++113 41 62 108 54 86 105 35 55 105 35 55 105 35 55 105 35 55 ++76 28 47 76 28 47 73 26 48 58 26 51 58 26 51 58 26 51 ++58 26 51 58 26 51 52 25 42 52 25 42 52 25 42 49 25 40 ++52 25 42 49 25 40 49 25 40 49 25 40 49 25 40 49 25 40 ++42 17 30 50 18 33 35 12 21 4 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 15 26 ++105 35 55 105 35 55 113 41 62 105 35 55 76 28 47 76 28 47 ++76 28 47 88 29 45 76 28 47 73 26 48 67 27 47 65 27 44 ++62 26 49 62 26 49 67 27 47 60 26 44 52 25 42 52 25 42 ++49 25 40 56 25 45 52 25 42 50 18 33 49 25 40 49 25 40 ++52 25 42 56 25 45 52 25 42 49 25 40 49 25 40 49 25 40 ++49 25 40 49 25 40 42 17 30 28 8 14 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 13 21 ++129 39 59 152 40 56 159 46 63 133 43 64 105 35 55 66 25 40 ++67 27 47 61 25 44 65 27 44 76 28 47 79 28 45 86 29 44 ++89 29 45 88 29 45 67 27 47 49 25 40 52 24 38 52 24 38 ++51 24 39 49 25 40 49 25 40 52 25 42 56 25 45 58 26 51 ++62 26 49 56 25 45 42 17 30 35 12 21 42 17 30 49 25 40 ++49 25 40 42 17 30 48 19 31 42 17 30 28 8 14 4 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 7 2 4 67 23 37 ++134 49 77 152 49 69 166 48 64 166 48 64 145 39 54 102 29 42 ++100 28 46 77 27 45 60 26 44 73 26 48 113 41 62 138 37 53 ++133 35 50 131 38 56 105 35 55 76 28 47 66 25 40 76 28 47 ++88 29 45 105 35 55 76 28 47 73 26 48 73 26 48 73 26 48 ++73 26 48 48 19 31 10 4 6 0 0 0 18 7 11 49 25 40 ++52 25 42 49 25 40 49 25 40 49 25 40 49 25 40 35 12 21 ++10 4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 42 17 30 76 28 47 ++141 92 121 167 135 158 167 135 158 141 92 121 141 92 121 131 80 105 ++116 30 44 105 35 55 67 23 37 76 28 47 118 50 79 152 49 69 ++159 46 62 148 37 53 124 35 54 110 32 46 79 27 44 105 35 55 ++136 44 65 134 49 77 118 50 79 108 54 86 76 28 47 58 26 51 ++76 28 47 30 10 18 0 0 0 0 0 0 0 0 0 28 8 14 ++52 25 42 52 25 42 52 25 42 52 25 42 52 25 42 49 25 40 ++49 25 40 31 10 18 10 4 6 1 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 1 0 0 18 7 11 108 54 86 89 29 45 ++133 43 64 142 34 47 137 33 45 128 41 59 134 49 77 141 92 121 ++143 45 64 121 37 56 73 26 42 118 50 79 131 80 105 141 92 121 ++141 92 121 141 92 121 152 49 69 152 49 69 110 32 46 120 32 46 ++138 37 53 139 44 68 119 40 62 88 29 45 93 57 98 93 57 98 ++58 26 51 49 25 40 0 0 0 0 0 0 0 0 0 0 0 0 ++22 7 12 50 18 33 49 25 40 58 26 51 58 26 51 58 26 51 ++52 25 42 49 25 40 49 25 40 40 15 29 31 10 18 28 8 14 ++18 7 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 25 40 ++93 57 98 49 25 40 73 26 42 79 28 45 118 50 79 146 108 143 ++167 135 158 159 124 153 141 92 121 166 48 64 152 49 69 135 40 58 ++124 37 57 121 37 56 86 29 44 105 35 55 139 44 66 124 35 54 ++110 32 46 116 30 44 123 34 49 128 42 60 121 37 56 117 31 44 ++133 35 50 139 38 56 105 35 55 93 57 98 137 96 131 146 108 143 ++93 57 98 56 25 45 16 5 9 0 0 0 0 0 0 0 0 0 ++1 0 0 30 10 18 41 14 25 39 15 26 49 25 40 52 25 42 ++52 25 42 58 26 51 58 26 51 52 25 42 52 25 42 42 17 30 ++50 18 33 35 12 21 18 7 11 7 2 4 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 4 6 ++18 7 11 18 7 11 10 4 6 10 4 6 30 10 18 39 15 26 ++30 10 18 22 7 12 30 10 18 60 26 44 76 28 47 105 35 55 ++134 49 77 141 92 121 141 92 121 141 92 121 166 48 64 131 80 105 ++145 47 69 145 47 69 152 49 69 141 92 121 141 92 121 139 44 68 ++105 35 55 86 29 44 86 29 44 131 80 105 141 92 121 148 114 145 ++148 114 145 141 92 121 166 48 64 152 49 69 105 35 55 112 32 46 ++133 35 50 128 41 59 105 35 55 88 61 125 146 108 143 146 108 143 ++88 61 125 58 26 51 49 25 40 22 7 12 0 0 0 0 0 0 ++0 0 0 0 0 0 3 1 1 10 4 6 31 10 18 42 17 30 ++48 19 31 52 25 42 58 26 51 58 26 51 52 25 42 52 25 42 ++58 26 51 56 25 45 48 19 31 42 17 30 30 10 18 22 7 12 ++16 5 9 7 1 3 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ++10 4 6 35 12 21 58 26 51 108 66 98 140 102 127 171 141 162 ++180 150 172 171 141 162 131 80 105 76 28 47 76 28 47 105 35 55 ++113 41 62 125 35 52 166 48 64 141 92 121 141 92 121 166 48 64 ++166 48 64 166 48 64 152 49 69 136 44 65 152 49 69 141 92 121 ++141 92 121 152 49 69 123 34 49 113 41 62 119 40 62 89 29 45 ++118 50 79 120 71 102 118 50 79 123 43 68 121 37 56 105 35 55 ++113 41 62 123 43 68 134 49 77 152 49 69 128 42 60 118 34 52 ++129 39 59 130 43 63 105 35 55 93 63 110 146 108 143 146 108 143 ++93 57 98 58 26 51 58 26 51 48 19 31 1 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 7 2 4 ++22 7 12 30 10 18 35 12 21 42 17 30 52 25 42 58 26 51 ++58 26 51 58 26 51 56 25 45 52 25 42 52 25 42 49 25 40 ++48 19 31 42 17 30 31 10 18 20 6 10 7 2 4 7 1 3 ++7 2 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 10 4 6 35 12 21 49 25 40 120 71 102 167 135 158 ++191 162 183 210 187 199 234 219 224 243 232 234 241 229 231 226 205 215 ++233 215 221 233 215 221 219 198 209 159 124 153 108 66 98 105 35 55 ++123 43 68 152 49 69 166 48 64 162 38 49 142 34 47 123 33 48 ++119 34 51 126 41 60 136 44 65 116 30 44 102 29 42 110 32 46 ++123 43 68 134 49 77 131 80 105 134 49 77 134 49 77 118 50 79 ++118 50 79 134 49 77 134 49 77 134 49 77 134 49 77 118 34 52 ++97 28 42 69 20 33 79 27 44 97 28 42 112 32 46 128 41 59 ++132 43 63 123 43 68 118 50 79 76 28 47 93 57 98 93 57 98 ++62 26 49 58 26 51 58 26 51 49 25 40 4 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 3 1 1 1 0 0 9 3 6 39 15 26 31 10 18 ++30 10 18 48 19 31 60 25 40 52 25 42 52 25 42 52 25 42 ++52 25 42 52 25 42 58 24 38 52 25 42 54 21 35 50 18 33 ++40 15 29 31 10 18 22 7 12 10 4 6 10 4 6 7 2 4 ++3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++49 25 40 140 102 127 171 141 162 210 187 199 238 224 228 248 240 240 ++243 232 234 245 236 237 245 236 237 243 232 234 234 219 224 231 213 218 ++238 224 228 228 209 216 202 176 194 167 135 158 148 114 145 137 96 131 ++108 54 86 113 41 62 121 37 56 130 43 63 134 49 77 138 88 121 ++140 102 127 159 124 153 180 150 172 148 114 145 131 80 105 113 41 62 ++105 35 55 113 41 62 134 49 77 130 43 63 145 47 69 141 92 121 ++131 80 105 143 45 66 110 32 46 97 28 42 102 29 42 102 29 42 ++110 32 46 119 34 51 125 35 52 128 41 59 126 41 60 128 42 60 ++132 43 63 123 43 68 118 50 79 113 41 62 76 28 47 58 26 51 ++58 26 51 58 26 51 58 26 51 73 26 48 30 10 18 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 0 0 7 2 4 16 5 9 22 7 12 35 12 21 42 17 30 ++50 18 33 48 19 31 54 19 32 60 22 36 63 22 36 63 22 36 ++58 24 38 52 24 38 58 20 33 48 16 29 47 16 28 36 11 20 ++31 10 18 22 7 12 7 1 3 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 10 4 6 120 71 102 ++191 162 183 210 187 199 226 205 215 238 224 228 233 215 221 234 219 224 ++238 224 228 241 229 231 243 232 234 238 224 228 234 219 224 228 209 216 ++233 215 221 219 198 209 191 162 183 167 135 158 148 114 145 108 66 98 ++108 54 86 131 80 105 171 141 162 202 176 194 228 209 216 238 224 228 ++241 229 231 245 236 237 248 240 240 248 240 240 238 224 228 219 198 209 ++191 162 183 131 80 105 105 35 55 105 35 55 128 41 59 140 40 59 ++144 40 57 152 40 56 139 38 56 141 40 57 141 43 61 141 42 59 ++141 43 61 131 38 56 135 40 58 135 40 58 128 41 59 131 42 64 ++134 49 77 118 50 79 108 54 86 108 54 86 93 57 98 93 57 98 ++73 26 48 58 26 51 58 26 51 58 26 51 58 26 51 18 7 11 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 ++7 1 3 7 1 3 10 4 6 16 5 9 20 6 10 41 14 25 ++57 17 29 57 17 29 57 17 29 69 20 33 60 21 35 54 19 32 ++57 17 29 48 19 31 41 14 25 28 8 14 16 5 9 3 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 62 26 49 167 135 158 ++226 205 215 202 176 194 180 150 172 191 162 183 202 176 194 226 205 215 ++231 213 218 231 213 218 231 213 218 219 198 209 210 187 199 202 176 194 ++202 176 194 202 176 194 171 141 162 137 96 131 131 80 105 140 102 127 ++210 187 199 238 222 225 243 232 234 248 240 240 248 240 240 248 240 240 ++245 236 237 243 232 234 238 224 228 241 229 231 238 222 225 238 222 225 ++233 215 221 210 187 199 171 141 162 131 80 105 105 35 55 131 42 64 ++145 47 69 152 40 56 159 46 62 144 40 57 141 43 61 143 45 64 ++140 40 59 135 40 58 130 43 63 131 42 64 131 42 64 123 43 68 ++118 50 79 108 54 86 108 54 86 93 57 98 76 28 47 76 28 47 ++76 28 47 58 26 51 58 26 51 58 26 51 58 26 51 30 10 18 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 ++7 1 3 20 6 10 31 10 18 41 13 21 57 17 29 57 17 29 ++69 20 33 69 20 33 79 27 44 71 23 37 71 23 37 57 17 29 ++36 11 20 38 12 21 16 5 9 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 140 102 127 ++210 187 199 226 205 215 210 187 199 210 187 199 210 187 199 210 187 199 ++210 187 199 210 187 199 202 176 194 202 176 194 180 150 172 191 162 183 ++180 150 172 171 141 162 146 108 143 95 59 101 196 169 185 245 236 237 ++238 224 228 234 219 224 238 224 228 238 224 228 243 232 234 243 232 234 ++245 236 237 245 236 237 238 224 228 231 213 218 238 224 228 226 205 215 ++219 198 209 202 176 194 196 169 185 167 135 158 120 71 102 105 35 55 ++134 49 77 152 49 69 159 46 62 159 46 63 152 40 56 152 40 56 ++139 44 66 134 49 77 134 49 77 134 49 77 118 50 79 118 50 79 ++108 54 86 93 57 98 73 26 48 93 57 98 58 26 51 58 26 51 ++58 26 51 58 26 51 58 26 51 58 26 51 93 57 98 49 25 40 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 3 1 1 10 4 6 7 2 4 ++10 4 6 28 8 14 57 17 29 97 28 42 102 29 42 97 28 42 ++86 29 44 69 20 33 69 20 33 41 13 21 20 6 10 16 5 9 ++9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 49 25 40 ++196 169 185 228 209 216 226 205 215 233 215 221 234 219 224 238 224 228 ++238 224 228 234 219 224 233 215 221 231 213 218 202 176 194 180 150 172 ++171 141 162 146 108 143 137 96 131 196 169 185 238 224 228 243 232 234 ++241 229 231 234 219 224 233 215 221 234 219 224 241 229 231 234 219 224 ++238 224 228 234 219 224 228 209 216 219 198 209 191 162 183 191 162 183 ++202 176 194 191 162 183 159 124 153 148 114 145 137 96 131 93 57 98 ++113 41 62 134 49 77 145 47 69 145 47 69 134 49 77 134 49 77 ++134 49 77 118 50 79 108 54 86 108 54 86 108 54 86 76 28 47 ++73 26 48 73 26 48 73 26 48 58 26 51 58 26 51 58 26 51 ++58 26 51 93 57 98 93 57 98 93 57 98 88 61 125 58 26 51 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 4 0 1 36 11 20 69 20 33 ++102 29 42 117 31 42 102 29 42 71 23 37 71 23 37 61 21 34 ++41 13 21 9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 1 1 ++67 27 47 167 135 158 210 187 199 219 198 209 226 205 215 234 219 224 ++226 205 215 233 215 221 234 219 224 226 205 215 219 198 209 180 150 172 ++167 135 158 137 96 131 137 96 131 226 205 215 210 187 199 202 176 194 ++219 198 209 226 205 215 226 205 215 219 198 209 228 209 216 226 205 215 ++210 187 199 202 176 194 202 176 194 191 162 183 171 141 162 167 135 158 ++159 124 153 159 124 153 137 96 131 137 96 131 88 61 125 93 63 110 ++76 28 47 118 50 79 118 50 79 118 50 79 108 54 86 108 54 86 ++108 54 86 108 54 86 76 28 47 73 26 48 76 28 47 73 26 48 ++58 26 51 58 26 51 58 26 51 58 26 51 93 57 98 88 61 125 ++88 61 125 88 61 125 88 61 125 93 57 98 58 26 51 49 25 40 ++3 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 0 0 41 13 21 102 29 42 132 30 39 97 28 42 69 20 33 ++71 23 37 47 16 28 1 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 18 7 11 93 57 98 108 54 86 140 102 127 167 135 158 ++171 141 162 167 135 158 159 124 153 159 124 153 159 124 153 146 108 143 ++137 96 131 93 63 110 93 57 98 219 198 209 231 213 218 219 198 209 ++202 176 194 191 162 183 171 141 162 167 135 158 171 141 162 167 135 158 ++159 124 153 159 124 153 148 114 145 146 108 143 146 108 143 146 108 143 ++137 96 131 137 96 131 88 61 125 88 61 125 88 61 125 93 57 98 ++73 26 48 105 35 55 105 35 55 76 28 47 73 26 48 73 26 48 ++76 28 47 58 26 51 58 26 51 93 57 98 93 57 98 93 57 98 ++88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 ++88 61 125 93 57 98 93 57 98 40 15 29 16 5 9 1 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 4 0 1 69 20 33 132 30 39 117 31 42 ++86 29 44 69 20 33 9 3 6 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 4 6 ++58 26 51 140 102 127 140 102 127 219 198 209 238 224 228 234 219 224 ++226 205 215 226 205 215 219 198 209 202 176 194 196 169 185 171 141 162 ++159 124 153 146 108 143 138 88 121 108 66 98 93 63 110 93 63 110 ++93 63 110 93 63 110 88 61 125 88 61 125 88 61 125 88 61 125 ++93 57 98 93 57 98 93 57 98 93 57 98 93 57 98 93 57 98 ++93 57 98 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 ++88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 ++58 26 51 40 15 29 7 2 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 102 29 42 102 29 42 ++71 23 37 79 27 44 38 12 21 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 3 1 1 167 135 158 202 176 194 210 187 199 ++228 209 216 228 209 216 228 209 216 228 209 216 226 205 215 219 198 209 ++210 187 199 191 162 183 180 150 172 148 114 145 137 96 131 137 96 131 ++88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 ++88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 ++88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 ++88 61 125 88 61 125 58 26 51 40 15 29 16 5 9 3 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 57 17 29 97 28 42 ++97 28 42 86 29 44 41 14 25 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 7 2 4 52 25 42 131 80 105 ++148 114 145 196 169 185 219 198 209 226 205 215 233 215 221 219 198 209 ++202 176 194 202 176 194 191 162 183 171 141 162 148 114 145 146 108 143 ++137 96 131 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 ++88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 88 61 125 ++88 61 125 88 61 125 93 57 98 58 26 51 58 26 51 49 25 40 ++18 7 11 9 3 6 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 16 5 9 69 20 33 28 8 14 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 7 1 3 97 28 42 97 28 42 ++71 23 37 61 21 34 36 11 20 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 22 7 12 52 25 42 67 27 47 93 57 98 93 57 98 ++93 57 98 93 57 98 58 26 51 93 57 98 58 26 51 58 26 51 ++58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 58 26 51 ++49 25 40 40 15 29 40 15 29 16 5 9 9 3 6 3 1 1 ++1 0 0 4 0 1 1 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 41 13 21 148 30 39 185 38 47 152 32 42 28 8 14 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 20 6 10 86 29 44 97 28 42 69 20 33 ++47 16 28 40 15 29 30 10 18 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 8 14 ++97 28 42 185 38 47 185 38 47 159 35 49 152 32 42 102 29 42 ++28 8 14 7 2 4 0 0 0 1 0 0 7 1 3 28 8 14 ++31 10 18 57 17 29 97 28 42 69 20 33 54 19 32 48 19 31 ++28 8 14 9 3 6 1 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 16 5 9 69 20 33 121 30 42 152 32 42 ++185 38 47 152 32 42 152 32 42 152 32 42 141 31 41 132 30 39 ++97 28 42 69 20 33 57 17 29 69 20 33 69 20 33 71 23 37 ++71 23 37 71 23 37 51 18 32 58 20 33 48 19 31 18 7 11 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 10 4 6 39 15 26 ++54 19 32 97 28 42 148 30 39 185 38 47 185 38 47 185 38 47 ++159 35 49 152 32 42 152 32 42 148 30 39 142 31 41 141 31 41 ++132 30 39 117 31 42 97 28 42 73 26 42 67 22 35 58 20 33 ++47 16 28 47 16 28 40 15 29 40 15 29 22 7 12 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 10 4 6 47 16 28 69 20 33 131 32 43 ++152 32 42 185 38 47 185 38 47 185 38 47 185 38 47 159 35 49 ++148 30 39 148 30 39 152 32 42 141 31 41 148 30 39 152 32 42 ++138 32 45 102 29 42 71 23 37 52 24 38 48 19 31 47 16 28 ++41 14 25 41 14 25 41 14 25 41 13 21 4 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++7 1 3 102 29 42 148 30 39 185 38 47 185 38 47 185 38 47 ++162 38 49 152 32 42 152 32 42 148 30 39 148 30 39 132 30 39 ++124 30 42 117 31 42 117 31 42 97 28 42 97 28 42 86 29 44 ++71 23 37 47 16 28 36 11 20 41 13 21 28 8 14 28 8 14 ++28 8 14 22 7 12 16 5 9 16 5 9 4 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++22 7 12 117 31 42 102 29 42 97 28 42 69 20 33 69 20 33 ++57 17 29 47 16 28 47 16 28 41 13 21 41 13 21 41 13 21 ++41 13 21 41 13 21 36 11 20 41 13 21 30 10 18 7 2 4 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +diff --git a/drivers/video/logo/logo_debian_clut224.ppm b/drivers/video/logo/logo_debian_clut224.ppm +new file mode 100644 +index 000000000000..0daf7736ab58 +--- /dev/null ++++ b/drivers/video/logo/logo_debian_clut224.ppm +@@ -0,0 +1,883 @@ ++P3 ++64 80 ++255 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 36 1 13 99 3 37 93 2 34 135 4 50 95 3 36 ++41 1 15 21 0 7 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 64 2 24 ++154 4 57 213 6 80 228 7 85 227 7 85 226 7 85 209 6 78 ++217 7 81 194 6 73 98 3 37 95 3 36 126 4 47 159 4 59 ++147 4 55 150 4 56 175 4 65 106 3 39 43 1 16 2 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 9 0 3 87 2 32 177 5 66 224 7 84 ++225 7 85 218 7 82 215 7 81 215 7 81 214 6 80 217 7 82 ++217 7 82 219 7 82 226 7 85 227 7 85 226 7 85 225 7 84 ++225 7 85 224 7 84 223 7 84 227 7 85 219 7 82 182 5 68 ++106 3 39 24 0 9 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++4 0 1 90 2 33 191 6 71 227 7 85 223 7 84 216 7 81 ++214 7 80 214 7 81 215 7 81 215 7 81 215 7 81 215 7 81 ++214 7 80 215 7 81 215 7 81 215 7 81 215 7 81 214 7 81 ++215 7 81 215 7 81 214 7 80 215 7 81 217 7 81 222 7 83 ++228 7 86 206 6 77 120 3 45 41 1 15 63 1 23 104 3 39 ++49 1 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 62 1 23 ++182 5 68 228 7 85 221 7 83 215 7 81 214 7 80 215 7 81 ++215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 ++215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 ++215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 214 7 80 ++215 7 81 219 7 82 226 7 85 219 7 82 223 7 84 231 7 86 ++215 7 80 40 1 15 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 9 0 3 133 4 50 225 7 84 ++223 7 84 215 7 81 214 7 80 215 7 81 215 7 81 215 7 81 ++215 7 81 215 7 81 215 7 81 214 7 80 215 7 81 216 7 81 ++216 7 81 216 7 81 217 7 81 218 7 82 218 7 82 218 7 82 ++217 7 82 216 7 81 215 7 81 214 7 81 214 7 81 215 7 81 ++215 7 81 214 7 80 215 7 81 217 7 81 216 7 81 214 7 80 ++221 7 83 204 6 76 81 2 30 57 1 21 2 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 1 0 0 99 3 37 171 4 64 229 7 86 216 7 81 ++214 7 80 214 7 81 215 7 81 215 7 81 215 7 81 215 7 81 ++214 7 81 214 7 80 217 7 81 224 7 84 227 7 85 222 7 83 ++219 7 82 222 7 83 210 5 78 205 6 77 202 5 76 205 6 77 ++209 6 78 219 7 82 225 7 84 227 7 85 224 7 84 219 7 82 ++215 7 81 214 7 80 215 7 81 215 7 81 215 7 81 214 7 81 ++214 7 80 220 7 82 221 7 83 217 7 81 166 5 62 26 0 9 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++6 0 2 148 4 55 232 7 87 222 7 83 214 7 80 214 7 80 ++215 7 81 215 7 81 215 7 81 215 7 81 215 7 81 214 7 80 ++215 7 81 225 7 84 214 6 80 153 4 56 95 3 36 54 1 20 ++42 1 16 51 1 19 26 0 10 16 0 6 14 0 5 16 0 6 ++24 0 9 41 1 15 68 1 25 105 2 39 155 4 58 199 6 74 ++225 7 84 225 7 84 217 7 81 214 7 80 214 7 81 215 7 81 ++215 7 81 214 7 80 216 7 81 217 7 81 227 7 85 201 6 75 ++54 1 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 0 5 ++166 5 62 229 7 86 215 7 81 214 7 81 214 7 80 215 7 81 ++215 7 81 215 7 81 215 7 81 214 7 80 217 7 82 225 7 85 ++225 7 84 160 4 59 42 1 15 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 0 4 ++68 1 25 151 4 56 215 7 80 225 7 84 215 7 81 214 7 80 ++215 7 81 215 7 81 215 7 81 214 7 80 214 7 80 222 7 83 ++215 6 81 71 2 26 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 22 0 8 180 5 67 ++228 7 85 214 7 80 214 7 80 215 7 81 215 7 81 215 7 81 ++214 7 80 215 7 81 219 7 82 227 7 85 207 6 77 147 4 55 ++64 2 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 43 1 16 159 5 60 227 7 85 218 7 82 ++214 7 80 215 7 81 215 7 81 215 7 81 214 7 81 214 7 80 ++220 7 82 222 7 83 74 2 28 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 22 0 8 183 5 68 227 7 85 ++214 7 80 214 7 80 215 7 81 215 7 81 215 7 81 214 7 80 ++217 7 81 225 7 85 195 5 73 163 5 61 90 2 33 10 0 4 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 97 3 36 215 5 80 ++221 7 83 214 7 80 214 7 81 215 7 81 215 7 81 215 7 81 ++214 7 80 220 7 82 216 7 80 55 1 20 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 10 0 3 175 4 65 227 7 85 214 7 80 ++214 7 80 215 7 81 215 7 81 215 7 81 214 7 80 220 7 82 ++214 5 80 105 3 39 13 0 5 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 57 1 21 ++204 6 76 222 7 83 214 7 80 214 7 81 215 7 81 215 7 81 ++215 7 81 214 7 80 222 7 83 201 6 75 29 0 10 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 124 4 46 230 7 86 214 7 80 214 7 80 ++215 7 81 215 7 81 214 7 80 215 7 81 222 7 83 206 5 76 ++58 1 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++41 1 15 201 6 75 222 7 83 214 7 80 215 7 81 215 7 81 ++215 7 81 214 7 81 214 7 80 226 7 85 170 5 63 3 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 43 1 16 211 6 79 218 7 81 214 7 80 215 7 81 ++214 7 81 214 7 80 217 7 81 226 7 85 206 6 77 105 3 39 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 42 1 15 206 6 77 220 7 82 214 7 80 215 7 81 ++215 7 81 215 7 81 214 7 80 215 7 80 229 7 86 105 3 39 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++5 0 1 183 5 68 224 7 84 214 7 80 215 7 81 214 7 80 ++214 7 80 222 7 83 214 5 80 115 3 43 19 0 7 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 62 1 23 219 6 82 217 7 81 214 7 80 ++215 7 81 215 7 81 215 7 81 214 7 80 219 7 82 211 6 79 ++30 1 11 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++69 1 26 226 7 85 215 7 81 214 7 81 214 7 80 214 7 80 ++226 7 85 191 6 71 49 1 18 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 104 3 39 228 7 85 214 7 80 ++214 7 81 215 7 81 215 7 81 215 7 81 214 7 80 227 7 85 ++138 3 51 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 51 1 19 0 0 0 0 0 0 0 0 0 ++162 4 60 224 7 84 214 7 80 214 7 80 214 7 80 227 7 85 ++170 5 64 20 0 7 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 166 5 62 224 7 84 ++214 7 80 215 7 81 215 7 81 214 7 80 215 7 81 220 7 82 ++214 6 80 32 1 12 0 0 0 0 0 0 ++0 0 0 5 0 2 49 1 18 0 0 0 0 0 0 40 1 15 ++218 6 81 216 7 81 214 7 80 214 7 80 228 7 85 163 5 61 ++8 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 37 1 14 214 6 80 ++216 7 81 214 7 81 214 7 81 214 7 80 222 7 83 215 7 81 ++228 7 85 106 3 39 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 32 1 12 174 5 65 ++222 7 83 214 7 80 214 7 80 227 7 85 163 5 61 8 0 3 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 129 4 48 ++226 7 85 214 7 80 215 7 81 222 7 83 115 3 43 44 1 16 ++140 3 52 85 2 31 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 15 0 5 201 6 75 225 7 84 ++214 7 80 214 7 80 225 7 84 178 4 66 12 0 4 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 26 0 9 ++210 5 78 217 7 81 215 7 81 227 7 85 79 2 30 0 0 0 ++36 1 13 82 2 31 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 97 3 36 229 7 86 215 7 80 ++214 7 80 221 7 83 199 5 74 25 0 9 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++145 4 54 224 7 84 214 7 80 222 7 83 168 5 62 40 1 15 ++0 0 0 20 0 7 0 0 0 0 0 0 ++0 0 0 0 0 0 4 0 1 185 6 69 221 7 83 214 7 80 ++216 7 81 213 6 80 54 1 20 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 40 1 15 110 3 41 163 5 61 188 6 70 ++194 6 73 182 5 68 145 4 54 80 2 30 13 0 5 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++64 2 24 224 7 84 215 7 80 214 7 80 226 7 84 188 6 70 ++3 0 1 0 0 0 0 0 0 0 0 0 ++6 0 2 0 0 0 62 1 23 225 7 84 215 7 81 215 7 81 ++223 7 83 126 4 47 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++43 1 16 160 4 59 230 7 86 233 7 87 193 6 72 147 4 55 ++117 3 44 106 3 39 120 3 45 150 4 56 159 4 59 90 2 33 ++9 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++12 0 4 201 6 75 218 7 81 214 7 80 218 7 81 213 6 80 ++25 0 9 0 0 0 0 0 0 0 0 0 ++33 1 12 0 0 0 145 4 54 226 7 84 214 7 80 214 7 80 ++224 7 84 154 4 57 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 95 3 36 ++225 7 84 226 7 85 140 3 52 50 1 18 4 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 8 0 3 56 1 21 ++76 2 28 17 0 6 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 163 5 61 222 7 83 215 7 81 219 7 82 183 5 68 ++51 1 19 0 0 0 0 0 0 0 0 0 ++1 0 0 17 0 6 204 6 76 219 7 82 215 7 81 215 7 80 ++224 7 84 71 2 26 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 102 2 37 239 7 89 ++175 4 65 44 1 16 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 14 0 5 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 131 4 49 225 7 84 215 7 81 224 7 84 142 4 53 ++8 0 3 0 0 0 0 0 0 0 0 0 ++0 0 0 80 2 30 226 7 85 215 7 80 214 7 80 222 7 83 ++172 4 64 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 50 1 19 235 7 88 148 4 55 ++7 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 97 3 36 224 7 84 215 7 81 219 7 82 202 6 75 ++20 0 7 0 0 0 0 0 0 0 0 0 ++0 0 0 151 4 56 225 7 84 214 7 80 215 7 80 222 7 83 ++62 1 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 25 0 9 195 5 73 162 4 60 2 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 53 1 20 220 7 82 215 7 81 215 7 80 227 7 85 ++87 2 32 0 0 0 0 0 0 0 0 0 ++15 0 6 202 5 76 219 7 82 214 7 81 222 7 83 166 5 62 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 3 0 1 175 4 65 207 6 77 15 0 5 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 56 1 21 221 7 83 214 7 81 216 7 80 223 7 83 ++58 1 21 0 0 0 0 0 0 0 0 0 ++64 2 24 224 7 84 215 7 80 215 7 81 223 7 84 77 2 29 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 71 1 26 239 7 89 80 2 30 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 50 1 18 219 7 82 215 7 81 215 7 81 225 7 84 ++76 2 28 0 0 0 0 0 0 0 0 0 ++52 1 19 221 7 82 216 7 80 215 7 80 212 6 80 32 1 12 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 160 4 59 193 6 72 1 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 43 1 16 216 7 81 216 7 81 214 7 81 220 7 82 ++182 5 68 22 0 8 0 0 0 0 0 0 ++33 1 12 212 6 80 217 7 81 217 7 81 204 6 76 19 0 7 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++20 0 7 220 5 82 111 3 41 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 43 1 16 216 7 81 216 7 81 214 7 81 221 7 83 ++186 5 70 6 0 2 0 0 0 0 0 0 ++32 1 12 212 6 80 217 7 81 218 7 82 194 6 73 7 0 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++117 3 44 232 7 87 47 1 17 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 41 1 15 36 1 13 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 48 1 18 218 7 82 215 7 81 214 7 80 231 7 86 ++111 3 41 0 0 0 0 0 0 0 0 0 ++41 1 15 218 7 82 216 7 80 221 7 83 177 5 66 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++180 5 67 211 6 79 16 0 6 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 15 0 5 16 0 6 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 69 1 26 223 7 83 214 6 80 220 7 82 188 6 70 ++47 1 17 0 0 0 0 0 0 0 0 0 ++41 1 15 217 7 81 217 7 81 223 7 83 157 5 59 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 1 ++193 5 72 195 5 73 4 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 56 1 21 215 6 81 216 6 81 224 7 84 104 3 39 ++0 0 0 0 0 0 0 0 0 0 0 0 ++51 1 19 221 7 82 216 7 81 224 7 83 135 4 50 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 2 ++199 5 74 193 6 72 1 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 33 0 12 212 6 80 218 7 82 217 7 81 36 1 13 ++0 0 0 0 0 0 0 0 0 0 0 0 ++53 1 20 222 7 83 215 7 81 225 7 84 115 3 43 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 2 ++193 5 72 221 7 82 62 1 23 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 71 1 26 223 7 83 219 7 82 205 6 76 17 0 6 ++0 0 0 0 0 0 0 0 0 0 0 0 ++53 1 20 222 7 83 215 7 81 225 7 84 97 3 36 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++182 5 68 233 7 87 97 3 36 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 142 4 53 224 7 84 224 7 84 160 4 59 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++42 1 16 218 7 82 216 7 81 224 7 83 82 2 31 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++157 5 59 233 7 88 133 4 50 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++13 0 5 206 6 77 218 7 82 226 7 85 71 2 26 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++44 1 16 219 7 82 216 7 81 223 7 84 79 2 30 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++112 3 42 233 7 87 185 6 69 2 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 26 0 10 7 0 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 0 8 ++140 3 52 222 7 83 222 7 83 177 5 66 3 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++54 1 20 222 7 83 215 7 81 223 7 83 79 2 30 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++48 1 18 223 7 84 223 7 83 53 1 20 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 159 5 60 ++231 7 86 218 7 82 234 7 87 80 2 30 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++50 1 18 221 7 82 216 7 80 224 7 84 82 2 31 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 0 0 174 5 65 233 7 87 150 4 56 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 10 0 3 18 0 6 19 0 7 9 0 3 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 180 5 67 ++225 7 84 199 6 74 110 3 41 20 0 7 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++41 1 15 217 7 81 217 7 81 225 7 84 106 3 39 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 68 1 25 228 7 85 222 7 83 56 1 21 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 21 0 8 87 2 32 117 3 44 19 0 7 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 43 1 16 207 6 77 ++229 7 86 98 2 36 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++30 1 11 211 6 79 217 7 81 223 7 83 151 4 56 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 148 4 55 235 7 88 188 6 70 13 0 4 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 60 1 22 207 6 77 225 7 84 ++221 7 83 34 0 12 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++15 0 6 201 6 75 219 7 82 216 7 81 209 6 78 36 1 13 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 1 20 ++10 0 3 0 0 0 15 0 5 188 6 70 236 7 88 158 4 59 ++4 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 80 2 30 215 7 80 226 7 84 215 5 80 ++76 2 28 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++1 0 0 186 5 70 221 7 83 214 7 80 225 7 84 77 2 29 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 0 8 ++55 1 20 7 0 2 0 0 0 33 0 12 202 6 75 237 7 89 ++151 4 56 7 0 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 111 3 41 225 7 84 225 7 84 215 5 80 67 2 25 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 159 5 60 224 7 84 214 7 81 221 7 83 53 1 20 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++36 1 13 26 0 9 39 1 14 0 0 0 36 1 13 193 5 72 ++238 7 89 174 5 65 36 1 13 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 16 0 6 75 2 28 ++154 4 57 228 7 85 228 7 85 204 6 76 57 1 21 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 120 3 45 227 7 85 214 7 80 223 7 83 104 3 39 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 5 0 2 15 0 5 37 1 14 0 0 0 22 0 8 ++172 4 64 238 7 89 211 6 79 106 3 39 14 0 5 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 50 1 18 182 5 68 230 7 86 ++228 7 86 229 7 86 170 5 63 30 1 11 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 74 2 28 225 7 84 215 7 80 223 7 83 159 4 59 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 9 0 3 29 0 10 34 0 12 ++3 0 1 135 4 50 230 7 86 232 7 87 199 6 74 126 4 47 ++56 1 21 19 0 7 3 0 1 0 0 0 3 0 1 21 0 8 ++67 2 25 131 4 49 170 5 63 221 7 83 228 7 86 228 7 86 ++204 6 76 99 3 37 1 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 29 0 10 211 6 79 217 7 81 220 7 82 182 5 68 ++2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 2 28 ++126 4 47 22 0 8 98 2 36 205 6 77 230 7 86 238 7 89 ++232 7 87 209 6 78 191 6 71 188 6 70 192 6 72 209 6 78 ++230 7 86 235 7 88 235 7 88 226 7 85 193 6 72 112 3 42 ++21 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 177 5 66 222 7 83 215 7 80 221 7 83 ++57 1 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++54 1 20 140 3 52 133 3 49 47 1 17 68 1 25 126 4 47 ++171 4 64 201 6 75 216 7 81 221 7 83 221 7 83 212 6 80 ++199 6 74 172 4 64 126 4 47 64 2 24 10 0 3 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 117 3 44 227 7 85 214 7 80 221 7 83 ++170 5 63 8 0 3 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 1 0 0 71 2 26 117 3 44 53 1 20 9 0 3 ++0 0 0 6 0 2 19 0 7 26 0 10 27 0 10 24 0 9 ++12 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 49 1 18 222 7 83 216 7 81 214 7 80 ++220 7 82 189 6 71 133 4 50 12 0 4 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 34 0 12 64 2 24 ++76 2 28 71 1 26 60 1 22 47 1 17 40 1 15 8 0 3 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 0 0 181 5 67 222 7 83 214 7 80 ++214 7 81 221 7 83 233 7 88 140 3 52 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 12 0 4 21 0 8 22 0 8 16 0 6 2 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 102 2 37 227 7 85 214 7 80 ++215 7 81 214 7 80 216 7 81 199 6 74 47 1 17 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 22 0 8 207 6 77 218 7 82 ++214 7 81 215 7 81 223 7 84 120 3 45 42 1 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 133 4 50 227 7 85 ++214 7 80 215 7 81 219 7 82 188 6 70 3 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 36 1 13 216 6 81 ++217 7 81 214 7 81 214 7 80 227 7 85 110 3 41 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 3 51 ++227 7 85 214 7 80 214 7 80 217 7 81 210 5 78 26 0 10 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 29 0 10 ++211 6 79 218 7 82 214 7 80 217 7 81 207 6 77 25 0 9 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++111 3 41 229 7 86 214 7 80 214 7 80 223 7 83 155 4 58 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++8 0 3 185 6 69 223 7 83 214 7 80 217 7 81 207 6 77 ++14 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 56 1 21 223 7 84 217 7 81 214 7 80 225 7 84 ++127 3 47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 120 3 45 229 7 86 214 7 80 216 7 81 ++223 7 83 62 1 23 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 4 0 1 171 4 64 226 7 84 214 7 80 ++220 7 82 199 6 74 20 0 7 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 26 0 10 200 5 74 222 7 83 ++214 7 80 226 7 85 157 5 59 12 0 4 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 54 1 20 216 5 80 ++219 7 82 214 7 80 227 7 85 154 4 57 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 77 2 29 ++224 7 84 218 7 82 216 7 81 223 7 84 60 1 22 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++87 2 32 224 7 84 218 7 82 220 7 82 193 6 72 17 0 6 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 87 2 32 224 7 84 219 7 82 221 7 83 188 5 69 ++145 4 54 3 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 76 2 28 214 7 81 222 7 83 221 7 83 ++231 7 86 145 4 54 3 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 53 1 20 199 6 74 226 7 85 ++215 7 81 227 7 85 170 5 63 39 1 14 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 24 0 9 165 5 61 ++229 7 86 218 7 82 230 7 86 95 3 36 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 ++109 3 40 216 7 80 226 7 85 211 6 79 151 4 56 23 0 8 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 44 1 16 170 5 63 229 7 86 233 7 88 201 6 75 ++99 3 37 51 1 19 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 81 2 30 185 6 69 232 7 87 ++233 7 88 229 7 86 126 4 47 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 7 0 2 85 2 31 ++177 5 66 224 7 84 238 7 89 143 4 53 12 0 4 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 0 0 54 1 20 131 4 49 201 6 75 191 6 71 104 3 39 ++40 1 15 9 0 3 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 6 0 2 53 1 20 110 3 41 ++131 4 49 119 3 44 97 3 36 71 1 26 32 1 12 1 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 +diff --git a/drivers/video/logo/logo_exherbo_clut224.ppm b/drivers/video/logo/logo_exherbo_clut224.ppm +new file mode 100644 +index 000000000000..e9cedd26756f +--- /dev/null ++++ b/drivers/video/logo/logo_exherbo_clut224.ppm +@@ -0,0 +1,963 @@ ++P3 ++71 80 ++255 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 117 117 117 104 104 104 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 143 143 143 255 255 255 ++179 179 179 19 19 19 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 34 34 34 104 104 104 16 16 16 ++0 0 0 0 0 0 0 0 0 0 0 0 60 60 60 161 161 161 ++98 98 98 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 112 106 107 255 255 255 ++255 255 255 197 197 197 21 21 21 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 60 60 60 236 236 236 255 255 255 57 57 57 ++0 0 0 0 0 0 1 1 1 117 117 117 251 251 251 255 255 255 ++250 250 250 33 33 33 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 33 33 33 245 245 245 ++255 255 255 255 255 255 141 140 140 0 0 0 0 0 0 0 0 0 ++0 0 0 25 25 25 230 230 230 255 255 255 255 255 255 54 54 54 ++0 0 0 0 0 0 34 34 34 254 254 254 255 255 255 255 255 255 ++255 255 255 93 92 92 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 3 3 3 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 93 92 92 ++255 255 255 222 222 222 30 30 30 10 10 10 45 45 45 0 0 0 ++0 0 0 152 152 152 255 255 255 255 255 255 244 244 244 25 25 25 ++0 0 0 0 0 0 45 45 45 254 254 254 255 255 255 255 255 255 ++255 255 255 117 117 117 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 49 49 49 202 202 202 15 15 15 0 0 0 3 3 3 ++54 54 54 61 61 61 18 17 17 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++88 88 88 54 51 52 0 0 0 168 168 168 156 156 156 0 0 0 ++23 23 23 243 243 243 255 255 255 255 255 255 229 229 229 16 16 16 ++0 0 0 0 0 0 38 38 38 250 250 250 255 255 255 255 255 255 ++255 255 255 93 92 92 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 152 152 152 255 255 255 33 33 33 0 0 0 7 7 7 ++164 164 164 255 255 255 229 229 229 82 82 82 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 112 106 107 255 255 255 191 191 191 0 0 0 ++93 92 92 255 255 255 255 255 255 255 255 255 254 254 254 207 207 207 ++57 57 57 0 0 0 18 17 17 236 236 236 255 255 255 255 255 255 ++249 248 248 38 38 38 0 0 0 0 0 0 0 0 0 0 0 0 ++49 47 48 246 246 246 251 251 251 30 30 30 0 0 0 0 0 0 ++3 3 3 147 147 147 255 255 255 249 249 249 61 61 61 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 39 39 39 244 244 244 255 255 255 225 225 225 1 1 1 ++161 161 161 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++249 248 248 117 117 117 1 1 1 205 205 205 255 255 255 255 255 255 ++209 209 209 4 4 4 0 0 0 0 0 0 7 7 7 67 68 68 ++227 227 227 255 255 255 253 253 253 88 88 88 0 0 0 0 0 0 ++0 0 0 0 0 0 150 150 150 255 255 255 183 183 183 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 187 187 187 255 255 255 255 255 255 247 247 247 36 37 36 ++201 201 201 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 181 181 181 141 140 140 251 251 251 255 255 255 ++249 249 249 215 215 215 163 163 163 77 77 77 57 57 57 147 147 147 ++245 245 245 255 255 255 255 255 255 247 247 247 182 182 182 36 37 36 ++0 0 0 0 0 0 3 3 3 184 184 184 127 127 127 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++70 69 69 255 255 255 255 255 255 255 255 255 255 255 255 82 82 82 ++221 221 221 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 249 249 249 253 253 253 255 255 255 ++255 255 255 238 238 238 88 88 88 10 9 9 0 0 0 0 0 0 ++39 39 39 216 216 216 255 255 255 255 255 255 176 176 176 12 12 12 ++0 0 0 0 0 0 0 0 0 5 5 5 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++182 182 182 255 255 255 255 255 255 255 255 255 255 255 255 134 134 134 ++234 234 234 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++244 244 244 54 54 54 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 54 54 54 249 248 248 143 143 143 1 1 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 28 26 26 ++246 246 246 255 255 255 255 255 255 255 255 255 255 255 255 238 238 238 ++252 252 252 255 255 255 255 255 255 184 184 184 98 98 98 67 68 68 ++61 61 61 98 98 98 221 221 221 255 255 255 255 255 255 255 255 255 ++156 156 156 0 0 0 0 0 0 20 20 22 97 100 116 26 27 30 ++0 0 0 0 0 0 127 127 127 0 0 0 0 0 0 0 0 0 ++22 22 22 30 27 28 12 13 12 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 88 88 88 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 161 161 161 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 42 42 42 243 243 243 255 255 255 255 255 255 ++98 98 98 0 0 0 0 0 0 130 132 147 154 161 185 97 100 116 ++0 0 0 0 0 0 67 68 68 30 31 31 8 8 8 184 184 184 ++241 241 241 247 247 247 230 230 230 138 137 137 4 4 4 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 143 143 143 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 61 61 61 0 0 0 0 0 0 14 11 13 ++4 5 9 0 0 0 0 0 0 204 204 204 255 255 255 255 255 255 ++104 104 104 0 0 0 0 0 0 130 132 147 154 161 185 146 153 179 ++4 5 9 0 0 0 70 69 69 238 238 238 225 225 225 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 150 150 150 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 179 179 179 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 82 82 82 0 0 0 0 0 0 76 72 85 ++48 49 56 0 0 0 3 3 3 216 216 216 255 255 255 255 255 255 ++159 159 159 0 0 0 0 0 0 48 49 56 154 161 185 130 132 147 ++4 5 9 0 0 0 61 61 61 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 54 51 52 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 204 204 204 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 188 188 188 0 0 0 0 0 0 1 1 1 ++0 0 0 0 0 0 49 47 48 250 250 250 255 255 255 255 255 255 ++238 237 237 22 22 22 0 0 0 0 0 0 26 27 30 4 5 9 ++0 0 0 0 0 0 127 127 127 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 156 156 156 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 216 216 216 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 117 117 117 3 3 3 0 0 0 ++0 0 0 12 12 12 189 189 189 255 255 255 255 255 255 255 255 255 ++255 255 255 174 174 174 2 2 2 0 0 0 0 0 0 0 0 0 ++0 0 0 49 49 49 238 237 237 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 223 223 223 ++8 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 219 219 219 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 212 212 212 49 49 49 0 0 0 ++0 0 0 25 25 25 98 98 98 117 117 117 134 134 134 168 168 168 ++201 201 201 238 238 238 179 179 179 70 69 69 39 39 39 60 60 60 ++134 134 134 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 251 251 251 ++36 37 36 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 211 211 211 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 194 194 194 67 68 68 0 0 0 0 0 0 0 0 0 ++6 4 5 4 2 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 10 10 10 57 57 57 104 104 104 159 159 159 232 231 231 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++67 68 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 205 205 205 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++134 134 134 0 0 0 0 0 0 50 41 43 111 86 92 143 103 113 ++156 121 129 163 123 133 152 115 124 143 103 113 122 96 102 111 86 92 ++76 63 66 38 29 31 9 5 8 0 0 0 0 0 0 10 10 10 ++75 75 75 166 165 165 238 237 237 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++117 117 117 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 187 187 187 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 134 134 134 ++0 0 0 19 14 15 143 103 113 193 131 146 195 132 148 192 130 145 ++191 129 144 191 129 144 191 129 145 192 130 145 193 131 146 195 132 148 ++195 132 148 191 129 145 185 125 140 143 103 113 86 80 81 38 29 31 ++0 0 0 0 0 0 19 19 19 117 117 117 244 244 244 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++164 164 164 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 125 125 125 ++255 255 255 255 255 255 255 255 255 255 255 255 192 192 192 0 0 0 ++19 19 19 163 123 133 195 132 148 186 126 141 189 128 143 192 130 145 ++188 127 142 185 125 140 185 125 140 186 126 141 186 126 141 185 125 140 ++185 125 140 186 126 141 188 127 143 192 130 145 195 132 148 191 129 144 ++152 115 124 79 66 70 19 14 15 0 0 0 54 54 54 227 227 227 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++196 196 196 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 51 52 ++253 253 253 255 255 255 255 255 255 251 251 251 54 54 54 0 0 0 ++143 103 113 195 132 148 185 125 140 192 130 145 163 123 133 143 103 113 ++185 125 140 189 128 143 185 125 140 186 126 141 186 126 141 186 126 141 ++186 126 141 186 126 141 186 126 141 185 125 140 185 125 140 186 126 141 ++191 129 145 196 133 148 185 125 140 65 56 58 0 0 0 39 39 39 ++222 222 222 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++207 207 207 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 ++205 205 205 255 255 255 255 255 255 188 188 188 0 0 0 60 53 55 ++195 132 148 186 126 141 191 129 145 122 96 102 14 11 13 0 0 0 ++38 29 31 163 123 133 189 128 143 186 126 141 186 126 141 186 126 141 ++186 126 141 186 126 141 186 126 141 185 125 140 185 126 140 192 130 145 ++192 130 145 191 129 144 196 133 148 193 131 146 79 66 70 0 0 0 ++45 45 45 238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 ++206 206 206 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++98 98 98 255 255 255 255 255 255 98 98 98 0 0 0 143 103 113 ++193 131 146 186 125 140 192 130 145 38 29 31 0 0 0 0 0 0 ++0 0 0 111 86 92 195 132 148 186 126 141 186 126 141 186 126 141 ++186 126 141 186 126 141 186 126 141 185 125 140 191 129 145 143 103 113 ++50 41 43 38 35 39 122 96 102 193 131 146 196 133 148 79 66 70 ++0 0 0 93 92 92 255 255 255 255 255 255 255 255 255 255 255 255 ++187 187 187 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++7 7 7 217 217 217 255 255 255 42 42 42 10 7 8 185 125 140 ++188 127 143 186 126 141 193 131 146 76 63 66 0 0 0 0 0 0 ++0 0 0 143 103 113 192 130 145 186 126 141 186 126 141 186 126 141 ++186 126 141 186 126 141 186 126 141 191 129 144 143 103 113 5 3 4 ++0 0 0 0 0 0 4 2 2 143 103 113 193 131 146 188 127 142 ++38 29 31 0 0 0 203 203 203 255 255 255 255 255 255 255 255 255 ++147 147 147 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 82 82 82 255 255 255 42 42 42 10 7 8 185 125 140 ++188 127 143 186 126 141 189 128 143 163 123 133 60 53 55 31 25 27 ++79 66 70 188 127 142 186 126 141 186 126 141 186 126 141 186 126 141 ++186 126 141 186 126 141 186 126 141 195 132 147 79 66 70 0 0 0 ++0 0 0 0 0 0 0 0 0 86 80 81 193 131 146 193 131 146 ++122 96 102 0 0 0 112 106 107 255 255 255 255 255 255 255 255 255 ++82 82 82 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 187 187 187 104 104 104 0 0 0 143 103 113 ++193 131 146 185 125 140 185 125 140 189 128 143 192 130 145 188 127 142 ++193 131 146 186 126 141 185 125 140 186 126 141 186 126 141 186 126 141 ++186 126 141 186 126 141 186 126 141 195 132 147 76 63 66 0 0 0 ++0 0 0 0 0 0 0 0 0 79 66 70 195 132 148 189 128 143 ++163 123 133 0 0 0 75 75 75 255 255 255 255 255 255 234 234 234 ++16 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 34 34 34 163 163 163 0 0 0 60 53 55 ++196 133 148 186 126 141 185 125 140 185 125 140 186 126 141 188 127 142 ++186 126 141 185 125 140 186 126 141 186 126 141 186 126 141 186 126 141 ++186 126 141 186 126 141 186 126 141 193 131 146 122 96 102 0 0 0 ++0 0 0 0 0 0 0 0 0 122 96 102 193 131 146 192 130 145 ++143 103 113 0 0 0 98 98 98 255 255 255 255 255 255 141 140 140 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 79 79 79 60 60 60 0 0 0 ++122 96 102 196 133 148 188 127 142 185 125 140 185 125 140 186 126 141 ++186 126 141 186 126 141 186 126 141 186 126 141 186 126 141 186 126 141 ++186 126 141 186 126 141 186 126 141 186 126 141 189 128 143 76 63 66 ++10 7 8 6 4 5 50 41 43 185 125 140 186 126 141 196 133 148 ++76 63 66 0 0 0 168 168 168 255 255 255 238 238 238 23 23 23 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 79 79 79 19 19 19 ++6 6 6 122 96 102 191 129 145 195 132 148 193 131 146 189 128 143 ++188 127 142 186 126 141 186 126 141 185 125 140 186 126 141 186 126 141 ++186 126 141 186 126 141 186 126 141 185 125 140 186 126 141 191 129 145 ++163 123 133 152 115 124 186 126 141 189 128 143 196 133 148 143 103 113 ++1 0 0 36 37 36 244 244 244 255 255 255 112 106 107 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 49 49 49 ++12 13 12 0 0 0 31 25 27 79 66 70 143 103 113 163 123 133 ++185 125 140 191 129 144 193 131 146 195 132 148 193 131 146 193 131 146 ++192 130 145 191 129 144 189 128 143 188 127 143 188 127 142 188 127 142 ++192 130 145 195 132 147 195 132 148 192 130 145 114 88 95 4 2 2 ++4 4 4 192 192 192 255 255 255 187 187 187 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 ++30 31 31 49 49 49 23 23 23 0 0 0 0 0 0 0 0 0 ++14 11 13 38 29 31 60 53 55 79 66 70 114 88 95 143 103 113 ++143 103 113 163 123 133 163 123 133 185 125 140 186 126 141 188 127 142 ++186 126 141 163 123 133 122 96 102 50 41 43 0 0 0 12 13 12 ++173 172 172 255 255 255 225 225 225 25 25 25 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 30 27 28 127 127 127 175 175 175 134 134 134 77 77 77 ++42 42 42 15 15 15 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 5 3 4 19 14 15 27 23 24 31 25 27 ++19 14 15 1 0 0 0 0 0 0 0 0 75 75 75 210 210 210 ++255 255 255 236 236 236 54 54 54 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 61 61 61 187 187 187 255 255 255 ++255 255 255 241 241 241 214 214 214 183 183 183 152 152 152 127 127 127 ++104 104 104 79 79 79 57 57 57 39 39 39 30 31 31 25 25 25 ++30 31 31 61 61 61 117 117 117 203 203 203 255 255 255 255 255 255 ++227 227 227 57 57 57 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 67 68 68 ++179 179 179 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 254 254 254 249 249 249 246 246 246 ++250 250 250 255 255 255 255 255 255 255 255 255 255 255 255 185 185 185 ++33 33 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 2 2 2 30 30 30 0 0 0 0 0 0 0 0 0 ++0 0 0 36 37 36 117 117 117 188 188 188 236 236 236 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 199 199 199 88 88 88 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 19 19 19 232 231 231 136 136 136 19 19 19 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 18 17 17 54 54 54 ++98 98 98 127 127 127 156 156 156 173 172 172 174 174 174 176 176 176 ++163 163 163 117 117 117 49 47 48 0 0 0 0 0 0 0 0 0 ++0 0 0 22 22 22 117 117 117 19 19 19 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 86 86 86 255 255 255 255 255 255 229 229 229 125 125 125 ++25 25 25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 9 9 ++98 98 98 227 227 227 255 255 255 199 199 199 19 19 19 0 0 0 ++3 3 3 28 26 26 8 8 8 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 ++22 22 22 30 27 28 18 17 17 2 2 2 0 0 0 0 0 0 ++0 0 0 197 197 197 255 255 255 255 255 255 255 255 255 255 255 255 ++241 241 241 181 181 181 125 125 125 75 75 75 33 33 33 6 6 6 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 42 42 42 127 127 127 232 231 231 ++255 255 255 255 255 255 255 255 255 255 255 255 204 204 204 22 22 22 ++0 0 0 141 140 140 234 232 232 191 191 191 70 69 69 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 30 30 30 138 137 137 214 209 209 ++236 236 236 241 239 239 232 231 231 216 216 216 98 98 98 0 0 0 ++75 75 75 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 229 229 229 ++188 188 188 147 147 147 112 106 107 86 86 86 77 77 77 77 77 77 ++104 104 104 156 156 156 215 215 215 255 255 255 241 239 239 159 159 159 ++75 75 75 104 104 104 255 255 255 255 255 255 255 255 255 205 205 205 ++23 23 23 4 4 4 176 176 176 255 255 255 253 253 253 57 57 57 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 67 68 68 241 239 239 255 255 255 254 254 254 ++255 250 250 255 250 250 255 255 255 243 243 243 38 38 38 8 8 8 ++219 219 219 255 255 255 250 250 250 195 195 195 127 127 127 88 88 88 ++82 82 82 117 117 117 134 134 134 152 152 152 176 176 176 202 202 202 ++227 227 227 246 246 246 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 225 225 225 164 164 164 86 86 86 16 16 16 0 0 0 ++0 0 0 125 125 125 255 255 255 255 255 255 255 255 255 255 255 255 ++189 189 189 6 6 6 8 7 7 166 165 165 183 183 183 93 92 92 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 49 47 48 173 172 172 234 232 232 255 255 255 ++255 255 255 255 255 255 255 255 255 90 84 86 0 0 0 138 137 137 ++255 255 255 152 152 152 49 47 48 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++3 3 3 16 16 16 30 31 31 54 54 54 70 69 69 54 54 54 ++30 27 28 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 ++79 79 79 250 250 250 255 255 255 255 255 255 255 255 255 255 255 255 ++230 230 230 141 140 140 2 2 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 22 22 22 82 82 82 ++138 137 137 192 192 192 134 134 134 0 0 0 77 77 77 241 241 241 ++79 79 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 54 51 52 ++243 243 243 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 ++205 205 205 210 210 210 117 117 117 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 38 38 38 212 212 212 57 57 57 ++0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 3 3 3 ++1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 23 23 23 217 217 217 ++255 255 255 255 255 255 255 255 255 255 255 255 234 234 234 82 82 82 ++104 104 104 206 206 206 208 208 208 79 79 79 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 10 10 10 159 159 159 45 45 45 0 0 0 ++23 23 23 82 82 82 143 143 143 188 188 188 214 214 214 217 217 217 ++213 213 213 205 205 205 189 189 189 174 174 174 152 152 152 127 127 127 ++98 98 98 77 77 77 54 54 54 39 39 39 28 26 26 16 16 16 ++10 10 10 15 15 15 33 33 33 98 98 98 217 217 217 255 255 255 ++255 255 255 255 255 255 255 255 255 238 238 238 54 54 54 0 0 0 ++30 30 30 199 199 199 203 203 203 195 195 195 34 34 34 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 82 82 82 49 49 49 60 60 60 168 168 168 ++238 238 238 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 251 251 251 243 243 243 234 234 234 ++225 225 225 234 234 234 247 247 247 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 232 231 231 61 61 61 0 0 0 0 0 0 ++45 45 45 202 202 202 199 199 199 209 209 209 134 134 134 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 42 42 42 227 227 227 216 216 216 255 255 255 255 255 255 ++255 255 255 249 248 248 205 205 205 171 170 170 176 176 176 219 219 219 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 175 175 175 30 30 30 0 0 0 0 0 0 0 0 0 ++112 106 107 208 208 208 198 198 198 202 202 202 189 189 189 18 17 17 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 150 150 150 255 255 255 255 255 255 255 255 255 238 238 238 ++134 134 134 36 37 36 0 0 0 0 0 0 0 0 0 7 7 7 ++67 68 68 150 150 150 213 213 213 247 247 247 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 219 219 219 ++93 92 92 0 0 0 0 0 0 0 0 0 0 0 0 30 30 30 ++191 191 191 202 202 202 199 199 199 198 198 198 207 207 207 67 68 68 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++6 6 6 221 221 221 255 255 255 255 255 255 174 174 174 33 33 33 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 3 3 3 34 34 34 70 69 69 104 104 104 ++134 134 134 152 152 152 164 164 164 177 177 177 187 187 187 192 192 192 ++198 198 198 204 204 204 200 200 200 168 168 168 93 92 92 12 13 12 ++0 0 0 0 0 0 0 0 0 0 0 0 16 16 16 163 163 163 ++206 206 206 198 198 198 199 199 199 198 198 198 208 208 208 127 127 127 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++33 33 33 251 251 251 255 255 255 255 255 255 42 42 42 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 34 34 34 166 165 165 207 207 207 ++198 198 198 198 198 198 199 199 199 199 199 199 203 203 203 179 179 179 ++10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++39 39 39 250 250 250 255 255 255 255 255 255 112 106 107 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 8 8 ++15 15 15 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 12 12 12 93 92 92 192 192 192 206 206 206 198 198 198 ++198 198 198 199 199 199 199 199 199 199 199 199 200 200 200 203 203 203 ++49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++2 2 2 39 39 39 117 117 117 213 213 213 255 255 255 195 195 195 ++176 176 176 168 168 168 168 168 168 176 176 176 201 201 201 225 225 225 ++234 234 234 216 216 216 168 168 168 93 92 92 30 27 28 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 15 15 15 ++88 88 88 177 177 177 209 209 209 202 202 202 198 198 198 198 198 198 ++199 199 199 199 199 199 199 199 199 198 198 198 199 199 199 215 215 215 ++112 106 107 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 7 7 7 112 106 107 245 245 245 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 243 243 243 189 189 189 ++127 127 127 79 79 79 60 60 60 45 45 45 33 33 33 28 26 26 ++28 26 26 33 33 33 54 51 52 82 82 82 125 125 125 182 182 182 ++209 209 209 204 204 204 199 199 199 198 198 198 198 198 198 199 199 199 ++199 199 199 198 198 198 198 198 198 202 202 202 208 208 208 166 165 165 ++61 61 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 36 37 36 86 86 86 138 137 137 141 140 140 117 117 117 ++70 69 69 15 15 15 0 0 0 0 0 0 0 0 0 34 34 34 ++182 182 182 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 254 254 254 247 247 247 244 244 244 ++244 244 244 249 249 249 238 238 238 212 212 212 206 206 206 203 203 203 ++199 199 199 198 198 198 199 199 199 198 198 198 200 200 200 208 208 208 ++207 207 207 198 198 198 206 206 206 192 192 192 88 88 88 4 4 4 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 ++2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 98 98 98 ++196 196 196 249 249 249 255 255 255 125 125 125 241 239 239 255 255 255 ++255 255 255 229 229 229 134 134 134 18 17 17 0 0 0 0 0 0 ++0 0 0 104 104 104 238 238 238 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 227 227 227 199 199 199 197 197 197 199 199 199 199 199 199 ++199 199 199 198 198 198 198 198 198 203 203 203 201 201 201 117 117 117 ++112 106 107 212 212 212 161 161 161 30 31 31 0 0 0 0 0 0 ++0 0 0 30 31 31 112 106 107 174 174 174 211 211 211 223 223 223 ++217 217 217 187 187 187 127 127 127 49 49 49 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 49 47 48 210 210 210 255 255 255 ++255 255 255 255 255 255 188 188 188 0 0 0 147 147 147 255 255 255 ++255 255 255 255 255 255 255 255 255 221 221 221 75 75 75 0 0 0 ++0 0 0 0 0 0 39 39 39 191 191 191 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 241 241 241 ++208 208 208 195 195 195 198 198 198 199 199 199 199 199 199 198 198 198 ++198 198 198 199 199 199 208 208 208 194 194 194 67 68 68 0 0 0 ++61 61 61 147 147 147 12 12 12 0 0 0 0 0 0 0 0 0 ++0 0 0 86 86 86 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 253 253 253 183 183 183 61 61 61 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 4 4 4 163 163 163 247 247 247 255 255 255 ++255 255 255 255 255 255 98 98 98 0 0 0 88 88 88 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 152 152 152 ++16 16 16 0 0 0 0 0 0 5 5 5 141 140 140 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 249 249 249 222 222 222 198 198 198 ++196 196 196 198 198 198 199 199 199 198 198 198 199 199 199 201 201 201 ++207 207 207 206 206 206 159 159 159 45 45 45 0 0 0 23 23 23 ++112 106 107 7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 104 104 104 249 249 249 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 253 ++134 134 134 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 30 31 31 196 196 196 205 205 205 249 248 248 ++255 255 255 225 225 225 12 12 12 0 0 0 30 30 30 246 246 246 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++216 216 216 70 69 69 0 0 0 0 0 0 0 0 0 104 104 104 ++252 252 252 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 252 252 252 230 230 230 203 203 203 195 195 195 198 198 198 ++200 200 200 201 201 201 204 204 204 208 208 208 208 208 208 192 192 192 ++141 140 140 60 60 60 2 2 2 0 0 0 15 15 15 125 125 125 ++19 19 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 61 61 61 206 206 206 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 112 106 107 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 45 45 45 203 203 203 197 197 197 214 214 214 ++255 255 255 117 117 117 0 0 0 0 0 0 0 0 0 209 209 209 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 253 253 253 127 127 127 0 0 0 0 0 0 0 0 0 ++98 98 98 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++241 241 241 215 215 215 205 205 205 207 207 207 209 209 209 209 209 209 ++205 205 205 195 195 195 171 170 170 134 134 134 75 75 75 23 23 23 ++0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 60 60 60 ++0 0 0 0 0 0 98 98 98 192 192 192 34 34 34 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 112 106 107 ++232 231 231 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 222 222 222 8 8 8 0 0 0 0 0 0 ++0 0 0 0 0 0 34 34 34 199 199 199 201 201 201 203 203 203 ++202 202 202 15 15 15 0 0 0 0 0 0 0 0 0 173 172 172 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 164 164 164 6 6 6 0 0 0 ++0 0 0 117 117 117 206 206 206 206 206 206 189 189 189 159 159 159 ++143 143 143 141 140 140 136 136 136 125 125 125 104 104 104 79 79 79 ++54 51 52 25 25 25 2 2 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 77 77 77 143 143 143 0 0 0 ++0 0 0 42 42 42 245 245 245 255 255 255 234 234 234 104 104 104 ++7 7 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++23 23 23 147 147 147 250 250 250 255 255 255 255 255 255 255 255 255 ++255 255 255 254 254 254 45 45 45 0 0 0 0 0 0 ++0 0 0 0 0 0 8 8 8 177 177 177 205 205 205 209 209 209 ++75 75 75 0 0 0 0 0 0 0 0 0 0 0 0 159 159 159 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 143 143 143 ++179 179 179 255 255 255 255 255 255 255 255 255 168 168 168 2 2 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 25 25 25 189 189 189 54 54 54 0 0 0 ++0 0 0 182 182 182 255 255 255 255 255 255 255 255 255 255 255 255 ++211 211 211 98 98 98 8 8 8 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 49 49 49 161 161 161 232 231 231 255 255 255 ++255 255 255 252 252 252 54 51 52 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 117 117 117 225 225 225 141 140 140 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 179 179 179 ++255 255 255 255 255 255 255 255 255 255 255 255 179 179 179 0 0 0 ++93 92 92 255 255 255 255 255 255 255 255 255 255 255 255 127 127 127 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 5 5 5 156 156 156 184 184 184 5 5 5 0 0 0 ++45 45 45 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 211 211 211 88 88 88 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 18 17 17 93 92 92 ++211 211 211 215 215 215 36 37 36 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 30 31 31 138 137 137 16 16 16 ++0 0 0 0 0 0 0 0 0 0 0 0 6 6 6 227 227 227 ++255 255 255 255 255 255 255 255 255 253 253 253 49 47 48 0 0 0 ++104 104 104 255 255 255 255 255 255 255 255 255 255 255 255 251 251 251 ++49 49 49 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++6 6 6 136 136 136 217 217 217 127 127 127 0 0 0 0 0 0 ++127 127 127 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 197 197 197 75 75 75 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++12 12 12 147 147 147 23 23 23 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 134 134 134 255 255 255 ++255 255 255 255 255 255 255 255 255 187 187 187 0 0 0 0 0 0 ++134 134 134 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++181 181 181 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 5 5 5 23 23 23 54 54 54 ++156 156 156 208 208 208 209 209 209 86 86 86 0 0 0 0 0 0 ++75 75 75 252 252 252 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++188 188 188 75 75 75 8 8 8 0 0 0 0 0 0 0 0 0 ++25 25 25 98 98 98 6 6 6 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 33 33 33 136 136 136 234 234 234 255 255 255 ++255 255 255 255 255 255 252 252 252 57 57 57 0 0 0 0 0 0 ++147 147 147 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++253 253 253 54 51 52 0 0 0 0 0 0 2 2 2 4 4 4 ++12 13 12 22 22 22 33 33 33 45 45 45 60 60 60 82 82 82 ++98 98 98 117 117 117 147 147 147 173 172 172 191 191 191 203 203 203 ++205 205 205 199 199 199 205 205 205 57 57 57 0 0 0 0 0 0 ++0 0 0 61 61 61 156 156 156 217 217 217 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 196 196 196 125 125 125 112 106 107 138 137 137 ++199 199 199 112 106 107 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 61 61 61 196 196 196 209 209 209 197 197 197 230 230 230 ++255 255 255 255 255 255 125 125 125 0 0 0 0 0 0 0 0 0 ++161 161 161 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 156 156 156 0 0 0 0 0 0 70 69 69 179 179 179 ++182 182 182 191 191 191 197 197 197 202 202 202 206 206 206 208 208 208 ++209 209 209 208 208 208 206 206 206 204 204 204 201 201 201 199 199 199 ++198 198 198 199 199 199 200 200 200 39 39 39 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 6 6 6 57 57 57 136 136 136 ++217 217 217 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++244 244 244 215 215 215 202 202 202 206 206 206 207 207 207 207 207 207 ++203 203 203 39 39 39 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 82 82 82 205 205 205 208 208 208 198 198 198 202 202 202 ++244 244 244 152 152 152 0 0 0 0 0 0 0 0 0 0 0 0 ++192 192 192 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 227 227 227 12 12 12 0 0 0 49 47 48 208 208 208 ++203 203 203 201 201 201 200 200 200 200 200 200 199 199 199 199 199 199 ++198 198 198 199 199 199 199 199 199 199 199 199 198 198 198 199 199 199 ++202 202 202 207 207 207 208 208 208 36 37 36 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++8 8 8 77 77 77 210 210 210 255 255 255 246 246 246 219 219 219 ++197 197 197 194 194 194 197 197 197 198 198 198 197 197 197 205 205 205 ++156 156 156 1 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 45 45 45 166 165 165 212 212 212 192 192 192 ++88 88 88 0 0 0 0 0 0 0 0 0 0 0 0 21 21 21 ++241 241 241 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 253 253 253 42 42 42 0 0 0 19 19 19 196 196 196 ++211 211 211 204 204 204 201 201 201 199 199 199 199 199 199 198 198 198 ++199 199 199 200 200 200 202 202 202 205 205 205 209 209 209 207 207 207 ++191 191 191 159 159 159 112 106 107 12 13 12 0 0 0 19 19 19 ++86 86 86 19 19 19 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 16 16 16 150 150 150 207 207 207 205 205 205 ++202 202 202 197 197 197 197 197 197 197 197 197 198 198 198 208 208 208 ++67 68 68 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 5 5 5 67 68 68 30 27 28 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 112 106 107 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 54 54 54 0 0 0 1 1 1 60 60 60 ++127 127 127 174 174 174 196 196 196 205 205 205 207 207 207 208 208 208 ++207 207 207 203 203 203 191 191 191 161 161 161 117 117 117 61 61 61 ++22 22 22 0 0 0 0 0 0 0 0 0 0 0 0 18 17 17 ++249 248 248 238 237 237 173 172 172 88 88 88 16 16 16 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 57 57 57 127 127 127 ++168 168 168 199 199 199 198 198 198 197 197 197 209 209 209 136 136 136 ++1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 38 38 38 238 237 237 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 249 249 249 30 31 31 0 0 0 0 0 0 0 0 0 ++0 0 0 6 6 6 30 30 30 57 57 57 70 69 69 77 77 77 ++70 69 69 49 49 49 22 22 22 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 ++181 181 181 227 227 227 221 221 221 214 214 214 183 183 183 112 106 107 ++36 37 36 6 6 6 0 0 0 0 0 0 0 0 0 0 0 0 ++49 47 48 199 199 199 198 198 198 208 208 208 161 161 161 12 13 12 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 33 33 33 189 189 189 251 251 251 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 183 183 183 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++57 57 57 198 198 198 202 202 202 196 196 196 202 202 202 208 208 208 ++197 197 197 175 175 175 159 159 159 156 156 156 152 152 152 147 147 147 ++176 176 176 200 200 200 209 209 209 161 161 161 19 19 19 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 18 17 17 82 82 82 156 156 156 ++225 225 225 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++234 234 234 39 39 39 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 60 60 60 185 185 185 208 208 208 199 199 199 197 197 197 ++199 199 199 202 202 202 204 204 204 205 205 205 205 205 205 205 205 205 ++205 205 205 208 208 208 141 140 140 15 15 15 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++42 42 42 104 104 104 184 184 184 232 231 231 247 247 247 216 216 216 ++57 57 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 25 25 25 134 134 134 202 202 202 207 207 207 ++201 201 201 198 198 198 198 198 198 200 200 200 203 203 203 209 209 209 ++188 188 188 93 92 92 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 15 15 15 30 30 30 10 9 9 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 49 49 49 134 134 134 ++187 187 187 201 201 201 202 202 202 194 194 194 168 168 168 104 104 104 ++23 23 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++16 16 16 42 42 42 45 45 45 28 26 26 2 2 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +diff --git a/drivers/video/logo/logo_fbsd_clut224.ppm b/drivers/video/logo/logo_fbsd_clut224.ppm +new file mode 100644 +index 000000000000..4387aa0456f4 +--- /dev/null ++++ b/drivers/video/logo/logo_fbsd_clut224.ppm +@@ -0,0 +1,2403 @@ ++P3 ++120 120 ++255 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ++1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 ++1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 ++1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 ++1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 ++1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 1 1 1 1 1 1 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 38 6 5 ++38 6 5 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 ++44 12 10 44 12 10 44 12 10 44 12 10 38 6 5 38 6 5 ++38 6 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 39 3 2 ++39 3 2 39 3 2 39 3 2 39 3 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 38 6 5 ++44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 ++44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 ++44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 ++44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 38 6 5 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 39 3 2 39 3 2 39 3 2 39 3 2 2 2 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 39 3 2 97 5 3 131 20 10 ++153 32 16 176 59 34 176 59 34 174 34 14 166 21 8 124 2 0 ++86 4 2 39 3 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 38 6 5 44 12 10 44 12 10 44 12 10 44 12 10 ++44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 ++44 12 10 177 84 68 183 106 85 183 106 85 183 106 85 183 106 85 ++183 106 85 183 106 85 183 106 85 177 84 68 44 12 10 44 12 10 ++44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 ++44 12 10 44 12 10 44 12 10 38 6 5 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 39 3 2 86 4 2 141 11 5 ++166 21 8 168 26 11 168 26 11 156 16 7 147 19 9 141 11 5 ++97 5 3 39 3 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 39 3 2 124 2 0 147 19 9 176 59 34 ++176 59 34 192 80 59 203 102 83 214 127 110 214 127 110 214 127 110 ++203 99 81 209 61 24 153 32 16 86 4 2 39 3 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 1 1 1 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 38 6 5 44 12 10 ++44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 ++177 84 68 183 106 85 213 149 125 222 184 158 237 212 203 246 228 219 ++253 252 251 253 253 252 253 253 252 254 254 253 254 254 253 255 255 255 ++255 255 255 254 254 253 253 253 252 253 253 252 253 252 251 246 228 219 ++237 212 203 222 184 158 213 149 125 183 106 85 177 84 68 44 12 10 ++44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 ++38 6 5 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++39 3 2 86 4 2 153 32 16 209 61 24 213 78 31 203 99 81 ++203 99 81 203 99 81 192 80 59 193 53 28 164 15 5 149 3 1 ++140 1 0 117 1 0 39 3 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 97 5 3 140 1 0 131 20 10 153 32 16 ++174 34 14 176 59 34 191 90 72 214 127 110 236 173 149 236 173 149 ++236 173 149 221 154 132 214 127 110 203 99 81 204 76 38 147 19 9 ++39 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++2 2 2 2 2 2 44 12 10 44 12 10 44 12 10 44 12 10 ++44 12 10 44 12 10 44 12 10 183 106 85 222 184 158 237 212 203 ++249 237 229 253 253 252 255 255 255 255 255 255 255 255 255 255 255 255 ++254 254 253 253 253 252 253 253 252 253 253 252 254 254 253 254 254 253 ++253 253 252 253 253 252 253 253 252 253 253 252 253 253 252 253 253 252 ++255 255 255 255 255 255 255 255 255 254 254 253 249 237 229 237 212 203 ++222 184 158 183 106 85 90 10 7 44 12 10 44 12 10 44 12 10 ++44 12 10 44 12 10 44 12 10 38 6 5 2 2 2 2 2 2 ++2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 39 3 2 136 24 13 ++204 76 38 214 127 110 221 143 118 221 143 118 221 143 118 221 154 132 ++221 143 118 214 127 110 192 80 59 168 26 11 153 0 0 142 1 0 ++131 0 0 140 1 0 86 4 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 2 2 2 147 0 0 141 0 0 131 0 0 147 19 9 ++153 32 16 174 34 14 184 62 32 203 102 83 221 154 132 236 194 173 ++241 196 185 241 196 185 236 173 149 239 175 143 231 168 130 221 143 118 ++203 99 81 153 32 16 44 12 10 1 1 1 0 0 0 1 1 1 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 ++44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 90 10 7 ++183 106 85 222 184 158 249 237 229 253 253 252 255 255 255 255 255 255 ++255 255 255 254 254 253 253 253 252 253 253 252 253 253 252 254 254 253 ++254 254 253 254 254 253 254 254 253 254 254 253 254 255 253 255 255 255 ++254 254 253 254 254 253 255 255 255 255 255 255 255 255 255 254 254 253 ++254 254 253 253 253 252 253 253 252 253 253 252 255 255 255 255 255 255 ++255 255 255 253 253 252 251 245 237 222 184 158 183 106 85 177 84 68 ++44 12 10 44 12 10 44 12 10 44 12 10 44 12 10 38 6 5 ++2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 ++0 0 0 1 1 1 86 4 2 176 59 34 203 102 83 239 175 143 ++236 173 149 236 173 149 237 187 164 237 187 164 236 194 173 237 187 164 ++236 173 149 206 120 99 193 53 28 168 14 5 153 2 0 140 1 0 ++131 0 0 140 1 0 131 0 0 2 2 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 39 3 2 157 0 0 145 0 0 124 2 0 140 1 0 ++156 16 7 168 26 11 186 41 14 192 80 59 206 120 99 233 177 153 ++245 214 205 249 237 229 245 214 205 241 196 185 237 187 164 239 175 143 ++239 175 143 231 168 130 214 127 110 176 59 34 86 4 2 0 0 0 ++2 2 2 2 2 2 2 2 2 2 2 2 44 12 10 44 12 10 ++44 12 10 44 12 10 44 12 10 177 84 68 222 184 158 243 220 211 ++255 255 255 255 255 255 254 254 253 253 253 252 253 253 252 253 253 252 ++254 254 253 254 254 253 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 253 255 254 253 253 252 ++253 252 251 253 252 251 253 253 252 255 255 255 255 255 255 243 220 211 ++222 184 158 183 106 85 44 12 10 44 12 10 44 12 10 44 12 10 ++44 12 10 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 ++86 4 2 184 62 32 221 143 118 237 187 164 243 208 194 241 196 185 ++241 196 185 241 205 194 243 210 197 245 214 205 243 210 197 237 187 164 ++221 143 118 192 80 59 174 34 14 164 15 5 149 3 1 140 1 0 ++124 2 0 142 0 0 150 0 0 39 3 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 39 3 2 166 0 0 150 0 0 131 0 0 131 0 0 ++149 3 1 156 16 7 174 34 14 185 36 13 204 76 38 214 127 110 ++237 187 164 251 245 237 254 254 253 250 233 221 243 208 194 241 196 185 ++237 187 164 236 173 149 239 175 143 239 175 143 214 127 110 176 59 34 ++90 10 7 2 2 2 2 2 2 44 12 10 44 12 10 44 12 10 ++44 12 10 183 106 85 222 184 158 251 245 237 255 255 255 255 255 255 ++253 253 252 253 253 252 254 254 253 254 254 253 254 254 253 254 254 253 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 253 252 251 251 245 237 249 237 229 249 237 229 ++249 237 229 249 237 229 252 243 235 251 245 237 253 249 244 253 252 250 ++253 253 252 253 255 254 254 254 253 253 253 252 253 252 251 254 254 253 ++254 254 253 251 245 237 238 198 189 183 106 85 44 12 10 44 12 10 ++44 12 10 44 12 10 2 2 2 2 2 2 90 10 7 192 80 59 ++231 168 130 245 214 205 248 226 214 245 214 205 245 214 205 245 214 205 ++248 226 214 250 233 221 252 242 234 249 237 229 241 205 194 221 154 132 ++203 99 81 193 53 28 174 34 14 156 16 7 146 0 0 131 0 0 ++124 2 0 150 0 0 157 0 0 39 3 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 39 3 2 167 0 0 159 0 0 131 0 0 131 0 0 ++141 0 0 153 2 0 168 14 5 179 30 10 196 46 20 204 76 38 ++206 120 99 237 187 164 251 240 231 255 255 255 252 243 235 245 214 205 ++241 196 185 241 196 185 241 196 185 241 190 156 241 190 156 241 190 156 ++221 143 118 176 59 34 44 12 10 44 12 10 44 12 10 177 84 68 ++222 184 158 253 252 250 255 255 255 254 254 253 253 253 252 253 253 252 ++254 254 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 254 254 253 249 237 229 243 220 211 243 220 211 243 220 211 ++243 220 211 243 220 211 243 220 211 243 220 211 248 226 214 246 228 219 ++250 233 221 249 237 229 253 249 244 253 252 251 253 255 254 253 255 254 ++253 253 252 253 253 252 254 254 253 253 249 244 222 184 158 183 106 85 ++44 12 10 44 12 10 90 10 7 184 62 32 231 168 130 248 226 214 ++252 240 230 249 231 218 248 226 214 248 226 214 250 233 221 250 233 221 ++252 243 235 253 253 252 253 252 251 245 214 205 236 173 149 203 99 81 ++193 53 28 193 53 28 174 34 14 157 8 2 142 0 0 131 0 0 ++131 0 0 157 0 0 163 0 0 39 3 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 2 2 2 170 0 0 167 0 0 140 1 0 124 2 0 ++140 1 0 147 0 0 159 3 1 173 17 6 193 28 10 196 46 20 ++209 61 24 203 99 81 221 154 132 245 214 205 251 240 231 246 228 219 ++245 214 205 242 201 184 242 201 184 243 208 194 242 201 184 242 201 184 ++242 201 184 242 201 184 227 164 124 183 106 85 222 184 158 251 245 237 ++255 255 255 254 254 253 253 253 252 253 253 252 254 254 253 254 254 253 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++254 255 253 255 255 255 255 255 255 255 255 255 254 254 253 254 254 253 ++254 254 253 254 254 253 254 254 253 254 254 253 254 254 253 255 255 255 ++255 255 255 254 254 253 249 237 229 243 220 211 243 220 211 243 220 211 ++243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 ++243 220 211 243 220 211 243 220 211 248 226 214 250 233 221 252 242 234 ++253 249 244 253 252 251 253 253 252 253 253 252 255 255 255 253 252 250 ++213 149 125 177 84 68 227 164 124 248 226 214 253 249 240 252 240 230 ++251 236 222 251 238 227 251 238 227 252 240 230 252 242 234 254 252 249 ++255 255 255 251 245 237 243 210 197 221 154 132 203 102 83 204 76 38 ++193 53 28 193 53 28 164 15 5 150 0 0 140 1 0 124 2 0 ++140 1 0 165 0 0 150 0 0 39 3 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 158 0 0 176 0 0 146 0 0 124 2 0 ++131 0 0 145 0 0 155 2 1 172 5 1 180 20 5 193 28 10 ++196 46 20 209 61 24 204 76 38 214 127 110 236 173 149 241 196 185 ++243 208 194 243 210 197 243 208 194 243 208 194 245 214 205 245 214 205 ++242 201 184 243 208 194 249 231 218 252 242 234 255 255 255 255 255 255 ++253 253 252 253 253 252 254 254 253 254 255 253 254 255 253 255 255 255 ++254 255 253 254 255 253 254 255 253 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 254 254 253 254 254 253 253 253 252 ++254 254 253 254 254 253 254 254 253 254 253 250 254 254 253 255 255 255 ++255 255 255 255 255 255 253 252 251 249 237 229 243 220 211 243 220 211 ++243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 ++243 220 211 248 226 214 248 226 214 248 226 214 248 226 214 243 220 211 ++246 228 219 249 237 229 252 243 235 253 252 251 253 249 240 241 190 156 ++231 168 130 243 210 197 253 251 245 253 249 244 252 240 230 252 240 230 ++252 243 235 252 242 234 252 242 234 251 245 237 254 252 249 253 249 244 ++250 233 221 241 196 185 221 154 132 203 102 83 192 80 59 192 80 59 ++193 53 28 168 26 11 157 0 0 146 0 0 131 0 0 124 2 0 ++145 0 0 177 0 0 140 1 0 2 2 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 117 1 0 186 0 0 155 0 0 131 0 0 ++131 0 0 141 0 0 153 2 0 163 1 0 176 6 2 191 24 6 ++193 28 10 205 44 13 209 61 24 213 78 31 203 99 81 221 143 118 ++239 175 143 237 187 164 242 201 184 243 208 194 243 210 197 247 223 207 ++249 231 218 249 237 229 253 252 250 253 255 254 253 253 252 253 253 252 ++254 254 253 254 254 253 254 255 253 254 255 253 254 255 253 254 255 253 ++254 255 253 254 255 253 254 255 253 254 255 253 254 255 253 254 255 253 ++254 255 253 254 254 253 254 254 253 254 253 250 254 253 250 254 254 253 ++254 253 250 254 253 250 253 253 252 253 253 252 254 254 253 253 253 252 ++253 253 252 253 253 252 254 254 253 253 253 252 252 243 235 243 220 211 ++243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 ++243 220 211 238 198 189 206 120 99 176 59 34 176 59 34 176 59 34 ++191 90 72 214 127 110 237 187 164 236 194 173 227 164 124 242 201 184 ++253 248 237 253 252 251 253 249 240 251 245 237 253 249 240 253 249 240 ++251 245 237 252 243 235 251 245 237 252 243 235 250 233 221 245 214 205 ++237 187 164 221 154 132 214 127 110 203 99 81 192 80 59 192 80 59 ++179 30 10 163 1 0 153 2 0 142 1 0 131 0 0 131 0 0 ++153 0 0 191 24 6 111 7 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 86 4 2 196 0 0 163 0 0 140 1 0 ++124 2 0 140 1 0 149 3 1 159 3 1 172 5 1 179 7 2 ++191 24 6 210 31 6 213 49 12 209 61 24 213 78 31 213 78 31 ++203 102 83 221 143 118 231 168 130 237 187 164 243 210 197 246 228 219 ++251 245 237 253 252 251 253 253 252 253 253 252 254 254 253 254 254 253 ++254 254 253 255 255 255 255 255 255 254 255 253 254 254 251 254 254 251 ++254 255 253 254 255 253 254 255 253 254 254 251 254 254 251 254 255 253 ++254 254 253 254 253 250 254 252 249 254 253 250 254 253 250 254 253 250 ++254 253 250 253 252 251 253 253 252 253 253 252 253 253 252 253 253 252 ++253 253 252 253 253 252 253 253 252 254 254 253 254 254 253 253 249 244 ++246 228 219 243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 ++241 205 194 192 80 59 169 0 0 172 5 1 168 14 5 173 17 6 ++173 17 6 173 17 6 204 67 22 231 168 130 251 238 227 255 255 255 ++254 252 249 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 ++253 249 240 251 245 237 252 240 230 248 226 214 241 205 194 236 173 149 ++221 154 132 214 127 110 206 120 99 203 99 81 192 80 59 185 36 13 ++172 5 1 159 3 1 149 3 1 140 1 0 124 2 0 140 1 0 ++168 14 5 185 36 13 86 4 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 39 3 2 184 9 3 174 0 0 147 0 0 ++131 0 0 131 0 0 145 0 0 155 2 1 167 2 1 176 6 2 ++184 9 3 195 25 6 210 31 6 213 49 12 209 61 24 213 78 31 ++203 99 81 203 102 83 214 127 110 231 168 130 245 214 205 253 249 244 ++253 253 252 253 253 252 253 253 252 254 254 253 254 254 253 254 254 253 ++254 254 253 254 254 253 254 254 253 254 254 251 254 254 251 254 255 253 ++254 255 253 254 255 253 254 255 253 254 254 251 254 254 251 254 253 250 ++254 252 249 254 252 249 254 252 249 254 252 249 254 252 249 254 252 249 ++253 252 251 253 252 251 253 253 252 253 253 252 253 253 252 253 253 252 ++253 253 252 253 253 252 253 253 252 253 253 252 253 253 252 254 254 253 ++253 249 244 246 228 219 243 220 211 243 220 211 243 220 211 243 220 211 ++213 149 125 165 0 0 167 2 1 168 14 5 168 14 5 168 14 5 ++180 23 7 203 99 81 243 208 194 254 254 253 254 254 253 253 251 245 ++253 251 245 254 252 249 254 252 249 253 249 244 253 249 244 253 249 244 ++251 245 237 250 233 221 245 214 205 241 196 185 237 187 164 236 173 149 ++221 143 118 214 127 110 203 102 83 203 99 81 196 46 20 176 6 2 ++167 2 1 159 3 1 145 0 0 131 0 0 124 2 0 149 3 1 ++193 53 28 174 34 14 2 2 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 147 19 9 191 24 6 157 0 0 ++131 0 0 124 2 0 140 1 0 149 3 1 159 3 1 172 5 1 ++184 9 3 184 9 3 210 31 6 210 31 6 209 61 24 213 78 31 ++213 78 31 203 99 81 221 143 118 243 208 194 253 252 250 253 253 252 ++253 253 252 254 254 253 254 254 253 253 253 252 254 254 253 253 253 252 ++253 252 251 253 252 250 254 252 249 254 253 250 254 254 251 254 254 253 ++254 254 251 254 255 253 254 255 253 254 253 250 254 252 249 253 251 245 ++253 251 245 254 252 249 254 252 249 253 251 245 253 251 245 254 252 249 ++254 252 249 254 252 249 254 252 249 254 252 249 254 252 249 254 252 249 ++254 252 249 254 252 249 254 252 249 253 252 250 253 252 250 253 252 250 ++253 252 251 253 252 250 249 237 229 243 220 211 237 212 203 243 220 211 ++191 90 72 163 0 0 167 2 1 168 14 5 168 14 5 185 36 13 ++227 164 124 253 248 237 255 255 255 254 254 253 254 252 249 254 252 249 ++254 253 250 254 253 250 254 252 249 253 249 244 253 249 244 252 243 235 ++249 231 218 245 214 205 241 196 185 237 187 164 236 173 149 239 175 143 ++221 143 118 214 127 110 203 99 81 196 46 20 183 2 0 172 5 1 ++163 1 0 153 2 0 140 1 0 131 0 0 131 0 0 168 26 11 ++192 80 59 147 19 9 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 90 10 7 193 53 28 167 2 1 ++141 0 0 124 2 0 131 0 0 146 0 0 159 3 1 167 2 1 ++179 7 2 184 9 3 195 25 6 210 31 6 213 49 12 213 78 31 ++213 78 31 214 127 110 245 214 205 253 255 254 253 253 252 253 253 252 ++253 253 252 253 253 252 253 252 251 253 253 252 254 253 250 254 252 249 ++253 251 245 254 252 249 254 252 249 254 253 250 254 253 250 254 253 250 ++254 254 253 254 254 251 254 254 251 253 251 245 253 250 244 253 250 244 ++253 250 244 253 250 244 253 251 245 253 250 244 253 249 244 253 249 244 ++254 252 249 254 252 249 254 252 249 254 252 249 253 252 250 254 252 249 ++254 252 249 254 252 249 254 252 249 253 252 250 253 252 250 253 252 250 ++253 252 250 254 252 249 253 252 250 249 237 229 243 220 211 243 220 211 ++192 80 59 164 0 0 167 2 1 167 2 1 189 46 14 234 180 140 ++254 254 251 254 254 253 254 253 250 254 253 250 254 253 250 254 254 253 ++253 253 252 254 252 249 254 252 249 253 249 244 252 243 235 249 231 218 ++245 214 205 243 208 194 241 196 185 237 187 164 236 173 149 221 154 132 ++221 143 118 203 102 83 196 46 20 189 0 0 179 7 2 167 2 1 ++159 3 1 147 0 0 140 1 0 124 2 0 141 11 5 176 59 34 ++204 76 38 86 4 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 39 3 2 193 53 28 185 36 13 ++150 0 0 131 0 0 131 0 0 142 1 0 149 3 1 167 2 1 ++174 10 3 184 9 3 195 25 6 210 31 6 213 49 12 209 61 24 ++206 120 99 243 220 211 253 255 254 253 253 252 253 253 252 254 254 253 ++253 252 251 253 252 251 253 252 251 254 252 249 253 249 244 253 249 244 ++253 249 244 253 251 245 254 252 249 254 252 249 254 252 249 254 253 250 ++254 253 250 254 253 250 254 252 249 253 249 240 253 249 240 253 249 244 ++253 249 240 253 249 240 253 249 240 253 249 244 253 249 244 253 249 244 ++253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 ++253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 ++253 249 244 253 249 244 253 249 244 253 249 244 252 243 235 246 228 219 ++191 90 72 163 1 0 168 14 5 174 10 3 206 120 99 255 255 255 ++254 254 253 253 253 252 254 254 253 254 254 253 254 254 253 254 254 253 ++253 253 252 254 252 249 254 252 249 251 245 237 250 233 221 248 226 214 ++245 214 205 243 208 194 241 196 185 236 173 149 236 173 149 221 154 132 ++206 120 99 203 40 12 196 0 0 184 9 3 176 6 2 163 1 0 ++153 2 0 142 1 0 131 0 0 131 0 0 153 32 16 191 90 72 ++176 59 34 39 3 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 153 32 16 192 80 59 ++159 13 5 140 1 0 124 2 0 140 1 0 149 3 1 157 8 2 ++174 10 3 180 20 5 193 28 10 203 40 12 205 44 13 203 99 81 ++243 220 211 253 255 254 253 253 252 253 253 252 253 253 252 253 252 251 ++253 252 251 253 252 251 253 249 244 253 249 244 253 249 244 253 249 244 ++253 249 244 253 249 244 253 251 245 254 252 249 253 251 245 254 252 249 ++254 252 249 253 251 245 253 249 244 253 248 237 253 248 237 253 248 237 ++253 248 237 253 248 237 253 248 237 253 249 240 253 249 244 253 249 244 ++253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 ++253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 ++253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 ++214 127 110 159 3 1 159 13 5 187 29 9 234 180 140 255 255 255 ++254 253 250 254 254 253 254 254 253 255 255 255 254 254 253 254 254 253 ++253 253 252 254 252 249 253 249 244 251 238 227 249 231 218 247 223 207 ++245 214 205 241 196 185 237 187 164 236 173 149 236 173 149 203 102 83 ++210 31 6 196 0 0 192 0 0 179 7 2 172 5 1 159 3 1 ++149 3 1 140 1 0 124 2 0 142 30 13 192 80 59 203 102 83 ++111 7 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 203 99 81 ++193 53 28 150 0 0 131 0 0 131 0 0 142 1 0 157 8 2 ++168 14 5 180 23 7 193 28 10 196 46 20 203 99 81 237 212 203 ++253 255 254 253 253 252 253 253 252 253 253 252 253 252 250 253 253 252 ++253 252 250 253 249 244 251 245 237 251 245 237 253 249 244 253 249 244 ++253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 251 245 ++253 249 244 253 249 244 251 245 237 252 244 235 252 244 235 252 246 236 ++252 246 236 252 244 235 252 244 235 251 245 237 251 245 237 253 249 244 ++253 249 244 251 245 237 253 249 244 253 249 244 253 249 244 251 245 237 ++253 249 244 251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 ++251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 253 252 250 ++238 198 189 176 59 34 176 59 34 196 60 25 241 190 156 255 255 255 ++254 254 253 255 255 255 254 255 253 255 255 255 254 254 253 254 254 253 ++254 253 250 253 249 244 252 242 234 250 233 221 248 226 214 245 214 205 ++243 208 194 241 196 185 237 187 164 236 173 149 203 99 81 210 31 6 ++196 0 0 196 0 0 184 9 3 176 6 2 163 1 0 153 2 0 ++142 1 0 131 0 0 131 20 10 176 59 34 198 112 92 192 80 59 ++39 3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 176 59 34 ++203 99 81 166 21 8 140 1 0 131 0 0 140 1 0 144 9 4 ++166 21 8 174 34 14 185 36 13 192 80 59 238 198 189 253 252 251 ++253 252 250 253 253 252 253 253 252 254 253 250 253 252 251 254 252 249 ++251 245 237 252 243 235 251 245 237 251 245 237 253 249 244 253 249 244 ++253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 ++251 245 237 252 243 235 252 243 235 252 240 230 252 240 230 252 240 230 ++252 240 230 252 240 230 252 240 230 252 243 235 252 243 235 252 243 235 ++251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 ++251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 ++251 245 237 251 245 237 252 243 235 252 243 235 252 243 235 251 245 237 ++246 228 219 210 136 114 214 127 110 206 120 99 237 182 145 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 254 254 253 254 254 253 ++253 249 244 252 243 235 252 240 230 250 233 221 248 226 214 245 214 205 ++243 208 194 241 196 185 236 173 149 213 78 31 210 31 6 196 0 0 ++196 0 0 192 0 0 179 7 2 172 5 1 159 3 1 150 0 0 ++140 1 0 131 0 0 153 32 16 188 95 83 214 127 110 153 32 16 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 90 10 7 ++203 102 83 184 62 32 149 3 1 131 0 0 141 11 5 147 19 9 ++166 21 8 174 34 14 176 59 34 236 194 173 253 249 244 253 249 244 ++253 253 252 254 253 250 254 253 250 253 253 252 254 252 249 252 243 235 ++252 242 234 252 243 235 251 245 237 251 245 237 253 249 244 253 249 244 ++253 249 244 253 249 244 253 249 244 253 249 244 253 249 244 252 243 235 ++252 242 234 252 242 234 251 240 231 251 238 227 251 238 227 251 238 227 ++251 238 227 251 238 227 251 238 227 252 242 234 252 242 234 252 242 234 ++252 242 234 252 242 234 252 242 234 252 242 234 252 242 234 252 242 234 ++252 242 234 252 242 234 252 242 234 251 240 231 251 240 231 250 239 228 ++250 239 228 251 238 227 251 238 227 251 238 227 251 238 227 251 238 227 ++250 239 228 237 187 164 210 136 114 221 143 118 227 164 124 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 254 254 253 254 252 249 ++253 249 240 252 242 234 251 238 227 249 231 218 247 223 207 245 214 205 ++241 196 185 221 154 132 213 78 31 210 31 6 196 0 0 196 0 0 ++196 0 0 184 9 3 172 5 1 163 1 0 153 2 0 142 1 0 ++131 0 0 136 24 13 177 84 68 214 127 110 203 99 81 86 4 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 ++177 84 68 203 102 83 174 34 14 140 1 0 141 11 5 147 19 9 ++153 32 16 174 34 14 221 154 132 253 249 244 251 245 237 253 252 251 ++254 254 253 254 253 250 254 254 253 253 249 244 252 242 234 251 240 231 ++252 243 235 251 245 237 251 245 237 251 245 237 251 245 237 251 245 237 ++252 246 236 253 249 244 251 245 237 251 245 237 252 243 235 252 242 234 ++252 242 234 249 237 229 251 238 227 251 236 222 251 236 222 251 236 222 ++251 236 222 251 236 222 251 238 227 249 237 229 249 237 229 249 237 229 ++249 237 229 249 237 229 249 237 229 249 237 229 249 237 229 249 237 229 ++249 237 229 251 238 227 251 236 222 251 236 222 251 236 222 251 236 222 ++251 236 222 251 236 222 251 236 222 251 236 222 251 236 222 251 236 222 ++251 238 227 243 220 211 221 154 132 221 154 132 221 143 118 251 238 227 ++255 255 255 255 255 255 255 255 255 254 254 253 254 252 249 253 249 244 ++251 245 237 252 240 230 250 233 221 248 226 214 247 223 207 241 196 185 ++221 143 118 209 61 24 210 31 6 210 31 6 196 0 0 196 0 0 ++184 9 3 179 7 2 167 2 1 159 3 1 149 3 1 131 0 0 ++131 20 10 176 59 34 198 112 92 221 154 132 174 34 14 2 2 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++111 7 4 214 127 110 192 80 59 156 16 7 141 11 5 136 24 13 ++153 32 16 198 112 92 249 237 229 251 242 233 253 249 244 254 254 253 ++254 253 250 254 253 250 253 249 244 251 240 231 251 240 231 252 242 234 ++252 243 235 251 245 237 251 245 237 251 245 237 251 245 237 253 248 237 ++252 246 236 251 245 237 251 245 237 252 243 235 252 242 234 251 240 231 ++249 237 229 249 237 229 250 233 221 250 235 219 250 235 219 250 235 219 ++250 235 219 250 235 219 250 233 221 249 237 229 249 237 229 249 237 229 ++249 237 229 249 237 229 249 237 229 249 237 229 250 233 221 249 231 218 ++250 235 219 250 235 219 250 235 219 250 235 219 250 235 219 250 235 219 ++250 235 219 250 235 219 250 235 219 250 235 219 250 235 219 250 233 221 ++249 237 229 249 237 229 238 198 189 237 187 164 231 168 130 241 190 156 ++255 255 255 255 255 255 255 255 255 254 252 249 253 249 244 253 249 244 ++252 243 235 252 240 230 250 233 221 243 208 194 236 173 149 203 99 81 ++213 49 12 210 31 6 210 31 6 196 0 0 196 0 0 192 0 0 ++183 2 0 172 5 1 163 1 0 153 2 0 141 0 0 131 0 0 ++153 32 16 188 95 83 213 149 125 206 120 99 86 4 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++39 3 2 203 99 81 214 127 110 176 59 34 147 19 9 136 24 13 ++177 84 68 243 220 211 249 237 229 251 245 237 253 253 252 254 253 250 ++254 253 250 253 251 245 249 237 229 249 237 229 251 240 231 252 242 234 ++252 243 235 251 245 237 251 245 237 251 245 237 253 249 244 253 248 237 ++252 244 235 252 246 236 252 243 235 252 242 234 249 237 229 249 237 229 ++249 237 229 249 237 229 249 231 218 248 226 214 248 226 214 248 226 214 ++248 226 214 248 226 214 250 233 221 250 233 221 250 233 221 250 233 221 ++246 228 219 250 233 221 249 231 218 248 226 214 248 226 214 248 226 214 ++248 226 214 248 226 214 248 226 214 248 226 214 248 226 214 248 226 214 ++248 226 214 248 226 214 248 226 214 246 228 219 246 228 219 246 228 219 ++246 228 219 246 228 219 246 228 219 238 198 189 238 198 189 231 168 130 ++252 240 230 253 249 244 253 249 240 253 251 245 253 249 244 252 242 234 ++248 226 214 242 201 184 239 175 143 214 127 110 213 78 31 209 61 24 ++213 43 8 210 31 6 210 31 6 196 0 0 196 0 0 184 9 3 ++176 6 2 167 2 1 159 3 1 145 0 0 131 0 0 136 24 13 ++177 84 68 202 130 106 236 173 149 176 59 34 2 2 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 131 20 10 221 143 118 203 99 81 153 32 16 153 32 16 ++222 184 158 252 242 234 249 237 229 253 252 250 254 254 253 254 253 250 ++254 252 249 249 237 229 250 233 221 249 237 229 251 240 231 252 242 234 ++252 243 235 251 245 237 253 249 244 253 249 244 253 249 240 253 248 237 ++252 246 236 252 244 235 252 242 234 251 240 231 249 237 229 249 237 229 ++249 237 229 246 228 219 246 228 219 248 226 214 247 223 207 247 223 207 ++247 223 207 247 223 207 246 228 219 246 228 219 246 228 219 246 228 219 ++248 226 214 247 223 207 247 223 207 247 223 207 247 223 207 247 223 207 ++247 223 207 247 223 207 247 223 207 247 223 207 247 223 207 247 223 207 ++247 223 207 248 226 214 246 228 219 246 228 219 246 228 219 246 228 219 ++246 228 219 246 228 219 246 228 219 237 212 203 222 184 158 206 120 99 ++239 175 143 248 226 214 243 208 194 242 201 184 237 187 164 236 173 149 ++231 168 130 221 143 118 203 102 83 213 78 31 213 78 31 213 49 12 ++210 31 6 210 31 6 196 0 0 196 0 0 184 9 3 179 7 2 ++172 5 1 163 1 0 150 0 0 140 1 0 131 20 10 176 59 34 ++198 112 92 218 160 133 214 127 110 97 5 3 1 1 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 1 1 2 2 2 198 112 92 221 143 118 192 80 59 213 149 125 ++251 242 233 246 228 219 251 245 237 254 254 253 253 253 252 253 253 252 ++251 240 231 249 231 218 251 236 222 252 240 230 252 242 234 252 243 235 ++251 245 237 253 249 244 253 249 244 253 249 244 253 249 240 253 248 237 ++252 246 236 251 242 233 251 240 231 249 237 229 249 237 229 250 233 221 ++246 228 219 246 228 219 248 226 214 248 226 214 247 223 207 247 223 207 ++247 223 207 247 223 207 248 226 214 248 226 214 247 223 207 247 223 207 ++247 223 207 247 223 207 247 223 207 247 223 207 247 223 207 247 223 207 ++247 223 207 247 223 207 247 223 207 247 223 207 243 210 197 247 223 207 ++243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 243 220 211 ++243 220 211 243 220 211 243 220 211 237 212 203 188 95 83 174 34 14 ++213 78 31 242 201 184 242 201 184 241 190 156 239 175 143 231 168 130 ++221 143 118 214 127 110 203 99 81 213 78 31 213 49 12 210 31 6 ++210 31 6 196 0 0 196 0 0 192 0 0 183 2 0 172 5 1 ++167 2 1 153 2 0 141 0 0 141 11 5 153 32 16 188 95 83 ++213 149 125 237 187 164 176 59 34 2 2 2 2 2 2 1 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 ++2 2 2 2 2 2 136 24 13 221 154 132 213 149 125 246 228 219 ++246 228 219 246 228 219 253 252 250 254 254 253 254 254 253 252 243 235 ++248 226 214 250 233 221 251 238 227 251 240 231 252 242 234 252 243 235 ++251 245 237 253 249 244 254 252 249 254 252 249 253 250 244 253 249 240 ++252 246 236 252 240 230 251 240 231 249 237 229 249 237 229 246 228 219 ++246 228 219 248 226 214 243 220 211 243 220 211 245 214 205 243 210 197 ++243 210 197 244 218 207 243 220 211 245 214 205 243 210 197 243 208 194 ++243 210 197 243 208 194 243 208 194 243 208 194 243 208 194 243 208 194 ++243 208 194 243 208 194 243 208 194 243 208 194 243 210 197 245 214 205 ++243 220 211 245 214 205 245 214 205 245 214 205 243 216 205 243 216 205 ++243 216 205 243 220 211 243 216 205 243 220 211 222 184 158 177 84 68 ++193 53 28 206 120 99 237 187 164 239 175 143 231 168 130 221 143 118 ++214 127 110 203 99 81 213 78 31 209 61 24 213 43 8 210 31 6 ++196 0 0 196 0 0 196 0 0 184 9 3 179 7 2 167 2 1 ++159 3 1 145 0 0 131 0 0 142 30 13 177 84 68 202 130 106 ++222 184 158 214 127 110 86 4 2 2 2 2 2 2 2 1 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 ++2 2 2 2 2 2 38 6 5 188 95 83 237 212 203 249 237 229 ++243 220 211 252 243 235 254 254 253 254 254 253 253 249 244 248 226 214 ++248 226 214 250 233 221 249 237 229 251 240 231 252 243 235 251 245 237 ++253 249 244 253 252 251 254 254 253 255 255 255 254 254 253 253 250 244 ++252 244 235 251 238 227 249 237 229 249 237 229 246 228 219 246 228 219 ++248 226 214 245 214 205 245 214 205 245 214 205 245 214 205 245 214 205 ++245 214 205 243 210 197 243 208 194 242 201 184 242 201 184 242 201 184 ++242 201 184 242 201 184 242 201 184 242 201 184 242 201 184 242 201 184 ++242 201 184 242 201 184 242 201 184 243 208 194 237 212 203 237 212 203 ++237 212 203 237 212 203 237 212 203 237 212 203 237 212 203 237 212 203 ++237 212 203 237 212 203 237 212 203 237 212 203 237 212 203 213 149 125 ++176 59 34 196 46 20 221 143 118 239 175 143 221 143 118 214 127 110 ++203 102 83 213 78 31 213 78 31 213 49 12 210 31 6 210 31 6 ++196 0 0 196 0 0 184 9 3 179 7 2 172 5 1 159 3 1 ++147 0 0 140 1 0 136 24 13 176 59 34 183 106 85 221 154 132 ++237 187 164 174 34 14 38 6 5 2 2 2 2 2 2 2 2 2 ++1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 ++2 2 2 2 2 2 2 2 2 177 84 68 251 245 237 243 220 211 ++246 228 219 253 253 252 254 254 253 254 252 249 248 226 214 247 223 207 ++249 231 218 250 233 221 249 237 229 251 240 231 252 243 235 253 249 244 ++253 253 252 255 255 255 255 255 255 255 255 255 255 255 255 253 251 245 ++252 244 235 251 236 222 250 233 221 250 233 221 246 228 219 243 220 211 ++245 214 205 245 214 205 245 214 205 245 214 205 245 214 205 243 210 197 ++242 201 184 242 201 184 242 201 184 242 201 184 242 201 184 242 201 184 ++242 201 184 242 201 184 242 201 184 242 201 184 236 194 173 236 194 173 ++236 194 173 236 194 173 241 196 185 238 198 189 238 198 189 238 198 189 ++238 198 189 238 198 189 238 198 189 238 198 189 238 198 189 238 198 189 ++238 198 189 241 205 194 238 198 189 238 198 189 238 198 189 238 198 189 ++198 112 92 176 59 34 209 61 24 221 143 118 221 143 118 214 127 110 ++203 99 81 213 78 31 213 49 12 210 31 6 210 31 6 196 0 0 ++196 0 0 192 0 0 184 9 3 172 5 1 163 1 0 150 0 0 ++141 0 0 141 11 5 153 32 16 188 95 83 213 149 125 241 196 185 ++214 127 110 142 30 13 2 2 2 2 2 2 2 2 2 2 2 2 ++1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 ++2 2 2 2 2 2 44 12 10 222 184 158 249 237 229 237 212 203 ++252 242 234 255 255 255 254 254 253 251 238 227 245 214 205 247 223 207 ++249 231 218 250 233 221 252 240 230 252 242 234 253 249 244 253 252 251 ++255 255 255 255 255 255 255 255 255 255 255 255 254 254 253 253 249 244 ++252 240 230 250 235 219 249 231 218 246 228 219 248 226 214 245 214 205 ++245 214 205 241 205 194 241 205 194 241 205 194 242 201 184 242 201 184 ++236 194 173 236 194 173 236 194 173 241 190 156 241 190 156 241 190 156 ++241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 ++241 190 156 241 196 185 241 196 185 241 196 185 241 196 185 241 196 185 ++241 196 185 241 196 185 241 196 185 241 196 185 241 196 185 238 198 189 ++238 198 189 238 198 189 238 198 189 238 198 189 238 198 189 238 198 189 ++222 184 158 183 106 85 176 59 34 213 49 12 203 99 81 203 99 81 ++213 78 31 209 61 24 210 31 6 210 31 6 196 0 0 196 0 0 ++196 0 0 183 2 0 172 5 1 163 1 0 150 0 0 142 0 0 ++131 0 0 142 30 13 177 84 68 202 130 106 222 184 158 233 177 153 ++203 99 81 222 184 158 44 12 10 2 2 2 2 2 2 2 2 2 ++1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 ++2 2 2 2 2 2 183 106 85 253 249 244 243 220 211 243 216 205 ++253 252 250 255 255 255 253 249 244 243 210 197 245 214 205 248 226 214 ++249 231 218 250 233 221 251 238 227 252 243 235 253 251 245 254 254 253 ++255 255 255 255 255 255 255 255 255 255 255 255 253 255 254 253 248 237 ++251 236 222 249 231 218 248 226 214 243 220 211 245 214 205 245 214 205 ++241 205 194 241 196 185 241 196 185 241 196 185 241 190 156 241 190 156 ++241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 ++241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 241 190 156 ++237 187 164 237 187 164 237 187 164 237 187 164 237 187 164 237 187 164 ++237 187 164 237 187 164 237 187 164 237 187 164 237 187 164 236 194 173 ++236 194 173 236 194 173 236 194 173 236 194 173 236 194 173 222 184 158 ++222 184 158 222 184 158 177 84 68 176 59 34 213 49 12 213 78 31 ++213 78 31 213 43 8 210 31 6 196 0 0 196 0 0 192 0 0 ++183 2 0 172 5 1 163 1 0 153 0 0 145 0 0 140 1 0 ++136 24 13 176 59 34 198 112 92 221 154 132 238 198 189 203 99 81 ++222 184 158 237 212 203 183 106 85 2 2 2 2 2 2 2 2 2 ++2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 ++2 2 2 44 12 10 238 198 189 252 242 234 241 205 194 246 228 219 ++254 254 253 254 254 253 247 223 207 243 208 194 245 214 205 247 223 207 ++248 226 214 250 233 221 251 238 227 251 245 237 253 252 251 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 254 252 249 252 240 230 ++249 231 218 247 223 207 247 223 207 245 214 205 243 210 197 241 205 194 ++241 196 185 241 196 185 237 187 164 241 190 156 241 190 156 241 190 156 ++241 190 156 239 175 143 239 175 143 239 175 143 239 175 143 239 175 143 ++239 175 143 239 175 143 239 175 143 227 164 124 221 143 118 221 143 118 ++214 127 110 214 127 110 206 120 99 203 99 81 203 99 81 203 99 81 ++203 99 81 203 99 81 203 99 81 198 112 92 206 120 99 214 127 110 ++213 149 125 221 154 132 218 160 133 222 184 158 222 184 158 222 184 158 ++222 184 158 222 184 158 218 160 133 177 84 68 176 59 34 210 31 6 ++213 43 8 210 31 6 196 0 0 196 0 0 189 0 0 181 0 0 ++172 0 0 163 1 0 155 0 0 146 0 0 140 1 0 141 11 5 ++153 32 16 188 95 83 213 149 125 238 198 189 221 154 132 198 112 92 ++240 219 206 240 219 206 222 184 158 44 12 10 2 2 2 2 2 2 ++2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 2 2 ++2 2 2 177 84 68 251 242 233 243 220 211 241 205 194 251 245 237 ++255 255 255 251 240 231 242 201 184 243 208 194 245 214 205 247 223 207 ++248 226 214 250 233 221 251 238 227 251 245 237 253 253 252 255 255 255 ++255 255 255 255 255 255 255 255 255 254 253 250 252 244 235 250 235 219 ++247 223 207 247 223 207 243 210 197 243 210 197 241 196 185 241 196 185 ++241 196 185 241 190 156 237 182 145 239 175 143 239 175 143 239 175 143 ++239 175 143 239 175 143 239 175 143 239 175 143 239 175 143 221 143 118 ++214 127 110 203 99 81 213 78 31 213 78 31 209 61 24 204 76 38 ++204 76 38 204 76 38 204 76 38 204 76 38 204 76 38 204 76 38 ++193 53 28 193 53 28 193 53 28 184 62 32 192 80 59 184 62 32 ++192 80 59 192 80 59 191 90 72 188 95 83 206 120 99 213 149 125 ++218 160 133 218 160 133 218 160 133 213 149 125 177 84 68 176 59 34 ++195 25 6 196 0 0 196 0 0 189 0 0 183 2 0 174 0 0 ++165 0 0 157 0 0 147 0 0 140 1 0 131 0 0 142 30 13 ++177 84 68 202 130 106 222 184 158 241 196 185 192 80 59 218 160 133 ++237 212 203 240 219 206 237 212 203 177 84 68 2 2 2 2 2 2 ++2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 2 2 2 ++38 6 5 222 184 158 251 245 237 238 198 189 237 212 203 254 254 253 ++253 252 251 243 208 194 236 194 173 243 208 194 243 210 197 247 223 207 ++248 226 214 250 233 221 252 240 230 251 245 237 254 252 249 254 254 253 ++255 255 255 254 254 253 254 252 249 252 246 236 250 235 219 247 223 207 ++247 223 207 243 208 194 242 201 184 241 196 185 241 196 185 237 187 164 ++239 175 143 239 175 143 239 175 143 239 175 143 239 175 143 239 175 143 ++239 175 143 227 164 124 221 143 118 203 102 83 213 78 31 213 49 12 ++213 49 12 213 43 8 213 43 8 213 49 12 209 61 24 209 61 24 ++209 61 24 193 53 28 193 53 28 193 53 28 193 53 28 193 53 28 ++193 53 28 193 53 28 193 53 28 193 53 28 193 53 28 193 53 28 ++176 59 34 176 59 34 176 59 34 176 59 34 176 59 34 177 84 68 ++177 84 68 198 112 92 210 136 114 213 149 125 210 136 114 177 84 68 ++176 59 34 180 23 7 192 0 0 183 2 0 174 0 0 167 2 1 ++158 0 0 150 0 0 141 0 0 131 0 0 136 24 13 177 84 68 ++198 112 92 218 160 133 237 212 203 203 102 83 176 59 34 218 160 133 ++238 198 189 237 212 203 240 219 206 222 184 158 44 12 10 2 2 2 ++2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 0 0 0 ++44 12 10 249 237 229 246 228 219 238 198 189 246 228 219 255 255 255 ++249 237 229 237 187 164 236 194 173 242 201 184 243 210 197 247 223 207 ++248 226 214 250 233 221 252 240 230 252 243 235 253 249 244 254 252 249 ++254 252 249 253 249 244 252 240 230 250 235 219 247 223 207 243 210 197 ++243 208 194 242 201 184 241 196 185 241 196 185 237 187 164 239 175 143 ++231 168 130 231 168 130 231 168 130 231 168 130 231 168 130 221 143 118 ++203 99 81 213 78 31 213 49 12 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 205 44 13 203 40 12 ++203 40 12 203 40 12 202 38 11 202 38 11 193 28 10 193 28 10 ++193 28 10 193 28 10 185 36 13 185 36 13 185 36 13 185 36 13 ++174 34 14 174 34 14 174 34 14 176 59 34 176 59 34 176 59 34 ++176 59 34 176 59 34 176 59 34 177 84 68 183 106 85 202 130 106 ++177 84 68 176 59 34 153 32 16 172 5 1 169 0 0 158 0 0 ++150 0 0 142 0 0 131 0 0 131 20 10 176 59 34 188 95 83 ++213 149 125 238 198 189 221 154 132 174 34 14 177 84 68 202 130 106 ++222 184 158 237 212 203 243 220 211 237 212 203 90 10 7 0 0 0 ++2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 0 0 0 ++202 130 106 253 253 252 241 205 194 238 198 189 251 245 237 254 254 253 ++242 201 184 233 177 153 236 194 173 242 201 184 243 208 194 247 223 207 ++249 231 218 251 238 227 252 240 230 252 242 234 252 244 235 253 248 237 ++252 244 235 251 238 227 250 235 219 247 223 207 243 208 194 242 201 184 ++242 201 184 241 190 156 237 187 164 236 173 149 239 175 143 231 168 130 ++231 168 130 231 168 130 221 143 118 214 127 110 213 78 31 213 49 12 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 195 25 6 195 25 6 195 25 6 193 28 10 ++193 28 10 191 24 6 191 24 6 180 23 7 182 27 9 182 27 9 ++182 27 9 174 34 14 174 34 14 174 34 14 174 34 14 174 34 14 ++174 34 14 176 59 34 176 59 34 176 59 34 176 59 34 177 84 68 ++183 106 85 183 106 85 177 84 68 153 32 16 147 19 9 150 0 0 ++143 0 0 131 0 0 124 2 0 153 32 16 177 84 68 210 136 114 ++237 187 164 221 154 132 196 46 20 177 84 68 177 84 68 183 106 85 ++218 160 133 222 184 158 240 219 206 240 219 206 202 130 106 2 2 2 ++2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 1 1 1 2 2 2 38 6 5 ++237 212 203 252 243 235 238 198 189 241 205 194 253 253 252 249 237 229 ++236 173 149 236 173 149 237 187 164 242 201 184 243 208 194 247 223 207 ++249 231 218 251 238 227 252 240 230 252 240 230 252 240 230 252 240 230 ++251 236 222 250 235 219 247 223 207 243 208 194 242 201 184 241 190 156 ++241 190 156 239 175 143 236 173 149 231 168 130 227 164 124 227 164 124 ++221 143 118 203 102 83 213 78 31 213 49 12 213 43 8 213 43 8 ++213 43 8 213 43 8 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++196 0 0 196 0 0 196 0 0 196 0 0 184 9 3 184 9 3 ++184 9 3 184 9 3 184 9 3 184 9 3 184 9 3 175 12 4 ++173 17 6 173 17 6 173 17 6 166 21 8 168 26 11 168 26 11 ++153 32 16 153 32 16 153 32 16 153 32 16 153 32 16 153 32 16 ++153 32 16 177 84 68 177 84 68 177 84 68 176 59 34 142 30 13 ++131 20 10 124 2 0 124 2 0 153 32 16 176 59 34 203 99 81 ++203 99 81 195 25 6 153 32 16 177 84 68 177 84 68 183 106 85 ++213 149 125 222 184 158 237 212 203 240 219 206 222 184 158 44 12 10 ++0 0 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 44 12 10 ++249 237 229 243 220 211 237 187 164 243 220 211 254 255 253 242 201 184 ++231 168 130 236 173 149 237 187 164 241 196 185 243 210 197 247 223 207 ++249 231 218 251 238 227 252 240 230 252 240 230 252 240 230 251 238 227 ++250 235 219 247 223 207 247 223 207 242 201 184 241 190 156 237 182 145 ++239 175 143 231 168 130 227 164 124 221 143 118 221 143 118 203 102 83 ++213 78 31 213 49 12 213 43 8 213 43 8 213 43 8 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 ++184 9 3 184 9 3 184 9 3 179 7 2 179 7 2 176 6 2 ++174 10 3 174 10 3 168 14 5 168 14 5 164 15 5 164 15 5 ++156 16 7 156 16 7 153 32 16 153 32 16 153 32 16 153 32 16 ++153 32 16 153 32 16 153 32 16 177 84 68 177 84 68 177 84 68 ++142 30 13 136 24 13 131 20 10 144 9 4 159 3 1 176 6 2 ++175 12 4 142 30 13 177 84 68 177 84 68 177 84 68 177 84 68 ++202 130 106 218 160 133 238 198 189 243 220 211 237 212 203 177 84 68 ++0 0 0 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 183 106 85 ++254 254 253 238 198 189 236 194 173 246 228 219 253 249 244 239 175 143 ++231 168 130 239 175 143 233 177 153 242 201 184 243 210 197 248 226 214 ++250 235 219 251 238 227 252 244 235 252 246 236 252 240 230 251 236 222 ++249 231 218 247 223 207 243 208 194 241 190 156 239 175 143 231 168 130 ++227 164 124 221 143 118 221 143 118 214 127 110 213 78 31 213 49 12 ++213 43 8 213 43 8 213 43 8 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 ++188 0 0 183 2 0 183 2 0 179 0 0 176 6 2 172 5 1 ++172 5 1 167 2 1 167 2 1 167 2 1 159 3 1 159 13 5 ++159 13 5 156 16 7 156 16 7 147 19 9 147 19 9 142 30 13 ++142 30 13 142 30 13 142 30 13 142 30 13 142 30 13 177 84 68 ++177 84 68 177 84 68 142 30 13 142 30 13 142 30 13 136 24 13 ++136 24 13 142 30 13 142 30 13 177 84 68 177 84 68 183 106 85 ++183 106 85 213 149 125 222 184 158 237 212 203 237 212 203 202 130 106 ++0 0 0 2 2 2 1 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 38 6 5 222 184 158 ++253 249 244 236 194 173 236 194 173 251 245 237 244 218 207 221 143 118 ++227 164 124 231 168 130 233 177 153 241 196 185 243 210 197 247 223 207 ++251 236 222 253 249 240 253 252 251 254 252 249 251 242 233 250 235 219 ++247 223 207 243 208 194 241 190 156 239 175 143 231 168 130 221 143 118 ++221 143 118 214 127 110 213 78 31 213 49 12 213 43 8 213 43 8 ++213 43 8 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 189 0 0 ++186 0 0 184 0 0 181 0 0 178 0 0 175 0 0 173 0 0 ++170 0 0 167 2 1 167 2 1 163 1 0 159 3 1 159 3 1 ++157 8 2 157 8 2 144 9 4 144 9 4 147 19 9 147 19 9 ++136 24 13 136 24 13 136 24 13 136 24 13 136 24 13 136 24 13 ++176 59 34 177 84 68 177 84 68 142 30 13 142 30 13 136 24 13 ++136 24 13 136 24 13 142 30 13 177 84 68 177 84 68 177 84 68 ++183 106 85 202 130 106 218 160 133 237 212 203 240 219 206 222 184 158 ++44 12 10 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 249 237 229 ++249 237 229 222 184 158 236 194 173 253 253 252 236 173 149 221 143 118 ++221 143 118 231 168 130 233 177 153 242 201 184 243 208 194 247 223 207 ++252 244 235 254 254 253 255 255 255 255 255 255 252 244 235 248 226 214 ++243 210 197 242 201 184 241 190 156 227 164 124 221 143 118 214 127 110 ++203 102 83 213 78 31 213 43 8 213 43 8 213 43 8 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 189 0 0 ++186 0 0 184 0 0 179 0 0 177 0 0 174 0 0 172 0 0 ++169 0 0 166 0 0 164 0 0 160 0 0 159 0 0 157 0 0 ++155 2 1 149 3 1 149 3 1 144 9 4 144 9 4 141 11 5 ++141 11 5 136 24 13 136 24 13 136 24 13 136 24 13 136 24 13 ++136 24 13 142 30 13 177 84 68 177 84 68 177 84 68 177 84 68 ++142 30 13 142 30 13 177 84 68 177 84 68 177 84 68 177 84 68 ++177 84 68 183 106 85 213 149 125 238 198 189 243 220 211 238 198 189 ++44 12 10 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 177 84 68 253 252 251 ++243 220 211 233 177 153 238 198 189 251 240 231 221 143 118 221 143 118 ++221 143 118 227 164 124 237 182 145 241 190 156 243 208 194 250 235 219 ++254 252 249 255 255 255 255 255 255 254 254 253 252 240 230 247 223 207 ++242 201 184 241 190 156 231 168 130 214 127 110 206 120 99 213 78 31 ++213 49 12 213 43 8 213 43 8 213 43 8 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 192 0 0 192 0 0 188 0 0 ++186 0 0 181 0 0 179 0 0 176 0 0 174 0 0 171 0 0 ++169 0 0 165 0 0 163 0 0 160 0 0 158 0 0 155 0 0 ++153 0 0 150 0 0 149 3 1 145 0 0 144 9 4 144 9 4 ++141 11 5 141 11 5 131 20 10 131 20 10 131 20 10 131 20 10 ++136 24 13 131 20 10 136 24 13 177 84 68 177 84 68 177 84 68 ++177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 ++177 84 68 177 84 68 213 149 125 222 184 158 240 219 206 237 212 203 ++183 106 85 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 202 130 106 255 255 255 ++238 198 189 233 177 153 237 212 203 241 196 185 206 120 99 214 127 110 ++221 143 118 227 164 124 234 180 140 241 190 156 243 208 194 251 238 227 ++254 254 253 255 255 255 255 255 255 254 253 250 249 231 218 243 208 194 ++241 190 156 234 180 140 227 164 124 203 99 81 213 78 31 213 43 8 ++213 43 8 213 43 8 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 192 0 0 189 0 0 186 0 0 ++184 0 0 181 0 0 179 0 0 176 0 0 173 0 0 170 0 0 ++167 0 0 165 0 0 162 0 0 160 0 0 157 0 0 153 0 0 ++152 0 0 150 0 0 147 0 0 145 0 0 142 1 0 140 1 0 ++140 1 0 141 11 5 141 11 5 131 20 10 131 20 10 131 20 10 ++131 20 10 131 20 10 131 20 10 131 20 10 136 24 13 177 84 68 ++177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 ++177 84 68 176 59 34 202 130 106 218 160 133 243 220 211 243 220 211 ++202 130 106 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 2 2 2 222 184 158 255 255 255 ++236 194 173 218 160 133 243 220 211 221 154 132 203 99 81 214 127 110 ++221 143 118 227 164 124 234 180 140 241 190 156 243 208 194 251 238 227 ++255 255 255 255 255 255 255 255 255 252 242 234 243 210 197 241 190 156 ++237 182 145 227 164 124 203 102 83 213 49 12 213 43 8 213 43 8 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 192 0 0 189 0 0 186 0 0 ++184 0 0 179 0 0 178 0 0 175 0 0 172 0 0 169 0 0 ++166 0 0 164 0 0 160 0 0 159 0 0 157 0 0 153 0 0 ++150 0 0 147 0 0 145 0 0 143 0 0 141 0 0 140 1 0 ++131 0 0 131 0 0 131 0 0 124 2 0 124 2 0 131 20 10 ++131 20 10 131 20 10 131 20 10 111 7 4 90 10 7 136 24 13 ++177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 177 84 68 ++177 84 68 176 59 34 198 112 92 218 160 133 237 212 203 246 228 219 ++222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 44 12 10 237 212 203 253 253 252 ++222 184 158 218 160 133 237 212 203 206 120 99 203 99 81 206 120 99 ++221 143 118 227 164 124 234 180 140 241 190 156 242 201 184 249 231 218 ++253 251 245 253 253 252 251 245 237 247 223 207 242 201 184 237 182 145 ++227 164 124 203 102 83 213 78 31 213 43 8 213 43 8 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 192 0 0 189 0 0 186 0 0 186 0 0 ++181 0 0 179 0 0 176 0 0 174 0 0 171 0 0 169 0 0 ++166 0 0 163 0 0 160 0 0 158 0 0 157 0 0 153 0 0 ++150 0 0 147 0 0 145 0 0 142 0 0 140 1 0 140 1 0 ++131 0 0 131 0 0 131 0 0 124 2 0 124 2 0 124 2 0 ++111 7 4 111 7 4 111 7 4 111 7 4 90 10 7 90 10 7 ++90 10 7 142 30 13 142 30 13 142 30 13 142 30 13 142 30 13 ++176 59 34 153 32 16 183 106 85 213 149 125 238 198 189 249 237 229 ++238 198 189 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 44 12 10 246 228 219 251 245 237 ++222 184 158 218 160 133 241 205 194 213 78 31 203 99 81 206 120 99 ++206 120 99 227 164 124 231 168 130 241 190 156 242 201 184 243 210 197 ++249 231 218 249 231 218 243 210 197 242 201 184 241 190 156 227 164 124 ++206 120 99 213 78 31 213 78 31 213 43 8 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 192 0 0 189 0 0 186 0 0 184 0 0 ++181 0 0 178 0 0 175 0 0 173 0 0 170 0 0 167 0 0 ++165 0 0 162 0 0 159 0 0 158 0 0 155 0 0 152 0 0 ++150 0 0 146 0 0 145 0 0 142 0 0 140 1 0 140 1 0 ++131 0 0 131 0 0 131 0 0 124 2 0 124 2 0 124 2 0 ++111 7 4 111 7 4 111 7 4 111 7 4 90 10 7 90 10 7 ++90 10 7 90 10 7 136 24 13 142 30 13 142 30 13 142 30 13 ++142 30 13 142 30 13 192 80 59 213 149 125 236 194 173 251 245 237 ++237 212 203 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 177 84 68 253 249 244 249 237 229 ++218 160 133 218 160 133 236 194 173 204 51 17 213 78 31 203 102 83 ++206 120 99 227 164 124 231 168 130 237 182 145 241 190 156 242 201 184 ++242 201 184 242 201 184 241 190 156 237 182 145 227 164 124 206 120 99 ++213 78 31 213 78 31 213 78 31 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 192 0 0 189 0 0 186 0 0 184 0 0 181 0 0 ++179 0 0 177 0 0 174 0 0 171 0 0 169 0 0 166 0 0 ++164 0 0 160 0 0 159 0 0 157 0 0 153 0 0 150 0 0 ++147 0 0 146 0 0 143 0 0 141 0 0 140 1 0 131 0 0 ++131 0 0 131 0 0 131 0 0 124 2 0 124 2 0 117 1 0 ++117 1 0 111 7 4 111 7 4 111 7 4 97 5 3 90 10 7 ++90 10 7 90 10 7 90 10 7 136 24 13 136 24 13 142 30 13 ++136 24 13 131 20 10 184 62 32 213 149 125 222 184 158 253 249 244 ++237 212 203 177 84 68 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 183 106 85 255 255 255 246 228 219 ++218 160 133 218 160 133 221 154 132 205 44 13 213 78 31 213 78 31 ++203 102 83 221 143 118 227 164 124 231 168 130 237 182 145 241 190 156 ++241 190 156 241 190 156 239 175 143 227 164 124 206 120 99 213 78 31 ++213 78 31 213 78 31 213 78 31 210 31 6 210 31 6 210 31 6 ++210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++192 0 0 192 0 0 188 0 0 186 0 0 184 0 0 181 0 0 ++178 0 0 176 0 0 173 0 0 170 0 0 169 0 0 165 0 0 ++163 0 0 160 0 0 157 0 0 155 0 0 153 0 0 150 0 0 ++147 0 0 145 0 0 142 0 0 140 1 0 140 1 0 131 0 0 ++131 0 0 131 0 0 124 2 0 124 2 0 124 2 0 117 1 0 ++117 1 0 111 7 4 111 7 4 111 7 4 111 7 4 97 5 3 ++90 10 7 90 10 7 90 10 7 90 10 7 111 7 4 131 20 10 ++111 7 4 124 2 0 176 59 34 202 130 106 222 184 158 253 249 244 ++237 212 203 183 106 85 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 1 1 1 183 106 85 255 255 255 237 212 203 ++213 149 125 222 184 158 206 120 99 206 42 10 213 78 31 213 78 31 ++213 78 31 206 120 99 221 143 118 227 164 124 231 168 130 239 175 143 ++239 175 143 227 164 124 221 143 118 203 102 83 213 78 31 213 78 31 ++213 78 31 213 49 12 213 49 12 210 31 6 210 31 6 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++192 0 0 189 0 0 186 0 0 184 0 0 181 0 0 179 0 0 ++177 0 0 175 0 0 172 0 0 170 0 0 167 0 0 164 0 0 ++162 0 0 159 0 0 157 0 0 155 0 0 150 0 0 150 0 0 ++147 0 0 145 0 0 141 0 0 140 1 0 140 1 0 131 0 0 ++131 0 0 131 0 0 124 2 0 124 2 0 124 2 0 117 1 0 ++117 1 0 111 7 4 117 1 0 140 1 0 124 2 0 97 5 3 ++97 5 3 97 5 3 97 5 3 97 5 3 97 5 3 111 7 4 ++111 7 4 124 2 0 176 59 34 202 130 106 238 198 189 253 251 245 ++237 212 203 202 130 106 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 202 130 106 255 255 255 237 212 203 ++213 149 125 218 160 133 192 80 59 213 43 8 213 49 12 213 78 31 ++213 78 31 203 99 81 206 120 99 221 143 118 221 143 118 221 143 118 ++221 143 118 206 120 99 203 102 83 213 78 31 213 78 31 213 49 12 ++213 49 12 213 49 12 213 49 12 210 31 6 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 192 0 0 ++189 0 0 186 0 0 186 0 0 181 0 0 179 0 0 178 0 0 ++175 0 0 173 0 0 170 0 0 169 0 0 165 0 0 163 0 0 ++160 0 0 158 0 0 157 0 0 153 0 0 150 0 0 147 0 0 ++145 0 0 143 0 0 141 0 0 140 1 0 140 1 0 131 0 0 ++131 0 0 131 0 0 124 2 0 124 2 0 117 1 0 117 1 0 ++131 0 0 145 0 0 163 1 0 149 3 1 111 7 4 97 5 3 ++97 5 3 111 7 4 97 5 3 111 7 4 111 7 4 111 7 4 ++111 7 4 124 2 0 174 34 14 202 130 106 242 201 184 253 251 245 ++243 220 211 218 160 133 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 218 160 133 255 255 255 237 212 203 ++213 149 125 218 160 133 196 57 25 213 43 8 213 49 12 213 49 12 ++213 78 31 213 78 31 213 78 31 203 99 81 203 99 81 203 99 81 ++213 78 31 213 78 31 213 78 31 213 78 31 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 210 31 6 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 192 0 0 192 0 0 189 0 0 ++186 0 0 186 0 0 184 0 0 181 0 0 179 0 0 176 0 0 ++174 0 0 172 0 0 169 0 0 167 0 0 164 0 0 162 0 0 ++159 0 0 157 0 0 153 0 0 152 0 0 150 0 0 147 0 0 ++145 0 0 142 0 0 140 1 0 140 1 0 131 0 0 131 0 0 ++131 0 0 124 2 0 124 2 0 124 2 0 140 1 0 157 0 0 ++167 0 0 171 0 0 163 1 0 117 1 0 97 5 3 97 5 3 ++111 7 4 111 7 4 111 7 4 111 7 4 111 7 4 111 7 4 ++117 1 0 131 0 0 174 34 14 202 130 106 243 208 194 253 249 244 ++246 228 219 218 160 133 1 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 218 160 133 255 255 255 237 212 203 ++213 149 125 202 130 106 196 46 20 213 43 8 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 78 31 213 78 31 213 78 31 ++213 78 31 213 78 31 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 43 8 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 192 0 0 192 0 0 189 0 0 186 0 0 ++186 0 0 184 0 0 181 0 0 179 0 0 176 0 0 174 0 0 ++172 0 0 170 0 0 167 0 0 165 0 0 162 0 0 160 0 0 ++158 0 0 155 0 0 153 0 0 150 0 0 147 0 0 146 0 0 ++143 0 0 141 0 0 140 1 0 140 1 0 131 0 0 131 0 0 ++124 2 0 131 0 0 146 0 0 164 0 0 174 0 0 173 0 0 ++171 0 0 167 0 0 131 0 0 97 5 3 97 5 3 111 7 4 ++111 7 4 111 7 4 111 7 4 111 7 4 117 1 0 117 1 0 ++117 1 0 131 0 0 173 17 6 202 130 106 247 223 207 253 248 237 ++246 228 219 222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 222 184 158 255 255 255 237 212 203 ++210 136 114 202 130 106 196 46 20 210 31 6 213 43 8 213 43 8 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 43 8 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++192 0 0 192 0 0 189 0 0 189 0 0 186 0 0 186 0 0 ++184 0 0 181 0 0 179 0 0 177 0 0 175 0 0 173 0 0 ++170 0 0 169 0 0 166 0 0 164 0 0 160 0 0 159 0 0 ++157 0 0 153 0 0 152 0 0 150 0 0 147 0 0 145 0 0 ++142 0 0 141 0 0 140 1 0 131 0 0 131 0 0 131 0 0 ++153 0 0 170 0 0 178 0 0 176 0 0 173 0 0 171 0 0 ++171 0 0 150 0 0 111 7 4 97 5 3 97 5 3 111 7 4 ++117 1 0 117 1 0 117 1 0 117 1 0 117 1 0 117 1 0 ++124 2 0 131 0 0 173 17 6 221 143 118 250 235 219 252 244 235 ++246 228 219 222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 222 184 158 255 255 255 237 212 203 ++210 136 114 198 112 92 185 36 13 210 31 6 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 213 43 8 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 43 8 210 31 6 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 192 0 0 192 0 0 ++192 0 0 189 0 0 188 0 0 186 0 0 184 0 0 184 0 0 ++181 0 0 179 0 0 177 0 0 175 0 0 172 0 0 171 0 0 ++169 0 0 166 0 0 164 0 0 160 0 0 159 0 0 157 0 0 ++155 0 0 152 0 0 150 0 0 147 0 0 145 0 0 143 0 0 ++141 0 0 140 1 0 131 0 0 141 0 0 158 0 0 177 0 0 ++179 0 0 179 0 0 176 0 0 174 0 0 172 0 0 171 0 0 ++165 0 0 117 1 0 111 7 4 97 5 3 111 7 4 117 1 0 ++117 1 0 117 1 0 117 1 0 117 1 0 124 2 0 124 2 0 ++124 2 0 140 1 0 180 20 5 227 164 124 250 235 219 252 240 230 ++246 228 219 222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 222 184 158 255 255 255 237 212 203 ++210 136 114 188 95 83 187 29 9 201 33 6 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 49 12 213 49 12 213 49 12 213 49 12 210 31 6 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 189 0 0 189 0 0 ++188 0 0 186 0 0 186 0 0 184 0 0 181 0 0 181 0 0 ++179 0 0 177 0 0 175 0 0 173 0 0 171 0 0 169 0 0 ++167 0 0 165 0 0 163 0 0 160 0 0 158 0 0 157 0 0 ++153 0 0 150 0 0 150 0 0 147 0 0 145 0 0 141 0 0 ++140 1 0 145 0 0 164 0 0 178 0 0 184 0 0 179 0 0 ++179 0 0 176 0 0 175 0 0 173 0 0 171 0 0 172 0 0 ++140 1 0 111 7 4 111 7 4 111 7 4 117 1 0 117 1 0 ++117 1 0 117 1 0 124 2 0 124 2 0 124 2 0 131 0 0 ++131 0 0 147 0 0 185 36 13 241 190 156 250 235 219 252 240 230 ++249 237 229 218 160 133 44 12 10 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 218 160 133 255 255 255 243 220 211 ++210 136 114 188 95 83 182 27 9 195 25 6 210 31 6 210 31 6 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 49 12 213 49 12 210 31 6 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 186 0 0 186 0 0 ++186 0 0 184 0 0 184 0 0 181 0 0 179 0 0 178 0 0 ++176 0 0 175 0 0 172 0 0 171 0 0 169 0 0 167 0 0 ++164 0 0 162 0 0 160 0 0 158 0 0 157 0 0 153 0 0 ++150 0 0 150 0 0 147 0 0 145 0 0 142 0 0 150 0 0 ++166 0 0 184 0 0 186 0 0 184 0 0 181 0 0 179 0 0 ++178 0 0 175 0 0 174 0 0 172 0 0 172 0 0 159 0 0 ++117 1 0 111 7 4 111 7 4 117 1 0 117 1 0 117 1 0 ++117 1 0 124 2 0 124 2 0 131 0 0 131 0 0 131 0 0 ++140 1 0 157 0 0 196 46 20 242 201 184 250 235 219 252 240 230 ++246 228 219 218 160 133 44 12 10 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 213 149 125 255 255 255 246 228 219 ++210 136 114 188 95 83 180 23 7 195 25 6 210 31 6 210 31 6 ++210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 49 12 213 43 8 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 184 0 0 184 0 0 ++184 0 0 181 0 0 179 0 0 179 0 0 177 0 0 176 0 0 ++174 0 0 173 0 0 170 0 0 169 0 0 167 0 0 165 0 0 ++163 0 0 160 0 0 158 0 0 157 0 0 155 0 0 152 0 0 ++150 0 0 147 0 0 145 0 0 147 0 0 167 0 0 184 0 0 ++188 0 0 186 0 0 184 0 0 181 0 0 179 0 0 178 0 0 ++177 0 0 174 0 0 173 0 0 172 0 0 170 0 0 131 0 0 ++111 7 4 111 7 4 111 7 4 117 1 0 117 1 0 117 1 0 ++124 2 0 124 2 0 131 0 0 131 0 0 140 1 0 140 1 0 ++142 0 0 167 0 0 204 76 38 243 208 194 247 223 207 251 238 227 ++246 228 219 218 160 133 44 12 10 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 213 149 125 255 255 255 251 245 237 ++210 136 114 188 95 83 172 22 7 191 24 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 210 31 6 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 181 0 0 181 0 0 ++179 0 0 179 0 0 177 0 0 176 0 0 174 0 0 173 0 0 ++172 0 0 170 0 0 169 0 0 167 0 0 165 0 0 163 0 0 ++160 0 0 159 0 0 157 0 0 153 0 0 152 0 0 150 0 0 ++147 0 0 150 0 0 164 0 0 184 0 0 189 0 0 186 0 0 ++186 0 0 184 0 0 181 0 0 179 0 0 179 0 0 177 0 0 ++176 0 0 174 0 0 172 0 0 172 0 0 160 0 0 117 1 0 ++111 7 4 111 7 4 111 7 4 117 1 0 117 1 0 124 2 0 ++124 2 0 131 0 0 131 0 0 140 1 0 141 0 0 145 0 0 ++147 0 0 183 2 0 221 143 118 247 223 207 247 223 207 252 240 230 ++246 228 219 213 149 125 2 2 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 202 130 106 254 254 253 253 253 252 ++210 136 114 188 95 83 166 21 8 191 24 6 195 25 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 213 43 8 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 179 0 0 179 0 0 ++177 0 0 176 0 0 175 0 0 174 0 0 172 0 0 171 0 0 ++169 0 0 169 0 0 166 0 0 164 0 0 162 0 0 160 0 0 ++158 0 0 157 0 0 155 0 0 153 0 0 150 0 0 147 0 0 ++160 0 0 181 0 0 192 0 0 189 0 0 188 0 0 186 0 0 ++184 0 0 181 0 0 181 0 0 179 0 0 178 0 0 176 0 0 ++175 0 0 173 0 0 171 0 0 171 0 0 140 1 0 111 7 4 ++111 7 4 111 7 4 117 1 0 117 1 0 117 1 0 124 2 0 ++124 2 0 131 0 0 140 1 0 141 0 0 145 0 0 147 0 0 ++153 0 0 193 28 10 237 182 145 247 223 207 247 223 207 252 240 230 ++243 220 211 213 149 125 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 183 106 85 253 253 252 255 255 255 ++213 149 125 188 95 83 166 21 8 180 20 5 191 24 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 192 0 0 177 0 0 177 0 0 ++175 0 0 174 0 0 173 0 0 172 0 0 170 0 0 169 0 0 ++167 0 0 166 0 0 164 0 0 162 0 0 160 0 0 159 0 0 ++157 0 0 155 0 0 153 0 0 150 0 0 153 0 0 172 0 0 ++189 0 0 192 0 0 189 0 0 188 0 0 186 0 0 184 0 0 ++184 0 0 181 0 0 179 0 0 178 0 0 177 0 0 175 0 0 ++174 0 0 172 0 0 172 0 0 163 0 0 117 1 0 111 7 4 ++111 7 4 111 7 4 117 1 0 117 1 0 124 2 0 124 2 0 ++131 0 0 131 0 0 140 1 0 143 0 0 147 0 0 150 0 0 ++167 0 0 213 78 31 241 190 156 247 223 207 247 223 207 252 240 230 ++237 212 203 202 130 106 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 177 84 68 253 253 252 255 255 255 ++222 184 158 188 95 83 156 18 6 175 12 4 180 20 5 195 25 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 189 0 0 174 0 0 174 0 0 ++173 0 0 172 0 0 171 0 0 170 0 0 169 0 0 167 0 0 ++165 0 0 164 0 0 162 0 0 160 0 0 158 0 0 157 0 0 ++155 0 0 153 0 0 150 0 0 157 0 0 184 0 0 196 0 0 ++189 0 0 189 0 0 186 0 0 186 0 0 186 0 0 184 0 0 ++181 0 0 179 0 0 179 0 0 178 0 0 176 0 0 174 0 0 ++173 0 0 171 0 0 171 0 0 147 0 0 111 7 4 111 7 4 ++111 7 4 117 1 0 117 1 0 117 1 0 124 2 0 131 0 0 ++131 0 0 140 1 0 141 0 0 145 0 0 150 0 0 153 0 0 ++184 9 3 227 164 124 241 190 156 247 223 207 247 223 207 252 240 230 ++237 212 203 183 106 85 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 44 12 10 249 237 229 255 255 255 ++238 198 189 188 95 83 156 16 7 168 14 5 180 20 5 191 24 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 186 0 0 171 0 0 171 0 0 ++170 0 0 169 0 0 169 0 0 167 0 0 165 0 0 164 0 0 ++162 0 0 160 0 0 159 0 0 158 0 0 157 0 0 153 0 0 ++152 0 0 150 0 0 165 0 0 189 0 0 192 0 0 192 0 0 ++189 0 0 188 0 0 186 0 0 186 0 0 184 0 0 184 0 0 ++181 0 0 179 0 0 178 0 0 177 0 0 175 0 0 173 0 0 ++172 0 0 171 0 0 169 0 0 131 0 0 111 7 4 111 7 4 ++111 7 4 117 1 0 117 1 0 124 2 0 124 2 0 131 0 0 ++131 0 0 141 0 0 143 0 0 147 0 0 150 0 0 159 0 0 ++213 78 31 234 180 140 242 201 184 247 223 207 247 223 207 252 240 230 ++237 212 203 177 84 68 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 44 12 10 237 212 203 255 255 255 ++246 228 219 183 106 85 153 32 16 157 8 2 180 20 5 180 20 5 ++195 25 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 186 0 0 169 0 0 169 0 0 ++167 0 0 166 0 0 165 0 0 164 0 0 163 0 0 162 0 0 ++160 0 0 159 0 0 157 0 0 157 0 0 153 0 0 150 0 0 ++150 0 0 171 0 0 192 0 0 192 0 0 189 0 0 189 0 0 ++188 0 0 186 0 0 186 0 0 184 0 0 184 0 0 181 0 0 ++179 0 0 178 0 0 177 0 0 175 0 0 174 0 0 172 0 0 ++171 0 0 170 0 0 164 0 0 117 1 0 111 7 4 111 7 4 ++117 1 0 117 1 0 117 1 0 124 2 0 131 0 0 131 0 0 ++140 1 0 142 0 0 146 0 0 150 0 0 153 0 0 182 27 9 ++231 168 130 241 190 156 243 208 194 247 223 207 248 226 214 250 239 228 ++238 198 189 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 44 12 10 222 184 158 255 255 255 ++251 242 233 202 130 106 153 32 16 149 3 1 175 12 4 180 20 5 ++180 20 5 195 25 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 184 0 0 165 0 0 166 0 0 ++165 0 0 164 0 0 163 0 0 162 0 0 160 0 0 159 0 0 ++158 0 0 157 0 0 155 0 0 153 0 0 150 0 0 150 0 0 ++174 0 0 192 0 0 192 0 0 192 0 0 189 0 0 188 0 0 ++186 0 0 186 0 0 184 0 0 184 0 0 181 0 0 179 0 0 ++179 0 0 177 0 0 176 0 0 174 0 0 173 0 0 171 0 0 ++170 0 0 169 0 0 150 0 0 111 7 4 97 5 3 111 7 4 ++117 1 0 117 1 0 124 2 0 124 2 0 131 0 0 131 0 0 ++140 1 0 145 0 0 147 0 0 152 0 0 159 0 0 203 102 83 ++241 190 156 241 190 156 247 223 207 247 223 207 250 235 219 246 228 219 ++222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 2 2 2 213 149 125 255 255 255 ++253 252 250 213 149 125 176 59 34 142 1 0 168 14 5 180 20 5 ++180 20 5 180 20 5 195 25 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 179 0 0 162 0 0 163 0 0 ++162 0 0 160 0 0 160 0 0 159 0 0 158 0 0 157 0 0 ++155 0 0 153 0 0 152 0 0 150 0 0 150 0 0 175 0 0 ++192 0 0 192 0 0 189 0 0 189 0 0 188 0 0 186 0 0 ++186 0 0 184 0 0 181 0 0 181 0 0 179 0 0 179 0 0 ++178 0 0 176 0 0 175 0 0 173 0 0 172 0 0 170 0 0 ++169 0 0 170 0 0 131 0 0 97 5 3 111 7 4 117 1 0 ++117 1 0 117 1 0 124 2 0 131 0 0 131 0 0 140 1 0 ++142 0 0 147 0 0 150 0 0 153 0 0 193 53 28 234 180 140 ++241 190 156 241 190 156 247 223 207 247 223 207 250 235 219 246 228 219 ++213 149 125 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 183 106 85 253 249 244 ++255 255 255 222 184 158 177 84 68 140 1 0 157 8 2 175 12 4 ++180 20 5 180 20 5 180 20 5 195 25 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 210 31 6 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 178 0 0 160 0 0 160 0 0 ++159 0 0 158 0 0 157 0 0 157 0 0 155 0 0 153 0 0 ++153 0 0 152 0 0 150 0 0 150 0 0 177 0 0 196 0 0 ++192 0 0 189 0 0 189 0 0 188 0 0 186 0 0 186 0 0 ++184 0 0 184 0 0 181 0 0 179 0 0 179 0 0 178 0 0 ++177 0 0 175 0 0 174 0 0 172 0 0 171 0 0 169 0 0 ++169 0 0 166 0 0 124 2 0 97 5 3 117 1 0 117 1 0 ++117 1 0 124 2 0 124 2 0 131 0 0 131 0 0 141 0 0 ++145 0 0 150 0 0 150 0 0 173 17 6 227 164 124 241 190 156 ++241 190 156 242 201 184 247 223 207 247 223 207 251 236 222 240 219 206 ++183 106 85 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 90 10 7 246 228 219 ++255 255 255 246 228 219 177 84 68 141 11 5 142 1 0 175 12 4 ++175 12 4 180 20 5 180 20 5 180 20 5 191 24 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 176 0 0 157 0 0 157 0 0 ++157 0 0 157 0 0 155 0 0 153 0 0 152 0 0 150 0 0 ++150 0 0 150 0 0 147 0 0 173 0 0 192 0 0 192 0 0 ++189 0 0 188 0 0 186 0 0 186 0 0 186 0 0 184 0 0 ++181 0 0 181 0 0 179 0 0 179 0 0 178 0 0 176 0 0 ++175 0 0 173 0 0 172 0 0 170 0 0 169 0 0 169 0 0 ++167 0 0 159 0 0 117 1 0 111 7 4 117 1 0 117 1 0 ++124 2 0 124 2 0 131 0 0 131 0 0 140 1 0 143 0 0 ++147 0 0 150 0 0 163 1 0 206 120 99 241 190 156 241 190 156 ++241 190 156 247 223 207 247 223 207 250 235 219 250 239 228 237 212 203 ++177 84 68 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 237 212 203 ++255 255 255 254 254 253 202 130 106 136 24 13 140 1 0 157 8 2 ++175 12 4 175 12 4 180 20 5 180 20 5 180 20 5 195 25 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 173 0 0 153 0 0 155 0 0 ++153 0 0 153 0 0 152 0 0 150 0 0 150 0 0 150 0 0 ++147 0 0 146 0 0 169 0 0 192 0 0 189 0 0 189 0 0 ++188 0 0 186 0 0 186 0 0 186 0 0 184 0 0 184 0 0 ++181 0 0 179 0 0 179 0 0 178 0 0 177 0 0 175 0 0 ++174 0 0 172 0 0 171 0 0 169 0 0 169 0 0 167 0 0 ++167 0 0 150 0 0 117 1 0 117 1 0 117 1 0 117 1 0 ++124 2 0 131 0 0 131 0 0 140 1 0 141 0 0 145 0 0 ++147 0 0 160 0 0 204 76 38 241 190 156 241 190 156 241 190 156 ++241 190 156 247 223 207 250 235 219 250 235 219 250 239 228 222 184 158 ++44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 213 149 125 ++253 253 252 255 255 255 222 184 158 142 30 13 131 0 0 149 3 1 ++174 10 3 175 12 4 175 12 4 180 20 5 180 20 5 191 24 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 210 31 6 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 170 0 0 150 0 0 152 0 0 ++150 0 0 150 0 0 150 0 0 147 0 0 147 0 0 146 0 0 ++145 0 0 164 0 0 192 0 0 189 0 0 188 0 0 186 0 0 ++186 0 0 186 0 0 184 0 0 184 0 0 181 0 0 181 0 0 ++179 0 0 178 0 0 178 0 0 176 0 0 175 0 0 173 0 0 ++172 0 0 171 0 0 170 0 0 169 0 0 167 0 0 165 0 0 ++167 0 0 146 0 0 117 1 0 117 1 0 117 1 0 124 2 0 ++131 0 0 131 0 0 140 1 0 141 0 0 145 0 0 147 0 0 ++160 0 0 209 61 24 234 180 140 241 190 156 241 190 156 241 190 156 ++247 223 207 250 235 219 250 235 219 250 235 219 246 228 219 213 149 125 ++38 6 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 177 84 68 ++251 245 237 255 255 255 246 228 219 176 59 34 131 0 0 140 1 0 ++168 14 5 174 10 3 175 12 4 175 12 4 180 20 5 195 25 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 169 0 0 147 0 0 150 0 0 ++150 0 0 147 0 0 147 0 0 146 0 0 145 0 0 142 0 0 ++153 0 0 186 0 0 189 0 0 188 0 0 186 0 0 186 0 0 ++186 0 0 184 0 0 184 0 0 181 0 0 181 0 0 179 0 0 ++179 0 0 178 0 0 176 0 0 175 0 0 174 0 0 172 0 0 ++171 0 0 170 0 0 169 0 0 167 0 0 166 0 0 164 0 0 ++167 0 0 145 0 0 117 1 0 117 1 0 124 2 0 124 2 0 ++131 0 0 131 0 0 140 1 0 142 0 0 145 0 0 167 0 0 ++203 40 12 227 164 124 234 180 140 241 190 156 241 190 156 241 190 156 ++247 223 207 250 235 219 250 235 219 250 239 228 237 212 203 183 106 85 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 ++237 212 203 255 255 255 253 252 251 202 130 106 124 2 0 124 2 0 ++149 3 1 168 14 5 174 10 3 175 12 4 175 12 4 191 24 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 210 31 6 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 173 0 0 146 0 0 146 0 0 ++146 0 0 145 0 0 145 0 0 143 0 0 142 0 0 143 0 0 ++177 0 0 189 0 0 186 0 0 186 0 0 186 0 0 184 0 0 ++184 0 0 181 0 0 181 0 0 179 0 0 179 0 0 178 0 0 ++177 0 0 176 0 0 175 0 0 173 0 0 172 0 0 171 0 0 ++170 0 0 169 0 0 167 0 0 166 0 0 165 0 0 165 0 0 ++169 0 0 141 0 0 117 1 0 124 2 0 124 2 0 131 0 0 ++131 0 0 140 1 0 141 0 0 146 0 0 173 0 0 210 31 6 ++206 120 99 227 164 124 227 164 124 234 180 140 234 180 140 242 201 184 ++250 235 219 250 235 219 250 235 219 250 239 228 222 184 158 44 12 10 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 ++213 149 125 253 253 252 255 255 255 238 198 189 136 24 13 124 2 0 ++131 0 0 157 8 2 168 14 5 168 14 5 175 12 4 191 24 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 210 31 6 196 0 0 192 0 0 192 0 0 ++192 0 0 192 0 0 196 0 0 172 0 0 145 0 0 145 0 0 ++143 0 0 142 0 0 142 0 0 141 0 0 140 1 0 159 0 0 ++188 0 0 186 0 0 186 0 0 186 0 0 184 0 0 184 0 0 ++181 0 0 181 0 0 179 0 0 179 0 0 178 0 0 177 0 0 ++175 0 0 174 0 0 174 0 0 172 0 0 170 0 0 170 0 0 ++169 0 0 167 0 0 166 0 0 165 0 0 164 0 0 166 0 0 ++170 0 0 143 0 0 117 1 0 124 2 0 131 0 0 131 0 0 ++140 1 0 141 0 0 143 0 0 165 0 0 195 25 6 213 78 31 ++206 120 99 221 143 118 227 164 124 227 164 124 234 180 140 247 223 207 ++250 235 219 250 235 219 251 236 222 246 228 219 213 149 125 44 12 10 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++177 84 68 246 228 219 255 255 255 253 252 250 177 84 68 124 2 0 ++124 2 0 149 3 1 168 14 5 168 14 5 168 14 5 184 9 3 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 210 31 6 192 0 0 189 0 0 ++192 0 0 192 0 0 192 0 0 176 0 0 142 0 0 142 0 0 ++141 0 0 141 0 0 141 0 0 140 1 0 142 0 0 178 0 0 ++186 0 0 186 0 0 184 0 0 184 0 0 181 0 0 181 0 0 ++181 0 0 179 0 0 179 0 0 178 0 0 177 0 0 176 0 0 ++174 0 0 173 0 0 172 0 0 171 0 0 169 0 0 169 0 0 ++169 0 0 166 0 0 165 0 0 165 0 0 166 0 0 169 0 0 ++171 0 0 142 0 0 124 2 0 131 0 0 131 0 0 131 0 0 ++140 1 0 143 0 0 146 0 0 184 9 3 213 78 31 213 78 31 ++203 102 83 206 120 99 221 143 118 227 164 124 241 190 156 247 223 207 ++250 235 219 250 235 219 252 240 230 237 212 203 183 106 85 2 2 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++44 12 10 222 184 158 254 254 253 255 255 255 222 184 158 124 2 0 ++124 2 0 131 0 0 157 8 2 168 14 5 168 14 5 184 9 3 ++196 0 0 195 25 6 195 25 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 210 31 6 196 0 0 ++188 0 0 189 0 0 189 0 0 179 0 0 140 1 0 140 1 0 ++140 1 0 140 1 0 140 1 0 131 0 0 155 0 0 186 0 0 ++184 0 0 184 0 0 181 0 0 181 0 0 179 0 0 179 0 0 ++179 0 0 178 0 0 177 0 0 176 0 0 175 0 0 174 0 0 ++172 0 0 171 0 0 171 0 0 169 0 0 169 0 0 167 0 0 ++166 0 0 165 0 0 164 0 0 166 0 0 169 0 0 172 0 0 ++173 0 0 141 0 0 124 2 0 131 0 0 131 0 0 140 1 0 ++142 0 0 146 0 0 166 21 8 209 61 24 213 78 31 213 78 31 ++213 78 31 203 102 83 206 120 99 227 164 124 242 201 184 247 223 207 ++247 223 207 250 235 219 249 237 229 222 184 158 44 12 10 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++2 2 2 183 106 85 251 245 237 255 255 255 251 245 237 177 84 68 ++117 1 0 117 1 0 142 1 0 157 8 2 164 15 5 184 9 3 ++196 0 0 195 25 6 195 25 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++195 25 6 186 0 0 186 0 0 181 0 0 140 1 0 140 1 0 ++140 1 0 131 0 0 131 0 0 131 0 0 171 0 0 184 0 0 ++181 0 0 181 0 0 181 0 0 179 0 0 179 0 0 178 0 0 ++178 0 0 177 0 0 176 0 0 175 0 0 173 0 0 173 0 0 ++171 0 0 170 0 0 169 0 0 169 0 0 167 0 0 166 0 0 ++165 0 0 164 0 0 166 0 0 169 0 0 171 0 0 174 0 0 ++175 0 0 145 0 0 131 0 0 131 0 0 140 1 0 141 0 0 ++149 3 1 174 34 14 196 57 25 209 61 24 209 61 24 209 61 24 ++213 78 31 213 78 31 203 99 81 227 164 124 243 210 197 243 210 197 ++247 223 207 250 235 219 237 212 203 183 106 85 2 2 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 44 12 10 238 198 189 255 255 255 255 255 255 222 184 158 ++111 7 4 117 1 0 124 2 0 153 2 0 157 8 2 179 7 2 ++196 0 0 196 0 0 196 0 0 195 25 6 195 25 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 210 31 6 189 0 0 179 0 0 141 0 0 131 0 0 ++131 0 0 131 0 0 131 0 0 142 0 0 181 0 0 181 0 0 ++179 0 0 179 0 0 179 0 0 178 0 0 177 0 0 176 0 0 ++175 0 0 174 0 0 174 0 0 173 0 0 172 0 0 171 0 0 ++169 0 0 169 0 0 169 0 0 167 0 0 166 0 0 164 0 0 ++164 0 0 166 0 0 169 0 0 171 0 0 174 0 0 177 0 0 ++178 0 0 147 0 0 131 0 0 140 1 0 141 0 0 159 13 5 ++189 46 14 196 60 25 196 60 25 196 57 25 209 61 24 209 61 24 ++209 61 24 213 78 31 203 99 81 237 187 164 243 208 194 243 208 194 ++247 223 207 246 228 219 222 184 158 44 12 10 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 2 2 2 183 106 85 253 249 244 255 255 255 253 252 250 ++177 84 68 117 1 0 117 1 0 131 0 0 157 8 2 172 5 1 ++196 0 0 196 0 0 196 0 0 195 25 6 195 25 6 195 25 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 195 25 6 146 0 0 131 0 0 ++131 0 0 131 0 0 124 2 0 155 0 0 181 0 0 179 0 0 ++179 0 0 178 0 0 178 0 0 177 0 0 176 0 0 175 0 0 ++174 0 0 173 0 0 172 0 0 171 0 0 170 0 0 170 0 0 ++169 0 0 167 0 0 166 0 0 165 0 0 165 0 0 164 0 0 ++167 0 0 169 0 0 172 0 0 174 0 0 177 0 0 179 0 0 ++181 0 0 152 0 0 131 0 0 149 3 1 174 34 14 196 60 25 ++204 67 22 209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 ++209 61 24 209 61 24 214 127 110 241 196 185 242 201 184 242 201 184 ++247 223 207 237 212 203 202 130 106 38 6 5 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 44 12 10 238 198 189 254 254 253 255 255 255 ++238 198 189 111 7 4 117 1 0 117 1 0 142 1 0 172 5 1 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 ++195 25 6 195 25 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 187 29 9 156 18 6 ++131 0 0 124 2 0 124 2 0 166 0 0 179 0 0 177 0 0 ++177 0 0 176 0 0 175 0 0 174 0 0 174 0 0 173 0 0 ++172 0 0 171 0 0 170 0 0 170 0 0 169 0 0 169 0 0 ++167 0 0 166 0 0 165 0 0 164 0 0 165 0 0 167 0 0 ++170 0 0 172 0 0 175 0 0 177 0 0 179 0 0 181 0 0 ++184 0 0 172 5 1 168 26 11 194 55 23 204 67 22 204 67 22 ++204 67 22 209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 ++209 61 24 204 76 38 236 173 149 236 194 173 236 194 173 242 201 184 ++240 219 206 222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 183 106 85 249 237 229 255 255 255 ++253 252 250 183 106 85 111 7 4 117 1 0 117 1 0 149 3 1 ++184 9 3 196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 ++195 25 6 195 25 6 195 25 6 195 25 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 200 41 9 ++179 30 10 156 18 6 140 1 0 170 0 0 177 0 0 175 0 0 ++176 0 0 175 0 0 174 0 0 173 0 0 173 0 0 172 0 0 ++171 0 0 170 0 0 169 0 0 169 0 0 167 0 0 166 0 0 ++166 0 0 165 0 0 164 0 0 166 0 0 169 0 0 170 0 0 ++173 0 0 175 0 0 177 0 0 178 0 0 181 0 0 184 9 3 ++204 37 8 213 49 12 204 67 22 204 67 22 204 67 22 204 67 22 ++204 67 22 209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 ++209 61 24 221 143 118 237 187 164 237 187 164 237 187 164 238 198 189 ++237 212 203 183 106 85 2 2 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 44 12 10 222 184 158 255 255 255 ++255 255 255 237 212 203 136 24 13 117 1 0 117 1 0 124 2 0 ++176 6 2 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 195 25 6 195 25 6 195 25 6 195 25 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 200 41 9 ++200 41 9 189 46 14 200 41 9 195 25 6 184 9 3 179 7 2 ++172 0 0 170 0 0 171 0 0 171 0 0 171 0 0 170 0 0 ++169 0 0 169 0 0 167 0 0 166 0 0 166 0 0 164 0 0 ++164 0 0 165 0 0 167 0 0 169 0 0 170 0 0 171 0 0 ++174 0 0 178 0 0 184 9 3 195 25 6 213 49 12 213 49 12 ++213 78 31 204 67 22 204 67 22 204 67 22 204 67 22 204 67 22 ++209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 ++203 102 83 237 187 164 237 187 164 237 187 164 237 187 164 237 212 203 ++222 184 158 44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 2 2 2 177 84 68 246 228 219 ++255 255 255 255 255 255 198 112 92 117 1 0 117 1 0 117 1 0 ++142 1 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 195 25 6 195 25 6 195 25 6 195 25 6 ++195 25 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 200 41 9 ++189 46 14 189 46 14 200 41 9 213 43 8 213 43 8 213 43 8 ++201 33 6 191 24 6 184 9 3 172 0 0 169 0 0 167 0 0 ++167 0 0 166 0 0 164 0 0 163 0 0 163 0 0 163 0 0 ++164 0 0 167 0 0 169 0 0 171 0 0 179 7 2 191 24 6 ++204 37 8 213 49 12 213 49 12 213 78 31 213 78 31 213 78 31 ++213 78 31 209 61 24 204 67 22 204 67 22 204 67 22 204 67 22 ++209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 213 78 31 ++236 173 149 237 187 164 237 187 164 237 187 164 238 198 189 238 198 189 ++183 106 85 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 213 149 125 ++253 249 244 255 255 255 246 228 219 153 32 16 117 1 0 117 1 0 ++117 1 0 167 2 1 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 195 25 6 195 25 6 195 25 6 ++195 25 6 195 25 6 195 25 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 200 41 9 ++186 41 14 189 46 14 200 41 9 213 43 8 213 43 8 213 49 12 ++213 49 12 213 49 12 213 49 12 213 43 8 213 43 8 201 33 6 ++201 33 6 191 24 6 191 24 6 191 24 6 191 24 6 191 24 6 ++201 33 6 204 37 8 213 43 8 213 49 12 213 49 12 213 49 12 ++213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 ++213 78 31 209 61 24 204 67 22 204 67 22 204 67 22 209 61 24 ++209 61 24 209 61 24 209 61 24 209 61 24 209 61 24 221 143 118 ++237 187 164 237 187 164 237 187 164 237 187 164 237 212 203 213 149 125 ++44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 ++222 184 158 255 255 255 254 254 253 218 160 133 131 0 0 117 1 0 ++117 1 0 124 2 0 172 5 1 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 195 25 6 ++195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 200 41 9 ++186 41 14 186 41 14 206 42 10 213 43 8 213 43 8 213 43 8 ++213 43 8 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 ++213 78 31 213 78 31 204 67 22 204 67 22 204 67 22 209 61 24 ++209 61 24 209 61 24 209 61 24 209 61 24 214 127 110 237 187 164 ++237 187 164 237 187 164 237 187 164 238 198 189 222 184 158 90 10 7 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 ++177 84 68 240 219 206 254 254 253 251 245 237 188 95 83 124 2 0 ++124 2 0 124 2 0 131 0 0 179 7 2 196 0 0 192 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 ++195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 201 33 6 ++185 36 13 185 36 13 200 41 9 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 78 31 213 78 31 213 78 31 213 78 31 ++213 78 31 213 78 31 204 67 22 204 67 22 204 67 22 209 61 24 ++209 61 24 209 61 24 213 49 12 203 102 83 236 173 149 233 177 153 ++233 177 153 237 187 164 236 194 173 238 198 189 183 106 85 2 2 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++44 12 10 183 106 85 249 237 229 253 253 252 243 220 211 153 32 16 ++131 0 0 124 2 0 124 2 0 140 1 0 179 7 2 196 0 0 ++192 0 0 192 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 ++195 25 6 195 25 6 210 31 6 201 33 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 201 33 6 ++179 30 10 185 36 13 200 41 9 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 78 31 213 78 31 213 78 31 ++213 78 31 213 78 31 213 78 31 209 61 24 209 61 24 209 61 24 ++209 61 24 213 49 12 213 78 31 236 173 149 233 177 153 233 177 153 ++233 177 153 237 187 164 237 212 203 202 130 106 44 12 10 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 44 12 10 218 160 133 253 249 244 254 252 249 222 184 158 ++156 16 7 131 0 0 131 0 0 131 0 0 142 1 0 179 7 2 ++196 0 0 192 0 0 192 0 0 184 9 3 184 9 3 184 9 3 ++184 9 3 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 ++195 25 6 195 25 6 195 25 6 195 25 6 201 33 6 201 33 6 ++201 33 6 201 33 6 210 31 6 210 31 6 210 31 6 201 33 6 ++179 30 10 179 30 10 204 37 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 78 31 213 78 31 213 78 31 ++213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 209 61 24 ++213 49 12 213 78 31 239 175 143 236 173 149 236 173 149 236 173 149 ++237 187 164 238 198 189 222 184 158 44 12 10 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 44 12 10 222 184 158 253 249 244 253 249 244 ++213 149 125 150 0 0 140 1 0 131 0 0 140 1 0 142 1 0 ++179 7 2 196 0 0 192 0 0 192 0 0 192 0 0 184 9 3 ++184 9 3 184 9 3 195 25 6 195 25 6 195 25 6 195 25 6 ++195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 201 33 6 ++201 33 6 201 33 6 201 33 6 201 33 6 201 33 6 201 33 6 ++179 30 10 179 30 10 204 37 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 78 31 ++213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 213 49 12 ++213 78 31 239 175 143 236 173 149 236 173 149 236 173 149 241 190 156 ++236 194 173 222 184 158 177 84 68 2 2 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 177 84 68 222 184 158 253 249 244 ++249 237 229 198 112 92 152 0 0 141 0 0 141 0 0 142 0 0 ++147 0 0 176 6 2 196 0 0 196 0 0 192 0 0 192 0 0 ++184 9 3 184 9 3 184 9 3 191 24 6 195 25 6 195 25 6 ++195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 ++201 33 6 201 33 6 201 33 6 201 33 6 201 33 6 201 33 6 ++187 29 9 179 30 10 201 33 6 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 78 31 ++213 78 31 213 78 31 213 78 31 213 78 31 213 49 12 213 78 31 ++231 168 130 239 175 143 239 175 143 236 173 149 239 175 143 236 194 173 ++222 184 158 177 84 68 2 2 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 2 2 2 177 84 68 238 198 189 ++253 249 244 246 228 219 191 90 72 155 0 0 146 0 0 146 0 0 ++147 0 0 147 0 0 172 5 1 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 ++195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 ++195 25 6 201 33 6 201 33 6 201 33 6 201 33 6 210 31 6 ++187 29 9 179 30 10 201 33 6 210 31 6 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 78 31 213 49 12 213 49 12 213 78 31 231 168 130 ++239 175 143 239 175 143 239 175 143 239 175 143 237 187 164 222 184 158 ++183 106 85 38 6 5 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 38 6 5 183 106 85 ++237 212 203 253 249 244 243 220 211 192 80 59 159 0 0 150 0 0 ++150 0 0 152 0 0 150 0 0 167 2 1 192 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 195 25 6 ++195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 ++195 25 6 195 25 6 210 31 6 210 31 6 210 31 6 210 31 6 ++201 33 6 179 30 10 201 33 6 210 31 6 210 31 6 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 203 99 81 231 168 130 239 175 143 ++239 175 143 239 175 143 239 175 143 237 187 164 222 184 158 183 106 85 ++44 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 38 6 5 ++177 84 68 222 184 158 251 245 237 243 220 211 191 90 72 163 0 0 ++159 3 1 157 0 0 158 0 0 157 0 0 163 1 0 183 2 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++201 33 6 182 27 9 201 33 6 210 31 6 210 31 6 210 31 6 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 78 31 206 120 99 239 175 143 239 175 143 239 175 143 ++239 175 143 239 175 143 237 187 164 222 184 158 183 106 85 38 6 5 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++38 6 5 177 84 68 222 184 158 252 243 235 243 220 211 191 90 72 ++167 2 1 163 1 0 163 1 0 163 1 0 160 1 0 163 1 0 ++176 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 195 25 6 195 25 6 195 25 6 195 25 6 195 25 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++201 33 6 182 27 9 195 25 6 210 31 6 210 31 6 210 31 6 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 78 31 221 143 118 239 175 143 239 175 143 239 175 143 239 175 143 ++239 175 143 237 187 164 222 184 158 183 106 85 44 12 10 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 2 2 2 44 12 10 222 184 158 249 237 229 243 220 211 ++198 112 92 173 17 6 172 5 1 169 0 0 167 0 0 166 0 0 ++166 0 0 170 0 0 183 2 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 195 25 6 195 25 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 191 24 6 187 29 9 210 31 6 210 31 6 210 31 6 ++210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 78 31 ++227 164 124 231 168 130 239 175 143 239 175 143 239 175 143 239 175 143 ++222 184 158 222 184 158 177 84 68 38 6 5 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 44 12 10 213 149 125 246 228 219 ++246 228 219 210 136 114 179 30 10 176 6 2 179 0 0 174 0 0 ++171 0 0 171 0 0 171 0 0 178 0 0 192 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 191 24 6 187 29 9 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 213 49 12 ++213 49 12 213 49 12 213 49 12 213 78 31 206 120 99 227 164 124 ++227 164 124 231 168 130 239 175 143 239 175 143 239 175 143 222 184 158 ++213 149 125 177 84 68 2 2 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 2 2 2 44 12 10 183 106 85 ++238 198 189 246 228 219 236 173 149 184 62 32 180 23 7 184 9 3 ++183 2 0 179 0 0 176 0 0 177 0 0 178 0 0 183 2 0 ++196 0 0 196 0 0 196 0 0 196 0 0 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 191 24 6 191 24 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 49 12 213 49 12 213 49 12 213 49 12 ++213 43 8 213 78 31 213 78 31 227 164 124 227 164 124 227 164 124 ++227 164 124 231 168 130 239 175 143 239 175 143 222 184 158 202 130 106 ++44 12 10 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 44 12 10 ++177 84 68 222 184 158 246 228 219 241 196 185 203 99 81 185 36 13 ++193 28 10 196 0 0 192 0 0 183 2 0 183 2 0 183 2 0 ++183 2 0 186 0 0 196 0 0 196 0 0 196 0 0 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 191 24 6 191 24 6 195 25 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 49 12 ++213 78 31 227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 ++231 168 130 231 168 130 236 173 149 218 160 133 183 106 85 44 12 10 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++2 2 2 44 12 10 183 106 85 238 198 189 237 212 203 221 143 118 ++192 80 59 196 46 20 193 28 10 196 0 0 196 0 0 189 0 0 ++186 0 0 188 0 0 189 0 0 192 0 0 196 0 0 196 0 0 ++196 0 0 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 191 24 6 195 25 6 195 25 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 49 12 213 78 31 206 120 99 ++227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 ++231 168 130 218 160 133 202 130 106 44 12 10 2 2 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 1 1 1 44 12 10 90 10 7 213 149 125 237 212 203 ++241 196 185 203 102 83 193 53 28 193 53 28 203 40 12 210 31 6 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 210 31 6 210 31 6 ++195 25 6 191 24 6 195 25 6 195 25 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 213 43 8 213 43 8 ++213 43 8 213 43 8 213 43 8 213 43 8 213 43 8 210 31 6 ++213 43 8 213 78 31 213 78 31 206 120 99 227 164 124 227 164 124 ++227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 218 160 133 ++213 149 125 183 106 85 44 12 10 2 2 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 2 2 2 44 12 10 177 84 68 ++213 149 125 238 198 189 233 177 153 203 99 81 193 53 28 193 53 28 ++209 61 24 204 51 17 210 31 6 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++184 9 3 184 9 3 195 25 6 195 25 6 195 25 6 210 31 6 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 ++210 31 6 210 31 6 210 31 6 213 43 8 213 49 12 213 78 31 ++213 78 31 221 143 118 227 164 124 227 164 124 227 164 124 227 164 124 ++227 164 124 227 164 124 227 164 124 227 164 124 213 149 125 183 106 85 ++44 12 10 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 ++44 12 10 177 84 68 213 149 125 238 198 189 221 154 132 203 99 81 ++204 76 38 204 76 38 204 76 38 204 76 38 209 61 24 205 44 13 ++210 31 6 195 25 6 195 25 6 196 0 0 196 0 0 196 0 0 ++196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 196 0 0 ++210 31 6 210 31 6 210 31 6 210 31 6 210 31 6 213 49 12 ++213 49 12 213 78 31 213 78 31 213 78 31 206 120 99 227 164 124 ++227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 ++227 164 124 227 164 124 202 130 106 183 106 85 44 12 10 38 6 5 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 1 1 2 2 2 44 12 10 177 84 68 202 130 106 222 184 158 ++221 154 132 206 120 99 192 80 59 204 76 38 204 76 38 192 80 59 ++192 80 59 192 80 59 204 76 38 204 76 38 204 76 38 209 61 24 ++209 61 24 209 61 24 196 46 20 204 51 17 204 51 17 209 61 24 ++204 76 38 213 78 31 213 78 31 213 78 31 213 78 31 213 78 31 ++206 120 99 206 120 99 206 120 99 221 143 118 221 143 118 227 164 124 ++227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 227 164 124 ++202 130 106 183 106 85 44 12 10 44 12 10 2 2 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 2 2 2 44 12 10 44 12 10 ++183 106 85 213 149 125 218 160 133 214 127 110 203 102 83 192 80 59 ++204 76 38 192 80 59 192 80 59 192 80 59 203 99 81 203 99 81 ++203 99 81 203 99 81 203 99 81 203 99 81 203 99 81 203 99 81 ++203 102 83 203 102 83 203 102 83 206 120 99 206 120 99 206 120 99 ++206 120 99 206 120 99 206 120 99 206 120 99 227 164 124 227 164 124 ++227 164 124 227 164 124 227 164 124 202 130 106 183 106 85 177 84 68 ++44 12 10 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2 ++2 2 2 44 12 10 44 12 10 183 106 85 183 106 85 202 130 106 ++214 127 110 206 120 99 203 99 81 203 99 81 203 99 81 203 99 81 ++203 99 81 203 99 81 203 99 81 203 99 81 203 99 81 203 99 81 ++203 102 83 203 102 83 203 102 83 203 102 83 206 120 99 206 120 99 ++206 120 99 206 120 99 206 120 99 221 143 118 206 120 99 202 130 106 ++202 130 106 183 106 85 177 84 68 44 12 10 44 12 10 2 2 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 2 2 2 2 2 44 12 10 44 12 10 ++44 12 10 177 84 68 183 106 85 183 106 85 183 106 85 188 95 83 ++191 90 72 203 99 81 203 99 81 203 99 81 203 99 81 203 99 81 ++203 102 83 203 102 83 203 102 83 203 102 83 198 112 92 198 112 92 ++198 112 92 183 106 85 183 106 85 177 84 68 177 84 68 44 12 10 ++44 12 10 38 6 5 2 2 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 ++2 2 2 2 2 2 2 2 2 44 12 10 44 12 10 44 12 10 ++44 12 10 44 12 10 90 10 7 90 10 7 90 10 7 136 24 13 ++90 10 7 90 10 7 90 10 7 90 10 7 44 12 10 44 12 10 ++44 12 10 44 12 10 44 12 10 2 2 2 2 2 2 1 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1 1 1 ++1 1 1 2 2 2 2 2 2 2 2 2 1 1 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +diff --git a/drivers/video/logo/logo_fedoraglossy_clut224.ppm b/drivers/video/logo/logo_fedoraglossy_clut224.ppm +new file mode 100644 +index 000000000000..276afb7eda07 +--- /dev/null ++++ b/drivers/video/logo/logo_fedoraglossy_clut224.ppm +@@ -0,0 +1,1123 @@ ++P3 ++80 80 ++255 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 4 9 0 12 24 0 16 33 0 26 50 0 31 59 ++0 33 61 0 31 59 0 30 56 0 28 53 0 22 43 0 16 33 ++0 12 24 0 5 11 0 2 5 0 1 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 5 11 0 9 19 0 12 24 0 16 33 ++0 25 48 2 43 79 36 91 133 66 107 134 66 107 134 66 107 134 ++66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 ++9 67 112 2 43 79 0 31 57 0 22 43 0 20 39 0 14 29 ++0 5 11 0 2 5 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ++0 9 19 0 22 43 0 38 70 9 67 112 66 107 134 105 133 154 ++123 144 162 127 149 166 126 153 173 126 153 173 126 153 173 126 153 173 ++126 153 173 126 153 173 126 153 173 126 153 173 126 153 173 126 153 173 ++127 149 166 127 149 166 121 141 158 105 133 154 66 107 134 3 53 95 ++1 36 66 0 25 48 0 14 29 0 5 11 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 2 5 0 9 19 0 28 53 ++9 67 112 66 107 134 121 141 158 126 153 173 126 153 173 126 153 173 ++126 153 173 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 ++127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 ++127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 ++110 135 155 66 107 134 3 53 95 0 28 53 0 16 33 0 4 9 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 5 11 0 20 39 0 34 63 36 91 133 105 133 154 ++127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 ++127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 ++127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 127 149 166 ++127 149 166 127 149 166 127 149 166 123 144 162 123 144 162 123 144 162 ++127 149 166 127 149 166 121 141 158 105 133 154 9 67 112 0 24 47 ++0 9 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 16 33 0 34 63 9 67 112 105 133 154 127 149 166 127 149 166 ++127 149 166 123 144 162 123 144 162 127 149 166 123 144 162 123 144 162 ++123 144 162 123 144 162 123 144 162 123 144 162 123 144 162 123 144 162 ++123 144 162 123 144 162 123 144 162 123 144 162 123 144 162 123 144 162 ++121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 ++121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 86 123 154 ++3 53 95 0 22 43 0 7 15 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 29 ++2 43 79 66 107 134 115 143 164 120 146 166 123 144 162 123 144 162 ++123 144 162 123 144 162 123 144 162 120 146 166 121 141 158 121 141 158 ++121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 ++121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 ++121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 ++121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 121 141 158 ++110 135 155 66 107 134 0 27 51 0 14 29 0 0 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 2 5 0 22 43 3 53 95 ++86 123 154 115 143 164 114 140 160 114 140 160 114 140 160 114 140 160 ++114 140 160 114 140 160 114 140 160 114 140 160 114 140 160 114 140 160 ++114 140 160 114 140 160 114 140 160 114 140 160 114 140 160 110 135 155 ++110 135 155 114 140 160 110 135 155 110 135 155 110 135 155 110 135 155 ++110 135 155 110 135 155 110 135 155 110 135 155 110 135 155 110 135 155 ++110 135 155 110 135 155 110 135 155 110 135 155 110 135 155 110 135 155 ++110 135 155 121 141 158 66 107 134 0 31 57 0 20 39 0 4 9 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 12 24 0 33 63 3 53 95 86 123 154 ++114 140 160 109 137 159 109 137 159 109 137 159 109 137 159 109 137 159 ++109 137 159 110 135 155 110 135 155 109 137 159 110 135 155 110 135 155 ++110 135 155 110 135 155 109 137 159 110 135 155 110 135 155 110 135 155 ++110 135 155 110 135 155 110 135 155 110 135 155 105 133 154 105 133 154 ++105 133 154 105 133 154 110 135 155 121 141 158 127 149 166 127 149 166 ++121 141 158 110 135 155 105 133 154 105 133 154 105 133 154 105 133 154 ++105 133 154 105 133 154 110 135 155 66 107 134 0 33 61 0 20 39 ++0 7 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 14 29 0 40 76 3 53 95 86 123 154 109 137 159 ++104 134 157 104 134 157 104 134 157 104 134 157 104 134 157 104 134 157 ++104 134 157 104 134 157 104 134 157 104 134 157 105 133 154 105 133 154 ++105 133 154 105 133 154 105 133 154 105 133 154 105 133 154 105 133 154 ++105 133 154 105 133 154 105 133 154 105 133 154 105 133 154 126 153 173 ++158 185 204 198 215 225 227 236 241 240 245 247 240 245 247 240 245 247 ++240 245 247 227 236 241 188 208 220 126 153 173 105 133 154 105 133 154 ++105 133 154 105 133 154 105 133 154 105 133 154 66 107 134 0 29 54 ++0 20 39 0 2 5 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 9 19 0 38 72 0 47 87 66 107 134 100 132 157 95 130 157 ++95 130 157 95 130 157 100 132 157 100 132 157 100 132 157 100 132 157 ++100 132 157 100 132 157 100 132 157 100 132 157 100 132 157 100 132 157 ++100 132 157 100 132 157 100 132 157 100 132 157 100 132 157 95 130 157 ++95 130 157 95 130 157 95 130 157 125 160 184 198 215 225 240 245 247 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 249 251 252 175 199 215 105 133 154 ++105 133 154 86 123 154 86 123 154 86 123 154 105 133 154 36 91 133 ++0 22 43 0 20 39 0 4 9 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 11 ++0 38 71 0 45 86 9 67 112 86 123 154 95 130 157 95 130 157 ++95 130 157 95 130 157 95 130 157 95 130 157 95 130 157 95 130 157 ++95 130 157 95 130 157 95 130 157 95 130 157 95 130 157 95 130 157 ++95 130 157 95 130 157 95 130 157 86 123 154 86 123 154 86 123 154 ++86 123 154 114 140 160 188 208 220 249 251 252 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 151 182 203 ++86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 66 107 134 ++1 36 66 0 22 43 0 16 33 0 2 5 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 5 11 0 37 70 ++0 49 91 0 51 95 54 103 137 95 130 157 86 123 154 86 123 154 ++86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 ++86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 ++86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 ++126 153 173 227 236 241 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 198 215 225 ++86 123 154 86 123 154 86 123 154 86 123 154 66 107 134 86 123 154 ++36 91 133 0 25 48 0 22 43 0 12 24 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 4 9 0 38 72 0 50 94 ++0 51 95 1 56 100 70 116 150 86 123 154 86 123 154 86 123 154 ++86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 ++86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 86 123 154 ++86 123 154 86 123 154 86 123 154 86 123 154 70 116 150 126 153 173 ++240 245 247 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 198 215 225 ++86 123 154 78 123 153 86 123 154 66 107 134 66 107 134 66 107 134 ++66 107 134 0 31 57 0 24 47 0 22 43 0 12 24 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 2 0 39 73 0 51 95 0 53 98 ++0 53 98 9 67 112 70 116 150 78 123 153 70 116 150 70 116 150 ++70 116 150 70 116 150 78 123 153 78 123 153 78 123 153 78 123 153 ++78 123 153 78 123 153 78 123 153 78 123 153 78 123 153 78 123 153 ++78 123 153 70 116 150 78 123 153 65 110 142 115 143 164 227 236 241 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 158 185 204 ++66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 ++66 107 134 1 36 66 0 26 50 0 25 48 0 22 43 0 9 19 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 22 43 0 53 98 0 54 101 0 54 98 ++0 53 98 12 74 126 70 116 150 70 116 150 70 116 150 70 116 150 ++70 116 150 70 116 150 70 116 150 70 116 150 70 116 150 70 116 150 ++70 116 150 70 116 150 70 116 150 70 116 150 70 116 150 70 116 150 ++70 116 150 70 116 150 70 116 150 86 123 154 213 228 238 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 188 208 220 78 123 153 ++66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 ++66 107 134 1 36 66 0 27 51 0 27 51 0 24 47 0 20 39 ++0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 2 5 0 42 78 0 54 101 0 55 102 0 55 102 ++0 55 102 9 67 112 65 110 142 70 116 150 65 110 142 70 116 150 ++70 116 150 65 110 142 65 110 142 70 116 150 70 116 150 65 110 142 ++70 116 150 65 110 142 65 110 142 70 116 150 65 110 142 65 110 142 ++65 110 142 65 110 142 65 110 142 163 190 208 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 249 251 252 205 221 232 163 190 208 139 173 197 139 173 197 ++151 182 203 163 190 208 163 190 208 125 160 184 70 116 150 66 107 134 ++66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 ++66 107 134 1 36 66 0 28 53 0 28 53 0 27 51 0 22 43 ++0 4 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 32 60 0 54 101 0 57 102 2 58 106 2 58 106 ++2 58 106 9 67 112 65 110 142 65 110 142 65 110 142 65 110 142 ++65 110 142 65 110 142 65 110 142 65 110 142 58 111 150 65 110 142 ++65 110 142 65 110 142 65 110 142 65 110 142 65 110 142 65 110 142 ++65 110 142 58 105 140 100 132 157 240 245 247 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++198 215 225 108 139 162 65 110 142 54 103 137 54 103 137 54 103 137 ++54 103 137 54 103 137 54 103 137 66 107 134 66 107 134 66 107 134 ++66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 ++66 107 134 1 36 66 0 29 55 0 29 54 0 28 53 0 26 50 ++0 14 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 9 19 0 53 98 0 57 102 2 58 106 2 58 106 0 60 110 ++0 60 110 1 61 111 44 99 139 56 105 142 56 105 142 56 105 142 ++56 105 142 56 105 142 56 105 142 56 105 142 56 105 142 56 105 142 ++56 105 142 56 105 142 56 105 142 56 105 142 56 105 142 56 105 142 ++56 105 142 50 102 142 175 199 215 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 151 182 203 ++54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 ++54 103 137 54 103 137 54 103 137 54 103 137 66 107 134 66 107 134 ++66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 66 107 134 ++36 91 133 0 38 70 0 30 56 0 29 55 0 28 53 0 27 51 ++0 24 47 0 14 29 0 0 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 35 67 2 58 106 2 58 106 2 58 106 0 60 110 0 60 110 ++0 61 112 0 61 112 23 84 135 56 105 142 50 104 143 50 104 143 ++50 104 143 50 104 143 50 104 143 50 104 143 50 104 143 50 104 143 ++50 104 143 50 104 143 50 104 143 50 104 143 50 102 142 50 102 142 ++50 102 142 70 116 150 227 236 241 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 158 185 204 44 99 139 ++54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 ++54 103 137 54 103 137 36 91 133 36 91 133 36 91 133 54 103 137 ++54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 54 103 137 ++9 67 112 0 41 75 0 32 60 0 30 56 0 29 54 0 28 53 ++0 27 51 0 20 39 0 4 9 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 11 ++0 50 95 2 58 106 0 60 110 0 60 110 0 61 112 0 61 112 ++1 62 114 1 62 114 5 67 116 42 97 140 50 102 142 50 102 142 ++50 102 142 50 102 142 50 102 142 50 102 142 50 102 142 50 102 142 ++50 102 142 50 102 142 50 102 142 50 102 142 50 102 142 50 102 142 ++38 94 135 117 151 174 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 205 221 232 54 103 137 36 91 133 ++38 94 135 38 94 135 38 94 135 36 91 133 36 91 133 36 91 133 ++36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 ++38 94 135 54 103 137 38 94 135 38 94 135 54 103 137 36 91 133 ++0 47 84 0 44 81 1 36 66 0 30 57 0 29 55 0 28 53 ++0 27 51 0 22 43 0 9 19 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 39 ++0 57 102 0 60 110 0 60 110 0 61 112 0 63 115 0 63 115 ++0 63 115 0 63 115 0 63 115 12 74 126 42 97 140 42 97 140 ++42 97 140 42 97 140 42 97 140 42 97 140 42 97 140 42 97 140 ++42 97 140 42 97 140 42 97 140 42 97 140 42 97 140 42 97 140 ++37 92 135 151 182 203 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 117 151 174 33 89 133 36 91 133 ++36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 ++36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 36 91 133 ++36 91 133 38 94 135 36 91 133 36 91 133 36 91 133 2 60 104 ++0 47 84 0 47 84 0 38 70 0 31 58 0 30 56 0 29 54 ++0 28 53 0 25 48 0 16 33 0 2 5 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 76 ++0 60 110 0 61 112 0 63 115 0 63 115 0 64 119 0 64 119 ++0 64 119 0 66 119 0 66 119 0 67 125 23 84 135 42 97 140 ++42 97 140 39 95 138 42 97 140 37 101 144 37 101 144 42 97 140 ++42 97 140 42 97 140 42 97 140 42 97 140 39 95 138 39 95 138 ++42 97 140 188 208 220 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 227 236 241 58 105 140 33 89 133 36 91 133 ++36 91 133 36 91 133 36 91 133 33 89 133 33 89 133 33 89 133 ++33 89 133 33 89 133 33 89 133 33 89 133 33 89 133 33 89 133 ++33 89 133 36 91 133 36 91 133 36 91 133 9 67 112 0 50 89 ++0 50 89 0 47 84 0 41 75 0 32 60 0 31 58 0 30 56 ++0 29 54 0 27 51 0 24 47 0 9 19 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 16 33 2 58 106 ++0 61 112 0 63 115 0 63 115 0 64 119 0 64 119 0 66 119 ++0 66 119 0 66 119 0 67 125 0 67 125 0 67 125 16 83 138 ++39 95 138 39 95 138 37 101 144 37 101 144 37 101 144 39 95 138 ++39 95 138 39 95 138 39 95 138 39 95 138 37 92 135 33 89 133 ++37 101 144 205 221 232 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 188 208 220 36 91 133 33 89 133 33 89 133 ++33 89 133 33 89 133 33 89 133 33 89 133 33 89 133 33 89 133 ++33 89 133 33 89 133 33 89 133 9 67 112 9 67 112 9 67 112 ++9 67 112 33 89 133 33 89 133 9 67 112 0 50 89 0 50 89 ++0 50 89 0 47 84 0 43 79 0 33 61 0 31 59 0 30 56 ++0 29 54 0 28 53 0 26 50 0 14 29 0 0 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 45 84 0 63 115 ++0 63 115 0 64 119 0 64 119 0 66 119 0 67 125 0 67 125 ++0 67 125 0 68 127 0 68 127 0 68 127 0 68 127 0 68 127 ++13 81 137 23 87 136 23 87 136 23 87 136 23 87 136 23 87 136 ++23 87 136 23 87 136 23 87 136 23 87 136 23 87 136 23 87 136 ++37 101 144 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 175 199 215 33 89 133 23 84 135 33 89 133 ++23 84 135 23 84 135 33 89 133 33 89 133 12 74 126 12 74 126 ++12 74 126 9 67 112 9 67 112 9 67 112 9 67 112 9 67 112 ++9 67 112 9 67 112 9 67 112 0 55 96 0 55 96 0 50 89 ++0 50 89 0 50 89 0 44 81 0 34 63 0 32 60 0 31 58 ++0 30 56 0 29 54 0 26 50 0 20 39 0 4 9 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 5 11 0 61 112 0 63 115 ++0 63 115 0 64 119 0 66 119 1 68 121 0 67 125 0 67 125 ++0 68 127 0 68 127 0 68 127 0 68 127 0 68 127 1 73 132 ++1 73 132 6 78 137 16 83 138 19 86 138 19 86 138 19 86 138 ++19 86 138 19 86 138 19 86 138 19 86 138 23 87 136 19 86 138 ++37 101 144 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 163 190 208 12 74 126 12 74 126 12 74 126 ++12 74 126 12 74 126 12 74 126 12 74 126 9 67 112 9 67 112 ++9 67 112 9 67 112 9 67 112 9 67 112 9 67 112 9 67 112 ++3 53 95 1 56 100 0 59 102 0 55 96 0 55 96 0 55 96 ++0 50 89 0 50 89 0 44 81 0 34 63 0 32 60 0 31 58 ++0 31 57 0 29 54 0 27 51 0 20 39 0 7 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 12 24 0 64 119 0 64 119 ++0 64 119 0 66 119 0 67 125 0 67 125 0 68 127 0 68 127 ++0 68 127 0 68 127 1 73 132 1 73 132 1 73 132 1 73 132 ++1 75 135 1 73 132 0 74 137 8 80 139 16 83 138 19 86 138 ++19 86 138 19 86 138 19 86 138 19 86 138 16 83 138 16 83 138 ++37 101 144 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 158 185 204 12 74 126 12 74 126 12 74 126 ++12 74 126 12 74 126 12 74 126 9 67 112 9 67 112 9 67 112 ++9 67 112 9 67 112 9 67 112 9 67 112 4 62 107 3 53 95 ++0 46 85 0 55 96 0 59 102 0 59 102 0 55 96 0 55 96 ++0 50 89 0 50 89 0 44 81 0 35 64 0 33 61 0 31 59 ++0 30 57 0 29 54 0 28 53 0 24 47 0 12 24 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 31 59 0 64 119 0 66 119 ++0 66 119 0 67 125 0 67 125 0 68 127 0 68 127 0 68 127 ++0 68 127 1 73 132 1 73 132 0 74 137 0 74 137 0 74 137 ++0 74 137 0 74 137 1 75 137 0 74 137 1 75 137 6 79 140 ++8 80 139 8 80 139 16 83 138 16 83 138 13 81 137 8 80 139 ++23 87 136 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 158 185 204 12 74 126 9 72 124 9 72 124 ++7 70 121 9 67 112 9 67 112 9 67 112 9 67 112 9 67 112 ++9 67 112 4 62 107 2 60 104 3 53 95 0 49 89 0 45 86 ++0 48 88 2 60 104 0 59 102 0 59 102 0 55 96 0 55 96 ++0 50 89 0 50 89 0 43 79 0 35 64 0 34 63 0 32 60 ++0 31 58 0 30 56 0 28 53 0 26 50 0 14 29 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 0 49 92 0 66 119 0 66 119 ++0 67 125 0 67 125 0 68 127 0 68 127 1 73 132 1 73 132 ++1 73 132 1 73 132 1 75 135 0 74 137 0 74 137 1 75 137 ++1 75 137 1 75 137 1 75 137 1 75 137 1 75 137 1 75 137 ++1 75 137 4 77 138 4 78 138 7 79 141 8 80 139 4 77 138 ++19 86 138 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 158 185 204 6 69 123 4 69 121 5 67 116 ++9 67 112 9 67 112 9 67 112 9 67 112 9 67 112 4 62 107 ++2 60 104 0 54 98 0 50 94 0 49 92 0 48 90 0 46 85 ++0 55 96 5 66 110 2 60 104 0 59 102 0 55 96 0 55 96 ++0 55 96 0 50 89 0 41 75 0 34 65 0 33 63 0 33 61 ++0 31 59 0 29 55 0 29 54 0 27 51 0 20 39 0 5 11 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 2 5 2 58 106 1 68 121 0 67 125 ++0 67 125 0 68 127 0 68 127 1 73 132 1 73 132 1 75 135 ++0 74 137 0 74 137 1 75 137 1 75 137 4 77 138 4 77 138 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 ++6 78 141 1 75 137 1 75 137 1 75 137 1 75 137 0 74 137 ++16 83 138 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 158 185 204 1 68 121 1 65 118 1 65 118 ++4 65 114 1 62 114 1 61 111 0 60 110 2 58 106 0 55 102 ++0 54 101 0 53 98 0 51 95 0 50 93 0 48 90 0 52 94 ++0 64 112 5 66 110 2 60 104 0 59 102 0 59 102 0 55 96 ++0 55 96 0 50 89 0 39 73 0 35 64 0 34 63 0 33 63 ++0 32 60 0 30 57 0 29 54 0 28 53 0 22 43 0 9 19 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 5 11 0 64 119 0 66 119 0 67 125 ++0 68 127 0 68 127 0 68 127 1 73 132 1 75 135 0 74 137 ++0 74 137 1 75 137 1 75 137 4 77 138 4 77 138 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 ++6 78 141 6 78 141 4 77 138 4 77 138 1 75 137 0 74 137 ++16 83 138 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 151 182 203 0 66 119 0 63 115 0 63 115 ++1 62 114 0 60 110 0 60 110 2 58 106 0 57 102 0 55 102 ++0 54 101 0 54 98 0 51 95 0 49 93 0 52 94 0 64 112 ++0 64 112 5 66 110 2 60 104 0 59 102 0 59 102 0 55 96 ++0 55 96 0 50 89 0 37 69 0 35 67 0 35 64 0 33 63 ++0 32 60 0 30 56 0 29 54 0 28 53 0 24 47 0 12 24 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 7 15 0 67 125 0 67 125 0 68 127 ++0 68 127 0 68 127 1 73 132 1 73 132 0 74 137 0 74 137 ++1 75 137 1 75 137 4 77 138 6 78 141 6 78 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 1 75 137 0 74 137 ++7 79 141 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 151 182 203 0 64 119 0 63 115 1 62 114 ++0 61 112 0 60 110 0 60 110 2 58 106 0 55 102 0 55 102 ++0 54 101 0 53 98 0 51 95 0 57 102 0 64 112 5 67 116 ++0 64 112 5 66 110 2 60 104 2 60 104 0 59 102 0 55 96 ++0 55 96 0 43 79 0 36 67 0 36 67 0 35 64 0 34 63 ++0 33 61 0 31 57 0 29 55 0 28 53 0 24 47 0 7 15 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 7 15 0 67 125 0 67 125 0 68 127 ++0 68 127 1 73 132 1 73 132 1 75 135 1 75 137 1 75 137 ++1 75 137 1 75 137 6 78 141 6 78 141 6 78 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 7 79 141 ++7 79 141 7 79 141 7 79 141 7 79 141 7 79 141 7 79 141 ++37 101 144 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 198 215 225 23 87 136 12 74 126 12 74 126 ++12 74 126 9 72 124 9 72 124 9 67 112 2 58 106 0 53 101 ++0 57 102 0 60 110 0 64 112 1 68 121 1 68 121 5 67 116 ++0 64 112 5 66 110 4 62 107 2 60 104 0 59 102 0 59 102 ++0 50 89 0 40 74 0 37 69 0 35 67 0 34 65 0 34 63 ++0 33 61 0 31 58 0 30 56 0 29 54 0 25 48 0 4 9 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 4 9 0 67 125 0 67 125 0 68 127 ++0 68 127 1 73 132 1 73 132 0 74 137 1 75 137 1 75 137 ++4 77 138 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 ++7 79 141 7 79 141 39 124 175 39 124 175 118 157 183 175 199 215 ++205 221 232 209 226 237 209 226 237 209 226 237 209 226 237 209 226 237 ++209 226 237 249 251 252 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 227 236 241 205 221 232 205 221 232 ++205 221 232 205 221 232 205 221 232 198 215 225 151 182 203 49 111 152 ++2 73 127 7 77 127 2 73 127 2 73 127 1 68 121 5 67 116 ++0 64 112 5 66 110 4 62 107 2 60 104 0 59 102 0 59 102 ++0 43 79 0 38 72 0 38 70 0 36 67 0 35 64 0 34 63 ++0 33 61 0 31 58 0 30 56 0 29 54 0 25 48 0 5 11 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 0 68 127 ++1 73 132 1 73 132 1 75 135 0 74 137 1 75 137 1 75 137 ++6 78 141 6 78 141 6 78 141 7 79 141 7 79 141 39 124 175 ++39 124 175 39 124 175 39 124 175 132 167 191 249 251 252 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 227 236 241 ++59 119 159 2 73 127 2 73 127 2 73 127 1 68 121 1 68 121 ++5 67 116 5 66 110 5 66 110 2 60 104 0 59 102 0 50 89 ++0 40 74 0 39 73 0 38 70 0 37 69 1 36 66 0 34 63 ++0 32 60 0 31 59 0 30 56 0 29 54 0 25 48 0 7 15 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 0 68 127 ++1 73 132 1 73 132 0 74 137 0 74 137 1 75 137 4 77 138 ++6 78 141 6 78 141 7 79 141 39 124 175 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 227 236 241 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++175 199 215 13 81 137 2 73 127 2 73 127 1 68 121 1 68 121 ++5 67 116 5 66 110 5 66 110 2 60 104 0 52 94 0 42 78 ++0 40 74 0 40 74 0 38 71 0 37 69 0 36 67 0 33 63 ++0 33 61 0 31 59 0 30 56 0 29 54 0 27 51 0 12 24 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 1 73 132 ++1 73 132 1 75 135 0 74 137 1 75 137 1 75 137 1 75 137 ++7 79 141 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 ++39 124 175 39 124 175 66 128 168 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++227 236 241 37 101 144 2 73 127 2 73 127 1 68 121 1 68 121 ++5 67 116 0 64 112 5 66 110 0 55 96 0 43 79 0 42 78 ++0 40 76 0 40 74 0 38 71 0 37 69 0 36 67 0 34 63 ++0 34 63 0 31 59 0 30 56 0 29 54 0 28 53 0 12 24 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 1 73 132 ++1 73 132 1 75 135 0 74 137 1 75 137 1 75 137 7 79 141 ++39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++213 228 238 37 101 144 2 73 127 2 73 127 1 68 121 1 68 121 ++5 67 116 0 64 112 0 52 94 0 44 82 0 42 78 0 42 78 ++0 40 76 0 40 74 0 38 71 0 37 69 0 36 67 0 34 63 ++0 34 63 0 31 59 0 30 56 0 29 54 0 27 51 0 12 24 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 1 73 132 ++1 73 132 1 75 135 0 74 137 0 74 137 7 79 141 39 124 175 ++39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 209 226 237 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++151 182 203 7 77 127 2 73 127 2 73 127 1 68 121 1 68 121 ++2 60 104 0 50 89 0 45 84 0 44 82 0 43 79 0 42 78 ++0 40 76 0 40 74 0 38 71 0 37 69 0 36 67 0 34 63 ++0 34 63 0 31 59 0 30 56 0 29 54 0 28 53 0 14 29 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 64 119 0 68 127 1 73 132 ++1 73 132 0 74 137 0 74 137 6 78 141 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 39 124 175 213 228 238 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 188 208 220 ++37 101 144 2 73 127 2 73 127 1 68 121 0 64 112 0 54 98 ++0 49 91 0 47 87 0 46 85 0 45 83 0 43 79 0 42 78 ++0 40 76 0 40 74 0 38 71 0 37 69 0 36 67 0 34 63 ++0 34 63 0 31 59 0 30 56 0 29 54 0 28 53 0 12 24 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 2 0 67 125 0 68 127 1 73 132 ++1 73 132 1 73 132 0 74 137 7 79 141 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 118 157 183 ++142 177 202 142 177 202 142 177 202 142 177 202 142 177 202 142 177 202 ++188 208 220 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 205 221 232 139 173 197 139 173 197 139 173 197 ++132 167 191 132 167 191 132 167 191 125 160 184 83 131 163 7 77 127 ++0 64 112 0 64 112 0 57 102 0 53 98 0 49 93 0 48 90 ++0 48 88 0 47 87 0 46 85 0 45 83 0 43 79 0 42 78 ++0 40 74 0 40 74 0 38 70 0 37 69 0 35 64 0 34 63 ++0 32 60 0 31 59 0 30 56 0 29 54 0 27 51 0 12 24 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 67 125 0 68 127 8 76 132 ++16 83 138 13 81 137 7 79 141 39 124 175 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 ++39 124 175 7 79 141 7 79 141 7 79 141 6 78 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 0 74 137 ++19 86 138 227 236 241 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 151 182 203 0 64 119 0 64 119 0 63 115 ++0 61 112 0 60 110 0 60 110 0 55 102 0 53 101 0 55 102 ++0 55 102 0 54 98 0 53 98 0 51 95 0 50 94 0 49 91 ++0 48 88 0 46 85 0 45 84 0 44 82 0 43 79 0 42 78 ++0 40 74 0 40 74 0 37 69 0 36 67 0 35 67 0 34 63 ++0 33 61 0 31 58 0 30 56 0 29 54 0 25 48 0 7 15 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 67 125 6 74 130 23 87 136 ++37 101 144 37 101 144 39 124 175 39 124 175 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 39 124 175 39 124 175 7 79 141 ++6 78 141 6 78 141 6 78 141 7 79 141 7 79 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 1 75 137 ++7 79 141 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 151 182 203 0 67 125 0 64 119 0 64 119 ++0 63 115 0 61 112 0 61 112 0 60 110 2 58 106 0 57 102 ++0 55 102 0 56 101 0 53 98 0 50 95 0 49 93 0 49 91 ++0 48 88 0 45 86 0 44 83 0 44 81 0 42 78 0 42 78 ++0 40 74 0 38 72 0 38 70 0 35 67 0 34 65 0 34 63 ++0 33 61 0 31 57 0 30 56 0 28 53 0 24 47 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 64 119 15 82 136 37 101 144 ++49 111 152 48 117 162 39 124 175 39 124 175 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 39 124 175 7 79 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 1 75 137 ++16 83 138 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 151 182 203 0 67 125 0 64 119 0 64 119 ++0 63 115 1 62 114 0 60 110 0 60 110 2 58 106 0 57 102 ++0 55 102 0 54 101 0 53 98 0 51 95 0 50 93 0 48 90 ++0 48 88 0 46 85 0 45 83 0 44 81 0 42 78 0 40 76 ++0 40 74 0 38 72 0 37 69 0 36 67 0 35 64 0 34 63 ++0 33 61 0 31 57 0 29 55 0 27 51 0 24 47 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 2 1 65 118 33 89 133 54 113 152 ++72 126 163 66 128 168 66 128 168 39 124 175 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 7 79 141 6 78 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 0 74 137 ++16 83 138 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 158 185 204 0 67 125 0 64 119 0 64 119 ++0 63 115 0 61 112 0 60 110 0 60 110 2 58 106 0 57 102 ++0 55 102 0 54 101 0 53 98 0 51 95 0 50 93 0 48 90 ++0 47 87 0 46 85 0 44 83 0 44 81 0 42 78 0 40 76 ++0 40 74 0 38 72 0 37 69 0 36 67 0 35 64 0 33 63 ++0 33 61 0 31 57 0 29 55 0 29 54 0 12 24 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 2 5 5 67 116 42 97 140 72 126 163 ++83 131 163 118 157 183 83 131 163 66 128 168 39 124 175 39 124 175 ++39 124 175 39 124 175 39 124 175 7 79 141 6 78 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 1 75 137 0 74 137 ++16 83 138 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 151 182 203 0 64 119 0 63 115 0 63 115 ++1 62 114 0 60 110 0 60 110 2 58 106 0 57 102 0 55 102 ++0 54 101 0 53 98 0 51 95 0 50 93 0 49 91 0 48 88 ++0 47 87 0 45 84 0 44 82 0 42 78 0 42 78 0 41 75 ++0 38 72 0 38 71 0 37 69 0 35 67 0 34 63 0 33 61 ++0 31 59 0 30 57 0 29 54 0 29 54 0 5 11 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 2 5 9 72 124 50 109 150 83 131 163 ++117 151 174 118 157 183 118 157 183 66 128 168 39 124 175 39 124 175 ++39 124 175 39 124 175 7 79 141 6 78 141 6 78 141 6 78 141 ++6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 6 78 141 ++6 78 141 4 77 138 4 77 138 4 77 138 1 75 137 0 74 137 ++16 83 138 213 228 238 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 151 182 203 0 64 119 0 63 115 0 63 115 ++0 61 112 0 60 110 0 60 110 2 58 106 0 57 102 0 55 102 ++0 54 101 0 53 98 0 51 95 0 50 93 0 49 91 0 48 88 ++0 47 87 0 45 84 0 44 82 0 43 79 0 42 78 0 41 75 ++0 39 73 0 38 71 0 36 67 0 35 67 0 34 63 0 33 61 ++0 31 59 0 30 56 0 28 53 0 22 43 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 2 9 67 112 58 111 150 107 142 167 ++118 157 183 142 177 202 132 167 191 118 157 183 66 128 168 39 124 175 ++7 79 141 39 124 175 7 79 141 0 74 137 1 75 137 1 75 137 ++1 75 137 1 75 137 1 75 137 1 75 137 4 77 138 1 75 137 ++1 75 137 1 75 137 1 75 137 1 75 137 0 74 137 1 73 132 ++13 81 137 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 151 182 203 0 64 119 1 62 114 0 61 112 ++0 60 110 0 60 110 2 58 106 0 57 102 0 55 102 0 54 101 ++0 53 98 0 53 98 0 50 93 0 49 91 0 48 88 0 47 87 ++0 46 85 0 44 82 0 43 79 0 42 78 0 40 76 0 40 74 ++0 38 71 0 37 69 0 35 67 0 35 64 0 34 63 0 32 60 ++0 31 58 0 30 56 0 26 50 0 12 24 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 3 53 95 68 118 153 107 142 167 ++132 167 191 151 182 203 142 177 202 132 167 191 66 128 168 39 124 175 ++7 79 141 7 79 141 7 79 141 0 74 137 0 74 137 1 75 137 ++1 75 137 1 75 137 1 75 137 1 75 137 1 75 137 1 75 137 ++1 75 137 0 74 137 0 74 137 0 74 137 1 73 132 1 73 132 ++13 81 137 209 226 237 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 151 182 203 0 63 115 0 61 112 0 60 110 ++0 60 110 2 58 106 2 58 106 0 55 102 0 54 101 0 53 98 ++0 53 98 0 51 95 0 49 92 0 48 90 0 47 87 0 46 85 ++0 45 84 0 44 81 0 42 78 0 42 78 0 40 74 0 40 74 ++0 38 70 0 37 69 1 36 66 0 34 63 0 33 61 0 31 59 ++0 30 57 0 29 54 0 22 43 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 3 53 95 68 118 153 117 151 174 ++151 182 203 175 199 215 163 190 208 142 177 202 118 157 183 39 124 175 ++39 124 175 7 79 141 7 79 141 1 73 132 0 74 137 0 74 137 ++0 74 137 0 74 137 1 75 137 1 75 137 0 74 137 0 74 137 ++0 74 137 1 75 135 1 75 135 0 74 137 1 73 132 0 68 127 ++16 83 138 227 236 241 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 142 177 202 1 62 114 0 61 112 0 60 110 ++0 60 110 2 58 106 2 58 106 0 55 102 0 54 101 0 53 98 ++0 53 98 0 51 95 0 50 93 0 48 90 0 47 87 0 46 85 ++0 45 84 0 44 81 0 42 78 0 42 78 0 40 74 0 38 72 ++0 38 70 0 37 69 0 35 64 0 34 63 0 33 61 0 31 59 ++0 31 57 0 29 55 0 14 29 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 9 67 112 68 118 153 118 157 183 ++158 185 204 188 208 220 188 208 220 151 182 203 118 157 183 66 128 168 ++39 124 175 7 79 141 6 79 140 0 68 127 1 73 132 1 73 132 ++1 73 132 1 73 132 1 75 135 1 75 135 0 74 137 1 73 132 ++1 73 132 1 73 132 1 73 132 1 73 132 0 68 127 0 67 125 ++19 86 138 240 245 247 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 132 167 191 2 58 106 0 60 110 0 60 110 ++2 58 106 2 58 106 0 57 102 0 54 101 0 53 98 0 53 98 ++0 51 95 0 50 93 0 48 90 0 47 87 0 46 85 0 45 84 ++0 44 82 0 43 79 0 42 78 0 41 75 0 39 73 0 38 71 ++0 37 69 0 36 67 0 34 63 0 33 61 0 32 60 0 31 58 ++0 30 56 0 27 51 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 12 74 126 68 118 153 118 157 183 ++163 190 208 205 221 232 205 221 232 175 199 215 139 173 197 66 128 168 ++39 124 175 7 79 141 7 79 141 1 73 132 0 68 127 1 73 132 ++1 73 132 1 73 132 1 73 132 1 73 132 1 73 132 1 73 132 ++1 73 132 1 73 132 0 68 127 0 68 127 0 68 127 0 64 119 ++77 129 164 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 107 142 167 0 53 101 0 60 110 2 58 106 ++2 58 106 0 57 102 0 55 102 0 54 101 0 53 98 0 51 95 ++0 51 95 0 50 93 0 48 90 0 47 87 0 46 85 0 45 83 ++0 44 81 0 42 78 0 42 78 0 40 74 0 38 72 0 38 70 ++0 37 69 0 36 67 0 34 63 0 33 61 0 31 59 0 30 56 ++0 29 54 0 16 33 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 12 74 126 70 116 150 120 155 180 ++163 190 208 209 226 237 213 228 238 188 208 220 142 177 202 83 131 163 ++39 124 175 7 79 141 7 79 141 1 75 135 0 68 127 0 68 127 ++0 68 127 0 68 127 0 68 127 0 68 127 0 68 127 0 68 127 ++0 68 127 0 68 127 0 68 127 0 68 127 0 67 125 0 64 119 ++175 199 215 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 249 251 252 68 118 153 0 55 102 2 58 106 2 58 106 ++0 55 102 0 55 102 0 54 101 0 53 98 0 51 95 0 50 94 ++0 49 92 0 48 90 0 47 87 0 46 85 0 45 83 0 44 81 ++0 43 79 0 42 78 0 40 74 0 39 73 0 38 70 0 37 69 ++0 36 67 0 35 64 0 33 63 0 32 60 0 31 58 0 29 54 ++0 22 43 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 12 74 126 70 116 150 120 155 180 ++163 190 208 213 228 238 240 245 247 198 215 225 142 177 202 118 157 183 ++39 124 175 7 79 141 7 79 141 6 79 140 0 67 125 0 67 125 ++0 67 125 0 67 125 0 68 127 0 68 127 0 68 127 0 67 125 ++0 67 125 0 67 125 0 67 125 0 67 125 1 62 114 69 126 163 ++240 245 247 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 227 236 241 12 74 126 2 58 106 2 58 106 0 57 102 ++0 56 101 0 54 101 0 53 98 0 51 95 0 51 95 0 50 93 ++0 48 90 0 48 88 0 46 85 0 45 84 0 44 82 0 43 79 ++0 42 78 0 40 76 0 40 74 0 38 71 0 37 69 0 36 67 ++0 35 67 0 35 64 0 33 61 0 31 59 0 30 56 0 27 51 ++0 9 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 9 67 112 56 105 142 117 151 174 ++158 185 204 209 226 237 240 245 247 198 215 225 151 182 203 118 157 183 ++49 121 167 7 79 141 7 79 141 7 79 141 4 78 138 0 66 119 ++0 66 119 1 68 121 0 67 125 0 67 125 0 67 125 0 67 125 ++0 67 125 0 66 119 0 66 119 0 63 115 39 95 138 213 228 238 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 158 185 204 0 53 101 2 58 106 0 55 102 0 55 102 ++0 54 101 0 53 98 0 53 98 0 50 94 0 50 93 0 49 91 ++0 48 88 0 47 87 0 46 85 0 44 83 0 44 81 0 42 78 ++0 42 78 0 40 74 0 39 73 0 38 70 0 36 67 0 35 67 ++0 34 65 0 34 63 0 32 60 0 30 57 0 29 54 0 16 33 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 4 62 107 54 103 137 107 142 167 ++151 182 203 198 215 225 227 236 241 198 215 225 158 185 204 118 157 183 ++49 121 167 7 79 141 7 79 141 7 79 141 7 79 141 4 78 138 ++0 66 119 0 63 115 0 64 119 0 64 119 0 64 119 0 64 119 ++0 63 115 1 62 114 0 60 110 58 111 150 205 221 232 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++249 251 252 65 110 142 0 53 101 0 55 102 0 54 101 0 54 101 ++0 53 98 0 53 98 0 51 95 0 50 93 0 48 90 0 48 88 ++0 47 87 0 46 85 0 45 83 0 44 81 0 43 79 0 42 78 ++0 41 75 0 39 73 0 38 70 0 37 69 0 36 67 0 35 64 ++0 34 63 0 33 61 0 31 58 0 30 56 0 24 47 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 0 57 102 36 91 133 95 130 157 ++132 167 191 175 199 215 205 221 232 198 215 225 158 185 204 118 157 183 ++58 122 163 19 86 138 6 79 140 6 79 140 6 79 140 6 79 140 ++4 78 138 13 81 137 7 73 126 1 65 118 0 63 115 0 66 119 ++12 74 126 44 99 139 139 173 197 240 245 247 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++175 199 215 4 62 107 0 53 101 0 54 101 0 53 98 0 53 98 ++0 51 95 0 50 94 0 50 93 0 48 90 0 47 87 0 47 87 ++0 46 85 0 45 84 0 44 81 0 42 78 0 42 78 0 40 74 ++0 40 74 0 38 71 0 37 69 0 36 67 0 35 64 0 34 63 ++0 33 63 0 31 59 0 29 55 0 26 50 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 53 98 33 89 133 78 123 153 ++120 155 180 158 185 204 188 208 220 175 199 215 151 182 203 118 157 183 ++58 122 163 19 86 138 6 79 140 6 79 140 6 79 140 66 128 168 ++163 190 208 198 215 225 188 208 220 175 199 215 163 190 208 175 199 215 ++198 215 225 249 251 252 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 240 245 247 ++44 99 139 0 53 98 0 54 101 0 53 98 0 53 98 0 51 95 ++0 50 94 0 50 93 0 49 91 0 48 88 0 47 87 0 45 86 ++0 45 84 0 44 82 0 43 79 0 42 78 0 40 76 0 40 74 ++0 38 72 0 38 70 0 36 67 0 35 67 0 34 63 0 33 63 ++0 32 60 0 31 58 0 27 51 0 7 15 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 2 0 51 95 9 67 112 65 110 142 ++107 142 167 139 173 197 163 190 208 163 190 208 142 177 202 118 157 183 ++53 120 163 19 86 138 4 78 138 4 78 138 77 129 164 240 245 247 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 107 142 167 ++0 50 95 0 54 101 0 53 98 0 51 95 0 51 95 0 50 93 ++0 49 92 0 48 90 0 48 88 0 47 87 0 46 85 0 45 83 ++0 44 82 0 43 79 0 42 78 0 40 76 0 40 74 0 38 72 ++0 38 70 0 36 67 1 36 66 0 35 64 0 34 63 0 33 61 ++0 30 57 0 25 48 0 7 15 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 50 94 4 62 107 54 103 137 ++95 130 157 126 153 173 139 173 197 139 173 197 125 160 184 107 142 167 ++53 120 163 8 80 139 2 76 135 19 86 138 198 215 225 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 139 173 197 1 56 100 ++0 51 95 0 53 98 0 51 95 0 51 95 0 50 93 0 49 91 ++0 48 90 0 48 88 0 47 87 0 46 85 0 45 83 0 44 82 ++0 43 79 0 42 78 0 40 76 0 40 74 0 39 73 0 38 71 ++0 37 69 0 35 67 0 35 64 0 34 63 0 33 61 0 31 59 ++0 25 48 0 5 11 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 2 0 47 87 2 54 96 33 89 133 ++70 116 150 107 142 167 126 153 173 125 160 184 117 151 174 86 123 154 ++49 111 152 8 80 139 2 73 127 37 101 144 227 236 241 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 151 182 203 4 62 107 0 50 95 ++0 51 95 0 51 95 0 50 93 0 49 92 0 49 91 0 48 88 ++0 47 87 0 46 85 0 46 85 0 44 83 0 44 81 0 43 79 ++0 42 78 0 42 78 0 40 74 0 38 72 0 38 71 0 37 69 ++0 37 69 0 35 64 0 34 63 0 33 63 0 31 58 0 26 50 ++0 4 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 0 42 78 0 49 93 9 67 112 ++54 103 137 86 123 154 107 142 167 115 143 164 104 134 157 70 116 150 ++36 91 133 7 77 127 2 73 127 19 86 138 209 226 237 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 240 245 247 120 155 180 1 56 100 0 50 94 0 51 95 ++0 51 95 0 50 94 0 49 91 0 48 90 0 48 88 0 47 87 ++0 46 85 0 46 85 0 45 84 0 44 81 0 43 79 0 42 78 ++0 42 78 0 41 75 0 39 73 0 38 71 0 38 70 0 37 69 ++0 36 67 0 34 63 0 33 63 0 31 59 0 28 53 0 5 11 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 40 74 0 48 90 3 53 95 ++36 91 133 66 107 134 86 123 154 95 130 157 86 123 154 66 107 134 ++12 74 126 0 57 102 0 64 112 2 73 127 118 157 183 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++188 208 220 58 105 140 0 49 93 0 49 92 0 50 93 0 49 92 ++0 49 91 0 48 90 0 47 87 0 47 87 0 46 85 0 45 84 ++0 44 83 0 44 82 0 44 81 0 42 78 0 42 78 0 40 76 ++0 40 74 0 38 72 0 38 70 0 37 69 0 36 67 0 35 67 ++0 34 63 0 33 61 0 31 59 0 20 39 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 37 70 0 47 87 0 48 90 ++9 67 112 38 94 135 66 107 134 70 116 150 65 110 142 54 103 137 ++9 67 112 0 51 95 0 51 95 0 56 101 5 66 110 125 160 184 ++227 236 241 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 240 245 247 188 208 220 86 123 154 ++2 60 104 0 45 86 0 50 93 0 49 92 0 49 91 0 48 90 ++0 48 88 0 47 87 0 46 85 0 46 85 0 45 84 0 44 82 ++0 44 81 0 43 79 0 42 78 0 40 76 0 40 74 0 40 74 ++0 38 72 0 38 70 0 36 67 1 36 66 0 35 64 0 34 63 ++0 33 63 0 29 55 0 9 19 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 28 53 0 46 85 0 47 87 ++3 53 95 9 67 112 36 91 133 54 103 137 54 103 137 33 89 133 ++2 60 104 0 49 93 0 50 93 0 50 94 0 49 92 0 50 94 ++36 91 133 108 139 162 151 182 203 188 208 220 198 215 225 198 215 225 ++175 199 215 139 173 197 95 130 157 36 91 133 0 50 94 0 45 86 ++0 48 90 0 49 91 0 49 91 0 48 90 0 48 88 0 47 87 ++0 46 85 0 46 85 0 45 84 0 45 83 0 44 81 0 43 79 ++0 42 78 0 42 78 0 42 78 0 40 74 0 39 73 0 38 72 ++0 38 70 0 37 69 0 35 67 0 35 64 0 33 63 0 24 47 ++0 9 19 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 4 9 0 34 65 0 44 83 ++0 46 85 3 53 95 9 67 112 33 89 133 33 89 133 9 67 112 ++0 49 91 0 48 90 0 49 91 0 49 92 0 50 93 0 49 92 ++0 47 87 0 45 86 0 49 92 3 53 95 3 53 95 2 54 96 ++0 52 94 0 48 90 0 44 83 0 45 86 0 48 90 0 48 90 ++0 48 88 0 48 88 0 47 87 0 46 85 0 46 85 0 46 85 ++0 45 83 0 45 83 0 44 81 0 43 79 0 42 78 0 42 78 ++0 40 76 0 40 74 0 40 74 0 38 72 0 38 70 0 37 69 ++0 36 67 0 36 67 0 35 67 0 31 59 0 14 29 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 5 11 0 33 61 ++0 42 78 0 46 85 3 53 95 4 62 107 4 62 107 3 53 95 ++0 47 87 0 48 88 0 48 88 0 48 90 0 48 90 0 48 90 ++0 48 90 0 48 90 0 49 91 0 48 90 0 48 90 0 48 88 ++0 48 90 0 48 90 0 48 88 0 48 90 0 47 87 0 47 87 ++0 47 87 0 47 87 0 46 85 0 46 85 0 45 84 0 44 83 ++0 44 81 0 44 81 0 43 79 0 42 78 0 42 78 0 40 76 ++0 40 74 0 39 73 0 38 72 0 38 70 0 37 69 0 35 67 ++0 34 65 0 29 55 0 14 29 0 2 5 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 5 ++0 27 51 0 40 76 0 44 82 0 47 84 0 47 87 0 45 84 ++0 46 85 0 46 85 0 46 85 0 47 87 0 47 87 0 47 87 ++0 47 87 0 47 87 0 47 87 0 47 87 0 47 87 0 47 87 ++0 46 85 0 45 86 0 45 86 0 46 85 0 46 85 0 45 84 ++0 45 83 0 44 82 0 45 83 0 44 81 0 44 81 0 42 78 ++0 42 78 0 42 78 0 40 76 0 40 74 0 40 74 0 39 73 ++0 39 73 0 39 73 0 38 72 0 35 67 0 29 54 0 12 24 ++0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 5 11 0 14 29 0 22 43 0 27 51 0 26 50 ++0 24 47 0 29 54 0 31 58 0 36 67 0 36 67 0 40 74 ++0 40 74 0 40 74 0 44 81 0 46 85 0 47 87 0 47 87 ++0 47 87 0 47 87 0 47 87 0 47 87 0 45 86 0 46 85 ++0 45 84 0 45 84 0 45 84 0 44 83 0 44 81 0 43 79 ++0 43 79 0 42 78 0 41 75 0 38 71 0 36 67 0 34 63 ++0 16 33 0 7 15 0 5 11 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 +diff --git a/drivers/video/logo/logo_fedorasimple_clut224.ppm b/drivers/video/logo/logo_fedorasimple_clut224.ppm +new file mode 100644 +index 000000000000..b9ba699fc9d8 +--- /dev/null ++++ b/drivers/video/logo/logo_fedorasimple_clut224.ppm +@@ -0,0 +1,1123 @@ ++P3 ++80 80 ++255 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 2 0 6 11 0 11 21 0 16 30 ++0 21 39 0 25 46 0 27 49 0 27 50 0 27 49 0 25 46 ++0 21 39 0 16 30 0 11 21 0 6 11 0 1 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 9 18 ++0 22 40 0 32 61 0 41 77 0 46 87 0 50 92 0 51 95 ++0 52 95 0 52 95 0 52 95 0 52 95 0 52 95 0 52 95 ++0 52 95 0 51 95 0 50 92 0 46 87 0 41 77 0 32 61 ++0 22 40 0 9 18 0 1 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 10 18 0 26 49 0 41 77 0 49 90 ++0 52 96 0 52 95 0 51 94 0 50 93 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 93 0 51 94 0 52 95 ++0 52 96 0 49 90 0 41 75 0 26 49 0 10 18 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 ++0 17 32 0 37 70 0 49 90 0 52 96 0 51 94 0 50 92 ++0 50 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 91 0 50 92 0 51 94 0 52 96 0 49 90 0 37 70 ++0 17 32 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 1 2 0 19 35 0 41 77 ++0 51 94 0 51 95 0 50 92 0 49 91 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 50 92 0 51 95 ++0 50 93 0 41 75 0 18 34 0 1 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 13 24 0 37 71 0 51 95 0 51 94 ++0 50 92 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 50 92 0 51 94 0 51 95 0 37 71 0 13 24 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 3 6 0 29 53 0 49 91 0 51 95 0 50 92 0 49 91 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 49 91 0 50 92 0 51 95 0 49 91 0 29 53 ++0 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 22 ++0 41 77 0 51 96 0 50 92 0 49 91 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 47 90 0 47 89 0 46 89 0 47 89 0 48 90 0 49 91 ++0 50 92 0 50 92 0 50 92 0 49 91 0 50 92 0 52 96 ++0 41 77 0 12 22 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 20 37 0 47 89 ++0 51 94 0 50 91 0 50 91 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 49 91 0 46 88 0 41 85 0 40 84 0 47 90 ++7 56 98 13 61 101 13 61 101 11 59 100 0 50 93 0 41 85 ++0 41 85 0 47 89 0 49 91 0 50 92 0 50 92 0 49 91 ++0 51 95 0 47 89 0 20 37 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 0 26 50 0 50 93 0 50 93 ++0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 43 86 0 43 86 17 64 103 62 116 154 144 169 189 190 205 217 ++217 226 233 227 235 240 232 238 242 221 230 237 194 209 220 144 169 189 ++62 116 154 1 57 102 0 45 88 0 47 88 0 49 91 0 50 92 ++0 49 91 0 50 93 0 50 93 0 27 49 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 2 0 30 57 0 51 96 0 50 92 0 49 91 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 45 88 0 43 86 ++48 88 122 156 179 196 232 238 242 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 189 213 227 24 107 158 0 65 113 0 50 92 0 47 89 ++0 49 91 0 50 92 0 50 92 0 51 95 0 30 57 0 1 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 30 57 0 51 95 0 50 92 0 50 91 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 49 91 0 41 84 17 64 103 156 179 196 ++247 250 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 196 216 229 0 110 172 0 93 151 0 63 110 ++0 46 88 0 49 90 0 50 92 0 50 92 0 51 96 0 31 59 ++0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 29 53 0 51 95 0 50 92 0 50 91 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 49 91 0 40 84 59 105 139 221 230 237 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 81 154 196 0 104 168 0 107 168 ++0 78 129 0 49 91 0 48 89 0 50 92 0 50 92 0 52 95 ++0 29 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 43 ++0 51 94 0 50 92 0 50 91 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 48 91 0 40 84 89 138 172 247 250 251 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 132 174 200 0 102 165 0 108 169 ++0 110 172 0 88 143 0 50 93 0 48 90 0 50 92 0 50 92 ++0 51 94 0 23 43 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 14 27 0 49 91 ++0 50 92 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 40 84 79 130 164 252 253 254 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 81 154 196 0 102 165 0 107 168 ++0 108 169 0 110 172 0 89 144 0 49 92 0 48 90 0 50 92 ++0 50 92 0 49 91 0 14 27 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 6 11 0 44 82 0 50 93 ++0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 0 40 84 ++59 105 139 247 250 251 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 207 222 232 11 106 162 0 105 167 0 108 169 ++0 108 168 0 108 169 0 110 172 0 86 140 0 47 88 0 49 91 ++0 50 91 0 50 93 0 45 83 0 6 11 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 35 66 0 51 95 0 49 91 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 44 87 17 64 103 ++221 230 237 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 246 249 251 241 246 248 247 250 251 255 255 255 255 255 255 ++249 251 253 189 213 227 27 123 177 0 103 165 0 108 168 0 108 169 ++0 108 169 0 107 168 0 108 169 0 108 170 0 70 118 0 46 88 ++0 49 92 0 49 91 0 51 95 0 34 64 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 19 35 0 51 94 0 49 91 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 41 85 144 169 189 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 202 218 229 133 160 181 ++59 105 139 42 85 121 22 79 121 42 85 121 59 105 139 73 134 171 ++51 128 174 0 109 171 0 105 166 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 107 168 0 109 170 0 100 158 0 53 96 ++0 48 90 0 50 92 0 49 92 0 51 94 0 19 35 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 4 9 0 43 81 0 50 93 0 50 91 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 43 86 42 85 121 246 249 251 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 232 238 242 79 130 164 4 52 93 0 40 84 ++0 42 85 0 44 87 0 45 88 0 44 87 0 42 85 0 41 85 ++1 57 102 0 92 148 0 110 171 0 108 169 0 108 168 0 108 169 ++0 108 169 0 108 169 0 108 169 0 107 168 0 110 171 0 78 129 ++0 46 87 0 49 91 0 50 91 0 50 93 0 43 81 0 4 9 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 27 50 0 51 95 0 49 91 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 49 91 0 41 85 144 169 189 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 217 227 234 45 87 122 0 39 81 0 47 89 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 47 88 0 49 91 0 86 140 0 109 171 0 107 169 0 108 169 ++0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 101 162 ++0 52 96 0 48 90 0 50 92 0 49 91 0 51 95 0 27 50 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 6 11 0 47 86 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 45 88 17 64 103 227 235 240 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++236 240 243 45 87 122 0 40 84 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 48 89 0 48 90 0 88 143 0 109 171 0 107 168 ++0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 0 109 171 ++0 70 118 0 47 88 0 50 92 0 50 92 0 50 93 0 47 86 ++0 6 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 27 50 0 52 95 0 49 91 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 41 84 59 105 139 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++98 145 177 0 39 81 0 49 91 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 49 91 0 47 89 0 53 98 0 101 162 0 108 170 ++0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 110 171 ++0 86 140 0 47 88 0 49 91 0 50 92 0 49 91 0 51 95 ++0 26 50 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 7 ++0 44 84 0 50 93 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 49 91 0 40 84 133 160 181 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 217 226 233 ++7 56 98 0 46 88 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 49 91 0 46 87 0 78 129 0 110 171 ++0 107 168 0 108 169 0 108 169 0 108 169 0 108 169 0 108 170 ++0 98 155 0 50 93 0 49 90 0 50 92 0 50 92 0 50 93 ++0 44 82 0 3 7 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 37 ++0 51 95 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 48 90 0 44 87 174 198 214 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 133 160 181 ++0 40 84 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 47 89 1 57 102 0 105 166 ++0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 107 169 ++0 103 163 0 56 101 0 48 90 0 50 92 0 50 92 0 49 91 ++0 52 95 0 20 37 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 37 70 ++0 51 94 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 48 90 0 48 91 202 218 229 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 62 116 154 ++0 40 84 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 48 90 0 51 93 0 98 155 ++0 108 170 0 108 169 0 108 169 0 108 169 0 108 169 0 108 168 ++0 107 168 0 62 109 0 48 89 0 50 92 0 50 92 0 50 92 ++0 51 94 0 37 70 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 8 14 0 48 89 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 89 4 52 93 217 226 233 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 42 85 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 48 90 0 92 148 ++0 109 171 0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 ++0 108 169 0 64 111 0 47 88 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 89 0 8 14 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 21 39 0 52 95 ++0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 46 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 48 90 0 92 148 ++0 109 171 0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 ++0 108 169 0 64 111 0 47 88 0 50 92 0 50 92 0 50 92 ++0 49 91 0 52 95 0 21 39 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 34 64 0 51 94 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 48 90 0 51 93 0 98 155 ++0 108 170 0 108 169 0 108 169 0 108 169 0 108 169 0 108 168 ++0 107 168 0 62 109 0 48 89 0 50 92 0 50 92 0 50 92 ++0 50 92 0 51 94 0 34 62 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 2 4 0 43 81 0 50 93 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 47 89 1 57 102 0 105 166 ++0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 107 169 ++0 103 165 0 57 101 0 48 90 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 93 0 43 81 0 2 4 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 10 19 0 48 90 0 49 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 49 91 0 46 87 0 76 127 0 109 171 ++0 107 168 0 108 169 0 108 169 0 108 169 0 108 169 0 108 170 ++0 99 157 0 51 93 0 49 90 0 50 92 0 50 92 0 50 92 ++0 50 92 0 49 92 0 48 90 0 9 18 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 17 32 0 51 95 0 50 91 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 49 91 0 48 89 0 53 96 0 100 158 0 108 170 ++0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 109 171 ++0 86 140 0 47 88 0 49 91 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 91 0 51 95 0 17 32 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 25 47 0 52 95 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 48 90 0 48 89 0 86 140 0 109 171 0 107 168 ++0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 0 109 171 ++0 70 118 0 47 88 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 52 95 0 25 46 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 31 59 0 51 95 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 47 89 0 48 89 0 78 129 0 109 170 0 108 169 0 108 169 ++0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 101 162 ++0 53 96 0 48 90 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 51 95 0 31 59 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 35 66 0 51 94 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 49 91 0 49 91 ++0 48 90 0 47 89 0 47 89 0 47 89 0 47 89 0 47 89 ++0 47 89 0 44 87 4 54 96 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 42 85 121 ++0 40 84 0 47 89 0 47 89 0 47 89 0 47 89 0 47 89 ++0 47 89 0 48 90 0 49 90 0 48 90 0 47 88 0 46 87 ++0 57 101 0 89 144 0 109 171 0 108 169 0 107 168 0 108 169 ++0 108 169 0 108 169 0 108 169 0 107 168 0 110 171 0 78 129 ++0 47 88 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 51 94 0 35 66 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 41 75 0 50 93 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 48 90 0 47 88 0 47 88 0 49 90 0 51 94 0 48 92 ++0 49 93 10 58 99 13 61 101 13 61 101 13 61 101 13 61 101 ++13 61 101 11 59 100 17 64 103 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 133 160 181 ++13 56 97 13 61 101 13 61 101 13 61 101 13 61 101 13 61 101 ++13 61 101 0 52 95 0 48 92 1 55 99 0 65 113 0 86 140 ++0 103 163 0 110 171 0 108 169 0 107 168 0 108 169 0 108 169 ++0 108 169 0 108 169 0 107 168 0 109 170 0 101 162 0 53 96 ++0 48 89 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 93 0 41 75 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 42 79 0 49 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 48 89 0 47 89 ++1 55 99 0 70 118 0 86 140 0 92 148 0 93 151 51 128 174 ++174 198 214 221 230 237 229 236 240 229 235 240 229 235 240 229 235 240 ++229 235 240 229 235 240 229 236 240 250 252 253 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++232 238 242 229 235 240 229 235 240 229 235 240 229 235 240 229 236 240 ++227 235 240 189 213 227 81 154 196 0 101 162 0 108 169 0 110 172 ++0 108 170 0 107 168 0 108 169 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 168 0 108 169 0 108 170 0 70 118 0 46 87 ++0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 49 92 0 42 79 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 43 81 0 50 93 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 48 89 0 48 89 0 62 109 0 86 140 ++0 103 163 0 110 171 0 110 172 0 105 167 51 128 174 239 246 249 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 132 174 200 0 102 165 0 107 168 ++0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 ++0 108 168 0 107 169 0 110 172 0 86 140 0 47 89 0 49 91 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 93 0 43 81 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 49 91 0 46 88 0 56 101 0 86 140 0 107 168 0 110 172 ++0 108 170 0 108 169 0 105 167 0 107 168 196 216 229 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 239 246 249 27 123 177 0 105 167 ++0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 ++0 108 169 0 110 172 0 89 144 0 50 92 0 48 90 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 49 92 0 42 81 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 47 88 0 70 118 0 103 163 0 110 172 0 108 169 0 107 168 ++0 108 169 0 108 169 0 105 167 27 123 177 241 246 248 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 81 154 196 0 102 165 ++0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 0 108 169 ++0 110 172 0 88 143 0 50 93 0 48 90 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 93 0 41 77 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 0 47 88 ++0 76 127 0 108 169 0 109 170 0 107 168 0 108 169 0 108 169 ++0 108 169 0 108 169 0 105 167 27 123 177 241 246 248 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 81 154 196 0 102 165 ++0 108 169 0 108 169 0 107 168 0 108 169 0 109 171 0 107 168 ++0 78 129 0 49 91 0 48 89 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 51 94 0 37 70 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 47 88 0 76 127 ++0 109 171 0 108 169 0 107 168 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 107 168 0 107 168 196 216 229 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 239 246 249 27 123 177 0 105 167 ++0 108 169 0 108 169 0 110 171 0 109 171 0 94 151 0 63 110 ++0 46 88 0 49 90 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 51 94 0 34 62 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 50 92 0 49 91 0 46 88 0 70 118 0 108 170 ++0 108 169 0 107 168 0 108 169 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 107 168 0 103 165 51 128 174 239 246 249 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 132 174 200 0 104 168 0 109 172 ++0 110 172 0 105 167 0 92 148 0 70 118 0 49 92 0 47 89 ++0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 52 95 0 28 52 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 50 92 0 47 89 0 57 101 0 103 163 0 108 170 ++0 107 168 0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 ++0 107 168 0 108 169 0 110 171 0 109 171 0 101 162 51 128 174 ++174 198 214 221 230 237 229 236 240 229 235 240 229 235 240 229 235 240 ++229 235 240 229 235 240 250 252 253 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 232 238 242 ++229 235 240 229 235 240 229 235 240 229 235 240 229 235 240 229 236 240 ++227 235 240 189 213 227 81 154 196 0 98 155 0 93 151 0 86 140 ++0 72 121 1 57 102 0 48 90 0 47 88 0 49 91 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 52 95 0 20 37 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 49 91 0 48 89 0 88 143 0 110 171 0 107 168 ++0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 ++0 109 171 0 108 169 0 89 144 0 70 118 1 57 102 0 49 93 ++0 49 93 10 58 99 13 61 101 13 61 101 13 61 101 13 61 101 ++13 61 101 13 56 97 59 105 139 243 247 249 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 59 105 139 ++13 56 97 13 61 101 13 61 101 13 61 101 13 61 101 13 61 101 ++13 61 101 0 52 95 0 48 92 0 51 94 0 49 91 0 47 88 ++0 47 88 0 48 90 0 49 91 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 49 91 0 49 92 0 12 22 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 47 88 0 64 111 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 0 109 172 ++0 98 155 0 64 111 0 47 89 0 47 88 0 48 89 0 49 90 ++0 48 90 0 47 89 0 47 89 0 47 89 0 47 89 0 47 89 ++0 47 89 0 44 87 0 51 94 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 45 87 122 ++0 40 84 0 47 89 0 47 89 0 47 89 0 47 89 0 47 89 ++0 47 89 0 48 90 0 49 91 0 49 91 0 49 91 0 49 91 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 45 85 0 4 9 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 49 91 0 48 89 0 88 143 0 110 171 0 107 168 0 108 169 ++0 108 169 0 108 169 0 108 169 0 107 168 0 109 171 0 93 151 ++0 53 96 0 46 87 0 49 91 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 6 55 97 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 51 94 0 37 70 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 48 90 0 57 101 0 103 163 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 107 168 0 109 170 0 99 157 0 53 96 ++0 47 88 0 49 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 91 0 52 95 0 26 49 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 46 88 0 72 121 0 109 171 0 107 168 0 108 169 0 108 169 ++0 108 169 0 108 169 0 108 168 0 108 169 0 65 113 0 46 87 ++0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 49 92 0 50 93 0 12 22 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 ++0 47 88 0 86 140 0 110 172 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 109 171 0 92 148 0 48 90 0 48 90 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 93 0 41 77 0 1 3 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 48 90 ++0 49 91 0 94 151 0 109 171 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 109 171 0 72 121 0 46 88 0 49 91 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 52 95 0 26 49 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 ++0 51 94 0 100 158 0 109 170 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 168 0 107 168 0 62 109 0 47 89 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 7 56 98 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 48 89 0 8 14 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 ++0 53 96 0 101 162 0 108 169 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 105 166 1 55 99 0 48 90 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 47 90 6 55 97 220 228 234 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 48 88 122 ++0 42 85 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 0 51 95 ++0 34 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 ++0 52 96 0 101 162 0 108 169 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 103 165 1 55 99 0 48 90 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 46 89 10 58 99 221 230 237 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 252 253 254 42 85 121 ++0 43 86 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 12 22 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 ++0 51 94 0 100 158 0 109 170 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 168 0 105 167 0 62 109 0 47 89 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 44 87 17 74 116 238 243 246 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 243 247 249 42 85 121 ++0 44 87 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 51 95 0 35 66 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 48 90 ++0 49 91 0 94 151 0 109 171 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 109 171 0 72 121 0 46 88 0 49 91 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 41 85 59 105 139 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 227 235 240 17 64 103 ++0 45 88 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 47 89 0 10 19 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 49 91 ++0 47 88 0 86 140 0 110 172 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 109 171 0 92 148 0 48 90 0 48 90 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 49 91 0 41 85 156 179 196 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 194 209 220 0 48 90 ++0 47 90 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 49 91 0 51 95 0 28 52 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 46 88 0 72 121 0 109 171 0 107 168 0 108 169 0 108 169 ++0 108 169 0 108 169 0 108 168 0 108 169 0 65 113 0 46 87 ++0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 41 84 45 87 122 243 247 249 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 133 160 181 0 40 84 ++0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 49 91 0 50 93 0 42 79 0 3 7 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 48 90 0 57 101 0 103 165 0 108 169 0 108 169 0 108 169 ++0 108 169 0 108 169 0 107 168 0 109 170 0 99 157 0 53 96 ++0 47 88 0 49 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 44 87 ++6 55 97 190 205 217 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 59 105 139 0 41 85 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 91 0 50 92 0 49 91 0 14 27 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 49 91 0 48 89 0 89 144 0 110 171 0 107 168 0 108 169 ++0 108 169 0 108 169 0 108 169 0 107 168 0 109 171 0 94 151 ++0 53 96 0 46 87 0 49 91 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 41 84 13 56 97 ++155 189 209 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 207 222 232 6 55 97 0 46 89 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 49 92 0 52 95 0 25 47 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 47 88 0 64 111 0 108 169 0 108 168 0 108 169 ++0 108 169 0 108 169 0 108 169 0 108 169 0 107 168 0 110 171 ++0 99 157 0 64 111 0 43 86 0 42 85 0 44 87 0 46 88 ++0 46 88 0 44 87 0 40 84 0 43 86 59 105 139 194 209 220 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 89 138 172 0 40 84 0 49 91 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 51 95 0 34 64 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 49 91 0 48 90 0 89 144 0 110 171 0 107 168 ++0 108 169 0 108 169 0 108 169 0 108 169 0 108 169 0 105 167 ++0 104 168 27 123 177 58 125 166 56 105 141 42 85 121 17 64 103 ++17 64 103 45 87 122 79 130 164 174 198 214 250 252 253 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 207 222 232 10 58 99 0 47 89 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 0 51 95 ++0 39 74 0 3 7 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 50 92 0 47 89 1 57 102 0 103 163 0 108 170 ++0 107 168 0 108 169 0 108 169 0 108 169 0 105 167 0 110 171 ++156 192 214 239 246 249 255 255 255 255 255 255 247 250 251 238 243 246 ++238 243 246 249 251 253 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 252 253 254 59 105 139 0 41 84 0 49 91 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 51 95 0 42 79 ++0 6 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 50 92 0 49 91 0 46 88 0 70 118 0 109 170 ++0 108 169 0 107 168 0 108 169 0 107 168 0 103 165 156 192 214 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 133 160 181 0 41 85 0 49 91 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 49 91 0 51 95 0 41 77 0 7 14 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 50 93 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 47 88 0 78 129 ++0 109 171 0 108 169 0 107 168 0 105 166 27 123 177 241 246 248 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++156 179 196 0 48 91 0 47 89 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 49 91 0 50 92 0 51 95 0 38 73 0 6 11 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 44 82 0 49 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 0 47 89 ++0 78 129 0 109 170 0 109 170 0 102 165 51 128 174 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 156 179 196 ++4 52 93 0 46 88 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 50 92 0 51 96 0 34 62 0 3 6 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 41 77 0 50 93 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 47 88 0 70 118 0 103 163 0 107 169 27 123 177 243 247 249 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 247 250 251 133 160 181 0 47 90 ++0 46 88 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 91 0 50 91 0 51 94 ++0 49 91 0 25 47 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 34 62 0 51 94 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 49 91 0 46 88 1 57 102 0 88 143 0 105 167 156 192 214 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 190 205 217 59 105 139 0 41 84 0 47 90 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 49 91 0 50 93 0 51 96 0 41 77 ++0 13 24 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 19 35 0 52 95 0 49 91 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 48 89 0 48 89 0 62 109 12 92 143 ++156 192 214 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 249 251 253 ++190 205 217 79 130 164 0 51 93 0 42 85 0 49 91 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 49 91 0 50 92 0 51 95 0 48 89 0 27 50 0 3 6 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 3 6 0 42 79 0 50 93 ++0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 49 91 0 48 89 0 45 88 ++0 53 98 56 105 141 144 169 189 194 209 220 225 233 238 236 240 243 ++236 240 243 227 235 240 202 218 229 155 189 209 98 145 177 42 85 121 ++0 47 90 0 41 85 0 48 90 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 91 0 50 93 ++0 51 95 0 49 90 0 34 62 0 9 18 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 16 30 0 49 92 ++0 50 93 0 49 91 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 49 91 ++0 48 90 0 42 85 0 41 85 0 50 92 11 59 100 17 64 103 ++17 64 103 11 59 100 0 53 95 0 43 86 0 40 84 0 44 87 ++0 48 91 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 49 91 0 50 92 0 51 94 0 52 96 0 47 88 ++0 32 61 0 11 21 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 40 ++0 49 92 0 51 94 0 50 92 0 50 91 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 49 91 0 48 90 0 47 89 0 46 89 ++0 46 89 0 47 89 0 48 90 0 49 91 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 ++0 50 92 0 50 92 0 50 92 0 50 92 0 50 92 0 50 93 ++0 51 95 0 52 96 0 49 91 0 41 75 0 25 46 0 8 14 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 16 30 0 42 79 0 51 95 0 51 95 0 51 93 0 50 93 ++0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 ++0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 ++0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 ++0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 ++0 50 93 0 50 93 0 50 93 0 50 93 0 50 93 0 51 93 ++0 51 94 0 52 95 0 52 95 0 52 95 0 50 92 0 45 85 ++0 37 70 0 25 46 0 10 19 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 3 6 0 18 34 0 32 61 0 41 77 0 44 82 ++0 44 82 0 45 82 0 45 82 0 45 82 0 45 82 0 45 82 ++0 45 82 0 45 82 0 45 82 0 45 82 0 45 82 0 45 82 ++0 45 82 0 45 82 0 45 82 0 45 82 0 45 82 0 45 82 ++0 45 82 0 45 82 0 45 82 0 45 83 0 45 83 0 45 83 ++0 45 82 0 45 82 0 45 82 0 44 82 0 42 81 0 41 77 ++0 37 70 0 32 61 0 27 50 0 19 35 0 11 21 0 3 7 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 +diff --git a/drivers/video/logo/logo_gentoo_clut224.ppm b/drivers/video/logo/logo_gentoo_clut224.ppm +new file mode 100644 +index 000000000000..6163d9fcc4c8 +--- /dev/null ++++ b/drivers/video/logo/logo_gentoo_clut224.ppm +@@ -0,0 +1,803 @@ ++P3 ++76 80 ++255 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++152 135 250 152 139 239 151 142 225 151 143 219 154 147 213 154 147 213 154 147 213 154 147 213 ++154 147 213 154 147 213 151 143 219 157 148 227 157 148 227 152 139 239 158 154 250 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 145 246 151 142 225 154 147 213 ++156 149 204 156 149 199 156 149 199 156 149 199 156 149 199 156 149 199 156 149 204 156 149 204 ++156 149 204 156 149 204 156 149 204 154 147 213 154 147 213 154 147 213 151 142 225 152 139 239 ++152 139 239 158 154 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 157 148 227 151 143 219 156 149 204 156 149 199 165 162 202 ++186 183 208 199 194 238 219 217 229 221 219 238 245 245 249 252 252 253 255 255 255 255 255 255 ++248 248 253 235 234 251 212 211 246 199 194 238 162 161 213 151 142 225 151 143 219 151 143 219 ++151 142 225 152 139 239 152 139 239 152 135 250 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 159 151 238 151 143 219 156 149 204 165 162 202 186 181 225 231 231 244 253 253 255 ++254 254 255 253 253 254 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++253 253 254 249 249 254 245 245 249 242 242 252 241 240 252 223 222 249 185 182 243 151 142 225 ++151 142 225 149 138 231 146 136 235 152 139 239 152 135 250 152 135 250 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155 145 246 ++151 142 225 156 149 204 156 149 204 206 201 229 244 244 253 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++254 254 254 251 251 254 248 248 253 244 244 253 241 240 252 237 237 251 233 232 250 225 225 249 ++190 187 243 159 151 238 146 135 237 146 135 237 146 135 237 146 133 248 146 133 248 136 134 248 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149 138 231 154 147 213 ++156 149 204 171 166 233 239 238 247 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 252 252 254 249 249 254 245 245 253 242 242 252 238 238 252 235 234 251 231 231 250 ++228 227 250 223 222 249 185 182 243 146 133 243 146 133 248 144 131 244 146 133 248 146 133 248 ++146 133 248 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 152 139 239 157 148 227 154 147 213 154 147 213 ++206 201 229 253 253 254 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 253 253 254 250 250 254 246 246 253 243 243 252 239 239 252 236 236 251 233 232 250 ++229 228 250 225 225 249 222 222 249 213 212 247 176 171 244 146 133 248 146 133 248 146 133 248 ++146 133 248 146 133 248 136 134 248 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 155 145 246 151 142 225 154 147 213 157 148 227 227 227 249 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 254 254 254 251 251 254 248 248 253 244 244 253 240 240 252 237 236 251 234 233 251 ++230 229 251 226 225 249 223 222 249 219 218 248 216 216 248 203 200 248 167 159 246 152 135 250 ++152 135 250 152 135 250 152 135 250 146 133 248 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 152 139 239 151 142 225 151 142 225 180 177 239 245 245 249 254 254 254 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 252 252 254 248 248 253 245 244 253 241 241 252 237 237 251 234 234 251 ++231 230 250 227 227 249 224 224 249 219 218 248 216 216 248 213 212 247 210 209 246 189 186 247 ++158 154 250 155 145 246 155 145 246 152 135 250 146 133 248 146 133 248 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 152 139 239 151 142 225 151 142 225 199 194 238 254 254 254 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 253 253 254 249 249 254 246 245 253 242 242 252 238 238 252 235 234 251 ++231 231 250 228 227 250 224 224 249 221 220 248 218 217 247 213 213 247 210 209 246 206 205 245 ++201 199 246 171 166 245 155 145 246 158 149 246 155 145 246 146 133 248 146 133 248 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++146 133 243 149 138 231 149 138 231 213 212 247 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 253 253 254 250 250 254 246 246 253 243 243 252 239 239 252 236 236 251 ++233 232 250 229 228 250 225 224 250 221 221 248 218 217 247 214 214 247 210 209 246 207 206 246 ++203 203 245 200 199 244 185 183 243 163 156 246 160 152 246 160 152 246 155 145 246 146 133 248 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 152 139 239 ++146 135 237 146 136 235 215 214 247 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 254 254 254 251 251 254 248 248 253 243 243 252 240 240 252 236 236 251 ++233 232 250 229 229 250 226 225 249 222 222 249 218 218 248 215 214 247 210 209 246 208 208 246 ++204 203 245 200 199 244 197 196 244 189 187 243 169 163 245 164 155 247 163 156 246 158 149 246 ++146 133 248 146 133 243 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 146 133 248 146 133 243 ++146 135 237 203 200 248 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 251 251 254 248 248 253 244 244 253 241 240 252 237 237 251 ++234 233 251 230 229 251 226 225 249 223 222 249 219 218 248 215 215 247 212 211 246 208 208 246 ++204 203 245 201 200 245 197 196 244 194 193 243 190 188 243 176 171 244 167 159 246 168 162 245 ++165 158 245 146 133 243 144 131 244 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 158 154 250 146 133 248 146 133 243 ++184 179 247 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 252 252 254 248 248 253 245 244 253 241 241 252 237 237 251 ++234 234 251 230 230 250 227 227 249 223 223 249 219 218 248 215 215 247 212 211 246 208 208 246 ++204 204 245 201 200 245 197 196 244 194 193 243 190 188 243 188 186 243 181 177 244 171 166 245 ++171 166 245 171 166 245 155 145 246 144 131 244 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 146 133 248 144 131 244 164 155 247 ++253 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 244 244 253 230 230 250 221 220 248 220 219 250 234 233 251 238 238 252 ++234 234 251 231 230 250 227 227 249 223 223 249 219 218 248 216 216 248 213 212 247 209 208 246 ++204 204 245 201 201 245 198 197 244 194 193 243 191 190 243 188 187 243 186 184 243 182 180 243 ++175 170 244 174 170 244 175 170 244 160 152 246 146 133 243 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 146 133 248 146 133 248 146 133 248 234 233 253 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 251 251 254 228 227 250 204 204 245 185 183 243 189 186 247 ++212 210 249 231 231 250 227 227 249 224 224 249 219 218 248 216 216 248 213 212 247 209 208 246 ++206 205 245 201 201 245 198 197 244 195 194 243 191 190 243 188 187 243 186 184 243 184 182 243 ++181 177 244 178 174 244 178 174 244 178 175 244 168 162 245 146 135 237 145 140 230 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 146 133 248 146 133 248 189 186 247 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 244 244 253 218 217 247 191 190 243 176 171 244 ++160 152 246 171 164 246 217 216 247 224 224 249 221 220 248 216 216 248 213 212 247 209 208 246 ++206 205 245 201 201 245 199 198 244 195 194 243 191 190 243 188 187 243 186 185 243 184 182 243 ++182 180 243 180 177 244 180 177 244 181 177 244 182 180 243 176 171 244 152 139 239 146 135 230 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 146 133 248 152 135 250 155 145 246 242 241 253 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 251 251 254 224 224 249 196 195 244 178 175 244 ++163 156 246 152 135 250 149 138 231 206 201 229 221 220 248 216 216 248 213 213 247 210 209 246 ++206 205 245 201 201 245 199 198 244 195 194 243 191 190 243 188 187 243 186 185 243 184 182 243 ++183 180 243 181 177 244 178 175 244 182 180 243 185 183 243 185 183 243 180 177 244 152 139 239 ++146 136 235 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 146 133 248 155 145 246 184 179 247 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 246 246 253 217 214 250 212 208 248 220 219 250 218 217 247 195 194 243 178 174 244 ++163 156 246 146 133 248 151 142 225 156 149 199 165 162 202 220 219 250 213 213 247 210 209 246 ++206 205 245 201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 182 243 ++183 180 243 181 177 244 178 175 244 177 172 244 183 180 243 188 187 243 189 187 243 185 183 243 ++159 151 238 146 135 237 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 146 133 248 152 135 250 155 145 246 220 219 250 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++243 243 253 155 145 246 146 133 243 146 133 243 146 133 243 146 135 237 158 149 246 166 159 245 ++159 150 246 146 133 248 151 143 219 151 143 191 105 99 142 186 183 208 213 213 247 210 209 246 ++207 206 246 201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 182 243 ++183 180 243 181 177 244 178 175 244 176 172 244 174 170 244 185 183 243 193 191 243 194 193 243 ++193 191 243 159 151 238 146 136 235 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 146 133 248 155 145 246 158 149 246 248 247 254 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 254 254 255 248 248 253 255 255 255 255 255 255 255 255 255 ++189 186 247 146 133 243 146 135 237 146 133 243 146 135 237 146 133 243 146 135 237 146 135 237 ++146 133 243 146 135 237 154 147 213 134 128 170 88 84 126 88 84 126 199 194 238 210 209 246 ++207 206 246 201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 182 243 ++183 180 243 181 177 244 178 175 244 176 172 244 174 170 244 173 167 245 189 187 243 199 198 244 ++201 200 245 199 198 244 159 151 238 145 140 230 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 146 133 248 160 152 246 165 158 245 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 246 246 253 219 218 248 234 233 251 243 243 252 248 248 253 ++152 139 239 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 ++146 135 237 146 136 235 156 149 199 114 106 151 82 76 118 82 76 118 142 137 174 210 209 246 ++207 206 246 201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 182 243 ++183 180 243 181 177 244 178 175 244 176 172 244 174 170 244 172 167 245 171 166 245 193 191 243 ++206 205 245 207 206 246 209 209 245 159 151 238 146 135 230 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 146 133 248 144 131 244 163 156 246 165 158 245 254 253 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 244 244 253 190 188 243 201 200 245 208 208 246 207 206 246 ++146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 146 135 237 ++146 135 237 146 136 235 136 128 204 95 88 132 82 76 118 82 76 118 100 95 138 210 209 246 ++207 206 246 201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 182 243 ++183 180 243 181 177 244 178 175 244 176 172 244 174 170 244 172 167 245 171 166 245 169 163 245 ++199 198 244 212 211 246 213 212 247 209 209 245 157 148 227 151 137 225 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 144 131 244 146 133 248 167 159 246 167 159 246 234 233 253 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 184 179 247 177 172 244 181 177 244 182 180 243 ++152 139 239 146 135 237 146 135 237 146 136 235 146 136 235 146 136 235 146 136 235 146 136 235 ++146 136 235 146 136 235 146 136 235 82 76 118 82 76 118 82 76 118 88 84 126 210 209 246 ++206 205 245 201 201 245 199 198 244 195 194 243 191 190 243 189 187 243 187 185 243 185 182 243 ++183 180 243 181 177 244 178 175 244 176 172 244 174 170 244 172 167 245 171 166 245 168 162 245 ++169 163 245 207 206 246 218 218 248 221 220 248 212 211 246 157 148 227 161 137 216 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 144 131 244 144 131 244 163 156 246 169 163 245 189 186 247 253 253 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 217 214 250 159 150 246 160 152 246 163 156 246 ++158 149 246 146 135 230 146 136 235 146 136 235 146 136 235 149 138 231 146 136 235 149 138 231 ++149 138 231 149 138 231 146 135 230 82 76 118 82 76 118 82 76 118 110 102 146 210 209 246 ++206 205 245 201 201 245 199 198 244 195 194 243 191 190 243 188 187 243 186 185 243 184 182 243 ++182 180 243 180 177 244 178 174 244 176 172 244 174 170 244 172 167 245 169 163 245 168 162 245 ++166 159 245 171 164 246 216 216 248 224 224 249 226 225 249 215 214 247 157 148 227 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 146 133 243 146 133 243 155 145 246 172 167 245 173 167 245 199 196 246 251 251 254 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 254 254 255 195 192 247 144 131 244 146 133 248 ++144 131 244 146 133 243 146 136 235 151 137 225 145 140 230 146 135 230 149 138 231 149 138 231 ++149 138 231 146 135 230 113 109 162 82 76 118 82 76 118 82 76 118 165 162 202 209 208 246 ++206 205 245 201 201 245 199 198 244 195 194 243 191 190 243 188 187 243 186 185 243 184 182 243 ++182 180 243 180 177 244 178 174 244 176 172 244 174 170 244 172 167 245 169 163 245 168 162 245 ++166 159 245 163 156 246 175 170 244 226 225 249 231 230 250 233 232 250 209 209 245 151 142 225 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 146 133 243 146 135 237 146 135 237 166 159 245 176 171 244 176 172 244 189 186 247 ++242 241 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 255 206 201 229 154 147 213 ++154 147 213 156 149 204 156 149 199 151 143 191 126 124 174 0 0 0 0 0 0 146 135 230 ++149 138 231 126 124 174 82 76 118 82 76 118 82 76 118 131 126 164 212 211 246 209 208 246 ++204 204 245 201 201 245 198 197 244 194 193 243 191 190 243 188 187 243 186 184 243 184 182 243 ++182 180 243 180 177 244 178 174 244 176 172 244 174 170 244 172 167 245 169 163 245 168 162 245 ++167 159 246 163 156 246 164 155 247 184 179 247 237 236 251 237 236 251 237 237 251 199 194 238 ++151 143 219 0 0 0 0 0 0 0 0 0 ++0 0 0 146 135 237 146 133 243 146 135 237 152 139 239 174 170 244 179 175 244 180 177 244 ++182 180 243 220 219 250 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 219 217 229 ++142 137 174 114 108 147 102 97 140 95 88 132 82 76 118 82 76 118 82 76 118 82 76 118 ++95 88 132 82 76 118 82 76 118 82 76 118 142 137 174 212 211 246 213 212 247 209 208 246 ++204 204 245 201 201 245 198 197 244 194 193 243 191 190 243 188 187 243 186 184 243 184 182 243 ++182 180 243 180 177 244 178 174 244 176 171 244 174 170 244 171 166 245 169 163 245 168 162 245 ++167 159 246 164 155 247 163 156 246 160 152 246 212 208 248 242 242 252 242 242 252 241 240 252 ++171 166 233 151 143 219 0 0 0 0 0 0 ++0 0 0 0 0 0 146 135 237 146 135 237 146 135 237 152 139 239 176 172 244 183 180 243 ++183 180 243 184 182 243 196 194 246 234 234 251 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++252 252 253 186 183 208 122 118 142 82 76 118 82 76 118 82 76 118 82 76 118 82 76 118 ++82 76 118 82 76 118 114 106 151 186 181 225 223 223 249 215 215 247 212 211 246 208 208 246 ++204 204 245 201 200 245 197 196 244 194 193 243 190 188 243 188 186 243 186 184 243 184 182 243 ++182 180 243 180 177 244 178 174 244 176 171 244 174 170 244 171 166 245 169 163 245 168 162 245 ++167 159 246 163 156 246 163 156 246 159 150 246 164 155 247 242 241 253 248 248 253 251 250 252 ++231 231 244 154 147 213 0 0 0 0 0 0 ++0 0 0 0 0 0 146 135 237 146 136 235 146 136 235 146 136 235 149 138 231 174 170 244 ++186 184 243 187 185 243 187 186 243 188 186 243 204 204 246 242 241 253 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 219 217 229 165 162 202 131 126 164 114 108 147 114 108 147 ++142 137 174 206 201 229 227 227 249 224 224 249 219 218 248 215 214 247 212 211 246 208 208 246 ++204 203 245 201 200 245 197 196 244 193 191 243 190 188 243 187 186 243 186 184 243 184 182 243 ++181 177 244 180 177 244 178 174 244 176 171 244 173 167 245 171 166 245 169 163 245 168 162 245 ++165 158 245 163 156 246 160 152 246 160 152 246 158 149 246 195 192 247 253 253 254 254 254 254 ++254 253 255 199 194 238 154 147 213 0 0 0 ++0 0 0 0 0 0 0 0 0 146 136 235 146 136 235 149 138 231 149 138 231 149 138 231 ++171 166 233 187 185 243 190 188 243 192 191 243 193 191 243 194 193 243 215 215 247 246 246 253 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 254 254 254 252 252 253 251 250 252 245 245 249 240 240 252 236 236 251 ++231 231 250 227 227 249 224 224 249 221 221 248 218 218 248 214 214 247 210 209 246 207 206 246 ++204 203 245 200 199 244 196 195 244 193 191 243 189 187 243 187 186 243 185 183 243 183 181 243 ++181 177 244 179 175 244 177 172 244 175 170 244 173 167 245 171 166 245 169 163 245 168 162 245 ++165 158 245 163 156 246 160 152 246 159 150 246 158 149 246 159 150 246 248 247 254 255 255 255 ++255 255 255 239 238 247 154 147 213 0 0 0 ++0 0 0 0 0 0 0 0 0 146 135 230 149 138 231 146 136 235 149 138 231 149 138 231 ++146 136 235 157 148 227 185 182 243 197 196 244 198 197 244 199 198 244 200 199 244 201 200 245 ++219 218 248 245 245 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 253 253 254 250 250 254 246 246 253 243 243 252 239 239 252 235 234 251 ++233 232 250 228 227 250 225 224 250 221 220 248 218 217 247 213 213 247 210 209 246 207 206 246 ++203 203 245 199 198 244 196 195 244 192 191 243 189 187 243 187 186 243 185 183 243 183 180 243 ++181 177 244 179 175 244 178 174 244 175 170 244 173 167 245 171 166 245 169 163 245 167 159 246 ++165 158 245 163 156 246 160 152 246 159 150 246 158 149 246 155 145 246 220 219 250 255 255 255 ++255 255 255 253 253 255 186 181 225 154 147 213 ++0 0 0 0 0 0 0 0 0 0 0 0 149 138 231 149 138 231 149 138 231 149 138 231 ++149 138 231 149 138 231 149 138 231 171 166 233 197 196 244 204 203 245 204 204 245 207 206 246 ++207 206 246 209 208 246 223 222 249 244 244 253 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 252 252 254 249 249 254 245 245 253 242 242 252 238 238 252 235 234 251 ++231 231 250 228 227 250 224 224 249 221 220 248 216 216 248 213 212 247 210 209 246 206 205 245 ++201 201 245 199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 183 243 183 180 243 ++181 177 244 179 175 244 177 172 244 175 170 244 173 167 245 171 166 245 168 162 245 167 159 246 ++165 158 245 163 156 246 160 152 246 159 150 246 158 149 246 155 145 246 203 200 248 254 254 255 ++255 255 255 255 255 255 199 194 238 156 149 204 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 151 142 225 149 138 231 151 137 225 ++149 138 231 151 137 225 151 137 225 151 142 225 151 142 225 180 177 239 207 206 246 212 211 246 ++213 212 247 213 213 247 215 214 247 215 215 247 226 225 249 244 244 253 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 251 251 254 248 248 253 244 244 253 241 241 252 237 237 251 234 234 251 ++230 230 250 227 227 249 223 223 249 219 218 248 216 216 248 213 212 247 209 208 246 204 204 245 ++201 201 245 198 197 244 195 194 243 191 190 243 188 187 243 186 185 243 184 182 243 182 180 243 ++181 177 244 178 175 244 176 172 244 174 170 244 172 167 245 171 166 245 168 162 245 167 159 246 ++165 158 245 163 156 246 160 152 246 159 150 246 155 145 246 155 145 246 207 205 248 255 255 255 ++255 255 255 255 255 255 206 201 229 156 149 204 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 151 137 225 151 142 225 ++151 142 225 151 142 225 151 142 225 151 137 225 151 142 225 151 142 225 157 148 227 185 182 243 ++214 214 247 219 218 248 219 218 248 221 220 248 222 222 249 223 223 249 230 230 250 245 245 253 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 254 254 254 250 250 254 248 248 253 243 243 252 240 240 252 236 236 251 234 233 251 ++229 229 250 226 225 249 222 222 249 219 218 248 215 215 247 212 211 246 208 208 246 204 204 245 ++201 200 245 197 196 244 194 193 243 190 188 243 188 187 243 186 184 243 184 182 243 182 180 243 ++180 177 244 178 174 244 176 172 244 174 170 244 172 167 245 169 163 245 168 162 245 166 159 245 ++163 156 246 163 156 246 160 152 246 158 149 246 155 145 246 155 145 246 224 222 251 255 255 255 ++255 255 255 255 255 255 186 181 225 156 149 204 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 136 134 248 ++151 142 225 151 142 225 151 142 225 151 142 225 151 142 225 151 137 225 151 143 219 151 143 219 ++157 148 227 186 184 243 218 217 247 226 225 249 227 227 249 228 227 250 229 229 250 230 230 250 ++235 234 251 251 250 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 253 253 254 249 249 254 246 246 253 242 242 252 239 239 252 235 234 251 233 232 250 ++229 228 250 225 225 249 221 221 248 218 217 247 214 214 247 210 209 246 207 206 246 204 203 245 ++200 199 244 197 196 244 193 191 243 190 188 243 188 186 243 186 184 243 184 182 243 182 180 243 ++180 177 244 178 174 244 176 171 244 174 170 244 171 166 245 169 163 245 168 162 245 167 159 246 ++164 155 247 160 152 246 160 152 246 158 149 246 155 145 246 171 164 246 253 253 255 255 255 255 ++255 255 255 253 252 254 162 161 213 156 149 204 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 151 142 225 151 143 219 151 142 225 151 143 219 151 143 219 151 142 225 151 143 219 ++151 143 219 151 143 219 151 143 219 186 181 225 220 219 250 234 233 251 234 234 251 235 234 251 ++237 236 251 245 245 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 252 252 254 248 248 253 245 245 253 241 241 252 238 238 252 234 234 251 231 231 250 ++228 227 250 224 224 249 221 220 248 218 217 247 213 213 247 210 209 246 207 206 246 203 203 245 ++199 198 244 196 195 244 192 191 243 189 187 243 187 186 243 185 183 243 183 181 243 181 177 244 ++179 175 244 177 172 244 175 170 244 173 167 245 171 166 245 169 163 245 168 162 245 167 159 246 ++163 156 246 164 155 247 160 152 246 158 149 246 160 152 246 240 238 254 255 255 255 255 255 255 ++255 255 255 221 219 238 156 149 204 156 149 204 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 151 143 219 151 143 219 151 143 219 151 143 219 151 143 219 ++151 143 219 151 143 219 151 143 219 151 143 219 154 147 213 180 177 239 231 230 250 241 240 252 ++243 243 252 253 253 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++254 254 254 250 250 254 248 248 253 243 243 252 240 240 252 237 237 251 234 233 251 230 229 251 ++227 227 249 223 223 249 219 218 248 216 216 248 213 212 247 209 208 246 206 205 245 201 201 245 ++199 198 244 195 194 243 192 191 243 189 187 243 187 185 243 185 183 243 183 180 243 181 177 244 ++179 175 244 178 174 244 175 170 244 173 167 245 171 166 245 169 163 245 167 159 246 165 158 245 ++163 156 246 160 152 246 159 150 246 159 150 246 230 229 251 255 255 255 255 255 255 255 255 255 ++253 252 254 162 161 213 156 149 199 156 149 204 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 151 143 219 151 143 219 151 143 219 ++151 143 219 151 143 219 154 147 213 151 143 219 151 143 219 199 194 238 245 245 249 246 245 253 ++252 252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++252 252 254 249 249 254 246 246 253 242 242 252 239 239 252 236 236 251 233 232 250 229 228 250 ++226 225 249 222 222 249 218 218 248 215 215 247 212 211 246 208 208 246 204 204 245 201 200 245 ++198 197 244 194 193 243 191 190 243 188 187 243 186 184 243 184 182 243 182 180 243 181 177 244 ++178 175 244 176 172 244 175 170 244 173 167 245 171 166 245 168 162 245 167 159 246 165 158 245 ++163 156 246 160 152 246 160 152 246 224 222 251 255 255 255 255 255 255 255 255 255 255 255 255 ++206 201 229 156 149 199 156 149 199 156 149 199 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 136 134 248 154 147 213 ++154 147 213 151 143 219 154 147 213 154 147 213 209 209 245 251 250 252 250 250 254 254 254 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++251 251 254 248 248 253 245 244 253 241 241 252 237 237 251 234 234 251 231 231 250 228 227 250 ++224 224 249 221 220 248 218 217 247 214 214 247 210 209 246 207 206 246 204 203 245 200 199 244 ++197 196 244 193 191 243 190 188 243 188 186 243 186 184 243 184 182 243 182 180 243 180 177 244 ++178 174 244 176 172 244 174 170 244 172 167 245 169 163 245 168 162 245 166 159 245 163 156 246 ++163 156 246 160 152 246 217 214 250 255 255 255 255 255 255 255 255 255 255 255 255 239 238 247 ++165 162 202 156 149 199 165 162 202 156 149 199 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++161 137 216 161 137 216 162 161 213 226 225 249 252 252 253 254 254 254 254 254 254 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 254 ++250 250 254 246 246 253 243 243 252 240 240 252 236 236 251 234 233 251 230 229 251 227 227 249 ++223 223 249 219 218 248 216 216 248 213 212 247 210 209 246 206 205 245 203 203 245 199 198 244 ++196 195 244 192 191 243 189 187 243 187 186 243 185 183 243 183 181 243 181 177 244 179 175 244 ++178 174 244 176 171 244 174 170 244 171 166 245 169 163 245 168 162 245 167 159 246 163 156 246 ++163 156 246 212 210 249 255 255 255 255 255 255 255 255 255 255 255 255 251 251 254 186 183 208 ++156 149 199 156 149 199 156 149 199 156 149 199 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 186 181 225 241 240 252 254 254 254 254 254 254 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 251 251 254 ++248 248 253 245 245 253 242 242 252 238 238 252 235 234 251 233 232 250 229 228 250 225 225 249 ++222 222 249 218 218 248 215 215 247 212 211 246 208 208 246 204 204 245 201 201 245 198 197 244 ++195 194 243 191 190 243 189 187 243 187 185 243 185 183 243 183 180 243 181 177 244 179 175 244 ++177 172 244 175 170 244 173 167 245 171 166 245 169 163 245 168 162 245 165 158 245 163 156 246 ++212 208 248 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 186 181 225 151 143 191 ++156 149 199 156 149 199 156 149 199 151 143 191 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++186 181 225 251 250 252 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 254 250 250 254 ++248 248 253 243 243 252 240 240 252 237 237 251 234 233 251 230 230 250 227 227 249 224 224 249 ++221 220 248 218 217 247 213 213 247 210 209 246 207 206 246 204 203 245 201 200 245 197 196 244 ++194 193 243 190 188 243 188 187 243 186 184 243 184 182 243 182 180 243 180 177 244 178 175 244 ++176 172 244 175 170 244 173 167 245 171 166 245 168 162 245 167 159 246 165 158 245 217 214 250 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 219 217 229 156 149 199 156 149 199 ++151 143 191 151 143 191 151 143 191 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 161 160 183 199 194 238 ++253 252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 251 251 254 248 248 253 ++245 245 253 242 242 252 239 239 252 235 234 251 233 232 250 229 229 250 226 225 249 223 222 249 ++219 218 248 215 215 247 213 212 247 209 208 246 206 205 245 201 201 245 199 198 244 196 195 244 ++192 191 243 189 187 243 187 186 243 185 183 243 184 182 243 182 180 243 180 177 244 178 174 244 ++176 171 244 174 170 244 172 167 245 169 163 245 168 162 245 167 159 246 220 219 250 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 221 219 238 151 143 191 151 143 191 151 143 191 ++156 149 199 151 143 191 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 154 147 213 206 201 229 252 252 253 ++254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 252 252 254 249 249 254 246 246 253 ++243 243 252 240 240 252 237 237 251 234 234 251 231 231 250 228 227 250 224 224 249 221 220 248 ++218 217 247 215 214 247 212 211 246 208 208 246 204 204 245 201 200 245 198 197 244 195 194 243 ++191 190 243 189 187 243 187 185 243 185 183 243 183 180 243 181 177 244 179 175 244 177 172 244 ++175 170 244 173 167 245 171 166 245 169 163 245 169 163 245 225 224 250 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 231 231 244 151 143 191 151 143 191 151 143 191 151 143 191 ++151 143 191 151 143 191 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 154 147 213 206 201 229 254 254 254 254 254 254 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 251 251 254 248 248 253 245 245 253 ++242 242 252 238 238 252 235 234 251 233 232 250 229 229 250 226 225 249 223 222 249 219 218 248 ++216 216 248 213 212 247 210 209 246 207 206 246 203 203 245 200 199 244 197 196 244 193 191 243 ++190 188 243 188 186 243 186 184 243 184 182 243 182 180 243 181 177 244 178 175 244 177 172 244 ++175 170 244 173 167 245 171 166 245 172 167 245 230 229 251 255 255 255 255 255 255 255 255 255 ++255 255 255 254 254 254 231 231 244 151 143 191 151 143 191 151 143 191 143 137 181 151 143 191 ++143 137 181 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 162 161 213 221 219 238 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 252 252 254 249 249 254 246 246 253 243 243 252 ++240 240 252 237 237 251 234 234 251 231 230 250 228 227 250 225 224 250 221 221 248 218 218 248 ++215 214 247 212 211 246 209 208 246 204 204 245 201 201 245 199 198 244 195 194 243 192 191 243 ++189 187 243 187 186 243 185 183 243 183 181 243 182 180 243 180 177 244 178 174 244 176 172 244 ++174 170 244 172 167 245 176 171 244 234 233 253 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 231 231 244 151 143 191 151 143 191 143 137 181 151 143 191 143 137 181 151 143 191 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 165 162 202 221 219 238 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 253 253 254 250 250 254 248 248 253 244 244 253 241 241 252 ++238 238 252 235 234 251 233 232 250 229 229 250 226 225 249 223 222 249 219 218 248 216 216 248 ++213 213 247 210 209 246 207 206 246 204 203 245 201 200 245 197 196 244 194 193 243 191 190 243 ++188 187 243 187 185 243 185 183 243 183 180 243 181 177 244 179 175 244 177 172 244 175 170 244 ++173 167 245 184 179 247 243 243 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++221 219 238 151 143 191 143 137 181 143 137 181 143 137 181 143 137 181 143 137 181 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 162 161 213 231 231 244 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 253 253 254 250 250 254 248 248 253 245 245 253 242 242 252 239 239 252 ++236 236 251 234 233 251 230 230 250 227 227 249 224 224 249 221 221 248 218 218 248 215 214 247 ++212 211 246 209 208 246 206 205 245 201 201 245 199 198 244 196 195 244 193 191 243 189 187 243 ++187 186 243 186 184 243 184 182 243 182 180 243 180 177 244 178 175 244 177 172 244 175 170 244 ++195 192 247 249 249 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 221 219 238 ++151 143 191 143 137 181 143 137 181 143 137 181 143 137 181 143 137 181 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++186 183 208 231 231 244 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 254 254 254 251 251 254 248 248 253 246 245 253 243 243 252 240 240 252 237 237 251 ++234 234 251 231 231 250 229 228 250 226 225 249 223 222 249 219 218 248 216 216 248 213 213 247 ++210 209 246 207 206 246 204 203 245 201 200 245 197 196 244 194 193 243 191 190 243 189 187 243 ++187 185 243 185 183 243 183 181 243 181 177 244 180 177 244 178 174 244 176 171 244 207 205 248 ++254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 206 201 229 143 137 181 ++142 137 174 143 137 181 143 137 181 143 137 181 143 137 181 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 165 162 202 ++231 231 244 254 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++254 254 254 251 251 254 249 249 254 246 246 253 243 243 252 241 241 252 238 238 252 235 234 251 ++233 232 250 230 229 251 227 227 249 224 224 249 221 220 248 218 217 247 215 214 247 212 211 246 ++209 208 246 206 205 245 201 201 245 199 198 244 196 195 244 193 191 243 190 188 243 188 186 243 ++186 184 243 184 182 243 182 180 243 181 177 244 179 175 244 178 174 244 220 219 250 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 202 200 215 137 131 176 143 137 181 ++137 131 176 137 131 176 137 131 176 137 131 176 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 165 162 202 231 231 244 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 ++252 252 254 249 249 254 248 248 253 244 244 253 242 241 253 239 239 252 236 236 251 234 233 251 ++230 230 250 228 227 250 225 224 250 221 221 248 219 218 248 215 215 247 213 212 247 210 209 246 ++207 206 246 204 203 245 201 200 245 198 197 244 194 193 243 191 190 243 189 187 243 187 185 243 ++185 183 243 183 181 243 182 180 243 180 177 244 183 180 243 233 232 252 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 248 248 253 186 183 208 137 131 176 137 131 176 137 131 176 ++137 131 176 137 131 176 137 131 176 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 156 149 199 221 219 238 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 252 252 254 ++249 249 254 248 248 253 245 244 253 242 242 252 239 239 252 237 236 251 234 234 251 231 231 250 ++229 228 250 226 225 249 223 222 249 219 218 248 216 216 248 214 214 247 210 209 246 208 208 246 ++204 204 245 201 201 245 199 198 244 196 195 244 193 191 243 190 188 243 188 186 243 186 184 243 ++184 182 243 183 180 243 181 177 244 196 194 246 246 245 253 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 239 238 247 161 160 183 137 131 176 137 131 176 137 131 176 137 131 176 ++137 131 176 134 128 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 156 149 204 219 217 229 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 252 252 254 249 249 254 ++248 248 253 245 244 253 242 242 252 240 240 252 237 237 251 234 234 251 233 232 250 229 229 250 ++226 225 249 224 224 249 221 220 248 218 217 247 215 215 247 212 211 246 209 208 246 207 206 246 ++203 203 245 200 199 244 197 196 244 194 193 243 191 190 243 189 187 243 187 185 243 185 183 243 ++183 181 243 183 180 243 217 214 250 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 221 219 238 143 137 181 137 131 176 137 131 176 134 128 170 134 128 170 134 128 170 ++134 128 170 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 136 134 248 186 181 225 255 255 255 254 254 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 253 253 254 251 251 254 249 249 254 248 248 253 ++245 244 253 242 242 252 240 240 252 237 237 251 235 234 251 233 232 250 230 229 251 227 227 249 ++224 224 249 221 221 248 219 218 248 215 215 247 213 212 247 210 209 246 207 206 246 204 204 245 ++201 201 245 199 198 244 196 195 244 193 191 243 190 188 243 188 186 243 186 184 243 184 182 243 ++190 188 243 236 236 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++202 200 215 137 131 176 134 128 170 134 128 170 126 124 174 134 128 170 130 124 168 134 128 170 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 165 162 202 245 245 249 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 253 253 254 251 251 254 249 249 254 248 248 253 245 244 253 ++242 242 252 240 240 252 237 237 251 235 234 251 233 232 250 230 230 250 228 227 250 225 224 250 ++222 222 249 219 218 248 216 216 248 214 214 247 210 209 246 208 208 246 206 205 245 201 201 245 ++200 199 244 197 196 244 194 193 243 191 190 243 188 187 243 187 185 243 185 183 243 204 203 245 ++249 249 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 251 250 252 165 162 202 ++134 128 170 130 124 168 130 124 168 130 124 168 130 124 168 130 124 168 130 124 168 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 151 143 191 231 231 244 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 254 254 254 252 252 254 250 250 254 248 248 253 246 246 253 244 244 253 242 242 252 ++240 240 252 237 237 251 235 234 251 234 233 251 230 230 250 228 227 250 225 225 249 223 222 249 ++219 218 248 218 217 247 215 214 247 212 211 246 209 208 246 207 206 246 203 203 245 201 200 245 ++198 197 244 195 194 243 192 191 243 189 187 243 187 186 243 188 187 243 225 224 250 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 221 219 238 143 137 181 134 128 170 ++130 124 168 130 124 168 130 124 168 130 124 168 130 124 168 125 119 163 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 122 118 142 186 183 208 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++253 253 254 251 251 254 249 249 254 248 248 253 246 245 253 243 243 252 242 241 253 239 239 252 ++237 237 251 235 234 251 233 232 250 230 230 250 228 227 250 226 225 249 223 223 249 221 220 248 ++218 217 247 215 215 247 213 212 247 210 209 246 207 206 246 204 204 245 201 201 245 199 198 244 ++196 195 244 193 191 243 190 188 243 188 187 243 204 204 246 245 245 253 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 251 251 254 202 200 215 131 126 164 130 124 168 130 124 168 ++125 119 163 130 124 168 125 119 163 125 119 163 126 124 174 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 143 137 181 221 219 238 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 254 252 252 254 ++250 250 254 248 248 253 248 248 253 245 245 253 243 243 252 241 241 252 239 239 252 237 237 251 ++235 234 251 233 232 250 230 230 250 228 227 250 226 225 249 223 223 249 221 220 248 218 218 248 ++215 215 247 213 212 247 210 209 246 208 208 246 204 204 245 201 201 245 199 198 244 197 196 244 ++194 193 243 191 190 243 193 191 243 228 227 250 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 239 238 247 161 160 183 125 119 163 125 119 163 125 119 163 125 119 163 ++125 119 163 125 119 163 125 119 163 107 101 144 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++122 118 142 156 149 199 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 254 254 254 253 253 254 251 251 254 250 250 254 249 249 254 ++248 248 253 246 245 253 244 244 253 242 242 252 240 240 252 238 238 252 236 236 251 234 234 251 ++233 232 250 230 230 250 228 227 250 226 225 249 223 223 249 221 220 248 218 218 248 215 215 247 ++213 213 247 210 209 246 208 208 246 206 205 245 203 203 245 200 199 244 197 196 244 195 194 243 ++192 191 243 208 208 246 248 247 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++254 253 255 202 200 215 130 124 168 125 119 163 125 119 163 125 119 163 125 119 163 125 119 163 ++125 119 163 121 115 159 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++143 137 181 186 183 208 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++254 254 254 253 253 254 252 252 254 251 251 254 250 250 254 249 249 254 248 248 253 246 246 253 ++244 244 253 243 243 252 241 241 252 239 239 252 237 237 251 236 236 251 234 234 251 233 232 250 ++230 229 251 228 227 250 225 225 249 223 223 249 221 220 248 218 218 248 216 216 248 213 213 247 ++210 209 246 209 208 246 206 205 245 203 203 245 201 200 245 198 197 244 195 194 243 198 197 244 ++233 232 250 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 239 238 247 ++161 160 183 121 115 159 125 119 163 121 115 159 125 119 163 121 115 159 121 115 159 121 115 159 ++121 115 159 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++143 137 181 202 200 215 255 255 255 255 255 255 254 254 254 253 253 254 252 252 254 251 251 254 ++251 251 254 250 250 254 249 249 254 248 248 253 248 248 253 246 245 253 244 244 253 243 243 252 ++242 241 253 240 240 252 238 238 252 237 236 251 235 234 251 234 233 251 231 231 250 229 229 250 ++227 227 249 225 225 249 223 223 249 221 220 248 218 218 248 216 216 248 213 213 247 212 211 246 ++209 208 246 207 206 246 204 203 245 201 200 245 199 198 244 196 195 244 219 218 248 250 250 254 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 250 250 254 202 200 215 125 119 163 ++121 115 159 121 115 159 121 115 159 121 115 159 120 114 157 120 114 157 121 115 159 116 112 152 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++137 131 176 206 201 229 254 254 254 255 255 255 252 252 254 250 250 254 249 249 254 248 248 253 ++248 248 253 248 248 253 246 246 253 245 245 253 244 244 253 243 243 252 242 241 253 240 240 252 ++239 239 252 237 237 251 236 236 251 234 234 251 233 232 250 230 230 250 229 228 250 227 227 249 ++225 224 250 223 222 249 221 220 248 218 218 248 215 215 247 213 213 247 212 211 246 209 208 246 ++207 206 246 204 203 245 201 201 245 199 198 244 210 209 246 243 243 253 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 221 219 238 142 137 174 121 115 159 120 114 157 ++121 115 159 120 114 157 120 114 157 120 114 157 120 114 157 120 114 157 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++137 131 176 202 200 215 255 255 255 255 255 255 252 252 254 246 246 253 246 246 253 245 245 253 ++245 244 253 244 244 253 243 243 252 242 242 252 241 241 252 240 240 252 238 238 252 237 237 251 ++236 236 251 234 234 251 234 233 251 231 231 250 229 229 250 228 227 250 226 225 249 224 224 249 ++222 222 249 219 218 248 218 217 247 215 215 247 213 213 247 212 211 246 209 208 246 207 206 246 ++204 203 245 201 201 245 208 208 246 236 236 251 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 254 254 254 245 245 249 165 162 202 120 114 157 120 114 157 120 114 157 116 112 152 ++120 114 157 116 112 152 116 112 152 116 112 152 113 109 162 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++137 131 176 186 183 208 254 254 255 255 255 255 253 253 255 243 243 252 243 243 252 242 242 252 ++242 241 253 241 241 252 240 240 252 239 239 252 238 238 252 237 237 251 236 236 251 234 234 251 ++234 233 251 231 231 250 230 230 250 228 227 250 227 227 249 225 225 249 223 223 249 221 221 248 ++219 218 248 218 217 247 215 215 247 213 212 247 210 209 246 209 208 246 207 206 246 204 203 245 ++207 206 246 234 233 251 254 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++252 252 253 186 183 208 131 126 164 116 112 152 120 114 157 116 112 152 116 112 152 116 112 152 ++114 106 151 114 106 151 116 112 152 114 108 147 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++134 128 170 151 143 191 255 255 255 255 255 255 255 255 255 243 243 253 240 240 252 239 239 252 ++238 238 252 237 237 251 237 237 251 236 236 251 235 234 251 234 234 251 233 232 250 231 231 250 ++230 230 250 229 228 250 227 227 249 226 225 249 224 224 249 222 222 249 221 220 248 219 218 248 ++216 216 248 215 214 247 213 212 247 210 209 246 209 208 246 207 206 246 210 209 246 233 232 250 ++253 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 202 200 215 ++134 128 170 116 112 152 116 112 152 116 112 152 114 106 151 116 112 152 114 106 151 114 106 151 ++114 106 151 114 106 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++130 124 168 131 126 164 239 238 247 255 255 255 255 255 255 251 251 254 237 236 251 236 236 251 ++235 234 251 235 234 251 234 234 251 234 233 251 233 232 250 231 231 250 230 229 251 229 228 250 ++227 227 249 226 225 249 224 224 249 223 222 249 221 221 248 219 218 248 218 217 247 215 215 247 ++214 214 247 212 211 246 210 209 246 208 208 246 215 214 247 236 236 251 254 254 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 219 217 229 142 137 174 116 112 152 ++116 112 152 114 106 151 114 106 151 114 106 151 114 106 151 114 106 151 114 106 151 114 106 151 ++114 106 151 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++130 124 168 130 124 168 186 183 208 255 255 255 255 255 255 255 255 255 245 245 253 234 233 251 ++233 232 250 231 231 250 231 231 250 230 230 250 229 229 250 228 227 250 227 227 249 226 225 249 ++224 224 249 223 223 249 221 221 248 219 218 248 218 218 248 216 216 248 215 214 247 213 212 247 ++212 211 246 212 211 246 225 225 249 244 244 253 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 219 217 229 142 137 174 114 106 151 114 106 151 114 106 151 ++114 106 151 114 106 151 114 106 151 114 106 151 110 102 146 110 102 146 110 102 146 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++125 119 163 125 119 163 134 128 170 245 245 249 255 255 255 255 255 255 255 255 255 245 245 253 ++230 230 250 229 228 250 228 227 250 227 227 249 226 225 249 225 225 249 224 224 249 223 222 249 ++221 221 248 219 218 248 219 218 248 218 217 247 215 215 247 213 213 247 216 216 248 229 228 250 ++242 241 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++254 254 254 219 217 229 142 137 174 114 108 147 114 106 151 114 106 151 110 102 146 110 102 146 ++110 102 146 110 102 146 107 101 144 107 101 144 110 102 146 110 102 146 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++125 119 163 125 119 163 121 115 159 186 183 208 255 255 255 255 255 255 255 255 255 255 255 255 ++252 252 254 240 240 252 230 230 250 225 225 249 223 223 249 222 222 249 221 220 248 219 218 248 ++218 218 248 219 218 248 224 224 249 229 229 250 238 238 252 246 246 253 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 251 250 252 186 183 208 ++131 126 164 110 102 146 110 102 146 110 102 146 107 101 144 110 102 146 110 102 146 110 102 146 ++107 101 144 107 101 144 107 101 144 107 101 144 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++114 108 147 120 114 157 121 115 159 121 115 159 219 217 229 254 254 254 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 254 254 255 250 250 254 249 249 254 248 247 254 250 250 254 ++253 252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 231 231 244 161 160 183 120 114 157 114 108 147 ++110 102 146 110 102 146 107 101 144 110 102 146 107 101 144 107 101 144 107 101 144 105 100 143 ++107 101 144 105 99 142 88 84 126 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 120 114 157 120 114 157 120 114 157 121 115 159 219 217 229 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++254 254 254 231 231 244 186 183 208 131 126 164 107 101 144 110 102 146 107 101 144 107 101 144 ++107 101 144 107 101 144 107 101 144 105 100 143 105 99 142 105 99 142 105 99 142 104 98 141 ++104 97 144 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 113 109 162 116 112 152 116 112 152 116 112 152 120 114 157 186 183 208 251 250 252 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 245 245 249 206 201 229 165 162 202 ++142 137 174 105 99 142 105 99 142 105 99 142 107 101 144 105 100 143 105 99 142 105 99 142 ++104 98 141 104 98 141 104 98 141 102 97 140 102 97 140 102 97 140 100 95 138 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 114 106 151 114 106 151 114 106 151 114 106 151 114 108 147 121 115 159 ++165 162 202 219 217 229 245 245 249 255 255 255 255 255 255 255 255 255 255 255 255 252 252 253 ++231 231 244 219 217 229 186 183 208 161 160 183 134 128 170 114 108 147 107 101 144 107 101 144 ++104 98 141 105 99 142 105 99 142 104 98 141 104 98 141 102 97 140 102 97 140 102 97 140 ++102 97 140 102 97 140 100 95 138 100 95 138 102 95 138 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 114 106 151 114 106 151 110 102 146 114 108 147 110 102 146 ++114 108 147 110 102 146 110 102 146 116 112 152 125 119 163 120 114 157 116 112 152 107 101 144 ++107 101 144 105 99 142 107 101 144 107 101 144 105 99 142 104 98 141 104 98 141 104 98 141 ++104 98 141 102 95 138 102 97 140 102 97 140 102 97 140 100 95 138 102 95 138 100 95 138 ++100 95 138 100 95 138 100 95 138 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 110 102 146 110 102 146 110 102 146 107 101 144 ++107 101 144 107 101 144 107 101 144 107 101 144 105 99 142 107 101 144 105 99 142 105 99 142 ++104 98 141 104 98 141 104 98 141 102 97 140 102 97 140 102 95 138 102 95 138 102 95 138 ++102 95 138 100 95 138 100 95 138 100 95 138 100 95 138 100 95 138 100 95 138 97 91 133 ++100 95 138 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 104 97 144 104 97 144 104 97 144 ++105 100 143 105 99 142 105 99 142 104 98 141 104 98 141 102 97 140 102 97 140 102 97 140 ++102 97 140 102 97 140 100 95 138 102 95 138 100 95 138 100 95 138 100 95 138 97 94 132 ++97 91 133 100 95 138 97 91 133 97 91 133 97 91 133 97 91 133 97 91 133 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 104 97 144 102 97 140 ++102 97 140 102 97 140 102 97 140 102 97 140 102 97 140 100 95 138 100 95 138 100 95 138 ++100 95 138 100 95 138 97 91 133 100 95 138 97 91 133 97 91 133 97 91 133 97 91 133 ++97 91 133 97 91 133 97 91 133 95 88 132 100 85 132 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 88 84 126 ++102 97 140 100 95 138 100 95 138 100 95 138 97 91 133 100 95 138 97 91 133 97 91 133 ++97 91 133 97 91 133 97 91 133 97 91 133 97 91 133 97 91 133 95 88 132 95 88 132 ++95 88 132 97 94 132 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 95 88 132 97 91 133 97 91 133 97 91 133 97 91 133 97 91 133 ++95 88 132 95 88 132 95 88 132 95 88 132 95 88 132 95 88 132 72 70 123 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 +diff --git a/drivers/video/logo/logo_oldzen_clut224.ppm b/drivers/video/logo/logo_oldzen_clut224.ppm +new file mode 100644 +index 000000000000..d16b347e3297 +--- /dev/null ++++ b/drivers/video/logo/logo_oldzen_clut224.ppm +@@ -0,0 +1,882 @@ ++P3 ++80 80 ++255 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 43 56 0 47 62 0 2 3 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 28 37 105 174 196 105 174 196 0 61 80 0 2 3 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 20 27 61 146 173 167 209 223 167 209 223 124 186 205 0 96 126 ++0 5 6 0 2 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 31 41 79 158 183 152 201 217 174 213 226 167 209 223 159 205 220 157 204 219 ++27 122 151 0 19 25 0 9 11 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 31 41 65 149 175 152 201 217 162 207 221 167 209 223 164 208 222 167 209 223 172 212 225 ++145 197 214 11 108 138 0 17 22 0 11 14 0 4 5 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 2 0 19 25 0 1 1 0 0 0 0 1 1 0 0 0 0 0 0 0 8 10 ++70 152 178 159 205 220 164 208 222 164 208 222 169 211 224 164 208 222 164 208 222 169 211 224 ++162 207 221 118 182 202 0 61 80 0 23 31 0 18 24 0 4 5 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 2 0 47 62 0 16 21 0 2 3 0 4 6 0 3 4 0 0 0 0 3 4 ++33 126 155 169 211 224 172 212 225 179 216 228 167 209 223 172 212 225 164 208 222 179 216 228 ++162 207 221 50 138 166 0 45 59 0 84 111 0 51 67 0 16 21 0 2 3 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 67 88 14 111 141 0 10 13 0 11 14 0 13 17 0 2 3 0 0 0 ++0 5 7 16 112 142 135 192 210 164 208 222 157 204 219 162 207 221 167 209 223 159 205 220 ++89 164 188 0 57 75 19 115 145 85 162 186 14 111 141 0 41 54 0 11 15 0 0 0 ++0 8 11 0 83 109 0 31 40 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 40 52 75 156 181 5 103 133 0 15 20 0 16 22 0 10 13 0 0 0 ++0 0 0 0 9 12 13 110 140 133 191 209 167 209 223 169 211 224 172 212 225 103 173 195 ++0 62 81 0 96 126 145 197 214 140 195 212 27 122 151 0 48 63 0 7 10 0 9 11 ++5 103 133 140 195 212 61 146 173 0 21 28 0 1 1 0 1 2 0 1 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 10 13 51 139 167 131 189 208 0 90 118 0 22 29 0 13 17 0 5 6 ++0 0 0 0 0 1 0 11 15 0 95 124 140 195 212 169 211 224 97 169 192 0 69 91 ++0 84 111 159 205 220 179 216 228 95 168 191 0 75 98 0 21 28 0 26 34 19 115 145 ++138 193 211 164 208 222 154 203 218 39 130 159 0 10 13 0 8 10 0 6 8 0 2 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 2 0 87 114 140 195 212 131 189 208 25 119 149 0 29 38 0 7 10 ++0 1 2 0 0 1 0 2 3 0 7 9 0 98 128 53 141 168 0 64 84 0 69 91 ++152 201 217 177 215 227 56 143 170 0 69 91 0 23 30 0 62 81 68 151 177 149 200 216 ++164 208 222 164 208 222 169 211 224 147 199 215 7 105 135 0 19 25 0 20 26 0 7 10 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 13 18 81 159 184 167 209 223 172 212 225 107 175 197 0 89 116 ++0 18 23 0 4 5 0 1 2 0 2 3 0 4 6 0 14 19 0 40 52 26 120 150 ++16 112 142 0 63 83 0 40 52 0 67 88 68 151 177 149 200 216 167 209 223 164 208 222 ++177 215 227 174 213 226 167 209 223 172 212 225 145 197 214 10 107 137 0 26 35 0 21 28 ++0 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 2 ++0 2 3 0 4 5 0 5 6 0 3 4 0 1 2 0 1 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 1 0 55 72 138 193 211 159 205 220 167 209 223 182 218 229 ++58 144 171 0 86 112 0 35 46 0 14 19 0 10 13 0 14 19 0 24 32 0 39 51 ++0 52 69 0 92 120 61 146 173 129 188 207 167 209 223 167 209 223 169 211 224 167 209 223 ++177 215 227 167 209 223 164 208 222 172 212 225 164 208 222 133 191 209 0 77 101 0 25 33 ++0 20 26 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 1 2 0 8 11 0 26 35 0 56 73 0 82 107 ++3 101 131 26 120 150 32 125 154 7 105 135 0 92 120 0 75 98 0 40 52 0 13 18 ++0 1 1 0 0 0 0 0 0 0 3 4 17 113 143 159 205 220 167 209 223 174 213 226 ++167 209 223 147 199 215 99 170 193 61 146 173 58 144 171 56 143 170 63 147 174 68 151 177 ++99 170 193 140 195 212 162 207 221 164 208 222 169 211 224 167 209 223 174 213 226 167 209 223 ++172 212 225 167 209 223 169 211 224 164 208 222 164 208 222 113 179 200 0 72 94 0 46 60 ++0 52 69 0 15 20 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 2 0 21 28 0 86 112 66 150 176 120 183 203 129 188 207 140 195 212 ++152 201 217 162 207 221 164 208 222 152 201 217 142 196 213 135 192 210 122 184 204 105 174 196 ++0 83 109 0 12 15 0 0 0 0 1 1 0 14 18 46 136 164 177 215 227 157 204 219 ++167 209 223 169 211 224 169 211 224 164 208 222 167 209 223 169 211 224 174 213 226 174 213 226 ++174 213 226 172 212 225 164 208 222 167 209 223 172 212 225 174 213 226 172 212 225 164 208 222 ++174 213 226 169 211 224 169 211 224 162 207 221 91 165 189 0 79 103 0 64 84 36 128 157 ++9 106 136 0 42 55 0 10 13 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 ++0 48 63 40 131 160 142 196 213 172 212 225 172 212 225 164 208 222 169 211 224 177 215 227 ++169 211 224 169 211 224 169 211 224 167 209 223 167 209 223 167 209 223 162 207 221 157 204 219 ++164 208 222 89 164 188 0 51 67 0 4 6 0 5 7 0 18 23 23 118 148 135 192 210 ++167 209 223 162 207 221 169 211 224 174 213 226 167 209 223 174 213 226 164 208 222 167 209 223 ++164 208 222 162 207 221 169 211 224 172 212 225 162 207 221 169 211 224 174 213 226 169 211 224 ++162 207 221 167 209 223 140 195 212 27 122 151 0 49 64 0 87 114 120 183 203 149 200 216 ++42 133 161 0 66 86 0 19 25 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 0 37 48 27 122 151 ++129 188 207 172 212 225 164 208 222 169 211 224 172 212 225 167 209 223 169 211 224 172 212 225 ++167 209 223 172 212 225 174 213 226 177 215 227 172 212 225 169 211 224 167 209 223 169 211 224 ++167 209 223 164 208 222 105 174 196 0 51 67 0 11 14 0 10 13 0 17 22 0 93 122 ++118 182 202 169 211 224 174 213 226 164 208 222 174 213 226 164 208 222 169 211 224 167 209 223 ++169 211 224 169 211 224 167 209 223 167 209 223 169 211 224 169 211 224 162 207 221 174 213 226 ++118 182 202 55 142 169 0 80 105 0 49 64 51 139 167 140 195 212 154 203 218 91 165 189 ++16 112 142 0 49 64 0 13 18 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 8 10 0 95 124 103 173 195 154 203 218 ++172 212 225 162 207 221 172 212 225 172 212 225 169 211 224 164 208 222 174 213 226 177 215 227 ++172 212 225 172 212 225 174 213 226 174 213 226 172 212 225 174 213 226 172 212 225 169 211 224 ++172 212 225 169 211 224 174 213 226 77 157 182 0 24 32 0 23 31 0 18 24 0 16 21 ++0 69 91 61 146 173 149 200 216 169 211 224 164 208 222 169 211 224 164 208 222 164 208 222 ++169 211 224 169 211 224 164 208 222 169 211 224 169 211 224 152 201 217 91 165 189 37 129 158 ++0 73 96 0 57 75 2 100 130 75 156 181 184 219 230 124 186 205 66 150 176 13 110 140 ++0 54 70 0 20 26 0 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 52 69 145 197 214 164 208 222 169 211 224 ++174 213 226 164 208 222 172 212 225 172 212 225 174 213 226 169 211 224 172 212 225 167 209 223 ++174 213 226 174 213 226 172 212 225 174 213 226 167 209 223 169 211 224 172 212 225 174 213 226 ++177 215 227 174 213 226 174 213 226 164 208 222 0 89 116 0 30 39 0 41 54 0 22 29 ++0 16 21 0 26 35 0 64 84 25 119 149 91 165 189 140 195 212 169 211 224 169 211 224 ++172 212 225 159 205 220 124 186 205 70 152 178 21 116 146 0 75 98 0 50 66 0 50 66 ++4 102 132 85 162 186 147 199 215 131 189 208 83 161 185 37 129 158 0 86 112 0 45 59 ++0 14 18 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 14 18 60 145 172 167 209 223 167 209 223 ++174 213 226 174 213 226 172 212 225 164 208 222 162 207 221 169 211 224 172 212 225 169 211 224 ++172 212 225 162 207 221 169 211 224 169 211 224 174 213 226 174 213 226 172 212 225 157 204 219 ++162 207 221 172 212 225 157 204 219 169 211 224 103 173 195 0 45 59 0 54 70 0 41 54 ++0 20 26 0 14 19 0 14 19 0 19 25 0 28 37 0 47 62 0 58 76 0 63 83 ++0 64 84 0 55 72 0 41 54 0 37 48 0 38 50 0 58 76 0 76 100 5 103 133 ++58 144 171 70 152 178 48 137 165 27 122 151 0 86 112 0 44 58 0 25 33 0 9 12 ++0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 72 94 140 195 212 177 215 227 ++164 208 222 174 213 226 172 212 225 169 211 224 169 211 224 169 211 224 172 212 225 167 209 223 ++142 196 213 113 179 200 103 173 195 91 165 189 103 173 195 131 189 208 162 207 221 172 212 225 ++164 208 222 167 209 223 164 208 222 162 207 221 131 189 208 0 63 83 0 66 86 0 68 89 ++0 20 27 0 11 14 0 12 15 0 22 29 0 38 50 0 50 66 0 55 72 0 57 75 ++0 73 96 0 69 91 0 54 70 0 44 58 0 50 66 0 56 73 0 57 75 0 59 78 ++0 49 64 0 40 52 0 39 51 0 37 48 0 23 30 0 10 13 0 4 6 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 23 74 155 180 172 212 225 ++169 211 224 164 208 222 172 212 225 174 213 226 157 204 219 174 213 226 138 193 211 63 147 174 ++5 103 133 0 64 84 0 57 75 0 57 75 0 66 86 0 86 112 32 125 154 120 183 203 ++169 211 224 162 207 221 167 209 223 169 211 224 126 187 206 0 76 100 0 77 101 5 103 133 ++0 31 41 0 8 11 0 3 4 0 5 7 0 16 21 0 31 40 0 54 70 0 75 98 ++0 64 84 0 49 64 0 67 88 17 113 143 66 150 176 87 163 187 103 173 195 109 177 198 ++77 157 182 51 139 167 0 87 114 0 28 37 0 5 7 0 1 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 75 98 129 188 207 ++169 211 224 164 208 222 167 209 223 164 208 222 159 205 220 46 136 164 0 72 94 0 44 58 ++0 64 84 6 104 134 36 128 157 42 133 161 11 108 138 0 84 111 0 49 64 0 62 81 ++93 167 190 174 213 226 167 209 223 167 209 223 138 193 211 0 77 101 0 87 114 39 130 159 ++0 57 75 0 14 19 0 2 2 0 0 0 0 2 2 0 6 9 0 11 14 0 10 13 ++0 20 27 4 102 132 109 177 198 154 203 218 159 205 220 169 211 224 167 209 223 172 212 225 ++174 213 226 159 205 220 138 193 211 89 164 188 0 57 75 0 5 7 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 13 53 141 168 ++164 208 222 162 207 221 135 192 210 45 135 163 0 56 73 0 54 70 9 106 136 81 159 184 ++169 211 224 133 191 209 83 161 185 53 141 168 29 123 152 9 106 136 1 99 129 0 48 63 ++0 48 63 87 163 187 167 209 223 169 211 224 138 193 211 0 89 116 0 95 124 66 150 176 ++0 77 101 0 20 26 0 2 3 0 0 0 0 0 0 0 0 0 0 1 2 0 21 28 ++63 147 174 145 197 214 167 209 223 167 209 223 164 208 222 174 213 226 169 211 224 169 211 224 ++177 215 227 177 215 227 169 211 224 177 215 227 147 199 215 40 131 160 0 26 34 0 4 6 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 60 ++147 199 215 66 150 176 0 83 109 0 49 64 4 102 132 103 173 195 162 207 221 120 183 203 ++75 156 181 29 123 152 0 98 128 0 67 88 0 47 62 0 38 50 0 34 45 0 31 41 ++0 12 16 16 112 142 164 208 222 172 212 225 133 191 209 0 80 105 0 95 124 89 164 188 ++0 93 122 0 26 34 0 4 5 0 0 0 0 0 0 0 0 0 0 23 31 51 139 167 ++164 208 222 167 209 223 167 209 223 169 211 224 169 211 224 169 211 224 167 209 223 172 212 225 ++159 205 220 164 208 222 167 209 223 174 213 226 159 205 220 157 204 219 65 149 175 0 34 45 ++0 5 6 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 6 ++0 84 111 0 35 46 0 43 56 23 118 148 145 197 214 135 192 210 83 161 185 32 125 154 ++0 87 114 0 52 69 0 32 42 0 18 24 0 10 13 0 6 8 0 6 9 0 5 7 ++0 4 6 0 80 105 152 201 217 159 205 220 129 188 207 0 68 89 14 111 141 99 170 193 ++0 95 124 0 29 38 0 5 7 0 0 0 0 0 0 0 16 21 39 130 159 154 203 218 ++172 212 225 169 211 224 169 211 224 174 213 226 167 209 223 167 209 223 167 209 223 172 212 225 ++164 208 222 107 175 197 81 159 184 83 161 185 122 184 204 164 208 222 169 211 224 66 150 176 ++0 23 31 0 10 13 0 5 7 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 3 4 0 11 14 0 58 76 36 128 157 85 162 186 43 134 162 3 101 131 0 58 76 ++0 28 37 0 14 19 0 5 7 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 82 107 154 203 218 167 209 223 91 165 189 0 47 62 61 146 173 113 179 200 ++0 90 118 0 27 36 0 4 5 0 0 0 0 3 4 9 106 136 149 200 216 164 208 222 ++164 208 222 172 212 225 174 213 226 169 211 224 169 211 224 177 215 227 169 211 224 97 169 192 ++0 89 116 0 46 60 0 46 60 0 43 56 0 62 81 27 122 151 133 191 209 159 205 220 ++22 117 147 0 22 29 0 17 22 0 6 8 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 7 9 0 30 39 0 69 91 0 93 122 0 57 75 0 26 35 0 10 13 ++0 2 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 5 7 27 122 151 164 208 222 164 208 222 7 105 135 0 51 67 97 169 192 93 167 190 ++0 87 114 0 23 30 0 3 4 0 0 0 0 72 94 140 195 212 162 207 221 172 212 225 ++164 208 222 167 209 223 169 211 224 169 211 224 172 212 225 154 203 218 45 135 163 0 55 72 ++0 80 105 29 123 152 61 146 173 48 137 165 0 98 128 0 43 56 0 84 111 113 179 200 ++135 192 210 0 87 114 0 25 33 0 26 34 0 5 7 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 1 0 10 13 0 23 31 0 28 37 0 15 20 0 4 6 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 ++0 62 81 115 180 201 159 205 220 118 182 202 0 39 51 0 83 109 115 180 201 79 158 183 ++0 69 91 0 18 24 0 1 2 0 12 16 87 163 187 167 209 223 169 211 224 167 209 223 ++172 212 225 167 209 223 167 209 223 167 209 223 167 209 223 55 142 169 0 64 84 22 117 147 ++157 204 219 157 204 219 101 172 194 53 141 168 19 115 145 0 75 98 0 29 38 14 111 141 ++162 207 221 65 149 175 0 44 58 0 44 58 0 20 27 0 3 4 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 2 3 0 5 6 0 4 5 0 1 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 18 23 0 83 109 ++109 177 198 167 209 223 145 197 214 13 110 140 0 24 32 29 123 152 115 180 201 56 143 170 ++0 45 59 0 11 14 0 3 4 0 75 98 159 205 220 167 209 223 169 211 224 172 212 225 ++169 211 224 169 211 224 172 212 225 174 213 226 85 162 186 0 64 84 19 115 145 164 208 222 ++140 195 212 75 156 181 21 116 146 0 73 96 0 43 56 0 32 42 0 12 16 0 28 37 ++124 186 205 131 189 208 0 87 114 0 38 50 0 51 67 0 14 18 0 2 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 14 19 0 26 34 0 8 10 0 1 2 ++0 1 1 0 1 1 0 2 3 0 9 11 0 31 41 1 99 129 74 155 180 142 196 213 ++164 208 222 169 211 224 63 147 174 0 28 37 0 57 75 66 150 176 95 168 191 19 115 145 ++0 30 39 0 5 7 0 17 22 74 155 180 162 207 221 167 209 223 174 213 226 172 212 225 ++172 212 225 167 209 223 169 211 224 169 211 224 0 87 114 0 86 112 140 195 212 159 205 220 ++66 150 176 4 102 132 0 55 72 0 23 31 0 9 12 0 5 7 0 3 4 0 4 5 ++26 120 150 164 208 222 43 134 162 0 28 37 0 76 100 0 32 42 0 7 9 0 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 21 28 87 163 187 111 178 199 61 146 173 ++46 136 164 46 136 164 70 152 178 118 182 202 174 213 226 167 209 223 167 209 223 167 209 223 ++159 205 220 74 155 180 0 40 52 0 37 48 33 126 155 85 162 186 43 134 162 0 69 91 ++0 13 18 0 6 8 0 95 124 138 193 211 164 208 222 162 207 221 172 212 225 162 207 221 ++169 211 224 169 211 224 162 207 221 51 139 167 0 46 60 91 165 189 162 207 221 95 168 191 ++1 99 129 0 42 55 0 13 17 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 ++0 47 62 126 187 206 111 178 199 0 51 67 0 63 83 0 71 93 0 20 26 0 2 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 4 6 25 119 149 159 205 220 169 211 224 ++172 212 225 172 212 225 164 208 222 167 209 223 172 212 225 172 212 225 167 209 223 162 207 221 ++63 147 174 0 54 70 0 47 62 19 115 145 81 159 184 61 146 173 0 95 124 0 34 45 ++0 4 5 0 29 38 77 157 182 157 204 219 172 212 225 167 209 223 164 208 222 162 207 221 ++174 213 226 164 208 222 113 179 200 0 61 80 18 114 144 184 219 230 122 184 204 29 123 152 ++0 49 64 0 14 19 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 15 20 77 157 182 145 197 214 0 93 122 0 47 62 4 102 132 0 38 50 0 6 9 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 68 89 138 193 211 169 211 224 ++179 216 228 172 212 225 164 208 222 174 213 226 169 211 224 174 213 226 124 186 205 39 130 159 ++0 48 63 0 67 88 53 141 168 103 173 195 83 161 185 16 112 142 0 48 63 0 10 13 ++0 5 7 12 109 139 149 200 216 169 211 224 174 213 226 169 211 224 172 212 225 174 213 226 ++167 209 223 149 200 216 18 114 144 0 55 72 159 205 220 147 199 215 68 151 177 0 80 105 ++0 21 28 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 6 8 46 136 164 162 207 221 39 130 159 0 33 44 11 108 138 0 61 80 0 14 18 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 25 33 95 168 191 164 208 222 ++172 212 225 162 207 221 169 211 224 167 209 223 162 207 221 172 212 225 55 142 169 0 29 38 ++0 44 58 46 136 164 129 188 207 93 167 190 16 112 142 0 55 72 0 14 19 0 2 2 ++0 64 84 118 182 202 172 212 225 174 213 226 169 211 224 172 212 225 167 209 223 167 209 223 ++159 205 220 85 162 186 0 57 75 42 133 161 190 222 232 111 178 199 19 115 145 0 43 56 ++0 10 13 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 4 5 33 126 155 162 207 221 83 161 185 0 32 42 2 100 130 0 84 111 0 23 31 ++0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 5 7 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 8 43 134 162 167 209 223 ++174 213 226 169 211 224 164 208 222 169 211 224 177 215 227 164 208 222 126 187 206 48 137 165 ++0 82 107 0 42 55 0 59 78 0 76 100 0 39 51 0 13 18 0 7 10 0 69 91 ++138 193 211 167 209 223 164 208 222 169 211 224 179 216 228 167 209 223 177 215 227 167 209 223 ++131 189 208 0 75 98 0 92 120 152 201 217 122 184 204 39 130 159 0 63 83 0 18 24 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 2 3 34 127 156 167 209 223 131 189 208 0 42 55 0 80 105 13 110 140 0 38 50 ++0 5 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 8 0 18 24 0 0 0 ++0 1 2 0 3 4 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 86 112 145 197 214 ++167 209 223 167 209 223 169 211 224 169 211 224 167 209 223 164 208 222 164 208 222 164 208 222 ++152 201 217 61 146 173 0 86 112 0 43 56 0 25 33 0 40 52 12 109 139 122 184 204 ++167 209 223 167 209 223 174 213 226 162 207 221 174 213 226 169 211 224 167 209 223 149 200 216 ++12 109 139 0 58 76 83 161 185 157 204 219 75 156 181 0 90 118 0 33 44 0 7 9 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 3 4 33 126 155 172 212 225 162 207 221 0 50 66 0 73 96 30 124 153 0 55 72 ++0 9 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 14 0 40 52 0 1 2 ++0 6 8 0 9 12 0 7 10 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36 47 126 187 206 ++169 211 224 174 213 226 169 211 224 172 212 225 174 213 226 169 211 224 169 211 224 164 208 222 ++174 213 226 169 211 224 135 192 210 83 161 185 75 156 181 101 172 194 142 196 213 172 212 225 ++167 209 223 174 213 226 167 209 223 169 211 224 169 211 224 172 212 225 133 191 209 21 116 146 ++0 52 69 56 143 170 164 208 222 120 183 203 19 115 145 0 48 63 0 13 18 0 2 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 4 5 37 129 158 167 209 223 162 207 221 0 61 80 0 79 103 46 136 164 0 71 93 ++0 13 18 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 11 0 61 80 0 6 8 ++0 10 13 0 20 26 0 14 19 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 11 65 149 175 ++174 213 226 157 204 219 167 209 223 177 215 227 172 212 225 164 208 222 164 208 222 167 209 223 ++162 207 221 169 211 224 159 205 220 179 216 228 159 205 220 157 204 219 149 200 216 164 208 222 ++169 211 224 159 205 220 167 209 223 174 213 226 157 204 219 66 150 176 0 82 107 0 50 66 ++66 150 176 164 208 222 142 196 213 60 145 172 0 75 98 0 22 29 0 5 6 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 6 9 51 139 167 167 209 223 172 212 225 0 84 111 0 64 84 51 139 167 0 84 111 ++0 18 23 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 6 0 95 124 0 23 31 ++0 10 13 0 29 38 0 24 32 0 6 8 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64 84 ++21 116 146 0 76 100 0 61 80 0 54 70 0 56 73 0 77 101 23 118 148 113 179 200 ++157 204 219 172 212 225 169 211 224 167 209 223 167 209 223 91 165 189 0 61 80 0 55 72 ++0 82 107 0 95 124 0 89 116 0 62 81 0 45 59 0 43 56 0 95 124 131 189 208 ++167 209 223 118 182 202 45 135 163 0 83 109 0 27 36 0 5 7 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 23 30 95 168 191 167 209 223 174 213 226 3 101 131 0 45 59 46 136 164 2 100 130 ++0 23 30 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 23 118 148 0 61 80 ++0 9 11 0 36 47 0 32 42 0 6 9 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 ++0 6 8 0 11 14 0 39 51 0 82 107 3 101 131 0 80 105 0 55 72 0 55 72 ++34 127 156 131 189 208 169 211 224 169 211 224 167 209 223 105 174 196 0 61 80 0 33 44 ++0 63 83 0 54 70 0 66 86 0 95 124 0 84 111 29 123 152 109 177 198 118 182 202 ++70 152 178 25 119 149 0 76 100 0 33 44 0 7 10 0 1 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 61 80 152 201 217 169 211 224 164 208 222 3 101 131 0 48 63 53 141 168 10 107 137 ++0 27 36 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 21 116 146 25 119 149 ++0 9 12 0 37 48 0 41 54 0 13 18 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 16 21 0 62 81 23 118 148 45 135 163 36 128 157 0 98 128 0 58 76 ++0 38 50 3 101 131 129 188 207 172 212 225 167 209 223 154 203 218 29 123 152 0 48 63 ++74 155 180 46 136 164 36 128 157 30 124 153 0 48 63 0 55 72 12 109 139 13 110 140 ++0 84 111 0 51 67 0 23 30 0 7 10 0 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 ++32 125 154 169 211 224 169 211 224 169 211 224 9 106 136 0 48 63 60 145 172 16 112 142 ++0 31 40 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 82 107 85 162 186 ++0 24 32 0 28 37 0 50 66 0 25 33 0 2 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 6 8 0 26 34 0 52 69 0 66 86 0 56 73 0 45 59 0 41 54 ++0 34 45 0 23 31 5 103 133 152 201 217 174 213 226 172 212 225 111 178 199 0 50 66 ++18 114 144 33 126 155 0 98 128 0 52 69 0 19 25 0 23 31 0 33 44 0 41 54 ++0 25 33 0 14 18 0 5 6 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 27 ++120 183 203 172 212 225 169 211 224 167 209 223 4 102 132 0 56 73 72 153 179 21 116 146 ++0 34 45 0 6 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 48 63 126 187 206 ++0 89 116 0 23 31 0 59 78 0 34 45 0 5 7 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 2 0 6 8 0 12 16 0 12 16 0 7 9 0 6 8 0 6 8 ++0 6 8 0 7 9 0 20 27 93 167 190 172 212 225 172 212 225 167 209 223 7 105 135 ++0 56 73 16 112 142 0 59 78 0 12 15 0 29 38 0 29 38 0 8 10 0 12 15 ++0 9 12 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 8 19 115 145 ++167 209 223 172 212 225 172 212 225 167 209 223 0 82 107 0 92 120 107 175 197 29 123 152 ++0 38 50 0 7 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 31 105 174 196 ++72 153 179 0 36 47 0 54 70 0 54 70 0 11 15 0 1 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 1 0 3 4 16 112 142 162 207 221 172 212 225 169 211 224 53 141 168 ++0 40 52 6 104 134 0 55 72 0 8 11 0 36 47 0 66 86 0 3 4 0 7 10 ++0 9 11 0 5 6 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 0 63 83 131 189 208 ++167 209 223 172 212 225 172 212 225 164 208 222 0 63 83 7 105 135 131 189 208 26 120 150 ++0 37 48 0 7 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 13 77 157 182 ++135 192 210 0 90 118 0 40 52 0 75 98 0 21 28 0 4 5 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 1 0 90 118 157 204 219 172 212 225 169 211 224 97 169 192 ++0 41 54 3 101 131 0 73 96 0 11 15 0 46 60 45 135 163 0 15 20 0 10 13 ++0 16 22 0 11 15 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 55 72 93 167 190 167 209 223 ++172 212 225 164 208 222 167 209 223 135 192 210 0 48 63 32 125 154 126 187 206 17 113 143 ++0 32 42 0 6 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 3 17 113 143 ++154 203 218 79 158 183 0 47 62 0 59 78 0 39 51 0 7 10 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 86 112 162 207 221 167 209 223 169 211 224 149 200 216 ++0 52 69 0 90 118 5 103 133 0 17 22 0 52 69 118 182 202 0 90 118 0 13 18 ++0 31 41 0 20 26 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 1 0 62 81 97 169 192 167 209 223 174 213 226 ++172 212 225 179 216 228 164 208 222 77 157 182 0 41 54 65 149 175 109 177 198 7 105 135 ++0 27 36 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 43 56 ++159 205 220 147 199 215 40 131 160 0 36 47 0 59 78 0 23 31 0 2 3 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 1 4 102 132 167 209 223 164 208 222 172 212 225 174 213 226 ++0 68 89 0 75 98 26 120 150 0 26 35 0 49 64 135 192 210 126 187 206 10 107 137 ++0 23 30 0 14 18 0 6 9 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 1 0 13 17 7 105 135 149 200 216 164 208 222 167 209 223 177 215 227 ++167 209 223 164 208 222 162 207 221 17 113 143 0 61 80 138 193 211 87 163 187 0 89 116 ++0 19 25 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 13 ++95 168 191 172 212 225 135 192 210 0 98 128 0 31 40 0 35 46 0 11 15 0 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 7 9 58 144 171 167 209 223 174 213 226 169 211 224 172 212 225 ++0 79 103 0 69 91 43 134 162 0 43 56 0 32 42 99 170 193 167 209 223 162 207 221 ++45 135 163 0 69 91 0 21 28 0 7 10 0 3 4 0 4 5 0 6 8 0 8 11 ++0 31 40 0 83 109 68 151 177 154 203 218 162 207 221 167 209 223 172 212 225 172 212 225 ++172 212 225 167 209 223 142 196 213 0 72 94 9 106 136 179 216 228 65 149 175 0 72 94 ++0 13 18 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++19 115 145 167 209 223 167 209 223 120 183 203 0 50 66 0 28 37 0 23 30 0 5 6 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 1 0 40 52 120 183 203 164 208 222 169 211 224 174 213 226 169 211 224 ++0 82 107 0 77 101 61 146 173 0 67 88 0 18 24 58 144 171 167 209 223 167 209 223 ++157 204 219 122 184 204 72 153 179 48 137 165 36 128 157 37 129 158 42 133 161 56 143 170 ++99 170 193 147 199 215 174 213 226 172 212 225 169 211 224 169 211 224 172 212 225 164 208 222 ++167 209 223 167 209 223 61 146 173 0 39 51 81 159 184 140 195 212 39 130 159 0 54 70 ++0 8 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 47 62 133 191 209 172 212 225 169 211 224 91 165 189 0 44 58 0 23 31 0 12 16 ++0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 9 11 25 119 149 154 203 218 159 205 220 162 207 221 174 213 226 177 215 227 ++0 76 100 0 77 101 75 156 181 1 99 129 0 13 17 19 115 145 174 213 226 162 207 221 ++162 207 221 169 211 224 172 212 225 167 209 223 167 209 223 167 209 223 167 209 223 169 211 224 ++167 209 223 167 209 223 169 211 224 167 209 223 172 212 225 167 209 223 167 209 223 172 212 225 ++174 213 226 145 197 214 2 100 130 0 64 84 198 226 235 109 177 198 14 111 141 0 40 52 ++0 4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 6 8 37 129 158 167 209 223 164 208 222 172 212 225 99 170 193 0 55 72 0 20 26 ++0 6 8 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 6 9 7 105 135 140 195 212 164 208 222 177 215 227 172 212 225 159 205 220 174 213 226 ++0 72 94 3 101 131 105 174 196 6 104 134 0 15 20 0 55 72 113 179 200 172 212 225 ++172 212 225 169 211 224 169 211 224 169 211 224 172 212 225 174 213 226 174 213 226 174 213 226 ++174 213 226 174 213 226 164 208 222 169 211 224 172 212 225 174 213 226 164 208 222 169 211 224 ++162 207 221 65 149 175 0 48 63 75 156 181 164 208 222 68 151 177 0 79 103 0 23 30 ++0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 47 62 107 175 197 169 211 224 164 208 222 177 215 227 99 170 193 0 76 100 ++0 14 18 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 9 ++5 103 133 120 183 203 174 213 226 167 209 223 164 208 222 167 209 223 172 212 225 157 204 219 ++0 54 70 27 122 151 124 186 205 6 104 134 0 23 30 0 15 20 48 137 165 152 201 217 ++172 212 225 172 212 225 172 212 225 169 211 224 172 212 225 177 215 227 174 213 226 174 213 226 ++174 213 226 172 212 225 169 211 224 169 211 224 164 208 222 169 211 224 169 211 224 174 213 226 ++113 179 200 0 75 98 9 106 136 179 216 228 113 179 200 30 124 153 0 48 63 0 11 15 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 6 9 22 117 147 162 207 221 157 204 219 169 211 224 172 212 225 122 184 204 ++37 129 158 0 34 45 0 5 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 4 0 31 41 21 116 146 ++142 196 213 172 212 225 172 212 225 177 215 227 164 208 222 169 211 224 164 208 222 115 180 201 ++0 45 59 48 137 165 113 179 200 6 104 134 0 23 30 0 5 6 0 55 72 133 191 209 ++162 207 221 159 205 220 169 211 224 169 211 224 172 212 225 174 213 226 172 212 225 172 212 225 ++174 213 226 172 212 225 167 209 223 174 213 226 157 204 219 174 213 226 169 211 224 147 199 215 ++0 93 122 0 75 98 118 182 202 169 211 224 66 150 176 0 87 114 0 27 36 0 5 7 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 32 42 99 170 193 174 213 226 169 211 224 164 208 222 164 208 222 ++152 201 217 95 168 191 14 111 141 0 41 54 0 11 14 0 3 4 0 1 1 0 0 0 ++0 0 0 0 0 1 0 2 3 0 8 11 0 47 62 29 123 152 103 173 195 152 201 217 ++164 208 222 162 207 221 172 212 225 172 212 225 164 208 222 167 209 223 172 212 225 60 145 172 ++0 46 60 97 169 192 99 170 193 0 96 126 0 21 28 0 2 3 0 7 10 21 116 146 ++169 211 224 169 211 224 164 208 222 174 213 226 174 213 226 172 212 225 169 211 224 169 211 224 ++169 211 224 169 211 224 164 208 222 164 208 222 179 216 228 164 208 222 145 197 214 18 114 144 ++0 52 69 79 158 183 167 209 223 109 177 198 18 114 144 0 44 58 0 12 16 0 1 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 1 0 64 84 131 189 208 159 205 220 167 209 223 167 209 223 ++172 212 225 169 211 224 174 213 226 177 215 227 111 178 199 68 151 177 40 131 160 14 111 141 ++12 109 139 34 127 156 77 157 182 126 187 206 167 209 223 169 211 224 167 209 223 174 213 226 ++172 212 225 164 208 222 174 213 226 169 211 224 172 212 225 172 212 225 157 204 219 0 84 111 ++0 95 124 164 208 222 75 156 181 0 75 98 0 17 22 0 2 3 0 0 0 0 5 7 ++32 125 154 145 197 214 164 208 222 169 211 224 172 212 225 174 213 226 172 212 225 169 211 224 ++172 212 225 172 212 225 172 212 225 174 213 226 152 201 217 97 169 192 0 87 114 0 50 66 ++77 157 182 174 213 226 111 178 199 36 128 157 0 54 70 0 16 21 0 2 3 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 4 5 4 102 132 135 192 210 169 211 224 169 211 224 ++172 212 225 172 212 225 172 212 225 167 209 223 169 211 224 169 211 224 167 209 223 167 209 223 ++174 213 226 167 209 223 164 208 222 169 211 224 174 213 226 174 213 226 172 212 225 167 209 223 ++169 211 224 167 209 223 174 213 226 169 211 224 174 213 226 162 207 221 81 159 184 0 49 64 ++79 158 183 167 209 223 48 137 165 0 61 80 0 10 13 0 1 1 0 0 0 0 0 0 ++0 11 15 4 102 132 120 183 203 164 208 222 169 211 224 169 211 224 169 211 224 172 212 225 ++169 211 224 169 211 224 172 212 225 118 182 202 53 141 168 0 67 88 0 79 103 79 158 183 ++174 213 226 124 186 205 45 135 163 0 77 101 0 23 31 0 5 6 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 12 16 11 108 138 142 196 213 162 207 221 ++167 209 223 167 209 223 169 211 224 172 212 225 164 208 222 162 207 221 172 212 225 174 213 226 ++169 211 224 172 212 225 174 213 226 174 213 226 174 213 226 172 212 225 174 213 226 172 212 225 ++172 212 225 169 211 224 169 211 224 167 209 223 169 211 224 131 189 208 0 92 120 0 76 100 ++167 209 223 113 179 200 17 113 143 0 44 58 0 7 9 0 0 0 0 0 0 0 0 0 ++0 0 1 0 11 14 0 61 80 34 127 156 95 168 191 129 188 207 133 191 209 135 192 210 ++118 182 202 83 161 185 39 130 159 0 76 100 0 49 64 22 117 147 135 192 210 164 208 222 ++101 172 194 39 130 159 0 80 105 0 31 41 0 6 8 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 15 3 101 131 142 196 213 ++172 212 225 177 215 227 167 209 223 162 207 221 164 208 222 169 211 224 172 212 225 174 213 226 ++174 213 226 172 212 225 169 211 224 174 213 226 174 213 226 169 211 224 164 208 222 164 208 222 ++169 211 224 167 209 223 174 213 226 167 209 223 157 204 219 27 122 151 0 58 76 83 161 185 ++177 215 227 70 152 178 0 84 111 0 26 35 0 3 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 1 0 6 8 0 16 21 0 39 51 0 52 69 0 58 76 0 63 83 ++0 51 67 0 43 56 0 43 56 0 86 112 97 169 192 164 208 222 142 196 213 95 168 191 ++22 117 147 0 71 93 0 29 38 0 8 10 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 0 69 91 ++115 180 201 145 197 214 164 208 222 169 211 224 172 212 225 164 208 222 154 203 218 167 209 223 ++174 213 226 172 212 225 172 212 225 169 211 224 172 212 225 174 213 226 172 212 225 172 212 225 ++174 213 226 167 209 223 167 209 223 154 203 218 26 120 150 0 54 70 68 151 177 187 220 231 ++105 174 196 17 113 143 0 48 63 0 11 14 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 2 3 0 11 15 0 23 31 0 39 51 0 62 81 0 72 94 ++1 99 129 46 136 164 111 178 199 124 186 205 97 169 192 58 144 171 29 123 152 0 87 114 ++0 43 56 0 17 22 0 5 7 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 4 5 ++0 42 55 40 131 160 133 191 209 162 207 221 162 207 221 167 209 223 169 211 224 169 211 224 ++172 212 225 172 212 225 169 211 224 172 212 225 169 211 224 169 211 224 169 211 224 169 211 224 ++172 212 225 172 212 225 124 186 205 22 117 147 0 56 73 29 123 152 162 207 221 135 192 210 ++40 131 160 0 68 89 0 21 28 0 4 5 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 1 2 0 11 14 0 26 35 0 52 69 0 83 109 ++4 102 132 17 113 143 19 115 145 10 107 137 0 98 128 0 73 96 0 48 63 0 25 33 ++0 9 12 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 ++0 5 7 0 22 29 0 75 98 46 136 164 124 186 205 169 211 224 167 209 223 167 209 223 ++172 212 225 169 211 224 169 211 224 167 209 223 169 211 224 169 211 224 167 209 223 167 209 223 ++147 199 215 55 142 169 0 86 112 0 59 78 79 158 183 147 199 215 138 193 211 70 152 178 ++0 86 112 0 33 44 0 7 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 5 6 0 13 17 0 22 29 ++0 33 44 0 39 51 0 40 52 0 33 44 0 28 37 0 19 25 0 10 13 0 4 6 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 2 0 8 10 0 16 21 0 23 30 0 57 75 13 110 140 75 156 181 147 199 215 ++177 215 227 167 209 223 164 208 222 167 209 223 174 213 226 147 199 215 85 162 186 30 124 153 ++0 69 91 0 42 55 0 84 111 131 189 208 177 215 227 124 186 205 60 145 172 0 96 126 ++0 38 50 0 9 11 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 3 4 ++0 6 8 0 6 9 0 8 10 0 7 9 0 4 5 0 2 3 0 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 1 0 6 9 0 18 24 0 24 32 0 25 33 0 29 38 0 36 47 ++0 56 73 0 72 94 0 77 101 0 72 94 0 57 75 0 44 58 0 44 58 0 57 75 ++4 102 132 83 161 185 149 200 216 133 191 209 75 156 181 21 116 146 0 71 93 0 32 42 ++0 7 9 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 0 3 4 0 13 18 0 27 36 0 42 55 0 49 64 ++0 54 70 0 61 80 0 64 84 0 80 105 4 102 132 17 113 143 43 134 162 85 162 186 ++118 182 202 95 168 191 61 146 173 26 120 150 0 87 114 0 49 64 0 23 30 0 8 10 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 5 7 0 14 18 0 29 38 ++0 50 66 0 69 91 0 95 124 14 111 141 26 120 150 33 126 155 34 127 156 25 119 149 ++9 106 136 0 93 122 0 73 96 0 49 64 0 25 33 0 11 15 0 4 6 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 5 6 ++0 12 15 0 19 25 0 26 34 0 36 47 0 45 59 0 46 60 0 43 56 0 41 54 ++0 33 44 0 24 32 0 16 22 0 10 13 0 5 6 0 1 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 1 0 2 3 0 4 5 0 5 7 0 7 9 0 7 10 0 6 9 ++0 3 4 0 3 4 0 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++ ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +diff --git a/drivers/video/logo/logo_slackware_clut224.ppm b/drivers/video/logo/logo_slackware_clut224.ppm +new file mode 100644 +index 000000000000..fbf39203bdd0 +--- /dev/null ++++ b/drivers/video/logo/logo_slackware_clut224.ppm +@@ -0,0 +1,1123 @@ ++P3 ++79 80 ++255 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 3 6 8 10 17 12 16 26 12 16 26 ++21 23 31 23 26 35 23 26 35 19 21 29 19 21 29 12 16 26 ++8 10 17 2 3 6 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 2 3 6 23 26 35 ++43 50 70 53 65 105 53 65 105 68 84 132 72 90 145 72 90 145 ++69 93 168 72 96 170 69 93 168 69 93 168 72 90 145 72 90 145 ++68 84 132 53 65 105 53 65 105 43 50 70 23 26 35 4 5 10 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 8 10 17 31 38 62 53 65 105 72 90 145 72 95 165 ++69 93 168 71 96 171 71 96 171 74 98 173 75 99 174 79 102 174 ++87 109 178 87 109 178 87 109 178 87 109 178 79 102 174 77 101 175 ++74 99 174 71 96 171 71 96 171 69 93 168 72 95 165 72 90 145 ++53 65 105 31 38 62 8 10 17 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 27 32 46 ++46 54 81 72 90 145 73 97 172 71 96 171 69 93 168 77 101 175 ++108 128 187 132 148 198 144 158 201 159 170 206 166 177 212 176 187 218 ++189 198 224 201 208 230 201 208 230 192 201 226 180 190 220 168 179 211 ++160 171 208 147 161 203 132 148 198 108 128 187 79 102 174 69 93 168 ++71 96 171 72 96 171 72 90 145 53 65 105 27 32 46 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 19 21 29 53 65 105 69 93 168 ++73 97 172 74 98 173 90 112 180 124 141 194 164 175 209 191 199 224 ++209 215 232 229 232 239 232 235 242 232 235 242 232 235 242 232 235 242 ++232 235 242 229 232 239 229 232 239 232 235 242 232 235 242 232 235 242 ++232 235 242 232 235 242 232 235 242 214 219 236 192 201 226 166 177 212 ++126 145 198 91 113 180 75 99 174 73 97 172 69 93 168 53 65 105 ++19 21 29 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 12 16 26 46 54 81 69 93 168 69 93 168 79 102 174 ++117 135 190 176 187 218 214 219 236 221 226 239 221 226 239 229 232 239 ++221 226 239 221 226 239 221 226 239 221 226 239 221 226 239 221 226 239 ++221 226 239 221 226 239 221 226 239 221 226 239 221 226 239 221 226 239 ++221 226 239 221 226 239 221 226 239 221 226 239 229 232 239 229 232 239 ++221 226 239 218 222 237 184 193 222 124 141 194 87 109 178 71 96 171 ++72 90 145 46 54 81 12 16 26 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 5 10 ++43 50 70 68 84 132 71 96 171 79 102 174 126 145 198 180 190 220 ++218 222 237 221 226 239 218 222 237 218 222 237 218 222 237 218 222 237 ++218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 ++218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 ++218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 218 222 237 ++218 222 237 221 226 239 221 226 239 221 226 239 185 195 223 136 152 200 ++87 109 178 71 96 171 68 84 132 46 54 81 8 10 17 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 27 32 46 68 84 132 ++69 93 168 77 101 175 132 148 198 191 199 224 213 218 233 218 222 237 ++214 219 236 213 218 233 214 219 236 214 219 236 213 218 233 213 218 233 ++214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 ++214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 ++214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 214 219 236 ++214 219 236 214 219 236 214 219 236 214 219 236 218 222 237 214 219 236 ++192 201 226 141 156 201 79 102 174 69 93 168 68 84 132 23 26 35 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 31 38 62 72 90 145 71 96 171 ++96 117 181 168 179 211 213 218 233 213 218 233 209 215 234 209 215 232 ++209 215 232 209 215 232 209 215 232 209 215 232 209 215 232 209 215 232 ++209 215 232 209 215 232 209 215 232 209 215 232 209 215 232 209 215 234 ++209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 ++209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 ++209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 209 215 234 ++214 219 236 214 219 236 176 187 218 108 128 187 71 96 171 72 90 145 ++31 38 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 1 2 3 43 50 70 72 90 145 74 98 172 124 141 194 ++191 199 224 209 215 232 205 212 231 205 212 231 205 212 231 205 212 231 ++205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 ++205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 ++205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 ++205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 ++205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 205 212 231 ++205 212 231 205 212 231 209 215 234 197 204 227 136 152 200 75 99 174 ++72 90 145 43 50 70 1 2 3 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++5 7 12 53 65 105 69 93 168 87 109 178 160 171 208 201 208 230 ++201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 ++201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 ++201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 ++201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 ++201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 ++201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 201 208 230 ++201 208 230 201 208 230 201 208 230 205 211 230 205 212 231 166 177 212 ++96 117 181 69 93 168 53 65 105 7 8 13 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 13 21 ++53 65 105 69 93 168 87 109 178 166 177 212 201 208 230 197 204 227 ++197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 ++197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 ++197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 ++197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 197 204 227 ++198 205 228 198 205 228 198 205 228 198 205 228 198 205 228 198 205 228 ++198 205 228 198 205 228 198 205 228 198 205 228 198 205 228 198 205 228 ++198 205 228 198 205 228 198 205 228 198 205 228 198 205 228 205 211 230 ++176 187 218 91 113 180 69 93 168 53 65 105 11 13 21 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 8 10 17 53 65 105 ++69 93 168 87 109 178 160 171 208 197 204 227 192 201 226 192 201 226 ++192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 ++192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 ++192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 ++192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 ++192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 ++192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 ++192 201 226 192 201 226 192 201 226 192 201 226 192 201 226 194 201 224 ++198 205 228 169 180 211 91 113 180 71 96 169 53 65 105 5 7 12 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 1 2 3 46 54 81 69 93 168 ++87 109 178 160 171 208 192 201 226 189 197 224 189 197 224 189 197 224 ++189 197 224 189 197 224 189 197 224 189 197 224 189 197 224 189 197 224 ++189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 ++189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 ++188 198 224 188 198 224 189 198 224 189 197 224 189 198 224 189 198 224 ++189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 ++189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 ++189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 189 198 224 ++189 198 224 194 201 224 166 177 212 91 113 180 69 93 168 46 54 81 ++1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 31 38 62 72 95 165 79 102 174 ++153 166 206 189 197 224 184 193 222 184 193 222 184 193 222 184 193 222 ++184 193 222 184 193 222 184 193 222 184 193 222 184 193 222 184 193 222 ++184 193 220 184 193 222 185 195 223 185 195 223 185 195 223 184 193 222 ++185 195 222 185 195 223 185 195 223 185 195 223 185 195 223 185 195 223 ++185 195 223 185 195 223 185 195 223 185 195 223 185 195 223 185 195 223 ++185 195 222 184 193 222 185 195 223 185 195 223 185 195 223 185 195 223 ++185 195 222 185 195 223 185 195 223 185 195 223 185 195 222 185 195 223 ++185 195 223 185 195 223 185 195 223 185 195 223 185 195 223 185 195 223 ++185 195 223 185 195 223 189 198 224 160 171 208 84 105 171 69 93 168 ++31 38 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 27 32 46 72 90 145 72 96 171 126 145 198 ++184 193 220 180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 ++180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 ++180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 184 193 222 ++185 195 222 185 195 223 189 198 224 191 199 224 192 201 226 192 201 226 ++192 201 226 194 201 224 192 201 226 191 199 224 189 198 224 189 197 224 ++185 195 222 184 193 222 184 193 220 180 190 220 180 190 220 184 193 220 ++185 195 222 189 197 224 189 198 224 189 197 224 185 195 223 184 193 222 ++180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 180 190 220 ++180 190 220 180 190 220 180 190 220 185 195 223 137 153 200 74 98 173 ++72 90 145 27 32 46 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 12 16 26 68 84 132 71 96 169 96 117 181 169 180 211 ++176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 ++176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 ++176 187 218 176 187 218 180 190 220 180 190 220 185 195 223 189 198 224 ++197 204 227 201 208 230 205 212 231 209 215 232 213 218 233 214 219 236 ++218 222 237 214 219 236 213 218 233 209 215 232 205 212 231 201 208 230 ++197 204 227 192 201 226 189 197 224 185 195 223 184 193 222 189 197 224 ++192 201 226 201 208 230 205 212 231 205 211 230 197 204 227 185 195 223 ++180 190 220 176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 ++176 187 218 176 187 218 176 187 218 180 190 220 176 187 218 108 128 187 ++69 93 168 68 84 132 12 16 26 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++4 5 10 53 65 105 71 96 169 75 99 174 147 161 203 176 187 218 ++175 184 213 175 184 213 175 184 213 175 184 213 175 184 213 175 184 213 ++175 184 213 175 184 213 175 184 213 175 184 213 175 184 213 175 184 213 ++176 187 218 180 190 220 185 195 222 194 201 224 205 211 230 218 222 237 ++229 232 239 229 232 239 228 230 236 228 230 236 229 232 239 228 230 236 ++225 227 235 228 230 236 229 232 239 228 230 236 228 230 236 232 235 242 ++232 235 242 221 226 239 209 215 234 201 208 228 198 205 228 205 211 230 ++218 222 237 232 235 242 228 230 236 229 232 239 221 226 239 199 206 227 ++184 193 222 176 187 218 176 187 218 175 184 213 176 187 218 176 187 218 ++176 187 218 176 187 218 176 187 218 176 187 218 176 187 218 160 171 208 ++79 102 174 71 96 169 53 65 105 2 3 6 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++31 38 62 72 95 165 72 96 171 117 135 190 169 180 211 166 177 212 ++166 177 212 166 177 212 166 177 212 166 177 212 166 177 212 168 179 211 ++168 179 211 168 179 211 168 179 211 166 177 212 168 179 211 175 184 213 ++180 190 220 191 199 224 205 212 231 229 232 239 232 235 242 209 213 223 ++185 191 210 156 164 188 156 164 188 129 135 150 128 134 148 122 122 122 ++122 122 122 122 122 122 128 134 148 129 135 150 129 135 150 156 164 188 ++183 190 208 204 208 221 225 227 235 232 235 242 232 235 242 232 235 242 ++219 222 229 168 177 206 129 135 150 156 164 188 219 222 229 221 226 239 ++189 198 224 176 187 218 169 180 211 168 179 211 169 180 211 169 180 211 ++169 180 211 169 180 211 169 180 211 169 180 211 169 180 211 175 184 213 ++127 144 195 72 96 171 72 95 165 31 38 62 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 8 13 ++53 65 105 72 96 170 87 109 178 152 165 205 166 177 212 166 177 212 ++166 177 212 166 177 212 166 177 212 166 177 212 166 177 212 166 177 212 ++166 177 212 164 175 209 166 177 212 166 177 212 169 180 211 180 190 220 ++194 201 224 218 222 237 232 235 242 194 200 218 156 164 188 128 134 148 ++122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 ++122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 ++122 122 122 122 122 122 129 135 150 156 164 188 183 190 208 156 164 188 ++128 134 148 122 122 122 122 122 122 122 122 122 156 164 188 229 232 239 ++197 204 227 176 187 218 166 177 212 166 177 212 166 177 212 166 177 212 ++166 177 212 166 177 212 166 177 212 166 177 212 166 177 212 166 177 212 ++160 171 208 90 112 180 71 96 171 53 65 105 8 10 17 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 38 62 ++72 95 165 71 96 171 108 128 187 160 171 208 160 171 208 160 171 208 ++160 171 208 160 171 208 160 171 208 160 171 208 160 171 208 160 171 208 ++160 171 208 160 171 208 160 171 208 166 177 212 176 187 218 197 204 224 ++232 235 242 209 213 223 129 135 150 122 122 122 122 122 122 122 122 122 ++122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 ++122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 ++122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 ++122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 228 230 236 ++201 208 230 176 187 218 164 175 209 160 171 208 160 171 208 160 171 208 ++164 175 209 164 175 209 164 175 209 164 175 209 164 175 209 164 175 209 ++166 177 212 117 135 190 71 96 171 72 95 165 31 38 62 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 7 8 13 68 84 132 ++73 97 171 74 98 172 132 148 198 160 171 208 159 170 206 159 170 206 ++159 170 206 159 170 206 159 170 206 159 170 206 159 170 206 159 170 206 ++153 166 206 153 166 206 160 171 208 169 180 211 190 198 223 229 232 239 ++204 208 221 122 122 122 113 116 128 122 122 122 122 122 122 122 122 122 ++122 122 122 113 116 128 113 116 128 113 116 128 113 116 128 122 122 122 ++122 122 122 113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 ++122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 ++122 122 122 122 122 122 122 122 122 122 122 122 122 122 122 225 227 235 ++205 211 230 175 184 213 160 171 208 159 170 206 160 171 208 160 171 208 ++160 171 208 160 171 208 160 171 208 160 171 208 160 171 208 160 171 208 ++160 171 208 137 153 200 79 102 174 72 96 170 68 84 132 8 10 17 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 31 38 62 72 95 165 ++73 97 172 87 109 178 152 165 205 153 166 206 153 166 206 153 166 206 ++153 166 206 153 166 206 153 166 206 153 166 206 153 166 206 153 166 206 ++152 165 205 153 166 206 160 171 208 180 190 220 221 226 239 204 208 221 ++122 122 122 113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 ++113 116 128 129 135 150 168 177 206 194 200 218 219 222 229 228 230 236 ++225 227 235 219 222 229 209 213 223 183 190 208 129 135 150 122 122 122 ++113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 ++113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 219 222 229 ++205 211 230 169 180 211 153 166 206 153 166 206 153 166 206 153 166 206 ++153 166 206 153 166 206 153 166 206 153 166 206 153 166 206 153 166 206 ++153 166 206 153 166 206 91 113 180 72 96 171 72 95 165 43 50 70 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 11 13 21 53 65 105 74 98 173 ++72 96 170 111 130 189 149 162 202 147 161 203 147 161 203 147 161 203 ++147 161 203 147 161 203 147 161 203 147 161 203 147 161 203 147 161 203 ++147 161 203 152 165 205 166 177 212 199 206 227 228 230 236 122 122 122 ++78 87 115 113 116 128 113 116 128 78 87 115 78 87 115 129 135 150 ++194 200 218 232 235 242 221 226 239 213 217 231 205 211 230 197 204 227 ++197 204 227 201 208 228 209 215 232 218 222 235 232 235 242 225 227 235 ++183 190 208 122 122 122 78 87 115 113 116 128 113 116 128 113 116 128 ++113 116 128 113 116 128 113 116 128 113 116 128 113 116 128 219 222 229 ++201 208 230 166 177 212 152 165 205 147 161 203 147 161 203 152 165 205 ++152 165 205 152 165 205 152 165 205 152 165 205 152 165 205 147 161 203 ++152 165 205 152 165 205 117 135 190 72 96 170 74 98 173 68 84 132 ++12 16 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 31 38 62 72 95 165 74 98 173 ++72 96 170 127 144 195 144 158 201 144 158 201 144 158 201 144 158 201 ++144 158 201 144 158 201 144 158 201 144 158 201 144 158 201 144 158 201 ++144 158 201 153 166 206 175 184 213 221 226 239 156 164 188 78 87 115 ++78 87 115 78 87 115 78 87 115 78 87 115 129 135 150 229 232 239 ++218 222 235 190 198 223 176 187 218 169 180 211 166 177 212 166 177 212 ++164 175 209 166 177 212 166 177 212 175 184 213 180 190 220 197 204 227 ++221 226 239 219 222 229 156 164 188 78 87 115 78 87 115 78 87 115 ++78 87 115 78 87 115 78 87 115 78 87 115 78 87 115 219 222 229 ++201 208 228 166 177 212 147 161 203 144 158 201 147 161 203 147 161 203 ++147 161 203 147 161 203 147 161 203 147 161 203 147 161 203 147 161 203 ++147 161 203 147 161 203 132 148 198 73 97 171 73 98 172 72 95 165 ++31 38 62 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 2 3 6 53 65 105 73 96 167 73 97 172 ++73 97 171 127 144 195 141 156 201 137 153 200 137 153 200 137 153 200 ++137 153 200 137 153 200 137 153 200 137 153 200 141 156 201 137 153 200 ++141 156 201 153 166 206 185 195 222 228 230 236 122 122 122 69 78 104 ++78 87 115 78 87 115 69 78 104 122 122 122 228 230 236 205 211 230 ++175 184 213 160 171 208 152 165 205 147 161 203 144 158 201 144 158 201 ++141 156 201 144 158 201 147 161 203 147 161 203 153 166 206 164 175 209 ++175 184 213 198 205 228 232 235 242 183 190 208 113 116 128 78 87 115 ++78 87 115 78 87 115 78 87 115 78 87 115 78 87 115 219 222 229 ++197 204 227 160 171 208 144 158 201 141 156 201 141 156 201 141 156 201 ++141 156 201 141 156 201 141 156 201 141 156 201 141 156 201 141 156 201 ++141 156 201 141 156 201 136 152 200 74 98 172 73 97 172 73 97 170 ++53 65 105 4 5 10 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 12 16 26 68 84 132 74 98 173 72 96 171 ++79 102 174 127 144 195 136 152 200 136 152 200 136 152 200 136 152 200 ++136 152 200 136 152 200 136 152 200 136 152 200 136 152 200 136 152 200 ++137 153 200 153 166 206 197 204 227 204 208 221 78 87 115 69 78 104 ++69 78 104 69 78 104 69 78 104 183 190 208 221 225 235 176 187 218 ++152 165 205 141 156 201 136 152 200 136 152 200 136 152 200 136 152 200 ++136 152 200 136 152 200 136 152 200 136 152 200 137 153 200 141 156 201 ++152 165 205 166 177 212 184 193 220 225 227 235 185 191 210 78 87 115 ++69 78 104 69 78 104 69 78 104 69 78 104 69 78 104 219 222 229 ++194 201 224 160 171 208 141 156 201 136 152 200 137 153 200 137 153 200 ++137 153 200 137 153 200 137 153 200 137 153 200 137 153 200 137 153 200 ++137 153 200 137 153 200 132 148 198 79 102 174 72 96 171 74 98 173 ++72 89 141 19 21 29 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 31 38 62 72 95 165 74 98 173 72 96 170 ++87 109 178 127 144 195 132 148 198 132 148 198 132 148 198 132 148 198 ++132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 ++136 152 200 153 166 206 201 208 230 183 190 208 69 78 104 69 78 104 ++69 78 104 69 78 104 69 78 104 209 213 223 199 206 227 160 171 208 ++137 153 200 132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 ++132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 ++132 148 198 141 156 201 153 166 206 176 187 218 221 225 235 183 190 208 ++69 78 104 56 62 79 69 78 104 69 78 104 69 78 104 219 222 229 ++185 195 222 152 165 205 136 152 200 132 148 198 132 148 198 132 148 198 ++132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 132 148 198 ++132 148 198 132 148 198 132 148 198 87 109 178 72 96 170 74 98 173 ++72 95 165 31 38 62 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 1 53 65 105 74 98 172 73 97 171 71 96 171 ++90 112 180 124 141 194 127 144 195 127 144 195 127 144 195 127 144 195 ++127 144 195 127 144 195 127 144 195 127 144 195 127 144 195 127 144 195 ++132 148 198 153 166 206 205 212 231 183 190 208 56 60 74 56 62 79 ++56 62 79 56 60 74 78 87 115 209 213 223 191 199 224 153 166 206 ++132 148 198 127 144 195 127 144 195 127 144 195 127 144 195 127 144 195 ++127 144 195 126 145 198 126 145 198 126 145 198 126 145 198 126 145 198 ++127 144 195 132 148 198 136 152 200 152 165 205 176 187 218 225 227 235 ++183 190 208 69 78 104 56 60 74 56 59 67 122 122 122 220 224 234 ++175 184 213 144 158 201 126 145 198 127 144 195 126 145 198 126 145 198 ++126 145 198 126 145 198 126 145 198 126 145 198 126 145 198 126 145 198 ++126 145 198 126 145 198 127 144 195 91 113 180 71 96 171 73 97 172 ++72 96 170 53 65 105 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 8 10 17 53 65 105 75 99 174 74 98 172 71 96 171 ++90 112 180 120 138 192 124 141 194 124 141 194 124 141 194 124 141 194 ++124 141 194 124 141 194 124 141 194 124 141 194 120 138 192 120 138 192 ++126 145 198 147 161 203 198 205 228 183 190 208 56 60 74 56 59 67 ++56 60 74 56 59 67 69 78 104 204 208 221 199 206 227 160 171 208 ++137 153 200 126 145 198 127 144 195 127 144 195 124 141 194 124 141 194 ++124 141 194 124 141 194 124 141 194 124 141 194 124 141 194 124 141 194 ++124 141 194 124 141 194 124 141 194 132 148 198 149 162 202 175 184 213 ++220 224 234 183 190 208 122 122 122 122 122 122 204 208 221 205 211 230 ++159 170 206 132 148 198 124 141 194 124 141 194 124 141 194 124 141 194 ++124 141 194 124 141 194 124 141 194 124 141 194 124 141 194 124 141 194 ++124 141 194 124 141 194 124 141 194 96 117 181 71 96 171 74 98 171 ++74 98 173 53 65 105 8 10 17 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 23 26 35 68 84 132 74 98 173 74 98 172 72 96 171 ++87 109 178 117 135 190 120 138 192 120 138 192 120 138 192 120 138 192 ++120 138 192 120 138 192 120 138 192 120 138 192 117 135 190 117 135 190 ++124 141 194 141 156 201 189 198 224 183 190 208 56 62 79 56 59 67 ++56 59 67 56 59 67 56 59 67 129 135 150 232 235 242 184 193 220 ++160 171 208 147 161 203 141 156 201 136 152 200 132 148 198 132 148 198 ++132 148 198 127 144 195 127 144 195 127 144 195 127 144 195 124 141 194 ++124 141 194 124 141 194 124 141 194 124 141 194 132 148 198 144 158 201 ++168 179 211 205 211 230 221 225 235 220 224 234 199 206 227 164 175 209 ++136 152 200 124 141 194 120 138 192 120 138 192 120 138 192 120 138 192 ++120 138 192 120 138 192 120 138 192 120 138 192 120 138 192 120 138 192 ++120 138 192 120 138 192 120 138 192 87 109 178 72 96 171 74 98 172 ++74 98 173 72 89 141 23 26 35 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 27 32 46 72 95 165 73 97 172 74 98 172 73 97 171 ++79 102 174 111 130 189 117 135 190 117 135 190 117 135 190 117 135 190 ++117 135 190 117 135 190 117 135 190 117 135 190 117 135 190 115 133 187 ++117 135 190 132 148 198 176 187 218 219 222 229 69 78 104 56 59 67 ++56 59 67 56 59 67 56 59 67 56 59 67 156 164 188 232 235 242 ++209 215 232 185 195 222 176 187 218 168 179 211 164 175 209 159 170 206 ++153 166 206 153 166 206 152 165 205 149 162 202 144 158 201 141 156 201 ++141 156 201 136 152 200 132 148 198 132 148 198 132 148 198 132 148 198 ++141 156 201 153 166 206 160 171 208 160 171 208 147 161 203 132 148 198 ++120 138 192 117 135 190 117 135 190 117 135 190 117 135 190 117 135 190 ++117 135 190 117 135 190 117 135 190 117 135 190 117 135 190 117 135 190 ++117 135 190 117 135 190 117 135 190 79 102 174 73 97 171 74 98 172 ++73 98 172 72 95 165 31 38 62 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 1 31 38 62 73 96 167 74 98 173 74 98 172 72 96 170 ++74 98 173 108 128 187 111 130 189 111 130 189 111 130 189 111 130 189 ++111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 ++111 130 189 124 141 194 153 166 206 221 225 235 122 122 122 38 41 51 ++56 59 67 56 59 67 56 59 67 38 41 51 56 59 67 113 116 128 ++156 164 188 209 213 223 209 213 223 209 213 223 213 217 231 213 217 231 ++213 217 231 209 215 232 209 215 232 209 215 232 201 208 230 192 201 226 ++185 195 222 180 190 220 175 184 213 164 175 209 153 166 206 147 161 203 ++144 158 201 141 156 201 136 152 200 132 148 198 124 141 194 117 135 190 ++111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 ++111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 111 130 189 ++111 130 189 111 130 189 111 130 189 75 99 174 73 97 171 74 98 172 ++74 98 172 72 96 170 31 38 62 0 0 0 0 0 0 0 0 0 ++0 0 0 ++2 3 6 46 54 81 71 96 169 74 98 173 74 98 172 73 97 171 ++72 96 171 96 117 181 108 128 187 108 128 187 108 128 187 108 128 187 ++108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 ++108 128 187 111 130 189 136 152 200 184 193 220 204 208 221 56 59 67 ++38 41 51 38 41 51 38 41 51 38 41 51 38 41 51 38 41 51 ++38 41 51 38 41 51 56 59 67 78 87 115 122 122 122 128 134 148 ++128 134 148 129 135 150 129 135 150 156 164 188 156 164 188 156 164 188 ++183 190 208 194 200 218 209 213 223 220 224 234 221 226 239 209 215 232 ++189 196 219 164 175 209 147 161 203 132 148 198 120 138 192 111 130 189 ++108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 ++108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 ++108 128 187 108 128 187 108 128 187 73 97 171 73 97 171 74 98 172 ++74 98 171 74 98 172 46 54 81 2 3 6 0 0 0 0 0 0 ++0 0 0 ++5 7 12 53 65 105 72 96 170 74 98 172 74 98 172 74 98 172 ++73 97 170 91 113 180 108 128 187 108 128 187 108 128 187 108 128 187 ++108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 ++108 128 187 108 128 187 120 138 192 152 165 205 213 218 233 156 164 188 ++34 36 42 34 36 42 38 41 51 34 36 42 34 36 42 34 36 42 ++34 36 42 34 36 42 34 36 42 34 36 42 34 36 42 29 31 36 ++29 31 36 29 31 36 29 31 36 29 31 36 29 31 36 38 41 51 ++56 59 67 56 59 67 69 78 104 78 87 115 113 116 128 129 135 150 ++204 208 221 225 227 235 199 206 227 166 177 212 141 156 201 120 138 192 ++111 130 189 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 ++108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 ++108 128 187 108 128 187 96 117 181 73 97 171 73 97 171 74 98 172 ++74 98 172 74 98 172 53 65 105 5 7 12 0 0 0 0 0 0 ++0 0 0 ++7 8 13 53 65 105 73 97 170 74 98 171 74 98 172 74 98 172 ++73 97 171 79 102 174 96 117 181 96 117 181 96 117 181 96 117 181 ++96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 ++96 117 181 96 117 181 108 128 187 127 144 195 160 171 208 218 222 235 ++156 164 188 38 41 51 27 29 36 34 36 42 34 36 42 34 36 42 ++34 36 42 34 36 42 34 36 42 34 36 42 34 36 42 34 36 42 ++34 36 42 34 36 42 34 36 42 34 36 42 34 36 42 34 36 42 ++29 31 36 29 31 36 29 31 36 29 31 36 27 29 36 29 31 36 ++34 36 42 69 78 104 156 164 188 210 214 227 190 198 223 147 161 203 ++120 138 192 108 128 187 96 117 181 96 117 181 96 117 181 96 117 181 ++96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 ++96 117 181 96 117 181 87 109 178 72 96 170 72 96 170 74 98 172 ++74 98 172 74 98 173 53 65 105 7 8 13 0 0 0 0 0 0 ++0 0 0 ++7 8 13 53 65 105 73 97 171 74 98 172 74 98 172 74 98 172 ++72 96 170 74 98 172 91 113 180 96 117 181 96 117 181 96 117 181 ++96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 ++96 117 181 96 117 181 96 117 181 108 128 187 127 144 195 160 171 208 ++218 222 237 183 190 208 69 78 104 21 23 31 19 21 29 21 23 31 ++27 29 36 29 31 36 29 31 36 29 31 36 29 31 36 29 31 36 ++29 31 36 29 31 36 27 29 36 29 31 36 29 31 36 29 31 36 ++29 31 36 29 31 36 29 31 36 29 31 36 29 31 36 29 31 36 ++27 29 36 21 23 31 19 21 29 78 87 115 204 208 221 199 206 227 ++144 158 201 117 135 190 96 117 181 96 117 181 96 117 181 96 117 181 ++96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 96 117 181 ++96 117 181 96 117 181 75 99 174 72 96 170 73 97 171 74 98 172 ++74 98 172 74 98 172 53 65 105 8 10 17 0 0 0 0 0 0 ++0 0 0 ++8 10 17 53 65 105 74 98 172 74 98 172 74 98 172 74 98 172 ++73 97 171 73 97 171 79 102 174 91 113 180 91 113 180 91 113 180 ++91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 ++91 113 180 90 112 180 90 112 180 91 113 180 96 117 181 120 138 192 ++147 161 203 194 201 224 219 222 229 156 164 188 69 78 104 38 41 51 ++19 21 29 8 10 17 11 13 21 17 19 24 17 19 24 17 19 24 ++17 19 24 17 19 24 17 19 24 17 19 24 17 19 24 21 23 31 ++21 23 31 21 23 31 21 23 31 21 23 31 21 23 31 21 23 31 ++21 23 31 21 23 31 19 21 29 17 19 24 56 59 67 194 200 218 ++189 197 224 132 148 198 108 128 187 91 113 180 91 113 180 91 113 180 ++91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 ++91 113 180 87 109 178 73 97 171 73 97 171 74 98 172 74 98 172 ++74 98 172 74 98 173 53 65 105 8 10 17 0 0 0 0 0 0 ++0 0 0 ++8 10 17 68 84 132 74 98 173 74 98 172 74 98 172 74 98 172 ++74 98 172 72 96 170 77 101 175 87 109 178 87 109 178 87 109 178 ++87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 ++87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 96 117 181 ++108 128 187 131 146 194 159 170 206 194 201 224 225 227 235 194 200 218 ++129 135 150 122 122 122 78 87 115 56 59 67 38 41 51 34 36 42 ++27 29 36 17 19 24 17 19 24 17 19 24 11 13 21 5 7 12 ++4 5 10 7 8 13 7 8 13 11 13 21 17 19 24 17 19 24 ++17 19 24 17 19 24 17 19 24 17 19 24 7 8 13 56 60 74 ++219 222 229 160 171 208 117 135 190 91 113 180 87 109 178 87 109 178 ++87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 ++87 109 178 79 102 174 72 96 170 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 173 53 65 105 8 10 17 0 0 0 0 0 0 ++0 0 0 ++7 8 13 53 65 105 74 98 173 74 98 172 74 98 172 74 98 172 ++74 98 172 73 97 171 74 98 172 79 102 174 84 105 171 84 105 171 ++84 105 171 84 105 171 84 105 171 84 105 171 84 105 171 84 105 171 ++84 105 171 79 102 174 84 105 171 87 109 178 87 109 178 91 113 180 ++96 117 181 96 117 181 111 130 189 124 141 194 144 158 201 168 179 211 ++192 201 226 209 215 232 209 213 223 194 200 218 183 190 208 183 190 208 ++183 190 208 183 190 208 183 190 208 183 190 208 183 190 208 183 190 208 ++156 164 188 156 164 188 122 122 122 56 59 67 17 19 24 7 8 13 ++8 10 17 11 13 21 11 13 21 11 13 21 8 10 17 5 7 12 ++129 135 150 201 208 230 127 144 195 96 117 181 87 109 178 84 105 171 ++87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 ++79 102 174 74 98 172 73 97 171 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 53 65 105 8 10 17 0 0 0 0 0 0 ++0 0 0 ++5 7 12 53 65 105 73 97 171 74 98 172 74 98 172 74 98 172 ++74 98 172 73 97 171 72 96 170 74 98 172 79 102 174 79 102 174 ++79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 ++79 102 174 79 102 174 87 109 178 96 117 181 111 130 189 117 135 190 ++117 135 190 108 128 187 96 117 181 96 117 181 96 117 181 108 128 187 ++117 135 190 127 144 195 137 153 200 152 165 205 160 171 208 160 171 208 ++166 177 212 168 179 211 169 180 211 169 180 211 175 184 213 176 187 218 ++184 193 220 189 196 219 202 207 223 219 222 229 204 208 221 113 116 128 ++2 3 6 4 5 10 5 7 12 5 7 12 7 8 13 0 0 0 ++56 59 67 204 208 221 147 161 203 96 117 181 84 105 171 79 102 174 ++79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 ++74 98 172 72 96 170 73 97 171 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 173 53 65 105 7 8 13 0 0 0 0 0 0 ++0 0 0 ++4 5 10 53 65 105 72 96 170 74 98 171 74 98 172 74 98 172 ++74 98 172 74 98 172 73 97 171 73 97 171 74 98 171 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 ++74 98 172 79 102 174 108 128 187 132 148 198 175 184 213 194 201 224 ++189 197 224 153 166 206 117 135 190 96 117 181 79 102 174 79 102 174 ++87 108 173 87 109 178 91 113 180 96 117 181 96 117 181 108 128 187 ++108 128 187 108 128 187 108 128 187 108 128 187 108 128 187 111 130 189 ++111 130 189 120 137 191 127 144 195 144 158 201 178 186 211 220 224 234 ++122 122 122 0 0 0 1 2 3 1 2 3 1 2 3 0 0 0 ++7 8 13 183 190 208 166 177 212 108 128 187 79 102 174 74 98 172 ++75 99 174 75 99 174 75 99 174 75 99 174 75 99 174 74 98 172 ++73 97 171 73 97 171 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 53 65 105 5 7 12 0 0 0 0 0 0 ++0 0 0 ++2 3 6 46 54 81 73 96 167 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 73 97 172 73 97 171 ++73 97 171 73 97 171 73 97 171 73 97 171 72 96 171 72 96 170 ++75 99 174 91 113 180 132 148 198 198 204 221 183 190 208 122 122 122 ++129 135 150 210 214 227 164 175 209 111 130 189 87 109 178 74 98 172 ++73 97 171 74 98 171 74 98 172 75 99 174 79 102 174 79 102 174 ++79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 79 102 174 ++79 102 174 87 109 178 87 109 178 96 117 181 124 141 194 168 179 211 ++209 213 223 38 41 51 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 156 164 188 176 187 218 108 128 187 79 102 174 73 97 171 ++73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 171 ++73 97 171 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 171 73 97 171 46 54 81 2 3 6 0 0 0 0 0 0 ++0 0 0 ++1 2 3 31 38 62 72 95 165 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 73 97 170 72 96 171 ++79 102 174 108 128 187 175 184 213 183 190 208 17 19 24 0 0 0 ++0 0 0 69 78 104 220 224 234 144 157 197 96 117 181 79 102 174 ++73 97 171 72 96 170 73 97 171 73 97 171 74 98 171 74 98 171 ++74 98 171 74 98 171 74 98 171 74 98 171 74 98 171 74 98 171 ++73 97 172 73 97 171 74 98 171 79 102 174 96 117 181 136 152 200 ++206 211 226 113 116 128 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 156 164 188 185 195 222 111 130 189 79 102 174 74 98 171 ++72 96 171 73 97 171 73 97 171 73 97 171 73 97 171 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 73 97 170 31 38 62 0 0 1 0 0 0 0 0 0 ++0 0 0 ++0 0 0 27 32 46 72 95 165 74 98 173 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 73 97 171 ++84 105 171 115 133 187 197 204 227 128 134 148 0 0 0 0 0 0 ++0 0 0 2 3 6 156 164 188 189 198 224 120 137 191 90 112 180 ++75 99 174 73 97 170 73 97 171 73 97 171 73 97 172 73 97 172 ++73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 ++74 98 171 73 97 172 73 97 170 74 98 172 87 109 178 124 141 194 ++201 208 228 128 134 148 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 129 135 150 190 198 223 115 133 187 79 102 174 74 98 171 ++73 97 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 173 73 96 167 27 32 46 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 19 21 29 72 90 145 74 99 174 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 74 98 171 ++87 109 178 120 137 191 199 206 227 122 122 122 0 0 0 0 0 0 ++0 0 0 0 0 0 56 59 67 219 222 229 159 170 206 111 130 189 ++87 109 178 77 101 175 73 98 172 73 97 170 73 97 171 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 73 97 171 73 97 171 74 98 172 91 113 180 131 146 194 ++205 211 230 122 122 122 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 156 164 188 180 190 220 111 130 189 79 102 174 74 98 171 ++72 96 171 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 173 72 90 145 23 26 35 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 11 13 21 68 84 132 75 99 174 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 74 98 171 ++87 109 178 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 ++0 0 0 0 0 0 1 2 3 128 134 148 216 220 231 149 162 202 ++115 133 187 91 113 180 79 102 174 74 98 172 73 97 171 73 97 171 ++73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 ++73 97 171 73 97 171 74 98 172 79 102 174 108 128 187 149 162 202 ++209 213 223 56 59 67 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 183 190 208 169 180 211 108 128 187 79 102 174 73 97 171 ++73 97 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++75 99 174 53 65 105 11 13 21 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 2 3 6 46 54 81 75 99 174 74 98 171 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 74 98 171 ++87 109 178 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 5 7 12 129 135 150 218 222 235 ++164 175 209 125 141 190 108 128 187 91 113 180 84 105 171 79 102 174 ++75 99 174 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++75 99 174 79 102 174 87 109 178 108 128 187 135 149 193 198 205 228 ++183 190 208 7 8 13 0 0 0 0 0 0 0 0 0 0 0 0 ++38 41 51 194 200 218 152 165 205 96 117 181 77 101 175 72 96 171 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 ++75 99 174 46 54 81 2 3 6 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 31 38 62 72 95 165 73 97 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 74 98 171 ++87 109 178 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 2 3 6 122 122 122 ++204 208 221 201 208 228 157 168 202 131 146 194 117 135 190 108 128 187 ++96 117 181 91 113 180 87 109 178 87 109 178 87 109 178 91 113 180 ++96 117 181 108 128 187 120 138 192 144 158 201 199 206 227 194 200 218 ++34 36 42 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++113 116 128 205 212 231 127 144 195 90 112 180 74 98 172 73 97 171 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 73 98 172 ++72 95 165 31 38 62 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 23 26 35 68 84 132 74 98 173 74 98 171 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 73 97 172 73 97 171 72 96 170 73 97 170 ++87 109 178 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++38 41 51 129 135 150 219 222 229 205 209 224 184 193 220 160 171 208 ++144 158 201 136 152 200 127 144 195 125 141 190 129 144 192 136 152 200 ++147 161 203 160 171 208 190 198 223 219 222 229 183 190 208 38 41 51 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 17 19 24 ++185 191 210 175 184 213 108 128 187 79 102 174 73 97 171 73 97 170 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 171 74 99 174 ++68 84 132 23 26 35 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 4 5 10 53 65 105 75 99 174 73 97 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 73 97 171 73 97 171 72 97 171 72 96 170 73 97 170 ++87 108 173 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 29 31 36 113 116 128 156 164 188 183 190 208 ++194 200 218 204 208 221 206 211 226 209 215 232 209 215 232 204 208 221 ++194 200 218 183 190 208 156 164 188 56 59 67 1 2 3 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128 134 148 ++205 212 231 131 146 194 91 113 180 77 100 169 73 97 171 72 96 171 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 73 97 172 74 98 173 ++53 65 105 4 5 10 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 31 38 62 72 95 165 74 98 173 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++73 97 171 73 97 171 84 105 171 96 117 181 108 128 187 96 117 181 ++91 113 180 120 138 192 201 208 228 122 122 122 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 23 31 ++56 59 67 56 62 79 78 87 115 113 116 128 78 87 115 56 62 79 ++56 59 67 27 29 36 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 113 116 128 220 224 234 ++149 162 202 108 128 187 79 102 174 73 97 171 73 97 170 73 97 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 173 72 95 165 ++31 38 62 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 11 13 21 68 84 132 75 99 174 ++74 98 171 74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 ++73 97 170 77 101 175 127 144 195 164 173 204 156 164 188 168 177 206 ++124 141 194 120 137 191 199 206 227 122 122 122 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 11 13 21 122 122 122 216 220 231 159 170 206 ++111 130 189 87 109 178 74 98 172 73 97 171 73 97 171 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 75 99 174 68 84 132 ++12 16 26 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 2 3 6 43 50 70 73 97 171 ++73 97 172 74 98 172 74 98 172 74 98 172 74 98 172 72 96 170 ++71 96 171 79 102 174 147 159 196 69 78 104 0 0 0 122 122 122 ++144 158 201 117 135 190 191 199 224 129 135 150 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 2 3 6 19 21 29 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 56 62 79 183 190 208 213 218 233 152 165 205 111 130 189 ++87 109 178 75 99 174 73 97 171 72 96 170 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 73 97 171 73 97 171 31 38 62 ++2 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 12 16 26 68 84 132 ++75 99 174 73 97 171 74 98 172 74 98 172 74 98 172 73 97 171 ++72 96 171 79 102 174 144 157 197 69 78 104 0 0 0 113 116 128 ++141 156 201 108 128 187 166 177 212 183 190 208 17 19 24 0 0 0 ++0 0 0 0 0 0 56 59 67 156 164 188 185 191 210 183 190 208 ++129 135 150 69 78 104 34 36 42 7 8 13 1 2 3 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 4 5 10 17 19 24 78 87 115 ++172 181 208 209 213 223 184 193 220 132 148 198 108 128 187 87 109 178 ++75 99 174 73 97 171 73 97 172 73 97 171 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 73 97 171 74 99 174 68 84 132 12 16 26 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 31 38 62 ++72 95 165 74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 ++72 96 171 79 102 174 144 157 197 56 62 79 0 0 0 122 122 122 ++136 152 200 96 117 181 131 146 194 205 211 230 156 164 188 56 60 74 ++69 78 104 129 135 150 219 222 229 189 196 219 168 179 211 176 187 218 ++194 201 221 205 209 224 219 222 229 204 208 221 156 164 188 129 135 150 ++122 122 122 113 116 128 69 78 104 56 62 79 56 60 74 69 78 104 ++78 87 115 113 116 128 129 135 150 183 190 208 219 222 229 205 209 224 ++176 187 218 141 156 201 117 135 190 96 117 181 79 102 174 74 98 172 ++73 97 170 73 97 171 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 72 95 165 31 38 62 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 10 17 ++53 65 105 75 99 174 73 97 171 74 98 172 74 98 172 73 97 171 ++72 97 171 79 102 174 147 159 196 56 60 74 0 0 0 122 122 122 ++132 148 198 87 109 178 108 128 187 137 153 200 191 199 224 221 226 239 ++218 222 237 191 199 224 152 165 205 124 141 194 111 130 189 111 130 189 ++120 137 191 131 146 194 141 156 201 160 171 208 180 190 220 185 195 222 ++194 201 224 201 208 228 214 219 236 221 226 239 221 226 239 221 226 239 ++213 218 233 201 208 230 190 198 223 169 180 211 144 158 201 127 144 195 ++111 130 189 96 117 181 87 109 178 77 101 175 74 98 172 73 97 171 ++73 97 171 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 73 97 171 74 99 174 68 84 132 11 13 21 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++27 32 46 72 95 165 74 98 173 74 98 172 74 98 172 73 97 171 ++72 96 171 84 105 171 147 159 196 56 59 67 0 0 0 122 122 122 ++132 148 198 79 102 174 84 105 171 96 117 181 115 133 187 127 144 195 ++127 144 195 115 133 187 96 117 181 90 112 180 79 102 174 79 102 174 ++87 109 178 90 112 180 96 117 181 96 117 181 108 128 187 111 130 189 ++117 135 190 120 138 192 125 141 190 129 144 192 131 146 194 127 144 195 ++125 141 190 120 137 191 115 133 187 108 128 187 96 117 181 90 112 180 ++79 102 174 77 101 175 74 98 172 73 97 171 73 97 171 73 97 171 ++74 98 172 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 ++73 97 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 173 72 95 165 31 38 62 0 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++4 5 10 53 65 105 77 101 175 73 98 172 74 98 171 73 97 171 ++72 96 171 79 102 174 147 159 196 56 59 67 0 0 0 122 122 122 ++126 145 198 75 99 174 72 96 171 75 99 174 79 102 174 87 109 178 ++87 109 178 79 102 174 77 101 175 74 98 172 72 97 171 71 96 171 ++72 96 171 73 97 171 74 98 172 75 99 174 79 102 174 79 102 174 ++84 105 171 87 109 178 87 109 178 87 109 178 87 109 178 87 109 178 ++87 109 178 87 108 173 79 102 174 79 102 174 74 98 172 74 98 172 ++72 96 171 72 96 170 72 96 171 72 97 171 72 97 171 72 97 171 ++72 97 171 72 97 171 72 97 171 72 97 171 72 97 171 72 97 171 ++72 97 171 73 97 171 73 97 171 74 98 172 74 98 172 73 97 171 ++73 97 171 75 99 174 53 65 105 7 8 13 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 23 26 35 72 90 145 75 99 174 73 97 171 72 96 170 ++72 96 171 87 109 178 147 159 196 56 59 67 0 0 0 122 122 122 ++144 158 201 96 117 181 90 112 180 91 113 180 91 113 180 91 113 180 ++91 113 180 91 113 180 90 112 180 91 113 180 91 113 180 90 112 180 ++90 112 180 90 112 180 91 113 180 91 113 180 90 112 180 91 113 180 ++91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 91 113 180 ++91 113 180 91 113 180 91 113 180 90 112 180 91 113 180 90 112 180 ++90 112 180 90 112 180 90 112 180 90 112 180 90 112 180 90 112 180 ++90 112 180 90 112 180 90 112 180 90 112 180 90 112 180 90 112 180 ++90 112 180 79 102 174 74 98 171 73 97 171 73 97 172 73 97 171 ++75 99 174 72 89 141 23 26 35 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 1 31 38 62 72 90 145 74 98 173 73 97 171 ++72 96 171 87 109 178 147 159 196 56 59 67 0 0 0 122 122 122 ++180 188 209 156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 ++156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 ++156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 ++156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 ++156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 156 166 198 ++156 166 198 156 166 198 157 168 202 157 168 202 157 168 202 157 168 202 ++157 168 202 157 168 202 157 168 202 157 168 202 157 168 202 157 168 202 ++159 169 202 132 148 198 79 102 174 73 97 170 72 97 171 74 99 174 ++72 90 145 27 32 46 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 3 6 31 38 62 73 96 167 74 98 173 ++72 96 170 87 109 178 147 159 196 38 41 51 0 0 0 29 31 36 ++56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 ++56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 ++56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 ++56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 ++56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 ++56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 ++56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 56 59 67 ++69 78 104 172 181 208 90 112 180 72 96 170 74 98 173 73 97 171 ++43 50 70 1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 4 5 10 46 54 81 73 97 172 ++72 96 171 87 109 178 156 164 188 56 59 67 4 5 10 1 2 3 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++29 31 36 168 177 206 90 112 180 72 96 171 74 98 173 53 65 105 ++4 5 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 8 10 17 53 65 105 ++74 98 173 79 102 174 142 153 189 142 153 189 128 134 148 128 134 148 ++128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 ++128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 ++128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 ++128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 ++128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 ++128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 ++128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 128 134 148 ++129 135 150 155 167 201 87 109 178 74 99 174 53 65 105 8 10 17 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 16 26 ++68 84 132 77 101 175 96 117 181 126 144 198 126 145 198 126 144 198 ++126 145 198 126 145 198 126 145 198 126 145 198 126 145 198 126 145 198 ++126 145 198 126 145 198 126 145 198 126 144 198 126 144 198 126 144 198 ++126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 ++126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 ++126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 ++126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 ++126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 126 144 198 ++124 141 194 96 117 181 77 101 175 68 84 132 12 16 26 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++11 13 21 53 65 105 73 97 171 74 98 173 73 97 171 73 97 172 ++73 97 171 73 97 171 73 97 171 73 97 172 73 97 172 73 97 172 ++73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 ++73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 ++73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 ++73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 ++73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 ++73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 73 97 172 ++74 98 173 73 98 172 53 65 105 11 13 21 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 5 7 12 46 54 81 73 96 167 74 99 174 73 97 171 ++73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 ++73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 ++73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 ++73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 ++73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 ++73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 ++73 97 171 73 97 171 73 97 171 73 97 171 73 97 171 74 98 173 ++72 96 170 46 54 81 5 7 12 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 3 6 31 38 62 72 90 145 75 99 174 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 73 97 171 75 99 174 72 95 165 ++31 38 62 2 3 6 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 23 26 35 68 84 132 ++77 101 175 74 98 173 74 98 172 73 97 171 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++73 97 171 74 98 172 74 98 173 77 101 175 72 90 145 27 32 46 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 16 26 ++53 65 105 72 95 165 75 99 174 75 99 174 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 73 97 171 ++74 99 174 75 99 174 72 95 165 53 65 105 12 16 26 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 19 21 29 53 65 105 72 95 165 77 101 175 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 75 99 174 ++72 95 165 53 65 105 19 21 29 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 27 32 46 53 65 105 74 98 173 ++75 99 174 75 99 174 74 98 172 74 98 171 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 171 74 98 172 75 99 174 75 99 174 75 99 174 68 84 132 ++27 32 46 1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 2 3 6 27 32 46 ++53 65 105 72 95 165 74 99 174 77 101 175 75 99 174 74 98 172 ++74 98 171 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 74 98 172 ++74 98 172 74 98 172 74 98 172 74 98 171 74 98 172 75 99 174 ++77 101 175 75 99 174 72 95 165 53 65 105 31 38 62 5 7 12 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 12 16 26 46 54 81 53 65 105 72 90 145 77 101 175 ++77 101 175 75 99 174 75 99 174 74 98 173 74 98 173 74 98 173 ++74 98 173 74 98 173 74 98 173 74 98 173 74 98 173 74 98 173 ++74 98 173 75 99 174 75 99 174 77 101 175 77 101 175 72 90 145 ++53 65 105 46 54 81 19 21 29 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 2 3 6 12 16 26 27 32 46 ++46 54 81 68 84 132 72 90 145 72 95 165 73 96 167 73 97 170 ++73 97 170 73 97 171 73 97 171 73 97 170 72 96 170 73 96 167 ++72 95 165 72 90 145 53 65 105 46 54 81 31 38 62 12 16 26 ++2 3 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 1 2 3 6 7 8 13 19 21 29 27 32 46 ++27 32 46 31 38 62 31 38 62 27 32 46 23 26 35 19 21 29 ++8 10 17 2 3 6 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 +diff --git a/drivers/video/logo/logo_tits_clut224.ppm b/drivers/video/logo/logo_tits_clut224.ppm +new file mode 100644 +index 000000000000..7504a3a2c216 +--- /dev/null ++++ b/drivers/video/logo/logo_tits_clut224.ppm +@@ -0,0 +1,1443 @@ ++P3 ++72 120 ++255 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 32 15 7 99 70 33 83 51 28 ++83 51 28 99 70 33 65 48 15 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 40 20 7 99 70 33 83 51 28 99 70 33 ++9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 116 86 23 200 156 55 255 234 0 255 232 0 ++255 232 0 255 234 0 255 221 0 156 123 43 36 17 7 0 0 0 ++4 0 2 123 94 35 255 221 0 255 234 0 255 232 0 255 232 0 ++156 123 43 116 86 23 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 156 123 43 255 234 0 255 221 0 123 94 35 73 49 22 ++99 70 33 73 49 22 116 86 23 255 221 0 200 156 55 22 13 4 ++123 94 35 255 221 0 255 221 0 255 221 0 253 230 2 255 255 40 ++255 255 40 253 230 2 116 86 23 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++156 123 43 255 234 0 156 123 43 111 90 31 200 156 55 255 255 42 ++255 255 41 255 255 42 248 233 31 111 90 31 116 86 23 65 48 15 ++123 94 35 116 86 23 116 86 23 156 123 43 249 230 10 255 255 42 ++255 255 42 255 255 40 253 230 2 116 86 23 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 123 94 35 ++255 234 0 156 123 43 156 123 43 255 255 42 255 255 41 255 255 40 ++255 255 40 255 255 41 255 255 42 255 255 42 156 123 43 65 48 15 ++255 221 0 255 234 0 255 234 0 73 49 22 249 230 10 255 255 42 ++255 255 40 255 255 42 255 255 40 253 230 2 116 86 23 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 22 13 4 255 221 0 ++200 156 55 123 94 35 255 255 42 255 255 41 255 255 41 255 255 40 ++255 255 42 248 233 31 200 156 55 200 156 55 248 233 31 116 86 23 ++255 234 0 255 221 0 255 222 0 255 221 0 111 90 31 255 255 42 ++255 255 41 255 255 40 255 255 42 255 255 40 253 230 2 65 48 15 ++4 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 32 15 7 200 156 55 253 230 2 ++116 86 23 200 156 55 255 255 41 255 255 41 255 255 41 255 255 41 ++200 156 55 116 86 23 116 86 23 116 86 23 111 90 31 116 86 23 ++255 232 0 255 222 0 255 222 0 255 221 0 99 70 33 255 255 42 ++255 255 40 255 255 41 255 255 40 255 255 42 255 255 40 156 123 43 ++58 38 16 156 123 43 22 13 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 65 48 15 255 232 0 116 86 23 ++200 156 55 255 255 42 255 255 40 255 255 41 255 255 41 248 233 31 ++116 86 23 255 221 0 255 234 0 255 234 0 156 123 43 116 86 23 ++255 234 0 255 232 0 255 232 0 255 221 0 111 90 31 255 255 40 ++255 255 41 255 255 41 255 255 41 255 255 40 255 255 42 255 255 42 ++116 86 23 255 234 0 200 156 55 20 10 4 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 4 0 2 255 221 0 116 86 23 200 156 55 ++255 255 42 255 255 40 255 255 41 255 255 41 255 255 41 156 123 43 ++156 123 43 255 234 0 255 232 0 255 234 0 255 221 0 116 86 23 ++255 221 0 156 123 43 156 123 43 255 221 0 200 156 55 156 123 43 ++255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 255 255 42 ++200 156 55 156 123 43 255 234 0 200 156 55 22 13 4 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 116 86 23 116 86 23 200 156 55 255 255 41 ++255 255 40 255 255 41 255 255 41 255 255 40 255 255 41 73 49 22 ++255 234 0 156 123 43 116 86 23 116 86 23 116 86 23 58 38 16 ++116 86 23 131 100 59 119 92 52 116 86 23 65 48 15 156 123 43 ++255 255 42 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 ++248 233 31 123 94 35 248 233 31 249 230 10 200 156 55 22 13 4 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 4 0 2 65 48 15 248 233 31 255 255 42 255 255 40 ++255 255 41 255 255 41 255 255 40 255 255 42 123 94 35 20 10 4 ++65 48 15 133 97 51 186 149 103 186 149 103 143 108 61 83 51 28 ++219 162 97 236 169 118 236 169 118 208 160 108 107 66 48 156 123 43 ++255 255 42 255 255 41 255 255 41 255 255 41 255 255 41 255 255 40 ++255 255 42 111 90 31 248 233 31 255 255 42 249 230 10 200 156 55 ++22 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 58 38 16 248 233 31 255 255 42 255 255 40 255 255 41 ++255 255 41 255 255 41 255 255 41 248 233 31 58 38 16 98 62 37 ++219 162 97 236 169 118 236 169 118 236 169 118 230 163 113 219 162 97 ++232 168 117 231 165 115 231 165 115 236 169 118 190 135 80 116 86 23 ++248 233 31 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 ++255 255 41 200 156 55 156 123 43 255 255 40 255 255 42 249 230 10 ++200 156 55 40 20 7 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++40 20 7 248 233 31 255 255 41 255 255 40 255 255 41 255 255 41 ++255 255 41 255 255 41 255 255 41 156 123 43 83 51 28 225 161 106 ++232 168 117 231 165 115 219 162 97 219 162 97 232 168 117 232 168 117 ++230 164 114 230 164 114 229 163 112 231 165 115 236 169 118 94 65 40 ++248 233 31 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 ++255 255 40 255 255 42 86 63 36 255 255 40 255 255 41 255 255 41 ++249 230 10 99 70 33 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 20 7 ++248 233 31 255 255 41 255 255 40 255 255 41 255 255 41 255 255 41 ++255 255 41 255 255 41 248 233 31 83 51 28 226 164 99 231 165 115 ++230 164 114 230 163 113 225 161 106 229 163 112 231 165 115 231 165 115 ++231 165 115 225 161 106 200 154 86 232 168 117 236 169 118 131 100 59 ++200 156 55 255 255 40 255 255 41 255 255 41 255 255 41 255 255 41 ++255 255 41 255 255 40 86 63 36 255 255 41 255 255 40 255 255 41 ++255 255 41 248 233 31 18 6 8 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 40 20 7 248 233 31 ++255 255 42 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 ++255 255 40 255 255 41 156 123 43 143 108 61 230 172 123 236 217 150 ++232 170 121 227 181 122 236 217 150 230 172 123 229 163 112 230 163 113 ++230 163 113 230 164 114 231 165 115 230 163 113 231 165 115 225 161 106 ++73 49 22 255 255 40 255 255 41 255 255 40 255 255 41 255 255 41 ++255 255 41 255 255 41 156 123 43 200 156 55 255 255 41 255 255 40 ++255 255 41 255 255 41 123 94 35 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 18 6 8 248 233 31 255 255 42 ++255 255 40 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 ++255 255 41 248 233 31 83 51 28 225 161 106 236 217 150 249 228 179 ++236 217 150 255 232 190 255 234 192 249 228 179 249 228 179 236 217 150 ++233 170 120 232 170 121 232 170 121 232 170 121 230 164 114 232 168 117 ++91 67 37 248 233 31 255 255 40 255 255 41 255 255 41 255 255 41 ++255 255 41 255 255 42 255 221 0 111 90 31 255 255 42 255 255 41 ++255 255 41 255 255 42 200 156 55 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 99 70 33 255 255 41 255 255 40 ++255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 255 255 40 ++255 255 42 123 94 35 155 112 61 230 172 123 249 228 179 255 231 189 ++255 231 189 255 231 189 255 230 188 255 232 190 255 232 190 255 232 190 ++255 231 189 255 231 189 255 231 189 255 230 188 230 172 123 232 166 115 ++168 130 70 116 86 23 249 230 10 255 255 41 255 255 41 255 255 41 ++255 255 41 255 255 42 255 221 0 111 90 31 255 255 42 255 255 41 ++255 255 41 255 255 41 248 233 31 58 38 16 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 86 63 36 248 233 31 255 255 41 255 255 41 ++255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 255 255 41 ++248 233 31 104 73 33 219 162 97 230 172 123 249 228 179 255 232 190 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 232 190 236 217 150 230 163 113 ++225 161 106 104 73 33 200 156 55 249 230 10 255 255 41 255 255 41 ++255 255 40 249 230 10 255 221 0 111 90 31 255 255 42 255 255 40 ++255 255 41 255 255 40 255 255 42 156 123 43 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 9 2 0 156 123 43 255 255 42 255 255 40 255 255 41 ++255 255 41 255 255 41 255 255 41 255 255 41 255 255 40 255 255 42 ++156 123 43 155 112 61 236 169 118 236 169 118 236 217 150 255 234 192 ++255 233 191 255 232 190 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 230 172 123 ++236 169 118 164 128 83 156 123 43 255 232 0 255 222 0 255 222 0 ++255 222 0 255 222 0 255 221 0 111 90 31 248 233 31 255 255 41 ++255 255 41 255 255 41 255 255 42 123 94 35 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 65 48 15 255 255 42 255 255 40 255 255 41 255 255 41 ++255 255 41 255 255 41 255 255 41 255 255 40 255 255 41 200 156 55 ++98 62 37 115 82 46 119 92 52 119 92 52 131 100 59 161 127 82 ++249 228 179 249 228 179 255 230 188 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 230 188 255 231 189 249 228 179 178 137 80 ++115 82 46 115 82 46 40 20 7 156 123 43 253 230 2 255 221 0 ++255 221 0 255 221 0 255 232 0 156 123 43 156 123 43 255 255 42 ++255 255 41 255 255 41 255 255 41 123 94 35 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++9 2 0 200 156 55 255 255 41 255 255 41 255 255 41 255 255 41 ++255 255 41 255 255 41 255 255 41 255 255 41 255 255 40 73 49 22 ++83 51 28 155 112 61 164 128 83 146 115 67 164 128 83 133 97 51 ++81 56 37 211 185 152 255 234 192 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 249 228 179 94 65 40 115 82 46 ++164 128 83 153 118 66 133 97 51 65 48 15 255 221 0 255 222 0 ++255 221 0 255 222 0 255 232 0 156 123 43 156 123 43 255 255 42 ++255 255 41 255 255 41 255 255 42 249 230 10 40 20 7 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++4 0 2 248 233 31 255 255 40 255 255 41 255 255 41 255 255 41 ++255 255 41 255 255 41 255 255 41 248 233 31 123 94 35 155 112 61 ++230 163 113 236 169 118 200 154 86 94 65 40 138 104 59 236 217 150 ++236 221 188 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 230 188 236 221 188 249 228 179 ++180 145 91 89 60 38 168 130 70 166 125 65 116 86 23 255 221 0 ++255 222 0 255 221 0 255 232 0 156 123 43 156 123 43 255 255 42 ++255 255 41 255 255 41 255 255 42 249 230 10 65 48 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++116 86 23 248 233 31 255 255 41 255 255 41 255 255 41 255 255 41 ++255 255 41 255 255 41 255 255 41 248 233 31 94 65 40 236 169 118 ++232 166 115 143 108 61 104 74 41 104 74 41 32 15 7 115 82 46 ++236 217 150 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 230 188 255 232 190 255 231 189 164 128 83 ++22 13 4 98 62 37 106 76 45 190 135 80 166 125 65 116 86 23 ++255 222 0 255 222 0 255 232 0 156 123 43 156 123 43 255 255 42 ++255 255 40 255 255 41 255 255 42 249 230 10 65 48 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++156 123 43 255 255 40 255 255 41 255 255 41 255 255 41 255 255 41 ++255 255 41 255 255 40 255 255 40 86 63 36 190 135 80 190 135 80 ++42 24 20 42 24 20 73 53 28 81 56 37 82 57 39 42 24 20 ++106 76 45 249 228 179 255 233 191 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 161 127 82 32 15 7 ++82 57 39 82 57 39 73 53 28 73 53 28 99 70 33 133 97 51 ++116 86 23 255 221 0 255 234 0 156 123 43 156 123 43 255 255 42 ++255 255 42 255 255 40 248 233 31 253 230 2 65 48 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 20 7 ++255 221 0 255 255 40 255 255 40 255 255 41 255 255 41 255 255 41 ++255 255 40 255 255 41 200 156 55 115 82 46 190 135 80 32 15 7 ++42 24 20 161 127 82 172 197 155 172 197 155 172 197 155 212 211 185 ++46 29 24 210 175 116 255 234 192 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 232 190 249 228 179 32 15 7 173 198 156 ++173 198 156 172 197 155 186 149 103 161 127 82 82 57 39 20 10 4 ++98 62 37 116 86 23 156 123 43 116 86 23 156 123 43 248 233 31 ++248 233 31 255 222 0 255 221 0 253 230 2 65 48 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 86 23 ++255 234 0 249 230 10 255 255 42 255 255 40 255 255 41 255 255 41 ++255 255 41 255 255 41 111 90 31 190 135 80 106 76 45 22 13 4 ++161 127 82 51 35 26 5 0 27 186 149 103 161 127 82 161 127 82 ++212 211 185 215 204 162 255 232 190 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 249 228 179 199 209 176 172 197 155 ++5 0 27 73 53 28 172 197 155 161 127 82 134 113 63 51 35 26 ++58 38 16 190 135 80 115 82 46 4 0 2 156 123 43 253 230 2 ++255 221 0 255 221 0 255 222 0 253 230 2 65 48 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 86 23 ++255 232 0 255 222 0 255 255 40 255 255 42 255 255 41 255 255 41 ++255 255 41 200 156 55 115 82 46 133 97 51 10 1 0 172 197 155 ++51 35 26 5 0 27 46 29 24 212 211 185 247 255 212 107 78 54 ++212 211 185 247 255 212 255 230 188 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 230 188 255 234 192 247 255 212 107 78 54 ++5 0 27 82 57 39 247 255 212 247 255 212 134 113 63 172 197 155 ++22 13 4 98 62 37 200 154 86 9 4 10 156 123 43 255 232 0 ++255 221 0 255 222 0 255 222 0 253 230 2 65 48 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 86 23 ++255 232 0 255 221 0 253 230 2 248 233 31 255 255 41 255 255 41 ++255 255 42 200 156 55 57 32 26 22 13 4 82 57 39 230 232 196 ++42 24 20 5 0 27 5 0 27 51 35 26 199 209 176 199 209 176 ++134 113 63 247 255 212 255 230 188 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 230 188 255 234 192 199 209 176 5 0 27 ++5 0 27 5 0 27 82 57 39 247 255 212 186 149 103 173 198 156 ++134 113 63 9 2 0 69 42 21 46 29 24 116 86 23 255 221 0 ++255 222 0 255 222 0 255 221 0 255 232 0 65 48 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 86 23 ++255 232 0 255 222 0 255 221 0 255 221 0 253 230 2 248 233 31 ++248 233 31 99 70 33 133 97 51 32 15 7 161 127 82 247 255 212 ++51 35 26 107 78 54 51 35 26 5 0 27 46 29 24 199 209 176 ++134 113 63 255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 230 188 255 234 192 200 194 140 51 35 26 ++107 78 54 46 29 24 5 0 27 107 78 54 186 149 103 199 209 176 ++212 211 185 10 1 0 104 73 33 166 125 65 77 45 20 255 221 0 ++255 222 0 255 221 0 255 234 0 156 123 43 9 4 10 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 116 86 23 ++255 234 0 255 221 0 255 222 0 255 221 0 255 221 0 255 222 0 ++255 221 0 83 51 28 98 62 37 133 97 51 134 113 63 247 255 212 ++107 78 54 107 78 54 172 197 155 173 198 156 107 78 54 134 113 63 ++186 149 103 255 234 192 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 234 192 211 185 152 82 57 39 ++172 197 155 199 209 176 172 197 155 107 78 54 134 113 63 230 232 196 ++199 209 176 104 73 33 83 51 28 190 135 80 75 50 26 255 221 0 ++255 222 0 255 222 0 255 221 0 65 48 15 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 40 20 7 ++200 156 55 253 230 2 255 222 0 255 222 0 255 222 0 255 222 0 ++255 221 0 83 51 28 83 51 28 166 125 65 119 92 52 199 209 176 ++212 211 185 82 57 39 51 35 26 82 57 39 82 57 39 131 100 59 ++255 230 188 255 231 189 255 231 189 255 230 188 255 232 190 255 232 190 ++255 230 188 255 231 189 255 231 189 255 231 189 255 234 192 180 145 91 ++51 35 26 82 57 39 82 57 39 51 35 26 186 149 103 230 232 196 ++107 78 54 190 135 80 75 50 26 133 97 51 116 86 23 156 123 43 ++255 222 0 255 232 0 200 156 55 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++156 123 43 255 232 0 255 221 0 255 222 0 255 222 0 255 222 0 ++255 221 0 40 20 7 65 48 15 73 53 28 229 163 112 222 164 108 ++233 169 121 219 162 97 223 184 122 215 204 162 215 204 162 249 228 179 ++255 230 188 255 231 189 255 231 189 255 232 190 236 217 150 227 181 122 ++255 234 192 255 231 189 255 231 189 255 231 189 255 230 188 249 228 179 ++235 224 165 215 204 162 215 204 162 235 224 165 249 228 179 230 172 123 ++225 161 106 131 100 59 40 20 7 116 86 23 255 221 0 73 49 22 ++255 222 0 255 232 0 200 156 55 4 0 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++116 86 23 255 221 0 255 222 0 255 222 0 255 222 0 255 222 0 ++255 221 0 116 86 23 255 221 0 73 49 22 225 161 106 231 165 115 ++231 165 115 236 217 150 255 232 190 255 233 191 255 233 191 255 232 190 ++255 231 189 255 231 189 255 232 190 255 234 192 236 217 150 227 181 122 ++255 234 192 255 233 191 255 233 191 255 231 189 255 231 189 255 232 190 ++255 233 191 255 233 191 255 233 191 255 233 191 255 232 190 236 217 150 ++236 169 118 94 65 40 255 221 0 255 232 0 255 221 0 73 49 22 ++255 222 0 255 222 0 255 221 0 65 48 15 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++4 0 2 255 221 0 255 232 0 255 221 0 255 222 0 255 221 0 ++255 232 0 156 123 43 156 123 43 200 156 55 131 100 59 236 169 118 ++230 172 123 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 230 188 236 217 150 235 224 165 236 221 188 236 221 188 ++236 221 188 235 224 165 236 217 150 249 228 179 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 249 228 179 ++178 137 80 116 86 23 255 221 0 255 222 0 255 221 0 73 49 22 ++255 222 0 255 222 0 255 234 0 116 86 23 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 58 38 16 255 221 0 255 222 0 255 222 0 255 222 0 ++253 230 2 200 156 55 156 123 43 200 156 55 94 65 40 236 169 118 ++227 181 122 255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 ++255 231 189 255 234 192 186 149 103 36 17 7 58 38 16 40 20 7 ++58 38 16 40 20 7 131 100 59 255 233 191 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 230 188 255 233 191 236 217 150 ++155 112 61 123 94 35 255 234 0 255 221 0 255 222 0 65 48 15 ++248 233 31 255 255 42 255 255 40 116 86 23 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 116 86 23 255 234 0 255 221 0 255 222 0 ++255 221 0 255 234 0 116 86 23 200 156 55 116 86 23 190 135 80 ++230 172 123 249 228 179 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 234 192 200 194 140 58 38 16 116 86 23 155 112 61 ++116 86 23 77 45 20 134 113 63 255 234 192 255 230 188 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 230 172 123 ++99 70 33 255 221 0 255 222 0 253 230 2 156 123 43 156 123 43 ++255 255 42 255 255 41 255 255 42 200 156 55 40 20 7 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 65 48 15 156 123 43 200 156 55 253 230 2 255 221 0 ++255 221 0 255 232 0 116 86 23 255 221 0 156 123 43 115 82 46 ++230 163 113 236 217 150 255 234 192 255 230 188 255 231 189 255 231 189 ++255 231 189 255 234 192 200 194 140 40 20 7 155 112 61 190 135 80 ++155 112 61 77 45 20 134 113 63 255 234 192 255 231 189 255 231 189 ++255 231 189 255 231 189 255 230 188 255 234 192 236 217 150 155 112 61 ++116 86 23 255 234 0 255 221 0 255 232 0 116 86 23 248 233 31 ++255 255 40 255 255 41 255 255 40 255 255 42 65 48 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 65 48 15 156 123 43 200 156 55 253 230 2 253 230 2 ++249 230 10 255 234 0 116 86 23 255 221 0 255 232 0 156 123 43 ++115 82 46 236 169 118 249 228 179 255 232 190 255 231 189 255 230 188 ++255 231 189 255 234 192 211 185 152 77 45 20 155 112 61 190 135 80 ++190 135 80 77 45 20 186 149 103 255 234 192 255 231 189 255 231 189 ++255 230 188 255 230 188 255 233 191 249 228 179 164 128 83 116 86 23 ++200 156 55 255 222 0 255 221 0 255 232 0 116 86 23 248 233 31 ++255 255 41 255 255 41 255 255 40 255 255 42 65 48 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 65 48 15 156 123 43 200 156 55 255 234 0 255 255 40 ++255 255 42 255 255 40 116 86 23 255 221 0 255 222 0 255 232 0 ++156 123 43 115 82 46 236 169 118 249 228 179 255 233 191 255 231 189 ++255 231 189 255 231 189 255 234 192 134 113 63 77 45 20 190 135 80 ++107 66 48 73 53 28 255 230 188 255 231 189 255 231 189 255 230 188 ++255 232 190 255 234 192 249 228 179 164 128 83 116 86 23 255 221 0 ++99 70 33 253 230 2 255 222 0 253 230 2 116 86 23 248 233 31 ++255 255 41 255 255 41 255 255 41 255 255 41 65 48 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++4 0 2 116 86 23 156 123 43 200 156 55 255 255 40 255 255 41 ++255 255 40 255 255 42 111 90 31 255 221 0 255 222 0 255 222 0 ++255 232 0 156 123 43 115 82 46 186 149 103 249 228 179 255 234 192 ++255 231 189 255 230 188 255 234 192 236 217 150 98 62 37 77 45 20 ++77 45 20 212 179 122 255 234 192 255 230 188 255 230 188 255 232 190 ++255 230 188 211 185 152 155 112 61 116 86 23 255 221 0 255 232 0 ++156 123 43 156 123 43 255 234 0 156 123 43 156 123 43 255 255 41 ++255 255 41 255 255 41 255 255 41 156 123 43 4 0 2 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++9 4 10 255 221 0 156 123 43 200 156 55 255 255 40 255 255 40 ++255 255 41 255 255 42 111 90 31 255 221 0 255 222 0 255 221 0 ++253 230 2 200 156 55 116 86 23 116 86 23 166 125 65 236 217 150 ++255 230 188 255 234 192 255 231 189 255 234 192 236 217 150 146 115 67 ++212 179 122 255 234 192 255 231 189 255 232 190 255 234 192 255 230 188 ++208 160 108 116 86 23 65 48 15 255 221 0 255 222 0 255 232 0 ++200 156 55 123 94 35 255 234 0 156 123 43 156 123 43 255 255 42 ++255 255 41 255 255 40 255 255 42 123 94 35 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++22 13 4 255 221 0 156 123 43 200 156 55 255 255 40 255 255 41 ++255 255 41 255 255 42 111 90 31 255 221 0 255 222 0 255 222 0 ++255 232 0 116 86 23 255 221 0 253 230 2 116 86 23 86 63 36 ++190 135 80 236 217 150 255 232 190 255 234 192 255 234 192 255 234 192 ++255 234 192 255 234 192 255 234 192 255 230 188 212 179 122 133 97 51 ++73 49 22 255 221 0 116 86 23 255 221 0 255 222 0 255 232 0 ++200 156 55 123 94 35 255 234 0 156 123 43 200 156 55 255 255 41 ++255 255 41 255 255 41 200 156 55 156 123 43 65 48 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 4 0 2 83 51 28 94 65 40 94 65 40 ++89 60 38 22 13 4 83 51 28 89 60 38 9 2 0 0 0 0 ++156 123 43 255 234 0 116 86 23 200 156 55 255 255 40 255 255 41 ++255 255 41 255 255 41 156 123 43 156 123 43 255 222 0 255 222 0 ++255 232 0 116 86 23 200 156 55 253 230 2 253 230 2 200 156 55 ++40 20 7 104 73 33 146 115 67 210 175 116 249 228 179 255 230 188 ++249 228 179 223 184 122 161 127 82 115 82 46 40 20 7 156 123 43 ++253 230 2 255 234 0 116 86 23 255 221 0 255 222 0 255 232 0 ++200 156 55 156 123 43 255 221 0 111 90 31 255 255 42 255 255 40 ++255 255 41 255 255 41 156 123 43 200 156 55 65 48 15 0 0 0 ++0 0 0 9 2 0 89 60 38 75 50 26 22 13 4 89 60 38 ++94 65 40 94 65 40 83 51 28 4 0 2 0 0 0 0 0 0 ++0 0 0 4 0 2 115 82 46 236 169 118 236 169 118 236 169 118 ++232 166 115 75 50 26 190 135 80 232 166 115 133 97 51 4 0 2 ++156 123 43 255 234 0 255 221 0 116 86 23 248 233 31 255 255 41 ++255 255 41 255 255 40 255 255 42 65 48 15 253 230 2 255 221 0 ++255 232 0 116 86 23 200 156 55 253 230 2 253 230 2 200 156 55 ++98 62 37 133 97 51 104 73 33 83 51 28 89 60 38 107 78 54 ++94 65 40 77 45 20 115 82 46 164 128 83 164 128 83 156 123 43 ++255 232 0 255 232 0 116 86 23 255 221 0 255 222 0 255 232 0 ++200 156 55 156 123 43 255 221 0 111 90 31 255 255 42 255 255 40 ++255 255 41 248 233 31 73 49 22 255 234 0 65 48 15 0 0 0 ++9 2 0 133 97 51 232 166 115 190 135 80 75 50 26 232 166 115 ++236 169 118 236 169 118 236 169 118 115 82 46 4 0 2 0 0 0 ++0 0 0 9 2 0 208 160 108 249 228 179 190 135 80 86 58 39 ++81 56 37 73 53 28 89 60 38 84 59 38 155 112 61 107 66 48 ++156 123 43 255 232 0 255 234 0 73 49 22 255 255 41 255 255 40 ++255 255 41 255 255 41 255 255 41 116 86 23 255 221 0 255 222 0 ++255 232 0 156 123 43 200 156 55 255 222 0 253 230 2 200 156 55 ++83 51 28 190 135 80 182 141 64 166 125 65 155 112 61 155 112 61 ++155 112 61 208 160 108 249 228 179 255 234 192 200 194 140 123 94 35 ++255 234 0 156 123 43 156 123 43 253 230 2 255 222 0 255 232 0 ++156 123 43 156 123 43 116 86 23 248 233 31 255 255 41 255 255 41 ++248 233 31 116 86 23 255 221 0 255 232 0 65 48 15 0 0 0 ++116 87 35 155 112 61 84 59 38 89 60 38 73 53 28 81 56 37 ++86 58 39 190 135 80 249 228 179 208 160 108 4 0 2 0 0 0 ++0 0 0 0 0 0 211 185 152 235 224 165 83 51 28 211 185 152 ++230 172 123 219 162 97 131 100 59 115 82 46 40 20 7 57 32 26 ++156 123 43 255 234 0 255 222 0 156 123 43 156 123 43 255 255 42 ++255 255 41 255 255 41 255 255 41 248 233 31 116 86 23 255 234 0 ++255 221 0 253 230 2 65 48 15 255 222 0 255 232 0 255 221 0 ++83 51 28 182 141 64 166 125 65 166 125 65 190 135 80 227 165 115 ++249 228 179 255 233 191 255 232 190 255 234 192 186 149 103 123 94 35 ++255 234 0 156 123 43 156 123 43 255 232 0 255 221 0 255 222 0 ++255 221 0 116 86 23 156 123 43 255 255 41 255 255 41 248 233 31 ++116 86 23 255 221 0 253 230 2 253 230 2 65 48 15 0 0 0 ++77 45 20 40 20 7 115 82 46 131 100 59 219 162 97 230 172 123 ++211 185 152 83 51 28 249 228 179 211 185 152 0 0 0 0 0 0 ++0 0 0 83 51 28 249 228 179 186 149 103 99 70 33 249 228 179 ++227 181 122 98 62 37 133 97 51 164 128 83 161 127 82 143 108 61 ++83 51 28 255 221 0 253 230 2 253 230 2 156 123 43 99 70 33 ++248 233 31 248 233 31 248 233 31 200 156 55 116 86 23 255 234 0 ++255 232 0 255 232 0 156 123 43 123 94 35 156 123 43 83 51 28 ++155 112 61 190 135 80 225 161 106 211 185 152 249 228 179 255 231 189 ++255 233 191 255 231 189 255 231 189 255 234 192 235 224 165 121 95 40 ++116 86 23 156 123 43 156 123 43 255 234 0 255 232 0 255 234 0 ++200 156 55 123 94 35 248 233 31 248 233 31 248 233 31 123 94 35 ++255 221 0 253 230 2 255 221 0 255 232 0 58 38 16 40 20 7 ++143 108 61 161 127 82 164 128 83 133 97 51 98 62 37 227 181 122 ++249 228 179 98 62 37 186 149 103 249 228 179 83 51 28 0 0 0 ++0 0 0 143 108 61 252 233 179 131 100 59 146 115 67 255 234 192 ++146 115 67 133 97 51 230 172 123 190 135 80 83 51 28 94 65 40 ++80 54 33 83 51 28 255 221 0 255 232 0 255 221 0 156 123 43 ++83 51 28 84 59 38 86 63 36 86 63 36 69 42 21 156 123 43 ++156 123 43 200 156 55 104 73 33 69 42 21 155 112 61 208 160 108 ++236 217 150 249 228 179 255 231 189 255 234 192 255 233 191 255 231 189 ++255 230 188 255 231 189 255 231 189 255 230 188 255 232 190 249 228 179 ++186 149 103 94 65 40 83 51 28 156 123 43 156 123 43 156 123 43 ++73 49 22 84 59 38 86 63 36 86 63 36 75 50 26 156 123 43 ++255 221 0 253 230 2 253 230 2 255 221 0 75 50 26 82 57 39 ++94 65 40 83 51 28 190 135 80 230 172 123 133 97 51 146 115 67 ++255 234 192 146 115 67 131 100 59 252 233 179 143 108 61 0 0 0 ++0 0 0 161 127 82 249 228 179 83 51 28 211 185 152 255 230 188 ++104 73 33 180 145 91 249 228 179 107 78 54 166 125 65 236 217 150 ++236 217 150 190 135 80 104 73 33 255 221 0 116 86 23 107 78 54 ++200 154 86 236 169 118 236 217 150 235 224 165 236 217 150 186 149 103 ++146 115 67 107 66 48 83 51 28 133 97 51 236 169 118 249 228 179 ++255 234 192 255 233 191 255 231 189 255 231 189 255 230 188 255 231 189 ++255 231 189 255 230 188 255 231 189 255 232 190 255 234 192 255 230 188 ++236 217 150 190 135 80 98 62 37 98 62 37 131 100 59 161 127 82 ++227 181 122 249 228 179 236 217 150 235 224 165 227 181 122 131 100 59 ++99 70 33 255 221 0 255 221 0 99 70 33 190 135 80 236 169 118 ++238 197 114 166 125 65 107 78 54 249 228 179 180 145 91 104 73 33 ++255 230 188 212 179 122 83 51 28 249 228 179 161 127 82 0 0 0 ++58 38 16 227 181 122 215 204 162 84 59 38 249 228 179 212 179 122 ++83 51 28 236 217 150 211 185 152 98 62 37 227 181 122 255 233 191 ++249 228 179 227 181 122 119 92 52 40 20 7 166 125 65 236 169 118 ++236 217 150 249 228 179 255 232 190 255 234 192 255 234 192 255 234 192 ++255 234 192 249 228 179 208 160 108 115 82 46 58 38 16 155 112 61 ++230 172 123 249 228 179 255 233 191 255 232 190 255 230 188 255 231 189 ++255 230 188 255 231 189 255 233 191 255 230 188 227 181 122 190 135 80 ++77 45 20 98 62 37 190 135 80 236 217 150 255 231 189 255 234 192 ++255 234 192 255 234 192 255 234 192 255 234 192 255 232 190 255 230 188 ++208 160 108 83 51 28 22 13 4 131 100 59 229 163 112 229 163 112 ++236 217 150 236 217 150 98 62 37 211 185 152 236 217 150 83 51 28 ++212 179 122 249 228 179 84 59 38 215 204 162 227 181 122 58 38 16 ++81 56 37 249 228 179 215 204 162 143 108 61 255 234 192 164 128 83 ++107 78 54 253 234 183 180 145 91 131 100 59 255 232 190 249 228 179 ++155 112 61 32 15 7 99 70 33 166 125 65 236 169 118 236 217 150 ++255 230 188 255 232 190 255 231 189 255 230 188 255 231 189 255 231 189 ++255 231 189 255 233 191 255 233 191 236 217 150 222 164 108 104 74 41 ++77 45 20 133 97 51 227 165 115 249 228 179 255 232 190 255 231 189 ++255 231 189 255 230 188 227 181 122 155 112 61 98 62 37 83 51 28 ++190 135 80 236 217 150 255 230 188 255 234 192 255 232 190 255 231 189 ++255 230 188 255 231 189 255 231 189 255 230 188 255 231 189 255 233 191 ++255 230 188 222 164 108 58 38 16 69 42 21 40 20 7 143 108 61 ++236 217 150 255 231 189 124 98 54 186 149 103 253 234 183 107 78 54 ++164 128 83 255 234 192 143 108 61 215 204 162 249 228 179 81 56 37 ++81 56 37 236 217 150 249 228 179 235 224 165 255 233 191 98 62 37 ++186 149 103 245 232 191 98 62 37 208 160 108 255 234 192 249 228 179 ++208 160 108 153 118 66 98 62 37 190 135 80 236 217 150 255 230 188 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 233 191 255 230 188 249 228 179 ++211 185 152 186 149 103 211 185 152 249 228 179 255 232 190 255 231 189 ++255 231 189 255 230 188 236 217 150 186 149 103 210 175 116 236 217 150 ++255 230 188 255 234 192 255 231 189 255 230 188 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 ++255 232 190 255 230 188 166 125 65 69 42 21 153 118 66 178 137 80 ++233 170 120 255 231 189 208 160 108 98 62 37 245 232 191 186 149 103 ++98 62 37 255 233 191 235 224 165 249 228 179 236 217 150 81 56 37 ++58 38 16 190 135 80 236 217 150 255 233 191 255 232 190 200 154 86 ++236 217 150 236 221 188 98 62 37 236 217 150 255 233 191 255 231 189 ++255 234 192 249 228 179 143 108 61 115 82 46 255 230 188 255 231 189 ++255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 230 188 255 231 189 255 233 191 ++255 234 192 255 234 192 255 234 192 255 232 190 255 230 188 255 231 189 ++255 230 188 255 231 189 255 234 192 255 234 192 255 234 192 255 234 192 ++255 232 190 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 230 188 115 82 46 143 108 61 236 169 118 236 169 118 ++229 163 112 249 228 179 249 228 179 98 62 37 236 221 188 236 217 150 ++200 154 86 255 233 191 255 232 190 236 217 150 190 135 80 42 24 20 ++0 0 0 58 38 16 190 135 80 236 217 150 235 224 165 255 234 192 ++255 234 192 255 230 188 227 181 122 255 230 188 255 231 189 255 230 188 ++255 231 189 255 233 191 227 181 122 75 50 26 236 221 188 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 232 190 236 221 188 73 53 28 225 161 106 231 165 115 230 164 114 ++229 163 112 227 181 122 249 228 179 227 181 122 255 230 188 255 234 192 ++249 228 179 236 217 150 236 217 150 190 135 80 58 38 16 0 0 0 ++0 0 0 0 0 0 40 20 7 104 73 33 200 154 86 230 172 123 ++236 217 150 249 228 179 255 232 190 255 232 190 255 232 190 255 230 188 ++255 231 189 255 232 190 249 228 179 94 65 40 236 221 188 255 231 189 ++255 231 189 255 232 190 255 233 191 255 233 191 255 231 189 255 230 188 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 ++255 232 190 255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 230 188 255 231 189 255 233 191 255 233 191 255 231 189 255 230 188 ++255 231 189 236 221 188 84 59 38 236 169 118 231 165 115 231 165 115 ++230 164 114 230 163 113 230 172 123 227 181 122 230 172 123 227 181 122 ++236 169 118 200 154 86 104 73 33 40 20 7 9 2 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 20 10 4 115 82 46 ++190 135 80 236 169 118 233 169 121 236 217 150 249 228 179 255 232 190 ++255 230 188 255 234 192 236 217 150 75 50 26 211 185 152 255 233 191 ++255 230 188 249 228 179 235 224 165 235 224 165 255 230 188 255 233 191 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 233 191 ++255 230 188 236 217 150 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 ++255 231 189 255 230 188 235 224 165 249 228 179 255 230 188 255 231 189 ++255 233 191 211 185 152 69 42 21 200 154 86 232 168 117 231 165 115 ++231 165 115 230 164 114 230 163 113 231 165 115 236 169 118 190 135 80 ++115 82 46 20 10 4 9 2 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++36 17 7 104 74 41 200 154 86 231 165 115 230 172 123 249 228 179 ++255 231 189 255 234 192 236 217 150 69 42 21 208 160 108 255 234 192 ++255 233 191 227 181 122 219 162 97 232 166 115 230 172 123 236 217 150 ++255 231 189 255 233 191 255 234 192 255 234 192 255 234 192 255 234 192 ++255 234 192 255 234 192 255 232 190 255 231 189 255 231 189 236 217 150 ++225 161 106 227 181 122 255 234 192 255 234 192 255 234 192 255 234 192 ++255 234 192 255 234 192 255 234 192 255 232 190 255 231 189 255 231 189 ++255 230 188 236 217 150 225 161 106 219 162 97 249 228 179 255 231 189 ++255 234 192 208 160 108 73 49 22 229 163 112 231 165 115 231 165 115 ++231 165 115 230 164 114 236 169 118 200 154 86 104 74 41 36 17 7 ++0 0 0 4 0 2 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 58 38 16 200 154 86 231 165 115 227 181 122 ++255 233 191 255 231 189 249 228 179 168 130 70 94 65 40 249 228 179 ++255 233 191 255 231 189 131 100 59 155 112 61 230 172 123 255 230 188 ++255 234 192 249 228 179 211 185 152 211 185 152 211 185 152 211 185 152 ++211 185 152 235 224 165 255 230 188 255 234 192 236 217 150 200 154 86 ++190 135 80 236 217 150 249 228 179 215 204 162 211 185 152 211 185 152 ++211 185 152 211 185 152 236 217 150 255 230 188 255 234 192 255 234 192 ++249 228 179 190 135 80 98 62 37 227 181 122 255 232 190 255 232 190 ++249 228 179 94 65 40 166 125 65 236 169 118 230 164 114 230 164 114 ++229 163 112 232 166 115 200 154 86 58 38 16 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 133 97 51 232 166 115 227 181 122 ++255 234 192 255 230 188 255 234 192 227 181 122 69 42 21 227 181 122 ++255 234 192 255 230 188 225 161 106 75 50 26 233 178 115 186 149 103 ++131 100 59 104 73 33 82 57 39 107 78 54 107 78 54 107 78 54 ++82 57 39 89 60 38 131 100 59 146 115 67 138 104 59 182 141 64 ++123 94 35 119 92 52 115 82 46 82 57 39 107 78 54 107 78 54 ++107 78 54 91 67 37 86 63 36 119 92 52 146 115 67 161 127 82 ++236 169 118 107 78 54 166 125 65 249 228 179 255 232 190 255 234 192 ++236 217 150 69 42 21 225 161 106 231 165 115 230 163 113 232 168 117 ++227 181 122 230 172 123 119 92 52 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 36 17 7 200 154 86 236 217 150 ++255 233 191 255 231 189 255 231 189 249 228 179 104 73 33 153 118 66 ++236 217 150 236 217 150 200 154 86 42 24 20 73 49 22 107 78 54 ++161 127 82 172 197 155 212 216 184 231 255 198 235 255 203 232 255 199 ++231 255 198 172 197 155 186 149 103 132 119 61 107 78 54 69 42 21 ++107 78 54 161 127 82 172 197 155 210 220 166 231 255 198 232 255 199 ++235 255 203 231 255 198 189 206 156 172 197 155 161 127 82 134 113 63 ++75 50 26 42 24 20 155 112 61 227 181 122 249 228 179 255 234 192 ++164 128 83 104 73 33 230 164 114 230 163 113 231 165 115 236 217 150 ++255 234 192 215 204 162 32 15 7 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 186 149 103 249 228 179 ++255 231 189 255 231 189 255 230 188 255 233 191 161 127 82 115 82 46 ++236 169 118 190 135 80 80 54 33 82 57 39 172 197 155 230 232 196 ++247 255 212 237 255 203 235 255 203 232 255 199 231 255 198 232 255 198 ++231 255 198 212 216 184 172 197 155 107 78 54 107 78 54 172 197 155 ++212 216 184 237 255 203 231 255 198 212 216 184 191 208 160 212 216 184 ++231 255 198 233 255 199 237 255 203 237 255 203 247 255 212 232 255 199 ++173 198 156 125 102 55 51 35 26 155 112 61 236 217 150 255 230 188 ++115 82 46 161 127 82 236 169 118 232 168 117 236 217 150 255 232 190 ++255 234 192 212 203 153 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 4 0 2 186 149 103 255 234 192 ++255 230 188 255 231 189 255 231 189 255 232 190 208 160 108 83 51 28 ++166 125 65 91 67 37 172 197 155 212 216 184 212 216 184 161 127 82 ++161 127 82 191 208 160 230 232 196 231 255 198 231 255 198 231 255 198 ++231 255 198 232 255 199 235 255 203 232 255 199 212 216 184 210 220 166 ++210 220 166 199 209 176 173 198 156 189 206 156 230 232 196 233 255 199 ++231 255 198 231 255 198 230 232 196 199 209 176 186 149 103 134 113 63 ++191 208 160 212 216 184 173 198 156 107 78 54 166 125 65 215 204 162 ++83 51 28 200 154 86 232 166 115 236 217 150 255 232 190 255 231 189 ++255 234 192 215 204 162 4 0 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 9 2 0 186 149 103 255 234 192 ++255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 104 74 41 ++32 15 7 172 197 155 230 232 196 161 127 82 51 35 26 125 102 55 ++172 197 155 212 216 184 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 212 216 184 199 209 176 ++172 197 155 172 197 155 191 208 160 230 232 196 232 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 230 232 196 172 197 155 132 119 61 ++51 35 26 125 102 55 212 216 184 191 208 160 82 57 39 186 149 103 ++106 76 45 236 169 118 232 170 121 249 228 179 255 232 190 255 231 189 ++255 234 192 215 204 162 4 0 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 9 2 0 186 149 103 255 234 192 ++255 231 189 255 231 189 255 231 189 255 233 191 249 228 179 138 104 59 ++42 24 20 191 208 160 161 127 82 91 67 37 172 197 155 212 216 184 ++235 255 203 232 255 199 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 199 209 176 212 216 184 173 198 156 ++172 197 155 173 198 156 230 232 196 232 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 232 255 198 233 255 199 230 232 196 ++173 198 156 125 102 55 107 78 54 199 209 176 82 57 39 138 104 59 ++107 78 54 236 169 118 227 181 122 255 234 192 255 230 188 255 231 189 ++255 234 192 215 204 162 4 0 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 186 149 103 255 234 192 ++255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 236 169 118 ++133 97 51 73 53 28 107 78 54 172 197 155 199 209 176 232 255 199 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++212 216 184 199 209 176 212 216 184 199 209 176 199 209 176 173 198 156 ++199 209 176 199 209 176 173 198 156 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 232 255 198 ++230 232 196 191 208 160 134 113 63 73 53 28 106 76 45 83 51 28 ++168 130 70 236 169 118 236 217 150 255 232 190 255 231 189 255 231 189 ++255 234 192 211 185 152 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 22 13 4 208 160 108 255 233 191 ++255 231 189 255 231 189 255 231 189 255 231 189 255 233 191 236 217 150 ++225 161 106 83 51 28 161 127 82 191 208 160 230 232 196 232 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 212 216 184 ++199 209 176 199 209 176 199 209 176 199 209 176 199 209 176 199 209 176 ++173 198 156 173 198 156 199 209 176 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++232 255 198 230 232 196 172 197 155 73 53 28 155 112 61 73 53 28 ++236 169 118 231 165 115 255 230 188 255 230 188 255 231 189 255 231 189 ++255 234 192 215 204 162 22 13 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 133 97 51 236 169 118 255 231 189 ++255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 236 217 150 ++200 154 86 82 57 39 173 198 156 199 209 176 232 255 199 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++173 198 156 173 198 156 199 209 176 173 198 156 199 209 176 212 216 184 ++199 209 176 173 198 156 199 209 176 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 232 255 199 230 232 196 132 119 61 104 73 33 80 54 33 ++232 166 115 230 172 123 255 230 188 255 230 188 255 231 189 255 231 189 ++255 232 190 249 228 179 115 82 46 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 230 188 ++255 231 189 255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 ++166 125 65 107 78 54 189 206 156 230 232 196 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++230 232 196 212 216 184 199 209 176 173 198 156 173 198 156 199 209 176 ++199 209 176 173 198 156 199 209 176 199 209 176 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 237 255 203 161 127 82 104 73 33 84 59 38 ++232 166 115 235 224 165 255 232 190 255 231 189 255 231 189 255 231 189 ++255 231 189 255 233 191 146 115 67 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 ++82 57 39 172 197 155 173 198 156 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 199 209 176 199 209 176 173 198 156 199 209 176 199 209 176 ++173 198 156 230 232 196 231 255 198 173 198 156 230 232 196 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 233 255 199 212 216 184 82 57 39 166 125 65 ++230 163 113 235 224 165 255 233 191 255 231 189 255 231 189 255 231 189 ++255 230 188 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 ++82 57 39 172 197 155 172 197 155 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 199 209 176 231 255 198 ++231 255 198 212 216 184 173 198 156 199 209 176 173 198 156 173 198 156 ++199 209 176 231 255 198 212 216 184 173 198 156 199 209 176 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 232 255 198 230 232 196 82 57 39 200 154 86 ++233 170 120 249 228 179 255 232 190 255 231 189 255 231 189 255 231 189 ++255 231 189 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 233 191 ++82 57 39 172 197 155 172 197 155 212 216 184 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 199 209 176 199 209 176 ++231 255 198 231 255 198 231 255 198 199 209 176 173 198 156 199 209 176 ++231 255 198 231 255 198 199 209 176 173 198 156 199 209 176 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 233 255 199 231 255 198 82 57 39 190 135 80 ++236 217 150 255 233 191 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 234 192 ++119 92 52 132 119 61 173 198 156 172 197 155 212 216 184 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 212 216 184 199 209 176 ++230 232 196 231 255 198 231 255 198 199 209 176 173 198 156 173 198 156 ++199 209 176 199 209 176 199 209 176 173 198 156 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 235 255 203 172 197 155 86 63 36 219 162 97 ++236 217 150 255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 ++255 231 189 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 231 189 ++255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 255 234 192 ++200 154 86 82 57 39 191 208 160 172 197 155 173 198 156 212 216 184 ++231 255 198 232 255 199 231 255 198 231 255 198 231 255 198 199 209 176 ++199 209 176 199 209 176 199 209 176 199 209 176 173 198 156 212 216 184 ++199 209 176 173 198 156 173 198 156 199 209 176 232 255 199 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 235 255 203 132 119 61 133 97 51 236 169 118 ++236 217 150 255 233 191 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 255 230 188 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 255 233 191 ++211 185 152 82 57 39 172 197 155 173 198 156 172 197 155 172 197 155 ++206 210 177 230 232 196 233 255 199 233 255 199 231 255 198 231 255 198 ++199 209 176 199 209 176 173 198 156 173 198 156 199 209 176 191 208 160 ++172 197 155 172 197 155 199 209 176 230 232 196 230 232 196 231 255 198 ++233 255 199 233 255 199 233 255 199 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 199 209 176 107 78 54 166 125 65 233 170 120 ++249 228 179 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 236 217 150 ++255 233 191 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 230 188 133 97 51 125 102 55 189 206 156 173 198 156 172 197 155 ++172 197 155 173 198 156 199 209 176 212 216 184 231 255 198 233 255 199 ++232 255 199 230 232 196 199 209 176 173 198 156 191 208 160 172 197 155 ++172 197 155 172 197 155 172 197 155 172 197 155 173 198 156 199 209 176 ++199 209 176 199 209 176 212 216 184 232 255 198 232 255 199 232 255 199 ++231 255 198 212 216 184 186 149 103 83 51 28 230 163 113 230 172 123 ++255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 ++255 230 188 255 234 192 161 127 82 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 138 104 59 236 169 118 227 181 122 ++255 234 192 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 227 165 115 86 63 36 161 127 82 189 206 156 173 198 156 ++172 197 155 172 197 155 172 197 155 172 197 155 189 206 156 191 208 160 ++191 208 160 191 208 160 173 198 156 172 197 155 172 197 155 173 198 156 ++173 198 156 173 198 156 173 198 156 173 198 156 172 197 155 172 197 155 ++172 197 155 172 197 155 173 198 156 189 206 156 189 206 156 191 208 160 ++191 208 160 172 197 155 86 63 36 190 135 80 232 166 115 230 172 123 ++255 233 191 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 230 188 138 104 59 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 77 45 20 219 162 97 236 217 150 ++255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 255 230 188 ++255 234 192 235 224 165 200 154 86 96 68 37 125 102 55 172 197 155 ++191 208 160 173 198 156 173 198 156 172 197 155 172 197 155 172 197 155 ++172 197 155 172 197 155 172 197 155 173 198 156 173 198 156 173 198 156 ++173 198 156 173 198 156 173 198 156 173 198 156 172 197 155 172 197 155 ++172 197 155 172 197 155 173 198 156 173 198 156 173 198 156 172 197 155 ++132 119 61 82 57 39 115 82 46 236 169 118 229 163 112 230 172 123 ++255 233 191 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 234 192 235 224 165 69 42 21 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 190 135 80 227 181 122 ++249 228 179 255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 ++255 234 192 236 217 150 200 154 86 96 68 37 107 78 54 82 57 39 ++107 78 54 172 197 155 172 197 155 172 197 155 172 197 155 173 198 156 ++173 198 156 173 198 156 173 198 156 172 197 155 173 198 156 173 198 156 ++173 198 156 172 197 155 172 197 155 172 197 155 172 197 155 172 197 155 ++172 197 155 173 198 156 172 197 155 107 78 54 82 57 39 82 57 39 ++107 78 54 172 197 155 73 53 28 200 154 86 230 164 114 230 172 123 ++255 234 192 255 230 188 255 231 189 255 231 189 255 231 189 255 230 188 ++255 234 192 211 185 152 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 9 2 0 190 135 80 232 166 115 ++236 217 150 255 234 192 255 231 189 255 231 189 255 231 189 255 231 189 ++255 234 192 249 228 179 98 62 37 161 127 82 212 216 184 173 198 156 ++161 127 82 82 57 39 172 197 155 191 208 160 173 198 156 172 197 155 ++161 127 82 186 149 103 173 198 156 191 208 160 189 206 156 173 198 156 ++172 197 155 172 197 155 173 198 156 191 208 160 212 216 184 231 255 198 ++231 255 198 231 255 198 231 255 198 210 220 166 210 220 166 210 220 166 ++231 255 198 230 232 196 161 127 82 104 74 41 236 169 118 230 172 123 ++249 228 179 255 232 190 255 230 188 255 231 189 255 231 189 255 231 189 ++255 231 189 186 149 103 9 2 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 4 0 2 99 70 33 232 166 115 ++236 217 150 255 232 190 255 230 188 255 231 189 255 231 189 255 230 188 ++255 232 190 236 217 150 89 60 38 172 197 155 212 216 184 233 255 199 ++235 255 203 237 255 203 233 255 199 231 255 198 212 216 184 172 197 155 ++125 102 55 107 78 54 107 78 54 107 78 54 125 102 55 172 197 155 ++191 208 160 212 216 184 232 255 199 237 255 203 235 255 203 233 255 199 ++233 255 199 233 255 199 232 255 199 233 255 199 233 255 199 233 255 199 ++232 255 198 212 216 184 172 197 155 94 65 40 236 169 118 229 163 112 ++227 181 122 255 230 188 255 231 189 255 231 189 255 230 188 255 233 191 ++236 217 150 98 62 37 4 0 2 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 22 13 4 190 135 80 ++233 169 121 249 228 179 255 234 192 255 231 189 255 231 189 255 234 192 ++249 228 179 233 169 121 166 125 65 91 67 37 172 197 155 212 216 184 ++237 255 203 237 255 203 237 255 203 235 255 203 212 216 184 173 198 156 ++132 119 61 81 56 37 138 104 59 178 137 80 133 97 51 73 53 28 ++82 57 39 107 78 54 86 63 36 161 127 82 173 198 156 211 215 171 ++212 216 184 230 232 196 233 255 199 237 255 203 237 255 203 235 255 203 ++212 216 184 172 197 155 82 57 39 168 130 70 236 169 118 230 164 114 ++230 164 114 249 228 179 255 233 191 255 230 188 255 232 190 255 230 188 ++208 160 108 22 13 4 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 96 68 37 ++236 169 118 227 181 122 249 228 179 255 232 190 255 232 190 249 228 179 ++227 181 122 230 164 114 230 163 113 104 73 33 51 35 26 161 127 82 ++186 149 103 186 149 103 161 127 82 132 119 61 86 63 36 80 54 33 ++133 97 51 219 162 97 236 169 118 236 169 118 232 166 115 225 161 106 ++225 161 106 225 161 106 200 154 86 106 76 45 84 59 38 94 65 40 ++86 58 39 86 63 36 132 119 61 161 127 82 186 149 103 161 127 82 ++107 78 54 9 2 0 22 13 4 166 125 65 232 166 115 231 165 115 ++229 163 112 227 181 122 249 228 179 255 233 191 249 228 179 227 181 122 ++98 62 37 9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32 15 7 ++166 125 65 232 166 115 233 170 120 227 181 122 227 181 122 232 168 117 ++232 166 115 225 161 106 115 82 46 9 2 0 0 0 0 106 76 45 ++138 104 59 131 100 59 131 100 59 131 100 59 190 135 80 236 169 118 ++236 169 118 231 165 115 231 165 115 230 164 114 231 165 115 231 165 115 ++231 165 115 231 165 115 232 166 115 236 169 118 236 169 118 236 169 118 ++236 169 118 186 149 103 146 115 67 146 115 67 146 115 67 104 73 33 ++10 1 0 0 0 0 0 0 0 32 15 7 166 125 65 236 169 118 ++232 168 117 230 163 113 227 181 122 249 228 179 227 181 122 155 112 61 ++32 15 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++20 10 4 155 112 61 225 161 106 236 169 118 236 169 118 236 169 118 ++208 160 108 115 82 46 4 0 2 0 0 0 0 0 0 180 145 91 ++236 169 118 236 169 118 236 169 118 236 169 118 236 169 118 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 230 163 113 231 165 115 230 172 123 235 224 165 ++249 228 179 255 232 190 255 234 192 255 234 192 249 228 179 233 170 120 ++22 13 4 0 0 0 0 0 0 0 0 0 20 10 4 155 112 61 ++225 161 106 230 163 113 230 163 113 225 161 106 155 112 61 20 10 4 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 58 38 16 138 104 59 146 115 67 133 97 51 ++22 13 4 0 0 0 0 0 0 0 0 0 0 0 0 166 125 65 ++236 169 118 230 164 114 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 230 164 114 232 168 117 236 217 150 255 233 191 255 232 190 ++255 232 190 255 231 189 255 231 189 255 231 189 255 234 192 227 165 115 ++22 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++58 38 16 116 87 35 116 87 35 58 38 16 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 58 38 16 ++229 163 112 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++230 164 114 229 163 112 227 181 122 255 232 190 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 119 92 52 ++4 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 10 4 ++229 163 112 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++230 163 113 232 168 117 249 228 179 255 232 190 255 230 188 255 231 189 ++255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 81 56 37 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 13 4 ++200 154 86 232 166 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++229 163 112 227 181 122 255 233 191 255 230 188 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 234 192 236 217 150 69 42 21 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 2 ++94 65 40 236 169 118 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++230 163 113 249 228 179 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 234 192 186 149 103 9 2 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++73 53 28 236 169 118 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++229 163 112 249 228 179 255 232 190 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 234 192 161 127 82 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++73 53 28 236 169 118 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 230 163 113 ++230 172 123 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 234 192 161 127 82 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 10 4 ++190 135 80 232 168 117 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 229 163 112 ++236 217 150 255 233 191 255 230 188 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 234 192 227 181 122 58 38 16 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 10 4 ++229 163 112 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 230 164 114 230 163 113 230 163 113 230 164 114 229 163 112 ++236 217 150 255 234 192 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 232 190 249 228 179 73 53 28 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 115 82 46 ++232 166 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++230 164 114 230 163 113 230 172 123 236 217 150 233 169 121 225 161 106 ++236 217 150 255 233 191 255 230 188 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 234 192 164 128 83 ++9 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 178 137 80 ++236 169 118 230 164 114 231 165 115 231 165 115 231 165 115 230 164 114 ++231 165 115 236 217 150 255 230 188 255 232 190 235 224 165 233 169 121 ++230 172 123 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 227 181 122 ++20 10 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 58 38 16 200 154 86 ++232 168 117 231 165 115 231 165 115 231 165 115 231 165 115 229 163 112 ++227 181 122 255 231 189 255 231 189 255 231 189 255 230 188 229 163 112 ++219 162 97 249 228 179 255 232 190 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 231 189 249 228 179 ++89 60 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 9 2 0 131 100 59 236 169 118 ++230 164 114 231 165 115 231 165 115 231 165 115 230 164 114 232 168 117 ++249 228 179 255 232 190 255 230 188 255 233 191 236 217 150 116 87 35 ++166 125 65 255 230 188 255 232 190 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 231 189 255 231 189 255 230 188 255 234 192 ++186 149 103 20 10 4 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 32 15 7 166 125 65 232 166 115 ++231 165 115 231 165 115 231 165 115 231 165 115 229 163 112 227 181 122 ++255 233 191 255 230 188 255 231 189 255 234 192 208 160 108 69 42 21 ++225 161 106 255 230 188 255 231 189 255 231 189 255 231 189 255 231 189 ++255 231 189 255 231 189 255 232 190 255 234 192 255 234 192 249 228 179 ++208 160 108 58 38 16 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 20 10 4 98 62 37 32 15 7 190 135 80 ++236 169 118 230 164 114 231 165 115 231 165 115 230 163 113 249 228 179 ++255 231 189 255 231 189 255 230 188 255 234 192 227 181 122 155 112 61 ++227 181 122 255 232 190 255 232 190 255 231 189 255 230 188 255 231 189 ++255 231 189 255 230 188 249 228 179 227 181 122 227 181 122 230 172 123 ++58 38 16 83 51 28 123 94 35 9 2 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 115 82 46 232 166 115 98 62 37 104 73 33 ++229 163 112 231 165 115 231 165 115 231 165 115 230 163 113 249 228 179 ++255 234 192 255 232 190 255 234 192 255 230 188 249 228 179 249 228 179 ++235 224 165 249 228 179 255 230 188 236 217 150 230 172 123 236 217 150 ++227 181 122 232 168 117 231 165 115 230 163 113 232 166 115 155 112 61 ++58 38 16 219 162 97 225 161 106 9 2 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 40 20 7 190 135 80 236 169 118 178 137 80 22 13 4 ++119 92 52 236 169 118 231 165 115 230 164 114 230 164 114 230 172 123 ++236 217 150 249 228 179 236 217 150 227 181 122 230 172 123 230 163 113 ++229 163 112 231 165 115 230 172 123 232 168 117 230 163 113 230 163 113 ++230 163 113 230 164 114 230 164 114 232 166 115 155 112 61 22 13 4 ++133 97 51 236 169 118 225 161 106 69 42 21 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++36 17 7 190 135 80 232 166 115 231 165 115 232 166 115 155 112 61 ++58 38 16 219 162 97 232 168 117 230 164 114 231 165 115 229 163 112 ++231 165 115 233 169 121 229 163 112 229 163 112 230 163 113 231 165 115 ++231 165 115 230 164 114 230 163 113 230 164 114 231 165 115 231 165 115 ++231 165 115 230 164 114 236 169 118 200 154 86 32 15 7 115 82 46 ++230 163 113 231 165 115 232 166 115 200 154 86 58 38 16 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++166 125 65 236 169 118 231 165 115 230 164 114 232 166 115 230 164 114 ++58 38 16 69 42 21 225 161 106 232 168 117 231 165 115 231 165 115 ++230 164 114 230 163 113 230 164 114 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++230 164 114 232 166 115 225 161 106 104 73 33 89 60 38 232 166 115 ++232 168 117 230 164 114 231 165 115 236 169 118 133 97 51 4 0 2 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 69 42 21 ++225 161 106 232 168 117 230 164 114 231 165 115 230 164 114 232 166 115 ++190 135 80 58 38 16 166 125 65 236 169 118 236 169 118 236 169 118 ++236 169 118 236 169 118 236 169 118 236 169 118 232 168 117 236 169 118 ++236 169 118 236 169 118 236 169 118 236 169 118 236 169 118 236 169 118 ++236 169 118 225 161 106 115 82 46 22 13 4 168 130 70 236 169 118 ++230 164 114 231 165 115 230 164 114 231 165 115 225 161 106 104 73 33 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 9 2 0 155 112 61 ++236 169 118 230 164 114 231 165 115 231 165 115 231 165 115 231 165 115 ++236 169 118 133 97 51 36 17 7 166 125 65 190 135 80 190 135 80 ++190 135 80 190 135 80 190 135 80 190 135 80 225 161 106 190 135 80 ++190 135 80 190 135 80 190 135 80 190 135 80 190 135 80 190 135 80 ++190 135 80 104 73 33 32 15 7 166 125 65 232 166 115 230 164 114 ++231 165 115 231 165 115 231 165 115 230 164 114 236 169 118 200 154 86 ++22 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 69 42 21 225 161 106 ++231 165 115 230 164 114 231 165 115 231 165 115 231 165 115 230 164 114 ++232 166 115 225 161 106 98 62 37 46 29 24 132 119 61 132 119 61 ++132 119 61 132 119 61 132 119 61 46 29 24 77 45 20 107 78 54 ++132 119 61 132 119 61 132 119 61 132 119 61 132 119 61 132 119 61 ++107 78 54 32 15 7 166 125 65 236 169 118 231 165 115 230 164 114 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 236 169 118 ++115 82 46 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 81 56 37 236 169 118 ++230 164 114 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++230 164 114 232 168 117 225 161 106 104 74 41 173 198 156 247 255 212 ++247 255 212 247 255 212 237 255 203 199 209 176 172 197 155 232 255 199 ++247 255 212 247 255 212 247 255 212 247 255 212 247 255 212 247 255 212 ++119 92 52 166 125 65 232 166 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 236 169 118 ++138 104 59 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 22 13 4 190 135 80 232 168 117 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 230 164 114 236 169 118 166 125 65 107 78 54 231 255 198 ++231 255 198 231 255 198 231 255 198 235 255 203 237 255 203 232 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 237 255 203 173 198 156 ++86 63 36 232 166 115 231 165 115 230 164 114 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 232 168 117 ++219 162 97 69 42 21 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 22 13 4 229 163 112 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 232 166 115 83 51 28 173 198 156 ++235 255 203 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 232 255 198 235 255 203 107 78 54 ++166 125 65 236 169 118 230 164 114 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 ++236 169 118 80 54 33 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 20 10 4 225 161 106 232 166 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 230 164 114 232 168 117 190 135 80 91 67 37 ++235 255 203 231 255 198 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 237 255 203 172 197 155 98 62 37 ++225 161 106 232 166 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++236 169 118 80 54 33 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 69 42 21 229 163 112 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 230 164 114 232 166 115 96 68 37 ++172 197 155 237 255 203 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 231 255 198 119 92 52 155 112 61 ++236 169 118 230 164 114 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++236 169 118 80 54 33 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 168 130 70 236 169 118 230 164 114 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 236 169 118 166 125 65 ++134 113 63 247 255 212 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 231 255 198 230 232 196 73 53 28 232 166 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++236 169 118 73 53 28 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 236 169 118 190 135 80 ++107 78 54 230 232 196 233 255 199 231 255 198 231 255 198 231 255 198 ++231 255 198 231 255 198 235 255 203 172 197 155 104 74 41 236 169 118 ++230 164 114 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++236 169 118 96 68 37 9 2 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 236 169 118 ++104 73 33 172 197 155 237 255 203 231 255 198 231 255 198 231 255 198 ++231 255 198 232 255 198 231 255 198 82 57 39 190 135 80 232 166 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++232 166 115 200 154 86 22 13 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 236 169 118 ++190 135 80 82 57 39 231 255 198 231 255 198 231 255 198 231 255 198 ++231 255 198 237 255 203 186 149 103 115 82 46 232 166 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 229 163 112 22 13 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 ++236 169 118 104 74 41 186 149 103 237 255 203 231 255 198 231 255 198 ++233 255 199 230 232 196 107 78 54 190 135 80 236 169 118 230 164 114 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++232 166 115 225 161 106 22 13 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 ++232 166 115 200 154 86 82 57 39 231 255 198 233 255 199 232 255 199 ++235 255 203 172 197 155 98 62 37 236 169 118 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 225 161 106 22 13 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 178 137 80 236 169 118 230 164 114 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 232 166 115 116 87 35 132 119 61 232 255 199 233 255 199 ++210 220 166 73 53 28 190 135 80 233 170 120 230 164 114 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 225 161 106 22 13 4 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 83 51 28 230 163 113 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++230 164 114 236 169 118 155 112 61 73 53 28 132 119 61 134 113 63 ++125 102 55 51 35 26 219 162 97 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 230 164 114 ++236 169 118 133 97 51 9 2 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 20 10 4 225 161 106 232 166 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 232 168 117 219 162 97 69 42 21 4 0 2 9 2 0 ++9 2 0 133 97 51 236 169 118 230 164 114 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 ++231 165 115 231 165 115 231 165 115 231 165 115 231 165 115 232 168 117 ++219 162 97 58 38 16 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +diff --git a/drivers/video/logo/logo_zen_clut224.ppm b/drivers/video/logo/logo_zen_clut224.ppm +new file mode 100644 +index 000000000000..f4c78972fe58 +--- /dev/null ++++ b/drivers/video/logo/logo_zen_clut224.ppm +@@ -0,0 +1,2043 @@ ++P3 ++102 120 ++255 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 1 1 0 1 1 0 2 3 0 2 3 1 5 6 ++1 7 9 1 8 11 2 10 13 2 11 15 2 13 18 3 16 22 ++3 18 24 3 21 29 4 23 31 5 25 34 5 28 38 6 30 41 ++6 30 41 6 33 45 7 36 49 7 36 49 7 36 49 7 36 49 ++7 36 49 7 38 51 7 38 51 7 36 49 7 36 49 7 36 49 ++7 36 49 6 33 45 6 33 45 6 30 41 5 28 38 5 27 37 ++5 25 34 4 22 30 4 20 27 3 16 22 3 15 20 2 13 18 ++2 11 15 2 9 12 1 7 9 1 7 9 1 4 5 0 3 4 ++0 2 3 0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 ++0 1 1 0 2 3 0 3 4 1 4 5 1 5 6 1 7 9 ++2 9 12 2 11 15 2 12 16 3 16 22 3 18 24 3 21 29 ++5 25 34 5 27 37 6 30 41 6 33 45 7 36 49 7 38 51 ++6 40 54 8 41 55 8 42 57 8 44 59 8 45 61 8 45 61 ++8 45 61 8 45 61 8 45 61 8 45 61 8 45 61 8 44 59 ++8 42 57 8 42 57 8 41 55 7 38 51 7 36 49 6 33 45 ++6 33 45 5 29 40 5 25 34 4 23 31 4 20 27 3 18 24 ++3 15 20 2 13 18 1 10 14 1 8 11 1 7 9 1 5 6 ++1 4 5 0 2 3 0 2 3 0 1 1 0 1 1 0 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 ++0 2 3 0 3 4 1 4 5 1 5 6 1 7 9 2 9 12 ++2 12 16 3 15 20 3 16 22 4 20 27 4 23 31 5 27 37 ++6 30 41 6 33 45 7 36 49 7 39 53 8 42 57 8 45 61 ++9 47 64 9 47 64 9 49 66 9 50 69 9 50 69 10 53 71 ++10 53 71 10 53 71 10 53 71 10 53 71 10 53 71 9 50 69 ++9 49 66 9 49 66 9 47 64 8 45 61 8 42 57 8 42 57 ++7 39 53 7 36 49 6 33 45 5 28 38 5 25 34 4 23 31 ++4 20 27 3 16 22 3 15 20 2 11 15 2 9 12 1 7 9 ++1 5 6 0 3 4 0 3 4 0 2 3 0 1 1 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 ++0 3 4 1 4 5 1 5 6 1 7 9 2 9 12 2 12 16 ++3 15 20 3 18 24 3 21 29 5 25 34 6 30 41 6 33 45 ++7 38 51 8 41 55 8 44 59 9 47 64 9 49 66 10 53 71 ++10 53 71 10 54 74 11 56 77 11 58 79 11 58 79 11 58 79 ++11 58 79 11 58 79 11 58 79 11 58 79 11 58 79 11 58 79 ++11 56 77 11 56 77 10 54 74 10 53 71 9 50 69 9 49 66 ++8 45 61 8 42 57 6 40 54 7 36 49 6 33 45 5 29 40 ++5 25 34 3 21 29 3 18 24 3 15 20 2 12 16 2 10 13 ++1 7 9 1 5 6 0 3 4 0 3 4 0 2 3 0 2 3 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 2 3 ++0 3 4 1 5 6 1 7 9 1 8 11 2 12 16 3 15 20 ++4 19 26 4 23 31 5 27 37 6 30 41 7 36 49 6 40 54 ++8 44 59 9 47 64 9 50 69 10 53 71 11 56 77 11 58 79 ++11 58 79 11 60 82 12 61 82 12 62 85 12 64 87 12 64 87 ++12 64 87 12 64 87 12 64 87 12 64 87 12 64 87 12 64 87 ++12 62 85 11 60 82 11 60 82 11 58 79 11 56 77 10 54 74 ++10 53 71 9 49 66 8 45 61 8 42 57 7 39 53 7 36 49 ++6 30 41 5 27 37 4 22 30 4 19 26 3 15 20 2 12 16 ++2 10 13 1 7 9 1 5 6 0 3 4 0 2 3 0 2 3 ++0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 0 1 1 0 2 3 0 2 3 ++1 4 5 1 5 6 1 8 11 2 10 13 2 13 18 3 18 24 ++4 22 30 5 27 37 6 30 41 7 36 49 8 41 55 8 45 61 ++9 49 66 10 53 71 10 54 74 11 58 79 12 61 82 12 61 82 ++12 64 87 12 64 87 12 66 90 12 66 90 13 67 91 13 67 91 ++13 67 91 13 67 92 13 67 92 13 67 91 13 67 91 12 66 90 ++12 66 90 12 64 87 12 64 87 12 64 87 11 60 82 11 58 79 ++11 58 79 10 54 74 9 50 69 9 47 64 8 44 59 8 41 55 ++7 36 49 6 30 41 5 27 37 4 23 31 4 19 26 3 15 20 ++2 12 16 2 9 12 1 7 9 1 4 5 0 3 4 0 2 3 ++0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 1 0 1 1 0 2 3 0 3 4 ++1 5 6 1 7 9 2 9 12 2 12 16 3 16 22 3 21 29 ++5 25 34 6 30 41 7 36 49 8 41 55 8 45 61 9 49 66 ++10 54 74 11 58 79 11 60 82 12 62 85 12 64 87 12 66 90 ++13 67 92 13 67 92 13 69 94 13 69 94 13 69 94 13 69 94 ++13 69 94 13 71 96 13 71 96 13 69 94 13 69 94 13 69 94 ++13 69 94 13 68 93 13 68 93 13 67 91 12 64 87 12 64 87 ++12 62 85 11 58 79 11 56 77 10 53 71 9 50 69 8 45 61 ++8 41 55 7 36 49 6 30 41 5 27 37 4 23 31 3 18 24 ++3 15 20 2 11 15 1 8 11 1 7 9 1 5 6 0 3 4 ++0 2 3 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 1 0 1 1 0 1 1 0 2 3 1 4 5 ++1 7 9 2 9 12 2 12 16 3 15 20 4 19 26 4 24 33 ++6 30 41 7 36 49 8 41 55 8 45 61 9 50 69 10 54 74 ++11 58 79 12 62 85 12 64 87 13 67 91 13 68 93 13 69 94 ++13 69 94 13 71 96 13 72 97 13 72 98 14 73 99 14 73 99 ++14 73 99 13 72 98 13 72 98 14 73 99 13 72 98 13 72 98 ++13 72 98 13 72 97 13 71 96 13 69 94 13 69 94 13 67 91 ++12 66 90 12 64 87 12 62 85 11 58 79 10 54 74 9 50 69 ++9 47 64 8 41 55 7 36 49 6 33 45 5 27 37 4 23 31 ++3 18 24 2 13 18 1 10 14 1 8 11 1 7 9 1 4 5 ++0 2 3 0 2 3 0 1 1 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 1 0 1 1 0 2 3 0 3 4 1 4 5 ++1 7 9 1 10 14 3 15 20 3 16 22 4 22 30 5 28 38 ++6 33 45 8 41 55 8 45 61 9 50 69 10 54 74 11 58 79 ++12 62 85 12 66 90 13 67 92 13 69 94 13 71 96 13 72 98 ++14 73 99 14 73 99 14 73 99 14 74 101 14 74 101 14 74 101 ++14 74 101 14 74 101 14 74 101 14 74 101 14 74 101 14 74 101 ++14 73 100 14 73 99 13 72 98 13 72 98 13 72 97 13 71 96 ++13 69 94 13 67 92 12 66 90 12 62 85 11 60 82 11 56 77 ++10 53 71 9 47 64 8 41 55 7 36 49 6 33 45 5 27 37 ++3 21 29 3 16 22 2 13 18 2 10 13 1 7 9 1 5 6 ++0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 1 0 1 1 0 2 3 1 4 5 1 5 6 ++1 8 11 2 12 16 3 15 20 4 19 26 5 25 34 6 30 41 ++7 36 49 8 42 57 9 47 64 10 53 71 11 58 79 12 62 85 ++12 66 90 13 68 93 13 69 94 13 72 98 14 73 99 14 73 100 ++14 73 100 14 74 101 14 74 101 14 74 101 14 74 101 14 74 101 ++14 74 101 14 74 101 14 74 101 14 74 101 14 74 101 14 74 101 ++14 74 101 14 74 101 14 74 101 14 74 101 14 73 99 14 73 99 ++13 72 97 13 69 94 13 68 93 12 66 90 12 64 87 11 60 82 ++11 56 77 9 50 69 9 47 64 8 41 55 7 36 49 6 30 41 ++5 25 34 4 19 26 3 15 20 2 12 16 2 9 12 1 7 9 ++1 4 5 0 2 3 0 2 3 0 1 1 0 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 ++2 9 12 2 13 18 3 16 22 3 21 29 5 27 37 6 33 45 ++7 39 53 9 47 64 9 50 69 11 56 77 11 60 82 12 64 87 ++13 67 92 13 69 94 13 72 97 13 72 98 14 74 101 14 74 101 ++14 74 101 14 74 101 14 74 101 14 75 102 14 75 102 14 75 102 ++14 75 102 14 75 102 14 75 102 14 75 102 14 75 102 14 75 102 ++14 75 102 14 74 101 14 74 101 14 75 102 14 74 101 14 73 99 ++13 72 98 13 72 98 13 69 94 13 68 93 12 66 90 12 64 87 ++11 58 79 10 54 74 9 49 66 8 44 59 6 40 54 6 33 45 ++5 27 37 4 22 30 3 16 22 2 13 18 2 10 13 1 7 9 ++1 5 6 0 3 4 0 2 3 0 1 1 0 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 2 3 0 2 3 0 2 3 1 5 6 1 7 9 ++2 10 13 3 15 20 4 19 26 4 23 31 5 29 40 7 36 49 ++8 42 57 9 49 66 10 53 71 11 58 79 12 62 85 12 66 90 ++13 69 94 13 72 97 13 72 98 14 74 101 14 75 102 14 74 101 ++14 75 102 14 75 102 14 75 102 14 75 102 14 75 102 14 74 101 ++14 73 99 14 75 102 14 75 102 14 74 101 14 74 101 14 73 100 ++14 73 100 14 75 102 14 75 102 14 74 101 14 74 101 14 74 101 ++14 74 101 14 73 99 13 72 98 13 69 94 13 69 94 12 66 90 ++12 62 85 11 58 79 10 53 71 9 47 64 8 42 57 7 36 49 ++6 30 41 5 25 34 4 19 26 3 15 20 2 12 16 1 8 11 ++1 5 6 1 4 5 0 2 3 0 1 1 0 1 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 2 3 0 2 3 0 3 4 1 5 6 1 8 11 ++2 11 15 3 16 22 4 20 27 5 25 34 6 30 41 7 38 51 ++8 45 61 9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 ++13 71 96 13 72 98 14 73 99 14 74 101 14 74 101 14 75 102 ++14 75 102 14 75 102 14 74 101 14 75 102 13 72 98 12 64 87 ++9 49 66 8 41 55 6 30 41 6 30 41 7 38 51 9 47 64 ++11 58 79 13 71 96 14 75 102 14 74 101 14 75 102 14 74 101 ++14 74 101 14 74 101 14 73 99 13 72 98 13 69 94 13 68 93 ++12 64 87 11 60 82 11 56 77 9 50 69 9 47 64 8 41 55 ++6 33 45 5 27 37 4 22 30 3 18 24 2 13 18 2 10 13 ++1 7 9 1 5 6 0 3 4 0 2 3 0 2 3 0 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 2 9 12 ++2 12 16 3 16 22 3 21 29 5 27 37 6 33 45 7 39 53 ++9 47 64 10 53 71 11 56 77 12 62 85 12 66 90 13 69 94 ++13 72 97 14 73 99 14 74 101 14 74 101 14 75 102 14 75 102 ++14 74 101 14 74 101 12 64 87 5 29 40 0 3 4 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 4 24 33 11 60 82 14 75 102 14 74 101 ++14 75 102 14 74 101 14 74 101 13 72 98 13 72 97 13 69 94 ++13 68 93 12 64 87 11 58 79 10 54 74 9 49 66 8 44 59 ++7 36 49 6 30 41 4 24 33 4 19 26 3 15 20 2 11 15 ++1 8 11 1 5 6 0 3 4 0 2 3 0 2 3 0 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 1 1 0 2 3 1 4 5 1 7 9 2 9 12 ++2 12 16 3 16 22 4 22 30 5 27 37 6 33 45 8 41 55 ++9 47 64 10 54 74 11 58 79 12 62 85 13 67 91 13 69 94 ++13 72 98 14 73 99 14 74 101 14 74 101 14 75 102 14 75 102 ++11 58 79 3 18 24 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 3 16 22 11 56 77 ++14 74 101 14 74 101 14 74 101 14 74 99 13 72 98 13 71 96 ++13 68 93 12 66 90 11 60 82 11 56 77 10 53 71 8 45 61 ++8 41 55 6 33 45 5 25 34 3 21 29 3 16 22 2 12 16 ++1 8 11 1 7 9 1 4 5 0 3 4 0 1 1 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 ++2 13 18 3 18 24 4 23 31 5 28 38 7 36 49 8 42 57 ++9 49 66 10 54 74 11 60 82 12 64 87 13 67 91 13 69 94 ++13 72 98 14 74 101 14 74 101 14 75 102 14 74 101 8 45 61 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 9 8 8 21 20 20 3 3 3 0 0 0 0 0 0 ++6 33 45 14 74 101 14 74 101 14 74 101 14 73 99 13 72 98 ++13 69 94 13 67 91 12 62 85 11 58 79 10 54 74 9 47 64 ++8 41 55 6 33 45 5 28 38 4 23 31 4 19 26 2 13 18 ++2 9 12 1 7 9 1 4 5 0 3 4 0 2 3 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 2 9 12 ++2 13 18 4 19 26 4 23 31 5 28 38 7 36 49 8 42 57 ++9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 ++14 73 99 14 74 101 14 74 101 14 74 101 9 47 64 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 29 26 26 81 83 82 55 54 51 21 20 20 0 0 0 ++0 0 0 5 25 34 14 73 99 14 74 101 14 73 99 13 72 98 ++13 69 94 13 68 93 12 64 87 11 60 82 11 56 77 9 50 69 ++8 44 59 7 36 49 6 30 41 5 25 34 4 19 26 3 15 20 ++2 10 13 1 7 9 1 5 6 0 3 4 0 2 3 0 1 1 ++0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 2 9 12 ++3 15 20 4 19 26 4 24 33 5 29 40 7 36 49 8 44 59 ++9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 ++14 73 99 14 74 101 14 74 101 12 62 85 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 39 37 35 113 114 111 113 114 111 69 68 60 28 32 37 ++3 3 3 0 0 0 5 27 37 14 74 101 14 74 101 14 73 99 ++13 72 97 13 69 94 12 66 90 12 62 85 11 58 79 10 53 71 ++8 45 61 7 38 51 6 30 41 5 25 34 3 21 29 3 15 20 ++2 11 15 1 8 11 1 5 6 1 4 5 0 2 3 0 2 3 ++0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 2 3 0 3 4 1 5 6 1 7 9 2 10 13 ++3 15 20 4 19 26 4 24 33 6 30 41 7 36 49 8 44 59 ++9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 ++14 73 99 14 74 101 14 74 101 2 13 18 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 47 44 41 113 114 111 81 83 82 55 54 51 39 37 35 ++9 8 8 0 0 0 0 0 0 9 49 66 14 73 99 14 73 99 ++13 72 98 13 69 94 12 66 90 12 62 85 11 58 79 10 53 71 ++9 47 64 8 41 55 6 33 45 5 27 37 4 22 30 3 16 22 ++2 12 16 1 8 11 1 7 9 1 4 5 0 2 3 0 2 3 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 1 10 14 ++2 13 18 4 19 26 5 25 34 6 30 41 7 36 49 8 44 59 ++9 50 69 11 56 77 11 60 82 12 64 87 13 69 94 13 72 97 ++14 73 100 14 73 99 12 62 85 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 39 37 35 39 37 35 16 15 15 6 5 5 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 1 12 64 87 13 72 98 ++13 72 98 13 69 94 13 67 91 12 64 87 11 58 79 10 54 74 ++9 47 64 8 41 55 6 33 45 5 28 38 4 23 31 3 16 22 ++2 12 16 2 9 12 1 7 9 1 4 5 0 2 3 0 2 3 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 2 10 13 ++3 15 20 4 19 26 5 25 34 6 30 41 7 36 49 8 44 59 ++9 50 69 11 56 77 11 60 82 12 64 87 13 69 94 13 72 97 ++14 73 99 14 73 99 8 41 55 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 1 1 7 7 7 0 0 1 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 4 20 27 14 73 99 ++13 72 98 13 69 94 13 67 91 12 64 87 11 60 82 10 54 74 ++9 49 66 8 42 57 7 36 49 5 29 40 4 23 31 3 18 24 ++2 12 16 2 9 12 1 7 9 1 4 5 0 3 4 0 1 1 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 1 10 14 ++3 15 20 4 19 26 5 25 34 6 30 41 7 36 49 8 44 59 ++9 50 69 11 56 77 11 60 82 12 64 87 13 69 94 13 72 97 ++13 73 99 14 73 99 3 16 22 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 68 93 ++13 72 97 13 69 94 13 68 93 12 64 87 11 60 82 10 54 74 ++9 49 66 8 42 57 7 36 49 6 30 41 4 24 33 3 18 24 ++2 12 16 2 9 12 1 7 9 1 4 5 0 3 4 0 1 1 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 1 10 14 ++2 13 18 4 19 26 5 25 34 6 30 41 7 36 49 8 44 59 ++9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 72 97 ++14 73 99 12 66 90 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 42 57 ++13 72 98 13 71 96 13 68 93 12 64 87 11 60 82 11 56 77 ++9 50 69 8 42 57 7 36 49 6 30 41 4 24 33 4 19 26 ++2 13 18 2 9 12 1 7 9 1 5 6 0 3 4 0 1 1 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 2 10 13 ++2 13 18 4 19 26 4 24 33 5 29 40 7 36 49 8 44 59 ++9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 ++13 72 97 11 58 79 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 11 15 ++13 72 98 13 71 96 13 68 93 12 64 87 11 60 82 11 56 77 ++9 50 69 8 44 59 7 36 49 6 30 41 5 25 34 4 19 26 ++3 15 20 2 10 13 1 7 9 1 5 6 0 3 4 0 1 1 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 ++2 13 18 4 19 26 4 24 33 5 29 40 7 36 49 8 44 59 ++9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 ++13 71 96 9 50 69 0 0 0 0 0 0 0 0 0 0 0 0 ++12 12 11 29 26 26 29 26 26 2 2 2 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 16 15 15 55 54 51 69 68 60 21 20 20 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++13 68 93 13 69 94 13 68 93 12 64 87 12 62 85 11 56 77 ++9 50 69 8 44 59 7 36 49 6 30 41 5 25 34 4 19 26 ++2 13 18 2 10 13 1 7 9 1 5 6 0 3 4 0 1 1 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 ++2 13 18 4 19 26 4 23 31 5 28 38 7 36 49 8 42 57 ++9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 72 97 ++13 72 97 8 45 61 0 0 0 0 0 0 0 0 0 0 0 0 ++9 8 8 39 37 35 81 83 82 69 68 60 7 7 7 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 3 3 3 16 15 15 69 68 60 105 98 84 29 26 26 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++11 60 82 13 69 94 13 69 94 12 64 87 12 61 82 11 58 79 ++9 50 69 8 44 59 7 38 51 6 33 45 5 25 34 4 19 26 ++2 13 18 2 10 13 1 7 9 1 5 6 0 3 4 0 1 1 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 ++2 13 18 3 18 24 4 23 31 5 28 38 7 36 49 8 42 57 ++9 50 69 10 54 74 11 60 82 12 64 87 13 68 93 13 71 96 ++13 72 97 8 42 57 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 1 4 5 47 44 41 39 37 35 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 0 2 3 28 32 37 55 54 51 ++9 8 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++9 47 64 13 69 94 13 69 94 12 66 90 12 62 85 11 58 79 ++10 53 71 8 45 61 7 38 51 6 33 45 5 27 37 4 20 27 ++3 15 20 1 10 14 1 7 9 1 5 6 0 3 4 0 2 3 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 ++2 13 18 3 18 24 4 23 31 5 28 38 7 36 49 8 42 57 ++9 49 66 10 54 74 11 60 82 12 64 87 13 67 92 13 69 94 ++13 72 97 8 41 55 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 1 1 4 5 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 ++4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++6 30 41 13 72 97 13 69 94 12 66 90 12 64 87 11 58 79 ++10 53 71 9 47 64 7 39 53 6 33 45 5 27 37 3 21 29 ++3 16 22 2 11 15 1 8 11 1 7 9 1 4 5 0 2 3 ++0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 2 9 12 ++2 12 16 3 16 22 4 23 31 5 28 38 7 36 49 8 42 57 ++9 49 66 10 54 74 11 58 79 12 64 87 13 67 91 13 69 94 ++13 72 97 8 42 57 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++3 16 22 13 72 97 13 69 94 12 66 90 12 64 87 11 58 79 ++10 53 71 9 47 64 8 41 55 7 36 49 5 29 40 4 22 30 ++3 16 22 2 12 16 1 8 11 1 7 9 1 5 6 0 2 3 ++0 2 3 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 1 1 0 2 3 0 3 4 1 7 9 1 9 12 ++2 12 16 3 16 22 4 22 30 5 27 37 6 33 45 8 42 57 ++9 47 64 10 54 74 11 58 79 12 64 87 13 67 91 13 69 94 ++13 72 97 8 42 57 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++3 16 22 13 72 97 13 69 94 13 68 93 12 64 87 11 60 82 ++10 54 74 9 49 66 8 42 57 7 36 49 6 30 41 4 23 31 ++4 19 26 2 13 18 2 10 13 1 7 9 1 5 6 0 3 4 ++0 2 3 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 2 3 0 2 3 1 4 5 1 7 9 1 8 11 ++2 11 15 3 16 22 3 21 29 5 27 37 6 33 45 8 41 55 ++9 47 64 10 54 74 11 58 79 12 62 85 13 67 91 13 69 94 ++13 71 96 8 44 59 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 4 4 4 4 4 4 0 0 0 0 0 0 9 8 8 ++21 20 20 6 5 5 0 0 0 0 0 0 29 26 26 7 7 7 ++0 0 0 0 0 0 12 12 11 1 1 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++3 21 29 13 72 97 13 71 96 13 68 93 12 66 90 11 60 82 ++11 56 77 9 49 66 8 44 59 7 38 51 6 30 41 5 25 34 ++4 19 26 2 13 18 1 10 14 1 8 11 1 5 6 0 3 4 ++0 2 3 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 2 3 0 2 3 1 4 5 1 5 6 1 8 11 ++2 12 16 3 16 22 3 21 29 5 25 34 6 33 45 8 41 55 ++9 47 64 10 54 74 11 58 79 12 62 85 13 67 91 13 69 94 ++13 69 94 8 45 61 0 0 0 9 8 8 148 147 146 39 37 35 ++0 0 0 29 26 26 81 83 82 81 83 82 0 0 0 11 13 22 ++69 68 60 28 32 37 7 7 7 148 147 146 201 196 193 39 37 35 ++0 0 0 0 0 1 69 68 60 105 98 84 47 44 41 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++6 30 41 14 73 99 13 71 96 13 68 93 12 66 90 12 61 82 ++11 56 77 9 50 69 8 45 61 6 40 54 6 33 45 5 27 37 ++4 20 27 3 16 22 2 11 15 1 8 11 1 7 9 1 4 5 ++0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 2 3 0 2 3 1 4 5 1 5 6 1 8 11 ++2 12 16 3 16 22 3 21 29 5 25 34 6 33 45 7 39 53 ++9 47 64 10 53 71 11 58 79 12 62 85 13 67 91 13 69 94 ++13 69 94 9 49 66 0 0 0 81 83 82 251 251 251 171 169 168 ++0 2 3 0 0 0 113 114 111 241 241 241 47 44 41 35 25 1 ++35 25 1 35 25 1 148 147 146 248 247 247 250 252 255 113 114 111 ++7 7 7 3 3 3 69 68 60 224 226 233 224 223 222 55 54 51 ++0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++7 36 49 13 72 98 13 72 97 13 69 94 13 67 91 12 64 87 ++11 58 79 10 53 71 9 47 64 8 42 57 7 36 49 5 28 38 ++4 23 31 3 16 22 2 12 16 1 10 14 1 7 9 1 5 6 ++0 3 4 0 2 3 0 1 1 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 2 3 0 2 3 1 4 5 1 5 6 1 8 11 ++2 11 15 3 16 22 4 20 27 5 25 34 6 33 45 7 39 53 ++9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 ++13 69 94 11 58 79 0 0 0 81 83 82 255 255 255 255 255 255 ++191 183 178 171 169 168 201 196 193 235 193 64 234 181 0 234 181 0 ++234 181 0 222 168 1 225 176 47 245 217 114 247 240 225 255 255 255 ++213 210 208 208 204 201 241 241 241 255 255 255 255 255 255 191 183 178 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++5 27 37 14 73 99 13 72 98 13 69 94 13 68 93 12 64 87 ++11 60 82 10 54 74 9 49 66 8 44 59 7 38 51 6 30 41 ++5 25 34 4 19 26 3 15 20 2 11 15 1 8 11 1 5 6 ++1 4 5 0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 2 3 0 2 3 0 3 4 1 5 6 1 8 11 ++2 11 15 3 16 22 4 20 27 5 25 34 6 33 45 7 39 53 ++9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 ++13 71 96 11 60 82 0 0 1 47 44 41 250 249 249 255 255 255 ++252 254 255 225 202 147 209 152 1 194 135 4 249 197 0 255 210 1 ++255 206 13 209 152 1 209 152 1 249 197 0 254 207 32 225 202 147 ++247 240 225 250 252 255 252 254 255 255 255 255 252 254 255 191 183 178 ++1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++3 15 20 14 74 101 13 72 98 13 71 96 13 69 94 12 66 90 ++12 61 82 11 58 79 9 50 69 9 47 64 8 41 55 6 33 45 ++5 27 37 3 21 29 3 16 22 2 13 18 2 9 12 1 7 9 ++1 5 6 0 3 4 0 2 3 0 1 1 0 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 2 3 0 2 3 0 3 4 1 5 6 1 8 11 ++2 11 15 3 16 22 3 21 29 5 25 34 6 33 45 7 39 53 ++9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 ++13 72 98 12 62 85 0 0 0 0 2 3 201 196 193 254 251 250 ++176 158 88 209 152 1 249 197 0 243 191 0 255 205 1 254 207 32 ++255 209 45 255 205 1 249 197 0 255 205 1 255 205 1 249 197 0 ++243 191 0 235 193 64 225 202 147 245 245 244 242 244 252 81 83 82 ++0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 5 6 13 72 98 14 73 99 13 72 97 13 69 94 13 67 92 ++12 62 85 11 58 79 10 53 71 9 49 66 8 42 57 7 36 49 ++6 30 41 4 23 31 4 19 26 3 15 20 1 10 14 1 8 11 ++1 5 6 0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 1 1 0 2 3 1 4 5 1 5 6 1 8 11 ++2 12 16 3 16 22 3 21 29 5 25 34 6 33 45 7 39 53 ++9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 ++13 73 99 12 66 90 1 1 1 0 0 0 55 54 51 199 145 62 ++222 168 1 255 205 1 255 205 1 255 205 1 255 205 1 255 209 45 ++255 208 38 255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 ++255 206 22 255 205 1 249 198 10 255 208 38 167 119 72 1 5 6 ++1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 13 69 94 13 72 98 13 72 98 13 71 96 13 68 93 ++12 64 87 11 60 82 11 56 77 9 50 69 8 45 61 7 39 53 ++6 33 45 5 27 37 3 21 29 3 16 22 2 13 18 2 10 13 ++1 7 9 1 4 5 0 3 4 0 2 3 0 1 1 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 2 3 0 3 4 0 3 4 1 7 9 1 8 11 ++2 12 16 3 16 22 4 22 30 5 27 37 6 33 45 8 41 55 ++9 47 64 10 53 71 11 58 79 12 62 85 13 67 91 13 69 94 ++13 72 97 13 72 98 1 8 11 11 5 1 154 101 6 222 168 1 ++255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 255 209 45 ++255 206 13 255 205 1 255 205 1 255 205 1 255 208 38 255 209 52 ++255 209 49 255 206 22 255 205 1 255 210 1 243 191 0 109 74 3 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 11 58 79 13 72 98 13 72 98 13 72 97 13 69 94 ++13 67 91 12 62 85 11 58 79 10 54 74 9 49 66 8 42 57 ++7 36 49 6 30 41 4 24 33 4 20 27 3 15 20 2 11 15 ++1 8 11 1 7 9 1 4 5 0 2 3 0 2 3 0 1 1 ++0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ++0 1 1 0 2 3 0 2 3 1 5 6 1 7 9 2 9 12 ++2 13 18 4 19 26 4 23 31 5 29 40 7 36 49 8 42 57 ++9 49 66 10 54 74 11 58 79 12 64 87 13 67 91 13 69 94 ++13 72 97 14 73 100 0 8 19 72 47 3 209 152 1 255 205 1 ++255 205 1 255 205 1 255 205 1 255 205 1 255 206 22 255 206 22 ++255 205 1 255 205 1 255 205 1 254 207 32 255 209 55 255 209 49 ++255 206 22 255 205 1 255 205 1 255 210 1 241 197 0 154 101 6 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 7 36 49 14 73 100 14 73 99 14 73 99 13 71 96 ++13 68 93 12 64 87 11 60 82 11 56 77 10 53 71 9 47 64 ++7 39 53 6 33 45 5 28 38 4 23 31 3 18 24 3 15 20 ++2 10 13 1 7 9 1 7 9 0 3 4 0 2 3 0 1 1 ++0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 ++0 1 1 0 3 4 1 4 5 1 5 6 1 8 11 2 11 15 ++3 15 20 4 20 27 5 25 34 6 30 41 7 36 49 8 44 59 ++9 50 69 10 54 74 11 60 82 12 64 87 13 68 93 13 71 96 ++13 72 98 13 72 98 0 14 27 109 74 3 234 181 0 255 205 1 ++255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 255 205 1 ++255 205 1 255 205 1 254 207 32 255 209 55 255 208 38 255 206 13 ++255 205 1 255 210 1 243 191 0 222 168 1 234 181 0 109 74 3 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 2 9 12 14 73 100 14 74 101 14 73 99 13 72 98 ++13 69 94 13 67 91 12 62 85 11 58 79 10 54 74 9 49 66 ++8 42 57 7 36 49 6 30 41 5 25 34 3 21 29 3 16 22 ++2 12 16 2 9 12 1 7 9 1 5 6 0 3 4 0 3 4 ++0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 ++0 2 3 0 2 3 1 5 6 1 7 9 2 9 12 2 12 16 ++3 16 22 4 22 30 5 27 37 6 33 45 7 38 51 8 45 61 ++9 50 69 11 56 77 11 60 82 12 64 87 13 68 93 13 71 96 ++13 72 98 14 73 99 4 24 33 72 47 3 209 152 1 255 205 1 ++255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 ++255 205 1 255 206 22 255 209 49 254 207 32 255 210 1 249 197 0 ++243 191 0 222 168 1 209 152 1 234 181 0 209 152 1 22 11 1 ++0 0 0 0 0 0 12 12 11 47 44 41 12 12 11 0 0 0 ++0 0 0 0 0 0 13 69 94 14 73 99 14 74 101 13 72 98 ++13 71 96 13 67 91 12 64 87 12 61 82 11 58 79 10 53 71 ++8 45 61 8 41 55 6 33 45 5 29 40 4 24 33 4 19 26 ++3 15 20 2 11 15 1 8 11 1 7 9 1 5 6 0 3 4 ++0 2 3 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 2 3 ++0 3 4 1 4 5 1 7 9 1 8 11 2 11 15 3 15 20 ++4 19 26 5 25 34 6 30 41 7 36 49 8 41 55 9 47 64 ++10 53 71 11 58 79 12 64 87 12 66 90 13 69 94 13 72 97 ++13 72 98 14 73 99 6 33 45 5 1 0 154 101 6 209 152 1 ++243 191 0 255 205 1 255 210 1 255 205 1 255 205 1 255 205 1 ++255 205 1 255 206 13 255 206 13 243 191 0 222 168 1 222 168 1 ++234 181 0 241 197 0 255 205 1 234 181 0 139 105 59 16 15 15 ++0 0 0 0 0 0 16 15 15 113 114 111 105 98 84 55 54 51 ++9 8 8 0 0 0 9 49 66 14 73 99 14 74 101 13 72 98 ++13 72 97 13 69 94 13 67 91 12 64 87 11 60 82 10 54 74 ++9 49 66 8 44 59 7 38 51 6 33 45 5 27 37 4 22 30 ++3 18 24 3 15 20 2 11 15 1 8 11 1 7 9 1 4 5 ++0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 1 0 1 1 0 2 3 0 3 4 ++1 4 5 1 7 9 1 8 11 1 10 14 2 13 18 3 18 24 ++4 22 30 5 28 38 6 33 45 7 38 51 8 45 61 9 50 69 ++11 56 77 11 60 82 12 64 87 13 67 91 13 69 94 13 72 98 ++14 73 99 13 74 101 6 40 54 4 0 5 105 98 84 174 129 27 ++183 122 1 222 168 1 234 181 0 234 181 0 243 191 0 243 191 0 ++234 181 0 222 168 1 209 152 1 222 168 1 241 197 0 255 205 1 ++255 205 1 222 168 1 202 153 21 176 158 88 171 169 168 81 83 82 ++0 0 0 0 0 0 0 2 3 69 68 60 113 114 111 113 114 111 ++69 68 60 2 2 2 1 10 14 14 74 101 14 74 101 14 74 99 ++14 73 99 13 71 96 13 69 94 12 66 90 12 64 87 11 58 79 ++10 53 71 9 47 64 8 42 57 7 38 51 6 33 45 5 25 34 ++3 21 29 3 16 22 2 13 18 1 10 14 1 8 11 1 5 6 ++0 3 4 0 2 3 0 2 3 0 1 1 0 1 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 1 1 0 1 1 0 2 3 0 3 4 1 4 5 ++1 5 6 1 8 11 1 10 14 2 13 18 3 16 22 3 21 29 ++5 25 34 6 33 45 7 38 51 8 41 55 9 47 64 10 53 71 ++11 58 79 12 64 87 12 66 90 13 69 94 13 72 97 13 72 98 ++14 73 99 14 74 101 7 38 51 0 0 0 148 147 146 148 147 146 ++154 101 6 194 135 4 209 152 1 209 152 1 209 152 1 209 152 1 ++209 152 1 234 181 0 241 197 0 255 210 1 249 197 0 222 168 1 ++202 153 21 176 158 88 208 204 201 224 226 233 213 210 208 148 147 146 ++9 8 8 0 0 0 0 0 0 17 25 27 81 83 82 113 114 111 ++113 114 111 12 12 11 0 0 0 11 56 77 14 73 100 14 74 101 ++14 73 99 13 72 98 13 69 94 13 68 93 12 66 90 12 62 85 ++11 58 79 10 53 71 9 47 64 8 42 57 7 36 49 6 30 41 ++5 25 34 4 20 27 3 16 22 2 13 18 1 10 14 1 7 9 ++1 5 6 0 3 4 0 3 4 0 2 3 0 1 1 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 1 1 0 2 3 0 3 4 0 3 4 1 5 6 ++1 7 9 1 10 14 2 13 18 3 16 22 4 20 27 5 25 34 ++6 30 41 7 36 49 8 41 55 9 47 64 9 50 69 11 56 77 ++11 60 82 12 64 87 13 67 91 13 69 94 13 72 98 14 73 99 ++14 74 101 14 74 101 3 16 22 5 1 0 148 147 146 191 183 178 ++148 147 146 139 105 59 194 135 4 243 191 0 255 210 1 255 210 1 ++255 210 1 255 205 1 243 191 0 222 168 1 194 135 4 176 158 88 ++201 196 193 224 226 233 242 244 252 242 244 252 248 247 247 224 223 222 ++69 68 60 0 0 0 0 0 0 0 0 0 12 12 11 69 68 60 ++47 44 41 0 0 1 0 0 0 0 3 4 13 72 97 14 74 101 ++14 74 101 14 73 99 13 72 97 13 69 94 13 67 92 12 64 87 ++11 60 82 11 56 77 9 50 69 9 47 64 8 41 55 7 36 49 ++6 30 41 5 25 34 4 20 27 3 16 22 2 13 18 2 10 13 ++1 7 9 1 5 6 1 4 5 0 2 3 0 2 3 0 1 1 ++0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ++0 1 1 0 2 3 0 2 3 0 3 4 1 5 6 1 7 9 ++2 9 12 2 12 16 3 15 20 4 19 26 4 23 31 5 28 38 ++6 33 45 6 40 54 8 44 59 9 49 66 10 54 74 11 58 79 ++12 64 87 13 67 91 13 69 94 13 71 96 14 73 99 14 73 99 ++14 73 100 12 62 85 0 0 0 2 2 2 148 147 146 213 210 208 ++171 169 168 148 147 146 139 105 59 194 135 4 209 152 1 222 168 1 ++222 168 1 209 152 1 194 135 4 174 129 27 171 169 168 213 210 208 ++224 226 233 250 252 255 255 255 255 255 255 255 254 254 254 252 254 255 ++148 147 146 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 ++0 0 1 0 0 0 0 0 0 0 0 0 9 47 64 14 73 99 ++14 74 101 14 73 99 13 72 98 13 72 97 13 69 94 12 66 90 ++12 64 87 11 58 79 10 54 74 9 50 69 8 45 61 7 39 53 ++6 33 45 5 28 38 4 24 33 4 19 26 3 15 20 2 12 16 ++1 9 12 1 7 9 1 4 5 0 3 4 0 2 3 0 1 1 ++0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 ++0 1 1 0 2 3 1 4 5 1 5 6 1 7 9 2 9 12 ++2 12 16 3 15 20 4 19 26 4 23 31 5 27 37 6 33 45 ++7 38 51 8 44 59 9 49 66 10 53 71 11 58 79 12 62 85 ++12 66 90 13 69 94 13 71 96 13 72 98 14 73 99 14 74 101 ++14 73 100 4 24 33 0 0 0 0 0 1 171 169 168 242 244 252 ++208 204 201 171 169 168 148 147 146 139 105 59 139 105 59 139 105 59 ++167 119 72 167 119 72 148 147 146 191 183 178 218 217 217 241 241 241 ++254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 ++237 237 236 55 54 51 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 1 5 6 14 72 97 ++14 73 100 14 74 101 14 73 99 13 72 98 13 71 96 13 68 93 ++12 66 90 12 62 85 11 58 79 10 54 74 9 49 66 8 44 59 ++7 38 51 6 33 45 5 28 38 4 23 31 4 19 26 3 15 20 ++2 11 15 2 9 12 1 7 9 1 5 6 0 3 4 0 2 3 ++0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 ++0 2 3 0 3 4 1 5 6 1 7 9 1 8 11 2 12 16 ++3 15 20 4 19 26 4 23 31 5 28 38 6 33 45 7 38 51 ++8 44 59 9 49 66 10 54 74 11 58 79 12 62 85 12 64 87 ++13 68 93 13 69 94 13 72 98 14 73 99 14 74 101 14 73 99 ++11 60 82 0 0 0 0 0 0 16 15 15 218 217 217 252 254 255 ++241 241 241 208 204 201 171 169 168 148 147 146 148 147 146 148 147 146 ++148 147 146 171 169 168 201 196 193 218 217 217 245 245 244 254 254 254 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++252 254 255 171 169 168 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 33 45 ++14 74 101 14 74 101 14 74 101 13 72 98 13 72 98 13 69 94 ++13 68 93 12 64 87 12 62 85 11 58 79 10 53 71 9 47 64 ++8 42 57 7 38 51 6 33 45 5 27 37 4 23 31 3 18 24 ++3 15 20 2 12 16 2 9 12 1 7 9 1 4 5 0 3 4 ++0 2 3 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 2 3 ++0 3 4 1 5 6 1 7 9 2 9 12 2 11 15 3 15 20 ++3 18 24 4 23 31 5 28 38 6 33 45 7 38 51 8 42 57 ++9 47 64 10 53 71 11 58 79 11 60 82 12 64 87 13 67 92 ++13 69 94 13 72 97 13 72 98 14 74 101 14 74 101 14 72 97 ++1 7 9 0 0 0 0 0 0 113 114 111 255 255 255 255 255 255 ++255 255 255 237 237 236 201 196 193 171 169 168 171 169 168 171 169 168 ++201 196 193 208 204 201 224 223 222 250 249 249 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 248 247 247 69 68 60 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++11 58 79 14 73 99 14 74 101 14 74 101 14 73 99 13 72 98 ++13 69 94 13 67 92 12 64 87 12 61 82 11 58 79 10 53 71 ++9 47 64 8 42 57 7 38 51 6 33 45 5 27 37 4 22 30 ++3 18 24 3 15 20 2 12 16 1 8 11 1 7 9 1 4 5 ++0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 1 1 0 2 3 0 2 3 0 3 4 ++1 4 5 1 7 9 1 8 11 2 12 16 3 15 20 3 18 24 ++4 23 31 5 27 37 6 33 45 7 38 51 8 42 57 9 47 64 ++10 53 71 11 58 79 11 60 82 12 64 87 13 67 91 13 69 94 ++13 72 97 13 72 98 14 74 101 14 74 101 14 73 100 4 23 31 ++0 0 0 0 0 0 55 54 51 241 241 241 255 255 255 255 255 255 ++255 255 255 252 254 255 232 232 232 208 204 201 208 204 201 208 204 201 ++218 217 217 232 232 232 250 251 253 252 254 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 252 254 255 148 147 146 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++1 7 9 13 72 98 14 74 101 14 75 102 14 74 101 13 72 98 ++13 72 97 13 69 94 13 67 91 12 64 87 11 60 82 11 58 79 ++10 53 71 9 47 64 8 42 57 7 38 51 6 33 45 5 27 37 ++3 21 29 3 18 24 3 15 20 2 11 15 1 8 11 1 7 9 ++1 4 5 0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 1 0 1 1 0 2 3 0 3 4 0 3 4 ++1 5 6 1 8 11 1 10 14 3 15 20 3 16 22 3 21 29 ++5 25 34 6 30 41 7 36 49 8 42 57 9 47 64 10 53 71 ++11 56 77 11 60 82 12 64 87 12 66 90 13 69 94 13 72 97 ++13 72 98 14 73 99 14 74 101 14 73 99 10 53 71 0 0 0 ++0 0 0 6 5 5 171 169 168 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 250 251 253 224 226 233 218 217 217 224 226 233 ++241 241 241 250 251 253 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 218 217 217 12 12 11 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 7 39 53 14 73 100 14 74 101 14 74 101 14 73 99 ++13 72 98 13 71 96 13 69 94 13 67 91 12 64 87 11 60 82 ++11 56 77 9 50 69 9 47 64 8 41 55 7 36 49 6 30 41 ++5 25 34 3 21 29 3 18 24 2 13 18 2 10 13 1 8 11 ++1 5 6 0 3 4 0 2 3 0 2 3 0 1 1 0 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 1 1 0 1 1 0 3 4 0 3 4 1 5 6 ++1 7 9 2 10 13 2 13 18 3 16 22 4 20 27 5 25 34 ++6 30 41 7 36 49 8 41 55 9 47 64 9 50 69 11 56 77 ++11 60 82 12 64 87 13 67 91 13 69 94 13 71 96 13 72 98 ++14 73 99 14 74 101 14 74 101 13 69 94 0 3 4 0 0 0 ++0 0 0 113 114 111 251 251 251 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 251 251 251 250 249 249 251 251 251 ++252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 250 252 255 69 68 60 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 12 64 87 14 73 99 14 74 101 14 74 101 ++14 73 99 13 72 98 13 71 96 13 69 94 12 66 90 12 64 87 ++11 58 79 10 54 74 9 50 69 8 45 61 8 41 55 6 33 45 ++5 29 40 5 25 34 3 21 29 3 16 22 2 12 16 2 9 12 ++1 7 9 1 5 6 0 3 4 0 2 3 0 1 1 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 1 1 0 2 3 0 3 4 1 5 6 1 7 9 ++2 9 12 2 12 16 3 16 22 4 20 27 4 24 33 5 29 40 ++7 36 49 8 41 55 9 47 64 9 50 69 10 54 74 11 60 82 ++12 64 87 13 67 91 13 69 94 13 71 96 13 72 98 14 74 99 ++14 74 101 14 73 100 14 73 99 3 15 20 0 0 0 0 0 0 ++39 37 35 224 223 222 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 148 147 146 0 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 2 9 12 13 69 94 14 74 101 14 74 101 ++14 74 101 14 73 99 13 72 98 13 71 96 13 69 94 12 66 90 ++12 64 87 11 58 79 10 54 74 9 50 69 8 45 61 7 39 53 ++6 33 45 5 29 40 5 25 34 4 19 26 3 15 20 2 12 16 ++2 9 12 1 7 9 1 5 6 0 3 4 0 2 3 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ++0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 1 9 12 ++2 11 15 3 15 20 4 19 26 5 25 34 5 28 38 6 33 45 ++6 40 54 8 45 61 9 50 69 10 54 74 11 58 79 12 64 87 ++12 66 90 13 69 94 13 71 96 13 72 98 14 73 99 14 74 101 ++14 74 101 14 74 101 4 23 31 0 0 0 0 0 0 0 0 0 ++113 114 111 252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 224 223 222 21 20 20 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 1 10 14 14 74 101 14 75 102 ++14 74 101 14 74 101 14 73 99 13 72 98 13 71 96 13 69 94 ++12 66 90 12 62 85 11 60 82 10 54 74 9 50 69 8 45 61 ++7 39 53 7 36 49 5 29 40 4 23 31 4 19 26 3 15 20 ++2 12 16 2 9 12 1 7 9 1 4 5 0 3 4 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 ++0 1 1 0 2 3 0 3 4 1 7 9 1 7 9 2 10 13 ++3 15 20 3 18 24 4 23 31 5 28 38 6 33 45 7 38 51 ++8 44 59 9 49 66 10 54 74 11 58 79 12 62 85 12 66 90 ++13 69 94 13 71 96 13 72 98 13 72 98 14 74 101 14 74 101 ++14 73 100 7 39 53 0 0 0 0 0 0 0 0 0 16 15 15 ++148 147 146 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 253 ++248 247 247 248 247 247 254 254 254 251 251 251 148 147 146 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 6 33 45 14 75 102 ++14 75 102 14 74 101 14 74 101 14 73 99 13 72 98 13 69 94 ++13 68 93 12 66 90 12 64 87 11 58 79 10 54 74 9 49 66 ++8 44 59 7 38 51 6 33 45 5 28 38 4 23 31 3 18 24 ++3 15 20 2 11 15 1 8 11 1 7 9 1 4 5 0 2 3 ++0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 ++0 2 3 0 3 4 1 5 6 1 7 9 2 9 12 2 12 16 ++3 16 22 4 20 27 5 25 34 6 30 41 7 36 49 8 41 55 ++9 47 64 10 53 71 11 58 79 11 60 82 12 64 87 13 68 93 ++13 69 94 13 72 97 14 73 99 14 74 101 14 74 101 14 74 101 ++13 69 94 0 0 0 0 0 0 0 0 0 0 0 0 39 37 35 ++171 169 168 232 232 232 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 248 247 247 253 253 253 254 254 254 250 249 249 ++251 251 251 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 253 253 253 245 245 244 232 232 232 224 223 222 218 217 217 ++208 204 201 208 204 201 224 223 222 255 255 255 218 217 217 7 7 7 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 66 90 ++14 74 101 14 74 101 14 74 101 14 74 101 14 73 99 13 72 97 ++13 69 94 13 67 91 12 64 87 12 62 85 11 58 79 10 53 71 ++9 47 64 8 42 57 7 36 49 6 33 45 5 25 34 3 21 29 ++3 16 22 2 13 18 2 10 13 1 7 9 1 5 6 0 3 4 ++0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 ++0 2 3 0 3 4 1 5 6 1 8 11 2 11 15 3 15 20 ++3 18 24 4 23 31 5 29 40 7 36 49 8 41 55 8 45 61 ++9 50 69 11 56 77 11 60 82 12 64 87 13 67 91 13 69 94 ++13 72 97 14 73 99 14 74 101 14 74 101 14 74 101 14 74 101 ++5 28 38 0 0 0 0 0 0 0 0 0 0 0 0 69 68 60 ++148 147 146 191 183 178 224 223 222 251 251 251 255 255 255 255 255 255 ++255 255 255 255 255 255 237 237 236 208 204 201 208 204 201 224 223 222 ++245 245 244 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 ++245 245 244 218 217 217 201 196 193 171 169 168 171 169 168 148 147 146 ++148 147 146 171 169 168 171 169 168 224 223 222 255 255 255 81 83 82 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 18 24 ++14 74 101 14 75 102 14 74 101 14 74 101 14 74 101 14 73 99 ++13 72 97 13 69 94 13 67 92 12 64 87 11 60 82 11 56 77 ++9 50 69 9 47 64 8 42 57 7 36 49 5 29 40 4 24 33 ++4 19 26 3 16 22 2 12 16 2 9 12 1 7 9 1 5 6 ++0 0 0 0 0 0 0 0 0 0 1 1 0 2 3 0 2 3 ++0 3 4 1 5 6 1 7 9 2 10 13 2 13 18 3 16 22 ++4 22 30 5 27 37 6 33 45 7 39 53 8 44 59 9 50 69 ++10 54 74 11 60 82 12 64 87 13 67 91 13 69 94 13 72 97 ++14 73 100 14 74 101 14 74 101 14 74 101 14 74 101 12 62 85 ++0 0 0 0 0 0 0 0 0 0 0 0 6 5 5 113 114 111 ++148 147 146 171 169 168 213 210 208 241 241 241 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 232 232 232 229 228 227 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++253 253 253 241 241 241 224 223 222 201 196 193 191 183 178 171 169 168 ++171 169 168 148 147 146 148 147 146 171 169 168 232 232 232 191 183 178 ++1 4 5 0 0 0 21 20 20 29 26 26 3 3 3 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++9 49 66 14 74 101 14 75 102 14 74 101 14 74 101 14 74 99 ++13 72 98 13 72 97 13 69 94 13 67 91 12 64 87 11 60 82 ++10 54 74 9 50 69 9 47 64 8 41 55 6 33 45 5 28 38 ++4 23 31 4 19 26 3 15 20 2 11 15 1 8 11 1 7 9 ++0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 3 4 ++1 4 5 1 7 9 2 9 12 2 12 16 3 16 22 4 20 27 ++5 25 34 6 30 41 7 36 49 8 42 57 9 47 64 10 53 71 ++11 58 79 12 62 85 12 66 90 13 68 93 13 72 97 14 73 99 ++14 73 99 14 74 101 14 74 101 14 75 102 14 74 101 4 19 26 ++0 0 0 0 0 0 0 0 0 0 0 0 39 37 35 148 147 146 ++213 210 208 241 241 241 250 249 249 254 254 254 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 252 254 255 252 254 255 242 244 252 232 232 232 ++218 217 217 191 183 178 171 169 168 148 147 146 171 169 168 237 237 236 ++81 83 82 0 0 0 9 8 8 39 37 35 55 54 51 16 15 15 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 2 3 14 72 97 14 75 102 14 75 102 14 74 101 14 74 101 ++14 73 99 13 72 98 13 72 97 13 69 94 12 66 90 12 64 87 ++11 58 79 10 54 74 9 50 69 8 44 59 7 38 51 6 33 45 ++5 27 37 4 22 30 3 18 24 2 13 18 2 10 13 1 7 9 ++0 0 0 0 0 0 0 1 1 0 2 3 0 2 3 0 3 4 ++1 5 6 1 7 9 2 10 13 3 15 20 3 18 24 4 22 30 ++5 28 38 7 36 49 8 41 55 9 47 64 9 50 69 11 56 77 ++11 60 82 12 66 90 13 68 93 13 69 94 13 72 98 14 73 99 ++14 74 101 14 74 101 14 74 101 14 74 101 12 64 87 0 0 0 ++1 1 1 9 8 8 0 0 0 0 2 3 105 98 84 232 232 232 ++255 255 255 252 254 255 252 254 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++252 254 255 242 244 252 224 223 222 171 169 168 148 147 146 201 196 193 ++191 183 178 3 3 3 0 0 0 0 0 0 17 25 27 55 54 51 ++16 15 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 7 36 49 14 74 101 14 75 102 14 74 101 14 74 101 ++14 74 101 14 73 99 13 72 98 13 71 96 13 69 94 12 66 90 ++12 62 85 11 58 79 10 53 71 9 47 64 8 42 57 7 36 49 ++6 30 41 5 25 34 4 20 27 3 16 22 2 12 16 2 9 12 ++0 0 0 0 0 0 0 1 1 0 2 3 0 2 3 1 4 5 ++1 7 9 1 8 11 2 12 16 3 16 22 4 20 27 5 25 34 ++6 30 41 7 36 49 8 44 59 9 49 66 10 54 74 11 58 79 ++12 62 85 13 67 91 13 69 94 13 72 97 13 72 98 14 74 101 ++14 74 101 14 74 101 14 75 102 14 74 101 6 33 45 0 0 0 ++21 20 20 21 20 20 0 0 0 7 7 7 191 183 178 252 254 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 232 232 232 191 183 178 148 147 146 ++218 217 217 55 54 51 0 0 1 0 0 0 0 0 0 21 20 20 ++39 37 35 4 4 4 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 14 72 97 14 74 101 14 75 102 14 74 101 ++14 74 101 14 74 101 13 72 98 13 72 98 13 69 94 13 67 91 ++12 64 87 11 60 82 11 56 77 9 50 69 8 45 61 6 40 54 ++6 33 45 5 28 38 4 23 31 4 19 26 3 15 20 2 10 13 ++0 0 0 0 0 1 0 1 1 0 2 3 0 3 4 1 5 6 ++1 7 9 2 10 13 2 13 18 3 18 24 4 23 31 5 28 38 ++6 33 45 8 41 55 9 47 64 10 53 71 11 58 79 11 60 82 ++12 66 90 13 68 93 13 71 96 13 72 98 14 73 99 14 75 102 ++14 74 101 14 75 102 14 75 102 14 73 99 1 4 5 6 5 5 ++47 44 41 12 12 11 0 0 0 81 83 82 242 244 252 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 252 254 255 241 241 241 201 196 193 ++208 204 201 148 147 146 0 0 0 0 0 0 3 3 3 3 3 3 ++12 12 11 12 12 11 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 6 33 45 14 74 101 14 75 102 14 75 102 ++14 74 101 14 75 102 14 74 101 13 72 98 13 72 97 13 69 94 ++12 66 90 12 64 87 11 60 82 10 54 74 9 49 66 8 42 57 ++7 36 49 6 33 45 5 27 37 4 20 27 3 16 22 2 12 16 ++0 0 0 0 1 1 0 2 3 0 2 3 1 4 5 1 5 6 ++1 8 11 2 12 16 3 16 22 3 21 29 5 25 34 6 30 41 ++7 36 49 8 44 59 9 49 66 10 54 74 11 60 82 12 64 87 ++13 67 91 13 69 94 13 72 98 14 73 100 14 74 101 14 74 101 ++14 75 102 14 75 102 14 74 101 11 56 77 0 0 0 29 26 26 ++28 32 37 0 0 0 9 8 8 208 204 201 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 252 254 255 242 244 252 ++218 217 217 218 217 217 29 26 26 0 0 0 16 15 15 39 37 35 ++16 15 15 12 12 11 16 15 15 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 12 64 87 14 74 101 14 75 102 ++14 75 102 14 74 101 14 74 101 14 74 99 13 72 98 13 71 96 ++13 68 93 12 66 90 12 62 85 11 58 79 10 53 71 9 47 64 ++8 41 55 7 36 49 6 30 41 4 24 33 4 19 26 3 15 20 ++0 0 1 0 1 1 0 2 3 0 3 4 1 5 6 1 7 9 ++2 10 13 2 13 18 4 19 26 4 23 31 5 29 40 6 33 45 ++8 41 55 9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 ++13 69 94 13 72 97 14 73 99 14 74 99 14 75 102 14 74 101 ++14 75 102 14 76 103 14 73 100 3 18 24 4 4 4 47 44 41 ++12 12 11 0 0 0 113 114 111 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 253 253 253 254 254 254 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++254 254 254 250 249 249 113 114 111 0 0 0 17 25 27 47 44 41 ++29 26 26 16 15 15 47 44 41 6 5 5 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 4 24 33 14 75 102 14 75 102 ++14 75 102 14 74 101 14 74 101 14 74 101 14 73 99 13 72 98 ++13 69 94 13 68 93 12 64 87 11 60 82 11 56 77 9 50 69 ++8 45 61 6 40 54 6 33 45 5 27 37 3 21 29 3 16 22 ++0 1 1 0 2 3 0 3 4 1 4 5 1 7 9 1 8 11 ++2 12 16 3 16 22 4 20 27 5 25 34 6 33 45 7 36 49 ++8 44 59 9 50 69 10 54 74 11 60 82 12 64 87 13 67 91 ++13 69 94 13 72 98 14 73 99 14 74 101 14 74 101 14 75 102 ++14 75 102 14 74 101 11 58 79 0 0 0 29 26 26 39 37 35 ++0 0 0 47 44 41 241 241 241 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 253 253 253 248 247 247 250 249 249 254 254 254 255 255 255 ++255 255 255 253 253 253 251 251 251 253 253 253 255 255 255 255 255 255 ++255 255 255 255 255 255 171 169 168 0 0 0 12 12 11 39 37 35 ++12 12 11 0 0 1 55 54 51 39 37 35 0 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 13 69 94 14 75 102 ++14 75 102 14 75 102 14 74 101 14 74 101 14 74 99 13 72 98 ++13 71 96 13 69 94 13 67 91 12 62 85 11 58 79 10 53 71 ++9 47 64 8 42 57 7 36 49 6 30 41 4 24 33 3 18 24 ++0 1 1 0 2 3 0 3 4 1 5 6 1 7 9 2 10 13 ++2 13 18 3 18 24 4 23 31 5 28 38 6 33 45 7 39 53 ++9 47 64 10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 ++13 71 96 13 72 98 14 74 101 14 74 101 14 74 101 14 75 102 ++14 75 102 14 75 102 5 27 37 0 0 0 39 37 35 21 20 20 ++0 0 1 148 147 146 251 251 251 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 245 245 244 237 237 236 241 241 241 251 251 251 255 255 255 ++255 255 255 250 249 249 248 247 247 251 251 251 254 254 254 255 255 255 ++255 255 255 255 255 255 218 217 217 7 7 7 0 0 0 6 5 5 ++0 0 0 0 0 0 39 37 35 69 68 60 0 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 9 50 69 14 74 101 ++14 74 101 14 75 102 14 75 102 14 74 101 14 74 101 14 73 99 ++13 72 98 13 69 94 13 68 93 12 64 87 11 60 82 10 54 74 ++9 49 66 8 45 61 7 39 53 6 33 45 5 27 37 3 21 29 ++0 1 1 0 3 4 1 4 5 1 7 9 2 9 12 2 12 16 ++3 16 22 3 21 29 5 25 34 6 33 45 7 38 51 8 42 57 ++9 49 66 10 54 74 11 60 82 12 64 87 13 67 91 13 69 94 ++13 72 98 14 73 99 14 74 101 14 74 101 14 75 102 14 75 102 ++14 75 102 13 72 98 0 1 1 12 12 11 39 37 35 4 4 4 ++16 15 15 218 217 217 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++253 253 253 237 237 236 213 210 208 224 223 222 245 245 244 251 251 251 ++253 253 253 245 245 244 241 241 241 248 247 247 253 253 253 255 255 255 ++255 255 255 252 254 255 250 249 249 47 44 41 0 0 0 0 0 0 ++0 0 0 0 0 0 16 15 15 69 68 60 9 8 8 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 3 15 20 14 75 102 ++14 75 102 14 75 102 14 75 102 14 74 101 14 74 101 14 74 101 ++13 72 98 13 72 97 13 69 94 12 66 90 12 64 87 11 58 79 ++10 53 71 9 49 66 8 42 57 7 36 49 5 29 40 4 23 31 ++0 2 3 1 4 5 1 7 9 1 8 11 2 11 15 3 15 20 ++3 18 24 4 23 31 5 29 40 7 36 49 8 41 55 9 47 64 ++10 53 71 11 58 79 12 62 85 12 66 90 13 69 94 13 71 96 ++13 72 98 14 74 99 14 74 101 14 74 101 14 75 102 14 75 102 ++14 74 101 10 53 71 0 0 0 21 20 20 21 20 20 0 0 0 ++81 83 82 254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++254 251 250 224 223 222 201 196 193 208 204 201 229 228 227 245 245 244 ++250 249 249 241 241 241 237 237 236 241 241 241 248 247 247 254 254 254 ++255 255 255 255 255 255 255 255 255 81 83 82 0 0 0 0 0 0 ++0 0 0 0 0 0 1 4 5 69 68 60 16 15 15 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 68 93 ++14 75 102 14 75 102 14 75 102 14 75 102 14 74 101 14 74 101 ++14 73 100 13 72 98 13 71 96 13 68 93 12 64 87 11 60 82 ++11 56 77 9 50 69 8 45 61 7 39 53 6 33 45 5 25 34 ++0 3 4 1 4 5 1 7 9 2 10 13 2 13 18 3 16 22 ++3 21 29 5 27 37 6 33 45 7 39 53 8 45 61 9 50 69 ++10 54 74 11 60 82 12 64 87 13 67 91 13 69 94 13 72 98 ++14 73 99 14 75 102 14 74 101 14 75 102 14 75 102 14 75 102 ++14 74 101 2 11 15 0 0 0 12 12 11 6 5 5 0 0 0 ++148 147 146 253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 248 247 247 245 245 244 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++250 249 249 218 217 217 191 183 178 191 183 178 213 210 208 237 237 236 ++248 247 247 237 237 236 232 232 232 237 237 236 245 245 244 253 253 253 ++255 255 255 255 255 255 255 255 255 113 114 111 2 2 2 0 0 0 ++0 0 0 0 0 0 3 3 3 47 44 41 12 12 11 0 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 49 66 ++14 74 101 14 75 102 14 75 102 14 75 102 14 74 101 14 74 101 ++14 74 101 13 72 98 13 72 97 13 69 94 12 66 90 12 62 85 ++11 58 79 10 53 71 9 47 64 8 42 57 7 36 49 5 27 37 ++1 4 5 1 5 6 1 8 11 2 11 15 3 16 22 4 20 27 ++4 24 33 6 30 41 7 36 49 8 42 57 9 47 64 10 53 71 ++11 58 79 12 62 85 12 66 90 13 69 94 13 71 96 13 72 98 ++14 74 99 14 74 101 14 74 101 14 75 102 14 75 102 14 74 101 ++11 58 79 0 0 0 9 8 8 12 12 11 0 0 0 2 2 2 ++201 196 193 252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 229 228 227 224 223 222 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++248 247 247 213 210 208 191 183 178 191 183 178 201 196 193 229 228 227 ++245 245 244 237 237 236 229 228 227 232 232 232 241 241 241 251 251 251 ++255 255 255 255 255 255 255 255 255 171 169 168 0 0 0 0 0 0 ++0 0 0 0 0 0 1 1 1 29 26 26 12 12 11 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 20 27 ++14 75 102 14 75 102 14 75 102 14 76 103 14 75 102 14 74 101 ++14 74 101 14 73 99 13 72 98 13 69 94 13 68 93 12 64 87 ++11 60 82 11 56 77 9 50 69 8 44 59 7 36 49 6 30 41 ++1 5 6 1 7 9 2 9 12 2 13 18 3 18 24 3 21 29 ++5 27 37 6 33 45 7 39 53 8 45 61 9 50 69 10 54 74 ++11 60 82 12 64 87 13 67 91 13 69 94 13 72 98 14 73 99 ++14 74 101 14 75 102 14 76 103 14 75 102 14 76 103 14 75 102 ++4 19 26 0 0 0 21 20 20 29 26 26 0 0 0 29 26 26 ++232 232 232 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 252 254 255 250 252 255 ++250 252 255 213 210 208 218 217 217 255 255 255 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 254 254 254 ++248 247 247 208 204 201 171 169 168 191 183 178 201 196 193 224 223 222 ++241 241 241 237 237 236 229 228 227 232 232 232 241 241 241 250 249 249 ++255 255 255 255 255 255 252 254 255 208 204 201 4 4 4 0 0 0 ++0 0 0 0 0 0 0 0 0 9 8 8 6 5 5 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 5 6 ++14 75 102 14 76 103 14 76 103 14 76 103 14 76 103 14 75 102 ++14 74 101 14 74 101 13 72 98 13 72 97 13 69 94 12 66 90 ++12 62 85 11 56 77 10 53 71 8 45 61 7 39 53 6 30 41 ++1 7 9 1 8 11 2 11 15 3 15 20 4 20 27 4 24 33 ++6 30 41 7 36 49 8 42 57 9 47 64 10 53 71 11 58 79 ++12 62 85 12 66 90 13 69 94 13 72 97 14 73 100 14 74 101 ++14 75 102 14 76 103 14 76 103 14 76 103 14 75 102 12 62 85 ++0 0 0 0 0 0 39 37 35 47 44 41 0 2 3 69 68 60 ++253 253 253 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 245 245 244 213 210 208 176 158 88 176 158 88 199 145 62 ++176 158 88 167 119 72 171 169 168 237 237 236 255 255 255 255 255 255 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++245 245 244 208 204 201 191 183 178 191 183 178 191 183 178 218 217 217 ++237 237 236 232 232 232 232 232 232 232 232 232 241 241 241 248 247 247 ++254 254 254 255 255 255 255 255 255 224 223 222 12 12 11 0 0 0 ++0 0 0 0 0 0 7 7 7 12 12 11 1 1 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++13 69 94 14 76 103 14 76 103 14 76 103 14 76 103 14 76 103 ++14 75 102 14 74 101 14 73 99 13 72 98 13 69 94 12 66 90 ++12 64 87 11 58 79 10 53 71 9 47 64 8 41 55 6 33 45 ++1 7 9 2 10 13 2 13 18 3 18 24 4 23 31 5 28 38 ++6 33 45 7 39 53 9 47 64 10 53 71 11 56 77 11 60 82 ++12 64 87 13 68 93 13 72 97 14 73 100 14 74 101 14 75 102 ++14 76 103 14 78 106 14 78 106 14 78 106 14 76 103 3 16 22 ++0 0 0 1 1 1 55 54 51 47 44 41 0 0 1 113 114 111 ++254 254 254 255 255 255 255 255 255 255 255 255 255 255 255 250 252 255 ++225 202 147 174 129 27 183 122 1 183 122 1 183 122 1 183 122 1 ++183 122 1 183 122 1 183 122 1 174 129 27 225 202 147 248 247 247 ++255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 253 253 253 ++237 237 236 208 204 201 191 183 178 191 183 178 191 183 178 208 204 201 ++229 228 227 237 237 236 232 232 232 232 232 232 237 237 236 245 245 244 ++253 253 253 255 255 255 255 255 255 229 228 227 16 15 15 0 0 0 ++0 0 0 0 0 0 29 26 26 28 32 37 1 1 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++12 62 85 14 76 103 14 78 106 14 78 106 14 78 106 14 76 103 ++14 75 102 14 74 101 14 74 101 13 72 98 13 69 94 13 68 93 ++12 64 87 11 60 82 10 54 74 9 49 66 8 42 57 7 36 49 ++1 8 11 2 12 16 3 15 20 4 20 27 5 25 34 6 30 41 ++7 36 49 8 42 57 9 49 66 10 54 74 11 58 79 12 64 87 ++13 67 91 13 69 94 13 72 98 14 74 101 14 76 103 14 78 106 ++14 78 106 14 78 106 15 82 111 14 78 106 11 58 79 0 0 0 ++0 0 0 2 2 2 55 54 51 55 54 51 0 0 0 148 147 146 ++253 253 253 255 255 255 255 255 255 255 255 255 245 245 244 176 158 88 ++183 122 1 183 122 1 183 122 1 183 122 1 194 135 4 194 135 4 ++194 135 4 183 122 1 183 122 1 183 122 1 183 122 1 176 158 88 ++229 228 227 255 255 255 255 255 255 255 255 255 255 255 255 251 251 251 ++232 232 232 208 204 201 201 196 193 191 183 178 191 183 178 201 196 193 ++224 223 222 232 232 232 232 232 232 232 232 232 232 232 232 241 241 241 ++251 251 251 255 255 255 255 255 255 224 223 222 21 20 20 0 0 0 ++0 0 0 0 0 0 47 44 41 47 44 41 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++11 60 82 14 78 106 15 82 111 14 78 106 14 78 106 14 78 106 ++14 75 102 14 75 102 14 74 101 13 72 98 13 71 96 13 68 93 ++12 64 87 11 60 82 11 56 77 9 50 69 8 44 59 7 36 49 ++2 9 12 2 13 18 3 16 22 4 22 30 5 28 38 6 33 45 ++7 39 53 8 45 61 10 53 71 11 56 77 12 62 85 12 66 90 ++13 69 94 13 72 97 14 74 101 14 76 103 14 78 106 15 82 111 ++15 82 111 15 82 111 15 86 117 15 82 111 4 20 27 0 0 0 ++0 0 0 0 0 1 39 37 35 55 54 51 0 0 0 148 147 146 ++255 255 255 255 255 255 255 255 255 255 255 255 176 158 88 183 122 1 ++183 122 1 183 122 1 183 122 1 194 135 4 202 153 21 194 135 4 ++202 153 21 194 135 4 194 135 4 183 122 1 183 122 1 183 122 1 ++199 145 62 232 232 232 255 255 255 255 255 255 254 254 254 245 245 244 ++224 223 222 208 204 201 208 204 201 191 183 178 191 183 178 201 196 193 ++213 210 208 232 232 232 232 232 232 232 232 232 232 232 232 241 241 241 ++248 247 247 254 254 254 255 255 255 224 223 222 29 26 26 0 0 0 ++0 0 0 1 5 6 69 68 60 29 26 26 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++10 54 74 15 82 111 15 82 111 15 82 111 14 78 106 14 78 106 ++14 76 103 14 75 102 14 74 101 14 73 99 13 71 96 13 68 93 ++12 64 87 12 61 82 11 56 77 9 50 69 8 45 61 7 36 49 ++2 10 13 2 13 18 4 19 26 4 24 33 6 30 41 7 36 49 ++8 41 55 9 47 64 10 54 74 11 58 79 12 64 87 12 66 90 ++13 69 94 13 72 98 14 75 102 14 78 106 15 82 111 15 82 111 ++15 86 117 15 86 117 15 86 117 15 86 117 1 7 9 0 0 0 ++0 0 0 0 0 1 21 20 20 69 68 60 2 2 2 148 147 146 ++255 255 255 255 255 255 254 254 254 208 204 201 194 135 4 194 135 4 ++183 122 1 183 122 1 194 135 4 194 135 4 202 153 21 202 153 21 ++202 153 21 202 153 21 194 135 4 183 122 1 183 122 1 183 122 1 ++183 122 1 176 158 88 255 255 255 255 255 255 254 254 254 237 237 236 ++213 210 208 213 210 208 208 204 201 201 196 193 191 183 178 201 196 193 ++208 204 201 229 228 227 232 232 232 232 232 232 232 232 232 241 241 241 ++248 247 247 253 253 253 255 255 255 224 223 222 29 26 26 0 0 0 ++0 0 0 16 15 15 81 83 82 7 7 7 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++11 56 77 15 86 117 15 86 117 15 82 111 15 82 111 14 78 106 ++14 76 103 14 75 102 14 74 101 13 72 98 13 71 96 13 68 93 ++12 64 87 12 61 82 11 56 77 9 50 69 8 45 61 7 36 49 ++1 10 14 3 15 20 4 19 26 5 25 34 6 30 41 7 36 49 ++8 44 59 9 50 69 10 54 74 11 60 82 12 64 87 13 68 93 ++13 72 97 14 75 102 14 78 106 15 82 111 15 82 111 15 86 117 ++16 90 122 16 90 122 16 90 122 16 90 122 2 13 18 0 0 0 ++0 0 0 0 0 0 0 2 3 47 44 41 29 26 26 148 147 146 ++252 254 255 255 255 255 251 251 251 199 145 62 194 135 4 183 122 1 ++183 122 1 194 135 4 194 135 4 202 153 21 202 153 21 202 153 21 ++202 153 21 202 153 21 202 153 21 194 135 4 183 122 1 183 122 1 ++194 135 4 194 135 4 229 228 227 255 255 255 250 249 249 229 228 227 ++208 204 201 213 210 208 213 210 208 201 196 193 191 183 178 201 196 193 ++201 196 193 224 223 222 232 232 232 232 232 232 232 232 232 241 241 241 ++248 247 247 253 253 253 255 255 255 224 223 222 29 26 26 0 0 0 ++0 0 0 55 54 51 55 54 51 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++12 66 90 16 90 122 15 86 117 15 86 117 15 82 111 14 78 106 ++14 78 106 14 75 102 14 74 101 13 72 98 13 71 96 13 68 93 ++12 64 87 12 62 85 11 56 77 9 50 69 8 45 61 7 36 49 ++2 11 15 3 15 20 4 20 27 5 25 34 6 33 45 7 38 51 ++8 45 61 9 50 69 11 58 79 12 61 82 12 66 90 13 69 94 ++14 73 99 14 76 103 15 82 111 15 86 117 15 86 117 16 90 122 ++16 90 122 15 94 128 15 94 128 15 94 128 1 37 56 5 1 0 ++72 47 3 109 74 3 35 25 1 2 11 15 47 44 41 148 147 146 ++255 255 255 255 255 255 224 223 222 194 135 4 194 135 4 183 122 1 ++183 122 1 183 122 1 194 135 4 202 153 21 202 153 21 225 176 47 ++202 153 21 202 153 21 202 153 21 194 135 4 183 122 1 183 122 1 ++194 135 4 183 122 1 225 202 147 254 251 250 245 245 244 213 210 208 ++201 196 193 213 210 208 213 210 208 201 196 193 201 196 193 201 196 193 ++201 196 193 224 223 222 232 232 232 232 232 232 237 237 236 245 245 244 ++248 247 247 253 253 253 255 255 255 213 210 208 12 12 11 0 0 0 ++4 4 4 69 68 60 16 15 15 0 0 0 0 0 0 3 1 3 ++0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 ++15 82 111 16 90 122 16 90 122 15 86 117 15 82 111 15 82 111 ++14 78 106 14 75 102 14 74 101 14 73 99 13 71 96 13 68 93 ++12 64 87 12 61 82 11 56 77 9 50 69 8 45 61 7 36 49 ++2 11 15 3 15 20 3 21 29 5 27 37 6 33 45 7 39 53 ++8 45 61 10 53 71 11 58 79 12 64 87 13 67 92 13 71 96 ++14 74 101 14 78 106 15 82 111 15 86 117 16 90 122 16 90 122 ++15 94 128 15 94 128 15 94 128 15 94 128 57 82 86 209 152 1 ++255 210 1 255 210 1 241 197 0 109 74 3 1 7 9 113 114 111 ++255 255 255 253 253 253 225 202 147 183 122 1 194 135 4 183 122 1 ++183 122 1 194 135 4 194 135 4 202 153 21 202 153 21 202 153 21 ++202 153 21 202 153 21 194 135 4 194 135 4 183 122 1 183 122 1 ++183 122 1 194 135 4 199 145 62 250 251 253 237 237 236 201 196 193 ++191 183 178 213 210 208 213 210 208 201 196 193 201 196 193 201 196 193 ++208 204 201 224 223 222 232 232 232 232 232 232 237 237 236 248 247 247 ++250 252 255 255 255 255 250 252 255 113 114 111 0 0 0 0 0 0 ++28 32 37 69 68 60 6 5 5 5 1 0 83 13 44 121 31 83 ++121 31 83 29 26 26 0 0 0 0 0 0 0 0 0 4 22 30 ++16 90 122 15 94 128 16 90 122 16 90 122 15 86 117 15 82 111 ++14 78 106 14 76 103 14 74 101 14 73 99 13 71 96 13 68 93 ++12 64 87 11 60 82 11 56 77 9 50 69 8 44 59 7 36 49 ++2 11 15 3 15 20 3 21 29 5 27 37 6 33 45 7 39 53 ++8 45 61 10 53 71 11 58 79 12 64 87 13 69 94 14 73 99 ++14 76 103 15 82 111 15 86 117 16 90 122 16 90 122 15 94 128 ++15 94 128 15 94 128 15 94 128 39 101 116 225 176 47 255 210 1 ++255 206 13 255 206 13 255 210 1 255 210 1 154 101 6 11 13 22 ++171 169 168 255 255 255 176 158 88 194 135 4 194 135 4 194 135 4 ++183 122 1 183 122 1 194 135 4 194 135 4 202 153 21 202 153 21 ++202 153 21 202 153 21 194 135 4 183 122 1 183 122 1 183 122 1 ++194 135 4 194 135 4 199 145 62 237 237 236 229 228 227 191 183 178 ++191 183 178 213 210 208 208 204 201 201 196 193 201 196 193 201 196 193 ++208 204 201 224 223 222 232 232 232 232 232 232 245 245 244 247 240 225 ++225 202 147 245 217 114 245 217 114 154 101 6 35 25 1 28 32 37 ++55 54 51 29 26 26 9 8 8 47 44 41 161 10 114 161 10 114 ++161 10 114 121 31 83 12 12 11 29 26 26 3 1 3 6 57 82 ++15 94 128 15 94 128 15 94 128 16 90 122 15 86 117 15 82 111 ++14 78 106 14 75 102 14 74 101 13 72 98 13 69 94 13 67 91 ++12 64 87 11 60 82 10 54 74 9 49 66 8 42 57 7 36 49 ++2 11 15 3 16 22 3 21 29 5 27 37 6 33 45 7 39 53 ++9 47 64 10 53 71 11 58 79 12 64 87 13 69 94 14 73 99 ++14 78 106 15 82 111 15 86 117 16 90 122 15 94 128 15 94 128 ++15 94 128 15 94 128 15 94 128 176 158 88 241 197 0 255 206 13 ++255 208 38 255 213 45 254 207 32 255 210 1 255 210 1 35 25 1 ++2 9 12 171 169 168 176 158 88 174 129 27 194 135 4 194 135 4 ++183 122 1 183 122 1 183 122 1 194 135 4 194 135 4 194 135 4 ++194 135 4 194 135 4 194 135 4 183 122 1 183 122 1 194 135 4 ++194 135 4 194 135 4 174 129 27 224 226 233 224 223 222 191 183 178 ++191 183 178 208 204 201 208 204 201 208 204 201 201 196 193 201 196 193 ++208 204 201 224 223 222 232 232 232 237 237 236 242 244 252 245 217 114 ++255 206 13 255 213 23 255 213 23 255 234 21 154 101 6 20 41 44 ++4 0 5 0 2 3 7 7 7 81 83 82 105 98 84 121 31 83 ++121 31 83 55 54 51 55 54 51 39 37 35 22 11 1 61 109 99 ++15 94 128 15 94 128 15 94 128 16 90 122 15 86 117 15 82 111 ++14 78 106 14 76 103 14 74 101 13 72 98 13 69 94 12 66 90 ++12 62 85 11 58 79 10 53 71 9 47 64 8 41 55 6 33 45 ++2 11 15 3 16 22 3 21 29 5 28 38 6 33 45 6 40 54 ++9 47 64 10 54 74 11 60 82 12 66 90 13 72 97 14 76 103 ++15 82 111 15 86 117 16 90 122 15 94 128 15 94 128 15 94 128 ++15 94 128 15 94 128 61 109 99 255 205 1 255 206 13 255 213 45 ++255 209 49 255 209 52 255 209 52 254 207 32 255 210 1 234 181 0 ++22 11 1 1 8 11 105 82 42 174 129 27 194 135 4 194 135 4 ++194 135 4 183 122 1 183 122 1 183 122 1 194 135 4 194 135 4 ++194 135 4 183 122 1 183 122 1 183 122 1 183 122 1 194 135 4 ++194 135 4 183 122 1 167 119 72 218 217 217 213 210 208 191 183 178 ++191 183 178 208 204 201 201 196 193 208 204 201 208 204 201 201 196 193 ++208 204 201 224 223 222 232 232 232 237 237 236 241 241 241 235 193 64 ++254 207 32 255 215 52 248 200 52 235 193 64 109 74 3 1 7 9 ++0 0 0 0 0 0 0 0 0 9 8 8 29 26 26 17 25 27 ++16 15 15 9 8 8 0 2 3 4 0 5 83 13 44 178 87 56 ++61 109 99 15 94 128 15 94 128 16 90 122 15 86 117 15 82 111 ++14 78 106 14 76 103 14 73 99 13 72 97 13 68 93 12 64 87 ++11 60 82 11 56 77 9 50 69 8 45 61 7 39 53 6 33 45 ++2 12 16 3 16 22 4 23 31 5 29 40 7 36 49 8 42 57 ++9 49 66 11 56 77 12 62 85 13 69 94 14 74 101 14 78 106 ++15 82 111 15 86 117 16 90 122 15 94 128 15 94 128 15 94 128 ++15 94 128 39 101 116 234 181 0 255 210 1 254 207 32 255 209 52 ++255 209 51 255 209 51 255 209 52 255 209 49 255 206 13 255 210 1 ++194 135 4 0 0 0 0 0 0 35 25 1 154 101 6 194 135 4 ++194 135 4 194 135 4 183 122 1 183 122 1 183 122 1 183 122 1 ++183 122 1 183 122 1 183 122 1 194 135 4 183 122 1 183 122 1 ++183 122 1 174 129 27 176 158 88 218 217 217 208 204 201 191 183 178 ++191 183 178 201 196 193 201 196 193 208 204 201 213 210 208 201 196 193 ++208 204 201 224 223 222 232 232 232 241 241 241 237 237 236 225 176 47 ++255 213 23 225 176 47 172 59 77 161 10 114 83 13 44 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 22 11 1 121 31 83 161 10 114 172 59 77 ++176 158 88 15 94 128 15 94 128 16 90 122 15 86 117 15 82 111 ++14 78 106 14 76 103 14 73 100 13 71 96 13 67 92 12 64 87 ++11 58 79 10 54 74 9 49 66 8 42 57 7 36 49 5 29 40 ++2 13 18 4 19 26 5 25 34 6 33 45 7 39 53 8 45 61 ++10 53 71 11 60 82 12 66 90 13 72 98 14 78 106 15 82 111 ++15 86 117 16 90 122 16 90 122 15 94 128 15 94 128 15 94 128 ++39 101 116 174 129 27 255 205 1 255 205 1 255 208 38 255 209 52 ++255 209 51 255 209 51 255 209 51 255 209 52 255 208 38 255 210 1 ++255 210 1 109 74 3 0 0 0 7 5 1 16 15 15 154 101 6 ++183 122 1 183 122 1 183 122 1 183 122 1 183 122 1 183 122 1 ++183 122 1 183 122 1 183 122 1 183 122 1 183 122 1 194 135 4 ++174 129 27 174 129 27 176 158 88 218 217 217 201 196 193 191 183 178 ++191 183 178 191 183 178 191 183 178 208 204 201 213 210 208 208 204 201 ++208 204 201 224 223 222 232 232 232 245 245 244 232 232 232 202 153 21 ++255 205 1 178 87 56 150 20 84 161 10 114 83 13 44 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 72 47 3 183 122 1 154 101 6 172 59 77 199 145 62 ++176 158 88 15 94 128 15 94 128 15 94 128 16 90 122 15 86 117 ++15 82 111 14 78 106 14 73 99 13 69 94 12 66 90 12 62 85 ++11 56 77 10 53 71 8 45 61 6 40 54 6 33 45 5 27 37 ++3 15 20 3 21 29 5 28 38 7 36 49 8 44 59 9 49 66 ++8 56 78 12 62 85 13 69 94 13 74 101 14 78 106 15 82 111 ++15 86 117 16 90 122 15 94 128 16 90 122 39 101 116 81 83 82 ++174 129 27 243 191 0 255 205 1 255 206 22 255 209 45 255 209 52 ++255 209 51 255 209 51 255 209 51 255 209 52 255 209 51 255 206 22 ++255 210 1 241 197 0 72 47 3 0 1 1 1 1 1 2 2 2 ++109 74 3 194 135 4 194 135 4 183 122 1 183 122 1 183 122 1 ++183 122 1 183 122 1 183 122 1 194 135 4 194 135 4 174 129 27 ++174 129 27 174 129 27 191 183 178 213 210 208 201 196 193 191 183 178 ++191 183 178 191 183 178 191 183 178 213 210 208 213 210 208 208 204 201 ++213 210 208 218 217 217 232 232 232 224 226 233 191 183 178 202 153 21 ++255 205 1 172 59 77 161 10 114 172 59 77 154 101 6 72 47 3 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++72 47 3 183 122 1 194 135 4 222 168 1 209 152 1 178 87 56 ++167 119 72 15 94 128 15 94 128 15 94 128 16 90 122 15 86 117 ++15 82 111 14 78 106 14 74 101 13 69 94 12 64 87 11 60 82 ++10 54 74 9 50 69 8 44 59 7 36 49 6 30 41 4 24 33 ++3 16 22 4 23 31 6 30 41 7 39 53 9 47 64 10 53 71 ++8 56 78 9 63 87 13 71 96 12 75 102 15 82 111 15 82 111 ++15 86 117 61 109 99 105 98 84 194 135 4 194 135 4 209 152 1 ++234 181 0 255 205 1 255 205 1 255 206 22 255 209 52 255 209 52 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 52 255 208 38 ++255 205 1 255 210 1 222 168 1 7 5 1 0 0 0 0 0 0 ++0 0 0 72 47 3 183 122 1 209 152 1 194 135 4 194 135 4 ++194 135 4 194 135 4 194 135 4 174 129 27 174 129 27 174 129 27 ++194 135 4 176 158 88 201 196 193 208 204 201 201 196 193 201 196 193 ++191 183 178 171 169 168 191 183 178 213 210 208 213 210 208 208 204 201 ++213 210 208 224 223 222 224 223 222 201 196 193 148 147 146 194 135 4 ++255 205 1 178 87 56 178 87 56 183 122 1 183 122 1 154 101 6 ++72 47 3 22 11 1 7 5 1 7 5 1 22 11 1 109 74 3 ++194 135 4 209 152 1 222 168 1 255 205 1 178 87 56 161 10 114 ++81 83 82 15 94 128 15 94 128 15 94 128 16 90 122 16 90 122 ++15 86 117 14 78 106 14 75 102 13 69 94 12 64 87 11 58 79 ++10 53 71 9 47 64 8 41 55 6 33 45 5 28 38 4 22 30 ++3 16 22 4 24 33 6 33 45 6 40 54 7 48 67 10 53 71 ++11 58 79 10 65 89 11 69 94 12 75 102 9 72 100 61 109 99 ++202 153 21 249 197 0 255 210 1 255 205 1 255 205 1 255 205 1 ++255 205 1 255 205 1 255 206 13 255 208 38 255 209 52 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 52 255 209 49 ++255 206 22 255 210 1 255 210 1 109 74 3 0 0 0 0 0 0 ++0 0 0 3 3 3 21 20 20 154 101 6 194 135 4 174 129 27 ++174 129 27 174 129 27 174 129 27 174 129 27 194 135 4 194 135 4 ++174 129 27 171 169 168 201 196 193 201 196 193 201 196 193 201 196 193 ++191 183 178 191 183 178 191 183 178 208 204 201 213 210 208 213 210 208 ++218 217 217 218 217 217 218 217 217 191 183 178 148 147 146 154 101 6 ++178 87 56 154 101 6 241 197 0 234 181 0 209 152 1 194 135 4 ++183 122 1 154 101 6 154 101 6 154 101 6 154 101 6 194 135 4 ++222 168 1 243 191 0 255 206 13 255 206 22 172 59 77 161 10 114 ++150 20 84 15 94 128 15 94 128 15 94 128 15 94 128 16 90 122 ++15 86 117 15 82 111 14 76 103 13 69 94 12 64 87 11 56 77 ++9 50 69 8 44 59 7 38 51 6 30 41 5 25 34 4 19 26 ++3 16 22 4 24 33 6 33 45 6 40 54 7 48 67 10 53 71 ++8 56 78 9 63 87 11 69 94 9 72 100 35 87 96 222 168 1 ++255 210 1 255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 ++255 205 1 255 206 13 254 207 32 255 209 51 255 209 52 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 52 ++255 208 38 255 206 13 255 210 1 249 197 0 35 25 1 0 0 0 ++0 0 0 0 0 0 1 1 1 7 5 1 105 82 42 194 135 4 ++194 135 4 194 135 4 194 135 4 194 135 4 183 122 1 167 119 72 ++171 169 168 191 183 178 201 196 193 201 196 193 201 196 193 201 196 193 ++191 183 178 171 169 168 191 183 178 201 196 193 213 210 208 218 217 217 ++218 217 217 224 223 222 224 223 222 191 183 178 148 147 146 150 20 84 ++161 10 114 178 87 56 255 210 1 255 205 1 234 181 0 222 168 1 ++209 152 1 194 135 4 194 135 4 209 152 1 209 152 1 234 181 0 ++249 197 0 255 208 38 253 211 50 255 214 50 172 59 77 161 10 114 ++172 59 77 176 158 88 15 94 128 15 94 128 15 94 128 16 90 122 ++15 86 117 15 82 111 14 78 106 13 72 97 12 64 87 11 56 77 ++9 49 66 8 42 57 7 36 49 5 28 38 4 22 30 3 16 22 ++3 18 24 4 24 33 6 33 45 6 40 54 7 48 67 9 50 69 ++8 56 78 8 60 84 12 66 90 6 67 96 57 82 86 234 181 0 ++255 205 1 255 206 22 255 208 38 255 208 38 255 208 38 255 208 38 ++255 208 38 255 209 45 255 209 51 255 209 52 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 52 ++255 209 51 255 206 22 255 205 1 255 210 1 194 135 4 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 154 101 6 ++194 135 4 194 135 4 183 122 1 174 129 27 148 147 146 171 169 168 ++171 169 168 191 183 178 201 196 193 201 196 193 201 196 193 201 196 193 ++191 183 178 191 183 178 191 183 178 201 196 193 208 204 201 218 217 217 ++224 223 222 224 223 222 224 223 222 201 196 193 148 147 146 161 10 114 ++161 10 114 178 87 56 255 205 1 255 205 1 255 205 1 243 191 0 ++234 181 0 234 181 0 234 181 0 234 181 0 243 191 0 255 205 1 ++254 207 32 255 209 55 255 209 52 255 214 50 225 176 47 139 105 59 ++225 176 47 255 213 23 199 145 62 15 94 128 16 90 122 16 90 122 ++15 86 117 15 86 117 14 78 106 13 72 98 10 65 89 11 56 77 ++9 47 64 8 41 55 6 33 45 5 25 34 4 19 26 3 15 20 ++3 16 22 4 24 33 6 33 45 6 40 54 5 44 60 7 48 67 ++10 54 74 11 58 79 9 63 87 8 66 93 35 87 96 222 168 1 ++255 210 1 255 208 38 255 209 55 255 209 52 255 209 52 255 209 52 ++255 209 52 255 209 52 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 52 255 209 45 255 206 22 255 210 1 255 210 1 109 74 3 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 105 82 42 ++176 158 88 167 119 72 148 147 146 148 147 146 171 169 168 171 169 168 ++191 183 178 201 196 193 201 196 193 201 196 193 201 196 193 191 183 178 ++191 183 178 191 183 178 191 183 178 191 183 178 208 204 201 224 223 222 ++224 223 222 229 228 227 224 226 233 201 196 193 148 147 146 150 20 84 ++150 20 84 202 153 21 255 210 1 255 205 1 255 205 1 255 205 1 ++255 205 1 249 197 0 255 205 1 255 205 1 255 205 1 255 205 1 ++255 209 45 255 209 52 255 209 51 255 218 49 225 176 47 150 20 84 ++199 145 62 255 218 49 255 213 23 176 158 88 16 90 122 16 90 122 ++15 86 117 15 86 117 14 78 106 13 73 99 10 65 89 11 56 77 ++9 47 64 6 40 54 6 30 41 4 24 33 3 18 24 2 12 16 ++3 15 20 4 23 31 5 29 40 7 38 51 5 44 60 7 48 67 ++9 50 69 8 56 78 8 60 84 9 63 87 13 71 96 202 153 21 ++255 210 1 255 206 22 255 209 52 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 52 255 208 38 255 210 1 255 210 1 209 152 1 ++5 1 0 0 0 0 0 0 0 0 0 0 3 1 3 81 83 82 ++201 196 193 191 183 178 191 183 178 171 169 168 171 169 168 191 183 178 ++191 183 178 201 196 193 208 204 201 208 204 201 191 183 178 191 183 178 ++191 183 178 191 183 178 191 183 178 191 183 178 208 204 201 224 223 222 ++229 228 227 229 228 227 232 232 232 208 204 201 148 147 146 109 74 3 ++183 122 1 243 191 0 255 205 1 255 205 1 255 205 1 255 205 1 ++255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 ++255 209 51 255 209 52 255 209 51 252 207 50 172 59 77 161 10 114 ++172 59 77 253 211 50 255 218 49 255 213 23 176 158 88 16 90 122 ++15 86 117 15 82 111 14 78 106 13 73 99 10 65 89 8 56 78 ++7 48 67 6 40 54 6 30 41 4 22 30 3 16 22 2 11 15 ++3 15 20 3 21 29 5 29 40 7 36 49 5 44 60 9 47 64 ++7 48 67 6 54 76 11 58 79 9 63 87 13 67 91 174 129 27 ++255 205 1 255 206 13 255 209 45 255 209 52 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 52 255 209 52 254 207 32 255 210 1 255 210 1 ++109 74 3 0 0 0 0 0 0 0 0 0 0 0 0 113 114 111 ++208 204 201 201 196 193 191 183 178 191 183 178 201 196 193 201 196 193 ++201 196 193 213 210 208 213 210 208 208 204 201 191 183 178 191 183 178 ++191 183 178 201 196 193 191 183 178 191 183 178 208 204 201 224 223 222 ++232 232 232 229 228 227 237 237 236 171 169 168 121 31 83 150 20 84 ++174 129 27 255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 ++255 206 13 255 206 13 255 205 1 255 206 13 255 206 13 255 208 38 ++255 209 52 255 209 51 255 211 51 248 200 52 150 20 84 161 10 114 ++172 59 77 252 207 50 253 211 50 253 211 50 255 213 23 176 158 88 ++39 101 116 14 78 106 14 78 106 11 72 98 10 65 89 8 56 78 ++7 48 67 6 40 54 6 30 41 3 21 29 3 15 20 1 10 13 ++2 13 18 3 20 27 3 27 37 6 33 45 6 40 54 5 44 60 ++7 48 67 10 53 71 8 56 78 8 60 84 9 63 87 139 105 59 ++255 210 1 255 205 1 255 208 38 255 209 52 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 52 255 209 49 255 206 13 255 210 1 ++241 197 0 35 25 1 0 0 1 7 7 7 55 54 51 171 169 168 ++213 210 208 201 196 193 201 196 193 201 196 193 201 196 193 208 204 201 ++213 210 208 218 217 217 218 217 217 208 204 201 191 183 178 191 183 178 ++201 196 193 201 196 193 191 183 178 191 183 178 208 204 201 229 228 227 ++232 232 232 237 237 236 213 210 208 81 83 82 150 20 84 161 10 114 ++172 59 77 249 197 0 255 205 1 255 205 1 255 206 22 255 209 45 ++255 209 45 255 209 45 255 208 38 255 208 38 255 208 38 255 209 51 ++255 209 52 255 209 51 255 211 51 252 207 50 172 59 77 161 10 114 ++199 145 62 252 207 50 255 209 51 255 209 51 253 211 50 255 222 40 ++254 207 32 113 114 111 9 72 100 11 69 94 9 63 87 8 56 78 ++9 47 64 7 39 53 5 29 40 3 20 27 2 13 18 1 8 11 ++2 13 18 3 20 27 3 27 37 6 33 45 6 40 54 8 42 57 ++9 47 64 7 48 67 10 54 74 8 56 78 8 60 84 139 105 59 ++255 210 1 255 205 1 254 207 32 255 209 52 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 52 255 208 38 255 205 1 ++255 210 1 209 152 1 113 114 111 201 196 193 224 223 222 224 226 233 ++218 217 217 218 217 217 213 210 208 213 210 208 218 217 217 218 217 217 ++218 217 217 224 226 233 229 228 227 208 204 201 191 183 178 191 183 178 ++208 204 201 208 204 201 191 183 178 191 183 178 208 204 201 229 228 227 ++245 245 244 237 237 236 81 83 82 22 11 1 150 20 84 161 10 114 ++178 87 56 243 191 0 255 205 1 255 206 22 255 209 49 255 209 52 ++255 209 52 255 209 52 255 209 52 255 209 52 255 209 52 255 209 51 ++255 209 51 255 209 51 255 209 51 255 218 49 202 153 21 167 119 72 ++255 209 45 255 211 51 255 209 51 255 209 51 255 209 51 255 209 49 ++255 213 45 255 213 23 35 87 96 8 66 93 11 60 82 10 53 71 ++5 44 60 7 38 51 5 27 37 3 18 24 2 12 16 1 7 9 ++2 13 18 3 20 27 3 27 37 6 33 45 7 38 51 1 37 56 ++5 44 60 7 48 67 7 48 67 6 54 76 8 60 84 139 105 59 ++255 205 1 255 206 13 255 208 38 255 209 52 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 52 255 209 49 255 206 13 ++255 205 1 255 210 1 225 176 47 224 226 233 250 251 253 232 232 232 ++229 228 227 224 226 233 224 223 222 224 226 233 224 223 222 224 226 233 ++232 232 232 241 241 241 232 232 232 201 196 193 191 183 178 191 183 178 ++208 204 201 208 204 201 191 183 178 171 169 168 213 210 208 241 241 241 ++232 232 232 81 83 82 0 0 0 1 1 1 83 13 44 150 20 84 ++194 135 4 255 205 1 255 206 13 255 208 38 255 209 52 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 218 49 199 145 62 172 59 77 199 145 62 ++255 218 49 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++253 211 50 255 208 38 35 87 96 8 60 84 8 56 78 7 48 67 ++6 40 54 6 33 45 4 23 31 3 16 22 1 10 13 1 4 5 ++2 13 18 3 21 29 3 27 37 6 33 45 7 38 51 6 40 54 ++5 44 60 5 44 60 7 48 67 10 53 71 6 54 76 174 129 27 ++255 210 1 255 206 13 255 209 45 255 209 52 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 52 255 209 49 255 206 22 ++255 205 1 255 205 1 234 181 0 176 158 88 250 252 255 248 247 247 ++241 241 241 237 237 236 237 237 236 232 232 232 237 237 236 241 241 241 ++245 245 244 248 247 247 232 232 232 201 196 193 191 183 178 201 196 193 ++213 210 208 213 210 208 171 169 168 191 183 178 224 223 222 213 210 208 ++81 83 82 0 0 0 0 0 0 0 0 0 109 74 3 109 74 3 ++209 152 1 255 205 1 255 206 13 255 209 45 255 209 52 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 215 52 225 176 47 150 20 84 161 10 114 172 59 77 ++251 208 45 255 211 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 222 40 199 145 62 10 65 89 8 56 78 10 53 71 5 44 60 ++7 36 49 5 29 40 3 20 27 2 13 18 1 8 11 1 4 5 ++3 15 20 3 21 29 3 27 37 6 33 45 1 37 56 6 40 54 ++5 44 60 8 45 61 7 48 67 7 48 67 10 53 71 202 153 21 ++255 210 1 255 206 22 255 209 51 255 209 52 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 52 255 209 49 254 207 32 ++255 205 1 255 205 1 255 210 1 194 135 4 171 169 168 252 254 255 ++253 253 253 250 249 249 248 247 247 248 247 247 250 249 249 253 253 253 ++254 254 254 250 249 249 224 223 222 191 183 178 191 183 178 201 196 193 ++218 217 217 218 217 217 191 183 178 171 169 168 105 98 84 17 25 27 ++0 0 0 0 0 0 0 0 0 7 5 1 109 74 3 150 20 84 ++172 59 77 222 168 1 255 213 23 255 209 45 255 209 52 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 218 49 178 87 56 161 10 114 161 10 114 178 87 56 ++255 215 52 255 209 52 255 209 51 255 209 52 255 213 45 255 208 38 ++176 158 88 23 75 89 6 57 82 10 53 71 8 45 61 7 38 51 ++5 29 40 4 23 31 3 16 22 1 10 14 1 7 9 0 3 4 ++3 16 22 4 23 31 3 27 37 6 33 45 1 37 56 6 40 54 ++8 42 57 5 44 60 5 44 60 5 44 60 45 73 77 255 210 1 ++255 210 1 255 206 22 255 209 49 255 209 52 255 209 52 255 209 52 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 254 207 32 ++255 205 1 255 205 1 255 205 1 243 191 0 154 101 6 191 183 178 ++252 254 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 ++255 255 255 248 247 247 218 217 217 191 183 178 201 196 193 208 204 201 ++208 204 201 171 169 168 105 98 84 47 44 41 9 8 8 0 0 0 ++0 0 0 0 0 0 0 0 0 35 25 1 154 101 6 161 10 114 ++161 10 114 178 87 56 255 206 22 255 209 49 255 209 52 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 218 49 255 218 49 178 87 56 161 10 114 172 59 77 235 193 64 ++255 215 52 255 209 55 255 214 50 254 207 32 225 176 47 61 109 99 ++6 54 76 6 54 76 10 53 71 5 44 60 7 38 51 5 29 40 ++4 23 31 3 18 24 2 12 16 1 7 9 1 4 5 0 2 3 ++3 16 22 4 24 33 5 29 40 6 33 45 7 36 49 6 40 54 ++6 40 54 5 44 60 5 44 60 6 40 54 139 105 59 255 210 1 ++255 205 1 255 205 1 255 206 13 254 207 32 255 209 45 255 209 45 ++255 209 51 255 209 52 255 209 52 255 209 52 255 209 52 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 254 207 32 ++255 205 1 255 205 1 255 205 1 241 197 0 194 135 4 72 47 3 ++105 98 84 171 169 168 218 217 217 237 237 236 245 245 244 245 245 244 ++232 232 232 208 204 201 171 169 168 148 147 146 113 114 111 105 98 84 ++55 54 51 21 20 20 29 26 26 39 37 35 21 20 20 4 4 4 ++0 0 0 0 0 0 5 1 0 35 25 1 154 101 6 150 20 84 ++161 10 114 172 59 77 255 213 23 255 213 45 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 51 255 209 49 ++235 193 64 178 87 56 105 82 42 225 176 47 252 207 50 255 214 50 ++255 213 45 255 206 22 225 176 47 105 98 84 13 67 91 6 57 82 ++6 54 76 9 50 69 5 44 60 7 36 49 3 27 37 3 21 29 ++3 16 22 2 12 16 1 8 11 1 5 6 0 2 3 0 1 1 ++3 16 22 4 24 33 3 27 37 6 33 45 1 37 56 6 40 54 ++1 37 56 6 40 54 1 37 56 5 44 60 174 129 27 255 210 1 ++255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 255 206 22 ++255 206 22 254 207 32 255 208 38 255 209 45 255 209 45 255 209 51 ++255 209 52 255 209 52 255 209 51 255 209 51 255 209 51 255 209 51 ++255 209 51 255 209 51 255 209 51 255 209 51 255 209 52 255 208 38 ++255 205 1 255 205 1 255 205 1 243 191 0 209 152 1 109 74 3 ++4 0 5 0 0 1 12 12 11 39 37 35 47 44 41 47 44 41 ++47 44 41 55 54 51 69 68 60 69 68 60 47 44 41 39 37 35 ++21 20 20 22 11 1 39 37 35 47 44 41 21 20 20 6 5 5 ++0 0 0 0 0 0 1 1 1 72 47 3 183 122 1 194 135 4 ++172 59 77 202 153 21 225 176 47 225 176 47 253 211 50 255 211 51 ++255 209 51 255 211 51 255 211 51 255 211 51 255 211 51 225 176 47 ++150 20 84 161 10 114 161 10 114 225 176 47 255 222 40 255 206 22 ++222 168 1 105 82 42 23 75 89 8 60 84 8 60 84 10 53 71 ++7 48 67 8 42 57 7 36 49 3 27 37 3 21 29 3 15 20 ++2 11 15 1 8 11 1 5 6 0 3 4 0 1 1 0 1 1 ++3 16 22 3 21 29 3 27 37 6 33 45 6 33 45 6 33 45 ++7 36 49 7 36 49 7 36 49 6 33 45 139 105 59 255 210 1 ++255 210 1 255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 ++255 205 1 255 205 1 255 205 1 255 206 13 255 206 13 255 206 22 ++255 208 38 255 209 45 255 209 51 255 209 52 255 209 52 255 209 52 ++255 209 51 255 209 51 255 209 52 255 209 52 255 209 52 255 208 38 ++255 205 1 255 205 1 255 205 1 234 181 0 209 152 1 154 101 6 ++7 5 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ++16 15 15 47 44 41 69 68 60 55 54 51 47 44 41 39 37 35 ++21 20 20 16 15 15 29 26 26 39 37 35 29 26 26 7 7 7 ++0 0 0 0 0 0 0 0 0 72 47 3 183 122 1 209 152 1 ++222 168 1 154 101 6 161 10 114 150 20 84 178 87 56 255 215 52 ++255 214 50 255 209 49 248 200 52 252 207 50 255 222 40 172 59 77 ++161 10 114 161 10 114 172 59 77 249 198 10 249 197 0 174 129 27 ++45 73 77 6 67 96 10 65 89 8 56 78 10 53 71 5 44 60 ++6 40 54 6 33 45 5 28 38 3 21 29 3 16 22 2 11 15 ++1 8 11 1 5 6 0 3 4 0 2 3 0 1 1 0 0 1 ++2 13 18 3 20 27 4 24 33 3 27 37 5 29 40 6 33 45 ++6 33 45 6 33 45 6 33 45 6 33 45 15 45 54 174 129 27 ++241 197 0 249 197 0 249 197 0 243 191 0 249 197 0 249 197 0 ++249 197 0 249 197 0 255 205 1 255 205 1 255 205 1 255 205 1 ++255 205 1 255 206 13 255 206 22 254 207 32 255 209 45 255 209 49 ++255 209 51 255 209 51 255 209 51 255 209 49 255 208 38 255 206 13 ++255 205 1 255 205 1 255 205 1 234 181 0 209 152 1 154 101 6 ++22 11 1 0 0 0 0 0 0 0 0 0 0 0 0 12 12 11 ++39 37 35 69 68 60 55 54 51 69 68 60 47 44 41 29 26 26 ++16 15 15 12 12 11 21 20 20 39 37 35 29 26 26 9 8 8 ++1 1 1 0 0 0 1 1 1 109 74 3 183 122 1 209 152 1 ++243 191 0 202 153 21 161 10 114 161 10 114 150 20 84 199 145 62 ++252 207 50 172 59 77 150 20 84 172 59 77 199 145 62 178 87 56 ++172 59 77 178 87 56 222 168 1 209 152 1 105 82 42 23 75 89 ++4 60 87 11 60 82 6 54 76 9 50 69 8 45 61 7 39 53 ++6 30 41 5 27 37 3 21 29 3 15 20 2 11 15 1 8 11 ++1 5 6 1 4 5 0 2 3 0 2 3 0 1 1 0 0 0 ++1 10 14 3 15 20 3 18 24 3 21 29 4 24 33 4 24 33 ++3 27 37 3 27 37 3 27 37 3 27 37 3 27 37 6 33 45 ++69 68 60 154 101 6 194 135 4 194 135 4 209 152 1 209 152 1 ++209 152 1 222 168 1 222 168 1 234 181 0 234 181 0 243 191 0 ++249 197 0 255 205 1 255 205 1 255 205 1 255 205 1 255 206 13 ++255 206 22 255 206 22 255 206 22 255 206 13 255 205 1 255 205 1 ++255 205 1 249 197 0 234 181 0 222 168 1 209 152 1 154 101 6 ++22 11 1 0 0 0 0 0 0 0 0 0 5 1 0 29 26 26 ++55 54 51 69 68 60 55 54 51 47 44 41 39 37 35 29 26 26 ++22 11 1 11 5 1 22 11 1 29 26 26 29 26 26 12 12 11 ++1 1 1 0 0 0 5 1 0 72 47 3 183 122 1 194 135 4 ++222 168 1 243 191 0 178 87 56 161 10 114 161 10 114 178 87 56 ++178 87 56 161 10 114 161 10 114 161 10 114 172 59 77 222 168 1 ++209 152 1 209 152 1 154 101 6 45 73 77 4 60 87 8 60 84 ++11 58 79 10 53 71 9 49 66 8 42 57 7 36 49 5 29 40 ++4 24 33 3 20 27 3 15 20 2 11 15 1 8 11 1 5 6 ++0 3 4 0 2 3 0 1 1 0 1 1 0 0 0 0 0 0 ++1 7 9 1 9 14 2 12 16 3 15 20 3 16 22 3 16 22 ++3 18 24 3 20 27 3 21 29 3 20 27 4 23 31 4 23 31 ++3 20 27 5 28 38 20 41 44 47 44 41 105 82 42 154 101 6 ++154 101 6 183 122 1 194 135 4 194 135 4 194 135 4 209 152 1 ++222 168 1 234 181 0 234 181 0 249 197 0 255 205 1 255 205 1 ++255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 255 205 1 ++249 197 0 234 181 0 222 168 1 209 152 1 183 122 1 154 101 6 ++11 5 1 0 0 0 0 0 0 0 0 0 7 5 1 39 37 35 ++69 68 60 105 82 42 55 54 51 55 54 51 39 37 35 29 26 26 ++17 25 27 10 20 26 17 25 27 28 32 37 29 26 26 16 15 15 ++3 3 3 0 0 0 5 1 0 72 47 3 183 122 1 194 135 4 ++209 152 1 222 168 1 243 191 0 222 168 1 209 152 1 209 152 1 ++194 135 4 178 87 56 172 59 77 178 87 56 209 152 1 209 152 1 ++183 122 1 105 82 42 12 64 87 8 60 84 11 58 79 10 54 74 ++9 49 66 8 45 61 7 39 53 7 36 49 5 28 38 4 23 31 ++3 18 24 3 15 20 1 10 14 1 8 11 1 5 6 0 3 4 ++0 2 3 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 ++1 4 5 1 7 9 1 7 9 1 8 11 1 10 13 1 10 14 ++2 12 16 2 13 18 2 13 18 3 15 20 3 15 20 3 16 22 ++3 20 27 3 20 27 3 21 29 4 23 31 4 24 33 5 29 40 ++20 41 44 47 44 41 69 68 60 109 74 3 154 101 6 183 122 1 ++183 122 1 194 135 4 209 152 1 209 152 1 222 168 1 234 181 0 ++243 191 0 249 197 0 249 197 0 249 197 0 243 191 0 243 191 0 ++222 168 1 209 152 1 209 152 1 183 122 1 183 122 1 109 74 3 ++1 7 9 6 33 45 9 47 64 9 50 69 15 53 69 45 73 77 ++81 83 82 81 83 82 81 83 82 57 82 86 45 73 77 32 65 75 ++23 57 72 15 53 69 15 53 69 23 57 72 32 65 75 24 54 62 ++8 45 61 7 38 51 3 27 37 72 47 3 154 101 6 183 122 1 ++194 135 4 209 152 1 222 168 1 234 181 0 234 181 0 234 181 0 ++234 181 0 234 181 0 209 152 1 209 152 1 194 135 4 154 101 6 ++69 68 60 4 60 87 6 57 82 11 56 77 10 53 71 9 47 64 ++8 42 57 7 38 51 6 33 45 5 27 37 4 22 30 3 18 24 ++2 13 18 1 10 14 1 8 11 1 7 9 1 4 5 0 2 3 ++0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 ++0 1 1 0 3 4 1 4 5 1 5 6 1 5 6 1 7 9 ++1 7 9 1 7 9 1 9 12 1 9 14 1 10 14 2 12 16 ++2 13 18 3 15 20 3 18 24 3 20 27 3 21 29 3 27 37 ++3 27 37 5 29 40 6 33 45 1 37 56 8 42 57 55 54 51 ++105 82 42 154 101 6 183 122 1 194 135 4 194 135 4 209 152 1 ++222 168 1 222 168 1 222 168 1 222 168 1 222 168 1 222 168 1 ++209 152 1 194 135 4 183 122 1 183 122 1 109 74 3 20 41 44 ++8 56 78 11 60 82 11 60 82 11 60 82 16 62 81 57 82 86 ++81 83 82 61 109 99 81 83 82 57 82 86 32 65 75 32 65 75 ++23 57 72 15 53 69 10 53 71 23 57 72 32 65 75 23 57 72 ++10 53 71 10 54 74 6 54 76 24 54 62 154 101 6 183 122 1 ++194 135 4 194 135 4 209 152 1 209 152 1 209 152 1 209 152 1 ++209 152 1 209 152 1 194 135 4 183 122 1 183 122 1 69 68 60 ++4 60 87 11 58 79 10 54 74 10 53 71 9 47 64 8 42 57 ++7 38 51 6 33 45 5 28 38 4 23 31 3 18 24 2 13 18 ++2 11 15 1 8 11 1 7 9 1 4 5 0 2 3 0 2 3 ++0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 1 1 0 2 3 0 2 3 0 2 3 1 4 5 ++0 3 4 1 4 5 1 4 5 1 5 6 1 7 9 1 7 9 ++2 9 12 1 10 14 2 12 16 3 15 20 3 16 22 3 20 27 ++4 23 31 3 27 37 6 30 41 6 33 45 7 36 49 7 38 51 ++6 40 54 15 45 54 55 54 51 105 82 42 154 101 6 183 122 1 ++194 135 4 194 135 4 194 135 4 209 152 1 209 152 1 209 152 1 ++194 135 4 183 122 1 183 122 1 105 82 42 16 62 81 11 58 79 ++11 58 79 12 61 82 11 58 79 8 56 78 11 56 77 23 75 89 ++57 82 86 81 83 82 57 82 86 45 73 77 32 65 75 23 57 72 ++15 53 69 7 48 67 7 48 67 10 53 71 23 57 72 15 53 69 ++9 50 69 10 53 71 10 54 74 9 50 69 69 68 60 154 101 6 ++183 122 1 183 122 1 194 135 4 194 135 4 194 135 4 194 135 4 ++194 135 4 194 135 4 183 122 1 154 101 6 69 68 60 6 57 82 ++8 56 78 10 54 74 10 53 71 9 47 64 8 44 59 7 38 51 ++6 33 45 5 27 37 4 23 31 4 19 26 3 15 20 2 11 15 ++1 8 11 1 7 9 1 5 6 0 3 4 0 2 3 0 1 1 ++0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 ++0 1 1 0 2 3 0 2 3 0 2 3 0 3 4 1 4 5 ++1 5 6 1 7 9 1 8 11 2 9 12 2 12 16 2 13 18 ++3 16 22 3 21 29 4 24 33 5 28 38 6 33 45 7 36 49 ++6 40 54 5 44 60 5 44 60 5 44 60 15 53 69 55 54 51 ++105 82 42 154 101 6 183 122 1 183 122 1 183 122 1 183 122 1 ++183 122 1 154 101 6 105 82 42 11 56 77 8 56 78 45 73 77 ++139 105 59 139 105 59 139 105 59 139 105 59 105 98 84 105 98 84 ++105 98 84 113 114 111 105 98 84 105 98 84 105 98 84 105 98 84 ++105 98 84 81 83 82 81 83 82 105 98 84 105 98 84 105 98 84 ++105 98 84 139 105 59 139 105 59 139 105 59 105 82 42 105 82 42 ++154 101 6 154 101 6 183 122 1 183 122 1 183 122 1 183 122 1 ++183 122 1 154 101 6 105 82 42 32 65 75 6 57 82 8 56 78 ++10 54 74 9 50 69 9 47 64 8 42 57 7 38 51 6 33 45 ++5 27 37 4 23 31 4 19 26 3 15 20 2 11 15 2 9 12 ++1 7 9 1 4 5 0 3 4 0 2 3 0 1 1 0 1 1 ++0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 1 0 1 1 0 1 1 0 1 1 0 2 3 ++0 2 3 0 3 4 1 4 5 1 7 9 1 8 11 2 10 13 ++2 13 18 3 16 22 4 19 26 4 22 30 5 27 37 6 30 41 ++7 36 49 7 39 53 8 42 57 5 44 60 7 48 67 7 48 67 ++10 53 71 24 54 62 55 54 51 69 68 60 105 82 42 105 82 42 ++69 68 60 32 65 75 6 54 76 8 56 78 6 54 76 57 82 86 ++193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 ++193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 ++193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 ++193 130 84 193 130 84 193 130 84 193 130 84 105 98 84 6 54 76 ++32 65 75 69 68 60 105 82 42 105 82 42 105 82 42 105 82 42 ++69 68 60 32 65 75 11 58 79 8 56 78 11 56 77 10 54 74 ++9 50 69 9 47 64 8 42 57 7 38 51 6 33 45 5 28 38 ++4 23 31 4 19 26 3 15 20 2 12 16 2 9 12 1 7 9 ++1 5 6 0 3 4 0 3 4 0 1 1 0 1 1 0 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 ++0 1 1 0 2 3 0 3 4 1 4 5 1 5 6 1 7 9 ++2 9 12 2 12 16 3 15 20 3 18 24 3 21 29 5 25 34 ++6 30 41 6 33 45 7 38 51 8 41 55 8 44 59 9 47 64 ++9 50 69 6 54 76 6 54 76 10 53 71 9 50 69 10 53 71 ++10 53 71 6 54 76 11 56 77 11 56 77 6 54 76 32 65 75 ++193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 193 130 84 ++167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 ++167 119 72 167 119 72 167 119 72 193 130 84 167 119 72 193 130 84 ++193 130 84 193 130 84 193 130 84 193 130 84 69 68 60 6 54 76 ++8 56 78 8 56 78 6 54 76 6 57 82 6 54 76 6 57 82 ++6 57 82 8 56 78 11 58 79 11 56 77 10 54 74 9 50 69 ++9 47 64 8 42 57 7 38 51 6 33 45 5 29 40 4 24 33 ++4 19 26 3 16 22 2 13 18 2 10 13 1 7 9 1 5 6 ++0 3 4 0 3 4 0 2 3 0 1 1 0 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 1 1 0 1 1 0 2 3 0 2 3 1 4 5 1 5 6 ++1 7 9 2 9 12 2 12 16 3 15 20 3 18 24 4 22 30 ++5 25 34 6 30 41 6 33 45 7 36 49 8 41 55 8 44 59 ++9 47 64 9 49 66 9 50 69 9 50 69 10 53 71 10 53 71 ++10 54 74 10 53 71 10 53 71 10 53 71 9 50 69 9 50 69 ++167 119 72 193 130 84 193 130 84 193 130 84 167 119 72 167 119 72 ++167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 ++167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 167 119 72 ++167 119 72 193 130 84 193 130 84 167 119 72 15 53 69 10 53 71 ++11 56 77 11 56 77 8 56 78 8 56 78 8 56 78 8 56 78 ++11 58 79 11 56 77 10 54 74 10 53 71 9 50 69 9 47 64 ++8 42 57 7 38 51 6 33 45 6 30 41 5 25 34 3 21 29 ++3 16 22 2 13 18 2 11 15 1 8 11 1 7 9 1 4 5 ++0 3 4 0 1 1 0 2 3 0 1 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 1 1 0 1 1 0 1 1 0 2 3 1 4 5 ++1 5 6 1 7 9 2 10 13 2 12 16 3 15 20 3 18 24 ++4 22 30 5 25 34 6 30 41 6 33 45 7 36 49 8 41 55 ++8 42 57 8 45 61 9 47 64 9 49 66 9 49 66 9 49 66 ++9 49 66 9 50 69 9 49 66 9 49 66 9 47 64 9 47 64 ++69 68 60 193 130 84 167 119 72 167 119 72 167 119 72 167 119 72 ++139 105 59 139 105 59 139 105 59 139 105 59 139 105 59 139 105 59 ++139 105 59 139 105 59 139 105 59 139 105 59 139 105 59 167 119 72 ++167 119 72 167 119 72 193 130 84 69 68 60 8 45 61 9 50 69 ++10 53 71 10 53 71 10 54 74 10 54 74 10 54 74 10 54 74 ++10 54 74 10 53 71 9 50 69 9 49 66 8 45 61 8 42 57 ++7 39 53 6 33 45 6 30 41 5 27 37 4 22 30 4 19 26 ++3 15 20 2 11 15 2 9 12 1 7 9 1 5 6 0 3 4 ++0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 1 0 1 1 0 2 3 0 2 3 0 3 4 ++1 4 5 1 5 6 1 7 9 2 9 12 2 11 15 3 15 20 ++3 18 24 4 22 30 5 25 34 5 28 38 6 33 45 7 36 49 ++7 38 51 6 40 54 8 42 57 8 44 59 8 44 59 8 45 61 ++8 44 59 8 45 61 8 44 59 8 44 59 8 44 59 8 41 55 ++8 42 57 105 82 42 167 119 72 167 119 72 139 105 59 139 105 59 ++139 105 59 139 105 59 105 82 42 105 82 42 105 82 42 105 82 42 ++105 82 42 105 82 42 139 105 59 139 105 59 139 105 59 139 105 59 ++167 119 72 167 119 72 105 82 42 1 37 56 8 42 57 8 44 59 ++8 45 61 9 47 64 9 47 64 9 49 66 9 49 66 9 49 66 ++9 47 64 9 47 64 8 45 61 8 44 59 8 41 55 7 38 51 ++6 33 45 5 29 40 5 27 37 4 23 31 3 18 24 3 15 20 ++2 12 16 2 9 12 1 7 9 1 5 6 0 3 4 0 2 3 ++0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 2 3 ++0 3 4 1 5 6 1 7 9 1 7 9 2 9 12 2 11 15 ++3 15 20 3 18 24 4 20 27 4 23 31 5 25 34 6 30 41 ++6 33 45 7 36 49 7 36 49 7 38 51 7 39 53 7 39 53 ++7 39 53 7 39 53 7 39 53 7 38 51 7 38 51 7 36 49 ++6 33 45 8 41 55 69 68 60 167 119 72 139 105 59 139 105 59 ++105 82 42 105 82 42 105 82 42 105 82 42 105 82 42 105 82 42 ++105 82 42 105 82 42 105 82 42 105 82 42 139 105 59 139 105 59 ++139 105 59 69 68 60 6 33 45 6 30 41 7 36 49 7 36 49 ++7 38 51 8 41 55 8 41 55 8 41 55 8 42 57 8 42 57 ++8 41 55 8 41 55 7 39 53 7 36 49 7 36 49 6 33 45 ++5 29 40 5 25 34 3 21 29 3 18 24 3 15 20 2 12 16 ++2 9 12 1 7 9 1 5 6 0 3 4 0 2 3 0 1 1 ++0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 ++0 2 3 0 3 4 1 4 5 1 5 6 1 7 9 2 9 12 ++2 12 16 3 15 20 3 16 22 4 19 26 4 22 30 5 25 34 ++5 27 37 5 29 40 6 30 41 6 33 45 6 33 45 6 33 45 ++6 33 45 6 33 45 6 30 41 6 30 41 6 30 41 6 30 41 ++5 27 37 5 25 34 5 25 34 28 32 37 105 82 42 105 82 42 ++139 105 59 139 105 59 105 82 42 105 82 42 105 82 42 105 82 42 ++105 82 42 105 82 42 105 82 42 105 82 42 105 82 42 55 54 51 ++28 32 37 4 19 26 4 23 31 5 27 37 5 29 40 6 30 41 ++6 33 45 6 33 45 6 33 45 6 33 45 6 33 45 7 36 49 ++7 36 49 6 33 45 6 33 45 6 30 41 5 29 40 5 25 34 ++4 23 31 4 20 27 3 16 22 3 15 20 2 12 16 2 9 12 ++1 7 9 1 5 6 1 4 5 0 2 3 0 2 3 0 1 1 ++0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 ++0 1 1 0 2 3 0 3 4 1 4 5 1 5 6 1 7 9 ++2 9 12 2 11 15 2 13 18 3 15 20 3 18 24 4 20 27 ++4 22 30 4 24 33 5 25 34 5 25 34 5 27 37 5 27 37 ++5 27 37 5 25 34 5 25 34 5 25 34 4 24 33 4 23 31 ++4 22 30 3 21 29 4 19 26 3 16 22 0 14 27 21 20 20 ++39 37 35 39 37 35 47 44 41 47 44 41 39 37 35 39 37 35 ++39 37 35 47 44 41 39 37 35 29 26 26 2 13 18 2 11 15 ++2 13 18 3 18 24 4 20 27 3 21 29 4 23 31 4 24 33 ++5 25 34 5 27 37 5 27 37 5 28 38 5 28 38 5 28 38 ++5 27 37 5 27 37 5 25 34 5 25 34 4 23 31 3 21 29 ++3 18 24 3 15 20 2 13 18 2 11 15 2 9 12 1 7 9 ++1 5 6 1 4 5 0 3 4 0 2 3 0 1 1 0 1 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 ++0 1 1 0 1 1 0 2 3 0 3 4 0 3 4 1 5 6 ++1 7 9 2 9 12 2 10 13 2 11 15 2 13 18 3 16 22 ++3 16 22 4 19 26 4 19 26 4 20 27 4 20 27 4 19 26 ++4 19 26 4 20 27 4 19 26 4 19 26 3 18 24 3 18 24 ++3 16 22 3 16 22 3 15 20 3 15 20 2 12 16 2 11 15 ++1 8 11 1 7 9 9 8 8 7 7 7 1 5 6 7 7 7 ++1 5 6 1 7 9 7 7 7 1 9 12 2 11 15 2 12 16 ++2 13 18 2 13 18 3 15 20 3 16 22 3 16 22 3 18 24 ++4 19 26 4 20 27 4 20 27 3 21 29 3 21 29 3 21 29 ++3 21 29 3 21 29 4 19 26 4 19 26 3 18 24 3 16 22 ++3 15 20 2 12 16 1 10 14 1 8 11 1 7 9 1 5 6 ++1 4 5 0 3 4 0 2 3 0 1 1 0 1 1 0 0 1 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 1 0 1 1 0 1 1 0 2 3 0 2 3 0 3 4 ++1 4 5 1 7 9 1 7 9 1 8 11 2 10 13 2 11 15 ++2 12 16 2 13 18 2 13 18 3 15 20 3 15 20 3 15 20 ++3 15 20 3 15 20 3 15 20 2 13 18 2 12 16 2 12 16 ++2 12 16 2 12 16 2 11 15 1 10 14 2 10 13 2 9 12 ++1 8 11 1 8 11 1 8 11 1 8 11 1 8 11 1 8 11 ++1 7 9 1 7 9 1 8 11 1 8 11 1 8 11 1 8 11 ++2 9 12 2 9 12 1 10 14 2 11 15 2 11 15 2 12 16 ++2 12 16 2 13 18 2 13 18 3 15 20 3 15 20 3 15 20 ++3 15 20 3 15 20 2 13 18 2 13 18 2 12 16 2 11 15 ++1 10 14 1 8 11 1 7 9 1 7 9 1 5 6 0 3 4 ++0 2 3 0 2 3 0 1 1 0 1 1 0 0 1 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 1 0 1 1 0 1 1 0 1 1 0 3 4 ++0 3 4 1 4 5 1 5 6 1 7 9 1 7 9 1 8 11 ++1 8 11 2 9 12 2 10 13 2 10 13 2 10 13 2 9 12 ++2 10 13 2 10 13 2 9 12 1 8 11 1 8 11 1 8 11 ++1 8 11 1 7 9 1 7 9 1 7 9 1 7 9 1 7 9 ++1 7 9 1 5 6 1 5 6 1 5 6 1 5 6 1 5 6 ++1 5 6 1 5 6 1 5 6 1 5 6 1 5 6 1 7 9 ++1 7 9 1 7 9 1 7 9 1 7 9 1 8 11 1 8 11 ++1 8 11 2 9 12 2 9 12 2 9 12 2 10 13 2 9 12 ++2 10 13 2 10 13 2 10 13 2 9 12 1 8 11 1 8 11 ++1 7 9 1 5 6 1 4 5 1 4 5 0 3 4 0 3 4 ++0 1 1 0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 ++0 1 1 0 2 3 0 3 4 0 3 4 1 4 5 1 4 5 ++1 7 9 1 7 9 1 7 9 1 7 9 1 7 9 1 7 9 ++1 7 9 1 7 9 1 7 9 1 7 9 1 5 6 1 4 5 ++1 5 6 1 5 6 1 5 6 1 4 5 1 4 5 1 4 5 ++1 4 5 1 4 5 0 3 4 0 3 4 0 3 4 0 3 4 ++0 3 4 0 3 4 0 3 4 0 3 4 1 4 5 1 4 5 ++1 4 5 1 4 5 1 4 5 1 4 5 1 5 6 1 4 5 ++1 5 6 1 7 9 1 7 9 1 7 9 1 7 9 1 7 9 ++1 7 9 1 7 9 1 7 9 1 7 9 1 7 9 1 5 6 ++1 4 5 0 3 4 0 3 4 0 2 3 0 2 3 0 1 1 ++0 1 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ++0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c +index f363fbeb5ab0..e09edb5c5e06 100644 +--- a/drivers/virtio/virtio_mmio.c ++++ b/drivers/virtio/virtio_mmio.c +@@ -463,9 +463,14 @@ static int vm_find_vqs(struct virtio_device *vdev, unsigned nvqs, + struct irq_affinity *desc) + { + struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vdev); +- unsigned int irq = platform_get_irq(vm_dev->pdev, 0); ++ int irq = platform_get_irq(vm_dev->pdev, 0); + int i, err, queue_idx = 0; + ++ if (irq < 0) { ++ dev_err(&vdev->dev, "Cannot get IRQ resource\n"); ++ return irq; ++ } ++ + err = request_irq(irq, vm_interrupt, IRQF_SHARED, + dev_name(&vdev->dev), vm_dev); + if (err) +diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c +index d37dd5bb7a8f..559768dc2567 100644 +--- a/drivers/xen/balloon.c ++++ b/drivers/xen/balloon.c +@@ -538,8 +538,15 @@ static void balloon_process(struct work_struct *work) + state = reserve_additional_memory(); + } + +- if (credit < 0) +- state = decrease_reservation(-credit, GFP_BALLOON); ++ if (credit < 0) { ++ long n_pages; ++ ++ n_pages = min(-credit, si_mem_available()); ++ state = decrease_reservation(n_pages, GFP_BALLOON); ++ if (state == BP_DONE && n_pages != -credit && ++ n_pages < totalreserve_pages) ++ state = BP_EAGAIN; ++ } + + state = update_schedule(state); + +@@ -578,6 +585,9 @@ static int add_ballooned_pages(int nr_pages) + } + } + ++ if (si_mem_available() < nr_pages) ++ return -ENOMEM; ++ + st = decrease_reservation(nr_pages, GFP_USER); + if (st != BP_DONE) + return -ENOMEM; +@@ -710,7 +720,7 @@ static int __init balloon_init(void) + balloon_stats.schedule_delay = 1; + balloon_stats.max_schedule_delay = 32; + balloon_stats.retry_count = 1; +- balloon_stats.max_retry_count = RETRY_UNLIMITED; ++ balloon_stats.max_retry_count = 4; + + #ifdef CONFIG_XEN_BALLOON_MEMORY_HOTPLUG + set_online_page_callback(&xen_online_page); +diff --git a/drivers/xen/events/events_base.c b/drivers/xen/events/events_base.c +index ff9b51055b14..2e8570c09789 100644 +--- a/drivers/xen/events/events_base.c ++++ b/drivers/xen/events/events_base.c +@@ -1294,7 +1294,7 @@ void rebind_evtchn_irq(int evtchn, int irq) + } + + /* Rebind an evtchn so that it gets delivered to a specific cpu */ +-int xen_rebind_evtchn_to_cpu(int evtchn, unsigned tcpu) ++static int xen_rebind_evtchn_to_cpu(int evtchn, unsigned int tcpu) + { + struct evtchn_bind_vcpu bind_vcpu; + int masked; +@@ -1328,7 +1328,6 @@ int xen_rebind_evtchn_to_cpu(int evtchn, unsigned tcpu) + + return 0; + } +-EXPORT_SYMBOL_GPL(xen_rebind_evtchn_to_cpu); + + static int set_affinity_irq(struct irq_data *data, const struct cpumask *dest, + bool force) +@@ -1342,6 +1341,15 @@ static int set_affinity_irq(struct irq_data *data, const struct cpumask *dest, + return ret; + } + ++/* To be called with desc->lock held. */ ++int xen_set_affinity_evtchn(struct irq_desc *desc, unsigned int tcpu) ++{ ++ struct irq_data *d = irq_desc_get_irq_data(desc); ++ ++ return set_affinity_irq(d, cpumask_of(tcpu), false); ++} ++EXPORT_SYMBOL_GPL(xen_set_affinity_evtchn); ++ + static void enable_dynirq(struct irq_data *data) + { + int evtchn = evtchn_from_irq(data->irq); +diff --git a/drivers/xen/evtchn.c b/drivers/xen/evtchn.c +index f341b016672f..052b55a14ebc 100644 +--- a/drivers/xen/evtchn.c ++++ b/drivers/xen/evtchn.c +@@ -447,7 +447,7 @@ static void evtchn_bind_interdom_next_vcpu(int evtchn) + this_cpu_write(bind_last_selected_cpu, selected_cpu); + + /* unmask expects irqs to be disabled */ +- xen_rebind_evtchn_to_cpu(evtchn, selected_cpu); ++ xen_set_affinity_evtchn(desc, selected_cpu); + raw_spin_unlock_irqrestore(&desc->lock, flags); + } + +diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c +index 469dfbd6cf90..dd4d5dea9a54 100644 +--- a/drivers/xen/gntdev.c ++++ b/drivers/xen/gntdev.c +@@ -1145,7 +1145,7 @@ static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma) + goto out_put_map; + + if (!use_ptemod) { +- err = vm_map_pages(vma, map->pages, map->count); ++ err = vm_map_pages_zero(vma, map->pages, map->count); + if (err) + goto out_put_map; + } else { +diff --git a/drivers/xen/swiotlb-xen.c b/drivers/xen/swiotlb-xen.c +index d53f3493a6b9..c416d31cb545 100644 +--- a/drivers/xen/swiotlb-xen.c ++++ b/drivers/xen/swiotlb-xen.c +@@ -361,8 +361,8 @@ xen_swiotlb_free_coherent(struct device *hwdev, size_t size, void *vaddr, + /* Convert the size to actually allocated. */ + size = 1UL << (order + XEN_PAGE_SHIFT); + +- if (((dev_addr + size - 1 <= dma_mask)) || +- range_straddles_page_boundary(phys, size)) ++ if (!WARN_ON((dev_addr + size - 1 > dma_mask) || ++ range_straddles_page_boundary(phys, size))) + xen_destroy_contiguous_region(phys, order); + + xen_free_coherent_pages(hwdev, size, vaddr, (dma_addr_t)phys, attrs); +@@ -402,7 +402,7 @@ static dma_addr_t xen_swiotlb_map_page(struct device *dev, struct page *page, + + map = swiotlb_tbl_map_single(dev, start_dma_addr, phys, size, dir, + attrs); +- if (map == DMA_MAPPING_ERROR) ++ if (map == (phys_addr_t)DMA_MAPPING_ERROR) + return DMA_MAPPING_ERROR; + + dev_addr = xen_phys_to_bus(map); +diff --git a/fs/9p/vfs_addr.c b/fs/9p/vfs_addr.c +index bc57ae9e2963..cce9ace651a2 100644 +--- a/fs/9p/vfs_addr.c ++++ b/fs/9p/vfs_addr.c +@@ -35,8 +35,9 @@ + * @page: structure to page + * + */ +-static int v9fs_fid_readpage(struct p9_fid *fid, struct page *page) ++static int v9fs_fid_readpage(void *data, struct page *page) + { ++ struct p9_fid *fid = data; + struct inode *inode = page->mapping->host; + struct bio_vec bvec = {.bv_page = page, .bv_len = PAGE_SIZE}; + struct iov_iter to; +@@ -107,7 +108,8 @@ static int v9fs_vfs_readpages(struct file *filp, struct address_space *mapping, + if (ret == 0) + return ret; + +- ret = read_cache_pages(mapping, pages, (void *)v9fs_vfs_readpage, filp); ++ ret = read_cache_pages(mapping, pages, v9fs_fid_readpage, ++ filp->private_data); + p9_debug(P9_DEBUG_VFS, " = %d\n", ret); + return ret; + } +diff --git a/fs/adfs/super.c b/fs/adfs/super.c +index ffb669f9bba7..ce0fbbe002bf 100644 +--- a/fs/adfs/super.c ++++ b/fs/adfs/super.c +@@ -360,6 +360,7 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) + struct buffer_head *bh; + struct object_info root_obj; + unsigned char *b_data; ++ unsigned int blocksize; + struct adfs_sb_info *asb; + struct inode *root; + int ret = -EINVAL; +@@ -411,8 +412,10 @@ static int adfs_fill_super(struct super_block *sb, void *data, int silent) + goto error_free_bh; + } + ++ blocksize = 1 << dr->log2secsize; + brelse(bh); +- if (sb_set_blocksize(sb, 1 << dr->log2secsize)) { ++ ++ if (sb_set_blocksize(sb, blocksize)) { + bh = sb_bread(sb, ADFS_DISCRECORD / sb->s_blocksize); + if (!bh) { + adfs_error(sb, "couldn't read superblock on " +diff --git a/fs/block_dev.c b/fs/block_dev.c +index 749f5984425d..a9e7c1b69437 100644 +--- a/fs/block_dev.c ++++ b/fs/block_dev.c +@@ -1151,8 +1151,7 @@ static struct gendisk *bdev_get_gendisk(struct block_device *bdev, int *partno) + * Pointer to the block device containing @bdev on success, ERR_PTR() + * value on failure. + */ +-static struct block_device *bd_start_claiming(struct block_device *bdev, +- void *holder) ++struct block_device *bd_start_claiming(struct block_device *bdev, void *holder) + { + struct gendisk *disk; + struct block_device *whole; +@@ -1199,6 +1198,62 @@ static struct block_device *bd_start_claiming(struct block_device *bdev, + return ERR_PTR(err); + } + } ++EXPORT_SYMBOL(bd_start_claiming); ++ ++static void bd_clear_claiming(struct block_device *whole, void *holder) ++{ ++ lockdep_assert_held(&bdev_lock); ++ /* tell others that we're done */ ++ BUG_ON(whole->bd_claiming != holder); ++ whole->bd_claiming = NULL; ++ wake_up_bit(&whole->bd_claiming, 0); ++} ++ ++/** ++ * bd_finish_claiming - finish claiming of a block device ++ * @bdev: block device of interest ++ * @whole: whole block device (returned from bd_start_claiming()) ++ * @holder: holder that has claimed @bdev ++ * ++ * Finish exclusive open of a block device. Mark the device as exlusively ++ * open by the holder and wake up all waiters for exclusive open to finish. ++ */ ++void bd_finish_claiming(struct block_device *bdev, struct block_device *whole, ++ void *holder) ++{ ++ spin_lock(&bdev_lock); ++ BUG_ON(!bd_may_claim(bdev, whole, holder)); ++ /* ++ * Note that for a whole device bd_holders will be incremented twice, ++ * and bd_holder will be set to bd_may_claim before being set to holder ++ */ ++ whole->bd_holders++; ++ whole->bd_holder = bd_may_claim; ++ bdev->bd_holders++; ++ bdev->bd_holder = holder; ++ bd_clear_claiming(whole, holder); ++ spin_unlock(&bdev_lock); ++} ++EXPORT_SYMBOL(bd_finish_claiming); ++ ++/** ++ * bd_abort_claiming - abort claiming of a block device ++ * @bdev: block device of interest ++ * @whole: whole block device (returned from bd_start_claiming()) ++ * @holder: holder that has claimed @bdev ++ * ++ * Abort claiming of a block device when the exclusive open failed. This can be ++ * also used when exclusive open is not actually desired and we just needed ++ * to block other exclusive openers for a while. ++ */ ++void bd_abort_claiming(struct block_device *bdev, struct block_device *whole, ++ void *holder) ++{ ++ spin_lock(&bdev_lock); ++ bd_clear_claiming(whole, holder); ++ spin_unlock(&bdev_lock); ++} ++EXPORT_SYMBOL(bd_abort_claiming); + + #ifdef CONFIG_SYSFS + struct bd_holder_disk { +@@ -1668,29 +1723,10 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder) + + /* finish claiming */ + mutex_lock(&bdev->bd_mutex); +- spin_lock(&bdev_lock); +- +- if (!res) { +- BUG_ON(!bd_may_claim(bdev, whole, holder)); +- /* +- * Note that for a whole device bd_holders +- * will be incremented twice, and bd_holder +- * will be set to bd_may_claim before being +- * set to holder +- */ +- whole->bd_holders++; +- whole->bd_holder = bd_may_claim; +- bdev->bd_holders++; +- bdev->bd_holder = holder; +- } +- +- /* tell others that we're done */ +- BUG_ON(whole->bd_claiming != holder); +- whole->bd_claiming = NULL; +- wake_up_bit(&whole->bd_claiming, 0); +- +- spin_unlock(&bdev_lock); +- ++ if (!res) ++ bd_finish_claiming(bdev, whole, holder); ++ else ++ bd_abort_claiming(bdev, whole, holder); + /* + * Block event polling for write claims if requested. Any + * write holder makes the write_holder state stick until +diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c +index 84dd4a8980c5..75efb843b7b5 100644 +--- a/fs/btrfs/compression.c ++++ b/fs/btrfs/compression.c +@@ -42,6 +42,22 @@ const char* btrfs_compress_type2str(enum btrfs_compression_type type) + return NULL; + } + ++bool btrfs_compress_is_valid_type(const char *str, size_t len) ++{ ++ int i; ++ ++ for (i = 1; i < ARRAY_SIZE(btrfs_compress_types); i++) { ++ size_t comp_len = strlen(btrfs_compress_types[i]); ++ ++ if (len < comp_len) ++ continue; ++ ++ if (!strncmp(btrfs_compress_types[i], str, comp_len)) ++ return true; ++ } ++ return false; ++} ++ + static int btrfs_decompress_bio(struct compressed_bio *cb); + + static inline int compressed_bio_size(struct btrfs_fs_info *fs_info, +diff --git a/fs/btrfs/compression.h b/fs/btrfs/compression.h +index 9976fe0f7526..b61879485e60 100644 +--- a/fs/btrfs/compression.h ++++ b/fs/btrfs/compression.h +@@ -173,6 +173,7 @@ extern const struct btrfs_compress_op btrfs_lzo_compress; + extern const struct btrfs_compress_op btrfs_zstd_compress; + + const char* btrfs_compress_type2str(enum btrfs_compression_type type); ++bool btrfs_compress_is_valid_type(const char *str, size_t len); + + int btrfs_compress_heuristic(struct inode *inode, u64 start, u64 end); + +diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c +index 5faf057f6f37..808a5c7cf01d 100644 +--- a/fs/btrfs/extent-tree.c ++++ b/fs/btrfs/extent-tree.c +@@ -6056,7 +6056,7 @@ int btrfs_delalloc_reserve_metadata(struct btrfs_inode *inode, u64 num_bytes) + flush = BTRFS_RESERVE_FLUSH_LIMIT; + + if (btrfs_transaction_in_commit(fs_info)) +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + } + + if (delalloc_lock) +diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c +index 89f5be2bfb43..1c7533db16b0 100644 +--- a/fs/btrfs/file.c ++++ b/fs/btrfs/file.c +@@ -2721,6 +2721,11 @@ static int btrfs_punch_hole(struct inode *inode, loff_t offset, loff_t len) + * for detecting, at fsync time, if the inode isn't yet in the + * log tree or it's there but not up to date. + */ ++ struct timespec64 now = current_time(inode); ++ ++ inode_inc_iversion(inode); ++ inode->i_mtime = now; ++ inode->i_ctime = now; + trans = btrfs_start_transaction(root, 1); + if (IS_ERR(trans)) { + err = PTR_ERR(trans); +diff --git a/fs/btrfs/inode-map.c b/fs/btrfs/inode-map.c +index ffca2abf13d0..89b2a7f7397e 100644 +--- a/fs/btrfs/inode-map.c ++++ b/fs/btrfs/inode-map.c +@@ -75,7 +75,7 @@ static int caching_kthread(void *data) + btrfs_release_path(path); + root->ino_cache_progress = last; + up_read(&fs_info->commit_root_sem); +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + goto again; + } else + continue; +diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c +index a2aabdb85226..8c9c7d76c900 100644 +--- a/fs/btrfs/inode.c ++++ b/fs/btrfs/inode.c +@@ -394,10 +394,31 @@ static noinline int add_async_extent(struct async_chunk *cow, + return 0; + } + ++/* ++ * Check if the inode has flags compatible with compression ++ */ ++static inline bool inode_can_compress(struct inode *inode) ++{ ++ if (BTRFS_I(inode)->flags & BTRFS_INODE_NODATACOW || ++ BTRFS_I(inode)->flags & BTRFS_INODE_NODATASUM) ++ return false; ++ return true; ++} ++ ++/* ++ * Check if the inode needs to be submitted to compression, based on mount ++ * options, defragmentation, properties or heuristics. ++ */ + static inline int inode_need_compress(struct inode *inode, u64 start, u64 end) + { + struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); + ++ if (!inode_can_compress(inode)) { ++ WARN(IS_ENABLED(CONFIG_BTRFS_DEBUG), ++ KERN_ERR "BTRFS: unexpected compression for ino %llu\n", ++ btrfs_ino(BTRFS_I(inode))); ++ return 0; ++ } + /* force compress */ + if (btrfs_test_opt(fs_info, FORCE_COMPRESS)) + return 1; +@@ -1630,7 +1651,8 @@ int btrfs_run_delalloc_range(struct inode *inode, struct page *locked_page, + } else if (BTRFS_I(inode)->flags & BTRFS_INODE_PREALLOC && !force_cow) { + ret = run_delalloc_nocow(inode, locked_page, start, end, + page_started, 0, nr_written); +- } else if (!inode_need_compress(inode, start, end)) { ++ } else if (!inode_can_compress(inode) || ++ !inode_need_compress(inode, start, end)) { + ret = cow_file_range(inode, locked_page, start, end, end, + page_started, nr_written, 1, NULL); + } else { +diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c +index 2a1be0d1a698..5b4beebf138c 100644 +--- a/fs/btrfs/ioctl.c ++++ b/fs/btrfs/ioctl.c +@@ -3999,6 +3999,27 @@ static int btrfs_remap_file_range_prep(struct file *file_in, loff_t pos_in, + if (!same_inode) + inode_dio_wait(inode_out); + ++ /* ++ * Workaround to make sure NOCOW buffered write reach disk as NOCOW. ++ * ++ * Btrfs' back references do not have a block level granularity, they ++ * work at the whole extent level. ++ * NOCOW buffered write without data space reserved may not be able ++ * to fall back to CoW due to lack of data space, thus could cause ++ * data loss. ++ * ++ * Here we take a shortcut by flushing the whole inode, so that all ++ * nocow write should reach disk as nocow before we increase the ++ * reference of the extent. We could do better by only flushing NOCOW ++ * data, but that needs extra accounting. ++ * ++ * Also we don't need to check ASYNC_EXTENT, as async extent will be ++ * CoWed anyway, not affecting nocow part. ++ */ ++ ret = filemap_flush(inode_in->i_mapping); ++ if (ret < 0) ++ return ret; ++ + ret = btrfs_wait_ordered_range(inode_in, ALIGN_DOWN(pos_in, bs), + wb_len); + if (ret < 0) +diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c +index a9e2e66152ee..e0469816c678 100644 +--- a/fs/btrfs/props.c ++++ b/fs/btrfs/props.c +@@ -257,11 +257,7 @@ static int prop_compression_validate(const char *value, size_t len) + if (!value) + return 0; + +- if (!strncmp("lzo", value, 3)) +- return 0; +- else if (!strncmp("zlib", value, 4)) +- return 0; +- else if (!strncmp("zstd", value, 4)) ++ if (btrfs_compress_is_valid_type(value, len)) + return 0; + + return -EINVAL; +@@ -341,7 +337,7 @@ static int inherit_props(struct btrfs_trans_handle *trans, + for (i = 0; i < ARRAY_SIZE(prop_handlers); i++) { + const struct prop_handler *h = &prop_handlers[i]; + const char *value; +- u64 num_bytes; ++ u64 num_bytes = 0; + + if (!h->inheritable) + continue; +diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c +index 3e6ffbbd8b0a..f8a3c1b0a15a 100644 +--- a/fs/btrfs/qgroup.c ++++ b/fs/btrfs/qgroup.c +@@ -2614,6 +2614,7 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, u64 srcid, + int ret = 0; + int i; + u64 *i_qgroups; ++ bool committing = false; + struct btrfs_fs_info *fs_info = trans->fs_info; + struct btrfs_root *quota_root; + struct btrfs_qgroup *srcgroup; +@@ -2621,7 +2622,25 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, u64 srcid, + u32 level_size = 0; + u64 nums; + +- mutex_lock(&fs_info->qgroup_ioctl_lock); ++ /* ++ * There are only two callers of this function. ++ * ++ * One in create_subvol() in the ioctl context, which needs to hold ++ * the qgroup_ioctl_lock. ++ * ++ * The other one in create_pending_snapshot() where no other qgroup ++ * code can modify the fs as they all need to either start a new trans ++ * or hold a trans handler, thus we don't need to hold ++ * qgroup_ioctl_lock. ++ * This would avoid long and complex lock chain and make lockdep happy. ++ */ ++ spin_lock(&fs_info->trans_lock); ++ if (trans->transaction->state == TRANS_STATE_COMMIT_DOING) ++ committing = true; ++ spin_unlock(&fs_info->trans_lock); ++ ++ if (!committing) ++ mutex_lock(&fs_info->qgroup_ioctl_lock); + if (!test_bit(BTRFS_FS_QUOTA_ENABLED, &fs_info->flags)) + goto out; + +@@ -2785,7 +2804,8 @@ int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, u64 srcid, + unlock: + spin_unlock(&fs_info->qgroup_lock); + out: +- mutex_unlock(&fs_info->qgroup_ioctl_lock); ++ if (!committing) ++ mutex_unlock(&fs_info->qgroup_ioctl_lock); + return ret; + } + +diff --git a/fs/btrfs/send.c b/fs/btrfs/send.c +index f7fe4770f0e5..d25271381c56 100644 +--- a/fs/btrfs/send.c ++++ b/fs/btrfs/send.c +@@ -6322,68 +6322,21 @@ static int changed_extent(struct send_ctx *sctx, + { + int ret = 0; + +- if (sctx->cur_ino != sctx->cmp_key->objectid) { +- +- if (result == BTRFS_COMPARE_TREE_CHANGED) { +- struct extent_buffer *leaf_l; +- struct extent_buffer *leaf_r; +- struct btrfs_file_extent_item *ei_l; +- struct btrfs_file_extent_item *ei_r; +- +- leaf_l = sctx->left_path->nodes[0]; +- leaf_r = sctx->right_path->nodes[0]; +- ei_l = btrfs_item_ptr(leaf_l, +- sctx->left_path->slots[0], +- struct btrfs_file_extent_item); +- ei_r = btrfs_item_ptr(leaf_r, +- sctx->right_path->slots[0], +- struct btrfs_file_extent_item); +- +- /* +- * We may have found an extent item that has changed +- * only its disk_bytenr field and the corresponding +- * inode item was not updated. This case happens due to +- * very specific timings during relocation when a leaf +- * that contains file extent items is COWed while +- * relocation is ongoing and its in the stage where it +- * updates data pointers. So when this happens we can +- * safely ignore it since we know it's the same extent, +- * but just at different logical and physical locations +- * (when an extent is fully replaced with a new one, we +- * know the generation number must have changed too, +- * since snapshot creation implies committing the current +- * transaction, and the inode item must have been updated +- * as well). +- * This replacement of the disk_bytenr happens at +- * relocation.c:replace_file_extents() through +- * relocation.c:btrfs_reloc_cow_block(). +- */ +- if (btrfs_file_extent_generation(leaf_l, ei_l) == +- btrfs_file_extent_generation(leaf_r, ei_r) && +- btrfs_file_extent_ram_bytes(leaf_l, ei_l) == +- btrfs_file_extent_ram_bytes(leaf_r, ei_r) && +- btrfs_file_extent_compression(leaf_l, ei_l) == +- btrfs_file_extent_compression(leaf_r, ei_r) && +- btrfs_file_extent_encryption(leaf_l, ei_l) == +- btrfs_file_extent_encryption(leaf_r, ei_r) && +- btrfs_file_extent_other_encoding(leaf_l, ei_l) == +- btrfs_file_extent_other_encoding(leaf_r, ei_r) && +- btrfs_file_extent_type(leaf_l, ei_l) == +- btrfs_file_extent_type(leaf_r, ei_r) && +- btrfs_file_extent_disk_bytenr(leaf_l, ei_l) != +- btrfs_file_extent_disk_bytenr(leaf_r, ei_r) && +- btrfs_file_extent_disk_num_bytes(leaf_l, ei_l) == +- btrfs_file_extent_disk_num_bytes(leaf_r, ei_r) && +- btrfs_file_extent_offset(leaf_l, ei_l) == +- btrfs_file_extent_offset(leaf_r, ei_r) && +- btrfs_file_extent_num_bytes(leaf_l, ei_l) == +- btrfs_file_extent_num_bytes(leaf_r, ei_r)) +- return 0; +- } +- +- inconsistent_snapshot_error(sctx, result, "extent"); +- return -EIO; +- } ++ /* ++ * We have found an extent item that changed without the inode item ++ * having changed. This can happen either after relocation (where the ++ * disk_bytenr of an extent item is replaced at ++ * relocation.c:replace_file_extents()) or after deduplication into a ++ * file in both the parent and send snapshots (where an extent item can ++ * get modified or replaced with a new one). Note that deduplication ++ * updates the inode item, but it only changes the iversion (sequence ++ * field in the inode item) of the inode, so if a file is deduplicated ++ * the same amount of times in both the parent and send snapshots, its ++ * iversion becames the same in both snapshots, whence the inode item is ++ * the same on both snapshots. ++ */ ++ if (sctx->cur_ino != sctx->cmp_key->objectid) ++ return 0; + + if (!sctx->cur_inode_new_gen && !sctx->cur_inode_deleted) { + if (result != BTRFS_COMPARE_TREE_DELETED) +diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c +index 3f6811cdf803..1aa3f6d6d775 100644 +--- a/fs/btrfs/transaction.c ++++ b/fs/btrfs/transaction.c +@@ -2019,6 +2019,16 @@ int btrfs_commit_transaction(struct btrfs_trans_handle *trans) + } + } else { + spin_unlock(&fs_info->trans_lock); ++ /* ++ * The previous transaction was aborted and was already removed ++ * from the list of transactions at fs_info->trans_list. So we ++ * abort to prevent writing a new superblock that reflects a ++ * corrupt state (pointing to trees with unwritten nodes/leafs). ++ */ ++ if (test_bit(BTRFS_FS_STATE_TRANS_ABORTED, &fs_info->fs_state)) { ++ ret = -EROFS; ++ goto cleanup_transaction; ++ } + } + + extwriter_counter_dec(cur_trans, trans->type); +diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c +index 96fce4bef4e7..ccd5706199d7 100644 +--- a/fs/btrfs/tree-checker.c ++++ b/fs/btrfs/tree-checker.c +@@ -132,6 +132,7 @@ static int check_extent_data_item(struct extent_buffer *leaf, + struct btrfs_file_extent_item *fi; + u32 sectorsize = fs_info->sectorsize; + u32 item_size = btrfs_item_size_nr(leaf, slot); ++ u64 extent_end; + + if (!IS_ALIGNED(key->offset, sectorsize)) { + file_extent_err(leaf, slot, +@@ -207,6 +208,16 @@ static int check_extent_data_item(struct extent_buffer *leaf, + CHECK_FE_ALIGNED(leaf, slot, fi, num_bytes, sectorsize)) + return -EUCLEAN; + ++ /* Catch extent end overflow */ ++ if (check_add_overflow(btrfs_file_extent_num_bytes(leaf, fi), ++ key->offset, &extent_end)) { ++ file_extent_err(leaf, slot, ++ "extent end overflow, have file offset %llu extent num bytes %llu", ++ key->offset, ++ btrfs_file_extent_num_bytes(leaf, fi)); ++ return -EUCLEAN; ++ } ++ + /* + * Check that no two consecutive file extent items, in the same leaf, + * present ranges that overlap each other. +diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c +index 3fc8d854d7fb..6c8297bcfeb7 100644 +--- a/fs/btrfs/tree-log.c ++++ b/fs/btrfs/tree-log.c +@@ -3322,6 +3322,30 @@ int btrfs_free_log_root_tree(struct btrfs_trans_handle *trans, + return 0; + } + ++/* ++ * Check if an inode was logged in the current transaction. We can't always rely ++ * on an inode's logged_trans value, because it's an in-memory only field and ++ * therefore not persisted. This means that its value is lost if the inode gets ++ * evicted and loaded again from disk (in which case it has a value of 0, and ++ * certainly it is smaller then any possible transaction ID), when that happens ++ * the full_sync flag is set in the inode's runtime flags, so on that case we ++ * assume eviction happened and ignore the logged_trans value, assuming the ++ * worst case, that the inode was logged before in the current transaction. ++ */ ++static bool inode_logged(struct btrfs_trans_handle *trans, ++ struct btrfs_inode *inode) ++{ ++ if (inode->logged_trans == trans->transid) ++ return true; ++ ++ if (inode->last_trans == trans->transid && ++ test_bit(BTRFS_INODE_NEEDS_FULL_SYNC, &inode->runtime_flags) && ++ !test_bit(BTRFS_FS_LOG_RECOVERING, &trans->fs_info->flags)) ++ return true; ++ ++ return false; ++} ++ + /* + * If both a file and directory are logged, and unlinks or renames are + * mixed in, we have a few interesting corners: +@@ -3356,7 +3380,7 @@ int btrfs_del_dir_entries_in_log(struct btrfs_trans_handle *trans, + int bytes_del = 0; + u64 dir_ino = btrfs_ino(dir); + +- if (dir->logged_trans < trans->transid) ++ if (!inode_logged(trans, dir)) + return 0; + + ret = join_running_log_trans(root); +@@ -3460,7 +3484,7 @@ int btrfs_del_inode_ref_in_log(struct btrfs_trans_handle *trans, + u64 index; + int ret; + +- if (inode->logged_trans < trans->transid) ++ if (!inode_logged(trans, inode)) + return 0; + + ret = join_running_log_trans(root); +@@ -5420,9 +5444,19 @@ static int btrfs_log_inode(struct btrfs_trans_handle *trans, + } + } + ++ /* ++ * Don't update last_log_commit if we logged that an inode exists after ++ * it was loaded to memory (full_sync bit set). ++ * This is to prevent data loss when we do a write to the inode, then ++ * the inode gets evicted after all delalloc was flushed, then we log ++ * it exists (due to a rename for example) and then fsync it. This last ++ * fsync would do nothing (not logging the extents previously written). ++ */ + spin_lock(&inode->lock); + inode->logged_trans = trans->transid; +- inode->last_log_commit = inode->last_sub_trans; ++ if (inode_only != LOG_INODE_EXISTS || ++ !test_bit(BTRFS_INODE_NEEDS_FULL_SYNC, &inode->runtime_flags)) ++ inode->last_log_commit = inode->last_sub_trans; + spin_unlock(&inode->lock); + out_unlock: + mutex_unlock(&inode->log_mutex); +diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c +index 1c2a6e4b39da..8508f6028c8d 100644 +--- a/fs/btrfs/volumes.c ++++ b/fs/btrfs/volumes.c +@@ -5328,8 +5328,7 @@ static inline int btrfs_chunk_max_errors(struct map_lookup *map) + + if (map->type & (BTRFS_BLOCK_GROUP_RAID1 | + BTRFS_BLOCK_GROUP_RAID10 | +- BTRFS_BLOCK_GROUP_RAID5 | +- BTRFS_BLOCK_GROUP_DUP)) { ++ BTRFS_BLOCK_GROUP_RAID5)) { + max_errors = 1; + } else if (map->type & BTRFS_BLOCK_GROUP_RAID6) { + max_errors = 2; +diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c +index 0176241eaea7..7754d7679122 100644 +--- a/fs/ceph/caps.c ++++ b/fs/ceph/caps.c +@@ -1263,20 +1263,22 @@ static int send_cap_msg(struct cap_msg_args *arg) + } + + /* +- * Queue cap releases when an inode is dropped from our cache. Since +- * inode is about to be destroyed, there is no need for i_ceph_lock. ++ * Queue cap releases when an inode is dropped from our cache. + */ +-void __ceph_remove_caps(struct inode *inode) ++void __ceph_remove_caps(struct ceph_inode_info *ci) + { +- struct ceph_inode_info *ci = ceph_inode(inode); + struct rb_node *p; + ++ /* lock i_ceph_lock, because ceph_d_revalidate(..., LOOKUP_RCU) ++ * may call __ceph_caps_issued_mask() on a freeing inode. */ ++ spin_lock(&ci->i_ceph_lock); + p = rb_first(&ci->i_caps); + while (p) { + struct ceph_cap *cap = rb_entry(p, struct ceph_cap, ci_node); + p = rb_next(p); + __ceph_remove_cap(cap, true); + } ++ spin_unlock(&ci->i_ceph_lock); + } + + /* +diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c +index 0637149fb9f9..1271024a3797 100644 +--- a/fs/ceph/dir.c ++++ b/fs/ceph/dir.c +@@ -1512,18 +1512,26 @@ static int __dir_lease_try_check(const struct dentry *dentry) + static int dir_lease_is_valid(struct inode *dir, struct dentry *dentry) + { + struct ceph_inode_info *ci = ceph_inode(dir); +- struct ceph_dentry_info *di = ceph_dentry(dentry); +- int valid = 0; ++ int valid; ++ int shared_gen; + + spin_lock(&ci->i_ceph_lock); +- if (atomic_read(&ci->i_shared_gen) == di->lease_shared_gen) +- valid = __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1); ++ valid = __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1); ++ shared_gen = atomic_read(&ci->i_shared_gen); + spin_unlock(&ci->i_ceph_lock); +- if (valid) +- __ceph_dentry_dir_lease_touch(di); +- dout("dir_lease_is_valid dir %p v%u dentry %p v%u = %d\n", +- dir, (unsigned)atomic_read(&ci->i_shared_gen), +- dentry, (unsigned)di->lease_shared_gen, valid); ++ if (valid) { ++ struct ceph_dentry_info *di; ++ spin_lock(&dentry->d_lock); ++ di = ceph_dentry(dentry); ++ if (dir == d_inode(dentry->d_parent) && ++ di && di->lease_shared_gen == shared_gen) ++ __ceph_dentry_dir_lease_touch(di); ++ else ++ valid = 0; ++ spin_unlock(&dentry->d_lock); ++ } ++ dout("dir_lease_is_valid dir %p v%u dentry %p = %d\n", ++ dir, (unsigned)atomic_read(&ci->i_shared_gen), dentry, valid); + return valid; + } + +diff --git a/fs/ceph/file.c b/fs/ceph/file.c +index 183c37c0a8fc..7a57db8e2fa9 100644 +--- a/fs/ceph/file.c ++++ b/fs/ceph/file.c +@@ -1007,7 +1007,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter, + * may block. + */ + truncate_inode_pages_range(inode->i_mapping, pos, +- (pos+len) | (PAGE_SIZE - 1)); ++ PAGE_ALIGN(pos + len) - 1); + + req->r_mtime = mtime; + } +diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c +index 761451f36e2d..3c7a32779574 100644 +--- a/fs/ceph/inode.c ++++ b/fs/ceph/inode.c +@@ -523,17 +523,20 @@ void ceph_free_inode(struct inode *inode) + kmem_cache_free(ceph_inode_cachep, ci); + } + +-void ceph_destroy_inode(struct inode *inode) ++void ceph_evict_inode(struct inode *inode) + { + struct ceph_inode_info *ci = ceph_inode(inode); + struct ceph_inode_frag *frag; + struct rb_node *n; + +- dout("destroy_inode %p ino %llx.%llx\n", inode, ceph_vinop(inode)); ++ dout("evict_inode %p ino %llx.%llx\n", inode, ceph_vinop(inode)); ++ ++ truncate_inode_pages_final(&inode->i_data); ++ clear_inode(inode); + + ceph_fscache_unregister_inode_cookie(ci); + +- __ceph_remove_caps(inode); ++ __ceph_remove_caps(ci); + + if (__ceph_has_any_quota(ci)) + ceph_adjust_quota_realms_count(inode, false); +diff --git a/fs/ceph/super.c b/fs/ceph/super.c +index d57fa60dcd43..74ca5970397f 100644 +--- a/fs/ceph/super.c ++++ b/fs/ceph/super.c +@@ -840,10 +840,10 @@ static int ceph_remount(struct super_block *sb, int *flags, char *data) + + static const struct super_operations ceph_super_ops = { + .alloc_inode = ceph_alloc_inode, +- .destroy_inode = ceph_destroy_inode, + .free_inode = ceph_free_inode, + .write_inode = ceph_write_inode, + .drop_inode = ceph_drop_inode, ++ .evict_inode = ceph_evict_inode, + .sync_fs = ceph_sync_fs, + .put_super = ceph_put_super, + .remount_fs = ceph_remount, +diff --git a/fs/ceph/super.h b/fs/ceph/super.h +index 5f27e1f7f2d6..1d313d0536f9 100644 +--- a/fs/ceph/super.h ++++ b/fs/ceph/super.h +@@ -544,7 +544,12 @@ static inline void __ceph_dir_set_complete(struct ceph_inode_info *ci, + long long release_count, + long long ordered_count) + { +- smp_mb__before_atomic(); ++ /* ++ * Makes sure operations that setup readdir cache (update page ++ * cache and i_size) are strongly ordered w.r.t. the following ++ * atomic64_set() operations. ++ */ ++ smp_mb(); + atomic64_set(&ci->i_complete_seq[0], release_count); + atomic64_set(&ci->i_complete_seq[1], ordered_count); + } +@@ -876,7 +881,7 @@ static inline bool __ceph_have_pending_cap_snap(struct ceph_inode_info *ci) + extern const struct inode_operations ceph_file_iops; + + extern struct inode *ceph_alloc_inode(struct super_block *sb); +-extern void ceph_destroy_inode(struct inode *inode); ++extern void ceph_evict_inode(struct inode *inode); + extern void ceph_free_inode(struct inode *inode); + extern int ceph_drop_inode(struct inode *inode); + +@@ -1000,7 +1005,7 @@ extern void ceph_add_cap(struct inode *inode, + unsigned cap, unsigned seq, u64 realmino, int flags, + struct ceph_cap **new_cap); + extern void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release); +-extern void __ceph_remove_caps(struct inode* inode); ++extern void __ceph_remove_caps(struct ceph_inode_info *ci); + extern void ceph_put_cap(struct ceph_mds_client *mdsc, + struct ceph_cap *cap); + extern int ceph_is_any_caps(struct inode *inode); +diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c +index 0cc42c8879e9..0619adbcbe14 100644 +--- a/fs/ceph/xattr.c ++++ b/fs/ceph/xattr.c +@@ -79,7 +79,7 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, + const char *ns_field = " pool_namespace="; + char buf[128]; + size_t len, total_len = 0; +- int ret; ++ ssize_t ret; + + pool_ns = ceph_try_get_string(ci->i_layout.pool_ns); + +@@ -103,11 +103,8 @@ static size_t ceph_vxattrcb_layout(struct ceph_inode_info *ci, char *val, + if (pool_ns) + total_len += strlen(ns_field) + pool_ns->len; + +- if (!size) { +- ret = total_len; +- } else if (total_len > size) { +- ret = -ERANGE; +- } else { ++ ret = total_len; ++ if (size >= total_len) { + memcpy(val, buf, len); + ret = len; + if (pool_name) { +@@ -835,8 +832,11 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value, + if (err) + return err; + err = -ENODATA; +- if (!(vxattr->exists_cb && !vxattr->exists_cb(ci))) ++ if (!(vxattr->exists_cb && !vxattr->exists_cb(ci))) { + err = vxattr->getxattr_cb(ci, value, size); ++ if (size && size < err) ++ err = -ERANGE; ++ } + return err; + } + +diff --git a/fs/cifs/cifs_fs_sb.h b/fs/cifs/cifs_fs_sb.h +index ed49222abecb..afa56237a0c3 100644 +--- a/fs/cifs/cifs_fs_sb.h ++++ b/fs/cifs/cifs_fs_sb.h +@@ -83,5 +83,10 @@ struct cifs_sb_info { + * failover properly. + */ + char *origin_fullpath; /* \\HOST\SHARE\[OPTIONAL PATH] */ ++ /* ++ * Indicate whether serverino option was turned off later ++ * (cifs_autodisable_serverino) in order to match new mounts. ++ */ ++ bool mnt_cifs_serverino_autodisabled; + }; + #endif /* _CIFS_FS_SB_H */ +diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c +index 8dd6637a3cbb..18c7c6b2fe08 100644 +--- a/fs/cifs/connect.c ++++ b/fs/cifs/connect.c +@@ -706,10 +706,10 @@ static bool + server_unresponsive(struct TCP_Server_Info *server) + { + /* +- * We need to wait 2 echo intervals to make sure we handle such ++ * We need to wait 3 echo intervals to make sure we handle such + * situations right: + * 1s client sends a normal SMB request +- * 2s client gets a response ++ * 3s client gets a response + * 30s echo workqueue job pops, and decides we got a response recently + * and don't need to send another + * ... +@@ -718,9 +718,9 @@ server_unresponsive(struct TCP_Server_Info *server) + */ + if ((server->tcpStatus == CifsGood || + server->tcpStatus == CifsNeedNegotiate) && +- time_after(jiffies, server->lstrp + 2 * server->echo_interval)) { ++ time_after(jiffies, server->lstrp + 3 * server->echo_interval)) { + cifs_dbg(VFS, "Server %s has not responded in %lu seconds. Reconnecting...\n", +- server->hostname, (2 * server->echo_interval) / HZ); ++ server->hostname, (3 * server->echo_interval) / HZ); + cifs_reconnect(server); + wake_up(&server->response_q); + return true; +@@ -1223,11 +1223,11 @@ cifs_demultiplex_thread(void *p) + atomic_read(&midCount)); + cifs_dump_mem("Received Data is: ", bufs[i], + HEADER_SIZE(server)); ++ smb2_add_credits_from_hdr(bufs[i], server); + #ifdef CONFIG_CIFS_DEBUG2 + if (server->ops->dump_detail) + server->ops->dump_detail(bufs[i], + server); +- smb2_add_credits_from_hdr(bufs[i], server); + cifs_dump_mids(server); + #endif /* CIFS_DEBUG2 */ + } +@@ -3460,12 +3460,16 @@ compare_mount_options(struct super_block *sb, struct cifs_mnt_data *mnt_data) + { + struct cifs_sb_info *old = CIFS_SB(sb); + struct cifs_sb_info *new = mnt_data->cifs_sb; ++ unsigned int oldflags = old->mnt_cifs_flags & CIFS_MOUNT_MASK; ++ unsigned int newflags = new->mnt_cifs_flags & CIFS_MOUNT_MASK; + + if ((sb->s_flags & CIFS_MS_MASK) != (mnt_data->flags & CIFS_MS_MASK)) + return 0; + +- if ((old->mnt_cifs_flags & CIFS_MOUNT_MASK) != +- (new->mnt_cifs_flags & CIFS_MOUNT_MASK)) ++ if (old->mnt_cifs_serverino_autodisabled) ++ newflags &= ~CIFS_MOUNT_SERVER_INUM; ++ ++ if (oldflags != newflags) + return 0; + + /* +@@ -4459,11 +4463,13 @@ cifs_are_all_path_components_accessible(struct TCP_Server_Info *server, + unsigned int xid, + struct cifs_tcon *tcon, + struct cifs_sb_info *cifs_sb, +- char *full_path) ++ char *full_path, ++ int added_treename) + { + int rc; + char *s; + char sep, tmp; ++ int skip = added_treename ? 1 : 0; + + sep = CIFS_DIR_SEP(cifs_sb); + s = full_path; +@@ -4478,7 +4484,14 @@ cifs_are_all_path_components_accessible(struct TCP_Server_Info *server, + /* next separator */ + while (*s && *s != sep) + s++; +- ++ /* ++ * if the treename is added, we then have to skip the first ++ * part within the separators ++ */ ++ if (skip) { ++ skip = 0; ++ continue; ++ } + /* + * temporarily null-terminate the path at the end of + * the current component +@@ -4526,8 +4539,7 @@ static int is_path_remote(struct cifs_sb_info *cifs_sb, struct smb_vol *vol, + + if (rc != -EREMOTE) { + rc = cifs_are_all_path_components_accessible(server, xid, tcon, +- cifs_sb, +- full_path); ++ cifs_sb, full_path, tcon->Flags & SMB_SHARE_IS_IN_DFS); + if (rc != 0) { + cifs_dbg(VFS, "cannot query dirs between root and final path, " + "enabling CIFS_MOUNT_USE_PREFIX_PATH\n"); +diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c +index d7cc62252634..efaf7a3631ba 100644 +--- a/fs/cifs/inode.c ++++ b/fs/cifs/inode.c +@@ -2408,6 +2408,8 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) + struct inode *inode = d_inode(direntry); + struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb); + struct cifsInodeInfo *cifsInode = CIFS_I(inode); ++ struct cifsFileInfo *wfile; ++ struct cifs_tcon *tcon; + char *full_path = NULL; + int rc = -EACCES; + __u32 dosattr = 0; +@@ -2454,6 +2456,20 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs) + mapping_set_error(inode->i_mapping, rc); + rc = 0; + ++ if (attrs->ia_valid & ATTR_MTIME) { ++ rc = cifs_get_writable_file(cifsInode, false, &wfile); ++ if (!rc) { ++ tcon = tlink_tcon(wfile->tlink); ++ rc = tcon->ses->server->ops->flush(xid, tcon, &wfile->fid); ++ cifsFileInfo_put(wfile); ++ if (rc) ++ return rc; ++ } else if (rc != -EBADF) ++ return rc; ++ else ++ rc = 0; ++ } ++ + if (attrs->ia_valid & ATTR_SIZE) { + rc = cifs_set_file_size(inode, attrs, xid, full_path); + if (rc != 0) +diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c +index b1a696a73f7c..f383877a6511 100644 +--- a/fs/cifs/misc.c ++++ b/fs/cifs/misc.c +@@ -539,6 +539,7 @@ cifs_autodisable_serverino(struct cifs_sb_info *cifs_sb) + tcon = cifs_sb_master_tcon(cifs_sb); + + cifs_sb->mnt_cifs_flags &= ~CIFS_MOUNT_SERVER_INUM; ++ cifs_sb->mnt_cifs_serverino_autodisabled = true; + cifs_dbg(VFS, "Autodisabling the use of server inode numbers on %s.\n", + tcon ? tcon->treeName : "new server"); + cifs_dbg(VFS, "The server doesn't seem to support them properly or the files might be on different servers (DFS).\n"); +diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c +index 278405d26c47..d8d9cdfa30b6 100644 +--- a/fs/cifs/smb2inode.c ++++ b/fs/cifs/smb2inode.c +@@ -120,6 +120,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, + SMB2_O_INFO_FILE, 0, + sizeof(struct smb2_file_all_info) + + PATH_MAX * 2, 0, NULL); ++ if (rc) ++ goto finished; + smb2_set_next_command(tcon, &rqst[num_rqst]); + smb2_set_related(&rqst[num_rqst++]); + trace_smb3_query_info_compound_enter(xid, ses->Suid, tcon->tid, +@@ -147,6 +149,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, + COMPOUND_FID, current->tgid, + FILE_DISPOSITION_INFORMATION, + SMB2_O_INFO_FILE, 0, data, size); ++ if (rc) ++ goto finished; + smb2_set_next_command(tcon, &rqst[num_rqst]); + smb2_set_related(&rqst[num_rqst++]); + trace_smb3_rmdir_enter(xid, ses->Suid, tcon->tid, full_path); +@@ -163,6 +167,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, + COMPOUND_FID, current->tgid, + FILE_END_OF_FILE_INFORMATION, + SMB2_O_INFO_FILE, 0, data, size); ++ if (rc) ++ goto finished; + smb2_set_next_command(tcon, &rqst[num_rqst]); + smb2_set_related(&rqst[num_rqst++]); + trace_smb3_set_eof_enter(xid, ses->Suid, tcon->tid, full_path); +@@ -180,6 +186,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, + COMPOUND_FID, current->tgid, + FILE_BASIC_INFORMATION, + SMB2_O_INFO_FILE, 0, data, size); ++ if (rc) ++ goto finished; + smb2_set_next_command(tcon, &rqst[num_rqst]); + smb2_set_related(&rqst[num_rqst++]); + trace_smb3_set_info_compound_enter(xid, ses->Suid, tcon->tid, +@@ -206,6 +214,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, + COMPOUND_FID, current->tgid, + FILE_RENAME_INFORMATION, + SMB2_O_INFO_FILE, 0, data, size); ++ if (rc) ++ goto finished; + smb2_set_next_command(tcon, &rqst[num_rqst]); + smb2_set_related(&rqst[num_rqst++]); + trace_smb3_rename_enter(xid, ses->Suid, tcon->tid, full_path); +@@ -231,6 +241,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon, + COMPOUND_FID, current->tgid, + FILE_LINK_INFORMATION, + SMB2_O_INFO_FILE, 0, data, size); ++ if (rc) ++ goto finished; + smb2_set_next_command(tcon, &rqst[num_rqst]); + smb2_set_related(&rqst[num_rqst++]); + trace_smb3_hardlink_enter(xid, ses->Suid, tcon->tid, full_path); +diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c +index 9fd56b0acd7e..2ec37dc589a7 100644 +--- a/fs/cifs/smb2ops.c ++++ b/fs/cifs/smb2ops.c +@@ -694,8 +694,51 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) + + smb2_set_related(&rqst[1]); + ++ /* ++ * We do not hold the lock for the open because in case ++ * SMB2_open needs to reconnect, it will end up calling ++ * cifs_mark_open_files_invalid() which takes the lock again ++ * thus causing a deadlock ++ */ ++ ++ mutex_unlock(&tcon->crfid.fid_mutex); + rc = compound_send_recv(xid, ses, flags, 2, rqst, + resp_buftype, rsp_iov); ++ mutex_lock(&tcon->crfid.fid_mutex); ++ ++ /* ++ * Now we need to check again as the cached root might have ++ * been successfully re-opened from a concurrent process ++ */ ++ ++ if (tcon->crfid.is_valid) { ++ /* work was already done */ ++ ++ /* stash fids for close() later */ ++ struct cifs_fid fid = { ++ .persistent_fid = pfid->persistent_fid, ++ .volatile_fid = pfid->volatile_fid, ++ }; ++ ++ /* ++ * caller expects this func to set pfid to a valid ++ * cached root, so we copy the existing one and get a ++ * reference. ++ */ ++ memcpy(pfid, tcon->crfid.fid, sizeof(*pfid)); ++ kref_get(&tcon->crfid.refcount); ++ ++ mutex_unlock(&tcon->crfid.fid_mutex); ++ ++ if (rc == 0) { ++ /* close extra handle outside of crit sec */ ++ SMB2_close(xid, tcon, fid.persistent_fid, fid.volatile_fid); ++ } ++ goto oshr_free; ++ } ++ ++ /* Cached root is still invalid, continue normaly */ ++ + if (rc) + goto oshr_exit; + +@@ -729,8 +772,9 @@ int open_shroot(unsigned int xid, struct cifs_tcon *tcon, struct cifs_fid *pfid) + (char *)&tcon->crfid.file_all_info)) + tcon->crfid.file_all_info_is_valid = 1; + +- oshr_exit: ++oshr_exit: + mutex_unlock(&tcon->crfid.fid_mutex); ++oshr_free: + SMB2_open_free(&rqst[0]); + SMB2_query_info_free(&rqst[1]); + free_rsp_buf(resp_buftype[0], rsp_iov[0].iov_base); +@@ -2027,6 +2071,10 @@ smb2_set_related(struct smb_rqst *rqst) + struct smb2_sync_hdr *shdr; + + shdr = (struct smb2_sync_hdr *)(rqst->rq_iov[0].iov_base); ++ if (shdr == NULL) { ++ cifs_dbg(FYI, "shdr NULL in smb2_set_related\n"); ++ return; ++ } + shdr->Flags |= SMB2_FLAGS_RELATED_OPERATIONS; + } + +@@ -2041,6 +2089,12 @@ smb2_set_next_command(struct cifs_tcon *tcon, struct smb_rqst *rqst) + unsigned long len = smb_rqst_len(server, rqst); + int i, num_padding; + ++ shdr = (struct smb2_sync_hdr *)(rqst->rq_iov[0].iov_base); ++ if (shdr == NULL) { ++ cifs_dbg(FYI, "shdr NULL in smb2_set_next_command\n"); ++ return; ++ } ++ + /* SMB headers in a compound are 8 byte aligned. */ + + /* No padding needed */ +@@ -2080,7 +2134,6 @@ smb2_set_next_command(struct cifs_tcon *tcon, struct smb_rqst *rqst) + } + + finished: +- shdr = (struct smb2_sync_hdr *)(rqst->rq_iov[0].iov_base); + shdr->NextCommand = cpu_to_le32(len); + } + +diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c +index 75311a8a68bf..c3c8de5513db 100644 +--- a/fs/cifs/smb2pdu.c ++++ b/fs/cifs/smb2pdu.c +@@ -252,7 +252,7 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon) + if (tcon == NULL) + return 0; + +- if (smb2_command == SMB2_TREE_CONNECT) ++ if (smb2_command == SMB2_TREE_CONNECT || smb2_command == SMB2_IOCTL) + return 0; + + if (tcon->tidStatus == CifsExiting) { +@@ -1173,7 +1173,12 @@ SMB2_sess_alloc_buffer(struct SMB2_sess_data *sess_data) + else + req->SecurityMode = 0; + ++#ifdef CONFIG_CIFS_DFS_UPCALL ++ req->Capabilities = cpu_to_le32(SMB2_GLOBAL_CAP_DFS); ++#else + req->Capabilities = 0; ++#endif /* DFS_UPCALL */ ++ + req->Channel = 0; /* MBZ */ + + sess_data->iov[0].iov_base = (char *)req; +diff --git a/fs/coda/file.c b/fs/coda/file.c +index 1cbc1f2298ee..43d371551d2b 100644 +--- a/fs/coda/file.c ++++ b/fs/coda/file.c +@@ -27,6 +27,13 @@ + #include "coda_linux.h" + #include "coda_int.h" + ++struct coda_vm_ops { ++ atomic_t refcnt; ++ struct file *coda_file; ++ const struct vm_operations_struct *host_vm_ops; ++ struct vm_operations_struct vm_ops; ++}; ++ + static ssize_t + coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to) + { +@@ -61,6 +68,34 @@ coda_file_write_iter(struct kiocb *iocb, struct iov_iter *to) + return ret; + } + ++static void ++coda_vm_open(struct vm_area_struct *vma) ++{ ++ struct coda_vm_ops *cvm_ops = ++ container_of(vma->vm_ops, struct coda_vm_ops, vm_ops); ++ ++ atomic_inc(&cvm_ops->refcnt); ++ ++ if (cvm_ops->host_vm_ops && cvm_ops->host_vm_ops->open) ++ cvm_ops->host_vm_ops->open(vma); ++} ++ ++static void ++coda_vm_close(struct vm_area_struct *vma) ++{ ++ struct coda_vm_ops *cvm_ops = ++ container_of(vma->vm_ops, struct coda_vm_ops, vm_ops); ++ ++ if (cvm_ops->host_vm_ops && cvm_ops->host_vm_ops->close) ++ cvm_ops->host_vm_ops->close(vma); ++ ++ if (atomic_dec_and_test(&cvm_ops->refcnt)) { ++ vma->vm_ops = cvm_ops->host_vm_ops; ++ fput(cvm_ops->coda_file); ++ kfree(cvm_ops); ++ } ++} ++ + static int + coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) + { +@@ -68,6 +103,8 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) + struct coda_inode_info *cii; + struct file *host_file; + struct inode *coda_inode, *host_inode; ++ struct coda_vm_ops *cvm_ops; ++ int ret; + + cfi = CODA_FTOC(coda_file); + BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC); +@@ -76,6 +113,13 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) + if (!host_file->f_op->mmap) + return -ENODEV; + ++ if (WARN_ON(coda_file != vma->vm_file)) ++ return -EIO; ++ ++ cvm_ops = kmalloc(sizeof(struct coda_vm_ops), GFP_KERNEL); ++ if (!cvm_ops) ++ return -ENOMEM; ++ + coda_inode = file_inode(coda_file); + host_inode = file_inode(host_file); + +@@ -89,6 +133,7 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) + * the container file on us! */ + else if (coda_inode->i_mapping != host_inode->i_mapping) { + spin_unlock(&cii->c_lock); ++ kfree(cvm_ops); + return -EBUSY; + } + +@@ -97,7 +142,29 @@ coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma) + cfi->cfi_mapcount++; + spin_unlock(&cii->c_lock); + +- return call_mmap(host_file, vma); ++ vma->vm_file = get_file(host_file); ++ ret = call_mmap(vma->vm_file, vma); ++ ++ if (ret) { ++ /* if call_mmap fails, our caller will put coda_file so we ++ * should drop the reference to the host_file that we got. ++ */ ++ fput(host_file); ++ kfree(cvm_ops); ++ } else { ++ /* here we add redirects for the open/close vm_operations */ ++ cvm_ops->host_vm_ops = vma->vm_ops; ++ if (vma->vm_ops) ++ cvm_ops->vm_ops = *vma->vm_ops; ++ ++ cvm_ops->vm_ops.open = coda_vm_open; ++ cvm_ops->vm_ops.close = coda_vm_close; ++ cvm_ops->coda_file = coda_file; ++ atomic_set(&cvm_ops->refcnt, 1); ++ ++ vma->vm_ops = &cvm_ops->vm_ops; ++ } ++ return ret; + } + + int coda_open(struct inode *coda_inode, struct file *coda_file) +@@ -207,4 +274,3 @@ const struct file_operations coda_file_operations = { + .fsync = coda_fsync, + .splice_read = generic_file_splice_read, + }; +- +diff --git a/fs/coda/psdev.c b/fs/coda/psdev.c +index 0ceef32e6fae..241f7e04ad04 100644 +--- a/fs/coda/psdev.c ++++ b/fs/coda/psdev.c +@@ -182,8 +182,11 @@ static ssize_t coda_psdev_write(struct file *file, const char __user *buf, + if (req->uc_opcode == CODA_OPEN_BY_FD) { + struct coda_open_by_fd_out *outp = + (struct coda_open_by_fd_out *)req->uc_data; +- if (!outp->oh.result) ++ if (!outp->oh.result) { + outp->fh = fget(outp->fd); ++ if (!outp->fh) ++ return -EBADF; ++ } + } + + wake_up(&req->uc_sleep); +diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c +index 6e30949d9f77..a7ec2d3dff92 100644 +--- a/fs/compat_ioctl.c ++++ b/fs/compat_ioctl.c +@@ -638,9 +638,6 @@ COMPATIBLE_IOCTL(PPPIOCDISCONN) + COMPATIBLE_IOCTL(PPPIOCATTCHAN) + COMPATIBLE_IOCTL(PPPIOCGCHAN) + COMPATIBLE_IOCTL(PPPIOCGL2TPSTATS) +-/* PPPOX */ +-COMPATIBLE_IOCTL(PPPOEIOCSFWD) +-COMPATIBLE_IOCTL(PPPOEIOCDFWD) + /* Big A */ + /* sparc only */ + /* Big Q for sound/OSS */ +diff --git a/fs/crypto/crypto.c b/fs/crypto/crypto.c +index 335a362ee446..6f753198eeef 100644 +--- a/fs/crypto/crypto.c ++++ b/fs/crypto/crypto.c +@@ -154,7 +154,10 @@ int fscrypt_do_page_crypto(const struct inode *inode, fscrypt_direction_t rw, + struct crypto_skcipher *tfm = ci->ci_ctfm; + int res = 0; + +- BUG_ON(len == 0); ++ if (WARN_ON_ONCE(len <= 0)) ++ return -EINVAL; ++ if (WARN_ON_ONCE(len % FS_CRYPTO_BLOCK_SIZE != 0)) ++ return -EINVAL; + + fscrypt_generate_iv(&iv, lblk_num, ci); + +@@ -238,8 +241,6 @@ struct page *fscrypt_encrypt_page(const struct inode *inode, + struct page *ciphertext_page = page; + int err; + +- BUG_ON(len % FS_CRYPTO_BLOCK_SIZE != 0); +- + if (inode->i_sb->s_cop->flags & FS_CFLG_OWN_PAGES) { + /* with inplace-encryption we just encrypt the page */ + err = fscrypt_do_page_crypto(inode, FS_ENCRYPT, lblk_num, page, +@@ -251,7 +252,8 @@ struct page *fscrypt_encrypt_page(const struct inode *inode, + return ciphertext_page; + } + +- BUG_ON(!PageLocked(page)); ++ if (WARN_ON_ONCE(!PageLocked(page))) ++ return ERR_PTR(-EINVAL); + + ctx = fscrypt_get_ctx(gfp_flags); + if (IS_ERR(ctx)) +@@ -299,8 +301,9 @@ EXPORT_SYMBOL(fscrypt_encrypt_page); + int fscrypt_decrypt_page(const struct inode *inode, struct page *page, + unsigned int len, unsigned int offs, u64 lblk_num) + { +- if (!(inode->i_sb->s_cop->flags & FS_CFLG_OWN_PAGES)) +- BUG_ON(!PageLocked(page)); ++ if (WARN_ON_ONCE(!PageLocked(page) && ++ !(inode->i_sb->s_cop->flags & FS_CFLG_OWN_PAGES))) ++ return -EINVAL; + + return fscrypt_do_page_crypto(inode, FS_DECRYPT, lblk_num, page, page, + len, offs, GFP_NOFS); +diff --git a/fs/crypto/policy.c b/fs/crypto/policy.c +index d536889ac31b..4941fe8471ce 100644 +--- a/fs/crypto/policy.c ++++ b/fs/crypto/policy.c +@@ -81,6 +81,8 @@ int fscrypt_ioctl_set_policy(struct file *filp, const void __user *arg) + if (ret == -ENODATA) { + if (!S_ISDIR(inode->i_mode)) + ret = -ENOTDIR; ++ else if (IS_DEADDIR(inode)) ++ ret = -ENOENT; + else if (!inode->i_sb->s_cop->empty_dir(inode)) + ret = -ENOTEMPTY; + else +diff --git a/fs/dax.c b/fs/dax.c +index d2c90bf1969a..4f42b852375b 100644 +--- a/fs/dax.c ++++ b/fs/dax.c +@@ -123,6 +123,15 @@ static int dax_is_empty_entry(void *entry) + return xa_to_value(entry) & DAX_EMPTY; + } + ++/* ++ * true if the entry that was found is of a smaller order than the entry ++ * we were looking for ++ */ ++static bool dax_is_conflict(void *entry) ++{ ++ return entry == XA_RETRY_ENTRY; ++} ++ + /* + * DAX page cache entry locking + */ +@@ -195,11 +204,13 @@ static void dax_wake_entry(struct xa_state *xas, void *entry, bool wake_all) + * Look up entry in page cache, wait for it to become unlocked if it + * is a DAX entry and return it. The caller must subsequently call + * put_unlocked_entry() if it did not lock the entry or dax_unlock_entry() +- * if it did. ++ * if it did. The entry returned may have a larger order than @order. ++ * If @order is larger than the order of the entry found in i_pages, this ++ * function returns a dax_is_conflict entry. + * + * Must be called with the i_pages lock held. + */ +-static void *get_unlocked_entry(struct xa_state *xas) ++static void *get_unlocked_entry(struct xa_state *xas, unsigned int order) + { + void *entry; + struct wait_exceptional_entry_queue ewait; +@@ -210,6 +221,8 @@ static void *get_unlocked_entry(struct xa_state *xas) + + for (;;) { + entry = xas_find_conflict(xas); ++ if (dax_entry_order(entry) < order) ++ return XA_RETRY_ENTRY; + if (!entry || WARN_ON_ONCE(!xa_is_value(entry)) || + !dax_is_locked(entry)) + return entry; +@@ -254,7 +267,7 @@ static void wait_entry_unlocked(struct xa_state *xas, void *entry) + static void put_unlocked_entry(struct xa_state *xas, void *entry) + { + /* If we were the only waiter woken, wake the next one */ +- if (entry) ++ if (entry && !dax_is_conflict(entry)) + dax_wake_entry(xas, entry, false); + } + +@@ -461,7 +474,7 @@ void dax_unlock_page(struct page *page, dax_entry_t cookie) + * overlap with xarray value entries. + */ + static void *grab_mapping_entry(struct xa_state *xas, +- struct address_space *mapping, unsigned long size_flag) ++ struct address_space *mapping, unsigned int order) + { + unsigned long index = xas->xa_index; + bool pmd_downgrade = false; /* splitting PMD entry into PTE entries? */ +@@ -469,20 +482,17 @@ static void *grab_mapping_entry(struct xa_state *xas, + + retry: + xas_lock_irq(xas); +- entry = get_unlocked_entry(xas); ++ entry = get_unlocked_entry(xas, order); + + if (entry) { ++ if (dax_is_conflict(entry)) ++ goto fallback; + if (!xa_is_value(entry)) { + xas_set_err(xas, EIO); + goto out_unlock; + } + +- if (size_flag & DAX_PMD) { +- if (dax_is_pte_entry(entry)) { +- put_unlocked_entry(xas, entry); +- goto fallback; +- } +- } else { /* trying to grab a PTE entry */ ++ if (order == 0) { + if (dax_is_pmd_entry(entry) && + (dax_is_zero_entry(entry) || + dax_is_empty_entry(entry))) { +@@ -523,7 +533,11 @@ static void *grab_mapping_entry(struct xa_state *xas, + if (entry) { + dax_lock_entry(xas, entry); + } else { +- entry = dax_make_entry(pfn_to_pfn_t(0), size_flag | DAX_EMPTY); ++ unsigned long flags = DAX_EMPTY; ++ ++ if (order > 0) ++ flags |= DAX_PMD; ++ entry = dax_make_entry(pfn_to_pfn_t(0), flags); + dax_lock_entry(xas, entry); + if (xas_error(xas)) + goto out_unlock; +@@ -587,14 +601,14 @@ struct page *dax_layout_busy_page(struct address_space *mapping) + * guaranteed to either see new references or prevent new + * references from being established. + */ +- unmap_mapping_range(mapping, 0, 0, 1); ++ unmap_mapping_range(mapping, 0, 0, 0); + + xas_lock_irq(&xas); + xas_for_each(&xas, entry, ULONG_MAX) { + if (WARN_ON_ONCE(!xa_is_value(entry))) + continue; + if (unlikely(dax_is_locked(entry))) +- entry = get_unlocked_entry(&xas); ++ entry = get_unlocked_entry(&xas, 0); + if (entry) + page = dax_busy_page(entry); + put_unlocked_entry(&xas, entry); +@@ -621,7 +635,7 @@ static int __dax_invalidate_entry(struct address_space *mapping, + void *entry; + + xas_lock_irq(&xas); +- entry = get_unlocked_entry(&xas); ++ entry = get_unlocked_entry(&xas, 0); + if (!entry || WARN_ON_ONCE(!xa_is_value(entry))) + goto out; + if (!trunc && +@@ -848,7 +862,7 @@ static int dax_writeback_one(struct xa_state *xas, struct dax_device *dax_dev, + if (unlikely(dax_is_locked(entry))) { + void *old_entry = entry; + +- entry = get_unlocked_entry(xas); ++ entry = get_unlocked_entry(xas, 0); + + /* Entry got punched out / reallocated? */ + if (!entry || WARN_ON_ONCE(!xa_is_value(entry))) +@@ -1509,7 +1523,7 @@ static vm_fault_t dax_iomap_pmd_fault(struct vm_fault *vmf, pfn_t *pfnp, + * entry is already in the array, for instance), it will return + * VM_FAULT_FALLBACK. + */ +- entry = grab_mapping_entry(&xas, mapping, DAX_PMD); ++ entry = grab_mapping_entry(&xas, mapping, PMD_ORDER); + if (xa_is_internal(entry)) { + result = xa_to_internal(entry); + goto fallback; +@@ -1658,11 +1672,10 @@ dax_insert_pfn_mkwrite(struct vm_fault *vmf, pfn_t pfn, unsigned int order) + vm_fault_t ret; + + xas_lock_irq(&xas); +- entry = get_unlocked_entry(&xas); ++ entry = get_unlocked_entry(&xas, order); + /* Did we race with someone splitting entry or so? */ +- if (!entry || +- (order == 0 && !dax_is_pte_entry(entry)) || +- (order == PMD_ORDER && !dax_is_pmd_entry(entry))) { ++ if (!entry || dax_is_conflict(entry) || ++ (order == 0 && !dax_is_pte_entry(entry))) { + put_unlocked_entry(&xas, entry); + xas_unlock_irq(&xas); + trace_dax_insert_pfn_mkwrite_no_entry(mapping->host, vmf, +diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c +index 114ebfe30929..3951d39b9b75 100644 +--- a/fs/dlm/lowcomms.c ++++ b/fs/dlm/lowcomms.c +@@ -1628,8 +1628,10 @@ static void clean_writequeues(void) + + static void work_stop(void) + { +- destroy_workqueue(recv_workqueue); +- destroy_workqueue(send_workqueue); ++ if (recv_workqueue) ++ destroy_workqueue(recv_workqueue); ++ if (send_workqueue) ++ destroy_workqueue(send_workqueue); + } + + static int work_start(void) +@@ -1689,13 +1691,17 @@ static void work_flush(void) + struct hlist_node *n; + struct connection *con; + +- flush_workqueue(recv_workqueue); +- flush_workqueue(send_workqueue); ++ if (recv_workqueue) ++ flush_workqueue(recv_workqueue); ++ if (send_workqueue) ++ flush_workqueue(send_workqueue); + do { + ok = 1; + foreach_conn(stop_conn); +- flush_workqueue(recv_workqueue); +- flush_workqueue(send_workqueue); ++ if (recv_workqueue) ++ flush_workqueue(recv_workqueue); ++ if (send_workqueue) ++ flush_workqueue(send_workqueue); + for (i = 0; i < CONN_HASH_SIZE && ok; i++) { + hlist_for_each_entry_safe(con, n, + &connection_hash[i], list) { +diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c +index 91d65f337d87..54bfa71ffdad 100644 +--- a/fs/ecryptfs/crypto.c ++++ b/fs/ecryptfs/crypto.c +@@ -1004,8 +1004,10 @@ int ecryptfs_read_and_validate_header_region(struct inode *inode) + + rc = ecryptfs_read_lower(file_size, 0, ECRYPTFS_SIZE_AND_MARKER_BYTES, + inode); +- if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES) +- return rc >= 0 ? -EINVAL : rc; ++ if (rc < 0) ++ return rc; ++ else if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES) ++ return -EINVAL; + rc = ecryptfs_validate_marker(marker); + if (!rc) + ecryptfs_i_size_init(file_size, inode); +@@ -1367,8 +1369,10 @@ int ecryptfs_read_and_validate_xattr_region(struct dentry *dentry, + ecryptfs_inode_to_lower(inode), + ECRYPTFS_XATTR_NAME, file_size, + ECRYPTFS_SIZE_AND_MARKER_BYTES); +- if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES) +- return rc >= 0 ? -EINVAL : rc; ++ if (rc < 0) ++ return rc; ++ else if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES) ++ return -EINVAL; + rc = ecryptfs_validate_marker(marker); + if (!rc) + ecryptfs_i_size_init(file_size, inode); +diff --git a/fs/exec.c b/fs/exec.c +index 89a500bb897a..32eb9ca496a3 100644 +--- a/fs/exec.c ++++ b/fs/exec.c +@@ -64,6 +64,8 @@ + #include + #include + ++#include ++ + #include + #include + #include +@@ -869,8 +871,10 @@ static struct file *do_open_execat(int fd, struct filename *name, int flags) + if (err) + goto exit; + +- if (name->name[0] != '\0') ++ if (name->name[0] != '\0') { + fsnotify_open(file); ++ trace_open_exec(name->name); ++ } + + out: + return file; +@@ -1828,7 +1832,7 @@ static int __do_execve_file(int fd, struct filename *filename, + membarrier_execve(current); + rseq_execve(current); + acct_update_integrals(current); +- task_numa_free(current); ++ task_numa_free(current, false); + free_bprm(bprm); + kfree(pathbuf); + if (filename) +diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c +index c7843b149a1e..92042f073d58 100644 +--- a/fs/ext4/dir.c ++++ b/fs/ext4/dir.c +@@ -109,7 +109,6 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) + struct inode *inode = file_inode(file); + struct super_block *sb = inode->i_sb; + struct buffer_head *bh = NULL; +- int dir_has_error = 0; + struct fscrypt_str fstr = FSTR_INIT(NULL, 0); + + if (IS_ENCRYPTED(inode)) { +@@ -145,8 +144,6 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) + return err; + } + +- offset = ctx->pos & (sb->s_blocksize - 1); +- + while (ctx->pos < inode->i_size) { + struct ext4_map_blocks map; + +@@ -155,9 +152,18 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) + goto errout; + } + cond_resched(); ++ offset = ctx->pos & (sb->s_blocksize - 1); + map.m_lblk = ctx->pos >> EXT4_BLOCK_SIZE_BITS(sb); + map.m_len = 1; + err = ext4_map_blocks(NULL, inode, &map, 0); ++ if (err == 0) { ++ /* m_len should never be zero but let's avoid ++ * an infinite loop if it somehow is */ ++ if (map.m_len == 0) ++ map.m_len = 1; ++ ctx->pos += map.m_len * sb->s_blocksize; ++ continue; ++ } + if (err > 0) { + pgoff_t index = map.m_pblk >> + (PAGE_SHIFT - inode->i_blkbits); +@@ -176,13 +182,6 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) + } + + if (!bh) { +- if (!dir_has_error) { +- EXT4_ERROR_FILE(file, 0, +- "directory contains a " +- "hole at offset %llu", +- (unsigned long long) ctx->pos); +- dir_has_error = 1; +- } + /* corrupt size? Maybe no more blocks to read */ + if (ctx->pos > inode->i_blocks << 9) + break; +diff --git a/fs/ext4/ext4_jbd2.h b/fs/ext4/ext4_jbd2.h +index 75a5309f2231..ef8fcf7d0d3b 100644 +--- a/fs/ext4/ext4_jbd2.h ++++ b/fs/ext4/ext4_jbd2.h +@@ -361,20 +361,20 @@ static inline int ext4_journal_force_commit(journal_t *journal) + } + + static inline int ext4_jbd2_inode_add_write(handle_t *handle, +- struct inode *inode) ++ struct inode *inode, loff_t start_byte, loff_t length) + { + if (ext4_handle_valid(handle)) +- return jbd2_journal_inode_add_write(handle, +- EXT4_I(inode)->jinode); ++ return jbd2_journal_inode_ranged_write(handle, ++ EXT4_I(inode)->jinode, start_byte, length); + return 0; + } + + static inline int ext4_jbd2_inode_add_wait(handle_t *handle, +- struct inode *inode) ++ struct inode *inode, loff_t start_byte, loff_t length) + { + if (ext4_handle_valid(handle)) +- return jbd2_journal_inode_add_wait(handle, +- EXT4_I(inode)->jinode); ++ return jbd2_journal_inode_ranged_wait(handle, ++ EXT4_I(inode)->jinode, start_byte, length); + return 0; + } + +diff --git a/fs/ext4/file.c b/fs/ext4/file.c +index 2c5baa5e8291..f4a24a46245e 100644 +--- a/fs/ext4/file.c ++++ b/fs/ext4/file.c +@@ -165,6 +165,10 @@ static ssize_t ext4_write_checks(struct kiocb *iocb, struct iov_iter *from) + ret = generic_write_checks(iocb, from); + if (ret <= 0) + return ret; ++ ++ if (unlikely(IS_IMMUTABLE(inode))) ++ return -EPERM; ++ + /* + * If we have encountered a bitmap-format file, the size limit + * is smaller than s_maxbytes, which is for extent-mapped files. +diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c +index c7f77c643008..85c648289b57 100644 +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -731,10 +731,16 @@ int ext4_map_blocks(handle_t *handle, struct inode *inode, + !(flags & EXT4_GET_BLOCKS_ZERO) && + !ext4_is_quota_file(inode) && + ext4_should_order_data(inode)) { ++ loff_t start_byte = ++ (loff_t)map->m_lblk << inode->i_blkbits; ++ loff_t length = (loff_t)map->m_len << inode->i_blkbits; ++ + if (flags & EXT4_GET_BLOCKS_IO_SUBMIT) +- ret = ext4_jbd2_inode_add_wait(handle, inode); ++ ret = ext4_jbd2_inode_add_wait(handle, inode, ++ start_byte, length); + else +- ret = ext4_jbd2_inode_add_write(handle, inode); ++ ret = ext4_jbd2_inode_add_write(handle, inode, ++ start_byte, length); + if (ret) + return ret; + } +@@ -4085,7 +4091,8 @@ static int __ext4_block_zero_page_range(handle_t *handle, + err = 0; + mark_buffer_dirty(bh); + if (ext4_should_order_data(inode)) +- err = ext4_jbd2_inode_add_write(handle, inode); ++ err = ext4_jbd2_inode_add_write(handle, inode, from, ++ length); + } + + unlock: +@@ -5520,6 +5527,14 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) + if (unlikely(ext4_forced_shutdown(EXT4_SB(inode->i_sb)))) + return -EIO; + ++ if (unlikely(IS_IMMUTABLE(inode))) ++ return -EPERM; ++ ++ if (unlikely(IS_APPEND(inode) && ++ (ia_valid & (ATTR_MODE | ATTR_UID | ++ ATTR_GID | ATTR_TIMES_SET)))) ++ return -EPERM; ++ + error = setattr_prepare(dentry, attr); + if (error) + return error; +@@ -6190,6 +6205,9 @@ vm_fault_t ext4_page_mkwrite(struct vm_fault *vmf) + get_block_t *get_block; + int retries = 0; + ++ if (unlikely(IS_IMMUTABLE(inode))) ++ return VM_FAULT_SIGBUS; ++ + sb_start_pagefault(inode->i_sb); + file_update_time(vma->vm_file); + +diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c +index e486e49b31ed..7af835ac8d23 100644 +--- a/fs/ext4/ioctl.c ++++ b/fs/ext4/ioctl.c +@@ -269,6 +269,29 @@ static int uuid_is_zero(__u8 u[16]) + } + #endif + ++/* ++ * If immutable is set and we are not clearing it, we're not allowed to change ++ * anything else in the inode. Don't error out if we're only trying to set ++ * immutable on an immutable file. ++ */ ++static int ext4_ioctl_check_immutable(struct inode *inode, __u32 new_projid, ++ unsigned int flags) ++{ ++ struct ext4_inode_info *ei = EXT4_I(inode); ++ unsigned int oldflags = ei->i_flags; ++ ++ if (!(oldflags & EXT4_IMMUTABLE_FL) || !(flags & EXT4_IMMUTABLE_FL)) ++ return 0; ++ ++ if ((oldflags & ~EXT4_IMMUTABLE_FL) != (flags & ~EXT4_IMMUTABLE_FL)) ++ return -EPERM; ++ if (ext4_has_feature_project(inode->i_sb) && ++ __kprojid_val(ei->i_projid) != new_projid) ++ return -EPERM; ++ ++ return 0; ++} ++ + static int ext4_ioctl_setflags(struct inode *inode, + unsigned int flags) + { +@@ -340,6 +363,20 @@ static int ext4_ioctl_setflags(struct inode *inode, + } + } + ++ /* ++ * Wait for all pending directio and then flush all the dirty pages ++ * for this file. The flush marks all the pages readonly, so any ++ * subsequent attempt to write to the file (particularly mmap pages) ++ * will come through the filesystem and fail. ++ */ ++ if (S_ISREG(inode->i_mode) && !IS_IMMUTABLE(inode) && ++ (flags & EXT4_IMMUTABLE_FL)) { ++ inode_dio_wait(inode); ++ err = filemap_write_and_wait(inode->i_mapping); ++ if (err) ++ goto flags_out; ++ } ++ + handle = ext4_journal_start(inode, EXT4_HT_INODE, 1); + if (IS_ERR(handle)) { + err = PTR_ERR(handle); +@@ -769,7 +806,11 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) + return err; + + inode_lock(inode); +- err = ext4_ioctl_setflags(inode, flags); ++ err = ext4_ioctl_check_immutable(inode, ++ from_kprojid(&init_user_ns, ei->i_projid), ++ flags); ++ if (!err) ++ err = ext4_ioctl_setflags(inode, flags); + inode_unlock(inode); + mnt_drop_write_file(filp); + return err; +@@ -1139,6 +1180,9 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) + goto out; + flags = (ei->i_flags & ~EXT4_FL_XFLAG_VISIBLE) | + (flags & EXT4_FL_XFLAG_VISIBLE); ++ err = ext4_ioctl_check_immutable(inode, fa.fsx_projid, flags); ++ if (err) ++ goto out; + err = ext4_ioctl_setflags(inode, flags); + if (err) + goto out; +diff --git a/fs/ext4/move_extent.c b/fs/ext4/move_extent.c +index 1083a9f3f16a..c7ded4e2adff 100644 +--- a/fs/ext4/move_extent.c ++++ b/fs/ext4/move_extent.c +@@ -390,7 +390,8 @@ move_extent_per_page(struct file *o_filp, struct inode *donor_inode, + + /* Even in case of data=writeback it is reasonable to pin + * inode to transaction, to prevent unexpected data loss */ +- *err = ext4_jbd2_inode_add_write(handle, orig_inode); ++ *err = ext4_jbd2_inode_add_write(handle, orig_inode, ++ (loff_t)orig_page_offset << PAGE_SHIFT, replaced_size); + + unlock_pages: + unlock_page(pagep[0]); +diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c +index cd01c4a67ffb..771fe02f317d 100644 +--- a/fs/ext4/namei.c ++++ b/fs/ext4/namei.c +@@ -82,8 +82,18 @@ static struct buffer_head *ext4_append(handle_t *handle, + static int ext4_dx_csum_verify(struct inode *inode, + struct ext4_dir_entry *dirent); + ++/* ++ * Hints to ext4_read_dirblock regarding whether we expect a directory ++ * block being read to be an index block, or a block containing ++ * directory entries (and if the latter, whether it was found via a ++ * logical block in an htree index block). This is used to control ++ * what sort of sanity checkinig ext4_read_dirblock() will do on the ++ * directory block read from the storage device. EITHER will means ++ * the caller doesn't know what kind of directory block will be read, ++ * so no specific verification will be done. ++ */ + typedef enum { +- EITHER, INDEX, DIRENT ++ EITHER, INDEX, DIRENT, DIRENT_HTREE + } dirblock_type_t; + + #define ext4_read_dirblock(inode, block, type) \ +@@ -109,11 +119,14 @@ static struct buffer_head *__ext4_read_dirblock(struct inode *inode, + + return bh; + } +- if (!bh) { ++ if (!bh && (type == INDEX || type == DIRENT_HTREE)) { + ext4_error_inode(inode, func, line, block, +- "Directory hole found"); ++ "Directory hole found for htree %s block", ++ (type == INDEX) ? "index" : "leaf"); + return ERR_PTR(-EFSCORRUPTED); + } ++ if (!bh) ++ return NULL; + dirent = (struct ext4_dir_entry *) bh->b_data; + /* Determine whether or not we have an index block */ + if (is_dx(inode)) { +@@ -980,7 +993,7 @@ static int htree_dirblock_to_tree(struct file *dir_file, + + dxtrace(printk(KERN_INFO "In htree dirblock_to_tree: block %lu\n", + (unsigned long)block)); +- bh = ext4_read_dirblock(dir, block, DIRENT); ++ bh = ext4_read_dirblock(dir, block, DIRENT_HTREE); + if (IS_ERR(bh)) + return PTR_ERR(bh); + +@@ -1586,7 +1599,7 @@ static struct buffer_head * ext4_dx_find_entry(struct inode *dir, + return (struct buffer_head *) frame; + do { + block = dx_get_block(frame->at); +- bh = ext4_read_dirblock(dir, block, DIRENT); ++ bh = ext4_read_dirblock(dir, block, DIRENT_HTREE); + if (IS_ERR(bh)) + goto errout; + +@@ -2170,6 +2183,11 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, + blocks = dir->i_size >> sb->s_blocksize_bits; + for (block = 0; block < blocks; block++) { + bh = ext4_read_dirblock(dir, block, DIRENT); ++ if (bh == NULL) { ++ bh = ext4_bread(handle, dir, block, ++ EXT4_GET_BLOCKS_CREATE); ++ goto add_to_new_block; ++ } + if (IS_ERR(bh)) { + retval = PTR_ERR(bh); + bh = NULL; +@@ -2190,6 +2208,7 @@ static int ext4_add_entry(handle_t *handle, struct dentry *dentry, + brelse(bh); + } + bh = ext4_append(handle, dir, &block); ++add_to_new_block: + if (IS_ERR(bh)) { + retval = PTR_ERR(bh); + bh = NULL; +@@ -2234,7 +2253,7 @@ static int ext4_dx_add_entry(handle_t *handle, struct ext4_filename *fname, + return PTR_ERR(frame); + entries = frame->entries; + at = frame->at; +- bh = ext4_read_dirblock(dir, dx_get_block(frame->at), DIRENT); ++ bh = ext4_read_dirblock(dir, dx_get_block(frame->at), DIRENT_HTREE); + if (IS_ERR(bh)) { + err = PTR_ERR(bh); + bh = NULL; +@@ -2782,7 +2801,10 @@ bool ext4_empty_dir(struct inode *inode) + EXT4_ERROR_INODE(inode, "invalid size"); + return true; + } +- bh = ext4_read_dirblock(inode, 0, EITHER); ++ /* The first directory block must not be a hole, ++ * so treat it as DIRENT_HTREE ++ */ ++ bh = ext4_read_dirblock(inode, 0, DIRENT_HTREE); + if (IS_ERR(bh)) + return true; + +@@ -2804,6 +2826,10 @@ bool ext4_empty_dir(struct inode *inode) + brelse(bh); + lblock = offset >> EXT4_BLOCK_SIZE_BITS(sb); + bh = ext4_read_dirblock(inode, lblock, EITHER); ++ if (bh == NULL) { ++ offset += sb->s_blocksize; ++ continue; ++ } + if (IS_ERR(bh)) + return true; + de = (struct ext4_dir_entry_2 *) bh->b_data; +@@ -3369,7 +3395,10 @@ static struct buffer_head *ext4_get_first_dir_block(handle_t *handle, + struct buffer_head *bh; + + if (!ext4_has_inline_data(inode)) { +- bh = ext4_read_dirblock(inode, 0, EITHER); ++ /* The first directory block must not be a hole, so ++ * treat it as DIRENT_HTREE ++ */ ++ bh = ext4_read_dirblock(inode, 0, DIRENT_HTREE); + if (IS_ERR(bh)) { + *retval = PTR_ERR(bh); + return NULL; +diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c +index ed70b68b2b38..d0539ddad6e2 100644 +--- a/fs/f2fs/checkpoint.c ++++ b/fs/f2fs/checkpoint.c +@@ -832,17 +832,6 @@ static int get_checkpoint_version(struct f2fs_sb_info *sbi, block_t cp_addr, + return -EINVAL; + } + +- if (__is_set_ckpt_flags(*cp_block, CP_LARGE_NAT_BITMAP_FLAG)) { +- if (crc_offset != CP_MIN_CHKSUM_OFFSET) { +- f2fs_put_page(*cp_page, 1); +- f2fs_msg(sbi->sb, KERN_WARNING, +- "layout of large_nat_bitmap is deprecated, " +- "run fsck to repair, chksum_offset: %zu", +- crc_offset); +- return -EINVAL; +- } +- } +- + crc = f2fs_checkpoint_chksum(sbi, *cp_block); + if (crc != cur_cp_crc(*cp_block)) { + f2fs_put_page(*cp_page, 1); +diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c +index eda4181d2092..923923603a7d 100644 +--- a/fs/f2fs/data.c ++++ b/fs/f2fs/data.c +@@ -2262,6 +2262,9 @@ static inline bool __should_serialize_io(struct inode *inode, + return false; + if (IS_NOQUOTA(inode)) + return false; ++ /* to avoid deadlock in path of data flush */ ++ if (F2FS_I(inode)->cp_task) ++ return false; + if (wbc->sync_mode != WB_SYNC_ALL) + return true; + if (get_dirty_pages(inode) >= SM_I(F2FS_I_SB(inode))->min_seq_blocks) +diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h +index 06b89a9862ab..cbdc2f88a98c 100644 +--- a/fs/f2fs/f2fs.h ++++ b/fs/f2fs/f2fs.h +@@ -1207,6 +1207,7 @@ struct f2fs_sb_info { + /* for inode management */ + struct list_head inode_list[NR_INODE_TYPE]; /* dirty inode list */ + spinlock_t inode_lock[NR_INODE_TYPE]; /* for dirty inode list lock */ ++ struct mutex flush_lock; /* for flush exclusion */ + + /* for extent tree cache */ + struct radix_tree_root extent_tree_root;/* cache extent cache entries */ +@@ -1766,8 +1767,12 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, + + if (!__allow_reserved_blocks(sbi, inode, true)) + avail_user_block_count -= F2FS_OPTION(sbi).root_reserved_blocks; +- if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) +- avail_user_block_count -= sbi->unusable_block_count; ++ if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) { ++ if (avail_user_block_count > sbi->unusable_block_count) ++ avail_user_block_count -= sbi->unusable_block_count; ++ else ++ avail_user_block_count = 0; ++ } + if (unlikely(sbi->total_valid_block_count > avail_user_block_count)) { + diff = sbi->total_valid_block_count - avail_user_block_count; + if (diff > *count) +@@ -1967,7 +1972,7 @@ static inline int inc_valid_node_count(struct f2fs_sb_info *sbi, + struct inode *inode, bool is_inode) + { + block_t valid_block_count; +- unsigned int valid_node_count; ++ unsigned int valid_node_count, user_block_count; + int err; + + if (is_inode) { +@@ -1994,10 +1999,11 @@ static inline int inc_valid_node_count(struct f2fs_sb_info *sbi, + + if (!__allow_reserved_blocks(sbi, inode, false)) + valid_block_count += F2FS_OPTION(sbi).root_reserved_blocks; ++ user_block_count = sbi->user_block_count; + if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) +- valid_block_count += sbi->unusable_block_count; ++ user_block_count -= sbi->unusable_block_count; + +- if (unlikely(valid_block_count > sbi->user_block_count)) { ++ if (unlikely(valid_block_count > user_block_count)) { + spin_unlock(&sbi->stat_lock); + goto enospc; + } +@@ -2198,7 +2204,7 @@ static inline bool is_idle(struct f2fs_sb_info *sbi, int type) + get_pages(sbi, F2FS_DIO_WRITE)) + return false; + +- if (SM_I(sbi) && SM_I(sbi)->dcc_info && ++ if (type != DISCARD_TIME && SM_I(sbi) && SM_I(sbi)->dcc_info && + atomic_read(&SM_I(sbi)->dcc_info->queued_discard)) + return false; + +diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c +index 8dee063c833f..ce15fbcd7cff 100644 +--- a/fs/f2fs/segment.c ++++ b/fs/f2fs/segment.c +@@ -546,9 +546,13 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi) + if (test_opt(sbi, DATA_FLUSH)) { + struct blk_plug plug; + ++ mutex_lock(&sbi->flush_lock); ++ + blk_start_plug(&plug); + f2fs_sync_dirty_inodes(sbi, FILE_INODE); + blk_finish_plug(&plug); ++ ++ mutex_unlock(&sbi->flush_lock); + } + f2fs_sync_fs(sbi->sb, true); + stat_inc_bg_cp_count(sbi->stat_info); +@@ -872,7 +876,9 @@ void f2fs_dirty_to_prefree(struct f2fs_sb_info *sbi) + int f2fs_disable_cp_again(struct f2fs_sb_info *sbi) + { + struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); +- block_t ovp = overprovision_segments(sbi) << sbi->log_blocks_per_seg; ++ int ovp_hole_segs = ++ (overprovision_segments(sbi) - reserved_segments(sbi)); ++ block_t ovp_holes = ovp_hole_segs << sbi->log_blocks_per_seg; + block_t holes[2] = {0, 0}; /* DATA and NODE */ + struct seg_entry *se; + unsigned int segno; +@@ -887,10 +893,10 @@ int f2fs_disable_cp_again(struct f2fs_sb_info *sbi) + } + mutex_unlock(&dirty_i->seglist_lock); + +- if (holes[DATA] > ovp || holes[NODE] > ovp) ++ if (holes[DATA] > ovp_holes || holes[NODE] > ovp_holes) + return -EAGAIN; + if (is_sbi_flag_set(sbi, SBI_CP_DISABLED_QUICK) && +- dirty_segments(sbi) > overprovision_segments(sbi)) ++ dirty_segments(sbi) > ovp_hole_segs) + return -EAGAIN; + return 0; + } +@@ -1480,6 +1486,10 @@ static int __issue_discard_cmd(struct f2fs_sb_info *sbi, + list_for_each_entry_safe(dc, tmp, pend_list, list) { + f2fs_bug_on(sbi, dc->state != D_PREP); + ++ if (dpolicy->timeout != 0 && ++ f2fs_time_over(sbi, dpolicy->timeout)) ++ break; ++ + if (dpolicy->io_aware && i < dpolicy->io_aware_gran && + !is_idle(sbi, DISCARD_TIME)) { + io_interrupted = true; +@@ -3393,6 +3403,11 @@ static int read_compacted_summaries(struct f2fs_sb_info *sbi) + seg_i = CURSEG_I(sbi, i); + segno = le32_to_cpu(ckpt->cur_data_segno[i]); + blk_off = le16_to_cpu(ckpt->cur_data_blkoff[i]); ++ if (blk_off > ENTRIES_IN_SUM) { ++ f2fs_bug_on(sbi, 1); ++ f2fs_put_page(page, 1); ++ return -EFAULT; ++ } + seg_i->next_segno = segno; + reset_curseg(sbi, i, 0); + seg_i->alloc_type = ckpt->alloc_type[i]; +diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c +index 6b959bbb336a..4b47ac994daf 100644 +--- a/fs/f2fs/super.c ++++ b/fs/f2fs/super.c +@@ -2718,6 +2718,15 @@ int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi) + return 1; + } + ++ if (__is_set_ckpt_flags(ckpt, CP_LARGE_NAT_BITMAP_FLAG) && ++ le32_to_cpu(ckpt->checksum_offset) != CP_MIN_CHKSUM_OFFSET) { ++ f2fs_msg(sbi->sb, KERN_WARNING, ++ "layout of large_nat_bitmap is deprecated, " ++ "run fsck to repair, chksum_offset: %u", ++ le32_to_cpu(ckpt->checksum_offset)); ++ return 1; ++ } ++ + if (unlikely(f2fs_cp_error(sbi))) { + f2fs_msg(sbi->sb, KERN_ERR, "A bug case: need to run fsck"); + return 1; +@@ -3287,6 +3296,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent) + INIT_LIST_HEAD(&sbi->inode_list[i]); + spin_lock_init(&sbi->inode_lock[i]); + } ++ mutex_init(&sbi->flush_lock); + + f2fs_init_extent_cache_info(sbi); + +diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c +index e41cbe8e81b9..9ebfb1b28430 100644 +--- a/fs/fs-writeback.c ++++ b/fs/fs-writeback.c +@@ -715,6 +715,7 @@ void wbc_detach_inode(struct writeback_control *wbc) + void wbc_account_io(struct writeback_control *wbc, struct page *page, + size_t bytes) + { ++ struct cgroup_subsys_state *css; + int id; + + /* +@@ -726,7 +727,12 @@ void wbc_account_io(struct writeback_control *wbc, struct page *page, + if (!wbc->wb) + return; + +- id = mem_cgroup_css_from_page(page)->id; ++ css = mem_cgroup_css_from_page(page); ++ /* dead cgroups shouldn't contribute to inode ownership arbitration */ ++ if (!(css->flags & CSS_ONLINE)) ++ return; ++ ++ id = css->id; + + if (id == wbc->wb_id) { + wbc->wb_bytes += bytes; +diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c +index 93ea1d529aa3..253e2f939d5f 100644 +--- a/fs/gfs2/bmap.c ++++ b/fs/gfs2/bmap.c +@@ -390,6 +390,19 @@ static int fillup_metapath(struct gfs2_inode *ip, struct metapath *mp, int h) + return mp->mp_aheight - x - 1; + } + ++static sector_t metapath_to_block(struct gfs2_sbd *sdp, struct metapath *mp) ++{ ++ sector_t factor = 1, block = 0; ++ int hgt; ++ ++ for (hgt = mp->mp_fheight - 1; hgt >= 0; hgt--) { ++ if (hgt < mp->mp_aheight) ++ block += mp->mp_list[hgt] * factor; ++ factor *= sdp->sd_inptrs; ++ } ++ return block; ++} ++ + static void release_metapath(struct metapath *mp) + { + int i; +@@ -430,60 +443,84 @@ static inline unsigned int gfs2_extent_length(struct buffer_head *bh, __be64 *pt + return ptr - first; + } + +-typedef const __be64 *(*gfs2_metadata_walker)( +- struct metapath *mp, +- const __be64 *start, const __be64 *end, +- u64 factor, void *data); ++enum walker_status { WALK_STOP, WALK_FOLLOW, WALK_CONTINUE }; + +-#define WALK_STOP ((__be64 *)0) +-#define WALK_NEXT ((__be64 *)1) ++/* ++ * gfs2_metadata_walker - walk an indirect block ++ * @mp: Metapath to indirect block ++ * @ptrs: Number of pointers to look at ++ * ++ * When returning WALK_FOLLOW, the walker must update @mp to point at the right ++ * indirect block to follow. ++ */ ++typedef enum walker_status (*gfs2_metadata_walker)(struct metapath *mp, ++ unsigned int ptrs); + +-static int gfs2_walk_metadata(struct inode *inode, sector_t lblock, +- u64 len, struct metapath *mp, gfs2_metadata_walker walker, +- void *data) ++/* ++ * gfs2_walk_metadata - walk a tree of indirect blocks ++ * @inode: The inode ++ * @mp: Starting point of walk ++ * @max_len: Maximum number of blocks to walk ++ * @walker: Called during the walk ++ * ++ * Returns 1 if the walk was stopped by @walker, 0 if we went past @max_len or ++ * past the end of metadata, and a negative error code otherwise. ++ */ ++ ++static int gfs2_walk_metadata(struct inode *inode, struct metapath *mp, ++ u64 max_len, gfs2_metadata_walker walker) + { +- struct metapath clone; + struct gfs2_inode *ip = GFS2_I(inode); + struct gfs2_sbd *sdp = GFS2_SB(inode); +- const __be64 *start, *end, *ptr; + u64 factor = 1; + unsigned int hgt; +- int ret = 0; ++ int ret; + +- for (hgt = ip->i_height - 1; hgt >= mp->mp_aheight; hgt--) ++ /* ++ * The walk starts in the lowest allocated indirect block, which may be ++ * before the position indicated by @mp. Adjust @max_len accordingly ++ * to avoid a short walk. ++ */ ++ for (hgt = mp->mp_fheight - 1; hgt >= mp->mp_aheight; hgt--) { ++ max_len += mp->mp_list[hgt] * factor; ++ mp->mp_list[hgt] = 0; + factor *= sdp->sd_inptrs; ++ } + + for (;;) { +- u64 step; ++ u16 start = mp->mp_list[hgt]; ++ enum walker_status status; ++ unsigned int ptrs; ++ u64 len; + + /* Walk indirect block. */ +- start = metapointer(hgt, mp); +- end = metaend(hgt, mp); +- +- step = (end - start) * factor; +- if (step > len) +- end = start + DIV_ROUND_UP_ULL(len, factor); +- +- ptr = walker(mp, start, end, factor, data); +- if (ptr == WALK_STOP) ++ ptrs = (hgt >= 1 ? sdp->sd_inptrs : sdp->sd_diptrs) - start; ++ len = ptrs * factor; ++ if (len > max_len) ++ ptrs = DIV_ROUND_UP_ULL(max_len, factor); ++ status = walker(mp, ptrs); ++ switch (status) { ++ case WALK_STOP: ++ return 1; ++ case WALK_FOLLOW: ++ BUG_ON(mp->mp_aheight == mp->mp_fheight); ++ ptrs = mp->mp_list[hgt] - start; ++ len = ptrs * factor; + break; +- if (step >= len) ++ case WALK_CONTINUE: + break; +- len -= step; +- if (ptr != WALK_NEXT) { +- BUG_ON(!*ptr); +- mp->mp_list[hgt] += ptr - start; +- goto fill_up_metapath; + } ++ if (len >= max_len) ++ break; ++ max_len -= len; ++ if (status == WALK_FOLLOW) ++ goto fill_up_metapath; + + lower_metapath: + /* Decrease height of metapath. */ +- if (mp != &clone) { +- clone_metapath(&clone, mp); +- mp = &clone; +- } + brelse(mp->mp_bh[hgt]); + mp->mp_bh[hgt] = NULL; ++ mp->mp_list[hgt] = 0; + if (!hgt) + break; + hgt--; +@@ -491,10 +528,7 @@ static int gfs2_walk_metadata(struct inode *inode, sector_t lblock, + + /* Advance in metadata tree. */ + (mp->mp_list[hgt])++; +- start = metapointer(hgt, mp); +- end = metaend(hgt, mp); +- if (start >= end) { +- mp->mp_list[hgt] = 0; ++ if (mp->mp_list[hgt] >= sdp->sd_inptrs) { + if (!hgt) + break; + goto lower_metapath; +@@ -502,44 +536,36 @@ static int gfs2_walk_metadata(struct inode *inode, sector_t lblock, + + fill_up_metapath: + /* Increase height of metapath. */ +- if (mp != &clone) { +- clone_metapath(&clone, mp); +- mp = &clone; +- } + ret = fillup_metapath(ip, mp, ip->i_height - 1); + if (ret < 0) +- break; ++ return ret; + hgt += ret; + for (; ret; ret--) + do_div(factor, sdp->sd_inptrs); + mp->mp_aheight = hgt + 1; + } +- if (mp == &clone) +- release_metapath(mp); +- return ret; ++ return 0; + } + +-struct gfs2_hole_walker_args { +- u64 blocks; +-}; +- +-static const __be64 *gfs2_hole_walker(struct metapath *mp, +- const __be64 *start, const __be64 *end, +- u64 factor, void *data) ++static enum walker_status gfs2_hole_walker(struct metapath *mp, ++ unsigned int ptrs) + { +- struct gfs2_hole_walker_args *args = data; +- const __be64 *ptr; ++ const __be64 *start, *ptr, *end; ++ unsigned int hgt; ++ ++ hgt = mp->mp_aheight - 1; ++ start = metapointer(hgt, mp); ++ end = start + ptrs; + + for (ptr = start; ptr < end; ptr++) { + if (*ptr) { +- args->blocks += (ptr - start) * factor; ++ mp->mp_list[hgt] += ptr - start; + if (mp->mp_aheight == mp->mp_fheight) + return WALK_STOP; +- return ptr; /* increase height */ ++ return WALK_FOLLOW; + } + } +- args->blocks += (end - start) * factor; +- return WALK_NEXT; ++ return WALK_CONTINUE; + } + + /** +@@ -557,12 +583,24 @@ static const __be64 *gfs2_hole_walker(struct metapath *mp, + static int gfs2_hole_size(struct inode *inode, sector_t lblock, u64 len, + struct metapath *mp, struct iomap *iomap) + { +- struct gfs2_hole_walker_args args = { }; +- int ret = 0; ++ struct metapath clone; ++ u64 hole_size; ++ int ret; + +- ret = gfs2_walk_metadata(inode, lblock, len, mp, gfs2_hole_walker, &args); +- if (!ret) +- iomap->length = args.blocks << inode->i_blkbits; ++ clone_metapath(&clone, mp); ++ ret = gfs2_walk_metadata(inode, &clone, len, gfs2_hole_walker); ++ if (ret < 0) ++ goto out; ++ ++ if (ret == 1) ++ hole_size = metapath_to_block(GFS2_SB(inode), &clone) - lblock; ++ else ++ hole_size = len; ++ iomap->length = hole_size << inode->i_blkbits; ++ ret = 0; ++ ++out: ++ release_metapath(&clone); + return ret; + } + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index 4ef62a45045d..3e887a09533b 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -231,6 +231,7 @@ struct io_ring_ctx { + struct task_struct *sqo_thread; /* if using sq thread polling */ + struct mm_struct *sqo_mm; + wait_queue_head_t sqo_wait; ++ struct completion sqo_thread_started; + + struct { + /* CQ ring */ +@@ -330,6 +331,9 @@ struct io_kiocb { + #define REQ_F_SEQ_PREV 8 /* sequential with previous */ + #define REQ_F_IO_DRAIN 16 /* drain existing IO first */ + #define REQ_F_IO_DRAINED 32 /* drain done */ ++#define REQ_F_LINK 64 /* linked sqes */ ++#define REQ_F_LINK_DONE 128 /* linked sqes done */ ++#define REQ_F_FAIL_LINK 256 /* fail rest of links */ + u64 user_data; + u32 error; /* iopoll result from callback */ + u32 sequence; +@@ -403,6 +407,7 @@ static struct io_ring_ctx *io_ring_ctx_alloc(struct io_uring_params *p) + ctx->flags = p->flags; + init_waitqueue_head(&ctx->cq_wait); + init_completion(&ctx->ctx_done); ++ init_completion(&ctx->sqo_thread_started); + mutex_init(&ctx->uring_lock); + init_waitqueue_head(&ctx->wait); + for (i = 0; i < ARRAY_SIZE(ctx->pending_async); i++) { +@@ -423,7 +428,7 @@ static inline bool io_sequence_defer(struct io_ring_ctx *ctx, + if ((req->flags & (REQ_F_IO_DRAIN|REQ_F_IO_DRAINED)) != REQ_F_IO_DRAIN) + return false; + +- return req->sequence > ctx->cached_cq_tail + ctx->sq_ring->dropped; ++ return req->sequence != ctx->cached_cq_tail + ctx->sq_ring->dropped; + } + + static struct io_kiocb *io_get_deferred_req(struct io_ring_ctx *ctx) +@@ -996,8 +1001,43 @@ static int io_import_fixed(struct io_ring_ctx *ctx, int rw, + */ + offset = buf_addr - imu->ubuf; + iov_iter_bvec(iter, rw, imu->bvec, imu->nr_bvecs, offset + len); +- if (offset) +- iov_iter_advance(iter, offset); ++ ++ if (offset) { ++ /* ++ * Don't use iov_iter_advance() here, as it's really slow for ++ * using the latter parts of a big fixed buffer - it iterates ++ * over each segment manually. We can cheat a bit here, because ++ * we know that: ++ * ++ * 1) it's a BVEC iter, we set it up ++ * 2) all bvecs are PAGE_SIZE in size, except potentially the ++ * first and last bvec ++ * ++ * So just find our index, and adjust the iterator afterwards. ++ * If the offset is within the first bvec (or the whole first ++ * bvec, just use iov_iter_advance(). This makes it easier ++ * since we can just skip the first segment, which may not ++ * be PAGE_SIZE aligned. ++ */ ++ const struct bio_vec *bvec = imu->bvec; ++ ++ if (offset <= bvec->bv_len) { ++ iov_iter_advance(iter, offset); ++ } else { ++ unsigned long seg_skip; ++ ++ /* skip first vec */ ++ offset -= bvec->bv_len; ++ seg_skip = 1 + (offset >> PAGE_SHIFT); ++ ++ iter->bvec = bvec + seg_skip; ++ iter->nr_segs -= seg_skip; ++ iter->count -= (seg_skip << PAGE_SHIFT); ++ iter->iov_offset = offset & ~PAGE_MASK; ++ if (iter->iov_offset) ++ iter->count -= iter->iov_offset; ++ } ++ } + + /* don't drop a reference to these pages */ + iter->type |= ITER_BVEC_FLAG_NO_REF; +@@ -1487,6 +1527,8 @@ static int io_poll_add(struct io_kiocb *req, const struct io_uring_sqe *sqe) + INIT_LIST_HEAD(&poll->wait.entry); + init_waitqueue_func_entry(&poll->wait, io_poll_wake); + ++ INIT_LIST_HEAD(&req->list); ++ + mask = vfs_poll(poll->file, &ipt.pt) & poll->events; + + spin_lock_irq(&ctx->completion_lock); +@@ -1650,6 +1692,7 @@ static void io_sq_wq_submit_work(struct work_struct *work) + do { + struct sqe_submit *s = &req->submit; + const struct io_uring_sqe *sqe = s->sqe; ++ unsigned int flags = req->flags; + + /* Ensure we clear previously set non-block flag */ + req->rw.ki_flags &= ~IOCB_NOWAIT; +@@ -1694,6 +1737,10 @@ static void io_sq_wq_submit_work(struct work_struct *work) + /* async context always use a copy of the sqe */ + kfree(sqe); + ++ /* req from defer and link list needn't decrease async cnt */ ++ if (flags & (REQ_F_IO_DRAINED | REQ_F_LINK_DONE)) ++ goto out; ++ + if (!async_list) + break; + if (!list_empty(&req_list)) { +@@ -1741,6 +1788,7 @@ static void io_sq_wq_submit_work(struct work_struct *work) + } + } + ++out: + if (cur_mm) { + set_fs(old_fs); + unuse_mm(cur_mm); +@@ -1767,6 +1815,10 @@ static bool io_add_to_prev_work(struct async_list *list, struct io_kiocb *req) + ret = true; + spin_lock(&list->lock); + list_add_tail(&req->list, &list->list); ++ /* ++ * Ensure we see a simultaneous modification from io_sq_wq_submit_work() ++ */ ++ smp_mb(); + if (!atomic_read(&list->cnt)) { + list_del_init(&req->list); + ret = false; +@@ -2009,6 +2061,8 @@ static int io_sq_thread(void *data) + unsigned inflight; + unsigned long timeout; + ++ complete(&ctx->sqo_thread_started); ++ + old_fs = get_fs(); + set_fs(USER_DS); + +@@ -2243,6 +2297,7 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx) + static void io_sq_thread_stop(struct io_ring_ctx *ctx) + { + if (ctx->sqo_thread) { ++ wait_for_completion(&ctx->sqo_thread_started); + /* + * The park is a bit of a work-around, without it we get + * warning spews on shutdown with SQPOLL set and affinity +diff --git a/fs/iomap.c b/fs/iomap.c +index 12654c2e78f8..da961fca3180 100644 +--- a/fs/iomap.c ++++ b/fs/iomap.c +@@ -333,7 +333,7 @@ iomap_readpage_actor(struct inode *inode, loff_t pos, loff_t length, void *data, + if (iop) + atomic_inc(&iop->read_count); + +- if (!ctx->bio || !is_contig || bio_full(ctx->bio)) { ++ if (!ctx->bio || !is_contig || bio_full(ctx->bio, plen)) { + gfp_t gfp = mapping_gfp_constraint(page->mapping, GFP_KERNEL); + int nr_vecs = (length + PAGE_SIZE - 1) >> PAGE_SHIFT; + +diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c +index efd0ce9489ae..668f9021cf11 100644 +--- a/fs/jbd2/commit.c ++++ b/fs/jbd2/commit.c +@@ -187,14 +187,15 @@ static int journal_wait_on_commit_record(journal_t *journal, + * use writepages() because with dealyed allocation we may be doing + * block allocation in writepages(). + */ +-static int journal_submit_inode_data_buffers(struct address_space *mapping) ++static int journal_submit_inode_data_buffers(struct address_space *mapping, ++ loff_t dirty_start, loff_t dirty_end) + { + int ret; + struct writeback_control wbc = { + .sync_mode = WB_SYNC_ALL, + .nr_to_write = mapping->nrpages * 2, +- .range_start = 0, +- .range_end = i_size_read(mapping->host), ++ .range_start = dirty_start, ++ .range_end = dirty_end, + }; + + ret = generic_writepages(mapping, &wbc); +@@ -218,6 +219,9 @@ static int journal_submit_data_buffers(journal_t *journal, + + spin_lock(&journal->j_list_lock); + list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { ++ loff_t dirty_start = jinode->i_dirty_start; ++ loff_t dirty_end = jinode->i_dirty_end; ++ + if (!(jinode->i_flags & JI_WRITE_DATA)) + continue; + mapping = jinode->i_vfs_inode->i_mapping; +@@ -230,7 +234,8 @@ static int journal_submit_data_buffers(journal_t *journal, + * only allocated blocks here. + */ + trace_jbd2_submit_inode_data(jinode->i_vfs_inode); +- err = journal_submit_inode_data_buffers(mapping); ++ err = journal_submit_inode_data_buffers(mapping, dirty_start, ++ dirty_end); + if (!ret) + ret = err; + spin_lock(&journal->j_list_lock); +@@ -257,12 +262,16 @@ static int journal_finish_inode_data_buffers(journal_t *journal, + /* For locking, see the comment in journal_submit_data_buffers() */ + spin_lock(&journal->j_list_lock); + list_for_each_entry(jinode, &commit_transaction->t_inode_list, i_list) { ++ loff_t dirty_start = jinode->i_dirty_start; ++ loff_t dirty_end = jinode->i_dirty_end; ++ + if (!(jinode->i_flags & JI_WAIT_DATA)) + continue; + jinode->i_flags |= JI_COMMIT_RUNNING; + spin_unlock(&journal->j_list_lock); +- err = filemap_fdatawait_keep_errors( +- jinode->i_vfs_inode->i_mapping); ++ err = filemap_fdatawait_range_keep_errors( ++ jinode->i_vfs_inode->i_mapping, dirty_start, ++ dirty_end); + if (!ret) + ret = err; + spin_lock(&journal->j_list_lock); +@@ -282,6 +291,8 @@ static int journal_finish_inode_data_buffers(journal_t *journal, + &jinode->i_transaction->t_inode_list); + } else { + jinode->i_transaction = NULL; ++ jinode->i_dirty_start = 0; ++ jinode->i_dirty_end = 0; + } + } + spin_unlock(&journal->j_list_lock); +diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c +index 43df0c943229..e0382067c824 100644 +--- a/fs/jbd2/journal.c ++++ b/fs/jbd2/journal.c +@@ -94,6 +94,8 @@ EXPORT_SYMBOL(jbd2_journal_try_to_free_buffers); + EXPORT_SYMBOL(jbd2_journal_force_commit); + EXPORT_SYMBOL(jbd2_journal_inode_add_write); + EXPORT_SYMBOL(jbd2_journal_inode_add_wait); ++EXPORT_SYMBOL(jbd2_journal_inode_ranged_write); ++EXPORT_SYMBOL(jbd2_journal_inode_ranged_wait); + EXPORT_SYMBOL(jbd2_journal_init_jbd_inode); + EXPORT_SYMBOL(jbd2_journal_release_jbd_inode); + EXPORT_SYMBOL(jbd2_journal_begin_ordered_truncate); +@@ -2574,6 +2576,8 @@ void jbd2_journal_init_jbd_inode(struct jbd2_inode *jinode, struct inode *inode) + jinode->i_next_transaction = NULL; + jinode->i_vfs_inode = inode; + jinode->i_flags = 0; ++ jinode->i_dirty_start = 0; ++ jinode->i_dirty_end = 0; + INIT_LIST_HEAD(&jinode->i_list); + } + +diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c +index 8ca4fddc705f..990e7b5062e7 100644 +--- a/fs/jbd2/transaction.c ++++ b/fs/jbd2/transaction.c +@@ -2565,7 +2565,7 @@ void jbd2_journal_refile_buffer(journal_t *journal, struct journal_head *jh) + * File inode in the inode list of the handle's transaction + */ + static int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode, +- unsigned long flags) ++ unsigned long flags, loff_t start_byte, loff_t end_byte) + { + transaction_t *transaction = handle->h_transaction; + journal_t *journal; +@@ -2577,26 +2577,17 @@ static int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode, + jbd_debug(4, "Adding inode %lu, tid:%d\n", jinode->i_vfs_inode->i_ino, + transaction->t_tid); + +- /* +- * First check whether inode isn't already on the transaction's +- * lists without taking the lock. Note that this check is safe +- * without the lock as we cannot race with somebody removing inode +- * from the transaction. The reason is that we remove inode from the +- * transaction only in journal_release_jbd_inode() and when we commit +- * the transaction. We are guarded from the first case by holding +- * a reference to the inode. We are safe against the second case +- * because if jinode->i_transaction == transaction, commit code +- * cannot touch the transaction because we hold reference to it, +- * and if jinode->i_next_transaction == transaction, commit code +- * will only file the inode where we want it. +- */ +- if ((jinode->i_transaction == transaction || +- jinode->i_next_transaction == transaction) && +- (jinode->i_flags & flags) == flags) +- return 0; +- + spin_lock(&journal->j_list_lock); + jinode->i_flags |= flags; ++ ++ if (jinode->i_dirty_end) { ++ jinode->i_dirty_start = min(jinode->i_dirty_start, start_byte); ++ jinode->i_dirty_end = max(jinode->i_dirty_end, end_byte); ++ } else { ++ jinode->i_dirty_start = start_byte; ++ jinode->i_dirty_end = end_byte; ++ } ++ + /* Is inode already attached where we need it? */ + if (jinode->i_transaction == transaction || + jinode->i_next_transaction == transaction) +@@ -2631,12 +2622,28 @@ static int jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *jinode, + int jbd2_journal_inode_add_write(handle_t *handle, struct jbd2_inode *jinode) + { + return jbd2_journal_file_inode(handle, jinode, +- JI_WRITE_DATA | JI_WAIT_DATA); ++ JI_WRITE_DATA | JI_WAIT_DATA, 0, LLONG_MAX); + } + + int jbd2_journal_inode_add_wait(handle_t *handle, struct jbd2_inode *jinode) + { +- return jbd2_journal_file_inode(handle, jinode, JI_WAIT_DATA); ++ return jbd2_journal_file_inode(handle, jinode, JI_WAIT_DATA, 0, ++ LLONG_MAX); ++} ++ ++int jbd2_journal_inode_ranged_write(handle_t *handle, ++ struct jbd2_inode *jinode, loff_t start_byte, loff_t length) ++{ ++ return jbd2_journal_file_inode(handle, jinode, ++ JI_WRITE_DATA | JI_WAIT_DATA, start_byte, ++ start_byte + length - 1); ++} ++ ++int jbd2_journal_inode_ranged_wait(handle_t *handle, struct jbd2_inode *jinode, ++ loff_t start_byte, loff_t length) ++{ ++ return jbd2_journal_file_inode(handle, jinode, JI_WAIT_DATA, ++ start_byte, start_byte + length - 1); + } + + /* +diff --git a/fs/nfs/client.c b/fs/nfs/client.c +index d7e4f0848e28..4d90f5bf0b0a 100644 +--- a/fs/nfs/client.c ++++ b/fs/nfs/client.c +@@ -406,10 +406,10 @@ struct nfs_client *nfs_get_client(const struct nfs_client_initdata *cl_init) + clp = nfs_match_client(cl_init); + if (clp) { + spin_unlock(&nn->nfs_client_lock); +- if (IS_ERR(clp)) +- return clp; + if (new) + new->rpc_ops->free_client(new); ++ if (IS_ERR(clp)) ++ return clp; + return nfs_found_client(cl_init, clp); + } + if (new) { +diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c +index 0ff3facf81da..0af854cce8ff 100644 +--- a/fs/nfs/delegation.c ++++ b/fs/nfs/delegation.c +@@ -153,7 +153,7 @@ static int nfs_delegation_claim_opens(struct inode *inode, + /* Block nfs4_proc_unlck */ + mutex_lock(&sp->so_delegreturn_mutex); + seq = raw_seqcount_begin(&sp->so_reclaim_seqcount); +- err = nfs4_open_delegation_recall(ctx, state, stateid, type); ++ err = nfs4_open_delegation_recall(ctx, state, stateid); + if (!err) + err = nfs_delegation_claim_locks(state, stateid); + if (!err && read_seqcount_retry(&sp->so_reclaim_seqcount, seq)) +diff --git a/fs/nfs/delegation.h b/fs/nfs/delegation.h +index 5799777df5ec..9eb87ae4c982 100644 +--- a/fs/nfs/delegation.h ++++ b/fs/nfs/delegation.h +@@ -63,7 +63,7 @@ void nfs_reap_expired_delegations(struct nfs_client *clp); + + /* NFSv4 delegation-related procedures */ + int nfs4_proc_delegreturn(struct inode *inode, const struct cred *cred, const nfs4_stateid *stateid, int issync); +-int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid, fmode_t type); ++int nfs4_open_delegation_recall(struct nfs_open_context *ctx, struct nfs4_state *state, const nfs4_stateid *stateid); + int nfs4_lock_delegation_recall(struct file_lock *fl, struct nfs4_state *state, const nfs4_stateid *stateid); + bool nfs4_copy_delegation_stateid(struct inode *inode, fmode_t flags, nfs4_stateid *dst, const struct cred **cred); + bool nfs4_refresh_delegation_stateid(nfs4_stateid *dst, struct inode *inode); +diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c +index 57b6a45576ad..9f44ddc34c7b 100644 +--- a/fs/nfs/dir.c ++++ b/fs/nfs/dir.c +@@ -140,19 +140,12 @@ struct nfs_cache_array { + struct nfs_cache_array_entry array[0]; + }; + +-struct readdirvec { +- unsigned long nr; +- unsigned long index; +- struct page *pages[NFS_MAX_READDIR_RAPAGES]; +-}; +- + typedef int (*decode_dirent_t)(struct xdr_stream *, struct nfs_entry *, bool); + typedef struct { + struct file *file; + struct page *page; + struct dir_context *ctx; + unsigned long page_index; +- struct readdirvec pvec; + u64 *dir_cookie; + u64 last_cookie; + loff_t current_index; +@@ -532,10 +525,6 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en + struct nfs_cache_array *array; + unsigned int count = 0; + int status; +- int max_rapages = NFS_MAX_READDIR_RAPAGES; +- +- desc->pvec.index = desc->page_index; +- desc->pvec.nr = 0; + + scratch = alloc_page(GFP_KERNEL); + if (scratch == NULL) +@@ -560,40 +549,20 @@ int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *en + if (desc->plus) + nfs_prime_dcache(file_dentry(desc->file), entry); + +- status = nfs_readdir_add_to_array(entry, desc->pvec.pages[desc->pvec.nr]); +- if (status == -ENOSPC) { +- desc->pvec.nr++; +- if (desc->pvec.nr == max_rapages) +- break; +- status = nfs_readdir_add_to_array(entry, desc->pvec.pages[desc->pvec.nr]); +- } ++ status = nfs_readdir_add_to_array(entry, page); + if (status != 0) + break; + } while (!entry->eof); + +- /* +- * page and desc->pvec.pages[0] are valid, don't need to check +- * whether or not to be NULL. +- */ +- copy_highpage(page, desc->pvec.pages[0]); +- + out_nopages: + if (count == 0 || (status == -EBADCOOKIE && entry->eof != 0)) { +- array = kmap_atomic(desc->pvec.pages[desc->pvec.nr]); ++ array = kmap(page); + array->eof_index = array->size; + status = 0; +- kunmap_atomic(array); ++ kunmap(page); + } + + put_page(scratch); +- +- /* +- * desc->pvec.nr > 0 means at least one page was completely filled, +- * we should return -ENOSPC. Otherwise function +- * nfs_readdir_xdr_to_array will enter infinite loop. +- */ +- if (desc->pvec.nr > 0) +- return -ENOSPC; + return status; + } + +@@ -627,24 +596,6 @@ int nfs_readdir_alloc_pages(struct page **pages, unsigned int npages) + return -ENOMEM; + } + +-/* +- * nfs_readdir_rapages_init initialize rapages by nfs_cache_array structure. +- */ +-static +-void nfs_readdir_rapages_init(nfs_readdir_descriptor_t *desc) +-{ +- struct nfs_cache_array *array; +- int max_rapages = NFS_MAX_READDIR_RAPAGES; +- int index; +- +- for (index = 0; index < max_rapages; index++) { +- array = kmap_atomic(desc->pvec.pages[index]); +- memset(array, 0, sizeof(struct nfs_cache_array)); +- array->eof_index = -1; +- kunmap_atomic(array); +- } +-} +- + static + int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, struct inode *inode) + { +@@ -655,12 +606,6 @@ int nfs_readdir_xdr_to_array(nfs_readdir_descriptor_t *desc, struct page *page, + int status = -ENOMEM; + unsigned int array_size = ARRAY_SIZE(pages); + +- /* +- * This means we hit readdir rdpages miss, the preallocated rdpages +- * are useless, the preallocate rdpages should be reinitialized. +- */ +- nfs_readdir_rapages_init(desc); +- + entry.prev_cookie = 0; + entry.cookie = desc->last_cookie; + entry.eof = 0; +@@ -721,24 +666,9 @@ int nfs_readdir_filler(void *data, struct page* page) + struct inode *inode = file_inode(desc->file); + int ret; + +- /* +- * If desc->page_index in range desc->pvec.index and +- * desc->pvec.index + desc->pvec.nr, we get readdir cache hit. +- */ +- if (desc->page_index >= desc->pvec.index && +- desc->page_index < (desc->pvec.index + desc->pvec.nr)) { +- /* +- * page and desc->pvec.pages[x] are valid, don't need to check +- * whether or not to be NULL. +- */ +- copy_highpage(page, desc->pvec.pages[desc->page_index - desc->pvec.index]); +- ret = 0; +- } else { +- ret = nfs_readdir_xdr_to_array(desc, page, inode); +- if (ret < 0) +- goto error; +- } +- ++ ret = nfs_readdir_xdr_to_array(desc, page, inode); ++ if (ret < 0) ++ goto error; + SetPageUptodate(page); + + if (invalidate_inode_pages2_range(inode->i_mapping, page->index + 1, -1) < 0) { +@@ -903,7 +833,6 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) + *desc = &my_desc; + struct nfs_open_dir_context *dir_ctx = file->private_data; + int res = 0; +- int max_rapages = NFS_MAX_READDIR_RAPAGES; + + dfprintk(FILE, "NFS: readdir(%pD2) starting at cookie %llu\n", + file, (long long)ctx->pos); +@@ -923,12 +852,6 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) + desc->decode = NFS_PROTO(inode)->decode_dirent; + desc->plus = nfs_use_readdirplus(inode, ctx); + +- res = nfs_readdir_alloc_pages(desc->pvec.pages, max_rapages); +- if (res < 0) +- return -ENOMEM; +- +- nfs_readdir_rapages_init(desc); +- + if (ctx->pos == 0 || nfs_attribute_cache_expired(inode)) + res = nfs_revalidate_mapping(inode, file->f_mapping); + if (res < 0) +@@ -964,7 +887,6 @@ static int nfs_readdir(struct file *file, struct dir_context *ctx) + break; + } while (!desc->eof); + out: +- nfs_readdir_free_pages(desc->pvec.pages, max_rapages); + if (res > 0) + res = 0; + dfprintk(FILE, "NFS: readdir(%pD2) returns %d\n", file, res); +diff --git a/fs/nfs/flexfilelayout/flexfilelayoutdev.c b/fs/nfs/flexfilelayout/flexfilelayoutdev.c +index 19f856f45689..3eda40a320a5 100644 +--- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c ++++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c +@@ -257,7 +257,7 @@ int ff_layout_track_ds_error(struct nfs4_flexfile_layout *flo, + if (status == 0) + return 0; + +- if (mirror->mirror_ds == NULL) ++ if (IS_ERR_OR_NULL(mirror->mirror_ds)) + return -EINVAL; + + dserr = kmalloc(sizeof(*dserr), gfp_flags); +diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c +index 0b4a1a974411..53777813ca95 100644 +--- a/fs/nfs/inode.c ++++ b/fs/nfs/inode.c +@@ -1100,6 +1100,7 @@ int nfs_open(struct inode *inode, struct file *filp) + nfs_fscache_open_file(inode, filp); + return 0; + } ++EXPORT_SYMBOL_GPL(nfs_open); + + /* + * This function is called whenever some part of NFS notices that +diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h +index 498fab72f70b..81e2fdff227e 100644 +--- a/fs/nfs/internal.h ++++ b/fs/nfs/internal.h +@@ -69,8 +69,7 @@ struct nfs_clone_mount { + * Maximum number of pages that readdir can use for creating + * a vmapped array of pages. + */ +-#define NFS_MAX_READDIR_PAGES 64 +-#define NFS_MAX_READDIR_RAPAGES 8 ++#define NFS_MAX_READDIR_PAGES 8 + + struct nfs_client_initdata { + unsigned long init_flags; +diff --git a/fs/nfs/nfs4file.c b/fs/nfs/nfs4file.c +index cf42a8b939e3..3a507c42c1ca 100644 +--- a/fs/nfs/nfs4file.c ++++ b/fs/nfs/nfs4file.c +@@ -49,7 +49,7 @@ nfs4_file_open(struct inode *inode, struct file *filp) + return err; + + if ((openflags & O_ACCMODE) == 3) +- openflags--; ++ return nfs_open(inode, filp); + + /* We can't create new files here */ + openflags &= ~(O_CREAT|O_EXCL); +diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c +index 6418cb6c079b..63edda145d1b 100644 +--- a/fs/nfs/nfs4proc.c ++++ b/fs/nfs/nfs4proc.c +@@ -1878,8 +1878,9 @@ _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data) + if (data->o_res.delegation_type != 0) + nfs4_opendata_check_deleg(data, state); + update: +- update_open_stateid(state, &data->o_res.stateid, NULL, +- data->o_arg.fmode); ++ if (!update_open_stateid(state, &data->o_res.stateid, ++ NULL, data->o_arg.fmode)) ++ return ERR_PTR(-EAGAIN); + refcount_inc(&state->count); + + return state; +@@ -1944,8 +1945,11 @@ _nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data) + + if (data->o_res.delegation_type != 0) + nfs4_opendata_check_deleg(data, state); +- update_open_stateid(state, &data->o_res.stateid, NULL, +- data->o_arg.fmode); ++ if (!update_open_stateid(state, &data->o_res.stateid, ++ NULL, data->o_arg.fmode)) { ++ nfs4_put_open_state(state); ++ state = ERR_PTR(-EAGAIN); ++ } + out: + nfs_release_seqid(data->o_arg.seqid); + return state; +@@ -2148,12 +2152,10 @@ static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct + case -NFS4ERR_BAD_HIGH_SLOT: + case -NFS4ERR_CONN_NOT_BOUND_TO_SESSION: + case -NFS4ERR_DEADSESSION: +- set_bit(NFS_DELEGATED_STATE, &state->flags); + nfs4_schedule_session_recovery(server->nfs_client->cl_session, err); + return -EAGAIN; + case -NFS4ERR_STALE_CLIENTID: + case -NFS4ERR_STALE_STATEID: +- set_bit(NFS_DELEGATED_STATE, &state->flags); + /* Don't recall a delegation if it was lost */ + nfs4_schedule_lease_recovery(server->nfs_client); + return -EAGAIN; +@@ -2174,7 +2176,6 @@ static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct + return -EAGAIN; + case -NFS4ERR_DELAY: + case -NFS4ERR_GRACE: +- set_bit(NFS_DELEGATED_STATE, &state->flags); + ssleep(1); + return -EAGAIN; + case -ENOMEM: +@@ -2190,8 +2191,7 @@ static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct + } + + int nfs4_open_delegation_recall(struct nfs_open_context *ctx, +- struct nfs4_state *state, const nfs4_stateid *stateid, +- fmode_t type) ++ struct nfs4_state *state, const nfs4_stateid *stateid) + { + struct nfs_server *server = NFS_SERVER(state->inode); + struct nfs4_opendata *opendata; +@@ -2202,20 +2202,23 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx, + if (IS_ERR(opendata)) + return PTR_ERR(opendata); + nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid); +- nfs_state_clear_delegation(state); +- switch (type & (FMODE_READ|FMODE_WRITE)) { +- case FMODE_READ|FMODE_WRITE: +- case FMODE_WRITE: ++ if (!test_bit(NFS_O_RDWR_STATE, &state->flags)) { + err = nfs4_open_recover_helper(opendata, FMODE_READ|FMODE_WRITE); + if (err) +- break; ++ goto out; ++ } ++ if (!test_bit(NFS_O_WRONLY_STATE, &state->flags)) { + err = nfs4_open_recover_helper(opendata, FMODE_WRITE); + if (err) +- break; +- /* Fall through */ +- case FMODE_READ: ++ goto out; ++ } ++ if (!test_bit(NFS_O_RDONLY_STATE, &state->flags)) { + err = nfs4_open_recover_helper(opendata, FMODE_READ); ++ if (err) ++ goto out; + } ++ nfs_state_clear_delegation(state); ++out: + nfs4_opendata_put(opendata); + return nfs4_handle_delegation_recall_error(server, state, stateid, NULL, err); + } +@@ -3172,7 +3175,7 @@ static int _nfs4_do_setattr(struct inode *inode, + + if (nfs4_copy_delegation_stateid(inode, FMODE_WRITE, &arg->stateid, &delegation_cred)) { + /* Use that stateid */ +- } else if (ctx != NULL) { ++ } else if (ctx != NULL && ctx->state) { + struct nfs_lock_context *l_ctx; + if (!nfs4_valid_open_stateid(ctx->state)) + return -EBADF; +diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c +index 83722e936b4a..bfe1f4625f60 100644 +--- a/fs/nfs/pnfs.c ++++ b/fs/nfs/pnfs.c +@@ -1890,7 +1890,7 @@ pnfs_update_layout(struct inode *ino, + spin_unlock(&ino->i_lock); + lseg = ERR_PTR(wait_var_event_killable(&lo->plh_outstanding, + !atomic_read(&lo->plh_outstanding))); +- if (IS_ERR(lseg) || !list_empty(&lo->plh_segs)) ++ if (IS_ERR(lseg)) + goto out_put_layout_hdr; + pnfs_put_layout_hdr(lo); + goto lookup_again; +diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c +index b428c295d13f..5778d1347b35 100644 +--- a/fs/notify/fanotify/fanotify.c ++++ b/fs/notify/fanotify/fanotify.c +@@ -288,10 +288,13 @@ struct fanotify_event *fanotify_alloc_event(struct fsnotify_group *group, + /* + * For queues with unlimited length lost events are not expected and + * can possibly have security implications. Avoid losing events when +- * memory is short. ++ * memory is short. For the limited size queues, avoid OOM killer in the ++ * target monitoring memcg as it may have security repercussion. + */ + if (group->max_events == UINT_MAX) + gfp |= __GFP_NOFAIL; ++ else ++ gfp |= __GFP_RETRY_MAYFAIL; + + /* Whoever is interested in the event, pays for the allocation. */ + memalloc_use_memcg(group->memcg); +diff --git a/fs/notify/inotify/inotify_fsnotify.c b/fs/notify/inotify/inotify_fsnotify.c +index 2fda08b2b885..d510223d302c 100644 +--- a/fs/notify/inotify/inotify_fsnotify.c ++++ b/fs/notify/inotify/inotify_fsnotify.c +@@ -90,9 +90,13 @@ int inotify_handle_event(struct fsnotify_group *group, + i_mark = container_of(inode_mark, struct inotify_inode_mark, + fsn_mark); + +- /* Whoever is interested in the event, pays for the allocation. */ ++ /* ++ * Whoever is interested in the event, pays for the allocation. Do not ++ * trigger OOM killer in the target monitoring memcg as it may have ++ * security repercussion. ++ */ + memalloc_use_memcg(group->memcg); +- event = kmalloc(alloc_len, GFP_KERNEL_ACCOUNT); ++ event = kmalloc(alloc_len, GFP_KERNEL_ACCOUNT | __GFP_RETRY_MAYFAIL); + memalloc_unuse_memcg(); + + if (unlikely(!event)) { +diff --git a/fs/open.c b/fs/open.c +index b5b80469b93d..f384a1e1c951 100644 +--- a/fs/open.c ++++ b/fs/open.c +@@ -35,6 +35,9 @@ + + #include "internal.h" + ++#define CREATE_TRACE_POINTS ++#include ++ + int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, + struct file *filp) + { +@@ -374,6 +377,25 @@ long do_faccessat(int dfd, const char __user *filename, int mode) + override_cred->cap_permitted; + } + ++ /* ++ * The new set of credentials can *only* be used in ++ * task-synchronous circumstances, and does not need ++ * RCU freeing, unless somebody then takes a separate ++ * reference to it. ++ * ++ * NOTE! This is _only_ true because this credential ++ * is used purely for override_creds() that installs ++ * it as the subjective cred. Other threads will be ++ * accessing ->real_cred, not the subjective cred. ++ * ++ * If somebody _does_ make a copy of this (using the ++ * 'get_current_cred()' function), that will clear the ++ * non_rcu field, because now that other user may be ++ * expecting RCU freeing. But normal thread-synchronous ++ * cred accesses will keep things non-RCY. ++ */ ++ override_cred->non_rcu = 1; ++ + old_cred = override_creds(override_cred); + retry: + res = user_path_at(dfd, filename, lookup_flags, &path); +@@ -1074,6 +1096,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode) + } else { + fsnotify_open(f); + fd_install(fd, f); ++ trace_do_sys_open(tmp->name, flags, mode); + } + } + putname(tmp); +diff --git a/fs/proc/base.c b/fs/proc/base.c +index 255f6754c70d..cd456bb3dc61 100644 +--- a/fs/proc/base.c ++++ b/fs/proc/base.c +@@ -209,12 +209,53 @@ static int proc_root_link(struct dentry *dentry, struct path *path) + return result; + } + ++/* ++ * If the user used setproctitle(), we just get the string from ++ * user space at arg_start, and limit it to a maximum of one page. ++ */ ++static ssize_t get_mm_proctitle(struct mm_struct *mm, char __user *buf, ++ size_t count, unsigned long pos, ++ unsigned long arg_start) ++{ ++ char *page; ++ int ret, got; ++ ++ if (pos >= PAGE_SIZE) ++ return 0; ++ ++ page = (char *)__get_free_page(GFP_KERNEL); ++ if (!page) ++ return -ENOMEM; ++ ++ ret = 0; ++ got = access_remote_vm(mm, arg_start, page, PAGE_SIZE, FOLL_ANON); ++ if (got > 0) { ++ int len = strnlen(page, got); ++ ++ /* Include the NUL character if it was found */ ++ if (len < got) ++ len++; ++ ++ if (len > pos) { ++ len -= pos; ++ if (len > count) ++ len = count; ++ len -= copy_to_user(buf, page+pos, len); ++ if (!len) ++ len = -EFAULT; ++ ret = len; ++ } ++ } ++ free_page((unsigned long)page); ++ return ret; ++} ++ + static ssize_t get_mm_cmdline(struct mm_struct *mm, char __user *buf, + size_t count, loff_t *ppos) + { + unsigned long arg_start, arg_end, env_start, env_end; + unsigned long pos, len; +- char *page; ++ char *page, c; + + /* Check if process spawned far enough to have cmdline. */ + if (!mm->env_end) +@@ -231,28 +272,42 @@ static ssize_t get_mm_cmdline(struct mm_struct *mm, char __user *buf, + return 0; + + /* +- * We have traditionally allowed the user to re-write +- * the argument strings and overflow the end result +- * into the environment section. But only do that if +- * the environment area is contiguous to the arguments. ++ * We allow setproctitle() to overwrite the argument ++ * strings, and overflow past the original end. But ++ * only when it overflows into the environment area. + */ +- if (env_start != arg_end || env_start >= env_end) ++ if (env_start != arg_end || env_end < env_start) + env_start = env_end = arg_end; +- +- /* .. and limit it to a maximum of one page of slop */ +- if (env_end >= arg_end + PAGE_SIZE) +- env_end = arg_end + PAGE_SIZE - 1; ++ len = env_end - arg_start; + + /* We're not going to care if "*ppos" has high bits set */ +- pos = arg_start + *ppos; +- +- /* .. but we do check the result is in the proper range */ +- if (pos < arg_start || pos >= env_end) ++ pos = *ppos; ++ if (pos >= len) ++ return 0; ++ if (count > len - pos) ++ count = len - pos; ++ if (!count) + return 0; + +- /* .. and we never go past env_end */ +- if (env_end - pos < count) +- count = env_end - pos; ++ /* ++ * Magical special case: if the argv[] end byte is not ++ * zero, the user has overwritten it with setproctitle(3). ++ * ++ * Possible future enhancement: do this only once when ++ * pos is 0, and set a flag in the 'struct file'. ++ */ ++ if (access_remote_vm(mm, arg_end-1, &c, 1, FOLL_ANON) == 1 && c) ++ return get_mm_proctitle(mm, buf, count, pos, arg_start); ++ ++ /* ++ * For the non-setproctitle() case we limit things strictly ++ * to the [arg_start, arg_end[ range. ++ */ ++ pos += arg_start; ++ if (pos < arg_start || pos >= arg_end) ++ return 0; ++ if (count > arg_end - pos) ++ count = arg_end - pos; + + page = (char *)__get_free_page(GFP_KERNEL); + if (!page) +@@ -262,48 +317,11 @@ static ssize_t get_mm_cmdline(struct mm_struct *mm, char __user *buf, + while (count) { + int got; + size_t size = min_t(size_t, PAGE_SIZE, count); +- long offset; + +- /* +- * Are we already starting past the official end? +- * We always include the last byte that is *supposed* +- * to be NUL +- */ +- offset = (pos >= arg_end) ? pos - arg_end + 1 : 0; +- +- got = access_remote_vm(mm, pos - offset, page, size + offset, FOLL_ANON); +- if (got <= offset) ++ got = access_remote_vm(mm, pos, page, size, FOLL_ANON); ++ if (got <= 0) + break; +- got -= offset; +- +- /* Don't walk past a NUL character once you hit arg_end */ +- if (pos + got >= arg_end) { +- int n = 0; +- +- /* +- * If we started before 'arg_end' but ended up +- * at or after it, we start the NUL character +- * check at arg_end-1 (where we expect the normal +- * EOF to be). +- * +- * NOTE! This is smaller than 'got', because +- * pos + got >= arg_end +- */ +- if (pos < arg_end) +- n = arg_end - pos - 1; +- +- /* Cut off at first NUL after 'n' */ +- got = n + strnlen(page+n, offset+got-n); +- if (got < offset) +- break; +- got -= offset; +- +- /* Include the NUL if it existed */ +- if (got < size) +- got++; +- } +- +- got -= copy_to_user(buf, page+offset, got); ++ got -= copy_to_user(buf, page, got); + if (unlikely(!got)) { + if (!len) + len = -EFAULT; +@@ -459,7 +477,7 @@ static int proc_pid_schedstat(struct seq_file *m, struct pid_namespace *ns, + seq_puts(m, "0 0 0\n"); + else + seq_printf(m, "%llu %llu %lu\n", +- (unsigned long long)task->se.sum_exec_runtime, ++ (unsigned long long)tsk_seruntime(task), + (unsigned long long)task->sched_info.run_delay, + task->sched_info.pcount); + +@@ -1962,9 +1980,12 @@ static int map_files_d_revalidate(struct dentry *dentry, unsigned int flags) + goto out; + + if (!dname_to_vma_addr(dentry, &vm_start, &vm_end)) { +- down_read(&mm->mmap_sem); +- exact_vma_exists = !!find_exact_vma(mm, vm_start, vm_end); +- up_read(&mm->mmap_sem); ++ status = down_read_killable(&mm->mmap_sem); ++ if (!status) { ++ exact_vma_exists = !!find_exact_vma(mm, vm_start, ++ vm_end); ++ up_read(&mm->mmap_sem); ++ } + } + + mmput(mm); +@@ -2010,8 +2031,11 @@ static int map_files_get_link(struct dentry *dentry, struct path *path) + if (rc) + goto out_mmput; + ++ rc = down_read_killable(&mm->mmap_sem); ++ if (rc) ++ goto out_mmput; ++ + rc = -ENOENT; +- down_read(&mm->mmap_sem); + vma = find_exact_vma(mm, vm_start, vm_end); + if (vma && vma->vm_file) { + *path = vma->vm_file->f_path; +@@ -2107,7 +2131,11 @@ static struct dentry *proc_map_files_lookup(struct inode *dir, + if (!mm) + goto out_put_task; + +- down_read(&mm->mmap_sem); ++ result = ERR_PTR(-EINTR); ++ if (down_read_killable(&mm->mmap_sem)) ++ goto out_put_mm; ++ ++ result = ERR_PTR(-ENOENT); + vma = find_exact_vma(mm, vm_start, vm_end); + if (!vma) + goto out_no_vma; +@@ -2118,6 +2146,7 @@ static struct dentry *proc_map_files_lookup(struct inode *dir, + + out_no_vma: + up_read(&mm->mmap_sem); ++out_put_mm: + mmput(mm); + out_put_task: + put_task_struct(task); +@@ -2160,7 +2189,12 @@ proc_map_files_readdir(struct file *file, struct dir_context *ctx) + mm = get_task_mm(task); + if (!mm) + goto out_put_task; +- down_read(&mm->mmap_sem); ++ ++ ret = down_read_killable(&mm->mmap_sem); ++ if (ret) { ++ mmput(mm); ++ goto out_put_task; ++ } + + nr_files = 0; + +diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c +index c74570736b24..36ad1b0d6259 100644 +--- a/fs/proc/proc_sysctl.c ++++ b/fs/proc/proc_sysctl.c +@@ -499,6 +499,10 @@ static struct inode *proc_sys_make_inode(struct super_block *sb, + + if (root->set_ownership) + root->set_ownership(head, table, &inode->i_uid, &inode->i_gid); ++ else { ++ inode->i_uid = GLOBAL_ROOT_UID; ++ inode->i_gid = GLOBAL_ROOT_GID; ++ } + + return inode; + } +diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c +index 01d4eb0e6bd1..7f84d1477b5b 100644 +--- a/fs/proc/task_mmu.c ++++ b/fs/proc/task_mmu.c +@@ -166,7 +166,11 @@ static void *m_start(struct seq_file *m, loff_t *ppos) + if (!mm || !mmget_not_zero(mm)) + return NULL; + +- down_read(&mm->mmap_sem); ++ if (down_read_killable(&mm->mmap_sem)) { ++ mmput(mm); ++ return ERR_PTR(-EINTR); ++ } ++ + hold_task_mempolicy(priv); + priv->tail_vma = get_gate_vma(mm); + +@@ -828,7 +832,10 @@ static int show_smaps_rollup(struct seq_file *m, void *v) + + memset(&mss, 0, sizeof(mss)); + +- down_read(&mm->mmap_sem); ++ ret = down_read_killable(&mm->mmap_sem); ++ if (ret) ++ goto out_put_mm; ++ + hold_task_mempolicy(priv); + + for (vma = priv->mm->mmap; vma; vma = vma->vm_next) { +@@ -845,8 +852,9 @@ static int show_smaps_rollup(struct seq_file *m, void *v) + + release_task_mempolicy(priv); + up_read(&mm->mmap_sem); +- mmput(mm); + ++out_put_mm: ++ mmput(mm); + out_put_task: + put_task_struct(priv->task); + priv->task = NULL; +@@ -1132,7 +1140,10 @@ static ssize_t clear_refs_write(struct file *file, const char __user *buf, + goto out_mm; + } + +- down_read(&mm->mmap_sem); ++ if (down_read_killable(&mm->mmap_sem)) { ++ count = -EINTR; ++ goto out_mm; ++ } + tlb_gather_mmu(&tlb, mm, 0, -1); + if (type == CLEAR_REFS_SOFT_DIRTY) { + for (vma = mm->mmap; vma; vma = vma->vm_next) { +@@ -1539,7 +1550,9 @@ static ssize_t pagemap_read(struct file *file, char __user *buf, + /* overflow ? */ + if (end < start_vaddr || end > end_vaddr) + end = end_vaddr; +- down_read(&mm->mmap_sem); ++ ret = down_read_killable(&mm->mmap_sem); ++ if (ret) ++ goto out_free; + ret = walk_page_range(start_vaddr, end, &pagemap_walk); + up_read(&mm->mmap_sem); + start_vaddr = end; +diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c +index 36bf0f2e102e..7907e6419e57 100644 +--- a/fs/proc/task_nommu.c ++++ b/fs/proc/task_nommu.c +@@ -211,7 +211,11 @@ static void *m_start(struct seq_file *m, loff_t *pos) + if (!mm || !mmget_not_zero(mm)) + return NULL; + +- down_read(&mm->mmap_sem); ++ if (down_read_killable(&mm->mmap_sem)) { ++ mmput(mm); ++ return ERR_PTR(-EINTR); ++ } ++ + /* start from the Nth VMA */ + for (p = rb_first(&mm->mm_rb); p; p = rb_next(p)) + if (n-- == 0) +diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c +index 89a80b568a17..7fbe8f058220 100644 +--- a/fs/pstore/inode.c ++++ b/fs/pstore/inode.c +@@ -318,22 +318,21 @@ int pstore_mkfile(struct dentry *root, struct pstore_record *record) + goto fail; + inode->i_mode = S_IFREG | 0444; + inode->i_fop = &pstore_file_operations; +- private = kzalloc(sizeof(*private), GFP_KERNEL); +- if (!private) +- goto fail_alloc; +- private->record = record; +- + scnprintf(name, sizeof(name), "%s-%s-%llu%s", + pstore_type_to_name(record->type), + record->psi->name, record->id, + record->compressed ? ".enc.z" : ""); + ++ private = kzalloc(sizeof(*private), GFP_KERNEL); ++ if (!private) ++ goto fail_inode; ++ + dentry = d_alloc_name(root, name); + if (!dentry) + goto fail_private; + ++ private->record = record; + inode->i_size = private->total_size = size; +- + inode->i_private = private; + + if (record->time.tv_sec) +@@ -349,7 +348,7 @@ int pstore_mkfile(struct dentry *root, struct pstore_record *record) + + fail_private: + free_pstore_private(private); +-fail_alloc: ++fail_inode: + iput(inode); + + fail: +diff --git a/fs/seq_file.c b/fs/seq_file.c +index abe27ec43176..225bf9239b32 100644 +--- a/fs/seq_file.c ++++ b/fs/seq_file.c +@@ -119,6 +119,7 @@ static int traverse(struct seq_file *m, loff_t offset) + } + if (seq_has_overflowed(m)) + goto Eoverflow; ++ p = m->op->next(m, p, &m->index); + if (pos + m->count > offset) { + m->from = offset - pos; + m->count -= m->from; +@@ -126,7 +127,6 @@ static int traverse(struct seq_file *m, loff_t offset) + } + pos += m->count; + m->count = 0; +- p = m->op->next(m, p, &m->index); + if (pos == offset) + break; + } +diff --git a/fs/udf/inode.c b/fs/udf/inode.c +index e7276932e433..9bb18311a22f 100644 +--- a/fs/udf/inode.c ++++ b/fs/udf/inode.c +@@ -470,13 +470,15 @@ static struct buffer_head *udf_getblk(struct inode *inode, udf_pblk_t block, + return NULL; + } + +-/* Extend the file by 'blocks' blocks, return the number of extents added */ ++/* Extend the file with new blocks totaling 'new_block_bytes', ++ * return the number of extents added ++ */ + static int udf_do_extend_file(struct inode *inode, + struct extent_position *last_pos, + struct kernel_long_ad *last_ext, +- sector_t blocks) ++ loff_t new_block_bytes) + { +- sector_t add; ++ uint32_t add; + int count = 0, fake = !(last_ext->extLength & UDF_EXTENT_LENGTH_MASK); + struct super_block *sb = inode->i_sb; + struct kernel_lb_addr prealloc_loc = {}; +@@ -486,7 +488,7 @@ static int udf_do_extend_file(struct inode *inode, + + /* The previous extent is fake and we should not extend by anything + * - there's nothing to do... */ +- if (!blocks && fake) ++ if (!new_block_bytes && fake) + return 0; + + iinfo = UDF_I(inode); +@@ -517,13 +519,12 @@ static int udf_do_extend_file(struct inode *inode, + /* Can we merge with the previous extent? */ + if ((last_ext->extLength & UDF_EXTENT_FLAG_MASK) == + EXT_NOT_RECORDED_NOT_ALLOCATED) { +- add = ((1 << 30) - sb->s_blocksize - +- (last_ext->extLength & UDF_EXTENT_LENGTH_MASK)) >> +- sb->s_blocksize_bits; +- if (add > blocks) +- add = blocks; +- blocks -= add; +- last_ext->extLength += add << sb->s_blocksize_bits; ++ add = (1 << 30) - sb->s_blocksize - ++ (last_ext->extLength & UDF_EXTENT_LENGTH_MASK); ++ if (add > new_block_bytes) ++ add = new_block_bytes; ++ new_block_bytes -= add; ++ last_ext->extLength += add; + } + + if (fake) { +@@ -544,28 +545,27 @@ static int udf_do_extend_file(struct inode *inode, + } + + /* Managed to do everything necessary? */ +- if (!blocks) ++ if (!new_block_bytes) + goto out; + + /* All further extents will be NOT_RECORDED_NOT_ALLOCATED */ + last_ext->extLocation.logicalBlockNum = 0; + last_ext->extLocation.partitionReferenceNum = 0; +- add = (1 << (30-sb->s_blocksize_bits)) - 1; +- last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | +- (add << sb->s_blocksize_bits); ++ add = (1 << 30) - sb->s_blocksize; ++ last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | add; + + /* Create enough extents to cover the whole hole */ +- while (blocks > add) { +- blocks -= add; ++ while (new_block_bytes > add) { ++ new_block_bytes -= add; + err = udf_add_aext(inode, last_pos, &last_ext->extLocation, + last_ext->extLength, 1); + if (err) + return err; + count++; + } +- if (blocks) { ++ if (new_block_bytes) { + last_ext->extLength = EXT_NOT_RECORDED_NOT_ALLOCATED | +- (blocks << sb->s_blocksize_bits); ++ new_block_bytes; + err = udf_add_aext(inode, last_pos, &last_ext->extLocation, + last_ext->extLength, 1); + if (err) +@@ -596,6 +596,24 @@ static int udf_do_extend_file(struct inode *inode, + return count; + } + ++/* Extend the final block of the file to final_block_len bytes */ ++static void udf_do_extend_final_block(struct inode *inode, ++ struct extent_position *last_pos, ++ struct kernel_long_ad *last_ext, ++ uint32_t final_block_len) ++{ ++ struct super_block *sb = inode->i_sb; ++ uint32_t added_bytes; ++ ++ added_bytes = final_block_len - ++ (last_ext->extLength & (sb->s_blocksize - 1)); ++ last_ext->extLength += added_bytes; ++ UDF_I(inode)->i_lenExtents += added_bytes; ++ ++ udf_write_aext(inode, last_pos, &last_ext->extLocation, ++ last_ext->extLength, 1); ++} ++ + static int udf_extend_file(struct inode *inode, loff_t newsize) + { + +@@ -605,10 +623,12 @@ static int udf_extend_file(struct inode *inode, loff_t newsize) + int8_t etype; + struct super_block *sb = inode->i_sb; + sector_t first_block = newsize >> sb->s_blocksize_bits, offset; ++ unsigned long partial_final_block; + int adsize; + struct udf_inode_info *iinfo = UDF_I(inode); + struct kernel_long_ad extent; +- int err; ++ int err = 0; ++ int within_final_block; + + if (iinfo->i_alloc_type == ICBTAG_FLAG_AD_SHORT) + adsize = sizeof(struct short_ad); +@@ -618,18 +638,8 @@ static int udf_extend_file(struct inode *inode, loff_t newsize) + BUG(); + + etype = inode_bmap(inode, first_block, &epos, &eloc, &elen, &offset); ++ within_final_block = (etype != -1); + +- /* File has extent covering the new size (could happen when extending +- * inside a block)? */ +- if (etype != -1) +- return 0; +- if (newsize & (sb->s_blocksize - 1)) +- offset++; +- /* Extended file just to the boundary of the last file block? */ +- if (offset == 0) +- return 0; +- +- /* Truncate is extending the file by 'offset' blocks */ + if ((!epos.bh && epos.offset == udf_file_entry_alloc_offset(inode)) || + (epos.bh && epos.offset == sizeof(struct allocExtDesc))) { + /* File has no extents at all or has empty last +@@ -643,7 +653,22 @@ static int udf_extend_file(struct inode *inode, loff_t newsize) + &extent.extLength, 0); + extent.extLength |= etype << 30; + } +- err = udf_do_extend_file(inode, &epos, &extent, offset); ++ ++ partial_final_block = newsize & (sb->s_blocksize - 1); ++ ++ /* File has extent covering the new size (could happen when extending ++ * inside a block)? ++ */ ++ if (within_final_block) { ++ /* Extending file within the last file block */ ++ udf_do_extend_final_block(inode, &epos, &extent, ++ partial_final_block); ++ } else { ++ loff_t add = ((loff_t)offset << sb->s_blocksize_bits) | ++ partial_final_block; ++ err = udf_do_extend_file(inode, &epos, &extent, add); ++ } ++ + if (err < 0) + goto out; + err = 0; +@@ -745,6 +770,7 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, + /* Are we beyond EOF? */ + if (etype == -1) { + int ret; ++ loff_t hole_len; + isBeyondEOF = true; + if (count) { + if (c) +@@ -760,7 +786,8 @@ static sector_t inode_getblk(struct inode *inode, sector_t block, + startnum = (offset > 0); + } + /* Create extents for the hole between EOF and offset */ +- ret = udf_do_extend_file(inode, &prev_epos, laarr, offset); ++ hole_len = (loff_t)offset << inode->i_blkbits; ++ ret = udf_do_extend_file(inode, &prev_epos, laarr, hole_len); + if (ret < 0) { + *err = ret; + newblock = 0; +diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c +index 8da5e6637771..11f703d4a605 100644 +--- a/fs/xfs/xfs_aops.c ++++ b/fs/xfs/xfs_aops.c +@@ -782,7 +782,7 @@ xfs_add_to_ioend( + atomic_inc(&iop->write_count); + + if (!merged) { +- if (bio_full(wpc->ioend->io_bio)) ++ if (bio_full(wpc->ioend->io_bio, len)) + xfs_chain_bio(wpc->ioend, wbc, bdev, sector); + bio_add_page(wpc->ioend->io_bio, page, len, poff); + } +diff --git a/include/asm-generic/bug.h b/include/asm-generic/bug.h +index 0e9bd9c83870..aa6c093d9ce9 100644 +--- a/include/asm-generic/bug.h ++++ b/include/asm-generic/bug.h +@@ -104,8 +104,10 @@ extern void warn_slowpath_null(const char *file, const int line); + warn_slowpath_fmt_taint(__FILE__, __LINE__, taint, arg) + #else + extern __printf(1, 2) void __warn_printk(const char *fmt, ...); +-#define __WARN() __WARN_TAINT(TAINT_WARN) +-#define __WARN_printf(arg...) do { __warn_printk(arg); __WARN(); } while (0) ++#define __WARN() do { \ ++ printk(KERN_WARNING CUT_HERE); __WARN_TAINT(TAINT_WARN); \ ++} while (0) ++#define __WARN_printf(arg...) __WARN_printf_taint(TAINT_WARN, arg) + #define __WARN_printf_taint(taint, arg...) \ + do { __warn_printk(arg); __WARN_TAINT(taint); } while (0) + #endif +diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h +index c0d4df6a606f..9d3b745c3107 100644 +--- a/include/drm/drm_displayid.h ++++ b/include/drm/drm_displayid.h +@@ -40,6 +40,7 @@ + #define DATA_BLOCK_DISPLAY_INTERFACE 0x0f + #define DATA_BLOCK_STEREO_DISPLAY_INTERFACE 0x10 + #define DATA_BLOCK_TILED_DISPLAY 0x12 ++#define DATA_BLOCK_CTA 0x81 + + #define DATA_BLOCK_VENDOR_SPECIFIC 0x7f + +@@ -90,4 +91,13 @@ struct displayid_detailed_timing_block { + struct displayid_block base; + struct displayid_detailed_timings_1 timings[0]; + }; ++ ++#define for_each_displayid_db(displayid, block, idx, length) \ ++ for ((block) = (struct displayid_block *)&(displayid)[idx]; \ ++ (idx) + sizeof(struct displayid_block) <= (length) && \ ++ (idx) + sizeof(struct displayid_block) + (block)->num_bytes <= (length) && \ ++ (block)->num_bytes > 0; \ ++ (idx) += (block)->num_bytes + sizeof(struct displayid_block), \ ++ (block) = (struct displayid_block *)&(displayid)[idx]) ++ + #endif +diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h +index 46bbc949c20a..7a30524a80ee 100644 +--- a/include/kvm/arm_vgic.h ++++ b/include/kvm/arm_vgic.h +@@ -350,6 +350,7 @@ int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu); + + void kvm_vgic_load(struct kvm_vcpu *vcpu); + void kvm_vgic_put(struct kvm_vcpu *vcpu); ++void kvm_vgic_vmcr_sync(struct kvm_vcpu *vcpu); + + #define irqchip_in_kernel(k) (!!((k)->arch.vgic.in_kernel)) + #define vgic_initialized(k) ((k)->arch.vgic.initialized) +diff --git a/include/linux/acpi.h b/include/linux/acpi.h +index d315d86844e4..872ab208c8ad 100644 +--- a/include/linux/acpi.h ++++ b/include/linux/acpi.h +@@ -317,7 +317,10 @@ void acpi_set_irq_model(enum acpi_irq_model_id model, + #ifdef CONFIG_X86_IO_APIC + extern int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity); + #else +-#define acpi_get_override_irq(gsi, trigger, polarity) (-1) ++static inline int acpi_get_override_irq(u32 gsi, int *trigger, int *polarity) ++{ ++ return -1; ++} + #endif + /* + * This function undoes the effect of one call to acpi_register_gsi(). +diff --git a/include/linux/bio.h b/include/linux/bio.h +index f87abaa898f0..e36b8fc1b1c3 100644 +--- a/include/linux/bio.h ++++ b/include/linux/bio.h +@@ -102,9 +102,23 @@ static inline void *bio_data(struct bio *bio) + return NULL; + } + +-static inline bool bio_full(struct bio *bio) ++/** ++ * bio_full - check if the bio is full ++ * @bio: bio to check ++ * @len: length of one segment to be added ++ * ++ * Return true if @bio is full and one segment with @len bytes can't be ++ * added to the bio, otherwise return false ++ */ ++static inline bool bio_full(struct bio *bio, unsigned len) + { +- return bio->bi_vcnt >= bio->bi_max_vecs; ++ if (bio->bi_vcnt >= bio->bi_max_vecs) ++ return true; ++ ++ if (bio->bi_iter.bi_size > UINT_MAX - len) ++ return true; ++ ++ return false; + } + + static inline bool bio_next_segment(const struct bio *bio, +diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h +index 592669bcc536..c0106f635540 100644 +--- a/include/linux/blkdev.h ++++ b/include/linux/blkdev.h +@@ -45,7 +45,11 @@ struct blk_queue_stats; + struct blk_stat_callback; + + #define BLKDEV_MIN_RQ 4 ++#ifdef CONFIG_ZEN_INTERACTIVE ++#define BLKDEV_MAX_RQ 512 ++#else + #define BLKDEV_MAX_RQ 128 /* Default maximum */ ++#endif + + /* Must be consistent with blk_mq_poll_stats_bkt() */ + #define BLK_MQ_POLL_STATS_BKTS 16 +@@ -344,6 +348,11 @@ struct queue_limits { + + #ifdef CONFIG_BLK_DEV_ZONED + ++/* ++ * Maximum number of zones to report with a single report zones command. ++ */ ++#define BLK_ZONED_REPORT_MAX_ZONES 8192U ++ + extern unsigned int blkdev_nr_zones(struct block_device *bdev); + extern int blkdev_report_zones(struct block_device *bdev, + sector_t sector, struct blk_zone *zones, +@@ -681,7 +690,7 @@ static inline bool blk_queue_is_zoned(struct request_queue *q) + } + } + +-static inline unsigned int blk_queue_zone_sectors(struct request_queue *q) ++static inline sector_t blk_queue_zone_sectors(struct request_queue *q) + { + return blk_queue_is_zoned(q) ? q->limits.chunk_sectors : 0; + } +@@ -1429,7 +1438,7 @@ static inline bool bdev_is_zoned(struct block_device *bdev) + return false; + } + +-static inline unsigned int bdev_zone_sectors(struct block_device *bdev) ++static inline sector_t bdev_zone_sectors(struct block_device *bdev) + { + struct request_queue *q = bdev_get_queue(bdev); + +diff --git a/include/linux/ccp.h b/include/linux/ccp.h +index 55cb455cfcb0..a5dfbaf2470d 100644 +--- a/include/linux/ccp.h ++++ b/include/linux/ccp.h +@@ -170,6 +170,8 @@ struct ccp_aes_engine { + enum ccp_aes_mode mode; + enum ccp_aes_action action; + ++ u32 authsize; ++ + struct scatterlist *key; + u32 key_len; /* In bytes */ + +diff --git a/include/linux/coda.h b/include/linux/coda.h +index d30209b9cef8..0ca0c83fdb1c 100644 +--- a/include/linux/coda.h ++++ b/include/linux/coda.h +@@ -58,8 +58,7 @@ Mellon the rights to redistribute these changes without encumbrance. + #ifndef _CODA_HEADER_ + #define _CODA_HEADER_ + +-#if defined(__linux__) + typedef unsigned long long u_quad_t; +-#endif ++ + #include + #endif +diff --git a/include/linux/coda_psdev.h b/include/linux/coda_psdev.h +index 15170954aa2b..57d2b2faf6a3 100644 +--- a/include/linux/coda_psdev.h ++++ b/include/linux/coda_psdev.h +@@ -19,6 +19,17 @@ struct venus_comm { + struct mutex vc_mutex; + }; + ++/* messages between coda filesystem in kernel and Venus */ ++struct upc_req { ++ struct list_head uc_chain; ++ caddr_t uc_data; ++ u_short uc_flags; ++ u_short uc_inSize; /* Size is at most 5000 bytes */ ++ u_short uc_outSize; ++ u_short uc_opcode; /* copied from data to save lookup */ ++ int uc_unique; ++ wait_queue_head_t uc_sleep; /* process' wait queue */ ++}; + + static inline struct venus_comm *coda_vcp(struct super_block *sb) + { +diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h +index e8579412ad21..d7ee4c6bad48 100644 +--- a/include/linux/compiler-gcc.h ++++ b/include/linux/compiler-gcc.h +@@ -170,3 +170,5 @@ + #else + #define __diag_GCC_8(s) + #endif ++ ++#define __no_fgcse __attribute__((optimize("-fno-gcse"))) +diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h +index 19e58b9138a0..0454d82f8bd8 100644 +--- a/include/linux/compiler_types.h ++++ b/include/linux/compiler_types.h +@@ -187,6 +187,10 @@ struct ftrace_likely_data { + #define asm_volatile_goto(x...) asm goto(x) + #endif + ++#ifndef __no_fgcse ++# define __no_fgcse ++#endif ++ + /* Are two types/vars the same type (ignoring qualifiers)? */ + #define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) + +diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h +index 5c6062206760..068793a619ca 100644 +--- a/include/linux/cpuhotplug.h ++++ b/include/linux/cpuhotplug.h +@@ -116,10 +116,10 @@ enum cpuhp_state { + CPUHP_AP_PERF_ARM_ACPI_STARTING, + CPUHP_AP_PERF_ARM_STARTING, + CPUHP_AP_ARM_L2X0_STARTING, ++ CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING, + CPUHP_AP_ARM_ARCH_TIMER_STARTING, + CPUHP_AP_ARM_GLOBAL_TIMER_STARTING, + CPUHP_AP_JCORE_TIMER_STARTING, +- CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING, + CPUHP_AP_ARM_TWD_STARTING, + CPUHP_AP_QCOM_TIMER_STARTING, + CPUHP_AP_TEGRA_TIMER_STARTING, +@@ -176,6 +176,7 @@ enum cpuhp_state { + CPUHP_AP_WATCHDOG_ONLINE, + CPUHP_AP_WORKQUEUE_ONLINE, + CPUHP_AP_RCUTREE_ONLINE, ++ CPUHP_AP_BASE_CACHEINFO_ONLINE, + CPUHP_AP_ONLINE_DYN, + CPUHP_AP_ONLINE_DYN_END = CPUHP_AP_ONLINE_DYN + 30, + CPUHP_AP_X86_HPET_ONLINE, +diff --git a/include/linux/cred.h b/include/linux/cred.h +index 7eb43a038330..f7a30e0099be 100644 +--- a/include/linux/cred.h ++++ b/include/linux/cred.h +@@ -145,7 +145,11 @@ struct cred { + struct user_struct *user; /* real user ID subscription */ + struct user_namespace *user_ns; /* user_ns the caps and keyrings are relative to. */ + struct group_info *group_info; /* supplementary groups for euid/fsgid */ +- struct rcu_head rcu; /* RCU deletion hook */ ++ /* RCU deletion */ ++ union { ++ int non_rcu; /* Can we skip RCU deletion? */ ++ struct rcu_head rcu; /* RCU deletion hook */ ++ }; + } __randomize_layout; + + extern void __put_cred(struct cred *); +@@ -246,6 +250,7 @@ static inline const struct cred *get_cred(const struct cred *cred) + if (!cred) + return cred; + validate_creds(cred); ++ nonconst_cred->non_rcu = 0; + return get_new_cred(nonconst_cred); + } + +@@ -257,6 +262,7 @@ static inline const struct cred *get_cred_rcu(const struct cred *cred) + if (!atomic_inc_not_zero(&nonconst_cred->usage)) + return NULL; + validate_creds(cred); ++ nonconst_cred->non_rcu = 0; + return cred; + } + +diff --git a/include/linux/device.h b/include/linux/device.h +index 4a295e324ac5..b12c586fae28 100644 +--- a/include/linux/device.h ++++ b/include/linux/device.h +@@ -1375,6 +1375,7 @@ extern int (*platform_notify_remove)(struct device *dev); + */ + extern struct device *get_device(struct device *dev); + extern void put_device(struct device *dev); ++extern bool kill_device(struct device *dev); + + #ifdef CONFIG_DEVTMPFS + extern int devtmpfs_create_node(struct device *dev); +diff --git a/include/linux/freezer.h b/include/linux/freezer.h +index 21f5aa0b217f..ee9b46394fdf 100644 +--- a/include/linux/freezer.h ++++ b/include/linux/freezer.h +@@ -297,6 +297,7 @@ static inline void set_freezable(void) {} + #define wait_event_freezekillable_unsafe(wq, condition) \ + wait_event_killable(wq, condition) + ++#define pm_freezing (false) + #endif /* !CONFIG_FREEZER */ + + #endif /* FREEZER_H_INCLUDED */ +diff --git a/include/linux/fs.h b/include/linux/fs.h +index f7fdfe93e25d..5186ac5b2a29 100644 +--- a/include/linux/fs.h ++++ b/include/linux/fs.h +@@ -2615,6 +2615,12 @@ extern struct block_device *blkdev_get_by_path(const char *path, fmode_t mode, + void *holder); + extern struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, + void *holder); ++extern struct block_device *bd_start_claiming(struct block_device *bdev, ++ void *holder); ++extern void bd_finish_claiming(struct block_device *bdev, ++ struct block_device *whole, void *holder); ++extern void bd_abort_claiming(struct block_device *bdev, ++ struct block_device *whole, void *holder); + extern void blkdev_put(struct block_device *bdev, fmode_t mode); + extern int __blkdev_reread_part(struct block_device *bdev); + extern int blkdev_reread_part(struct block_device *bdev); +@@ -2712,6 +2718,8 @@ extern int filemap_flush(struct address_space *); + extern int filemap_fdatawait_keep_errors(struct address_space *mapping); + extern int filemap_fdatawait_range(struct address_space *, loff_t lstart, + loff_t lend); ++extern int filemap_fdatawait_range_keep_errors(struct address_space *mapping, ++ loff_t start_byte, loff_t end_byte); + + static inline int filemap_fdatawait(struct address_space *mapping) + { +diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h +index 9ddcf50a3c59..a7f08fb0f865 100644 +--- a/include/linux/gpio/consumer.h ++++ b/include/linux/gpio/consumer.h +@@ -247,7 +247,7 @@ static inline void gpiod_put(struct gpio_desc *desc) + might_sleep(); + + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + } + + static inline void devm_gpiod_unhinge(struct device *dev, +@@ -256,7 +256,7 @@ static inline void devm_gpiod_unhinge(struct device *dev, + might_sleep(); + + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + } + + static inline void gpiod_put_array(struct gpio_descs *descs) +@@ -264,7 +264,7 @@ static inline void gpiod_put_array(struct gpio_descs *descs) + might_sleep(); + + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(descs); + } + + static inline struct gpio_desc *__must_check +@@ -317,7 +317,7 @@ static inline void devm_gpiod_put(struct device *dev, struct gpio_desc *desc) + might_sleep(); + + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + } + + static inline void devm_gpiod_put_array(struct device *dev, +@@ -326,32 +326,32 @@ static inline void devm_gpiod_put_array(struct device *dev, + might_sleep(); + + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(descs); + } + + + static inline int gpiod_get_direction(const struct gpio_desc *desc) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return -ENOSYS; + } + static inline int gpiod_direction_input(struct gpio_desc *desc) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return -ENOSYS; + } + static inline int gpiod_direction_output(struct gpio_desc *desc, int value) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return -ENOSYS; + } + static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return -ENOSYS; + } + +@@ -359,7 +359,7 @@ static inline int gpiod_direction_output_raw(struct gpio_desc *desc, int value) + static inline int gpiod_get_value(const struct gpio_desc *desc) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return 0; + } + static inline int gpiod_get_array_value(unsigned int array_size, +@@ -368,13 +368,13 @@ static inline int gpiod_get_array_value(unsigned int array_size, + unsigned long *value_bitmap) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc_array); + return 0; + } + static inline void gpiod_set_value(struct gpio_desc *desc, int value) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + } + static inline int gpiod_set_array_value(unsigned int array_size, + struct gpio_desc **desc_array, +@@ -382,13 +382,13 @@ static inline int gpiod_set_array_value(unsigned int array_size, + unsigned long *value_bitmap) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc_array); + return 0; + } + static inline int gpiod_get_raw_value(const struct gpio_desc *desc) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return 0; + } + static inline int gpiod_get_raw_array_value(unsigned int array_size, +@@ -397,13 +397,13 @@ static inline int gpiod_get_raw_array_value(unsigned int array_size, + unsigned long *value_bitmap) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc_array); + return 0; + } + static inline void gpiod_set_raw_value(struct gpio_desc *desc, int value) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + } + static inline int gpiod_set_raw_array_value(unsigned int array_size, + struct gpio_desc **desc_array, +@@ -411,14 +411,14 @@ static inline int gpiod_set_raw_array_value(unsigned int array_size, + unsigned long *value_bitmap) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc_array); + return 0; + } + + static inline int gpiod_get_value_cansleep(const struct gpio_desc *desc) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return 0; + } + static inline int gpiod_get_array_value_cansleep(unsigned int array_size, +@@ -427,13 +427,13 @@ static inline int gpiod_get_array_value_cansleep(unsigned int array_size, + unsigned long *value_bitmap) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc_array); + return 0; + } + static inline void gpiod_set_value_cansleep(struct gpio_desc *desc, int value) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + } + static inline int gpiod_set_array_value_cansleep(unsigned int array_size, + struct gpio_desc **desc_array, +@@ -441,13 +441,13 @@ static inline int gpiod_set_array_value_cansleep(unsigned int array_size, + unsigned long *value_bitmap) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc_array); + return 0; + } + static inline int gpiod_get_raw_value_cansleep(const struct gpio_desc *desc) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return 0; + } + static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size, +@@ -456,14 +456,14 @@ static inline int gpiod_get_raw_array_value_cansleep(unsigned int array_size, + unsigned long *value_bitmap) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc_array); + return 0; + } + static inline void gpiod_set_raw_value_cansleep(struct gpio_desc *desc, + int value) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + } + static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size, + struct gpio_desc **desc_array, +@@ -471,41 +471,41 @@ static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size, + unsigned long *value_bitmap) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc_array); + return 0; + } + + static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return -ENOSYS; + } + + static inline int gpiod_set_transitory(struct gpio_desc *desc, bool transitory) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return -ENOSYS; + } + + static inline int gpiod_is_active_low(const struct gpio_desc *desc) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return 0; + } + static inline int gpiod_cansleep(const struct gpio_desc *desc) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return 0; + } + + static inline int gpiod_to_irq(const struct gpio_desc *desc) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return -EINVAL; + } + +@@ -513,7 +513,7 @@ static inline int gpiod_set_consumer_name(struct gpio_desc *desc, + const char *name) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return -EINVAL; + } + +@@ -525,7 +525,7 @@ static inline struct gpio_desc *gpio_to_desc(unsigned gpio) + static inline int desc_to_gpio(const struct gpio_desc *desc) + { + /* GPIO can never have been requested */ +- WARN_ON(1); ++ WARN_ON(desc); + return -EINVAL; + } + +diff --git a/include/linux/hmm.h b/include/linux/hmm.h +index 044a36d7c3f8..89508dc0795f 100644 +--- a/include/linux/hmm.h ++++ b/include/linux/hmm.h +@@ -93,6 +93,7 @@ struct hmm { + struct mmu_notifier mmu_notifier; + struct rw_semaphore mirrors_sem; + wait_queue_head_t wq; ++ struct rcu_head rcu; + long notifiers; + bool dead; + }; +diff --git a/include/linux/host1x.h b/include/linux/host1x.h +index cfff30b9a62e..e6eea45e1154 100644 +--- a/include/linux/host1x.h ++++ b/include/linux/host1x.h +@@ -297,6 +297,8 @@ struct host1x_device { + struct list_head clients; + + bool registered; ++ ++ struct device_dma_parameters dma_parms; + }; + + static inline struct host1x_device *to_host1x_device(struct device *dev) +diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h +index 8b728750a625..69e813bcb947 100644 +--- a/include/linux/if_pppox.h ++++ b/include/linux/if_pppox.h +@@ -80,6 +80,9 @@ extern int register_pppox_proto(int proto_num, const struct pppox_proto *pp); + extern void unregister_pppox_proto(int proto_num); + extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ + extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); ++extern int pppox_compat_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); ++ ++#define PPPOEIOCSFWD32 _IOW(0xB1 ,0, compat_size_t) + + /* PPPoX socket states */ + enum { +diff --git a/include/linux/init_task.h b/include/linux/init_task.h +index 6049baa5b8bc..9a70cbc958a7 100644 +--- a/include/linux/init_task.h ++++ b/include/linux/init_task.h +@@ -47,7 +47,11 @@ extern struct cred init_cred; + #define INIT_CPU_TIMERS(s) + #endif + ++#ifdef CONFIG_SCHED_MUQSS ++#define INIT_TASK_COMM "MuQSS" ++#else + #define INIT_TASK_COMM "swapper" ++#endif + + /* Attach to the init_task data structure for proper alignment */ + #ifdef CONFIG_ARCH_TASK_STRUCT_ON_STACK +diff --git a/include/linux/ioprio.h b/include/linux/ioprio.h +index e9bfe6972aed..16ba1c7e5bde 100644 +--- a/include/linux/ioprio.h ++++ b/include/linux/ioprio.h +@@ -53,6 +53,8 @@ enum { + */ + static inline int task_nice_ioprio(struct task_struct *task) + { ++ if (iso_task(task)) ++ return 0; + return (task_nice(task) + 20) / 5; + } + +diff --git a/include/linux/iova.h b/include/linux/iova.h +index 781b96ac706f..a0637abffee8 100644 +--- a/include/linux/iova.h ++++ b/include/linux/iova.h +@@ -155,6 +155,7 @@ struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo, + void copy_reserved_iova(struct iova_domain *from, struct iova_domain *to); + void init_iova_domain(struct iova_domain *iovad, unsigned long granule, + unsigned long start_pfn); ++bool has_iova_flush_queue(struct iova_domain *iovad); + int init_iova_flush_queue(struct iova_domain *iovad, + iova_flush_cb flush_cb, iova_entry_dtor entry_dtor); + struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn); +@@ -235,6 +236,11 @@ static inline void init_iova_domain(struct iova_domain *iovad, + { + } + ++static inline bool has_iova_flush_queue(struct iova_domain *iovad) ++{ ++ return false; ++} ++ + static inline int init_iova_flush_queue(struct iova_domain *iovad, + iova_flush_cb flush_cb, + iova_entry_dtor entry_dtor) +diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h +index 5c04181b7c6d..0e0393e7f41a 100644 +--- a/include/linux/jbd2.h ++++ b/include/linux/jbd2.h +@@ -451,6 +451,22 @@ struct jbd2_inode { + * @i_flags: Flags of inode [j_list_lock] + */ + unsigned long i_flags; ++ ++ /** ++ * @i_dirty_start: ++ * ++ * Offset in bytes where the dirty range for this inode starts. ++ * [j_list_lock] ++ */ ++ loff_t i_dirty_start; ++ ++ /** ++ * @i_dirty_end: ++ * ++ * Inclusive offset in bytes where the dirty range for this inode ++ * ends. [j_list_lock] ++ */ ++ loff_t i_dirty_end; + }; + + struct jbd2_revoke_table_s; +@@ -1397,6 +1413,12 @@ extern int jbd2_journal_force_commit(journal_t *); + extern int jbd2_journal_force_commit_nested(journal_t *); + extern int jbd2_journal_inode_add_write(handle_t *handle, struct jbd2_inode *inode); + extern int jbd2_journal_inode_add_wait(handle_t *handle, struct jbd2_inode *inode); ++extern int jbd2_journal_inode_ranged_write(handle_t *handle, ++ struct jbd2_inode *inode, loff_t start_byte, ++ loff_t length); ++extern int jbd2_journal_inode_ranged_wait(handle_t *handle, ++ struct jbd2_inode *inode, loff_t start_byte, ++ loff_t length); + extern int jbd2_journal_begin_ordered_truncate(journal_t *journal, + struct jbd2_inode *inode, loff_t new_size); + extern void jbd2_journal_init_jbd_inode(struct jbd2_inode *jinode, struct inode *inode); +diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h +index d1ad38a3f048..7546cbf3dfb0 100644 +--- a/include/linux/kvm_host.h ++++ b/include/linux/kvm_host.h +@@ -871,6 +871,7 @@ void kvm_arch_check_processor_compat(void *rtn); + int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu); + bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu); + int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu); ++bool kvm_arch_dy_runnable(struct kvm_vcpu *vcpu); + + #ifndef __KVM_HAVE_ARCH_VM_ALLOC + /* +diff --git a/include/linux/linux_logo.h b/include/linux/linux_logo.h +index d4d5b93efe84..0a63e8c0959b 100644 +--- a/include/linux/linux_logo.h ++++ b/include/linux/linux_logo.h +@@ -36,6 +36,18 @@ struct linux_logo { + extern const struct linux_logo logo_linux_mono; + extern const struct linux_logo logo_linux_vga16; + extern const struct linux_logo logo_linux_clut224; ++extern const struct linux_logo logo_zen_clut224; ++extern const struct linux_logo logo_oldzen_clut224; ++extern const struct linux_logo logo_arch_clut224; ++extern const struct linux_logo logo_gentoo_clut224; ++extern const struct linux_logo logo_exherbo_clut224; ++extern const struct linux_logo logo_slackware_clut224; ++extern const struct linux_logo logo_debian_clut224; ++extern const struct linux_logo logo_fedorasimple_clut224; ++extern const struct linux_logo logo_fedoraglossy_clut224; ++extern const struct linux_logo logo_tits_clut224; ++extern const struct linux_logo logo_bsd_clut224; ++extern const struct linux_logo logo_fbsd_clut224; + extern const struct linux_logo logo_dec_clut224; + extern const struct linux_logo logo_mac_clut224; + extern const struct linux_logo logo_parisc_clut224; +diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h +index ae892eef8b82..988fde33cd7f 100644 +--- a/include/linux/memory_hotplug.h ++++ b/include/linux/memory_hotplug.h +@@ -324,7 +324,7 @@ static inline void pgdat_resize_init(struct pglist_data *pgdat) {} + extern bool is_mem_section_removable(unsigned long pfn, unsigned long nr_pages); + extern void try_offline_node(int nid); + extern int offline_pages(unsigned long start_pfn, unsigned long nr_pages); +-extern void remove_memory(int nid, u64 start, u64 size); ++extern int remove_memory(int nid, u64 start, u64 size); + extern void __remove_memory(int nid, u64 start, u64 size); + + #else +@@ -341,7 +341,11 @@ static inline int offline_pages(unsigned long start_pfn, unsigned long nr_pages) + return -EINVAL; + } + +-static inline void remove_memory(int nid, u64 start, u64 size) {} ++static inline int remove_memory(int nid, u64 start, u64 size) ++{ ++ return -EBUSY; ++} ++ + static inline void __remove_memory(int nid, u64 start, u64 size) {} + #endif /* CONFIG_MEMORY_HOTREMOVE */ + +diff --git a/include/linux/mlx5/fs.h b/include/linux/mlx5/fs.h +index e690ba0f965c..70185079f83e 100644 +--- a/include/linux/mlx5/fs.h ++++ b/include/linux/mlx5/fs.h +@@ -211,6 +211,7 @@ int mlx5_modify_rule_destination(struct mlx5_flow_handle *handler, + + struct mlx5_fc *mlx5_fc_create(struct mlx5_core_dev *dev, bool aging); + void mlx5_fc_destroy(struct mlx5_core_dev *dev, struct mlx5_fc *counter); ++u64 mlx5_fc_query_lastuse(struct mlx5_fc *counter); + void mlx5_fc_query_cached(struct mlx5_fc *counter, + u64 *bytes, u64 *packets, u64 *lastuse); + int mlx5_fc_query(struct mlx5_core_dev *dev, struct mlx5_fc *counter, +diff --git a/include/linux/mlx5/mlx5_ifc.h b/include/linux/mlx5/mlx5_ifc.h +index 5e74305e2e57..29b55f8cd7b3 100644 +--- a/include/linux/mlx5/mlx5_ifc.h ++++ b/include/linux/mlx5/mlx5_ifc.h +@@ -749,7 +749,8 @@ struct mlx5_ifc_per_protocol_networking_offload_caps_bits { + u8 swp[0x1]; + u8 swp_csum[0x1]; + u8 swp_lso[0x1]; +- u8 reserved_at_23[0xd]; ++ u8 cqe_checksum_full[0x1]; ++ u8 reserved_at_24[0xc]; + u8 max_vxlan_udp_ports[0x8]; + u8 reserved_at_38[0x6]; + u8 max_geneve_opt_len[0x1]; +@@ -5864,10 +5865,12 @@ struct mlx5_ifc_modify_cq_in_bits { + + struct mlx5_ifc_cqc_bits cq_context; + +- u8 reserved_at_280[0x40]; ++ u8 reserved_at_280[0x60]; + + u8 cq_umem_valid[0x1]; +- u8 reserved_at_2c1[0x5bf]; ++ u8 reserved_at_2e1[0x1f]; ++ ++ u8 reserved_at_300[0x580]; + + u8 pas[0][0x40]; + }; +diff --git a/include/linux/mm.h b/include/linux/mm.h +index dd0b5f4e1e45..0a6dae2f2b84 100644 +--- a/include/linux/mm.h ++++ b/include/linux/mm.h +@@ -633,6 +633,11 @@ static inline bool is_vmalloc_addr(const void *x) + return false; + #endif + } ++ ++#ifndef is_ioremap_addr ++#define is_ioremap_addr(x) is_vmalloc_addr(x) ++#endif ++ + #ifdef CONFIG_MMU + extern int is_vmalloc_or_module_addr(const void *x); + #else +diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h +index 2bca72f3028b..a9d3fbbab4c1 100644 +--- a/include/linux/perf_event.h ++++ b/include/linux/perf_event.h +@@ -1049,6 +1049,11 @@ static inline int in_software_context(struct perf_event *event) + return event->ctx->pmu->task_ctx_nr == perf_sw_context; + } + ++static inline int is_exclusive_pmu(struct pmu *pmu) ++{ ++ return pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE; ++} ++ + extern struct static_key perf_swevent_enabled[PERF_COUNT_SW_MAX]; + + extern void ___perf_sw_event(u32, u64, struct pt_regs *, u64); +diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h +index b25d20822e75..3508f4508a11 100644 +--- a/include/linux/rcupdate.h ++++ b/include/linux/rcupdate.h +@@ -586,7 +586,7 @@ static inline void rcu_preempt_sleep_check(void) { } + * read-side critical sections may be preempted and they may also block, but + * only when acquiring spinlocks that are subject to priority inheritance. + */ +-static inline void rcu_read_lock(void) ++static __always_inline void rcu_read_lock(void) + { + __rcu_read_lock(); + __acquire(RCU); +diff --git a/include/linux/sched.h b/include/linux/sched.h +index 11837410690f..91bb1552f720 100644 +--- a/include/linux/sched.h ++++ b/include/linux/sched.h +@@ -29,6 +29,9 @@ + #include + #include + #include ++#ifdef CONFIG_SCHED_MUQSS ++#include ++#endif + + /* task_struct member predeclarations (sorted alphabetically): */ + struct audit_context; +@@ -217,6 +220,34 @@ extern long schedule_timeout_interruptible(long timeout); + extern long schedule_timeout_killable(long timeout); + extern long schedule_timeout_uninterruptible(long timeout); + extern long schedule_timeout_idle(long timeout); ++ ++#if defined(CONFIG_HIGH_RES_TIMERS) && defined(CONFIG_SCHED_MUQSS) ++extern long schedule_msec_hrtimeout(long timeout); ++extern long schedule_min_hrtimeout(void); ++extern long schedule_msec_hrtimeout_interruptible(long timeout); ++extern long schedule_msec_hrtimeout_uninterruptible(long timeout); ++#else ++static inline long schedule_msec_hrtimeout(long timeout) ++{ ++ return schedule_timeout(msecs_to_jiffies(timeout)); ++} ++ ++static inline long schedule_min_hrtimeout(void) ++{ ++ return schedule_timeout(1); ++} ++ ++static inline long schedule_msec_hrtimeout_interruptible(long timeout) ++{ ++ return schedule_timeout_interruptible(msecs_to_jiffies(timeout)); ++} ++ ++static inline long schedule_msec_hrtimeout_uninterruptible(long timeout) ++{ ++ return schedule_timeout_uninterruptible(msecs_to_jiffies(timeout)); ++} ++#endif ++ + asmlinkage void schedule(void); + extern void schedule_preempt_disabled(void); + +@@ -604,9 +635,11 @@ struct task_struct { + unsigned int flags; + unsigned int ptrace; + ++#if defined(CONFIG_SMP) || defined(CONFIG_SCHED_MUQSS) ++ int on_cpu; ++#endif + #ifdef CONFIG_SMP + struct llist_node wake_entry; +- int on_cpu; + #ifdef CONFIG_THREAD_INFO_IN_TASK + /* Current CPU: */ + unsigned int cpu; +@@ -631,10 +664,25 @@ struct task_struct { + int static_prio; + int normal_prio; + unsigned int rt_priority; ++#ifdef CONFIG_SCHED_MUQSS ++ int time_slice; ++ u64 deadline; ++ skiplist_node node; /* Skip list node */ ++ u64 last_ran; ++ u64 sched_time; /* sched_clock time spent running */ ++#ifdef CONFIG_SMT_NICE ++ int smt_bias; /* Policy/nice level bias across smt siblings */ ++#endif ++#ifdef CONFIG_HOTPLUG_CPU ++ bool zerobound; /* Bound to CPU0 for hotplug */ ++#endif ++ unsigned long rt_timeout; ++#else /* CONFIG_SCHED_MUQSS */ + + const struct sched_class *sched_class; + struct sched_entity se; + struct sched_rt_entity rt; ++#endif + #ifdef CONFIG_CGROUP_SCHED + struct task_group *sched_task_group; + #endif +@@ -791,6 +839,10 @@ struct task_struct { + #ifdef CONFIG_ARCH_HAS_SCALED_CPUTIME + u64 utimescaled; + u64 stimescaled; ++#endif ++#ifdef CONFIG_SCHED_MUQSS ++ /* Unbanked cpu time */ ++ unsigned long utime_ns, stime_ns; + #endif + u64 gtime; + struct prev_cputime prev_cputime; +@@ -1026,7 +1078,15 @@ struct task_struct { + u64 last_sum_exec_runtime; + struct callback_head numa_work; + +- struct numa_group *numa_group; ++ /* ++ * This pointer is only modified for current in syscall and ++ * pagefault context (and for tasks being destroyed), so it can be read ++ * from any of the following contexts: ++ * - RCU read-side critical section ++ * - current->numa_group from everywhere ++ * - task's runqueue locked, task not running ++ */ ++ struct numa_group __rcu *numa_group; + + /* + * numa_faults is an array split into four regions: +@@ -1217,6 +1277,40 @@ struct task_struct { + */ + }; + ++#ifdef CONFIG_SCHED_MUQSS ++#define tsk_seruntime(t) ((t)->sched_time) ++#define tsk_rttimeout(t) ((t)->rt_timeout) ++ ++static inline void tsk_cpus_current(struct task_struct *p) ++{ ++} ++ ++void print_scheduler_version(void); ++ ++static inline bool iso_task(struct task_struct *p) ++{ ++ return (p->policy == SCHED_ISO); ++} ++#else /* CFS */ ++#define tsk_seruntime(t) ((t)->se.sum_exec_runtime) ++#define tsk_rttimeout(t) ((t)->rt.timeout) ++ ++static inline void tsk_cpus_current(struct task_struct *p) ++{ ++ p->nr_cpus_allowed = current->nr_cpus_allowed; ++} ++ ++static inline void print_scheduler_version(void) ++{ ++ printk(KERN_INFO "CFS CPU scheduler.\n"); ++} ++ ++static inline bool iso_task(struct task_struct *p) ++{ ++ return false; ++} ++#endif /* CONFIG_SCHED_MUQSS */ ++ + static inline struct pid *task_pid(struct task_struct *task) + { + return task->thread_pid; +diff --git a/include/linux/sched/nohz.h b/include/linux/sched/nohz.h +index b36f4cf38111..61b03ea2edc9 100644 +--- a/include/linux/sched/nohz.h ++++ b/include/linux/sched/nohz.h +@@ -6,7 +6,7 @@ + * This is the interface between the scheduler and nohz/dynticks: + */ + +-#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON) ++#if defined(CONFIG_SMP) && defined(CONFIG_NO_HZ_COMMON) && !defined(CONFIG_SCHED_MUQSS) + extern void cpu_load_update_nohz_start(void); + extern void cpu_load_update_nohz_stop(void); + #else +@@ -21,7 +21,7 @@ extern int get_nohz_timer_target(void); + static inline void nohz_balance_enter_idle(int cpu) { } + #endif + +-#ifdef CONFIG_NO_HZ_COMMON ++#if defined(CONFIG_NO_HZ_COMMON) && !defined(CONFIG_SCHED_MUQSS) + void calc_load_nohz_start(void); + void calc_load_nohz_stop(void); + #else +diff --git a/include/linux/sched/numa_balancing.h b/include/linux/sched/numa_balancing.h +index e7dd04a84ba8..3988762efe15 100644 +--- a/include/linux/sched/numa_balancing.h ++++ b/include/linux/sched/numa_balancing.h +@@ -19,7 +19,7 @@ + extern void task_numa_fault(int last_node, int node, int pages, int flags); + extern pid_t task_numa_group_id(struct task_struct *p); + extern void set_numabalancing_state(bool enabled); +-extern void task_numa_free(struct task_struct *p); ++extern void task_numa_free(struct task_struct *p, bool final); + extern bool should_numa_migrate_memory(struct task_struct *p, struct page *page, + int src_nid, int dst_cpu); + #else +@@ -34,7 +34,7 @@ static inline pid_t task_numa_group_id(struct task_struct *p) + static inline void set_numabalancing_state(bool enabled) + { + } +-static inline void task_numa_free(struct task_struct *p) ++static inline void task_numa_free(struct task_struct *p, bool final) + { + } + static inline bool should_numa_migrate_memory(struct task_struct *p, +diff --git a/include/linux/sched/prio.h b/include/linux/sched/prio.h +index 7d64feafc408..43c9d9e50c09 100644 +--- a/include/linux/sched/prio.h ++++ b/include/linux/sched/prio.h +@@ -20,8 +20,20 @@ + */ + + #define MAX_USER_RT_PRIO 100 ++ ++#ifdef CONFIG_SCHED_MUQSS ++/* Note different MAX_RT_PRIO */ ++#define MAX_RT_PRIO (MAX_USER_RT_PRIO + 1) ++ ++#define ISO_PRIO (MAX_RT_PRIO) ++#define NORMAL_PRIO (MAX_RT_PRIO + 1) ++#define IDLE_PRIO (MAX_RT_PRIO + 2) ++#define PRIO_LIMIT ((IDLE_PRIO) + 1) ++#else /* CONFIG_SCHED_MUQSS */ + #define MAX_RT_PRIO MAX_USER_RT_PRIO + ++#endif /* CONFIG_SCHED_MUQSS */ ++ + #define MAX_PRIO (MAX_RT_PRIO + NICE_WIDTH) + #define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH / 2) + +diff --git a/include/linux/sched/rt.h b/include/linux/sched/rt.h +index e5af028c08b4..010b2244e0b6 100644 +--- a/include/linux/sched/rt.h ++++ b/include/linux/sched/rt.h +@@ -24,8 +24,10 @@ static inline bool task_is_realtime(struct task_struct *tsk) + + if (policy == SCHED_FIFO || policy == SCHED_RR) + return true; ++#ifndef CONFIG_SCHED_MUQSS + if (policy == SCHED_DEADLINE) + return true; ++#endif + return false; + } + +diff --git a/include/linux/sched/signal.h b/include/linux/sched/signal.h +index 38a0f0785323..c68ca81db0a1 100644 +--- a/include/linux/sched/signal.h ++++ b/include/linux/sched/signal.h +@@ -329,7 +329,7 @@ extern void force_sigsegv(int sig, struct task_struct *p); + extern int force_sig_info(int, struct kernel_siginfo *, struct task_struct *); + extern int __kill_pgrp_info(int sig, struct kernel_siginfo *info, struct pid *pgrp); + extern int kill_pid_info(int sig, struct kernel_siginfo *info, struct pid *pid); +-extern int kill_pid_info_as_cred(int, struct kernel_siginfo *, struct pid *, ++extern int kill_pid_usb_asyncio(int sig, int errno, sigval_t addr, struct pid *, + const struct cred *); + extern int kill_pgrp(struct pid *pid, int sig, int priv); + extern int kill_pid(struct pid *pid, int sig, int priv); +diff --git a/include/linux/sched/task.h b/include/linux/sched/task.h +index f1227f2c38a4..a531a61a570a 100644 +--- a/include/linux/sched/task.h ++++ b/include/linux/sched/task.h +@@ -83,7 +83,7 @@ extern long kernel_wait4(pid_t, int __user *, int, struct rusage *); + extern void free_task(struct task_struct *tsk); + + /* sched_exec is called by processes performing an exec */ +-#ifdef CONFIG_SMP ++#if defined(CONFIG_SMP) && !defined(CONFIG_SCHED_MUQSS) + extern void sched_exec(void); + #else + #define sched_exec() {} +diff --git a/include/linux/skip_list.h b/include/linux/skip_list.h +new file mode 100644 +index 000000000000..d4be84ba273b +--- /dev/null ++++ b/include/linux/skip_list.h +@@ -0,0 +1,33 @@ ++#ifndef _LINUX_SKIP_LISTS_H ++#define _LINUX_SKIP_LISTS_H ++typedef u64 keyType; ++typedef void *valueType; ++ ++typedef struct nodeStructure skiplist_node; ++ ++struct nodeStructure { ++ int level; /* Levels in this structure */ ++ keyType key; ++ valueType value; ++ skiplist_node *next[8]; ++ skiplist_node *prev[8]; ++}; ++ ++typedef struct listStructure { ++ int entries; ++ int level; /* Maximum level of the list ++ (1 more than the number of levels in the list) */ ++ skiplist_node *header; /* pointer to header */ ++} skiplist; ++ ++void skiplist_init(skiplist_node *slnode); ++skiplist *new_skiplist(skiplist_node *slnode); ++void free_skiplist(skiplist *l); ++void skiplist_node_init(skiplist_node *node); ++void skiplist_insert(skiplist *l, skiplist_node *node, keyType key, valueType value, unsigned int randseed); ++void skiplist_delete(skiplist *l, skiplist_node *node); ++ ++static inline bool skiplist_node_empty(skiplist_node *node) { ++ return (!node->next[0]); ++} ++#endif /* _LINUX_SKIP_LISTS_H */ +diff --git a/include/linux/swap.h b/include/linux/swap.h +index 4bfb5c4ac108..6358a6185634 100644 +--- a/include/linux/swap.h ++++ b/include/linux/swap.h +@@ -175,8 +175,9 @@ enum { + SWP_PAGE_DISCARD = (1 << 10), /* freed swap page-cluster discards */ + SWP_STABLE_WRITES = (1 << 11), /* no overwrite PG_writeback pages */ + SWP_SYNCHRONOUS_IO = (1 << 12), /* synchronous IO is efficient */ ++ SWP_VALID = (1 << 13), /* swap is valid to be operated on? */ + /* add others here before... */ +- SWP_SCANNING = (1 << 13), /* refcount in scan_swap_map */ ++ SWP_SCANNING = (1 << 14), /* refcount in scan_swap_map */ + }; + + #define SWAP_CLUSTER_MAX 32UL +@@ -460,7 +461,7 @@ extern unsigned int count_swap_pages(int, int); + extern sector_t map_swap_page(struct page *, struct block_device **); + extern sector_t swapdev_block(int, pgoff_t); + extern int page_swapcount(struct page *); +-extern int __swap_count(struct swap_info_struct *si, swp_entry_t entry); ++extern int __swap_count(swp_entry_t entry); + extern int __swp_swapcount(swp_entry_t entry); + extern int swp_swapcount(swp_entry_t entry); + extern struct swap_info_struct *page_swap_info(struct page *); +@@ -470,6 +471,12 @@ extern int try_to_free_swap(struct page *); + struct backing_dev_info; + extern int init_swap_address_space(unsigned int type, unsigned long nr_pages); + extern void exit_swap_address_space(unsigned int type); ++extern struct swap_info_struct *get_swap_device(swp_entry_t entry); ++ ++static inline void put_swap_device(struct swap_info_struct *si) ++{ ++ rcu_read_unlock(); ++} + + #else /* CONFIG_SWAP */ + +@@ -576,7 +583,7 @@ static inline int page_swapcount(struct page *page) + return 0; + } + +-static inline int __swap_count(struct swap_info_struct *si, swp_entry_t entry) ++static inline int __swap_count(swp_entry_t entry) + { + return 0; + } +diff --git a/include/linux/thinkpad_ec.h b/include/linux/thinkpad_ec.h +new file mode 100644 +index 000000000000..1b80d7ee5493 +--- /dev/null ++++ b/include/linux/thinkpad_ec.h +@@ -0,0 +1,47 @@ ++/* ++ * thinkpad_ec.h - interface to ThinkPad embedded controller LPC3 functions ++ * ++ * Copyright (C) 2005 Shem Multinymous ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++ ++#ifndef _THINKPAD_EC_H ++#define _THINKPAD_EC_H ++ ++#ifdef __KERNEL__ ++ ++#define TP_CONTROLLER_ROW_LEN 16 ++ ++/* EC transactions input and output (possibly partial) vectors of 16 bytes. */ ++struct thinkpad_ec_row { ++ u16 mask; /* bitmap of which entries of val[] are meaningful */ ++ u8 val[TP_CONTROLLER_ROW_LEN]; ++}; ++ ++extern int __must_check thinkpad_ec_lock(void); ++extern int __must_check thinkpad_ec_try_lock(void); ++extern void thinkpad_ec_unlock(void); ++ ++extern int thinkpad_ec_read_row(const struct thinkpad_ec_row *args, ++ struct thinkpad_ec_row *data); ++extern int thinkpad_ec_try_read_row(const struct thinkpad_ec_row *args, ++ struct thinkpad_ec_row *mask); ++extern int thinkpad_ec_prefetch_row(const struct thinkpad_ec_row *args); ++extern void thinkpad_ec_invalidate(void); ++ ++ ++#endif /* __KERNEL */ ++#endif /* _THINKPAD_EC_H */ +diff --git a/include/linux/vmw_vmci_defs.h b/include/linux/vmw_vmci_defs.h +index 77ac9c7b9483..762f793e92f6 100644 +--- a/include/linux/vmw_vmci_defs.h ++++ b/include/linux/vmw_vmci_defs.h +@@ -62,9 +62,18 @@ enum { + + /* + * A single VMCI device has an upper limit of 128MB on the amount of +- * memory that can be used for queue pairs. ++ * memory that can be used for queue pairs. Since each queue pair ++ * consists of at least two pages, the memory limit also dictates the ++ * number of queue pairs a guest can create. + */ + #define VMCI_MAX_GUEST_QP_MEMORY (128 * 1024 * 1024) ++#define VMCI_MAX_GUEST_QP_COUNT (VMCI_MAX_GUEST_QP_MEMORY / PAGE_SIZE / 2) ++ ++/* ++ * There can be at most PAGE_SIZE doorbells since there is one doorbell ++ * per byte in the doorbell bitmap page. ++ */ ++#define VMCI_MAX_GUEST_DOORBELL_COUNT PAGE_SIZE + + /* + * Queues with pre-mapped data pages must be small, so that we don't pin +diff --git a/include/net/dst.h b/include/net/dst.h +index 12b31c602cb0..f8206d3fed2f 100644 +--- a/include/net/dst.h ++++ b/include/net/dst.h +@@ -302,8 +302,9 @@ static inline bool dst_hold_safe(struct dst_entry *dst) + * @skb: buffer + * + * If dst is not yet refcounted and not destroyed, grab a ref on it. ++ * Returns true if dst is refcounted. + */ +-static inline void skb_dst_force(struct sk_buff *skb) ++static inline bool skb_dst_force(struct sk_buff *skb) + { + if (skb_dst_is_noref(skb)) { + struct dst_entry *dst = skb_dst(skb); +@@ -314,6 +315,8 @@ static inline void skb_dst_force(struct sk_buff *skb) + + skb->_skb_refdst = (unsigned long)dst; + } ++ ++ return skb->_skb_refdst != 0UL; + } + + +diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h +index 2ac40135b576..b36a1df93e7c 100644 +--- a/include/net/ip_vs.h ++++ b/include/net/ip_vs.h +@@ -808,11 +808,12 @@ struct ipvs_master_sync_state { + struct ip_vs_sync_buff *sync_buff; + unsigned long sync_queue_len; + unsigned int sync_queue_delay; +- struct task_struct *master_thread; + struct delayed_work master_wakeup_work; + struct netns_ipvs *ipvs; + }; + ++struct ip_vs_sync_thread_data; ++ + /* How much time to keep dests in trash */ + #define IP_VS_DEST_TRASH_PERIOD (120 * HZ) + +@@ -943,7 +944,8 @@ struct netns_ipvs { + spinlock_t sync_lock; + struct ipvs_master_sync_state *ms; + spinlock_t sync_buff_lock; +- struct task_struct **backup_threads; ++ struct ip_vs_sync_thread_data *master_tinfo; ++ struct ip_vs_sync_thread_data *backup_tinfo; + int threads_mask; + volatile int sync_state; + struct mutex sync_mutex; +diff --git a/include/net/tcp.h b/include/net/tcp.h +index 582c0caa9811..2ee06191c488 100644 +--- a/include/net/tcp.h ++++ b/include/net/tcp.h +@@ -1063,7 +1063,8 @@ void tcp_get_default_congestion_control(struct net *net, char *name); + void tcp_get_available_congestion_control(char *buf, size_t len); + void tcp_get_allowed_congestion_control(char *buf, size_t len); + int tcp_set_allowed_congestion_control(char *allowed); +-int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, bool reinit); ++int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, ++ bool reinit, bool cap_net_admin); + u32 tcp_slow_start(struct tcp_sock *tp, u32 acked); + void tcp_cong_avoid_ai(struct tcp_sock *tp, u32 w, u32 acked); + +@@ -1675,6 +1676,11 @@ static inline struct sk_buff *tcp_rtx_queue_head(const struct sock *sk) + return skb_rb_first(&sk->tcp_rtx_queue); + } + ++static inline struct sk_buff *tcp_rtx_queue_tail(const struct sock *sk) ++{ ++ return skb_rb_last(&sk->tcp_rtx_queue); ++} ++ + static inline struct sk_buff *tcp_write_queue_head(const struct sock *sk) + { + return skb_peek(&sk->sk_write_queue); +diff --git a/include/net/tls.h b/include/net/tls.h +index 53d96bca220d..889df0312cd1 100644 +--- a/include/net/tls.h ++++ b/include/net/tls.h +@@ -313,6 +313,7 @@ struct tls_offload_context_rx { + (ALIGN(sizeof(struct tls_offload_context_rx), sizeof(void *)) + \ + TLS_DRIVER_STATE_SIZE) + ++void tls_ctx_free(struct tls_context *ctx); + int wait_on_pending_writer(struct sock *sk, long *timeo); + int tls_sk_query(struct sock *sk, int optname, char __user *optval, + int __user *optlen); +diff --git a/include/net/xdp_sock.h b/include/net/xdp_sock.h +index d074b6d60f8a..ac3c047d058c 100644 +--- a/include/net/xdp_sock.h ++++ b/include/net/xdp_sock.h +@@ -67,6 +67,8 @@ struct xdp_sock { + * in the SKB destructor callback. + */ + spinlock_t tx_completion_lock; ++ /* Protects generic receive. */ ++ spinlock_t rx_lock; + u64 rx_dropped; + }; + +diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h +index 54873085f2da..db0fc59cf4f0 100644 +--- a/include/rdma/ib_verbs.h ++++ b/include/rdma/ib_verbs.h +@@ -327,8 +327,8 @@ struct ib_rss_caps { + }; + + enum ib_tm_cap_flags { +- /* Support tag matching on RC transport */ +- IB_TM_CAP_RC = 1 << 0, ++ /* Support tag matching with rendezvous offload for RC transport */ ++ IB_TM_CAP_RNDV_RC = 1 << 0, + }; + + struct ib_tm_caps { +@@ -2722,6 +2722,9 @@ struct ib_client { + const union ib_gid *gid, + const struct sockaddr *addr, + void *client_data); ++ ++ refcount_t uses; ++ struct completion uses_zero; + struct list_head list; + u32 client_id; + +diff --git a/include/scsi/libfcoe.h b/include/scsi/libfcoe.h +index c50fb297e265..e89a922ee849 100644 +--- a/include/scsi/libfcoe.h ++++ b/include/scsi/libfcoe.h +@@ -229,6 +229,7 @@ struct fcoe_fcf { + * @vn_mac: VN_Node assigned MAC address for data + */ + struct fcoe_rport { ++ struct fc_rport_priv rdata; + unsigned long time; + u16 fcoe_len; + u16 flags; +diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h +index c5188ff724d1..bc88d6f964da 100644 +--- a/include/sound/compress_driver.h ++++ b/include/sound/compress_driver.h +@@ -173,10 +173,7 @@ static inline void snd_compr_drain_notify(struct snd_compr_stream *stream) + if (snd_BUG_ON(!stream)) + return; + +- if (stream->direction == SND_COMPRESS_PLAYBACK) +- stream->runtime->state = SNDRV_PCM_STATE_SETUP; +- else +- stream->runtime->state = SNDRV_PCM_STATE_PREPARED; ++ stream->runtime->state = SNDRV_PCM_STATE_SETUP; + + wake_up(&stream->runtime->sleep); + } +diff --git a/include/sound/hda_codec.h b/include/sound/hda_codec.h +index a7c602576b68..66fb592f2d5e 100644 +--- a/include/sound/hda_codec.h ++++ b/include/sound/hda_codec.h +@@ -249,6 +249,8 @@ struct hda_codec { + unsigned int auto_runtime_pm:1; /* enable automatic codec runtime pm */ + unsigned int force_pin_prefix:1; /* Add location prefix */ + unsigned int link_down_at_suspend:1; /* link down at runtime suspend */ ++ unsigned int relaxed_resume:1; /* don't resume forcibly for jack */ ++ + #ifdef CONFIG_PM + unsigned long power_on_acct; + unsigned long power_off_acct; +diff --git a/include/trace/events/fs.h b/include/trace/events/fs.h +new file mode 100644 +index 000000000000..fb634b74adf3 +--- /dev/null ++++ b/include/trace/events/fs.h +@@ -0,0 +1,53 @@ ++#undef TRACE_SYSTEM ++#define TRACE_SYSTEM fs ++ ++#if !defined(_TRACE_FS_H) || defined(TRACE_HEADER_MULTI_READ) ++#define _TRACE_FS_H ++ ++#include ++#include ++ ++TRACE_EVENT(do_sys_open, ++ ++ TP_PROTO(const char *filename, int flags, int mode), ++ ++ TP_ARGS(filename, flags, mode), ++ ++ TP_STRUCT__entry( ++ __string( filename, filename ) ++ __field( int, flags ) ++ __field( int, mode ) ++ ), ++ ++ TP_fast_assign( ++ __assign_str(filename, filename); ++ __entry->flags = flags; ++ __entry->mode = mode; ++ ), ++ ++ TP_printk("\"%s\" %x %o", ++ __get_str(filename), __entry->flags, __entry->mode) ++); ++ ++TRACE_EVENT(open_exec, ++ ++ TP_PROTO(const char *filename), ++ ++ TP_ARGS(filename), ++ ++ TP_STRUCT__entry( ++ __string( filename, filename ) ++ ), ++ ++ TP_fast_assign( ++ __assign_str(filename, filename); ++ ), ++ ++ TP_printk("\"%s\"", ++ __get_str(filename)) ++); ++ ++#endif /* _TRACE_FS_H */ ++ ++/* This part must be outside protection */ ++#include +diff --git a/include/trace/events/rxrpc.h b/include/trace/events/rxrpc.h +index d85816878a52..cc1d060cbf13 100644 +--- a/include/trace/events/rxrpc.h ++++ b/include/trace/events/rxrpc.h +@@ -1379,7 +1379,7 @@ TRACE_EVENT(rxrpc_rx_eproto, + ), + + TP_fast_assign( +- __entry->call = call->debug_id; ++ __entry->call = call ? call->debug_id : 0; + __entry->serial = serial; + __entry->why = why; + ), +diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h +index a8b823c30b43..29a5bc3d5c66 100644 +--- a/include/uapi/linux/bpf.h ++++ b/include/uapi/linux/bpf.h +@@ -3143,6 +3143,7 @@ struct bpf_prog_info { + char name[BPF_OBJ_NAME_LEN]; + __u32 ifindex; + __u32 gpl_compatible:1; ++ __u32 :31; /* alignment pad */ + __u64 netns_dev; + __u64 netns_ino; + __u32 nr_jited_ksyms; +diff --git a/include/uapi/linux/coda_psdev.h b/include/uapi/linux/coda_psdev.h +index aa6623efd2dd..d50d51a57fe4 100644 +--- a/include/uapi/linux/coda_psdev.h ++++ b/include/uapi/linux/coda_psdev.h +@@ -7,19 +7,6 @@ + #define CODA_PSDEV_MAJOR 67 + #define MAX_CODADEVS 5 /* how many do we allow */ + +- +-/* messages between coda filesystem in kernel and Venus */ +-struct upc_req { +- struct list_head uc_chain; +- caddr_t uc_data; +- u_short uc_flags; +- u_short uc_inSize; /* Size is at most 5000 bytes */ +- u_short uc_outSize; +- u_short uc_opcode; /* copied from data to save lookup */ +- int uc_unique; +- wait_queue_head_t uc_sleep; /* process' wait queue */ +-}; +- + #define CODA_REQ_ASYNC 0x1 + #define CODA_REQ_READ 0x2 + #define CODA_REQ_WRITE 0x4 +diff --git a/include/uapi/linux/nilfs2_ondisk.h b/include/uapi/linux/nilfs2_ondisk.h +index a7e66ab11d1d..c23f91ae5fe8 100644 +--- a/include/uapi/linux/nilfs2_ondisk.h ++++ b/include/uapi/linux/nilfs2_ondisk.h +@@ -29,7 +29,7 @@ + + #include + #include +- ++#include + + #define NILFS_INODE_BMAP_SIZE 7 + +@@ -533,19 +533,19 @@ enum { + static inline void \ + nilfs_checkpoint_set_##name(struct nilfs_checkpoint *cp) \ + { \ +- cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) | \ +- (1UL << NILFS_CHECKPOINT_##flag)); \ ++ cp->cp_flags = __cpu_to_le32(__le32_to_cpu(cp->cp_flags) | \ ++ (1UL << NILFS_CHECKPOINT_##flag)); \ + } \ + static inline void \ + nilfs_checkpoint_clear_##name(struct nilfs_checkpoint *cp) \ + { \ +- cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) & \ ++ cp->cp_flags = __cpu_to_le32(__le32_to_cpu(cp->cp_flags) & \ + ~(1UL << NILFS_CHECKPOINT_##flag)); \ + } \ + static inline int \ + nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp) \ + { \ +- return !!(le32_to_cpu(cp->cp_flags) & \ ++ return !!(__le32_to_cpu(cp->cp_flags) & \ + (1UL << NILFS_CHECKPOINT_##flag)); \ + } + +@@ -595,20 +595,20 @@ enum { + static inline void \ + nilfs_segment_usage_set_##name(struct nilfs_segment_usage *su) \ + { \ +- su->su_flags = cpu_to_le32(le32_to_cpu(su->su_flags) | \ ++ su->su_flags = __cpu_to_le32(__le32_to_cpu(su->su_flags) | \ + (1UL << NILFS_SEGMENT_USAGE_##flag));\ + } \ + static inline void \ + nilfs_segment_usage_clear_##name(struct nilfs_segment_usage *su) \ + { \ + su->su_flags = \ +- cpu_to_le32(le32_to_cpu(su->su_flags) & \ ++ __cpu_to_le32(__le32_to_cpu(su->su_flags) & \ + ~(1UL << NILFS_SEGMENT_USAGE_##flag)); \ + } \ + static inline int \ + nilfs_segment_usage_##name(const struct nilfs_segment_usage *su) \ + { \ +- return !!(le32_to_cpu(su->su_flags) & \ ++ return !!(__le32_to_cpu(su->su_flags) & \ + (1UL << NILFS_SEGMENT_USAGE_##flag)); \ + } + +@@ -619,15 +619,15 @@ NILFS_SEGMENT_USAGE_FNS(ERROR, error) + static inline void + nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su) + { +- su->su_lastmod = cpu_to_le64(0); +- su->su_nblocks = cpu_to_le32(0); +- su->su_flags = cpu_to_le32(0); ++ su->su_lastmod = __cpu_to_le64(0); ++ su->su_nblocks = __cpu_to_le32(0); ++ su->su_flags = __cpu_to_le32(0); + } + + static inline int + nilfs_segment_usage_clean(const struct nilfs_segment_usage *su) + { +- return !le32_to_cpu(su->su_flags); ++ return !__le32_to_cpu(su->su_flags); + } + + /** +diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h +index 6f09d1500960..70da1c6cdd07 100644 +--- a/include/uapi/linux/nl80211.h ++++ b/include/uapi/linux/nl80211.h +@@ -2844,7 +2844,7 @@ enum nl80211_attrs { + #define NL80211_HT_CAPABILITY_LEN 26 + #define NL80211_VHT_CAPABILITY_LEN 12 + #define NL80211_HE_MIN_CAPABILITY_LEN 16 +-#define NL80211_HE_MAX_CAPABILITY_LEN 51 ++#define NL80211_HE_MAX_CAPABILITY_LEN 54 + #define NL80211_MAX_NR_CIPHER_SUITES 5 + #define NL80211_MAX_NR_AKM_SUITES 2 + +diff --git a/include/uapi/linux/sched.h b/include/uapi/linux/sched.h +index ed4ee170bee2..f430694a061c 100644 +--- a/include/uapi/linux/sched.h ++++ b/include/uapi/linux/sched.h +@@ -38,9 +38,16 @@ + #define SCHED_FIFO 1 + #define SCHED_RR 2 + #define SCHED_BATCH 3 +-/* SCHED_ISO: reserved but not implemented yet */ ++/* SCHED_ISO: Implemented on MuQSS only */ + #define SCHED_IDLE 5 ++#ifdef CONFIG_SCHED_MUQSS ++#define SCHED_ISO 4 ++#define SCHED_IDLEPRIO SCHED_IDLE ++#define SCHED_MAX (SCHED_IDLEPRIO) ++#define SCHED_RANGE(policy) ((policy) <= SCHED_MAX) ++#else /* CONFIG_SCHED_MUQSS */ + #define SCHED_DEADLINE 6 ++#endif /* CONFIG_SCHED_MUQSS */ + + /* Can be ORed in to make sure the process is reverted back to SCHED_NORMAL on fork */ + #define SCHED_RESET_ON_FORK 0x40000000 +diff --git a/include/uapi/linux/usb/audio.h b/include/uapi/linux/usb/audio.h +index ddc5396800aa..76b7c3f6cd0d 100644 +--- a/include/uapi/linux/usb/audio.h ++++ b/include/uapi/linux/usb/audio.h +@@ -450,6 +450,43 @@ static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_desc + } + } + ++/* ++ * Extension Unit (XU) has almost compatible layout with Processing Unit, but ++ * on UAC2, it has a different bmControls size (bControlSize); it's 1 byte for ++ * XU while 2 bytes for PU. The last iExtension field is a one-byte index as ++ * well as iProcessing field of PU. ++ */ ++static inline __u8 uac_extension_unit_bControlSize(struct uac_processing_unit_descriptor *desc, ++ int protocol) ++{ ++ switch (protocol) { ++ case UAC_VERSION_1: ++ return desc->baSourceID[desc->bNrInPins + 4]; ++ case UAC_VERSION_2: ++ return 1; /* in UAC2, this value is constant */ ++ case UAC_VERSION_3: ++ return 4; /* in UAC3, this value is constant */ ++ default: ++ return 1; ++ } ++} ++ ++static inline __u8 uac_extension_unit_iExtension(struct uac_processing_unit_descriptor *desc, ++ int protocol) ++{ ++ __u8 control_size = uac_extension_unit_bControlSize(desc, protocol); ++ ++ switch (protocol) { ++ case UAC_VERSION_1: ++ case UAC_VERSION_2: ++ default: ++ return *(uac_processing_unit_bmControls(desc, protocol) ++ + control_size); ++ case UAC_VERSION_3: ++ return 0; /* UAC3 does not have this field */ ++ } ++} ++ + /* 4.5.2 Class-Specific AS Interface Descriptor */ + struct uac1_as_header_descriptor { + __u8 bLength; /* in bytes: 7 */ +diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h +index 1050a75fb7ef..dcd776e77442 100644 +--- a/include/uapi/linux/videodev2.h ++++ b/include/uapi/linux/videodev2.h +@@ -518,7 +518,13 @@ struct v4l2_pix_format { + #define V4L2_PIX_FMT_RGBX444 v4l2_fourcc('R', 'X', '1', '2') /* 16 rrrrgggg bbbbxxxx */ + #define V4L2_PIX_FMT_ABGR444 v4l2_fourcc('A', 'B', '1', '2') /* 16 aaaabbbb ggggrrrr */ + #define V4L2_PIX_FMT_XBGR444 v4l2_fourcc('X', 'B', '1', '2') /* 16 xxxxbbbb ggggrrrr */ +-#define V4L2_PIX_FMT_BGRA444 v4l2_fourcc('B', 'A', '1', '2') /* 16 bbbbgggg rrrraaaa */ ++ ++/* ++ * Originally this had 'BA12' as fourcc, but this clashed with the older ++ * V4L2_PIX_FMT_SGRBG12 which inexplicably used that same fourcc. ++ * So use 'GA12' instead for V4L2_PIX_FMT_BGRA444. ++ */ ++#define V4L2_PIX_FMT_BGRA444 v4l2_fourcc('G', 'A', '1', '2') /* 16 bbbbgggg rrrraaaa */ + #define V4L2_PIX_FMT_BGRX444 v4l2_fourcc('B', 'X', '1', '2') /* 16 bbbbgggg rrrrxxxx */ + #define V4L2_PIX_FMT_RGB555 v4l2_fourcc('R', 'G', 'B', 'O') /* 16 RGB-5-5-5 */ + #define V4L2_PIX_FMT_ARGB555 v4l2_fourcc('A', 'R', '1', '5') /* 16 ARGB-1-5-5-5 */ +diff --git a/include/uapi/linux/vt.h b/include/uapi/linux/vt.h +index e9d39c48520a..3bceead8da40 100644 +--- a/include/uapi/linux/vt.h ++++ b/include/uapi/linux/vt.h +@@ -3,12 +3,25 @@ + #define _UAPI_LINUX_VT_H + + ++/* ++ * We will make this definition solely for the purpose of making packages ++ * such as splashutils build, because they can not understand that ++ * NR_TTY_DEVICES is defined in the kernel configuration. ++ */ ++#ifndef CONFIG_NR_TTY_DEVICES ++#define CONFIG_NR_TTY_DEVICES 63 ++#endif ++ + /* + * These constants are also useful for user-level apps (e.g., VC + * resizing). + */ + #define MIN_NR_CONSOLES 1 /* must be at least 1 */ +-#define MAX_NR_CONSOLES 63 /* serial lines start at 64 */ ++/* ++ * NR_TTY_DEVICES: ++ * Value MUST be at least 12 and must never be higher then 63 ++ */ ++#define MAX_NR_CONSOLES CONFIG_NR_TTY_DEVICES /* serial lines start above this */ + /* Note: the ioctl VT_GETSTATE does not work for + consoles 16 and higher (since it returns a short) */ + +diff --git a/include/xen/events.h b/include/xen/events.h +index a48897199975..c0e6a0598397 100644 +--- a/include/xen/events.h ++++ b/include/xen/events.h +@@ -3,6 +3,7 @@ + #define _XEN_EVENTS_H + + #include ++#include + #ifdef CONFIG_PCI_MSI + #include + #endif +@@ -59,7 +60,7 @@ void evtchn_put(unsigned int evtchn); + + void xen_send_IPI_one(unsigned int cpu, enum ipi_vector vector); + void rebind_evtchn_irq(int evtchn, int irq); +-int xen_rebind_evtchn_to_cpu(int evtchn, unsigned tcpu); ++int xen_set_affinity_evtchn(struct irq_desc *desc, unsigned int tcpu); + + static inline void notify_remote_via_evtchn(int port) + { +diff --git a/init/Kconfig b/init/Kconfig +index 0e2344389501..093e054c521c 100644 +--- a/init/Kconfig ++++ b/init/Kconfig +@@ -65,6 +65,47 @@ config THREAD_INFO_IN_TASK + + menu "General setup" + ++config ZEN_INTERACTIVE ++ bool "Tune kernel for interactivity" ++ default y ++ help ++ Tunes the kernel for responsiveness at the cost of throughput and power usage. ++ ++ --- Virtual Memory Subsystem --------------------------- ++ ++ Mem dirty before bg writeback..: 10 % -> 20 % ++ Mem dirty before sync writeback: 20 % -> 50 % ++ ++ --- Block Layer ---------------------------------------- ++ ++ Queue depth...............: 128 -> 512 ++ Default scheduler.........: mq-deadline -> bfq ++ ++ --- CFS CPU Scheduler ---------------------------------- ++ ++ Scheduling latency.............: 6 -> 4 ms ++ Minimal granularity............: 0.75 -> 0.4 ms ++ Wakeup granularity.............: 1 -> 0.5 ms ++ CPU migration cost.............: 0.5 -> 0.25 ms ++ Bandwidth slice size...........: 5 -> 3 ms ++ Ondemand sampling down factor..: 1 -> 5 ++ ++ --- MuQSS CPU Scheduler -------------------------------- ++ ++ Scheduling interval............: 6 -> 2 ms ++ ISO task max realtime use......: 70 % -> 25 % ++ Ondemand sampling down factor..: 1 -> 5 ++ Yield type.....................: 1 -> 2 ++ ++config SCHED_MUQSS ++ bool "MuQSS cpu scheduler" ++ select HIGH_RES_TIMERS ++ default n ++ ---help--- ++ The Multiple Queue Skiplist Scheduler for excellent interactivity and ++ responsiveness on the desktop and highly scalable deterministic ++ low latency on any hardware. ++ + config BROKEN + bool + +@@ -711,6 +752,7 @@ config NUMA_BALANCING + depends on ARCH_SUPPORTS_NUMA_BALANCING + depends on !ARCH_WANT_NUMA_VARIABLE_LOCALITY + depends on SMP && NUMA && MIGRATION ++ depends on !SCHED_MUQSS + help + This option adds support for automatic NUMA aware memory/task placement. + The mechanism is quite primitive and is based on migrating memory when +@@ -818,9 +860,13 @@ menuconfig CGROUP_SCHED + help + This feature lets CPU scheduler recognize task groups and control CPU + bandwidth allocation to such task groups. It uses cgroups to group +- tasks. ++ tasks. In combination with MuQSS this is purely a STUB to create the ++ files associated with the CPU controller cgroup but most of the ++ controls do nothing. This is useful for working in environments and ++ with applications that will only work if this control group is ++ present. + +-if CGROUP_SCHED ++if CGROUP_SCHED && !SCHED_MUQSS + config FAIR_GROUP_SCHED + bool "Group scheduling for SCHED_OTHER" + depends on CGROUP_SCHED +@@ -927,6 +973,7 @@ config CGROUP_DEVICE + + config CGROUP_CPUACCT + bool "Simple CPU accounting controller" ++ depends on !SCHED_MUQSS + help + Provides a simple controller for monitoring the + total CPU consumed by the tasks in a cgroup. +@@ -1013,6 +1060,22 @@ config USER_NS + + If unsure, say N. + ++config USER_NS_UNPRIVILEGED ++ bool "Allow unprivileged users to create namespaces" ++ default y ++ depends on USER_NS ++ help ++ When disabled, unprivileged users will not be able to create ++ new namespaces. Allowing users to create their own namespaces ++ has been part of several recent local privilege escalation ++ exploits, so if you need user namespaces but are ++ paranoid^Wsecurity-conscious you want to disable this. ++ ++ This setting can be overridden at runtime via the ++ kernel.unprivileged_userns_clone sysctl. ++ ++ If unsure, say Y. ++ + config PID_NS + bool "PID Namespaces" + default y +@@ -1045,6 +1108,7 @@ config CHECKPOINT_RESTORE + + config SCHED_AUTOGROUP + bool "Automatic process group scheduling" ++ depends on !SCHED_MUQSS + select CGROUPS + select CGROUP_SCHED + select FAIR_GROUP_SCHED +@@ -1137,6 +1201,14 @@ config CC_OPTIMIZE_FOR_PERFORMANCE + with the "-O2" compiler flag for best performance and most + helpful compile-time warnings. + ++config CC_OPTIMIZE_HARDER ++ bool "Optimize harder" ++ imply CC_DISABLE_WARN_MAYBE_UNINITIALIZED # avoid false positives ++ help ++ This option will pass "-O3" to your compiler resulting in a ++ larger and faster kernel. The more complex optimizations also ++ increase compilation time and may affect stability. ++ + config CC_OPTIMIZE_FOR_SIZE + bool "Optimize for size" + imply CC_DISABLE_WARN_MAYBE_UNINITIALIZED # avoid false positives +diff --git a/init/init_task.c b/init/init_task.c +index c70ef656d0f4..91fab35e0d51 100644 +--- a/init/init_task.c ++++ b/init/init_task.c +@@ -68,9 +68,17 @@ struct task_struct init_task + .stack = init_stack, + .usage = REFCOUNT_INIT(2), + .flags = PF_KTHREAD, ++#ifdef CONFIG_SCHED_MUQSS ++ .prio = NORMAL_PRIO, ++ .static_prio = MAX_PRIO-20, ++ .normal_prio = NORMAL_PRIO, ++ .deadline = 0, ++ .time_slice = 1000000, ++#else + .prio = MAX_PRIO - 20, + .static_prio = MAX_PRIO - 20, + .normal_prio = MAX_PRIO - 20, ++#endif + .policy = SCHED_NORMAL, + .cpus_allowed = CPU_MASK_ALL, + .nr_cpus_allowed= NR_CPUS, +@@ -79,6 +87,7 @@ struct task_struct init_task + .restart_block = { + .fn = do_no_restart_syscall, + }, ++#ifndef CONFIG_SCHED_MUQSS + .se = { + .group_node = LIST_HEAD_INIT(init_task.se.group_node), + }, +@@ -86,6 +95,7 @@ struct task_struct init_task + .run_list = LIST_HEAD_INIT(init_task.rt.run_list), + .time_slice = RR_TIMESLICE, + }, ++#endif + .tasks = LIST_HEAD_INIT(init_task.tasks), + #ifdef CONFIG_SMP + .pushable_tasks = PLIST_NODE_INIT(init_task.pushable_tasks, MAX_PRIO), +diff --git a/init/main.c b/init/main.c +index 66a196c5e4c3..cc931fed2f3c 100644 +--- a/init/main.c ++++ b/init/main.c +@@ -1102,6 +1102,8 @@ static int __ref kernel_init(void *unused) + + rcu_end_inkernel_boot(); + ++ print_scheduler_version(); ++ + if (ramdisk_execute_command) { + ret = run_init_process(ramdisk_execute_command); + if (!ret) +diff --git a/ipc/mqueue.c b/ipc/mqueue.c +index 216cad1ff0d0..65c351564ad0 100644 +--- a/ipc/mqueue.c ++++ b/ipc/mqueue.c +@@ -438,7 +438,6 @@ static void mqueue_evict_inode(struct inode *inode) + { + struct mqueue_inode_info *info; + struct user_struct *user; +- unsigned long mq_bytes, mq_treesize; + struct ipc_namespace *ipc_ns; + struct msg_msg *msg, *nmsg; + LIST_HEAD(tmp_msg); +@@ -461,16 +460,18 @@ static void mqueue_evict_inode(struct inode *inode) + free_msg(msg); + } + +- /* Total amount of bytes accounted for the mqueue */ +- mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) + +- min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) * +- sizeof(struct posix_msg_tree_node); +- +- mq_bytes = mq_treesize + (info->attr.mq_maxmsg * +- info->attr.mq_msgsize); +- + user = info->user; + if (user) { ++ unsigned long mq_bytes, mq_treesize; ++ ++ /* Total amount of bytes accounted for the mqueue */ ++ mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) + ++ min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) * ++ sizeof(struct posix_msg_tree_node); ++ ++ mq_bytes = mq_treesize + (info->attr.mq_maxmsg * ++ info->attr.mq_msgsize); ++ + spin_lock(&mq_lock); + user->mq_bytes -= mq_bytes; + /* +diff --git a/kernel/Kconfig.MuQSS b/kernel/Kconfig.MuQSS +new file mode 100644 +index 000000000000..558a7cb02cb9 +--- /dev/null ++++ b/kernel/Kconfig.MuQSS +@@ -0,0 +1,89 @@ ++choice ++ prompt "CPU scheduler runqueue sharing" ++ default RQ_MC if SCHED_MUQSS ++ default RQ_NONE ++ ++config RQ_NONE ++ bool "No sharing" ++ help ++ This is the default behaviour where the CPU scheduler has one runqueue ++ per CPU, whether it is a physical or logical CPU (hyperthread). ++ ++ This can still be enabled runtime with the boot parameter ++ rqshare=none ++ ++ If unsure, say N. ++ ++config RQ_SMT ++ bool "SMT (hyperthread) siblings" ++ depends on SCHED_SMT && SCHED_MUQSS ++ ++ help ++ With this option enabled, the CPU scheduler will have one runqueue ++ shared by SMT (hyperthread) siblings. As these logical cores share ++ one physical core, sharing the runqueue resource can lead to decreased ++ overhead, lower latency and higher throughput. ++ ++ This can still be enabled runtime with the boot parameter ++ rqshare=smt ++ ++ If unsure, say N. ++ ++config RQ_MC ++ bool "Multicore siblings" ++ depends on SCHED_MC && SCHED_MUQSS ++ help ++ With this option enabled, the CPU scheduler will have one runqueue ++ shared by multicore siblings in addition to any SMT siblings. ++ As these physical cores share caches, sharing the runqueue resource ++ will lead to lower latency, but its effects on overhead and throughput ++ are less predictable. As a general rule, 6 or fewer cores will likely ++ benefit from this, while larger CPUs will only derive a latency ++ benefit. If your workloads are primarily single threaded, this will ++ possibly worsen throughput. If you are only concerned about latency ++ then enable this regardless of how many cores you have. ++ ++ This can still be enabled runtime with the boot parameter ++ rqshare=mc ++ ++ If unsure, say Y. ++ ++config RQ_SMP ++ bool "Symmetric Multi-Processing" ++ depends on SMP && SCHED_MUQSS ++ help ++ With this option enabled, the CPU scheduler will have one runqueue ++ shared by all physical CPUs unless they are on separate NUMA nodes. ++ As physical CPUs usually do not share resources, sharing the runqueue ++ will normally worsen throughput but improve latency. If you only ++ care about latency enable this. ++ ++ This can still be enabled runtime with the boot parameter ++ rqshare=smp ++ ++ If unsure, say N. ++ ++config RQ_ALL ++ bool "NUMA" ++ depends on SMP && SCHED_MUQSS ++ help ++ With this option enabled, the CPU scheduler will have one runqueue ++ regardless of the architecture configuration, including across NUMA ++ nodes. This can substantially decrease throughput in NUMA ++ configurations, but light NUMA designs will not be dramatically ++ affected. This option should only be chosen if latency is the prime ++ concern. ++ ++ This can still be enabled runtime with the boot parameter ++ rqshare=all ++ ++ If unsure, say N. ++endchoice ++ ++config SHARERQ ++ int ++ default 0 if RQ_NONE ++ default 1 if RQ_SMT ++ default 2 if RQ_MC ++ default 3 if RQ_SMP ++ default 4 if RQ_ALL +diff --git a/kernel/Makefile b/kernel/Makefile +index a8d923b5481b..b8ec0b21ee99 100644 +--- a/kernel/Makefile ++++ b/kernel/Makefile +@@ -10,7 +10,7 @@ obj-y = fork.o exec_domain.o panic.o \ + extable.o params.o \ + kthread.o sys_ni.o nsproxy.o \ + notifier.o ksysfs.o cred.o reboot.o \ +- async.o range.o smpboot.o ucount.o ++ async.o range.o smpboot.o ucount.o skip_list.o + + obj-$(CONFIG_MODULES) += kmod.o + obj-$(CONFIG_MULTIUSER) += groups.o +diff --git a/kernel/bpf/Makefile b/kernel/bpf/Makefile +index 4c2fa3ac56f6..29d781061cd5 100644 +--- a/kernel/bpf/Makefile ++++ b/kernel/bpf/Makefile +@@ -1,5 +1,6 @@ + # SPDX-License-Identifier: GPL-2.0 + obj-y := core.o ++CFLAGS_core.o += $(call cc-disable-warning, override-init) + + obj-$(CONFIG_BPF_SYSCALL) += syscall.o verifier.o inode.o helpers.o tnum.o + obj-$(CONFIG_BPF_SYSCALL) += hashtab.o arraymap.o percpu_freelist.o bpf_lru_list.o lpm_trie.o map_in_map.o +diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c +index cad09858a5f2..5fcc7a17eb5a 100644 +--- a/kernel/bpf/btf.c ++++ b/kernel/bpf/btf.c +@@ -1073,11 +1073,18 @@ const struct btf_type *btf_type_id_size(const struct btf *btf, + !btf_type_is_var(size_type))) + return NULL; + +- size = btf->resolved_sizes[size_type_id]; + size_type_id = btf->resolved_ids[size_type_id]; + size_type = btf_type_by_id(btf, size_type_id); + if (btf_type_nosize_or_null(size_type)) + return NULL; ++ else if (btf_type_has_size(size_type)) ++ size = size_type->size; ++ else if (btf_type_is_array(size_type)) ++ size = btf->resolved_sizes[size_type_id]; ++ else if (btf_type_is_ptr(size_type)) ++ size = sizeof(void *); ++ else ++ return NULL; + } + + *type_id = size_type_id; +@@ -1602,7 +1609,6 @@ static int btf_modifier_resolve(struct btf_verifier_env *env, + const struct btf_type *next_type; + u32 next_type_id = t->type; + struct btf *btf = env->btf; +- u32 next_type_size = 0; + + next_type = btf_type_by_id(btf, next_type_id); + if (!next_type || btf_type_is_resolve_source_only(next_type)) { +@@ -1620,7 +1626,7 @@ static int btf_modifier_resolve(struct btf_verifier_env *env, + * save us a few type-following when we use it later (e.g. in + * pretty print). + */ +- if (!btf_type_id_size(btf, &next_type_id, &next_type_size)) { ++ if (!btf_type_id_size(btf, &next_type_id, NULL)) { + if (env_type_is_resolved(env, next_type_id)) + next_type = btf_type_id_resolve(btf, &next_type_id); + +@@ -1633,7 +1639,7 @@ static int btf_modifier_resolve(struct btf_verifier_env *env, + } + } + +- env_stack_pop_resolved(env, next_type_id, next_type_size); ++ env_stack_pop_resolved(env, next_type_id, 0); + + return 0; + } +@@ -1645,7 +1651,6 @@ static int btf_var_resolve(struct btf_verifier_env *env, + const struct btf_type *t = v->t; + u32 next_type_id = t->type; + struct btf *btf = env->btf; +- u32 next_type_size; + + next_type = btf_type_by_id(btf, next_type_id); + if (!next_type || btf_type_is_resolve_source_only(next_type)) { +@@ -1675,12 +1680,12 @@ static int btf_var_resolve(struct btf_verifier_env *env, + * forward types or similar that would resolve to size of + * zero is allowed. + */ +- if (!btf_type_id_size(btf, &next_type_id, &next_type_size)) { ++ if (!btf_type_id_size(btf, &next_type_id, NULL)) { + btf_verifier_log_type(env, v->t, "Invalid type_id"); + return -EINVAL; + } + +- env_stack_pop_resolved(env, next_type_id, next_type_size); ++ env_stack_pop_resolved(env, next_type_id, 0); + + return 0; + } +@@ -1928,8 +1933,8 @@ static int btf_array_resolve(struct btf_verifier_env *env, + /* Check array->index_type */ + index_type_id = array->index_type; + index_type = btf_type_by_id(btf, index_type_id); +- if (btf_type_is_resolve_source_only(index_type) || +- btf_type_nosize_or_null(index_type)) { ++ if (btf_type_nosize_or_null(index_type) || ++ btf_type_is_resolve_source_only(index_type)) { + btf_verifier_log_type(env, v->t, "Invalid index"); + return -EINVAL; + } +@@ -1948,8 +1953,8 @@ static int btf_array_resolve(struct btf_verifier_env *env, + /* Check array->type */ + elem_type_id = array->type; + elem_type = btf_type_by_id(btf, elem_type_id); +- if (btf_type_is_resolve_source_only(elem_type) || +- btf_type_nosize_or_null(elem_type)) { ++ if (btf_type_nosize_or_null(elem_type) || ++ btf_type_is_resolve_source_only(elem_type)) { + btf_verifier_log_type(env, v->t, + "Invalid elem"); + return -EINVAL; +@@ -2170,8 +2175,8 @@ static int btf_struct_resolve(struct btf_verifier_env *env, + const struct btf_type *member_type = btf_type_by_id(env->btf, + member_type_id); + +- if (btf_type_is_resolve_source_only(member_type) || +- btf_type_nosize_or_null(member_type)) { ++ if (btf_type_nosize_or_null(member_type) || ++ btf_type_is_resolve_source_only(member_type)) { + btf_verifier_log_member(env, v->t, member, + "Invalid member"); + return -EINVAL; +diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c +index 080e2bb644cc..ceee0730fba5 100644 +--- a/kernel/bpf/core.c ++++ b/kernel/bpf/core.c +@@ -1295,7 +1295,7 @@ bool bpf_opcode_in_insntable(u8 code) + * + * Decode and execute eBPF instructions. + */ +-static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack) ++static u64 __no_fgcse ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack) + { + #define BPF_INSN_2_LBL(x, y) [BPF_##x | BPF_##y] = &&x##_##y + #define BPF_INSN_3_LBL(x, y, z) [BPF_##x | BPF_##y | BPF_##z] = &&x##_##y##_##z +@@ -1364,10 +1364,10 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn, u64 *stack) + insn++; + CONT; + ALU_ARSH_X: +- DST = (u64) (u32) ((*(s32 *) &DST) >> SRC); ++ DST = (u64) (u32) (((s32) DST) >> SRC); + CONT; + ALU_ARSH_K: +- DST = (u64) (u32) ((*(s32 *) &DST) >> IMM); ++ DST = (u64) (u32) (((s32) DST) >> IMM); + CONT; + ALU64_ARSH_X: + (*(s64 *) &DST) >>= SRC; +diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c +index a5c369e60343..11528bdaa9dc 100644 +--- a/kernel/bpf/verifier.c ++++ b/kernel/bpf/verifier.c +@@ -6456,17 +6456,18 @@ static int is_state_visited(struct bpf_verifier_env *env, int insn_idx) + * the state of the call instruction (with WRITTEN set), and r0 comes + * from callee with its full parentage chain, anyway. + */ +- for (j = 0; j <= cur->curframe; j++) +- for (i = j < cur->curframe ? BPF_REG_6 : 0; i < BPF_REG_FP; i++) +- cur->frame[j]->regs[i].parent = &new->frame[j]->regs[i]; + /* clear write marks in current state: the writes we did are not writes + * our child did, so they don't screen off its reads from us. + * (There are no read marks in current state, because reads always mark + * their parent and current state never has children yet. Only + * explored_states can get read marks.) + */ +- for (i = 0; i < BPF_REG_FP; i++) +- cur->frame[cur->curframe]->regs[i].live = REG_LIVE_NONE; ++ for (j = 0; j <= cur->curframe; j++) { ++ for (i = j < cur->curframe ? BPF_REG_6 : 0; i < BPF_REG_FP; i++) ++ cur->frame[j]->regs[i].parent = &new->frame[j]->regs[i]; ++ for (i = 0; i < BPF_REG_FP; i++) ++ cur->frame[j]->regs[i].live = REG_LIVE_NONE; ++ } + + /* all stack frames are accessible from callee, clear them all */ + for (j = 0; j <= cur->curframe; j++) { +diff --git a/kernel/cred.c b/kernel/cred.c +index c73a87a4df13..153ae369e024 100644 +--- a/kernel/cred.c ++++ b/kernel/cred.c +@@ -144,7 +144,10 @@ void __put_cred(struct cred *cred) + BUG_ON(cred == current->cred); + BUG_ON(cred == current->real_cred); + +- call_rcu(&cred->rcu, put_cred_rcu); ++ if (cred->non_rcu) ++ put_cred_rcu(&cred->rcu); ++ else ++ call_rcu(&cred->rcu, put_cred_rcu); + } + EXPORT_SYMBOL(__put_cred); + +@@ -256,6 +259,7 @@ struct cred *prepare_creds(void) + old = task->cred; + memcpy(new, old, sizeof(struct cred)); + ++ new->non_rcu = 0; + atomic_set(&new->usage, 1); + set_cred_subscribers(new, 0); + get_group_info(new->group_info); +@@ -535,7 +539,19 @@ const struct cred *override_creds(const struct cred *new) + + validate_creds(old); + validate_creds(new); +- get_cred(new); ++ ++ /* ++ * NOTE! This uses 'get_new_cred()' rather than 'get_cred()'. ++ * ++ * That means that we do not clear the 'non_rcu' flag, since ++ * we are only installing the cred into the thread-synchronous ++ * '->cred' pointer, not the '->real_cred' pointer that is ++ * visible to other threads under RCU. ++ * ++ * Also note that we did validate_creds() manually, not depending ++ * on the validation in 'get_cred()'. ++ */ ++ get_new_cred((struct cred *)new); + alter_cred_subscribers(new, 1); + rcu_assign_pointer(current->cred, new); + alter_cred_subscribers(old, -1); +@@ -672,6 +688,7 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon) + validate_creds(old); + + *new = *old; ++ new->non_rcu = 0; + atomic_set(&new->usage, 1); + set_cred_subscribers(new, 0); + get_uid(new->user); +diff --git a/kernel/delayacct.c b/kernel/delayacct.c +index 27725754ac99..769d773c7182 100644 +--- a/kernel/delayacct.c ++++ b/kernel/delayacct.c +@@ -106,7 +106,7 @@ int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk) + */ + t1 = tsk->sched_info.pcount; + t2 = tsk->sched_info.run_delay; +- t3 = tsk->se.sum_exec_runtime; ++ t3 = tsk_seruntime(tsk); + + d->cpu_count += t1; + +diff --git a/kernel/dma/remap.c b/kernel/dma/remap.c +index 7a723194ecbe..0207e3764d52 100644 +--- a/kernel/dma/remap.c ++++ b/kernel/dma/remap.c +@@ -158,6 +158,9 @@ int __init dma_atomic_pool_init(gfp_t gfp, pgprot_t prot) + + bool dma_in_atomic_pool(void *start, size_t size) + { ++ if (unlikely(!atomic_pool)) ++ return false; ++ + return addr_in_gen_pool(atomic_pool, (unsigned long)start, size); + } + +diff --git a/kernel/dma/swiotlb.c b/kernel/dma/swiotlb.c +index 13f0cb080a4d..5f4e1b78babb 100644 +--- a/kernel/dma/swiotlb.c ++++ b/kernel/dma/swiotlb.c +@@ -546,7 +546,7 @@ phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, + if (!(attrs & DMA_ATTR_NO_WARN) && printk_ratelimit()) + dev_warn(hwdev, "swiotlb buffer is full (sz: %zd bytes), total %lu (slots), used %lu (slots)\n", + size, io_tlb_nslabs, tmp_io_tlb_used); +- return DMA_MAPPING_ERROR; ++ return (phys_addr_t)DMA_MAPPING_ERROR; + found: + io_tlb_used += nslots; + spin_unlock_irqrestore(&io_tlb_lock, flags); +@@ -664,7 +664,7 @@ bool swiotlb_map(struct device *dev, phys_addr_t *phys, dma_addr_t *dma_addr, + /* Oh well, have to allocate and map a bounce buffer. */ + *phys = swiotlb_tbl_map_single(dev, __phys_to_dma(dev, io_tlb_start), + *phys, size, dir, attrs); +- if (*phys == DMA_MAPPING_ERROR) ++ if (*phys == (phys_addr_t)DMA_MAPPING_ERROR) + return false; + + /* Ensure that the address returned is DMA'ble */ +diff --git a/kernel/events/core.c b/kernel/events/core.c +index f85929ce13be..4bc15cff1026 100644 +--- a/kernel/events/core.c ++++ b/kernel/events/core.c +@@ -2553,6 +2553,9 @@ static int __perf_install_in_context(void *info) + return ret; + } + ++static bool exclusive_event_installable(struct perf_event *event, ++ struct perf_event_context *ctx); ++ + /* + * Attach a performance event to a context. + * +@@ -2567,6 +2570,8 @@ perf_install_in_context(struct perf_event_context *ctx, + + lockdep_assert_held(&ctx->mutex); + ++ WARN_ON_ONCE(!exclusive_event_installable(event, ctx)); ++ + if (event->cpu != -1) + event->cpu = cpu; + +@@ -4358,7 +4363,7 @@ static int exclusive_event_init(struct perf_event *event) + { + struct pmu *pmu = event->pmu; + +- if (!(pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE)) ++ if (!is_exclusive_pmu(pmu)) + return 0; + + /* +@@ -4389,7 +4394,7 @@ static void exclusive_event_destroy(struct perf_event *event) + { + struct pmu *pmu = event->pmu; + +- if (!(pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE)) ++ if (!is_exclusive_pmu(pmu)) + return; + + /* see comment in exclusive_event_init() */ +@@ -4409,14 +4414,15 @@ static bool exclusive_event_match(struct perf_event *e1, struct perf_event *e2) + return false; + } + +-/* Called under the same ctx::mutex as perf_install_in_context() */ + static bool exclusive_event_installable(struct perf_event *event, + struct perf_event_context *ctx) + { + struct perf_event *iter_event; + struct pmu *pmu = event->pmu; + +- if (!(pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE)) ++ lockdep_assert_held(&ctx->mutex); ++ ++ if (!is_exclusive_pmu(pmu)) + return true; + + list_for_each_entry(iter_event, &ctx->event_list, event_entry) { +@@ -4463,12 +4469,20 @@ static void _free_event(struct perf_event *event) + if (event->destroy) + event->destroy(event); + +- if (event->ctx) +- put_ctx(event->ctx); +- ++ /* ++ * Must be after ->destroy(), due to uprobe_perf_close() using ++ * hw.target. ++ */ + if (event->hw.target) + put_task_struct(event->hw.target); + ++ /* ++ * perf_event_free_task() relies on put_ctx() being 'last', in particular ++ * all task references must be cleaned up. ++ */ ++ if (event->ctx) ++ put_ctx(event->ctx); ++ + exclusive_event_destroy(event); + module_put(event->pmu->module); + +@@ -4648,8 +4662,17 @@ int perf_event_release_kernel(struct perf_event *event) + mutex_unlock(&event->child_mutex); + + list_for_each_entry_safe(child, tmp, &free_list, child_list) { ++ void *var = &child->ctx->refcount; ++ + list_del(&child->child_list); + free_event(child); ++ ++ /* ++ * Wake any perf_event_free_task() waiting for this event to be ++ * freed. ++ */ ++ smp_mb(); /* pairs with wait_var_event() */ ++ wake_up_var(var); + } + + no_ctx: +@@ -10922,11 +10945,6 @@ SYSCALL_DEFINE5(perf_event_open, + goto err_alloc; + } + +- if ((pmu->capabilities & PERF_PMU_CAP_EXCLUSIVE) && group_leader) { +- err = -EBUSY; +- goto err_context; +- } +- + /* + * Look up the group leader (we will attach this event to it): + */ +@@ -11014,6 +11032,18 @@ SYSCALL_DEFINE5(perf_event_open, + move_group = 0; + } + } ++ ++ /* ++ * Failure to create exclusive events returns -EBUSY. ++ */ ++ err = -EBUSY; ++ if (!exclusive_event_installable(group_leader, ctx)) ++ goto err_locked; ++ ++ for_each_sibling_event(sibling, group_leader) { ++ if (!exclusive_event_installable(sibling, ctx)) ++ goto err_locked; ++ } + } else { + mutex_lock(&ctx->mutex); + } +@@ -11050,9 +11080,6 @@ SYSCALL_DEFINE5(perf_event_open, + * because we need to serialize with concurrent event creation. + */ + if (!exclusive_event_installable(event, ctx)) { +- /* exclusive and group stuff are assumed mutually exclusive */ +- WARN_ON_ONCE(move_group); +- + err = -EBUSY; + goto err_locked; + } +@@ -11239,7 +11266,7 @@ perf_event_create_kernel_counter(struct perf_event_attr *attr, int cpu, + goto err_unlock; + } + +- perf_install_in_context(ctx, event, cpu); ++ perf_install_in_context(ctx, event, event->cpu); + perf_unpin_context(ctx); + mutex_unlock(&ctx->mutex); + +@@ -11519,11 +11546,11 @@ static void perf_free_event(struct perf_event *event, + } + + /* +- * Free an unexposed, unused context as created by inheritance by +- * perf_event_init_task below, used by fork() in case of fail. ++ * Free a context as created by inheritance by perf_event_init_task() below, ++ * used by fork() in case of fail. + * +- * Not all locks are strictly required, but take them anyway to be nice and +- * help out with the lockdep assertions. ++ * Even though the task has never lived, the context and events have been ++ * exposed through the child_list, so we must take care tearing it all down. + */ + void perf_event_free_task(struct task_struct *task) + { +@@ -11553,7 +11580,23 @@ void perf_event_free_task(struct task_struct *task) + perf_free_event(event, ctx); + + mutex_unlock(&ctx->mutex); +- put_ctx(ctx); ++ ++ /* ++ * perf_event_release_kernel() could've stolen some of our ++ * child events and still have them on its free_list. In that ++ * case we must wait for these events to have been freed (in ++ * particular all their references to this task must've been ++ * dropped). ++ * ++ * Without this copy_process() will unconditionally free this ++ * task (irrespective of its reference count) and ++ * _free_event()'s put_task_struct(event->hw.target) will be a ++ * use-after-free. ++ * ++ * Wait for all events to drop their context reference. ++ */ ++ wait_var_event(&ctx->refcount, refcount_read(&ctx->refcount) == 1); ++ put_ctx(ctx); /* must be last */ + } + } + +diff --git a/kernel/exit.c b/kernel/exit.c +index a75b6a7f458a..b63fdd44efe1 100644 +--- a/kernel/exit.c ++++ b/kernel/exit.c +@@ -131,7 +131,7 @@ static void __exit_signal(struct task_struct *tsk) + sig->curr_target = next_thread(tsk); + } + +- add_device_randomness((const void*) &tsk->se.sum_exec_runtime, ++ add_device_randomness((const void*) &tsk_seruntime(tsk), + sizeof(unsigned long long)); + + /* +@@ -152,7 +152,7 @@ static void __exit_signal(struct task_struct *tsk) + sig->inblock += task_io_get_inblock(tsk); + sig->oublock += task_io_get_oublock(tsk); + task_io_accounting_add(&sig->ioac, &tsk->ioac); +- sig->sum_sched_runtime += tsk->se.sum_exec_runtime; ++ sig->sum_sched_runtime += tsk_seruntime(tsk); + sig->nr_threads--; + __unhash_process(tsk, group_dead); + write_sequnlock(&sig->stats_lock); +diff --git a/kernel/fork.c b/kernel/fork.c +index fe83343da24b..5af242ba790f 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -106,6 +106,11 @@ + + #define CREATE_TRACE_POINTS + #include ++#ifdef CONFIG_USER_NS ++extern int unprivileged_userns_clone; ++#else ++#define unprivileged_userns_clone 0 ++#endif + + /* + * Minimum number of threads to boot the kernel +@@ -727,7 +732,7 @@ void __put_task_struct(struct task_struct *tsk) + WARN_ON(tsk == current); + + cgroup_free(tsk); +- task_numa_free(tsk); ++ task_numa_free(tsk, true); + security_task_free(tsk); + exit_creds(tsk); + delayacct_tsk_free(tsk); +@@ -1765,6 +1770,10 @@ static __latent_entropy struct task_struct *copy_process( + if ((clone_flags & (CLONE_NEWUSER|CLONE_FS)) == (CLONE_NEWUSER|CLONE_FS)) + return ERR_PTR(-EINVAL); + ++ if ((clone_flags & CLONE_NEWUSER) && !unprivileged_userns_clone) ++ if (!capable(CAP_SYS_ADMIN)) ++ return ERR_PTR(-EPERM); ++ + /* + * Thread groups must share signals as well, and detached threads + * can only be started up within the thread group. +@@ -2653,6 +2662,12 @@ int ksys_unshare(unsigned long unshare_flags) + if (unshare_flags & CLONE_NEWNS) + unshare_flags |= CLONE_FS; + ++ if ((unshare_flags & CLONE_NEWUSER) && !unprivileged_userns_clone) { ++ err = -EPERM; ++ if (!capable(CAP_SYS_ADMIN)) ++ goto bad_unshare_out; ++ } ++ + err = check_unshare_flags(unshare_flags); + if (err) + goto bad_unshare_out; +diff --git a/kernel/iomem.c b/kernel/iomem.c +index 93c264444510..62c92e43aa0d 100644 +--- a/kernel/iomem.c ++++ b/kernel/iomem.c +@@ -121,7 +121,7 @@ EXPORT_SYMBOL(memremap); + + void memunmap(void *addr) + { +- if (is_vmalloc_addr(addr)) ++ if (is_ioremap_addr(addr)) + iounmap((void __iomem *) addr); + } + EXPORT_SYMBOL(memunmap); +diff --git a/kernel/irq/affinity.c b/kernel/irq/affinity.c +index f18cd5aa33e8..656c14333613 100644 +--- a/kernel/irq/affinity.c ++++ b/kernel/irq/affinity.c +@@ -253,11 +253,9 @@ irq_create_affinity_masks(unsigned int nvecs, struct irq_affinity *affd) + * Determine the number of vectors which need interrupt affinities + * assigned. If the pre/post request exhausts the available vectors + * then nothing to do here except for invoking the calc_sets() +- * callback so the device driver can adjust to the situation. If there +- * is only a single vector, then managing the queue is pointless as +- * well. ++ * callback so the device driver can adjust to the situation. + */ +- if (nvecs > 1 && nvecs > affd->pre_vectors + affd->post_vectors) ++ if (nvecs > affd->pre_vectors + affd->post_vectors) + affvecs = nvecs - affd->pre_vectors - affd->post_vectors; + else + affvecs = 0; +diff --git a/kernel/irq/autoprobe.c b/kernel/irq/autoprobe.c +index 16cbf6beb276..ae60cae24e9a 100644 +--- a/kernel/irq/autoprobe.c ++++ b/kernel/irq/autoprobe.c +@@ -90,7 +90,7 @@ unsigned long probe_irq_on(void) + /* It triggered already - consider it spurious. */ + if (!(desc->istate & IRQS_WAITING)) { + desc->istate &= ~IRQS_AUTODETECT; +- irq_shutdown(desc); ++ irq_shutdown_and_deactivate(desc); + } else + if (i < 32) + mask |= 1 << i; +@@ -127,7 +127,7 @@ unsigned int probe_irq_mask(unsigned long val) + mask |= 1 << i; + + desc->istate &= ~IRQS_AUTODETECT; +- irq_shutdown(desc); ++ irq_shutdown_and_deactivate(desc); + } + raw_spin_unlock_irq(&desc->lock); + } +@@ -169,7 +169,7 @@ int probe_irq_off(unsigned long val) + nr_of_irqs++; + } + desc->istate &= ~IRQS_AUTODETECT; +- irq_shutdown(desc); ++ irq_shutdown_and_deactivate(desc); + } + raw_spin_unlock_irq(&desc->lock); + } +diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c +index 29d6c7d070b4..b76703b2c0af 100644 +--- a/kernel/irq/chip.c ++++ b/kernel/irq/chip.c +@@ -314,6 +314,12 @@ void irq_shutdown(struct irq_desc *desc) + } + irq_state_clr_started(desc); + } ++} ++ ++ ++void irq_shutdown_and_deactivate(struct irq_desc *desc) ++{ ++ irq_shutdown(desc); + /* + * This must be called even if the interrupt was never started up, + * because the activation can happen before the interrupt is +@@ -748,6 +754,8 @@ void handle_fasteoi_nmi(struct irq_desc *desc) + unsigned int irq = irq_desc_get_irq(desc); + irqreturn_t res; + ++ __kstat_incr_irqs_this_cpu(desc); ++ + trace_irq_handler_entry(irq, action); + /* + * NMIs cannot be shared, there is only one action. +@@ -962,6 +970,8 @@ void handle_percpu_devid_fasteoi_nmi(struct irq_desc *desc) + unsigned int irq = irq_desc_get_irq(desc); + irqreturn_t res; + ++ __kstat_incr_irqs_this_cpu(desc); ++ + trace_irq_handler_entry(irq, action); + res = action->handler(irq, raw_cpu_ptr(action->percpu_dev_id)); + trace_irq_handler_exit(irq, action, res); +diff --git a/kernel/irq/cpuhotplug.c b/kernel/irq/cpuhotplug.c +index 5b1072e394b2..6c7ca2e983a5 100644 +--- a/kernel/irq/cpuhotplug.c ++++ b/kernel/irq/cpuhotplug.c +@@ -116,7 +116,7 @@ static bool migrate_one_irq(struct irq_desc *desc) + */ + if (irqd_affinity_is_managed(d)) { + irqd_set_managed_shutdown(d); +- irq_shutdown(desc); ++ irq_shutdown_and_deactivate(desc); + return false; + } + affinity = cpu_online_mask; +diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h +index 70c3053bc1f6..3a948f41ab00 100644 +--- a/kernel/irq/internals.h ++++ b/kernel/irq/internals.h +@@ -82,6 +82,7 @@ extern int irq_activate_and_startup(struct irq_desc *desc, bool resend); + extern int irq_startup(struct irq_desc *desc, bool resend, bool force); + + extern void irq_shutdown(struct irq_desc *desc); ++extern void irq_shutdown_and_deactivate(struct irq_desc *desc); + extern void irq_enable(struct irq_desc *desc); + extern void irq_disable(struct irq_desc *desc); + extern void irq_percpu_enable(struct irq_desc *desc, unsigned int cpu); +@@ -96,6 +97,10 @@ static inline void irq_mark_irq(unsigned int irq) { } + extern void irq_mark_irq(unsigned int irq); + #endif + ++extern int __irq_get_irqchip_state(struct irq_data *data, ++ enum irqchip_irq_state which, ++ bool *state); ++ + extern void init_kstat_irqs(struct irq_desc *desc, int node, int nr); + + irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc, unsigned int *flags); +diff --git a/kernel/irq/irqdesc.c b/kernel/irq/irqdesc.c +index c52b737ab8e3..9484e88dabc2 100644 +--- a/kernel/irq/irqdesc.c ++++ b/kernel/irq/irqdesc.c +@@ -680,6 +680,8 @@ int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq, + * @hwirq: The HW irq number to convert to a logical one + * @regs: Register file coming from the low-level handling code + * ++ * This function must be called from an NMI context. ++ * + * Returns: 0 on success, or -EINVAL if conversion has failed + */ + int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq, +@@ -689,7 +691,10 @@ int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq, + unsigned int irq; + int ret = 0; + +- nmi_enter(); ++ /* ++ * NMI context needs to be setup earlier in order to deal with tracing. ++ */ ++ WARN_ON(!in_nmi()); + + irq = irq_find_mapping(domain, hwirq); + +@@ -702,7 +707,6 @@ int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq, + else + ret = -EINVAL; + +- nmi_exit(); + set_irq_regs(old_regs); + return ret; + } +@@ -946,6 +950,11 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu) + *per_cpu_ptr(desc->kstat_irqs, cpu) : 0; + } + ++static bool irq_is_nmi(struct irq_desc *desc) ++{ ++ return desc->istate & IRQS_NMI; ++} ++ + /** + * kstat_irqs - Get the statistics for an interrupt + * @irq: The interrupt number +@@ -963,7 +972,8 @@ unsigned int kstat_irqs(unsigned int irq) + if (!desc || !desc->kstat_irqs) + return 0; + if (!irq_settings_is_per_cpu_devid(desc) && +- !irq_settings_is_per_cpu(desc)) ++ !irq_settings_is_per_cpu(desc) && ++ !irq_is_nmi(desc)) + return desc->tot_count; + + for_each_possible_cpu(cpu) +diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c +index 78f3ddeb7fe4..e8f7f179bf77 100644 +--- a/kernel/irq/manage.c ++++ b/kernel/irq/manage.c +@@ -13,6 +13,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -34,8 +35,9 @@ static int __init setup_forced_irqthreads(char *arg) + early_param("threadirqs", setup_forced_irqthreads); + #endif + +-static void __synchronize_hardirq(struct irq_desc *desc) ++static void __synchronize_hardirq(struct irq_desc *desc, bool sync_chip) + { ++ struct irq_data *irqd = irq_desc_get_irq_data(desc); + bool inprogress; + + do { +@@ -51,6 +53,20 @@ static void __synchronize_hardirq(struct irq_desc *desc) + /* Ok, that indicated we're done: double-check carefully. */ + raw_spin_lock_irqsave(&desc->lock, flags); + inprogress = irqd_irq_inprogress(&desc->irq_data); ++ ++ /* ++ * If requested and supported, check at the chip whether it ++ * is in flight at the hardware level, i.e. already pending ++ * in a CPU and waiting for service and acknowledge. ++ */ ++ if (!inprogress && sync_chip) { ++ /* ++ * Ignore the return code. inprogress is only updated ++ * when the chip supports it. ++ */ ++ __irq_get_irqchip_state(irqd, IRQCHIP_STATE_ACTIVE, ++ &inprogress); ++ } + raw_spin_unlock_irqrestore(&desc->lock, flags); + + /* Oops, that failed? */ +@@ -73,13 +89,18 @@ static void __synchronize_hardirq(struct irq_desc *desc) + * Returns: false if a threaded handler is active. + * + * This function may be called - with care - from IRQ context. ++ * ++ * It does not check whether there is an interrupt in flight at the ++ * hardware level, but not serviced yet, as this might deadlock when ++ * called with interrupts disabled and the target CPU of the interrupt ++ * is the current CPU. + */ + bool synchronize_hardirq(unsigned int irq) + { + struct irq_desc *desc = irq_to_desc(irq); + + if (desc) { +- __synchronize_hardirq(desc); ++ __synchronize_hardirq(desc, false); + return !atomic_read(&desc->threads_active); + } + +@@ -95,14 +116,19 @@ EXPORT_SYMBOL(synchronize_hardirq); + * to complete before returning. If you use this function while + * holding a resource the IRQ handler may need you will deadlock. + * +- * This function may be called - with care - from IRQ context. ++ * Can only be called from preemptible code as it might sleep when ++ * an interrupt thread is associated to @irq. ++ * ++ * It optionally makes sure (when the irq chip supports that method) ++ * that the interrupt is not pending in any CPU and waiting for ++ * service. + */ + void synchronize_irq(unsigned int irq) + { + struct irq_desc *desc = irq_to_desc(irq); + + if (desc) { +- __synchronize_hardirq(desc); ++ __synchronize_hardirq(desc, true); + /* + * We made sure that no hardirq handler is + * running. Now verify that no threaded handlers are +@@ -1699,6 +1725,7 @@ static struct irqaction *__free_irq(struct irq_desc *desc, void *dev_id) + /* If this was the last handler, shut down the IRQ line: */ + if (!desc->action) { + irq_settings_clr_disable_unlazy(desc); ++ /* Only shutdown. Deactivate after synchronize_hardirq() */ + irq_shutdown(desc); + } + +@@ -1727,8 +1754,12 @@ static struct irqaction *__free_irq(struct irq_desc *desc, void *dev_id) + + unregister_handler_proc(irq, action); + +- /* Make sure it's not being used on another CPU: */ +- synchronize_hardirq(irq); ++ /* ++ * Make sure it's not being used on another CPU and if the chip ++ * supports it also make sure that there is no (not yet serviced) ++ * interrupt in flight at the hardware level. ++ */ ++ __synchronize_hardirq(desc, true); + + #ifdef CONFIG_DEBUG_SHIRQ + /* +@@ -1768,6 +1799,14 @@ static struct irqaction *__free_irq(struct irq_desc *desc, void *dev_id) + * require it to deallocate resources over the slow bus. + */ + chip_bus_lock(desc); ++ /* ++ * There is no interrupt on the fly anymore. Deactivate it ++ * completely. ++ */ ++ raw_spin_lock_irqsave(&desc->lock, flags); ++ irq_domain_deactivate_irq(&desc->irq_data); ++ raw_spin_unlock_irqrestore(&desc->lock, flags); ++ + irq_release_resources(desc); + chip_bus_sync_unlock(desc); + irq_remove_timings(desc); +@@ -1855,7 +1894,7 @@ static const void *__cleanup_nmi(unsigned int irq, struct irq_desc *desc) + } + + irq_settings_clr_disable_unlazy(desc); +- irq_shutdown(desc); ++ irq_shutdown_and_deactivate(desc); + + irq_release_resources(desc); + +@@ -2578,6 +2617,28 @@ void teardown_percpu_nmi(unsigned int irq) + irq_put_desc_unlock(desc, flags); + } + ++int __irq_get_irqchip_state(struct irq_data *data, enum irqchip_irq_state which, ++ bool *state) ++{ ++ struct irq_chip *chip; ++ int err = -EINVAL; ++ ++ do { ++ chip = irq_data_get_irq_chip(data); ++ if (chip->irq_get_irqchip_state) ++ break; ++#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY ++ data = data->parent_data; ++#else ++ data = NULL; ++#endif ++ } while (data); ++ ++ if (data) ++ err = chip->irq_get_irqchip_state(data, which, state); ++ return err; ++} ++ + /** + * irq_get_irqchip_state - returns the irqchip state of a interrupt. + * @irq: Interrupt line that is forwarded to a VM +@@ -2596,7 +2657,6 @@ int irq_get_irqchip_state(unsigned int irq, enum irqchip_irq_state which, + { + struct irq_desc *desc; + struct irq_data *data; +- struct irq_chip *chip; + unsigned long flags; + int err = -EINVAL; + +@@ -2606,19 +2666,7 @@ int irq_get_irqchip_state(unsigned int irq, enum irqchip_irq_state which, + + data = irq_desc_get_irq_data(desc); + +- do { +- chip = irq_data_get_irq_chip(data); +- if (chip->irq_get_irqchip_state) +- break; +-#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY +- data = data->parent_data; +-#else +- data = NULL; +-#endif +- } while (data); +- +- if (data) +- err = chip->irq_get_irqchip_state(data, which, state); ++ err = __irq_get_irqchip_state(data, which, state); + + irq_put_desc_busunlock(desc, flags); + return err; +diff --git a/kernel/kthread.c b/kernel/kthread.c +index 621467c33fef..561a8f8be68d 100644 +--- a/kernel/kthread.c ++++ b/kernel/kthread.c +@@ -433,6 +433,34 @@ void kthread_bind(struct task_struct *p, unsigned int cpu) + } + EXPORT_SYMBOL(kthread_bind); + ++#if defined(CONFIG_SCHED_MUQSS) && defined(CONFIG_SMP) ++extern void __do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask); ++ ++/* ++ * new_kthread_bind is a special variant of __kthread_bind_mask. ++ * For new threads to work on muqss we want to call do_set_cpus_allowed ++ * without the task_cpu being set and the task rescheduled until they're ++ * rescheduled on their own so we call __do_set_cpus_allowed directly which ++ * only changes the cpumask. This is particularly important for smpboot threads ++ * to work. ++ */ ++static void new_kthread_bind(struct task_struct *p, unsigned int cpu) ++{ ++ unsigned long flags; ++ ++ if (WARN_ON(!wait_task_inactive(p, TASK_UNINTERRUPTIBLE))) ++ return; ++ ++ /* It's safe because the task is inactive. */ ++ raw_spin_lock_irqsave(&p->pi_lock, flags); ++ __do_set_cpus_allowed(p, cpumask_of(cpu)); ++ p->flags |= PF_NO_SETAFFINITY; ++ raw_spin_unlock_irqrestore(&p->pi_lock, flags); ++} ++#else ++#define new_kthread_bind(p, cpu) kthread_bind(p, cpu) ++#endif ++ + /** + * kthread_create_on_cpu - Create a cpu bound kthread + * @threadfn: the function to run until signal_pending(current). +@@ -454,7 +482,7 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data), + cpu); + if (IS_ERR(p)) + return p; +- kthread_bind(p, cpu); ++ new_kthread_bind(p, cpu); + /* CPU hotplug need to bind once again when unparking the thread. */ + set_bit(KTHREAD_IS_PER_CPU, &to_kthread(p)->flags); + to_kthread(p)->cpu = cpu; +diff --git a/kernel/livepatch/transition.c b/kernel/livepatch/transition.c +index abb2a4a2cbb2..7b2f72a24039 100644 +--- a/kernel/livepatch/transition.c ++++ b/kernel/livepatch/transition.c +@@ -282,7 +282,7 @@ static int klp_check_stack(struct task_struct *task, char *err_buf) + static bool klp_try_switch_task(struct task_struct *task) + { + struct rq *rq; +- struct rq_flags flags; ++ struct rq_flags rf; + int ret; + bool success = false; + char err_buf[STACK_ERR_BUF_SIZE]; +@@ -298,7 +298,7 @@ static bool klp_try_switch_task(struct task_struct *task) + * functions. If all goes well, switch the task to the target patch + * state. + */ +- rq = task_rq_lock(task, &flags); ++ rq = task_rq_lock(task, &rf); + + if (task_running(rq, task) && task != current) { + snprintf(err_buf, STACK_ERR_BUF_SIZE, +@@ -317,7 +317,7 @@ static bool klp_try_switch_task(struct task_struct *task) + task->patch_state = klp_target_state; + + done: +- task_rq_unlock(rq, task, &flags); ++ task_rq_unlock(rq, task, &rf); + + /* + * Due to console deadlock issues, pr_debug() can't be used while +diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c +index c47788fa85f9..dbc936ccf149 100644 +--- a/kernel/locking/lockdep.c ++++ b/kernel/locking/lockdep.c +@@ -3703,19 +3703,19 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass, + if (depth) { + hlock = curr->held_locks + depth - 1; + if (hlock->class_idx == class_idx && nest_lock) { +- if (hlock->references) { +- /* +- * Check: unsigned int references:12, overflow. +- */ +- if (DEBUG_LOCKS_WARN_ON(hlock->references == (1 << 12)-1)) +- return 0; ++ if (!references) ++ references++; + ++ if (!hlock->references) + hlock->references++; +- } else { +- hlock->references = 2; +- } + +- return 1; ++ hlock->references += references; ++ ++ /* Overflow */ ++ if (DEBUG_LOCKS_WARN_ON(hlock->references < references)) ++ return 0; ++ ++ return 2; + } + } + +@@ -3921,22 +3921,33 @@ static struct held_lock *find_held_lock(struct task_struct *curr, + } + + static int reacquire_held_locks(struct task_struct *curr, unsigned int depth, +- int idx) ++ int idx, unsigned int *merged) + { + struct held_lock *hlock; ++ int first_idx = idx; + + if (DEBUG_LOCKS_WARN_ON(!irqs_disabled())) + return 0; + + for (hlock = curr->held_locks + idx; idx < depth; idx++, hlock++) { +- if (!__lock_acquire(hlock->instance, ++ switch (__lock_acquire(hlock->instance, + hlock_class(hlock)->subclass, + hlock->trylock, + hlock->read, hlock->check, + hlock->hardirqs_off, + hlock->nest_lock, hlock->acquire_ip, +- hlock->references, hlock->pin_count)) ++ hlock->references, hlock->pin_count)) { ++ case 0: + return 1; ++ case 1: ++ break; ++ case 2: ++ *merged += (idx == first_idx); ++ break; ++ default: ++ WARN_ON(1); ++ return 0; ++ } + } + return 0; + } +@@ -3947,9 +3958,9 @@ __lock_set_class(struct lockdep_map *lock, const char *name, + unsigned long ip) + { + struct task_struct *curr = current; ++ unsigned int depth, merged = 0; + struct held_lock *hlock; + struct lock_class *class; +- unsigned int depth; + int i; + + if (unlikely(!debug_locks)) +@@ -3974,14 +3985,14 @@ __lock_set_class(struct lockdep_map *lock, const char *name, + curr->lockdep_depth = i; + curr->curr_chain_key = hlock->prev_chain_key; + +- if (reacquire_held_locks(curr, depth, i)) ++ if (reacquire_held_locks(curr, depth, i, &merged)) + return 0; + + /* + * I took it apart and put it back together again, except now I have + * these 'spare' parts.. where shall I put them. + */ +- if (DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth)) ++ if (DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth - merged)) + return 0; + return 1; + } +@@ -3989,8 +4000,8 @@ __lock_set_class(struct lockdep_map *lock, const char *name, + static int __lock_downgrade(struct lockdep_map *lock, unsigned long ip) + { + struct task_struct *curr = current; ++ unsigned int depth, merged = 0; + struct held_lock *hlock; +- unsigned int depth; + int i; + + if (unlikely(!debug_locks)) +@@ -4015,7 +4026,11 @@ static int __lock_downgrade(struct lockdep_map *lock, unsigned long ip) + hlock->read = 1; + hlock->acquire_ip = ip; + +- if (reacquire_held_locks(curr, depth, i)) ++ if (reacquire_held_locks(curr, depth, i, &merged)) ++ return 0; ++ ++ /* Merging can't happen with unchanged classes.. */ ++ if (DEBUG_LOCKS_WARN_ON(merged)) + return 0; + + /* +@@ -4024,6 +4039,7 @@ static int __lock_downgrade(struct lockdep_map *lock, unsigned long ip) + */ + if (DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth)) + return 0; ++ + return 1; + } + +@@ -4038,8 +4054,8 @@ static int + __lock_release(struct lockdep_map *lock, int nested, unsigned long ip) + { + struct task_struct *curr = current; ++ unsigned int depth, merged = 1; + struct held_lock *hlock; +- unsigned int depth; + int i; + + if (unlikely(!debug_locks)) +@@ -4094,14 +4110,15 @@ __lock_release(struct lockdep_map *lock, int nested, unsigned long ip) + if (i == depth-1) + return 1; + +- if (reacquire_held_locks(curr, depth, i + 1)) ++ if (reacquire_held_locks(curr, depth, i + 1, &merged)) + return 0; + + /* + * We had N bottles of beer on the wall, we drank one, but now + * there's not N-1 bottles of beer left on the wall... ++ * Pouring two of the bottles together is acceptable. + */ +- DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth-1); ++ DEBUG_LOCKS_WARN_ON(curr->lockdep_depth != depth - merged); + + /* + * Since reacquire_held_locks() would have called check_chain_key() +diff --git a/kernel/locking/lockdep_proc.c b/kernel/locking/lockdep_proc.c +index 9c49ec645d8b..bda006f8a88b 100644 +--- a/kernel/locking/lockdep_proc.c ++++ b/kernel/locking/lockdep_proc.c +@@ -200,7 +200,6 @@ static void lockdep_stats_debug_show(struct seq_file *m) + + static int lockdep_stats_show(struct seq_file *m, void *v) + { +- struct lock_class *class; + unsigned long nr_unused = 0, nr_uncategorized = 0, + nr_irq_safe = 0, nr_irq_unsafe = 0, + nr_softirq_safe = 0, nr_softirq_unsafe = 0, +@@ -210,6 +209,9 @@ static int lockdep_stats_show(struct seq_file *m, void *v) + nr_hardirq_read_safe = 0, nr_hardirq_read_unsafe = 0, + sum_forward_deps = 0; + ++#ifdef CONFIG_PROVE_LOCKING ++ struct lock_class *class; ++ + list_for_each_entry(class, &all_lock_classes, lock_entry) { + + if (class->usage_mask == 0) +@@ -241,12 +243,12 @@ static int lockdep_stats_show(struct seq_file *m, void *v) + if (class->usage_mask & LOCKF_ENABLED_HARDIRQ_READ) + nr_hardirq_read_unsafe++; + +-#ifdef CONFIG_PROVE_LOCKING + sum_forward_deps += lockdep_count_forward_deps(class); +-#endif + } + #ifdef CONFIG_DEBUG_LOCKDEP + DEBUG_LOCKS_WARN_ON(debug_atomic_read(nr_unused_locks) != nr_unused); ++#endif ++ + #endif + seq_printf(m, " lock-classes: %11lu [max: %lu]\n", + nr_lock_classes, MAX_LOCKDEP_KEYS); +diff --git a/kernel/module.c b/kernel/module.c +index 80c7c09584cf..8431c3d47c97 100644 +--- a/kernel/module.c ++++ b/kernel/module.c +@@ -3385,8 +3385,7 @@ static bool finished_loading(const char *name) + sched_annotate_sleep(); + mutex_lock(&module_mutex); + mod = find_module_all(name, strlen(name), true); +- ret = !mod || mod->state == MODULE_STATE_LIVE +- || mod->state == MODULE_STATE_GOING; ++ ret = !mod || mod->state == MODULE_STATE_LIVE; + mutex_unlock(&module_mutex); + + return ret; +@@ -3576,8 +3575,7 @@ static int add_unformed_module(struct module *mod) + mutex_lock(&module_mutex); + old = find_module_all(mod->name, strlen(mod->name), true); + if (old != NULL) { +- if (old->state == MODULE_STATE_COMING +- || old->state == MODULE_STATE_UNFORMED) { ++ if (old->state != MODULE_STATE_LIVE) { + /* Wait in case it fails to load. */ + mutex_unlock(&module_mutex); + err = wait_event_interruptible(module_wq, +diff --git a/kernel/padata.c b/kernel/padata.c +index 2d2fddbb7a4c..15a8ad63f4ff 100644 +--- a/kernel/padata.c ++++ b/kernel/padata.c +@@ -267,7 +267,12 @@ static void padata_reorder(struct parallel_data *pd) + * The next object that needs serialization might have arrived to + * the reorder queues in the meantime, we will be called again + * from the timer function if no one else cares for it. ++ * ++ * Ensure reorder_objects is read after pd->lock is dropped so we see ++ * an increment from another task in padata_do_serial. Pairs with ++ * smp_mb__after_atomic in padata_do_serial. + */ ++ smp_mb(); + if (atomic_read(&pd->reorder_objects) + && !(pinst->flags & PADATA_RESET)) + mod_timer(&pd->timer, jiffies + HZ); +@@ -387,6 +392,13 @@ void padata_do_serial(struct padata_priv *padata) + list_add_tail(&padata->list, &pqueue->reorder.list); + spin_unlock(&pqueue->reorder.lock); + ++ /* ++ * Ensure the atomic_inc of reorder_objects above is ordered correctly ++ * with the trylock of pd->lock in padata_reorder. Pairs with smp_mb ++ * in padata_reorder. ++ */ ++ smp_mb__after_atomic(); ++ + put_cpu(); + + /* If we're running on the wrong CPU, call padata_reorder() via a +diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c +index f54bc7cb6c2d..6d726cef241c 100644 +--- a/kernel/pid_namespace.c ++++ b/kernel/pid_namespace.c +@@ -326,7 +326,7 @@ int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd) + } + + read_lock(&tasklist_lock); +- force_sig(SIGKILL, pid_ns->child_reaper); ++ send_sig(SIGKILL, pid_ns->child_reaper, 1); + read_unlock(&tasklist_lock); + + do_exit(0); +diff --git a/kernel/resource.c b/kernel/resource.c +index 158f04ec1d4f..c3cc6d85ec52 100644 +--- a/kernel/resource.c ++++ b/kernel/resource.c +@@ -326,7 +326,7 @@ EXPORT_SYMBOL(release_resource); + * + * If a resource is found, returns 0 and @*res is overwritten with the part + * of the resource that's within [@start..@end]; if none is found, returns +- * -1 or -EINVAL for other invalid parameters. ++ * -ENODEV. Returns -EINVAL for invalid parameters. + * + * This function walks the whole tree and not just first level children + * unless @first_lvl is true. +@@ -365,16 +365,16 @@ static int find_next_iomem_res(resource_size_t start, resource_size_t end, + break; + } + ++ if (p) { ++ /* copy data */ ++ res->start = max(start, p->start); ++ res->end = min(end, p->end); ++ res->flags = p->flags; ++ res->desc = p->desc; ++ } ++ + read_unlock(&resource_lock); +- if (!p) +- return -1; +- +- /* copy data */ +- res->start = max(start, p->start); +- res->end = min(end, p->end); +- res->flags = p->flags; +- res->desc = p->desc; +- return 0; ++ return p ? 0 : -ENODEV; + } + + static int __walk_iomem_res_desc(resource_size_t start, resource_size_t end, +diff --git a/kernel/sched/Makefile b/kernel/sched/Makefile +index 21fb5a5662b5..a04ffebc6b7a 100644 +--- a/kernel/sched/Makefile ++++ b/kernel/sched/Makefile +@@ -16,15 +16,23 @@ ifneq ($(CONFIG_SCHED_OMIT_FRAME_POINTER),y) + CFLAGS_core.o := $(PROFILING) -fno-omit-frame-pointer + endif + ++ifdef CONFIG_SCHED_MUQSS ++obj-y += MuQSS.o clock.o cputime.o ++obj-y += idle.o ++obj-y += wait.o wait_bit.o swait.o completion.o ++ ++obj-$(CONFIG_SMP) += topology.o ++else + obj-y += core.o loadavg.o clock.o cputime.o + obj-y += idle.o fair.o rt.o deadline.o + obj-y += wait.o wait_bit.o swait.o completion.o + + obj-$(CONFIG_SMP) += cpupri.o cpudeadline.o topology.o stop_task.o pelt.o + obj-$(CONFIG_SCHED_AUTOGROUP) += autogroup.o +-obj-$(CONFIG_SCHEDSTATS) += stats.o + obj-$(CONFIG_SCHED_DEBUG) += debug.o + obj-$(CONFIG_CGROUP_CPUACCT) += cpuacct.o ++endif ++obj-$(CONFIG_SCHEDSTATS) += stats.o + obj-$(CONFIG_CPU_FREQ) += cpufreq.o + obj-$(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) += cpufreq_schedutil.o + obj-$(CONFIG_MEMBARRIER) += membarrier.o +diff --git a/kernel/sched/MuQSS.c b/kernel/sched/MuQSS.c +new file mode 100644 +index 000000000000..e97e1670e4e6 +--- /dev/null ++++ b/kernel/sched/MuQSS.c +@@ -0,0 +1,7451 @@ ++// SPDX-License-Identifier: GPL-2.0 ++/* ++ * kernel/sched/MuQSS.c, was kernel/sched.c ++ * ++ * Kernel scheduler and related syscalls ++ * ++ * Copyright (C) 1991-2002 Linus Torvalds ++ * ++ * 1996-12-23 Modified by Dave Grothe to fix bugs in semaphores and ++ * make semaphores SMP safe ++ * 1998-11-19 Implemented schedule_timeout() and related stuff ++ * by Andrea Arcangeli ++ * 2002-01-04 New ultra-scalable O(1) scheduler by Ingo Molnar: ++ * hybrid priority-list and round-robin design with ++ * an array-switch method of distributing timeslices ++ * and per-CPU runqueues. Cleanups and useful suggestions ++ * by Davide Libenzi, preemptible kernel bits by Robert Love. ++ * 2003-09-03 Interactivity tuning by Con Kolivas. ++ * 2004-04-02 Scheduler domains code by Nick Piggin ++ * 2007-04-15 Work begun on replacing all interactivity tuning with a ++ * fair scheduling design by Con Kolivas. ++ * 2007-05-05 Load balancing (smp-nice) and other improvements ++ * by Peter Williams ++ * 2007-05-06 Interactivity improvements to CFS by Mike Galbraith ++ * 2007-07-01 Group scheduling enhancements by Srivatsa Vaddagiri ++ * 2007-11-29 RT balancing improvements by Steven Rostedt, Gregory Haskins, ++ * Thomas Gleixner, Mike Kravetz ++ * 2009-08-13 Brainfuck deadline scheduling policy by Con Kolivas deletes ++ * a whole lot of those previous things. ++ * 2016-10-01 Multiple Queue Skiplist Scheduler scalable evolution of BFS ++ * scheduler by Con Kolivas. ++ */ ++ ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++ ++#include "../workqueue_internal.h" ++#include "../smpboot.h" ++ ++#define CREATE_TRACE_POINTS ++#include ++ ++#include "MuQSS.h" ++ ++#define rt_prio(prio) unlikely((prio) < MAX_RT_PRIO) ++#define rt_task(p) rt_prio((p)->prio) ++#define batch_task(p) (unlikely((p)->policy == SCHED_BATCH)) ++#define is_rt_policy(policy) ((policy) == SCHED_FIFO || \ ++ (policy) == SCHED_RR) ++#define has_rt_policy(p) unlikely(is_rt_policy((p)->policy)) ++ ++#define is_idle_policy(policy) ((policy) == SCHED_IDLEPRIO) ++#define idleprio_task(p) unlikely(is_idle_policy((p)->policy)) ++#define task_running_idle(p) unlikely((p)->prio == IDLE_PRIO) ++ ++#define is_iso_policy(policy) ((policy) == SCHED_ISO) ++#define iso_task(p) unlikely(is_iso_policy((p)->policy)) ++#define task_running_iso(p) unlikely((p)->prio == ISO_PRIO) ++ ++#define rq_idle(rq) ((rq)->rq_prio == PRIO_LIMIT) ++ ++#define ISO_PERIOD (5 * HZ) ++ ++#define STOP_PRIO (MAX_RT_PRIO - 1) ++ ++/* ++ * Some helpers for converting to/from various scales. Use shifts to get ++ * approximate multiples of ten for less overhead. ++ */ ++#define APPROX_NS_PS (1073741824) /* Approximate ns per second */ ++#define JIFFIES_TO_NS(TIME) ((TIME) * (APPROX_NS_PS / HZ)) ++#define JIFFY_NS (APPROX_NS_PS / HZ) ++#define JIFFY_US (1048576 / HZ) ++#define NS_TO_JIFFIES(TIME) ((TIME) / JIFFY_NS) ++#define HALF_JIFFY_NS (APPROX_NS_PS / HZ / 2) ++#define HALF_JIFFY_US (1048576 / HZ / 2) ++#define MS_TO_NS(TIME) ((TIME) << 20) ++#define MS_TO_US(TIME) ((TIME) << 10) ++#define NS_TO_MS(TIME) ((TIME) >> 20) ++#define NS_TO_US(TIME) ((TIME) >> 10) ++#define US_TO_NS(TIME) ((TIME) << 10) ++#define TICK_APPROX_NS ((APPROX_NS_PS+HZ/2)/HZ) ++ ++#define RESCHED_US (100) /* Reschedule if less than this many μs left */ ++ ++void print_scheduler_version(void) ++{ ++ printk(KERN_INFO "MuQSS CPU scheduler v0.193 by Con Kolivas.\n"); ++} ++ ++#define RQSHARE_NONE 0 ++#define RQSHARE_SMT 1 ++#define RQSHARE_MC 2 ++#define RQSHARE_SMP 3 ++#define RQSHARE_ALL 4 ++ ++/* ++ * This determines what level of runqueue sharing will be done and is ++ * configurable at boot time with the bootparam rqshare = ++ */ ++static int rqshare __read_mostly = CONFIG_SHARERQ; /* Default RQSHARE_MC */ ++ ++static int __init set_rqshare(char *str) ++{ ++ if (!strncmp(str, "none", 4)) { ++ rqshare = RQSHARE_NONE; ++ return 0; ++ } ++ if (!strncmp(str, "smt", 3)) { ++ rqshare = RQSHARE_SMT; ++ return 0; ++ } ++ if (!strncmp(str, "mc", 2)) { ++ rqshare = RQSHARE_MC; ++ return 0; ++ } ++ if (!strncmp(str, "smp", 3)) { ++ rqshare = RQSHARE_SMP; ++ return 0; ++ } ++ if (!strncmp(str, "all", 3)) { ++ rqshare = RQSHARE_ALL; ++ return 0; ++ } ++ return 1; ++} ++__setup("rqshare=", set_rqshare); ++ ++/* ++ * This is the time all tasks within the same priority round robin. ++ * Value is in ms and set to a minimum of 6ms. ++ * Tunable via /proc interface. ++ */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++int rr_interval __read_mostly = 2; ++#else ++int rr_interval __read_mostly = 6; ++#endif ++ ++/* ++ * Tunable to choose whether to prioritise latency or throughput, simple ++ * binary yes or no ++ */ ++int sched_interactive __read_mostly = 1; ++ ++/* ++ * sched_iso_cpu - sysctl which determines the cpu percentage SCHED_ISO tasks ++ * are allowed to run five seconds as real time tasks. This is the total over ++ * all online cpus. ++ */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++int sched_iso_cpu __read_mostly = 25; ++#else ++int sched_iso_cpu __read_mostly = 70; ++#endif ++ ++/* ++ * sched_yield_type - Choose what sort of yield sched_yield will perform. ++ * 0: No yield. ++ * 1: Yield only to better priority/deadline tasks. (default) ++ * 2: Expire timeslice and recalculate deadline. ++ */ ++ ++#ifdef CONFIG_ZEN_INTERACTIVE ++int sched_yield_type __read_mostly = 2; ++#else ++int sched_yield_type __read_mostly = 1; ++#endif ++ ++/* ++ * The relative length of deadline for each priority(nice) level. ++ */ ++static int prio_ratios[NICE_WIDTH] __read_mostly; ++ ++ ++/* ++ * The quota handed out to tasks of all priority levels when refilling their ++ * time_slice. ++ */ ++static inline int timeslice(void) ++{ ++ return MS_TO_US(rr_interval); ++} ++ ++DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); ++ ++#ifdef CONFIG_SMP ++/* ++ * Total number of runqueues. Equals number of CPUs when there is no runqueue ++ * sharing but is usually less with SMT/MC sharing of runqueues. ++ */ ++static int total_runqueues __read_mostly = 1; ++ ++static cpumask_t cpu_idle_map ____cacheline_aligned_in_smp; ++ ++struct rq *cpu_rq(int cpu) ++{ ++ return &per_cpu(runqueues, (cpu)); ++} ++#define cpu_curr(cpu) (cpu_rq(cpu)->curr) ++ ++/* ++ * For asym packing, by default the lower numbered cpu has higher priority. ++ */ ++int __weak arch_asym_cpu_priority(int cpu) ++{ ++ return -cpu; ++} ++ ++int __weak arch_sd_sibling_asym_packing(void) ++{ ++ return 0*SD_ASYM_PACKING; ++} ++ ++#ifdef CONFIG_SCHED_SMT ++DEFINE_STATIC_KEY_FALSE(sched_smt_present); ++EXPORT_SYMBOL_GPL(sched_smt_present); ++#endif ++ ++#else ++struct rq *uprq; ++#endif /* CONFIG_SMP */ ++ ++#include "stats.h" ++ ++/* ++ * All common locking functions performed on rq->lock. rq->clock is local to ++ * the CPU accessing it so it can be modified just with interrupts disabled ++ * when we're not updating niffies. ++ * Looking up task_rq must be done under rq->lock to be safe. ++ */ ++ ++/* ++ * RQ-clock updating methods: ++ */ ++ ++#ifdef HAVE_SCHED_AVG_IRQ ++static void update_irq_load_avg(struct rq *rq, long delta); ++#else ++static inline void update_irq_load_avg(struct rq *rq, long delta) {} ++#endif ++ ++static void update_rq_clock_task(struct rq *rq, s64 delta) ++{ ++/* ++ * In theory, the compile should just see 0 here, and optimize out the call ++ * to sched_rt_avg_update. But I don't trust it... ++ */ ++ s64 __maybe_unused steal = 0, irq_delta = 0; ++#ifdef CONFIG_IRQ_TIME_ACCOUNTING ++ irq_delta = irq_time_read(cpu_of(rq)) - rq->prev_irq_time; ++ ++ /* ++ * Since irq_time is only updated on {soft,}irq_exit, we might run into ++ * this case when a previous update_rq_clock() happened inside a ++ * {soft,}irq region. ++ * ++ * When this happens, we stop ->clock_task and only update the ++ * prev_irq_time stamp to account for the part that fit, so that a next ++ * update will consume the rest. This ensures ->clock_task is ++ * monotonic. ++ * ++ * It does however cause some slight miss-attribution of {soft,}irq ++ * time, a more accurate solution would be to update the irq_time using ++ * the current rq->clock timestamp, except that would require using ++ * atomic ops. ++ */ ++ if (irq_delta > delta) ++ irq_delta = delta; ++ ++ rq->prev_irq_time += irq_delta; ++ delta -= irq_delta; ++#endif ++#ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING ++ if (static_key_false((¶virt_steal_rq_enabled))) { ++ steal = paravirt_steal_clock(cpu_of(rq)); ++ steal -= rq->prev_steal_time_rq; ++ ++ if (unlikely(steal > delta)) ++ steal = delta; ++ ++ rq->prev_steal_time_rq += steal; ++ delta -= steal; ++ } ++#endif ++ rq->clock_task += delta; ++ ++#ifdef CONFIG_HAVE_SCHED_AVG_IRQ ++ if (irq_delta + steal) ++ update_irq_load_avg(rq, irq_delta + steal); ++#endif ++} ++ ++static inline void update_rq_clock(struct rq *rq) ++{ ++ s64 delta = sched_clock_cpu(cpu_of(rq)) - rq->clock; ++ ++ if (unlikely(delta < 0)) ++ return; ++ rq->clock += delta; ++ update_rq_clock_task(rq, delta); ++} ++ ++/* ++ * Niffies are a globally increasing nanosecond counter. They're only used by ++ * update_load_avg and time_slice_expired, however deadlines are based on them ++ * across CPUs. Update them whenever we will call one of those functions, and ++ * synchronise them across CPUs whenever we hold both runqueue locks. ++ */ ++static inline void update_clocks(struct rq *rq) ++{ ++ s64 ndiff, minndiff; ++ long jdiff; ++ ++ update_rq_clock(rq); ++ ndiff = rq->clock - rq->old_clock; ++ rq->old_clock = rq->clock; ++ jdiff = jiffies - rq->last_jiffy; ++ ++ /* Subtract any niffies added by balancing with other rqs */ ++ ndiff -= rq->niffies - rq->last_niffy; ++ minndiff = JIFFIES_TO_NS(jdiff) - rq->niffies + rq->last_jiffy_niffies; ++ if (minndiff < 0) ++ minndiff = 0; ++ ndiff = max(ndiff, minndiff); ++ rq->niffies += ndiff; ++ rq->last_niffy = rq->niffies; ++ if (jdiff) { ++ rq->last_jiffy += jdiff; ++ rq->last_jiffy_niffies = rq->niffies; ++ } ++} ++ ++/* ++ * Any time we have two runqueues locked we use that as an opportunity to ++ * synchronise niffies to the highest value as idle ticks may have artificially ++ * kept niffies low on one CPU and the truth can only be later. ++ */ ++static inline void synchronise_niffies(struct rq *rq1, struct rq *rq2) ++{ ++ if (rq1->niffies > rq2->niffies) ++ rq2->niffies = rq1->niffies; ++ else ++ rq1->niffies = rq2->niffies; ++} ++ ++/* ++ * double_rq_lock - safely lock two runqueues ++ * ++ * Note this does not disable interrupts like task_rq_lock, ++ * you need to do so manually before calling. ++ */ ++ ++/* For when we know rq1 != rq2 */ ++static inline void __double_rq_lock(struct rq *rq1, struct rq *rq2) ++ __acquires(rq1->lock) ++ __acquires(rq2->lock) ++{ ++ if (rq1 < rq2) { ++ raw_spin_lock(rq1->lock); ++ raw_spin_lock_nested(rq2->lock, SINGLE_DEPTH_NESTING); ++ } else { ++ raw_spin_lock(rq2->lock); ++ raw_spin_lock_nested(rq1->lock, SINGLE_DEPTH_NESTING); ++ } ++} ++ ++static inline void double_rq_lock(struct rq *rq1, struct rq *rq2) ++ __acquires(rq1->lock) ++ __acquires(rq2->lock) ++{ ++ BUG_ON(!irqs_disabled()); ++ if (rq1->lock == rq2->lock) { ++ raw_spin_lock(rq1->lock); ++ __acquire(rq2->lock); /* Fake it out ;) */ ++ } else ++ __double_rq_lock(rq1, rq2); ++ synchronise_niffies(rq1, rq2); ++} ++ ++/* ++ * double_rq_unlock - safely unlock two runqueues ++ * ++ * Note this does not restore interrupts like task_rq_unlock, ++ * you need to do so manually after calling. ++ */ ++static inline void double_rq_unlock(struct rq *rq1, struct rq *rq2) ++ __releases(rq1->lock) ++ __releases(rq2->lock) ++{ ++ raw_spin_unlock(rq1->lock); ++ if (rq1->lock != rq2->lock) ++ raw_spin_unlock(rq2->lock); ++ else ++ __release(rq2->lock); ++} ++ ++static inline void lock_all_rqs(void) ++{ ++ int cpu; ++ ++ preempt_disable(); ++ for_each_possible_cpu(cpu) { ++ struct rq *rq = cpu_rq(cpu); ++ ++ do_raw_spin_lock(rq->lock); ++ } ++} ++ ++static inline void unlock_all_rqs(void) ++{ ++ int cpu; ++ ++ for_each_possible_cpu(cpu) { ++ struct rq *rq = cpu_rq(cpu); ++ ++ do_raw_spin_unlock(rq->lock); ++ } ++ preempt_enable(); ++} ++ ++/* Specially nest trylock an rq */ ++static inline bool trylock_rq(struct rq *this_rq, struct rq *rq) ++{ ++ if (unlikely(!do_raw_spin_trylock(rq->lock))) ++ return false; ++ spin_acquire(&rq->lock->dep_map, SINGLE_DEPTH_NESTING, 1, _RET_IP_); ++ synchronise_niffies(this_rq, rq); ++ return true; ++} ++ ++/* Unlock a specially nested trylocked rq */ ++static inline void unlock_rq(struct rq *rq) ++{ ++ spin_release(&rq->lock->dep_map, 1, _RET_IP_); ++ do_raw_spin_unlock(rq->lock); ++} ++ ++/* ++ * cmpxchg based fetch_or, macro so it works for different integer types ++ */ ++#define fetch_or(ptr, mask) \ ++ ({ \ ++ typeof(ptr) _ptr = (ptr); \ ++ typeof(mask) _mask = (mask); \ ++ typeof(*_ptr) _old, _val = *_ptr; \ ++ \ ++ for (;;) { \ ++ _old = cmpxchg(_ptr, _val, _val | _mask); \ ++ if (_old == _val) \ ++ break; \ ++ _val = _old; \ ++ } \ ++ _old; \ ++}) ++ ++#if defined(CONFIG_SMP) && defined(TIF_POLLING_NRFLAG) ++/* ++ * Atomically set TIF_NEED_RESCHED and test for TIF_POLLING_NRFLAG, ++ * this avoids any races wrt polling state changes and thereby avoids ++ * spurious IPIs. ++ */ ++static bool set_nr_and_not_polling(struct task_struct *p) ++{ ++ struct thread_info *ti = task_thread_info(p); ++ return !(fetch_or(&ti->flags, _TIF_NEED_RESCHED) & _TIF_POLLING_NRFLAG); ++} ++ ++/* ++ * Atomically set TIF_NEED_RESCHED if TIF_POLLING_NRFLAG is set. ++ * ++ * If this returns true, then the idle task promises to call ++ * sched_ttwu_pending() and reschedule soon. ++ */ ++static bool set_nr_if_polling(struct task_struct *p) ++{ ++ struct thread_info *ti = task_thread_info(p); ++ typeof(ti->flags) old, val = READ_ONCE(ti->flags); ++ ++ for (;;) { ++ if (!(val & _TIF_POLLING_NRFLAG)) ++ return false; ++ if (val & _TIF_NEED_RESCHED) ++ return true; ++ old = cmpxchg(&ti->flags, val, val | _TIF_NEED_RESCHED); ++ if (old == val) ++ break; ++ val = old; ++ } ++ return true; ++} ++ ++#else ++static bool set_nr_and_not_polling(struct task_struct *p) ++{ ++ set_tsk_need_resched(p); ++ return true; ++} ++ ++#ifdef CONFIG_SMP ++static bool set_nr_if_polling(struct task_struct *p) ++{ ++ return false; ++} ++#endif ++#endif ++ ++static bool __wake_q_add(struct wake_q_head *head, struct task_struct *task) ++{ ++ struct wake_q_node *node = &task->wake_q; ++ ++ /* ++ * Atomically grab the task, if ->wake_q is !nil already it means ++ * its already queued (either by us or someone else) and will get the ++ * wakeup due to that. ++ * ++ * In order to ensure that a pending wakeup will observe our pending ++ * state, even in the failed case, an explicit smp_mb() must be used. ++ */ ++ smp_mb__before_atomic(); ++ if (unlikely(cmpxchg_relaxed(&node->next, NULL, WAKE_Q_TAIL))) ++ return false; ++ ++ /* ++ * The head is context local, there can be no concurrency. ++ */ ++ *head->lastp = node; ++ head->lastp = &node->next; ++ return true; ++} ++ ++/** ++ * wake_q_add() - queue a wakeup for 'later' waking. ++ * @head: the wake_q_head to add @task to ++ * @task: the task to queue for 'later' wakeup ++ * ++ * Queue a task for later wakeup, most likely by the wake_up_q() call in the ++ * same context, _HOWEVER_ this is not guaranteed, the wakeup can come ++ * instantly. ++ * ++ * This function must be used as-if it were wake_up_process(); IOW the task ++ * must be ready to be woken at this location. ++ */ ++void wake_q_add(struct wake_q_head *head, struct task_struct *task) ++{ ++ if (__wake_q_add(head, task)) ++ get_task_struct(task); ++} ++ ++/** ++ * wake_q_add_safe() - safely queue a wakeup for 'later' waking. ++ * @head: the wake_q_head to add @task to ++ * @task: the task to queue for 'later' wakeup ++ * ++ * Queue a task for later wakeup, most likely by the wake_up_q() call in the ++ * same context, _HOWEVER_ this is not guaranteed, the wakeup can come ++ * instantly. ++ * ++ * This function must be used as-if it were wake_up_process(); IOW the task ++ * must be ready to be woken at this location. ++ * ++ * This function is essentially a task-safe equivalent to wake_q_add(). Callers ++ * that already hold reference to @task can call the 'safe' version and trust ++ * wake_q to do the right thing depending whether or not the @task is already ++ * queued for wakeup. ++ */ ++void wake_q_add_safe(struct wake_q_head *head, struct task_struct *task) ++{ ++ if (!__wake_q_add(head, task)) ++ put_task_struct(task); ++} ++ ++void wake_up_q(struct wake_q_head *head) ++{ ++ struct wake_q_node *node = head->first; ++ ++ while (node != WAKE_Q_TAIL) { ++ struct task_struct *task; ++ ++ task = container_of(node, struct task_struct, wake_q); ++ BUG_ON(!task); ++ /* Task can safely be re-inserted now */ ++ node = node->next; ++ task->wake_q.next = NULL; ++ ++ /* ++ * wake_up_process() executes a full barrier, which pairs with ++ * the queueing in wake_q_add() so as not to miss wakeups. ++ */ ++ wake_up_process(task); ++ put_task_struct(task); ++ } ++} ++ ++static inline void smp_sched_reschedule(int cpu) ++{ ++ if (likely(cpu_online(cpu))) ++ smp_send_reschedule(cpu); ++} ++ ++/* ++ * resched_task - mark a task 'to be rescheduled now'. ++ * ++ * On UP this means the setting of the need_resched flag, on SMP it ++ * might also involve a cross-CPU call to trigger the scheduler on ++ * the target CPU. ++ */ ++void resched_task(struct task_struct *p) ++{ ++ int cpu; ++#ifdef CONFIG_LOCKDEP ++ /* Kernel threads call this when creating workqueues while still ++ * inactive from __kthread_bind_mask, holding only the pi_lock */ ++ if (!(p->flags & PF_KTHREAD)) { ++ struct rq *rq = task_rq(p); ++ ++ lockdep_assert_held(rq->lock); ++ } ++#endif ++ if (test_tsk_need_resched(p)) ++ return; ++ ++ cpu = task_cpu(p); ++ if (cpu == smp_processor_id()) { ++ set_tsk_need_resched(p); ++ set_preempt_need_resched(); ++ return; ++ } ++ ++ if (set_nr_and_not_polling(p)) ++ smp_sched_reschedule(cpu); ++ else ++ trace_sched_wake_idle_without_ipi(cpu); ++} ++ ++/* ++ * A task that is not running or queued will not have a node set. ++ * A task that is queued but not running will have a node set. ++ * A task that is currently running will have ->on_cpu set but no node set. ++ */ ++static inline bool task_queued(struct task_struct *p) ++{ ++ return !skiplist_node_empty(&p->node); ++} ++ ++static void enqueue_task(struct rq *rq, struct task_struct *p, int flags); ++static inline void resched_if_idle(struct rq *rq); ++ ++/* Dodgy workaround till we figure out where the softirqs are going */ ++static inline void do_pending_softirq(struct rq *rq, struct task_struct *next) ++{ ++ if (unlikely(next == rq->idle && local_softirq_pending() && !in_interrupt())) ++ do_softirq_own_stack(); ++} ++ ++static inline bool deadline_before(u64 deadline, u64 time) ++{ ++ return (deadline < time); ++} ++ ++/* ++ * Deadline is "now" in niffies + (offset by priority). Setting the deadline ++ * is the key to everything. It distributes cpu fairly amongst tasks of the ++ * same nice value, it proportions cpu according to nice level, it means the ++ * task that last woke up the longest ago has the earliest deadline, thus ++ * ensuring that interactive tasks get low latency on wake up. The CPU ++ * proportion works out to the square of the virtual deadline difference, so ++ * this equation will give nice 19 3% CPU compared to nice 0. ++ */ ++static inline u64 prio_deadline_diff(int user_prio) ++{ ++ return (prio_ratios[user_prio] * rr_interval * (MS_TO_NS(1) / 128)); ++} ++ ++static inline u64 task_deadline_diff(struct task_struct *p) ++{ ++ return prio_deadline_diff(TASK_USER_PRIO(p)); ++} ++ ++static inline u64 static_deadline_diff(int static_prio) ++{ ++ return prio_deadline_diff(USER_PRIO(static_prio)); ++} ++ ++static inline int longest_deadline_diff(void) ++{ ++ return prio_deadline_diff(39); ++} ++ ++static inline int ms_longest_deadline_diff(void) ++{ ++ return NS_TO_MS(longest_deadline_diff()); ++} ++ ++static inline bool rq_local(struct rq *rq); ++ ++#ifndef SCHED_CAPACITY_SCALE ++#define SCHED_CAPACITY_SCALE 1024 ++#endif ++ ++static inline int rq_load(struct rq *rq) ++{ ++ return rq->nr_running; ++} ++ ++/* ++ * Update the load average for feeding into cpu frequency governors. Use a ++ * rough estimate of a rolling average with ~ time constant of 32ms. ++ * 80/128 ~ 0.63. * 80 / 32768 / 128 == * 5 / 262144 ++ * Make sure a call to update_clocks has been made before calling this to get ++ * an updated rq->niffies. ++ */ ++static void update_load_avg(struct rq *rq, unsigned int flags) ++{ ++ long us_interval, load; ++ unsigned long curload; ++ ++ us_interval = NS_TO_US(rq->niffies - rq->load_update); ++ if (unlikely(us_interval <= 0)) ++ return; ++ ++ curload = rq_load(rq); ++ load = rq->load_avg - (rq->load_avg * us_interval * 5 / 262144); ++ if (unlikely(load < 0)) ++ load = 0; ++ load += curload * curload * SCHED_CAPACITY_SCALE * us_interval * 5 / 262144; ++ rq->load_avg = load; ++ ++ rq->load_update = rq->niffies; ++ update_irq_load_avg(rq, 0); ++ if (likely(rq_local(rq))) ++ cpufreq_trigger(rq, flags); ++} ++ ++#ifdef HAVE_SCHED_AVG_IRQ ++/* ++ * IRQ variant of update_load_avg below. delta is actually time in nanoseconds ++ * here so we scale curload to how long it's been since the last update. ++ */ ++static void update_irq_load_avg(struct rq *rq, long delta) ++{ ++ long us_interval, load; ++ unsigned long curload; ++ ++ us_interval = NS_TO_US(rq->niffies - rq->irq_load_update); ++ if (unlikely(us_interval <= 0)) ++ return; ++ ++ curload = NS_TO_US(delta) / us_interval; ++ load = rq->irq_load_avg - (rq->irq_load_avg * us_interval * 5 / 262144); ++ if (unlikely(load < 0)) ++ load = 0; ++ load += curload * curload * SCHED_CAPACITY_SCALE * us_interval * 5 / 262144; ++ rq->irq_load_avg = load; ++ ++ rq->irq_load_update = rq->niffies; ++} ++#endif ++ ++/* ++ * Removing from the runqueue. Enter with rq locked. Deleting a task ++ * from the skip list is done via the stored node reference in the task struct ++ * and does not require a full look up. Thus it occurs in O(k) time where k ++ * is the "level" of the list the task was stored at - usually < 4, max 8. ++ */ ++static void dequeue_task(struct rq *rq, struct task_struct *p, int flags) ++{ ++ skiplist_delete(rq->sl, &p->node); ++ rq->best_key = rq->node->next[0]->key; ++ update_clocks(rq); ++ ++ if (!(flags & DEQUEUE_SAVE)) { ++ sched_info_dequeued(rq, p); ++ psi_dequeue(p, flags & DEQUEUE_SLEEP); ++ } ++ rq->nr_running--; ++ if (rt_task(p)) ++ rq->rt_nr_running--; ++ update_load_avg(rq, flags); ++} ++ ++#ifdef CONFIG_PREEMPT_RCU ++static bool rcu_read_critical(struct task_struct *p) ++{ ++ return p->rcu_read_unlock_special.b.blocked; ++} ++#else /* CONFIG_PREEMPT_RCU */ ++#define rcu_read_critical(p) (false) ++#endif /* CONFIG_PREEMPT_RCU */ ++ ++/* ++ * To determine if it's safe for a task of SCHED_IDLEPRIO to actually run as ++ * an idle task, we ensure none of the following conditions are met. ++ */ ++static bool idleprio_suitable(struct task_struct *p) ++{ ++ return (!(task_contributes_to_load(p)) && !(p->flags & (PF_EXITING)) && ++ !signal_pending(p) && !rcu_read_critical(p) && !freezing(p)); ++} ++ ++/* ++ * To determine if a task of SCHED_ISO can run in pseudo-realtime, we check ++ * that the iso_refractory flag is not set. ++ */ ++static inline bool isoprio_suitable(struct rq *rq) ++{ ++ return !rq->iso_refractory; ++} ++ ++/* ++ * Adding to the runqueue. Enter with rq locked. ++ */ ++static void enqueue_task(struct rq *rq, struct task_struct *p, int flags) ++{ ++ unsigned int randseed, cflags = 0; ++ u64 sl_id; ++ ++ if (!rt_task(p)) { ++ /* Check it hasn't gotten rt from PI */ ++ if ((idleprio_task(p) && idleprio_suitable(p)) || ++ (iso_task(p) && isoprio_suitable(rq))) ++ p->prio = p->normal_prio; ++ else ++ p->prio = NORMAL_PRIO; ++ } else ++ rq->rt_nr_running++; ++ /* ++ * The sl_id key passed to the skiplist generates a sorted list. ++ * Realtime and sched iso tasks run FIFO so they only need be sorted ++ * according to priority. The skiplist will put tasks of the same ++ * key inserted later in FIFO order. Tasks of sched normal, batch ++ * and idleprio are sorted according to their deadlines. Idleprio ++ * tasks are offset by an impossibly large deadline value ensuring ++ * they get sorted into last positions, but still according to their ++ * own deadlines. This creates a "landscape" of skiplists running ++ * from priority 0 realtime in first place to the lowest priority ++ * idleprio tasks last. Skiplist insertion is an O(log n) process. ++ */ ++ if (p->prio <= ISO_PRIO) { ++ sl_id = p->prio; ++ } else { ++ sl_id = p->deadline; ++ if (idleprio_task(p)) { ++ if (p->prio == IDLE_PRIO) ++ sl_id |= 0xF000000000000000; ++ else ++ sl_id += longest_deadline_diff(); ++ } ++ } ++ /* ++ * Some architectures don't have better than microsecond resolution ++ * so mask out ~microseconds as the random seed for skiplist insertion. ++ */ ++ update_clocks(rq); ++ if (!(flags & ENQUEUE_RESTORE)) { ++ sched_info_queued(rq, p); ++ psi_enqueue(p, flags & ENQUEUE_WAKEUP); ++ } ++ ++ randseed = (rq->niffies >> 10) & 0xFFFFFFFF; ++ skiplist_insert(rq->sl, &p->node, sl_id, p, randseed); ++ rq->best_key = rq->node->next[0]->key; ++ if (p->in_iowait) ++ cflags |= SCHED_CPUFREQ_IOWAIT; ++ rq->nr_running++; ++ update_load_avg(rq, cflags); ++} ++ ++/* ++ * Returns the relative length of deadline all compared to the shortest ++ * deadline which is that of nice -20. ++ */ ++static inline int task_prio_ratio(struct task_struct *p) ++{ ++ return prio_ratios[TASK_USER_PRIO(p)]; ++} ++ ++/* ++ * task_timeslice - all tasks of all priorities get the exact same timeslice ++ * length. CPU distribution is handled by giving different deadlines to ++ * tasks of different priorities. Use 128 as the base value for fast shifts. ++ */ ++static inline int task_timeslice(struct task_struct *p) ++{ ++ return (rr_interval * task_prio_ratio(p) / 128); ++} ++ ++#ifdef CONFIG_SMP ++/* Entered with rq locked */ ++static inline void resched_if_idle(struct rq *rq) ++{ ++ if (rq_idle(rq)) ++ resched_task(rq->curr); ++} ++ ++static inline bool rq_local(struct rq *rq) ++{ ++ return (rq->cpu == smp_processor_id()); ++} ++#ifdef CONFIG_SMT_NICE ++static const cpumask_t *thread_cpumask(int cpu); ++ ++/* Find the best real time priority running on any SMT siblings of cpu and if ++ * none are running, the static priority of the best deadline task running. ++ * The lookups to the other runqueues is done lockless as the occasional wrong ++ * value would be harmless. */ ++static int best_smt_bias(struct rq *this_rq) ++{ ++ int other_cpu, best_bias = 0; ++ ++ for_each_cpu(other_cpu, &this_rq->thread_mask) { ++ struct rq *rq = cpu_rq(other_cpu); ++ ++ if (rq_idle(rq)) ++ continue; ++ if (unlikely(!rq->online)) ++ continue; ++ if (!rq->rq_mm) ++ continue; ++ if (likely(rq->rq_smt_bias > best_bias)) ++ best_bias = rq->rq_smt_bias; ++ } ++ return best_bias; ++} ++ ++static int task_prio_bias(struct task_struct *p) ++{ ++ if (rt_task(p)) ++ return 1 << 30; ++ else if (task_running_iso(p)) ++ return 1 << 29; ++ else if (task_running_idle(p)) ++ return 0; ++ return MAX_PRIO - p->static_prio; ++} ++ ++static bool smt_always_schedule(struct task_struct __maybe_unused *p, struct rq __maybe_unused *this_rq) ++{ ++ return true; ++} ++ ++static bool (*smt_schedule)(struct task_struct *p, struct rq *this_rq) = &smt_always_schedule; ++ ++/* We've already decided p can run on CPU, now test if it shouldn't for SMT ++ * nice reasons. */ ++static bool smt_should_schedule(struct task_struct *p, struct rq *this_rq) ++{ ++ int best_bias, task_bias; ++ ++ /* Kernel threads always run */ ++ if (unlikely(!p->mm)) ++ return true; ++ if (rt_task(p)) ++ return true; ++ if (!idleprio_suitable(p)) ++ return true; ++ best_bias = best_smt_bias(this_rq); ++ /* The smt siblings are all idle or running IDLEPRIO */ ++ if (best_bias < 1) ++ return true; ++ task_bias = task_prio_bias(p); ++ if (task_bias < 1) ++ return false; ++ if (task_bias >= best_bias) ++ return true; ++ /* Dither 25% cpu of normal tasks regardless of nice difference */ ++ if (best_bias % 4 == 1) ++ return true; ++ /* Sorry, you lose */ ++ return false; ++} ++#else /* CONFIG_SMT_NICE */ ++#define smt_schedule(p, this_rq) (true) ++#endif /* CONFIG_SMT_NICE */ ++ ++static inline void atomic_set_cpu(int cpu, cpumask_t *cpumask) ++{ ++ set_bit(cpu, (volatile unsigned long *)cpumask); ++} ++ ++/* ++ * The cpu_idle_map stores a bitmap of all the CPUs currently idle to ++ * allow easy lookup of whether any suitable idle CPUs are available. ++ * It's cheaper to maintain a binary yes/no if there are any idle CPUs on the ++ * idle_cpus variable than to do a full bitmask check when we are busy. The ++ * bits are set atomically but read locklessly as occasional false positive / ++ * negative is harmless. ++ */ ++static inline void set_cpuidle_map(int cpu) ++{ ++ if (likely(cpu_online(cpu))) ++ atomic_set_cpu(cpu, &cpu_idle_map); ++} ++ ++static inline void atomic_clear_cpu(int cpu, cpumask_t *cpumask) ++{ ++ clear_bit(cpu, (volatile unsigned long *)cpumask); ++} ++ ++static inline void clear_cpuidle_map(int cpu) ++{ ++ atomic_clear_cpu(cpu, &cpu_idle_map); ++} ++ ++static bool suitable_idle_cpus(struct task_struct *p) ++{ ++ return (cpumask_intersects(&p->cpus_allowed, &cpu_idle_map)); ++} ++ ++/* ++ * Resched current on rq. We don't know if rq is local to this CPU nor if it ++ * is locked so we do not use an intermediate variable for the task to avoid ++ * having it dereferenced. ++ */ ++static void resched_curr(struct rq *rq) ++{ ++ int cpu; ++ ++ if (test_tsk_need_resched(rq->curr)) ++ return; ++ ++ rq->preempt = rq->curr; ++ cpu = rq->cpu; ++ ++ /* We're doing this without holding the rq lock if it's not task_rq */ ++ ++ if (cpu == smp_processor_id()) { ++ set_tsk_need_resched(rq->curr); ++ set_preempt_need_resched(); ++ return; ++ } ++ ++ if (set_nr_and_not_polling(rq->curr)) ++ smp_sched_reschedule(cpu); ++ else ++ trace_sched_wake_idle_without_ipi(cpu); ++} ++ ++#define CPUIDLE_DIFF_THREAD (1) ++#define CPUIDLE_DIFF_CORE (2) ++#define CPUIDLE_CACHE_BUSY (4) ++#define CPUIDLE_DIFF_CPU (8) ++#define CPUIDLE_THREAD_BUSY (16) ++#define CPUIDLE_DIFF_NODE (32) ++ ++/* ++ * The best idle CPU is chosen according to the CPUIDLE ranking above where the ++ * lowest value would give the most suitable CPU to schedule p onto next. The ++ * order works out to be the following: ++ * ++ * Same thread, idle or busy cache, idle or busy threads ++ * Other core, same cache, idle or busy cache, idle threads. ++ * Same node, other CPU, idle cache, idle threads. ++ * Same node, other CPU, busy cache, idle threads. ++ * Other core, same cache, busy threads. ++ * Same node, other CPU, busy threads. ++ * Other node, other CPU, idle cache, idle threads. ++ * Other node, other CPU, busy cache, idle threads. ++ * Other node, other CPU, busy threads. ++ */ ++static int best_mask_cpu(int best_cpu, struct rq *rq, cpumask_t *tmpmask) ++{ ++ int best_ranking = CPUIDLE_DIFF_NODE | CPUIDLE_THREAD_BUSY | ++ CPUIDLE_DIFF_CPU | CPUIDLE_CACHE_BUSY | CPUIDLE_DIFF_CORE | ++ CPUIDLE_DIFF_THREAD; ++ int cpu_tmp; ++ ++ if (cpumask_test_cpu(best_cpu, tmpmask)) ++ goto out; ++ ++ for_each_cpu(cpu_tmp, tmpmask) { ++ int ranking, locality; ++ struct rq *tmp_rq; ++ ++ ranking = 0; ++ tmp_rq = cpu_rq(cpu_tmp); ++ ++ locality = rq->cpu_locality[cpu_tmp]; ++#ifdef CONFIG_NUMA ++ if (locality > 3) ++ ranking |= CPUIDLE_DIFF_NODE; ++ else ++#endif ++ if (locality > 2) ++ ranking |= CPUIDLE_DIFF_CPU; ++#ifdef CONFIG_SCHED_MC ++ else if (locality == 2) ++ ranking |= CPUIDLE_DIFF_CORE; ++ else if (!(tmp_rq->cache_idle(tmp_rq))) ++ ranking |= CPUIDLE_CACHE_BUSY; ++#endif ++#ifdef CONFIG_SCHED_SMT ++ if (locality == 1) ++ ranking |= CPUIDLE_DIFF_THREAD; ++ if (!(tmp_rq->siblings_idle(tmp_rq))) ++ ranking |= CPUIDLE_THREAD_BUSY; ++#endif ++ if (ranking < best_ranking) { ++ best_cpu = cpu_tmp; ++ best_ranking = ranking; ++ } ++ } ++out: ++ return best_cpu; ++} ++ ++bool cpus_share_cache(int this_cpu, int that_cpu) ++{ ++ struct rq *this_rq = cpu_rq(this_cpu); ++ ++ return (this_rq->cpu_locality[that_cpu] < 3); ++} ++ ++/* As per resched_curr but only will resched idle task */ ++static inline void resched_idle(struct rq *rq) ++{ ++ if (test_tsk_need_resched(rq->idle)) ++ return; ++ ++ rq->preempt = rq->idle; ++ ++ set_tsk_need_resched(rq->idle); ++ ++ if (rq_local(rq)) { ++ set_preempt_need_resched(); ++ return; ++ } ++ ++ smp_sched_reschedule(rq->cpu); ++} ++ ++static struct rq *resched_best_idle(struct task_struct *p, int cpu) ++{ ++ cpumask_t tmpmask; ++ struct rq *rq; ++ int best_cpu; ++ ++ cpumask_and(&tmpmask, &p->cpus_allowed, &cpu_idle_map); ++ best_cpu = best_mask_cpu(cpu, task_rq(p), &tmpmask); ++ rq = cpu_rq(best_cpu); ++ if (!smt_schedule(p, rq)) ++ return NULL; ++ rq->preempt = p; ++ resched_idle(rq); ++ return rq; ++} ++ ++static inline void resched_suitable_idle(struct task_struct *p) ++{ ++ if (suitable_idle_cpus(p)) ++ resched_best_idle(p, task_cpu(p)); ++} ++ ++static inline struct rq *rq_order(struct rq *rq, int cpu) ++{ ++ return rq->rq_order[cpu]; ++} ++#else /* CONFIG_SMP */ ++static inline void set_cpuidle_map(int cpu) ++{ ++} ++ ++static inline void clear_cpuidle_map(int cpu) ++{ ++} ++ ++static inline bool suitable_idle_cpus(struct task_struct *p) ++{ ++ return uprq->curr == uprq->idle; ++} ++ ++static inline void resched_suitable_idle(struct task_struct *p) ++{ ++} ++ ++static inline void resched_curr(struct rq *rq) ++{ ++ resched_task(rq->curr); ++} ++ ++static inline void resched_if_idle(struct rq *rq) ++{ ++} ++ ++static inline bool rq_local(struct rq *rq) ++{ ++ return true; ++} ++ ++static inline struct rq *rq_order(struct rq *rq, int cpu) ++{ ++ return rq; ++} ++ ++static inline bool smt_schedule(struct task_struct *p, struct rq *rq) ++{ ++ return true; ++} ++#endif /* CONFIG_SMP */ ++ ++static inline int normal_prio(struct task_struct *p) ++{ ++ if (has_rt_policy(p)) ++ return MAX_RT_PRIO - 1 - p->rt_priority; ++ if (idleprio_task(p)) ++ return IDLE_PRIO; ++ if (iso_task(p)) ++ return ISO_PRIO; ++ return NORMAL_PRIO; ++} ++ ++/* ++ * Calculate the current priority, i.e. the priority ++ * taken into account by the scheduler. This value might ++ * be boosted by RT tasks as it will be RT if the task got ++ * RT-boosted. If not then it returns p->normal_prio. ++ */ ++static int effective_prio(struct task_struct *p) ++{ ++ p->normal_prio = normal_prio(p); ++ /* ++ * If we are RT tasks or we were boosted to RT priority, ++ * keep the priority unchanged. Otherwise, update priority ++ * to the normal priority: ++ */ ++ if (!rt_prio(p->prio)) ++ return p->normal_prio; ++ return p->prio; ++} ++ ++/* ++ * activate_task - move a task to the runqueue. Enter with rq locked. ++ */ ++static void activate_task(struct rq *rq, struct task_struct *p, int flags) ++{ ++ resched_if_idle(rq); ++ ++ /* ++ * Sleep time is in units of nanosecs, so shift by 20 to get a ++ * milliseconds-range estimation of the amount of time that the task ++ * spent sleeping: ++ */ ++ if (unlikely(prof_on == SLEEP_PROFILING)) { ++ if (p->state == TASK_UNINTERRUPTIBLE) ++ profile_hits(SLEEP_PROFILING, (void *)get_wchan(p), ++ (rq->niffies - p->last_ran) >> 20); ++ } ++ ++ p->prio = effective_prio(p); ++ if (task_contributes_to_load(p)) ++ rq->nr_uninterruptible--; ++ ++ enqueue_task(rq, p, flags); ++ p->on_rq = TASK_ON_RQ_QUEUED; ++} ++ ++/* ++ * deactivate_task - If it's running, it's not on the runqueue and we can just ++ * decrement the nr_running. Enter with rq locked. ++ */ ++static inline void deactivate_task(struct task_struct *p, struct rq *rq) ++{ ++ if (task_contributes_to_load(p)) ++ rq->nr_uninterruptible++; ++ ++ p->on_rq = 0; ++ sched_info_dequeued(rq, p); ++ /* deactivate_task is always DEQUEUE_SLEEP in muqss */ ++ psi_dequeue(p, DEQUEUE_SLEEP); ++} ++ ++#ifdef CONFIG_SMP ++void set_task_cpu(struct task_struct *p, unsigned int new_cpu) ++{ ++ struct rq *rq; ++ ++ if (task_cpu(p) == new_cpu) ++ return; ++ ++ /* Do NOT call set_task_cpu on a currently queued task as we will not ++ * be reliably holding the rq lock after changing CPU. */ ++ BUG_ON(task_queued(p)); ++ rq = task_rq(p); ++ ++#ifdef CONFIG_LOCKDEP ++ /* ++ * The caller should hold either p->pi_lock or rq->lock, when changing ++ * a task's CPU. ->pi_lock for waking tasks, rq->lock for runnable tasks. ++ * ++ * Furthermore, all task_rq users should acquire both locks, see ++ * task_rq_lock(). ++ */ ++ WARN_ON_ONCE(debug_locks && !(lockdep_is_held(&p->pi_lock) || ++ lockdep_is_held(rq->lock))); ++#endif ++ ++ trace_sched_migrate_task(p, new_cpu); ++ rseq_migrate(p); ++ perf_event_task_migrate(p); ++ ++ /* ++ * After ->cpu is set up to a new value, task_rq_lock(p, ...) can be ++ * successfully executed on another CPU. We must ensure that updates of ++ * per-task data have been completed by this moment. ++ */ ++ smp_wmb(); ++ ++ p->wake_cpu = new_cpu; ++ ++ if (task_running(rq, p)) { ++ /* ++ * We should only be calling this on a running task if we're ++ * holding rq lock. ++ */ ++ lockdep_assert_held(rq->lock); ++ ++ /* ++ * We can't change the task_thread_info CPU on a running task ++ * as p will still be protected by the rq lock of the CPU it ++ * is still running on so we only set the wake_cpu for it to be ++ * lazily updated once off the CPU. ++ */ ++ return; ++ } ++ ++#ifdef CONFIG_THREAD_INFO_IN_TASK ++ WRITE_ONCE(p->cpu, new_cpu); ++#else ++ WRITE_ONCE(task_thread_info(p)->cpu, new_cpu); ++#endif ++ /* We're no longer protecting p after this point since we're holding ++ * the wrong runqueue lock. */ ++} ++#endif /* CONFIG_SMP */ ++ ++/* ++ * Move a task off the runqueue and take it to a cpu for it will ++ * become the running task. ++ */ ++static inline void take_task(struct rq *rq, int cpu, struct task_struct *p) ++{ ++ struct rq *p_rq = task_rq(p); ++ ++ dequeue_task(p_rq, p, DEQUEUE_SAVE); ++ if (p_rq != rq) { ++ sched_info_dequeued(p_rq, p); ++ sched_info_queued(rq, p); ++ } ++ set_task_cpu(p, cpu); ++} ++ ++/* ++ * Returns a descheduling task to the runqueue unless it is being ++ * deactivated. ++ */ ++static inline void return_task(struct task_struct *p, struct rq *rq, ++ int cpu, bool deactivate) ++{ ++ if (deactivate) ++ deactivate_task(p, rq); ++ else { ++#ifdef CONFIG_SMP ++ /* ++ * set_task_cpu was called on the running task that doesn't ++ * want to deactivate so it has to be enqueued to a different ++ * CPU and we need its lock. Tag it to be moved with as the ++ * lock is dropped in finish_lock_switch. ++ */ ++ if (unlikely(p->wake_cpu != cpu)) ++ WRITE_ONCE(p->on_rq, TASK_ON_RQ_MIGRATING); ++ else ++#endif ++ enqueue_task(rq, p, ENQUEUE_RESTORE); ++ } ++} ++ ++/* Enter with rq lock held. We know p is on the local cpu */ ++static inline void __set_tsk_resched(struct task_struct *p) ++{ ++ set_tsk_need_resched(p); ++ set_preempt_need_resched(); ++} ++ ++/** ++ * task_curr - is this task currently executing on a CPU? ++ * @p: the task in question. ++ * ++ * Return: 1 if the task is currently executing. 0 otherwise. ++ */ ++inline int task_curr(const struct task_struct *p) ++{ ++ return cpu_curr(task_cpu(p)) == p; ++} ++ ++#ifdef CONFIG_SMP ++/* ++ * wait_task_inactive - wait for a thread to unschedule. ++ * ++ * If @match_state is nonzero, it's the @p->state value just checked and ++ * not expected to change. If it changes, i.e. @p might have woken up, ++ * then return zero. When we succeed in waiting for @p to be off its CPU, ++ * we return a positive number (its total switch count). If a second call ++ * a short while later returns the same number, the caller can be sure that ++ * @p has remained unscheduled the whole time. ++ * ++ * The caller must ensure that the task *will* unschedule sometime soon, ++ * else this function might spin for a *long* time. This function can't ++ * be called with interrupts off, or it may introduce deadlock with ++ * smp_call_function() if an IPI is sent by the same process we are ++ * waiting to become inactive. ++ */ ++unsigned long wait_task_inactive(struct task_struct *p, long match_state) ++{ ++ int running, queued; ++ struct rq_flags rf; ++ unsigned long ncsw; ++ struct rq *rq; ++ ++ for (;;) { ++ rq = task_rq(p); ++ ++ /* ++ * If the task is actively running on another CPU ++ * still, just relax and busy-wait without holding ++ * any locks. ++ * ++ * NOTE! Since we don't hold any locks, it's not ++ * even sure that "rq" stays as the right runqueue! ++ * But we don't care, since this will return false ++ * if the runqueue has changed and p is actually now ++ * running somewhere else! ++ */ ++ while (task_running(rq, p)) { ++ if (match_state && unlikely(p->state != match_state)) ++ return 0; ++ cpu_relax(); ++ } ++ ++ /* ++ * Ok, time to look more closely! We need the rq ++ * lock now, to be *sure*. If we're wrong, we'll ++ * just go back and repeat. ++ */ ++ rq = task_rq_lock(p, &rf); ++ trace_sched_wait_task(p); ++ running = task_running(rq, p); ++ queued = task_on_rq_queued(p); ++ ncsw = 0; ++ if (!match_state || p->state == match_state) ++ ncsw = p->nvcsw | LONG_MIN; /* sets MSB */ ++ task_rq_unlock(rq, p, &rf); ++ ++ /* ++ * If it changed from the expected state, bail out now. ++ */ ++ if (unlikely(!ncsw)) ++ break; ++ ++ /* ++ * Was it really running after all now that we ++ * checked with the proper locks actually held? ++ * ++ * Oops. Go back and try again.. ++ */ ++ if (unlikely(running)) { ++ cpu_relax(); ++ continue; ++ } ++ ++ /* ++ * It's not enough that it's not actively running, ++ * it must be off the runqueue _entirely_, and not ++ * preempted! ++ * ++ * So if it was still runnable (but just not actively ++ * running right now), it's preempted, and we should ++ * yield - it could be a while. ++ */ ++ if (unlikely(queued)) { ++ ktime_t to = NSEC_PER_SEC / HZ; ++ ++ set_current_state(TASK_UNINTERRUPTIBLE); ++ schedule_hrtimeout(&to, HRTIMER_MODE_REL); ++ continue; ++ } ++ ++ /* ++ * Ahh, all good. It wasn't running, and it wasn't ++ * runnable, which means that it will never become ++ * running in the future either. We're all done! ++ */ ++ break; ++ } ++ ++ return ncsw; ++} ++ ++/*** ++ * kick_process - kick a running thread to enter/exit the kernel ++ * @p: the to-be-kicked thread ++ * ++ * Cause a process which is running on another CPU to enter ++ * kernel-mode, without any delay. (to get signals handled.) ++ * ++ * NOTE: this function doesn't have to take the runqueue lock, ++ * because all it wants to ensure is that the remote task enters ++ * the kernel. If the IPI races and the task has been migrated ++ * to another CPU then no harm is done and the purpose has been ++ * achieved as well. ++ */ ++void kick_process(struct task_struct *p) ++{ ++ int cpu; ++ ++ preempt_disable(); ++ cpu = task_cpu(p); ++ if ((cpu != smp_processor_id()) && task_curr(p)) ++ smp_sched_reschedule(cpu); ++ preempt_enable(); ++} ++EXPORT_SYMBOL_GPL(kick_process); ++#endif ++ ++/* ++ * RT tasks preempt purely on priority. SCHED_NORMAL tasks preempt on the ++ * basis of earlier deadlines. SCHED_IDLEPRIO don't preempt anything else or ++ * between themselves, they cooperatively multitask. An idle rq scores as ++ * prio PRIO_LIMIT so it is always preempted. ++ */ ++static inline bool ++can_preempt(struct task_struct *p, int prio, u64 deadline) ++{ ++ /* Better static priority RT task or better policy preemption */ ++ if (p->prio < prio) ++ return true; ++ if (p->prio > prio) ++ return false; ++ if (p->policy == SCHED_BATCH) ++ return false; ++ /* SCHED_NORMAL and ISO will preempt based on deadline */ ++ if (!deadline_before(p->deadline, deadline)) ++ return false; ++ return true; ++} ++ ++#ifdef CONFIG_SMP ++ ++static inline bool is_per_cpu_kthread(struct task_struct *p) ++{ ++ if (!(p->flags & PF_KTHREAD)) ++ return false; ++ ++ if (p->nr_cpus_allowed != 1) ++ return false; ++ ++ return true; ++} ++ ++/* ++ * Per-CPU kthreads are allowed to run on !active && online CPUs, see ++ * __set_cpus_allowed_ptr(). ++ */ ++static inline bool is_cpu_allowed(struct task_struct *p, int cpu) ++{ ++ if (!cpumask_test_cpu(cpu, &p->cpus_allowed)) ++ return false; ++ ++ if (is_per_cpu_kthread(p)) ++ return cpu_online(cpu); ++ ++ return cpu_active(cpu); ++} ++ ++/* ++ * Check to see if p can run on cpu, and if not, whether there are any online ++ * CPUs it can run on instead. This only happens with the hotplug threads that ++ * bring up the CPUs. ++ */ ++static inline bool sched_other_cpu(struct task_struct *p, int cpu) ++{ ++ if (likely(cpumask_test_cpu(cpu, &p->cpus_allowed))) ++ return false; ++ if (p->nr_cpus_allowed == 1) { ++ cpumask_t valid_mask; ++ ++ cpumask_and(&valid_mask, &p->cpus_allowed, cpu_online_mask); ++ if (unlikely(cpumask_empty(&valid_mask))) ++ return false; ++ } ++ return true; ++} ++ ++static inline bool needs_other_cpu(struct task_struct *p, int cpu) ++{ ++ if (cpumask_test_cpu(cpu, &p->cpus_allowed)) ++ return false; ++ return true; ++} ++ ++#define cpu_online_map (*(cpumask_t *)cpu_online_mask) ++ ++static void try_preempt(struct task_struct *p, struct rq *this_rq) ++{ ++ int i, this_entries = rq_load(this_rq); ++ cpumask_t tmp; ++ ++ if (suitable_idle_cpus(p) && resched_best_idle(p, task_cpu(p))) ++ return; ++ ++ /* IDLEPRIO tasks never preempt anything but idle */ ++ if (p->policy == SCHED_IDLEPRIO) ++ return; ++ ++ cpumask_and(&tmp, &cpu_online_map, &p->cpus_allowed); ++ ++ for (i = 0; i < num_possible_cpus(); i++) { ++ struct rq *rq = this_rq->cpu_order[i]; ++ ++ if (!cpumask_test_cpu(rq->cpu, &tmp)) ++ continue; ++ ++ if (!sched_interactive && rq != this_rq && rq_load(rq) <= this_entries) ++ continue; ++ if (smt_schedule(p, rq) && can_preempt(p, rq->rq_prio, rq->rq_deadline)) { ++ /* We set rq->preempting lockless, it's a hint only */ ++ rq->preempting = p; ++ resched_curr(rq); ++ return; ++ } ++ } ++} ++ ++static int __set_cpus_allowed_ptr(struct task_struct *p, ++ const struct cpumask *new_mask, bool check); ++#else /* CONFIG_SMP */ ++static inline bool needs_other_cpu(struct task_struct *p, int cpu) ++{ ++ return false; ++} ++ ++static void try_preempt(struct task_struct *p, struct rq *this_rq) ++{ ++ if (p->policy == SCHED_IDLEPRIO) ++ return; ++ if (can_preempt(p, uprq->rq_prio, uprq->rq_deadline)) ++ resched_curr(uprq); ++} ++ ++static inline int __set_cpus_allowed_ptr(struct task_struct *p, ++ const struct cpumask *new_mask, bool check) ++{ ++ return set_cpus_allowed_ptr(p, new_mask); ++} ++#endif /* CONFIG_SMP */ ++ ++/* ++ * wake flags ++ */ ++#define WF_SYNC 0x01 /* waker goes to sleep after wakeup */ ++#define WF_FORK 0x02 /* child wakeup after fork */ ++#define WF_MIGRATED 0x04 /* internal use, task got migrated */ ++ ++static void ++ttwu_stat(struct task_struct *p, int cpu, int wake_flags) ++{ ++ struct rq *rq; ++ ++ if (!schedstat_enabled()) ++ return; ++ ++ rq = this_rq(); ++ ++#ifdef CONFIG_SMP ++ if (cpu == rq->cpu) { ++ __schedstat_inc(rq->ttwu_local); ++ } else { ++ struct sched_domain *sd; ++ ++ rcu_read_lock(); ++ for_each_domain(rq->cpu, sd) { ++ if (cpumask_test_cpu(cpu, sched_domain_span(sd))) { ++ __schedstat_inc(sd->ttwu_wake_remote); ++ break; ++ } ++ } ++ rcu_read_unlock(); ++ } ++ ++#endif /* CONFIG_SMP */ ++ ++ __schedstat_inc(rq->ttwu_count); ++} ++ ++/* ++ * Mark the task runnable and perform wakeup-preemption. ++ */ ++static void ttwu_do_wakeup(struct rq *rq, struct task_struct *p, int wake_flags) ++{ ++ /* ++ * Sync wakeups (i.e. those types of wakeups where the waker ++ * has indicated that it will leave the CPU in short order) ++ * don't trigger a preemption if there are no idle cpus, ++ * instead waiting for current to deschedule. ++ */ ++ if (wake_flags & WF_SYNC) ++ resched_suitable_idle(p); ++ else ++ try_preempt(p, rq); ++ p->state = TASK_RUNNING; ++ trace_sched_wakeup(p); ++} ++ ++static void ++ttwu_do_activate(struct rq *rq, struct task_struct *p, int wake_flags) ++{ ++ int en_flags = ENQUEUE_WAKEUP; ++ ++ lockdep_assert_held(rq->lock); ++ ++#ifdef CONFIG_SMP ++ if (p->sched_contributes_to_load) ++ rq->nr_uninterruptible--; ++ ++ if (wake_flags & WF_MIGRATED) ++ en_flags |= ENQUEUE_MIGRATED; ++#endif ++ ++ activate_task(rq, p, en_flags); ++ ttwu_do_wakeup(rq, p, wake_flags); ++} ++ ++/* ++ * Called in case the task @p isn't fully descheduled from its runqueue, ++ * in this case we must do a remote wakeup. Its a 'light' wakeup though, ++ * since all we need to do is flip p->state to TASK_RUNNING, since ++ * the task is still ->on_rq. ++ */ ++static int ttwu_remote(struct task_struct *p, int wake_flags) ++{ ++ struct rq *rq; ++ int ret = 0; ++ ++ rq = __task_rq_lock(p, NULL); ++ if (likely(task_on_rq_queued(p))) { ++ ttwu_do_wakeup(rq, p, wake_flags); ++ ret = 1; ++ } ++ __task_rq_unlock(rq, NULL); ++ ++ return ret; ++} ++ ++#ifdef CONFIG_SMP ++void sched_ttwu_pending(void) ++{ ++ struct rq *rq = this_rq(); ++ struct llist_node *llist = llist_del_all(&rq->wake_list); ++ struct task_struct *p, *t; ++ struct rq_flags rf; ++ ++ if (!llist) ++ return; ++ ++ rq_lock_irqsave(rq, &rf); ++ ++ llist_for_each_entry_safe(p, t, llist, wake_entry) ++ ttwu_do_activate(rq, p, 0); ++ ++ rq_unlock_irqrestore(rq, &rf); ++} ++ ++void scheduler_ipi(void) ++{ ++ /* ++ * Fold TIF_NEED_RESCHED into the preempt_count; anybody setting ++ * TIF_NEED_RESCHED remotely (for the first time) will also send ++ * this IPI. ++ */ ++ preempt_fold_need_resched(); ++ ++ if (llist_empty(&this_rq()->wake_list) && (!idle_cpu(smp_processor_id()) || need_resched())) ++ return; ++ ++ /* ++ * Not all reschedule IPI handlers call irq_enter/irq_exit, since ++ * traditionally all their work was done from the interrupt return ++ * path. Now that we actually do some work, we need to make sure ++ * we do call them. ++ * ++ * Some archs already do call them, luckily irq_enter/exit nest ++ * properly. ++ * ++ * Arguably we should visit all archs and update all handlers, ++ * however a fair share of IPIs are still resched only so this would ++ * somewhat pessimize the simple resched case. ++ */ ++ irq_enter(); ++ sched_ttwu_pending(); ++ irq_exit(); ++} ++ ++static void ttwu_queue_remote(struct task_struct *p, int cpu, int wake_flags) ++{ ++ struct rq *rq = cpu_rq(cpu); ++ ++ if (llist_add(&p->wake_entry, &cpu_rq(cpu)->wake_list)) { ++ if (!set_nr_if_polling(rq->idle)) ++ smp_sched_reschedule(cpu); ++ else ++ trace_sched_wake_idle_without_ipi(cpu); ++ } ++} ++ ++void wake_up_if_idle(int cpu) ++{ ++ struct rq *rq = cpu_rq(cpu); ++ struct rq_flags rf; ++ ++ rcu_read_lock(); ++ ++ if (!is_idle_task(rcu_dereference(rq->curr))) ++ goto out; ++ ++ if (set_nr_if_polling(rq->idle)) { ++ trace_sched_wake_idle_without_ipi(cpu); ++ } else { ++ rq_lock_irqsave(rq, &rf); ++ if (likely(is_idle_task(rq->curr))) ++ smp_sched_reschedule(cpu); ++ /* Else cpu is not in idle, do nothing here */ ++ rq_unlock_irqrestore(rq, &rf); ++ } ++ ++out: ++ rcu_read_unlock(); ++} ++ ++static int valid_task_cpu(struct task_struct *p) ++{ ++ cpumask_t valid_mask; ++ ++ if (p->flags & PF_KTHREAD) ++ cpumask_and(&valid_mask, &p->cpus_allowed, cpu_all_mask); ++ else ++ cpumask_and(&valid_mask, &p->cpus_allowed, cpu_active_mask); ++ ++ if (unlikely(!cpumask_weight(&valid_mask))) { ++ /* We shouldn't be hitting this any more */ ++ printk(KERN_WARNING "SCHED: No cpumask for %s/%d weight %d\n", p->comm, ++ p->pid, cpumask_weight(&p->cpus_allowed)); ++ return cpumask_any(&p->cpus_allowed); ++ } ++ return cpumask_any(&valid_mask); ++} ++ ++/* ++ * For a task that's just being woken up we have a valuable balancing ++ * opportunity so choose the nearest cache most lightly loaded runqueue. ++ * Entered with rq locked and returns with the chosen runqueue locked. ++ */ ++static inline int select_best_cpu(struct task_struct *p) ++{ ++ unsigned int idlest = ~0U; ++ struct rq *rq = NULL; ++ int i; ++ ++ if (suitable_idle_cpus(p)) { ++ int cpu = task_cpu(p); ++ ++ if (unlikely(needs_other_cpu(p, cpu))) ++ cpu = valid_task_cpu(p); ++ rq = resched_best_idle(p, cpu); ++ if (likely(rq)) ++ return rq->cpu; ++ } ++ ++ for (i = 0; i < num_possible_cpus(); i++) { ++ struct rq *other_rq = task_rq(p)->cpu_order[i]; ++ int entries; ++ ++ if (!other_rq->online) ++ continue; ++ if (needs_other_cpu(p, other_rq->cpu)) ++ continue; ++ entries = rq_load(other_rq); ++ if (entries >= idlest) ++ continue; ++ idlest = entries; ++ rq = other_rq; ++ } ++ if (unlikely(!rq)) ++ return task_cpu(p); ++ return rq->cpu; ++} ++#else /* CONFIG_SMP */ ++static int valid_task_cpu(struct task_struct *p) ++{ ++ return 0; ++} ++ ++static inline int select_best_cpu(struct task_struct *p) ++{ ++ return 0; ++} ++ ++static struct rq *resched_best_idle(struct task_struct *p, int cpu) ++{ ++ return NULL; ++} ++#endif /* CONFIG_SMP */ ++ ++static void ttwu_queue(struct task_struct *p, int cpu, int wake_flags) ++{ ++ struct rq *rq = cpu_rq(cpu); ++ ++#if defined(CONFIG_SMP) ++ if (!cpus_share_cache(smp_processor_id(), cpu)) { ++ sched_clock_cpu(cpu); /* Sync clocks across CPUs */ ++ ttwu_queue_remote(p, cpu, wake_flags); ++ return; ++ } ++#endif ++ rq_lock(rq); ++ ttwu_do_activate(rq, p, wake_flags); ++ rq_unlock(rq); ++} ++ ++/*** ++ * try_to_wake_up - wake up a thread ++ * @p: the thread to be awakened ++ * @state: the mask of task states that can be woken ++ * @wake_flags: wake modifier flags (WF_*) ++ * ++ * Put it on the run-queue if it's not already there. The "current" ++ * thread is always on the run-queue (except when the actual ++ * re-schedule is in progress), and as such you're allowed to do ++ * the simpler "current->state = TASK_RUNNING" to mark yourself ++ * runnable without the overhead of this. ++ * ++ * Return: %true if @p was woken up, %false if it was already running. ++ * or @state didn't match @p's state. ++ */ ++static int ++try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) ++{ ++ unsigned long flags; ++ int cpu, success = 0; ++ ++ /* ++ * If we are going to wake up a thread waiting for CONDITION we ++ * need to ensure that CONDITION=1 done by the caller can not be ++ * reordered with p->state check below. This pairs with mb() in ++ * set_current_state() the waiting thread does. ++ */ ++ raw_spin_lock_irqsave(&p->pi_lock, flags); ++ smp_mb__after_spinlock(); ++ /* state is a volatile long, どうして、分からない */ ++ if (!((unsigned int)p->state & state)) ++ goto out; ++ ++ trace_sched_waking(p); ++ ++ /* We're going to change ->state: */ ++ success = 1; ++ cpu = task_cpu(p); ++ ++ /* ++ * Ensure we load p->on_rq _after_ p->state, otherwise it would ++ * be possible to, falsely, observe p->on_rq == 0 and get stuck ++ * in smp_cond_load_acquire() below. ++ * ++ * sched_ttwu_pending() try_to_wake_up() ++ * STORE p->on_rq = 1 LOAD p->state ++ * UNLOCK rq->lock ++ * ++ * __schedule() (switch to task 'p') ++ * LOCK rq->lock smp_rmb(); ++ * smp_mb__after_spinlock(); ++ * UNLOCK rq->lock ++ * ++ * [task p] ++ * STORE p->state = UNINTERRUPTIBLE LOAD p->on_rq ++ * ++ * Pairs with the LOCK+smp_mb__after_spinlock() on rq->lock in ++ * __schedule(). See the comment for smp_mb__after_spinlock(). ++ */ ++ smp_rmb(); ++ if (p->on_rq && ttwu_remote(p, wake_flags)) ++ goto stat; ++ ++#ifdef CONFIG_SMP ++ /* ++ * Ensure we load p->on_cpu _after_ p->on_rq, otherwise it would be ++ * possible to, falsely, observe p->on_cpu == 0. ++ * ++ * One must be running (->on_cpu == 1) in order to remove oneself ++ * from the runqueue. ++ * ++ * __schedule() (switch to task 'p') try_to_wake_up() ++ * STORE p->on_cpu = 1 LOAD p->on_rq ++ * UNLOCK rq->lock ++ * ++ * __schedule() (put 'p' to sleep) ++ * LOCK rq->lock smp_rmb(); ++ * smp_mb__after_spinlock(); ++ * STORE p->on_rq = 0 LOAD p->on_cpu ++ * ++ * Pairs with the LOCK+smp_mb__after_spinlock() on rq->lock in ++ * __schedule(). See the comment for smp_mb__after_spinlock(). ++ */ ++ smp_rmb(); ++ ++ /* ++ * If the owning (remote) CPU is still in the middle of schedule() with ++ * this task as prev, wait until its done referencing the task. ++ * ++ * Pairs with the smp_store_release() in finish_task(). ++ * ++ * This ensures that tasks getting woken will be fully ordered against ++ * their previous state and preserve Program Order. ++ */ ++ smp_cond_load_acquire(&p->on_cpu, !VAL); ++ ++ p->sched_contributes_to_load = !!task_contributes_to_load(p); ++ p->state = TASK_WAKING; ++ ++ if (p->in_iowait) { ++ delayacct_blkio_end(p); ++ atomic_dec(&task_rq(p)->nr_iowait); ++ } ++ ++ cpu = select_best_cpu(p); ++ if (task_cpu(p) != cpu) { ++ wake_flags |= WF_MIGRATED; ++ psi_ttwu_dequeue(p); ++ set_task_cpu(p, cpu); ++ } ++ ++#else /* CONFIG_SMP */ ++ ++ if (p->in_iowait) { ++ delayacct_blkio_end(p); ++ atomic_dec(&task_rq(p)->nr_iowait); ++ } ++ ++#endif /* CONFIG_SMP */ ++ ++ ttwu_queue(p, cpu, wake_flags); ++stat: ++ ttwu_stat(p, cpu, wake_flags); ++out: ++ raw_spin_unlock_irqrestore(&p->pi_lock, flags); ++ ++ return success; ++} ++ ++/** ++ * wake_up_process - Wake up a specific process ++ * @p: The process to be woken up. ++ * ++ * Attempt to wake up the nominated process and move it to the set of runnable ++ * processes. ++ * ++ * Return: 1 if the process was woken up, 0 if it was already running. ++ * ++ * This function executes a full memory barrier before accessing the task state. ++ */ ++int wake_up_process(struct task_struct *p) ++{ ++ return try_to_wake_up(p, TASK_NORMAL, 0); ++} ++EXPORT_SYMBOL(wake_up_process); ++ ++int wake_up_state(struct task_struct *p, unsigned int state) ++{ ++ return try_to_wake_up(p, state, 0); ++} ++ ++static void time_slice_expired(struct task_struct *p, struct rq *rq); ++ ++/* ++ * Perform scheduler related setup for a newly forked process p. ++ * p is forked by current. ++ */ ++int sched_fork(unsigned long __maybe_unused clone_flags, struct task_struct *p) ++{ ++ unsigned long flags; ++ ++#ifdef CONFIG_PREEMPT_NOTIFIERS ++ INIT_HLIST_HEAD(&p->preempt_notifiers); ++#endif ++ ++#ifdef CONFIG_COMPACTION ++ p->capture_control = NULL; ++#endif ++ ++ /* ++ * We mark the process as NEW here. This guarantees that ++ * nobody will actually run it, and a signal or other external ++ * event cannot wake it up and insert it on the runqueue either. ++ */ ++ p->state = TASK_NEW; ++ ++ /* ++ * The process state is set to the same value of the process executing ++ * do_fork() code. That is running. This guarantees that nobody will ++ * actually run it, and a signal or other external event cannot wake ++ * it up and insert it on the runqueue either. ++ */ ++ ++ /* Should be reset in fork.c but done here for ease of MuQSS patching */ ++ p->on_cpu = ++ p->on_rq = ++ p->utime = ++ p->stime = ++ p->sched_time = ++ p->stime_ns = ++ p->utime_ns = 0; ++ skiplist_node_init(&p->node); ++ ++ /* ++ * Revert to default priority/policy on fork if requested. ++ */ ++ if (unlikely(p->sched_reset_on_fork)) { ++ if (p->policy == SCHED_FIFO || p->policy == SCHED_RR) { ++ p->policy = SCHED_NORMAL; ++ p->normal_prio = normal_prio(p); ++ } ++ ++ if (PRIO_TO_NICE(p->static_prio) < 0) { ++ p->static_prio = NICE_TO_PRIO(0); ++ p->normal_prio = p->static_prio; ++ } ++ ++ /* ++ * We don't need the reset flag anymore after the fork. It has ++ * fulfilled its duty: ++ */ ++ p->sched_reset_on_fork = 0; ++ } ++ ++ /* ++ * Silence PROVE_RCU. ++ */ ++ raw_spin_lock_irqsave(&p->pi_lock, flags); ++ set_task_cpu(p, smp_processor_id()); ++ raw_spin_unlock_irqrestore(&p->pi_lock, flags); ++ ++#ifdef CONFIG_SCHED_INFO ++ if (unlikely(sched_info_on())) ++ memset(&p->sched_info, 0, sizeof(p->sched_info)); ++#endif ++ init_task_preempt_count(p); ++ ++ return 0; ++} ++ ++#ifdef CONFIG_SCHEDSTATS ++ ++DEFINE_STATIC_KEY_FALSE(sched_schedstats); ++static bool __initdata __sched_schedstats = false; ++ ++static void set_schedstats(bool enabled) ++{ ++ if (enabled) ++ static_branch_enable(&sched_schedstats); ++ else ++ static_branch_disable(&sched_schedstats); ++} ++ ++void force_schedstat_enabled(void) ++{ ++ if (!schedstat_enabled()) { ++ pr_info("kernel profiling enabled schedstats, disable via kernel.sched_schedstats.\n"); ++ static_branch_enable(&sched_schedstats); ++ } ++} ++ ++static int __init setup_schedstats(char *str) ++{ ++ int ret = 0; ++ if (!str) ++ goto out; ++ ++ /* ++ * This code is called before jump labels have been set up, so we can't ++ * change the static branch directly just yet. Instead set a temporary ++ * variable so init_schedstats() can do it later. ++ */ ++ if (!strcmp(str, "enable")) { ++ __sched_schedstats = true; ++ ret = 1; ++ } else if (!strcmp(str, "disable")) { ++ __sched_schedstats = false; ++ ret = 1; ++ } ++out: ++ if (!ret) ++ pr_warn("Unable to parse schedstats=\n"); ++ ++ return ret; ++} ++__setup("schedstats=", setup_schedstats); ++ ++static void __init init_schedstats(void) ++{ ++ set_schedstats(__sched_schedstats); ++} ++ ++#ifdef CONFIG_PROC_SYSCTL ++int sysctl_schedstats(struct ctl_table *table, int write, ++ void __user *buffer, size_t *lenp, loff_t *ppos) ++{ ++ struct ctl_table t; ++ int err; ++ int state = static_branch_likely(&sched_schedstats); ++ ++ if (write && !capable(CAP_SYS_ADMIN)) ++ return -EPERM; ++ ++ t = *table; ++ t.data = &state; ++ err = proc_dointvec_minmax(&t, write, buffer, lenp, ppos); ++ if (err < 0) ++ return err; ++ if (write) ++ set_schedstats(state); ++ return err; ++} ++#endif /* CONFIG_PROC_SYSCTL */ ++#else /* !CONFIG_SCHEDSTATS */ ++static inline void init_schedstats(void) {} ++#endif /* CONFIG_SCHEDSTATS */ ++ ++static void update_cpu_clock_switch(struct rq *rq, struct task_struct *p); ++ ++static void account_task_cpu(struct rq *rq, struct task_struct *p) ++{ ++ update_clocks(rq); ++ /* This isn't really a context switch but accounting is the same */ ++ update_cpu_clock_switch(rq, p); ++ p->last_ran = rq->niffies; ++} ++ ++bool sched_smp_initialized __read_mostly; ++ ++static inline int hrexpiry_enabled(struct rq *rq) ++{ ++ if (unlikely(!cpu_active(cpu_of(rq)) || !sched_smp_initialized)) ++ return 0; ++ return hrtimer_is_hres_active(&rq->hrexpiry_timer); ++} ++ ++/* ++ * Use HR-timers to deliver accurate preemption points. ++ */ ++static inline void hrexpiry_clear(struct rq *rq) ++{ ++ if (!hrexpiry_enabled(rq)) ++ return; ++ if (hrtimer_active(&rq->hrexpiry_timer)) ++ hrtimer_cancel(&rq->hrexpiry_timer); ++} ++ ++/* ++ * High-resolution time_slice expiry. ++ * Runs from hardirq context with interrupts disabled. ++ */ ++static enum hrtimer_restart hrexpiry(struct hrtimer *timer) ++{ ++ struct rq *rq = container_of(timer, struct rq, hrexpiry_timer); ++ struct task_struct *p; ++ ++ /* This can happen during CPU hotplug / resume */ ++ if (unlikely(cpu_of(rq) != smp_processor_id())) ++ goto out; ++ ++ /* ++ * We're doing this without the runqueue lock but this should always ++ * be run on the local CPU. Time slice should run out in __schedule ++ * but we set it to zero here in case niffies is slightly less. ++ */ ++ p = rq->curr; ++ p->time_slice = 0; ++ __set_tsk_resched(p); ++out: ++ return HRTIMER_NORESTART; ++} ++ ++/* ++ * Called to set the hrexpiry timer state. ++ * ++ * called with irqs disabled from the local CPU only ++ */ ++static void hrexpiry_start(struct rq *rq, u64 delay) ++{ ++ if (!hrexpiry_enabled(rq)) ++ return; ++ ++ hrtimer_start(&rq->hrexpiry_timer, ns_to_ktime(delay), ++ HRTIMER_MODE_REL_PINNED); ++} ++ ++static void init_rq_hrexpiry(struct rq *rq) ++{ ++ hrtimer_init(&rq->hrexpiry_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ rq->hrexpiry_timer.function = hrexpiry; ++} ++ ++static inline int rq_dither(struct rq *rq) ++{ ++ if (!hrexpiry_enabled(rq)) ++ return HALF_JIFFY_US; ++ return 0; ++} ++ ++/* ++ * wake_up_new_task - wake up a newly created task for the first time. ++ * ++ * This function will do some initial scheduler statistics housekeeping ++ * that must be done for every newly created context, then puts the task ++ * on the runqueue and wakes it. ++ */ ++void wake_up_new_task(struct task_struct *p) ++{ ++ struct task_struct *parent, *rq_curr; ++ struct rq *rq, *new_rq; ++ unsigned long flags; ++ ++ parent = p->parent; ++ ++ raw_spin_lock_irqsave(&p->pi_lock, flags); ++ p->state = TASK_RUNNING; ++ /* Task_rq can't change yet on a new task */ ++ new_rq = rq = task_rq(p); ++ if (unlikely(needs_other_cpu(p, task_cpu(p)))) { ++ set_task_cpu(p, valid_task_cpu(p)); ++ new_rq = task_rq(p); ++ } ++ ++ double_rq_lock(rq, new_rq); ++ rq_curr = rq->curr; ++ ++ /* ++ * Make sure we do not leak PI boosting priority to the child. ++ */ ++ p->prio = rq_curr->normal_prio; ++ ++ trace_sched_wakeup_new(p); ++ ++ /* ++ * Share the timeslice between parent and child, thus the ++ * total amount of pending timeslices in the system doesn't change, ++ * resulting in more scheduling fairness. If it's negative, it won't ++ * matter since that's the same as being 0. rq->rq_deadline is only ++ * modified within schedule() so it is always equal to ++ * current->deadline. ++ */ ++ account_task_cpu(rq, rq_curr); ++ p->last_ran = rq_curr->last_ran; ++ if (likely(rq_curr->policy != SCHED_FIFO)) { ++ rq_curr->time_slice /= 2; ++ if (rq_curr->time_slice < RESCHED_US) { ++ /* ++ * Forking task has run out of timeslice. Reschedule it and ++ * start its child with a new time slice and deadline. The ++ * child will end up running first because its deadline will ++ * be slightly earlier. ++ */ ++ __set_tsk_resched(rq_curr); ++ time_slice_expired(p, new_rq); ++ if (suitable_idle_cpus(p)) ++ resched_best_idle(p, task_cpu(p)); ++ else if (unlikely(rq != new_rq)) ++ try_preempt(p, new_rq); ++ } else { ++ p->time_slice = rq_curr->time_slice; ++ if (rq_curr == parent && rq == new_rq && !suitable_idle_cpus(p)) { ++ /* ++ * The VM isn't cloned, so we're in a good position to ++ * do child-runs-first in anticipation of an exec. This ++ * usually avoids a lot of COW overhead. ++ */ ++ __set_tsk_resched(rq_curr); ++ } else { ++ /* ++ * Adjust the hrexpiry since rq_curr will keep ++ * running and its timeslice has been shortened. ++ */ ++ hrexpiry_start(rq, US_TO_NS(rq_curr->time_slice)); ++ try_preempt(p, new_rq); ++ } ++ } ++ } else { ++ time_slice_expired(p, new_rq); ++ try_preempt(p, new_rq); ++ } ++ activate_task(new_rq, p, 0); ++ double_rq_unlock(rq, new_rq); ++ raw_spin_unlock_irqrestore(&p->pi_lock, flags); ++} ++ ++#ifdef CONFIG_PREEMPT_NOTIFIERS ++ ++static DEFINE_STATIC_KEY_FALSE(preempt_notifier_key); ++ ++void preempt_notifier_inc(void) ++{ ++ static_branch_inc(&preempt_notifier_key); ++} ++EXPORT_SYMBOL_GPL(preempt_notifier_inc); ++ ++void preempt_notifier_dec(void) ++{ ++ static_branch_dec(&preempt_notifier_key); ++} ++EXPORT_SYMBOL_GPL(preempt_notifier_dec); ++ ++/** ++ * preempt_notifier_register - tell me when current is being preempted & rescheduled ++ * @notifier: notifier struct to register ++ */ ++void preempt_notifier_register(struct preempt_notifier *notifier) ++{ ++ if (!static_branch_unlikely(&preempt_notifier_key)) ++ WARN(1, "registering preempt_notifier while notifiers disabled\n"); ++ ++ hlist_add_head(¬ifier->link, ¤t->preempt_notifiers); ++} ++EXPORT_SYMBOL_GPL(preempt_notifier_register); ++ ++/** ++ * preempt_notifier_unregister - no longer interested in preemption notifications ++ * @notifier: notifier struct to unregister ++ * ++ * This is *not* safe to call from within a preemption notifier. ++ */ ++void preempt_notifier_unregister(struct preempt_notifier *notifier) ++{ ++ hlist_del(¬ifier->link); ++} ++EXPORT_SYMBOL_GPL(preempt_notifier_unregister); ++ ++static void __fire_sched_in_preempt_notifiers(struct task_struct *curr) ++{ ++ struct preempt_notifier *notifier; ++ ++ hlist_for_each_entry(notifier, &curr->preempt_notifiers, link) ++ notifier->ops->sched_in(notifier, raw_smp_processor_id()); ++} ++ ++static __always_inline void fire_sched_in_preempt_notifiers(struct task_struct *curr) ++{ ++ if (static_branch_unlikely(&preempt_notifier_key)) ++ __fire_sched_in_preempt_notifiers(curr); ++} ++ ++static void ++__fire_sched_out_preempt_notifiers(struct task_struct *curr, ++ struct task_struct *next) ++{ ++ struct preempt_notifier *notifier; ++ ++ hlist_for_each_entry(notifier, &curr->preempt_notifiers, link) ++ notifier->ops->sched_out(notifier, next); ++} ++ ++static __always_inline void ++fire_sched_out_preempt_notifiers(struct task_struct *curr, ++ struct task_struct *next) ++{ ++ if (static_branch_unlikely(&preempt_notifier_key)) ++ __fire_sched_out_preempt_notifiers(curr, next); ++} ++ ++#else /* !CONFIG_PREEMPT_NOTIFIERS */ ++ ++static inline void fire_sched_in_preempt_notifiers(struct task_struct *curr) ++{ ++} ++ ++static inline void ++fire_sched_out_preempt_notifiers(struct task_struct *curr, ++ struct task_struct *next) ++{ ++} ++ ++#endif /* CONFIG_PREEMPT_NOTIFIERS */ ++ ++static inline void prepare_task(struct task_struct *next) ++{ ++ /* ++ * Claim the task as running, we do this before switching to it ++ * such that any running task will have this set. ++ */ ++ next->on_cpu = 1; ++} ++ ++static inline void finish_task(struct task_struct *prev) ++{ ++#ifdef CONFIG_SMP ++ /* ++ * After ->on_cpu is cleared, the task can be moved to a different CPU. ++ * We must ensure this doesn't happen until the switch is completely ++ * finished. ++ * ++ * In particular, the load of prev->state in finish_task_switch() must ++ * happen before this. ++ * ++ * Pairs with the smp_cond_load_acquire() in try_to_wake_up(). ++ */ ++ smp_store_release(&prev->on_cpu, 0); ++#endif ++} ++ ++static inline void ++prepare_lock_switch(struct rq *rq, struct task_struct *next) ++{ ++ /* ++ * Since the runqueue lock will be released by the next ++ * task (which is an invalid locking op but in the case ++ * of the scheduler it's an obvious special-case), so we ++ * do an early lockdep release here: ++ */ ++ spin_release(&rq->lock->dep_map, 1, _THIS_IP_); ++#ifdef CONFIG_DEBUG_SPINLOCK ++ /* this is a valid case when another task releases the spinlock */ ++ rq->lock->owner = next; ++#endif ++} ++ ++static inline void finish_lock_switch(struct rq *rq, struct task_struct *prev) ++{ ++ /* ++ * If we are tracking spinlock dependencies then we have to ++ * fix up the runqueue lock - which gets 'carried over' from ++ * prev into current: ++ */ ++ spin_acquire(&rq->lock->dep_map, 0, 0, _THIS_IP_); ++ ++#ifdef CONFIG_SMP ++ /* ++ * If prev was marked as migrating to another CPU in return_task, drop ++ * the local runqueue lock but leave interrupts disabled and grab the ++ * remote lock we're migrating it to before enabling them. ++ */ ++ if (unlikely(task_on_rq_migrating(prev))) { ++ sched_info_dequeued(rq, prev); ++ /* ++ * We move the ownership of prev to the new cpu now. ttwu can't ++ * activate prev to the wrong cpu since it has to grab this ++ * runqueue in ttwu_remote. ++ */ ++#ifdef CONFIG_THREAD_INFO_IN_TASK ++ prev->cpu = prev->wake_cpu; ++#else ++ task_thread_info(prev)->cpu = prev->wake_cpu; ++#endif ++ raw_spin_unlock(rq->lock); ++ ++ raw_spin_lock(&prev->pi_lock); ++ rq = __task_rq_lock(prev, NULL); ++ /* Check that someone else hasn't already queued prev */ ++ if (likely(!task_queued(prev))) { ++ enqueue_task(rq, prev, 0); ++ prev->on_rq = TASK_ON_RQ_QUEUED; ++ /* Wake up the CPU if it's not already running */ ++ resched_if_idle(rq); ++ } ++ raw_spin_unlock(&prev->pi_lock); ++ } ++#endif ++ rq_unlock(rq); ++ ++ do_pending_softirq(rq, current); ++ ++ local_irq_enable(); ++} ++ ++#ifndef prepare_arch_switch ++# define prepare_arch_switch(next) do { } while (0) ++#endif ++#ifndef finish_arch_switch ++# define finish_arch_switch(prev) do { } while (0) ++#endif ++#ifndef finish_arch_post_lock_switch ++# define finish_arch_post_lock_switch() do { } while (0) ++#endif ++ ++/** ++ * prepare_task_switch - prepare to switch tasks ++ * @rq: the runqueue preparing to switch ++ * @next: the task we are going to switch to. ++ * ++ * This is called with the rq lock held and interrupts off. It must ++ * be paired with a subsequent finish_task_switch after the context ++ * switch. ++ * ++ * prepare_task_switch sets up locking and calls architecture specific ++ * hooks. ++ */ ++static inline void ++prepare_task_switch(struct rq *rq, struct task_struct *prev, ++ struct task_struct *next) ++{ ++ kcov_prepare_switch(prev); ++ sched_info_switch(rq, prev, next); ++ perf_event_task_sched_out(prev, next); ++ rseq_preempt(prev); ++ fire_sched_out_preempt_notifiers(prev, next); ++ prepare_task(next); ++ prepare_arch_switch(next); ++} ++ ++/** ++ * finish_task_switch - clean up after a task-switch ++ * @rq: runqueue associated with task-switch ++ * @prev: the thread we just switched away from. ++ * ++ * finish_task_switch must be called after the context switch, paired ++ * with a prepare_task_switch call before the context switch. ++ * finish_task_switch will reconcile locking set up by prepare_task_switch, ++ * and do any other architecture-specific cleanup actions. ++ * ++ * Note that we may have delayed dropping an mm in context_switch(). If ++ * so, we finish that here outside of the runqueue lock. (Doing it ++ * with the lock held can cause deadlocks; see schedule() for ++ * details.) ++ * ++ * The context switch have flipped the stack from under us and restored the ++ * local variables which were saved when this task called schedule() in the ++ * past. prev == current is still correct but we need to recalculate this_rq ++ * because prev may have moved to another CPU. ++ */ ++static void finish_task_switch(struct task_struct *prev) ++ __releases(rq->lock) ++{ ++ struct rq *rq = this_rq(); ++ struct mm_struct *mm = rq->prev_mm; ++ long prev_state; ++ ++ /* ++ * The previous task will have left us with a preempt_count of 2 ++ * because it left us after: ++ * ++ * schedule() ++ * preempt_disable(); // 1 ++ * __schedule() ++ * raw_spin_lock_irq(rq->lock) // 2 ++ * ++ * Also, see FORK_PREEMPT_COUNT. ++ */ ++ if (WARN_ONCE(preempt_count() != 2*PREEMPT_DISABLE_OFFSET, ++ "corrupted preempt_count: %s/%d/0x%x\n", ++ current->comm, current->pid, preempt_count())) ++ preempt_count_set(FORK_PREEMPT_COUNT); ++ ++ rq->prev_mm = NULL; ++ ++ /* ++ * A task struct has one reference for the use as "current". ++ * If a task dies, then it sets TASK_DEAD in tsk->state and calls ++ * schedule one last time. The schedule call will never return, and ++ * the scheduled task must drop that reference. ++ * ++ * We must observe prev->state before clearing prev->on_cpu (in ++ * finish_task), otherwise a concurrent wakeup can get prev ++ * running on another CPU and we could rave with its RUNNING -> DEAD ++ * transition, resulting in a double drop. ++ */ ++ prev_state = prev->state; ++ vtime_task_switch(prev); ++ perf_event_task_sched_in(prev, current); ++ finish_task(prev); ++ finish_lock_switch(rq, prev); ++ finish_arch_post_lock_switch(); ++ kcov_finish_switch(current); ++ ++ fire_sched_in_preempt_notifiers(current); ++ /* ++ * When switching through a kernel thread, the loop in ++ * membarrier_{private,global}_expedited() may have observed that ++ * kernel thread and not issued an IPI. It is therefore possible to ++ * schedule between user->kernel->user threads without passing though ++ * switch_mm(). Membarrier requires a barrier after storing to ++ * rq->curr, before returning to userspace, so provide them here: ++ * ++ * - a full memory barrier for {PRIVATE,GLOBAL}_EXPEDITED, implicitly ++ * provided by mmdrop(), ++ * - a sync_core for SYNC_CORE. ++ */ ++ if (mm) { ++ membarrier_mm_sync_core_before_usermode(mm); ++ mmdrop(mm); ++ } ++ if (unlikely(prev_state == TASK_DEAD)) { ++ /* ++ * Remove function-return probe instances associated with this ++ * task and put them back on the free list. ++ */ ++ kprobe_flush_task(prev); ++ ++ /* Task is done with its stack. */ ++ put_task_stack(prev); ++ ++ put_task_struct(prev); ++ } ++} ++ ++/** ++ * schedule_tail - first thing a freshly forked thread must call. ++ * @prev: the thread we just switched away from. ++ */ ++asmlinkage __visible void schedule_tail(struct task_struct *prev) ++{ ++ /* ++ * New tasks start with FORK_PREEMPT_COUNT, see there and ++ * finish_task_switch() for details. ++ * ++ * finish_task_switch() will drop rq->lock() and lower preempt_count ++ * and the preempt_enable() will end up enabling preemption (on ++ * PREEMPT_COUNT kernels). ++ */ ++ ++ finish_task_switch(prev); ++ preempt_enable(); ++ ++ if (current->set_child_tid) ++ put_user(task_pid_vnr(current), current->set_child_tid); ++ ++ calculate_sigpending(); ++} ++ ++/* ++ * context_switch - switch to the new MM and the new thread's register state. ++ */ ++static __always_inline void ++context_switch(struct rq *rq, struct task_struct *prev, ++ struct task_struct *next) ++{ ++ struct mm_struct *mm, *oldmm; ++ ++ prepare_task_switch(rq, prev, next); ++ ++ mm = next->mm; ++ oldmm = prev->active_mm; ++ /* ++ * For paravirt, this is coupled with an exit in switch_to to ++ * combine the page table reload and the switch backend into ++ * one hypercall. ++ */ ++ arch_start_context_switch(prev); ++ ++ /* ++ * If mm is non-NULL, we pass through switch_mm(). If mm is ++ * NULL, we will pass through mmdrop() in finish_task_switch(). ++ * Both of these contain the full memory barrier required by ++ * membarrier after storing to rq->curr, before returning to ++ * user-space. ++ */ ++ if (!mm) { ++ next->active_mm = oldmm; ++ mmgrab(oldmm); ++ enter_lazy_tlb(oldmm, next); ++ } else ++ switch_mm_irqs_off(oldmm, mm, next); ++ ++ if (!prev->mm) { ++ prev->active_mm = NULL; ++ rq->prev_mm = oldmm; ++ } ++ prepare_lock_switch(rq, next); ++ ++ /* Here we just switch the register state and the stack. */ ++ switch_to(prev, next, prev); ++ barrier(); ++ ++ finish_task_switch(prev); ++} ++ ++/* ++ * nr_running, nr_uninterruptible and nr_context_switches: ++ * ++ * externally visible scheduler statistics: current number of runnable ++ * threads, total number of context switches performed since bootup. ++ */ ++unsigned long nr_running(void) ++{ ++ unsigned long i, sum = 0; ++ ++ for_each_online_cpu(i) ++ sum += cpu_rq(i)->nr_running; ++ ++ return sum; ++} ++ ++static unsigned long nr_uninterruptible(void) ++{ ++ unsigned long i, sum = 0; ++ ++ for_each_online_cpu(i) ++ sum += cpu_rq(i)->nr_uninterruptible; ++ ++ return sum; ++} ++ ++/* ++ * Check if only the current task is running on the CPU. ++ * ++ * Caution: this function does not check that the caller has disabled ++ * preemption, thus the result might have a time-of-check-to-time-of-use ++ * race. The caller is responsible to use it correctly, for example: ++ * ++ * - from a non-preemptible section (of course) ++ * ++ * - from a thread that is bound to a single CPU ++ * ++ * - in a loop with very short iterations (e.g. a polling loop) ++ */ ++bool single_task_running(void) ++{ ++ if (rq_load(raw_rq()) == 1) ++ return true; ++ else ++ return false; ++} ++EXPORT_SYMBOL(single_task_running); ++ ++unsigned long long nr_context_switches(void) ++{ ++ int i; ++ unsigned long long sum = 0; ++ ++ for_each_possible_cpu(i) ++ sum += cpu_rq(i)->nr_switches; ++ ++ return sum; ++} ++ ++/* ++ * Consumers of these two interfaces, like for example the cpufreq menu ++ * governor are using nonsensical data. Boosting frequency for a CPU that has ++ * IO-wait which might not even end up running the task when it does become ++ * runnable. ++ */ ++ ++unsigned long nr_iowait_cpu(int cpu) ++{ ++ return atomic_read(&cpu_rq(cpu)->nr_iowait); ++} ++ ++/* ++ * IO-wait accounting, and how its mostly bollocks (on SMP). ++ * ++ * The idea behind IO-wait account is to account the idle time that we could ++ * have spend running if it were not for IO. That is, if we were to improve the ++ * storage performance, we'd have a proportional reduction in IO-wait time. ++ * ++ * This all works nicely on UP, where, when a task blocks on IO, we account ++ * idle time as IO-wait, because if the storage were faster, it could've been ++ * running and we'd not be idle. ++ * ++ * This has been extended to SMP, by doing the same for each CPU. This however ++ * is broken. ++ * ++ * Imagine for instance the case where two tasks block on one CPU, only the one ++ * CPU will have IO-wait accounted, while the other has regular idle. Even ++ * though, if the storage were faster, both could've ran at the same time, ++ * utilising both CPUs. ++ * ++ * This means, that when looking globally, the current IO-wait accounting on ++ * SMP is a lower bound, by reason of under accounting. ++ * ++ * Worse, since the numbers are provided per CPU, they are sometimes ++ * interpreted per CPU, and that is nonsensical. A blocked task isn't strictly ++ * associated with any one particular CPU, it can wake to another CPU than it ++ * blocked on. This means the per CPU IO-wait number is meaningless. ++ * ++ * Task CPU affinities can make all that even more 'interesting'. ++ */ ++ ++unsigned long nr_iowait(void) ++{ ++ unsigned long i, sum = 0; ++ ++ for_each_possible_cpu(i) ++ sum += nr_iowait_cpu(i); ++ ++ return sum; ++} ++ ++unsigned long nr_active(void) ++{ ++ return nr_running() + nr_uninterruptible(); ++} ++ ++/* Variables and functions for calc_load */ ++static unsigned long calc_load_update; ++unsigned long avenrun[3]; ++EXPORT_SYMBOL(avenrun); ++ ++/** ++ * get_avenrun - get the load average array ++ * @loads: pointer to dest load array ++ * @offset: offset to add ++ * @shift: shift count to shift the result left ++ * ++ * These values are estimates at best, so no need for locking. ++ */ ++void get_avenrun(unsigned long *loads, unsigned long offset, int shift) ++{ ++ loads[0] = (avenrun[0] + offset) << shift; ++ loads[1] = (avenrun[1] + offset) << shift; ++ loads[2] = (avenrun[2] + offset) << shift; ++} ++ ++/* ++ * calc_load - update the avenrun load estimates every LOAD_FREQ seconds. ++ */ ++void calc_global_load(unsigned long ticks) ++{ ++ long active; ++ ++ if (time_before(jiffies, READ_ONCE(calc_load_update))) ++ return; ++ active = nr_active() * FIXED_1; ++ ++ avenrun[0] = calc_load(avenrun[0], EXP_1, active); ++ avenrun[1] = calc_load(avenrun[1], EXP_5, active); ++ avenrun[2] = calc_load(avenrun[2], EXP_15, active); ++ ++ calc_load_update = jiffies + LOAD_FREQ; ++} ++ ++/** ++ * fixed_power_int - compute: x^n, in O(log n) time ++ * ++ * @x: base of the power ++ * @frac_bits: fractional bits of @x ++ * @n: power to raise @x to. ++ * ++ * By exploiting the relation between the definition of the natural power ++ * function: x^n := x*x*...*x (x multiplied by itself for n times), and ++ * the binary encoding of numbers used by computers: n := \Sum n_i * 2^i, ++ * (where: n_i \elem {0, 1}, the binary vector representing n), ++ * we find: x^n := x^(\Sum n_i * 2^i) := \Prod x^(n_i * 2^i), which is ++ * of course trivially computable in O(log_2 n), the length of our binary ++ * vector. ++ */ ++static unsigned long ++fixed_power_int(unsigned long x, unsigned int frac_bits, unsigned int n) ++{ ++ unsigned long result = 1UL << frac_bits; ++ ++ if (n) { ++ for (;;) { ++ if (n & 1) { ++ result *= x; ++ result += 1UL << (frac_bits - 1); ++ result >>= frac_bits; ++ } ++ n >>= 1; ++ if (!n) ++ break; ++ x *= x; ++ x += 1UL << (frac_bits - 1); ++ x >>= frac_bits; ++ } ++ } ++ ++ return result; ++} ++ ++/* ++ * a1 = a0 * e + a * (1 - e) ++ * ++ * a2 = a1 * e + a * (1 - e) ++ * = (a0 * e + a * (1 - e)) * e + a * (1 - e) ++ * = a0 * e^2 + a * (1 - e) * (1 + e) ++ * ++ * a3 = a2 * e + a * (1 - e) ++ * = (a0 * e^2 + a * (1 - e) * (1 + e)) * e + a * (1 - e) ++ * = a0 * e^3 + a * (1 - e) * (1 + e + e^2) ++ * ++ * ... ++ * ++ * an = a0 * e^n + a * (1 - e) * (1 + e + ... + e^n-1) [1] ++ * = a0 * e^n + a * (1 - e) * (1 - e^n)/(1 - e) ++ * = a0 * e^n + a * (1 - e^n) ++ * ++ * [1] application of the geometric series: ++ * ++ * n 1 - x^(n+1) ++ * S_n := \Sum x^i = ------------- ++ * i=0 1 - x ++ */ ++unsigned long ++calc_load_n(unsigned long load, unsigned long exp, ++ unsigned long active, unsigned int n) ++{ ++ return calc_load(load, fixed_power_int(exp, FSHIFT, n), active); ++} ++ ++DEFINE_PER_CPU(struct kernel_stat, kstat); ++DEFINE_PER_CPU(struct kernel_cpustat, kernel_cpustat); ++ ++EXPORT_PER_CPU_SYMBOL(kstat); ++EXPORT_PER_CPU_SYMBOL(kernel_cpustat); ++ ++#ifdef CONFIG_PARAVIRT ++static inline u64 steal_ticks(u64 steal) ++{ ++ if (unlikely(steal > NSEC_PER_SEC)) ++ return div_u64(steal, TICK_NSEC); ++ ++ return __iter_div_u64_rem(steal, TICK_NSEC, &steal); ++} ++#endif ++ ++#ifndef nsecs_to_cputime ++# define nsecs_to_cputime(__nsecs) nsecs_to_jiffies(__nsecs) ++#endif ++ ++/* ++ * On each tick, add the number of nanoseconds to the unbanked variables and ++ * once one tick's worth has accumulated, account it allowing for accurate ++ * sub-tick accounting and totals. Use the TICK_APPROX_NS to match the way we ++ * deduct nanoseconds. ++ */ ++static void pc_idle_time(struct rq *rq, struct task_struct *idle, unsigned long ns) ++{ ++ u64 *cpustat = kcpustat_this_cpu->cpustat; ++ unsigned long ticks; ++ ++ if (atomic_read(&rq->nr_iowait) > 0) { ++ rq->iowait_ns += ns; ++ if (rq->iowait_ns >= JIFFY_NS) { ++ ticks = NS_TO_JIFFIES(rq->iowait_ns); ++ cpustat[CPUTIME_IOWAIT] += (__force u64)TICK_APPROX_NS * ticks; ++ rq->iowait_ns %= JIFFY_NS; ++ } ++ } else { ++ rq->idle_ns += ns; ++ if (rq->idle_ns >= JIFFY_NS) { ++ ticks = NS_TO_JIFFIES(rq->idle_ns); ++ cpustat[CPUTIME_IDLE] += (__force u64)TICK_APPROX_NS * ticks; ++ rq->idle_ns %= JIFFY_NS; ++ } ++ } ++ acct_update_integrals(idle); ++} ++ ++static void pc_system_time(struct rq *rq, struct task_struct *p, ++ int hardirq_offset, unsigned long ns) ++{ ++ u64 *cpustat = kcpustat_this_cpu->cpustat; ++ unsigned long ticks; ++ ++ p->stime_ns += ns; ++ if (p->stime_ns >= JIFFY_NS) { ++ ticks = NS_TO_JIFFIES(p->stime_ns); ++ p->stime_ns %= JIFFY_NS; ++ p->stime += (__force u64)TICK_APPROX_NS * ticks; ++ account_group_system_time(p, TICK_APPROX_NS * ticks); ++ } ++ p->sched_time += ns; ++ account_group_exec_runtime(p, ns); ++ ++ if (hardirq_count() - hardirq_offset) { ++ rq->irq_ns += ns; ++ if (rq->irq_ns >= JIFFY_NS) { ++ ticks = NS_TO_JIFFIES(rq->irq_ns); ++ cpustat[CPUTIME_IRQ] += (__force u64)TICK_APPROX_NS * ticks; ++ rq->irq_ns %= JIFFY_NS; ++ } ++ } else if (in_serving_softirq()) { ++ rq->softirq_ns += ns; ++ if (rq->softirq_ns >= JIFFY_NS) { ++ ticks = NS_TO_JIFFIES(rq->softirq_ns); ++ cpustat[CPUTIME_SOFTIRQ] += (__force u64)TICK_APPROX_NS * ticks; ++ rq->softirq_ns %= JIFFY_NS; ++ } ++ } else { ++ rq->system_ns += ns; ++ if (rq->system_ns >= JIFFY_NS) { ++ ticks = NS_TO_JIFFIES(rq->system_ns); ++ cpustat[CPUTIME_SYSTEM] += (__force u64)TICK_APPROX_NS * ticks; ++ rq->system_ns %= JIFFY_NS; ++ } ++ } ++ acct_update_integrals(p); ++} ++ ++static void pc_user_time(struct rq *rq, struct task_struct *p, unsigned long ns) ++{ ++ u64 *cpustat = kcpustat_this_cpu->cpustat; ++ unsigned long ticks; ++ ++ p->utime_ns += ns; ++ if (p->utime_ns >= JIFFY_NS) { ++ ticks = NS_TO_JIFFIES(p->utime_ns); ++ p->utime_ns %= JIFFY_NS; ++ p->utime += (__force u64)TICK_APPROX_NS * ticks; ++ account_group_user_time(p, TICK_APPROX_NS * ticks); ++ } ++ p->sched_time += ns; ++ account_group_exec_runtime(p, ns); ++ ++ if (this_cpu_ksoftirqd() == p) { ++ /* ++ * ksoftirqd time do not get accounted in cpu_softirq_time. ++ * So, we have to handle it separately here. ++ */ ++ rq->softirq_ns += ns; ++ if (rq->softirq_ns >= JIFFY_NS) { ++ ticks = NS_TO_JIFFIES(rq->softirq_ns); ++ cpustat[CPUTIME_SOFTIRQ] += (__force u64)TICK_APPROX_NS * ticks; ++ rq->softirq_ns %= JIFFY_NS; ++ } ++ } ++ ++ if (task_nice(p) > 0 || idleprio_task(p)) { ++ rq->nice_ns += ns; ++ if (rq->nice_ns >= JIFFY_NS) { ++ ticks = NS_TO_JIFFIES(rq->nice_ns); ++ cpustat[CPUTIME_NICE] += (__force u64)TICK_APPROX_NS * ticks; ++ rq->nice_ns %= JIFFY_NS; ++ } ++ } else { ++ rq->user_ns += ns; ++ if (rq->user_ns >= JIFFY_NS) { ++ ticks = NS_TO_JIFFIES(rq->user_ns); ++ cpustat[CPUTIME_USER] += (__force u64)TICK_APPROX_NS * ticks; ++ rq->user_ns %= JIFFY_NS; ++ } ++ } ++ acct_update_integrals(p); ++} ++ ++/* ++ * This is called on clock ticks. ++ * Bank in p->sched_time the ns elapsed since the last tick or switch. ++ * CPU scheduler quota accounting is also performed here in microseconds. ++ */ ++static void update_cpu_clock_tick(struct rq *rq, struct task_struct *p) ++{ ++ s64 account_ns = rq->niffies - p->last_ran; ++ struct task_struct *idle = rq->idle; ++ ++ /* Accurate tick timekeeping */ ++ if (user_mode(get_irq_regs())) ++ pc_user_time(rq, p, account_ns); ++ else if (p != idle || (irq_count() != HARDIRQ_OFFSET)) { ++ pc_system_time(rq, p, HARDIRQ_OFFSET, account_ns); ++ } else ++ pc_idle_time(rq, idle, account_ns); ++ ++ /* time_slice accounting is done in usecs to avoid overflow on 32bit */ ++ if (p->policy != SCHED_FIFO && p != idle) ++ p->time_slice -= NS_TO_US(account_ns); ++ ++ p->last_ran = rq->niffies; ++} ++ ++/* ++ * This is called on context switches. ++ * Bank in p->sched_time the ns elapsed since the last tick or switch. ++ * CPU scheduler quota accounting is also performed here in microseconds. ++ */ ++static void update_cpu_clock_switch(struct rq *rq, struct task_struct *p) ++{ ++ s64 account_ns = rq->niffies - p->last_ran; ++ struct task_struct *idle = rq->idle; ++ ++ /* Accurate subtick timekeeping */ ++ if (p != idle) ++ pc_user_time(rq, p, account_ns); ++ else ++ pc_idle_time(rq, idle, account_ns); ++ ++ /* time_slice accounting is done in usecs to avoid overflow on 32bit */ ++ if (p->policy != SCHED_FIFO && p != idle) ++ p->time_slice -= NS_TO_US(account_ns); ++} ++ ++/* ++ * Return any ns on the sched_clock that have not yet been accounted in ++ * @p in case that task is currently running. ++ * ++ * Called with task_rq_lock(p) held. ++ */ ++static inline u64 do_task_delta_exec(struct task_struct *p, struct rq *rq) ++{ ++ u64 ns = 0; ++ ++ /* ++ * Must be ->curr _and_ ->on_rq. If dequeued, we would ++ * project cycles that may never be accounted to this ++ * thread, breaking clock_gettime(). ++ */ ++ if (p == rq->curr && task_on_rq_queued(p)) { ++ update_clocks(rq); ++ ns = rq->niffies - p->last_ran; ++ } ++ ++ return ns; ++} ++ ++/* ++ * Return accounted runtime for the task. ++ * Return separately the current's pending runtime that have not been ++ * accounted yet. ++ * ++ */ ++unsigned long long task_sched_runtime(struct task_struct *p) ++{ ++ struct rq_flags rf; ++ struct rq *rq; ++ u64 ns; ++ ++#if defined(CONFIG_64BIT) && defined(CONFIG_SMP) ++ /* ++ * 64-bit doesn't need locks to atomically read a 64-bit value. ++ * So we have a optimisation chance when the task's delta_exec is 0. ++ * Reading ->on_cpu is racy, but this is ok. ++ * ++ * If we race with it leaving CPU, we'll take a lock. So we're correct. ++ * If we race with it entering CPU, unaccounted time is 0. This is ++ * indistinguishable from the read occurring a few cycles earlier. ++ * If we see ->on_cpu without ->on_rq, the task is leaving, and has ++ * been accounted, so we're correct here as well. ++ */ ++ if (!p->on_cpu || !task_on_rq_queued(p)) ++ return tsk_seruntime(p); ++#endif ++ ++ rq = task_rq_lock(p, &rf); ++ ns = p->sched_time + do_task_delta_exec(p, rq); ++ task_rq_unlock(rq, p, &rf); ++ ++ return ns; ++} ++ ++/* ++ * Functions to test for when SCHED_ISO tasks have used their allocated ++ * quota as real time scheduling and convert them back to SCHED_NORMAL. All ++ * data is modified only by the local runqueue during scheduler_tick with ++ * interrupts disabled. ++ */ ++ ++/* ++ * Test if SCHED_ISO tasks have run longer than their alloted period as RT ++ * tasks and set the refractory flag if necessary. There is 10% hysteresis ++ * for unsetting the flag. 115/128 is ~90/100 as a fast shift instead of a ++ * slow division. ++ */ ++static inline void iso_tick(struct rq *rq) ++{ ++ rq->iso_ticks = rq->iso_ticks * (ISO_PERIOD - 1) / ISO_PERIOD; ++ rq->iso_ticks += 100; ++ if (rq->iso_ticks > ISO_PERIOD * sched_iso_cpu) { ++ rq->iso_refractory = true; ++ if (unlikely(rq->iso_ticks > ISO_PERIOD * 100)) ++ rq->iso_ticks = ISO_PERIOD * 100; ++ } ++} ++ ++/* No SCHED_ISO task was running so decrease rq->iso_ticks */ ++static inline void no_iso_tick(struct rq *rq, int ticks) ++{ ++ if (rq->iso_ticks > 0 || rq->iso_refractory) { ++ rq->iso_ticks = rq->iso_ticks * (ISO_PERIOD - ticks) / ISO_PERIOD; ++ if (rq->iso_ticks < ISO_PERIOD * (sched_iso_cpu * 115 / 128)) { ++ rq->iso_refractory = false; ++ if (unlikely(rq->iso_ticks < 0)) ++ rq->iso_ticks = 0; ++ } ++ } ++} ++ ++/* This manages tasks that have run out of timeslice during a scheduler_tick */ ++static void task_running_tick(struct rq *rq) ++{ ++ struct task_struct *p = rq->curr; ++ ++ /* ++ * If a SCHED_ISO task is running we increment the iso_ticks. In ++ * order to prevent SCHED_ISO tasks from causing starvation in the ++ * presence of true RT tasks we account those as iso_ticks as well. ++ */ ++ if (rt_task(p) || task_running_iso(p)) ++ iso_tick(rq); ++ else ++ no_iso_tick(rq, 1); ++ ++ /* SCHED_FIFO tasks never run out of timeslice. */ ++ if (p->policy == SCHED_FIFO) ++ return; ++ ++ if (iso_task(p)) { ++ if (task_running_iso(p)) { ++ if (rq->iso_refractory) { ++ /* ++ * SCHED_ISO task is running as RT and limit ++ * has been hit. Force it to reschedule as ++ * SCHED_NORMAL by zeroing its time_slice ++ */ ++ p->time_slice = 0; ++ } ++ } else if (!rq->iso_refractory) { ++ /* Can now run again ISO. Reschedule to pick up prio */ ++ goto out_resched; ++ } ++ } ++ ++ /* ++ * Tasks that were scheduled in the first half of a tick are not ++ * allowed to run into the 2nd half of the next tick if they will ++ * run out of time slice in the interim. Otherwise, if they have ++ * less than RESCHED_US μs of time slice left they will be rescheduled. ++ * Dither is used as a backup for when hrexpiry is disabled or high res ++ * timers not configured in. ++ */ ++ if (p->time_slice - rq->dither >= RESCHED_US) ++ return; ++out_resched: ++ rq_lock(rq); ++ __set_tsk_resched(p); ++ rq_unlock(rq); ++} ++ ++static inline void task_tick(struct rq *rq) ++{ ++ if (!rq_idle(rq)) ++ task_running_tick(rq); ++ else if (rq->last_jiffy > rq->last_scheduler_tick) ++ no_iso_tick(rq, rq->last_jiffy - rq->last_scheduler_tick); ++} ++ ++#ifdef CONFIG_NO_HZ_FULL ++/* ++ * We can stop the timer tick any time highres timers are active since ++ * we rely entirely on highres timeouts for task expiry rescheduling. ++ */ ++static void sched_stop_tick(struct rq *rq, int cpu) ++{ ++ if (!hrexpiry_enabled(rq)) ++ return; ++ if (!tick_nohz_full_enabled()) ++ return; ++ if (!tick_nohz_full_cpu(cpu)) ++ return; ++ tick_nohz_dep_clear_cpu(cpu, TICK_DEP_BIT_SCHED); ++} ++ ++static inline void sched_start_tick(struct rq *rq, int cpu) ++{ ++ tick_nohz_dep_set_cpu(cpu, TICK_DEP_BIT_SCHED); ++} ++ ++struct tick_work { ++ int cpu; ++ struct delayed_work work; ++}; ++ ++static struct tick_work __percpu *tick_work_cpu; ++ ++static void sched_tick_remote(struct work_struct *work) ++{ ++ struct delayed_work *dwork = to_delayed_work(work); ++ struct tick_work *twork = container_of(dwork, struct tick_work, work); ++ int cpu = twork->cpu; ++ struct rq *rq = cpu_rq(cpu); ++ struct task_struct *curr; ++ u64 delta; ++ ++ /* ++ * Handle the tick only if it appears the remote CPU is running in full ++ * dynticks mode. The check is racy by nature, but missing a tick or ++ * having one too much is no big deal because the scheduler tick updates ++ * statistics and checks timeslices in a time-independent way, regardless ++ * of when exactly it is running. ++ */ ++ if (idle_cpu(cpu) || !tick_nohz_tick_stopped_cpu(cpu)) ++ goto out_requeue; ++ ++ rq_lock_irq(rq); ++ curr = rq->curr; ++ if (is_idle_task(curr)) ++ goto out_unlock; ++ ++ update_rq_clock(rq); ++ delta = rq_clock_task(rq) - curr->last_ran; ++ ++ /* ++ * Make sure the next tick runs within a reasonable ++ * amount of time. ++ */ ++ WARN_ON_ONCE(delta > (u64)NSEC_PER_SEC * 3); ++ task_tick(rq); ++ ++out_unlock: ++ rq_unlock_irq(rq, NULL); ++ ++out_requeue: ++ /* ++ * Run the remote tick once per second (1Hz). This arbitrary ++ * frequency is large enough to avoid overload but short enough ++ * to keep scheduler internal stats reasonably up to date. ++ */ ++ queue_delayed_work(system_unbound_wq, dwork, HZ); ++} ++ ++static void sched_tick_start(int cpu) ++{ ++ struct tick_work *twork; ++ ++ if (housekeeping_cpu(cpu, HK_FLAG_TICK)) ++ return; ++ ++ WARN_ON_ONCE(!tick_work_cpu); ++ ++ twork = per_cpu_ptr(tick_work_cpu, cpu); ++ twork->cpu = cpu; ++ INIT_DELAYED_WORK(&twork->work, sched_tick_remote); ++ queue_delayed_work(system_unbound_wq, &twork->work, HZ); ++} ++ ++#ifdef CONFIG_HOTPLUG_CPU ++static void sched_tick_stop(int cpu) ++{ ++ struct tick_work *twork; ++ ++ if (housekeeping_cpu(cpu, HK_FLAG_TICK)) ++ return; ++ ++ WARN_ON_ONCE(!tick_work_cpu); ++ ++ twork = per_cpu_ptr(tick_work_cpu, cpu); ++ cancel_delayed_work_sync(&twork->work); ++} ++#endif /* CONFIG_HOTPLUG_CPU */ ++ ++int __init sched_tick_offload_init(void) ++{ ++ tick_work_cpu = alloc_percpu(struct tick_work); ++ BUG_ON(!tick_work_cpu); ++ ++ return 0; ++} ++ ++#else /* !CONFIG_NO_HZ_FULL */ ++static inline void sched_stop_tick(struct rq *rq, int cpu) {} ++static inline void sched_start_tick(struct rq *rq, int cpu) {} ++static inline void sched_tick_start(int cpu) { } ++static inline void sched_tick_stop(int cpu) { } ++#endif ++ ++/* ++ * This function gets called by the timer code, with HZ frequency. ++ * We call it with interrupts disabled. ++ */ ++void scheduler_tick(void) ++{ ++ int cpu __maybe_unused = smp_processor_id(); ++ struct rq *rq = cpu_rq(cpu); ++ ++ sched_clock_tick(); ++ update_clocks(rq); ++ update_load_avg(rq, 0); ++ update_cpu_clock_tick(rq, rq->curr); ++ task_tick(rq); ++ rq->last_scheduler_tick = rq->last_jiffy; ++ rq->last_tick = rq->clock; ++ psi_task_tick(rq); ++ perf_event_task_tick(); ++ sched_stop_tick(rq, cpu); ++} ++ ++#if defined(CONFIG_PREEMPT) && (defined(CONFIG_DEBUG_PREEMPT) || \ ++ defined(CONFIG_TRACE_PREEMPT_TOGGLE)) ++/* ++ * If the value passed in is equal to the current preempt count ++ * then we just disabled preemption. Start timing the latency. ++ */ ++static inline void preempt_latency_start(int val) ++{ ++ if (preempt_count() == val) { ++ unsigned long ip = get_lock_parent_ip(); ++#ifdef CONFIG_DEBUG_PREEMPT ++ current->preempt_disable_ip = ip; ++#endif ++ trace_preempt_off(CALLER_ADDR0, ip); ++ } ++} ++ ++void preempt_count_add(int val) ++{ ++#ifdef CONFIG_DEBUG_PREEMPT ++ /* ++ * Underflow? ++ */ ++ if (DEBUG_LOCKS_WARN_ON((preempt_count() < 0))) ++ return; ++#endif ++ __preempt_count_add(val); ++#ifdef CONFIG_DEBUG_PREEMPT ++ /* ++ * Spinlock count overflowing soon? ++ */ ++ DEBUG_LOCKS_WARN_ON((preempt_count() & PREEMPT_MASK) >= ++ PREEMPT_MASK - 10); ++#endif ++ preempt_latency_start(val); ++} ++EXPORT_SYMBOL(preempt_count_add); ++NOKPROBE_SYMBOL(preempt_count_add); ++ ++/* ++ * If the value passed in equals to the current preempt count ++ * then we just enabled preemption. Stop timing the latency. ++ */ ++static inline void preempt_latency_stop(int val) ++{ ++ if (preempt_count() == val) ++ trace_preempt_on(CALLER_ADDR0, get_lock_parent_ip()); ++} ++ ++void preempt_count_sub(int val) ++{ ++#ifdef CONFIG_DEBUG_PREEMPT ++ /* ++ * Underflow? ++ */ ++ if (DEBUG_LOCKS_WARN_ON(val > preempt_count())) ++ return; ++ /* ++ * Is the spinlock portion underflowing? ++ */ ++ if (DEBUG_LOCKS_WARN_ON((val < PREEMPT_MASK) && ++ !(preempt_count() & PREEMPT_MASK))) ++ return; ++#endif ++ ++ preempt_latency_stop(val); ++ __preempt_count_sub(val); ++} ++EXPORT_SYMBOL(preempt_count_sub); ++NOKPROBE_SYMBOL(preempt_count_sub); ++ ++#else ++static inline void preempt_latency_start(int val) { } ++static inline void preempt_latency_stop(int val) { } ++#endif ++ ++static inline unsigned long get_preempt_disable_ip(struct task_struct *p) ++{ ++#ifdef CONFIG_DEBUG_PREEMPT ++ return p->preempt_disable_ip; ++#else ++ return 0; ++#endif ++} ++ ++/* ++ * The time_slice is only refilled when it is empty and that is when we set a ++ * new deadline. Make sure update_clocks has been called recently to update ++ * rq->niffies. ++ */ ++static void time_slice_expired(struct task_struct *p, struct rq *rq) ++{ ++ p->time_slice = timeslice(); ++ p->deadline = rq->niffies + task_deadline_diff(p); ++#ifdef CONFIG_SMT_NICE ++ if (!p->mm) ++ p->smt_bias = 0; ++ else if (rt_task(p)) ++ p->smt_bias = 1 << 30; ++ else if (task_running_iso(p)) ++ p->smt_bias = 1 << 29; ++ else if (idleprio_task(p)) { ++ if (task_running_idle(p)) ++ p->smt_bias = 0; ++ else ++ p->smt_bias = 1; ++ } else if (--p->smt_bias < 1) ++ p->smt_bias = MAX_PRIO - p->static_prio; ++#endif ++} ++ ++/* ++ * Timeslices below RESCHED_US are considered as good as expired as there's no ++ * point rescheduling when there's so little time left. SCHED_BATCH tasks ++ * have been flagged be not latency sensitive and likely to be fully CPU ++ * bound so every time they're rescheduled they have their time_slice ++ * refilled, but get a new later deadline to have little effect on ++ * SCHED_NORMAL tasks. ++ ++ */ ++static inline void check_deadline(struct task_struct *p, struct rq *rq) ++{ ++ if (p->time_slice < RESCHED_US || batch_task(p)) ++ time_slice_expired(p, rq); ++} ++ ++/* ++ * Task selection with skiplists is a simple matter of picking off the first ++ * task in the sorted list, an O(1) operation. The lookup is amortised O(1) ++ * being bound to the number of processors. ++ * ++ * Runqueues are selectively locked based on their unlocked data and then ++ * unlocked if not needed. At most 3 locks will be held at any time and are ++ * released as soon as they're no longer needed. All balancing between CPUs ++ * is thus done here in an extremely simple first come best fit manner. ++ * ++ * This iterates over runqueues in cache locality order. In interactive mode ++ * it iterates over all CPUs and finds the task with the best key/deadline. ++ * In non-interactive mode it will only take a task if it's from the current ++ * runqueue or a runqueue with more tasks than the current one with a better ++ * key/deadline. ++ */ ++#ifdef CONFIG_SMP ++static inline struct task_struct ++*earliest_deadline_task(struct rq *rq, int cpu, struct task_struct *idle) ++{ ++ struct rq *locked = NULL, *chosen = NULL; ++ struct task_struct *edt = idle; ++ int i, best_entries = 0; ++ u64 best_key = ~0ULL; ++ ++ for (i = 0; i < total_runqueues; i++) { ++ struct rq *other_rq = rq_order(rq, i); ++ skiplist_node *next; ++ int entries; ++ ++ entries = other_rq->sl->entries; ++ /* ++ * Check for queued entres lockless first. The local runqueue ++ * is locked so entries will always be accurate. ++ */ ++ if (!sched_interactive) { ++ /* ++ * Don't reschedule balance across nodes unless the CPU ++ * is idle. ++ */ ++ if (edt != idle && rq->cpu_locality[other_rq->cpu] > 3) ++ break; ++ if (entries <= best_entries) ++ continue; ++ } else if (!entries) ++ continue; ++ ++ /* if (i) implies other_rq != rq */ ++ if (i) { ++ /* Check for best id queued lockless first */ ++ if (other_rq->best_key >= best_key) ++ continue; ++ ++ if (unlikely(!trylock_rq(rq, other_rq))) ++ continue; ++ ++ /* Need to reevaluate entries after locking */ ++ entries = other_rq->sl->entries; ++ if (unlikely(!entries)) { ++ unlock_rq(other_rq); ++ continue; ++ } ++ } ++ ++ next = other_rq->node; ++ /* ++ * In interactive mode we check beyond the best entry on other ++ * runqueues if we can't get the best for smt or affinity ++ * reasons. ++ */ ++ while ((next = next->next[0]) != other_rq->node) { ++ struct task_struct *p; ++ u64 key = next->key; ++ ++ /* Reevaluate key after locking */ ++ if (key >= best_key) ++ break; ++ ++ p = next->value; ++ if (!smt_schedule(p, rq)) { ++ if (i && !sched_interactive) ++ break; ++ continue; ++ } ++ ++ if (sched_other_cpu(p, cpu)) { ++ if (sched_interactive || !i) ++ continue; ++ break; ++ } ++ /* Make sure affinity is ok */ ++ if (i) { ++ /* From this point on p is the best so far */ ++ if (locked) ++ unlock_rq(locked); ++ chosen = locked = other_rq; ++ } ++ best_entries = entries; ++ best_key = key; ++ edt = p; ++ break; ++ } ++ /* rq->preempting is a hint only as the state may have changed ++ * since it was set with the resched call but if we have met ++ * the condition we can break out here. */ ++ if (edt == rq->preempting) ++ break; ++ if (i && other_rq != chosen) ++ unlock_rq(other_rq); ++ } ++ ++ if (likely(edt != idle)) ++ take_task(rq, cpu, edt); ++ ++ if (locked) ++ unlock_rq(locked); ++ ++ rq->preempting = NULL; ++ ++ return edt; ++} ++#else /* CONFIG_SMP */ ++static inline struct task_struct ++*earliest_deadline_task(struct rq *rq, int cpu, struct task_struct *idle) ++{ ++ struct task_struct *edt; ++ ++ if (unlikely(!rq->sl->entries)) ++ return idle; ++ edt = rq->node->next[0]->value; ++ take_task(rq, cpu, edt); ++ return edt; ++} ++#endif /* CONFIG_SMP */ ++ ++/* ++ * Print scheduling while atomic bug: ++ */ ++static noinline void __schedule_bug(struct task_struct *prev) ++{ ++ /* Save this before calling printk(), since that will clobber it */ ++ unsigned long preempt_disable_ip = get_preempt_disable_ip(current); ++ ++ if (oops_in_progress) ++ return; ++ ++ printk(KERN_ERR "BUG: scheduling while atomic: %s/%d/0x%08x\n", ++ prev->comm, prev->pid, preempt_count()); ++ ++ debug_show_held_locks(prev); ++ print_modules(); ++ if (irqs_disabled()) ++ print_irqtrace_events(prev); ++ if (IS_ENABLED(CONFIG_DEBUG_PREEMPT) ++ && in_atomic_preempt_off()) { ++ pr_err("Preemption disabled at:"); ++ print_ip_sym(preempt_disable_ip); ++ pr_cont("\n"); ++ } ++ dump_stack(); ++ add_taint(TAINT_WARN, LOCKDEP_STILL_OK); ++} ++ ++/* ++ * Various schedule()-time debugging checks and statistics: ++ */ ++static inline void schedule_debug(struct task_struct *prev) ++{ ++#ifdef CONFIG_SCHED_STACK_END_CHECK ++ if (task_stack_end_corrupted(prev)) ++ panic("corrupted stack end detected inside scheduler\n"); ++#endif ++ ++ if (unlikely(in_atomic_preempt_off())) { ++ __schedule_bug(prev); ++ preempt_count_set(PREEMPT_DISABLED); ++ } ++ rcu_sleep_check(); ++ ++ profile_hit(SCHED_PROFILING, __builtin_return_address(0)); ++ ++ schedstat_inc(this_rq()->sched_count); ++} ++ ++/* ++ * The currently running task's information is all stored in rq local data ++ * which is only modified by the local CPU. ++ */ ++static inline void set_rq_task(struct rq *rq, struct task_struct *p) ++{ ++ if (p == rq->idle || p->policy == SCHED_FIFO) ++ hrexpiry_clear(rq); ++ else ++ hrexpiry_start(rq, US_TO_NS(p->time_slice)); ++ if (rq->clock - rq->last_tick > HALF_JIFFY_NS) ++ rq->dither = 0; ++ else ++ rq->dither = rq_dither(rq); ++ ++ rq->rq_deadline = p->deadline; ++ rq->rq_prio = p->prio; ++#ifdef CONFIG_SMT_NICE ++ rq->rq_mm = p->mm; ++ rq->rq_smt_bias = p->smt_bias; ++#endif ++} ++ ++#ifdef CONFIG_SMT_NICE ++static void check_no_siblings(struct rq __maybe_unused *this_rq) {} ++static void wake_no_siblings(struct rq __maybe_unused *this_rq) {} ++static void (*check_siblings)(struct rq *this_rq) = &check_no_siblings; ++static void (*wake_siblings)(struct rq *this_rq) = &wake_no_siblings; ++ ++/* Iterate over smt siblings when we've scheduled a process on cpu and decide ++ * whether they should continue running or be descheduled. */ ++static void check_smt_siblings(struct rq *this_rq) ++{ ++ int other_cpu; ++ ++ for_each_cpu(other_cpu, &this_rq->thread_mask) { ++ struct task_struct *p; ++ struct rq *rq; ++ ++ rq = cpu_rq(other_cpu); ++ if (rq_idle(rq)) ++ continue; ++ p = rq->curr; ++ if (!smt_schedule(p, this_rq)) ++ resched_curr(rq); ++ } ++} ++ ++static void wake_smt_siblings(struct rq *this_rq) ++{ ++ int other_cpu; ++ ++ for_each_cpu(other_cpu, &this_rq->thread_mask) { ++ struct rq *rq; ++ ++ rq = cpu_rq(other_cpu); ++ if (rq_idle(rq)) ++ resched_idle(rq); ++ } ++} ++#else ++static void check_siblings(struct rq __maybe_unused *this_rq) {} ++static void wake_siblings(struct rq __maybe_unused *this_rq) {} ++#endif ++ ++/* ++ * schedule() is the main scheduler function. ++ * ++ * The main means of driving the scheduler and thus entering this function are: ++ * ++ * 1. Explicit blocking: mutex, semaphore, waitqueue, etc. ++ * ++ * 2. TIF_NEED_RESCHED flag is checked on interrupt and userspace return ++ * paths. For example, see arch/x86/entry_64.S. ++ * ++ * To drive preemption between tasks, the scheduler sets the flag in timer ++ * interrupt handler scheduler_tick(). ++ * ++ * 3. Wakeups don't really cause entry into schedule(). They add a ++ * task to the run-queue and that's it. ++ * ++ * Now, if the new task added to the run-queue preempts the current ++ * task, then the wakeup sets TIF_NEED_RESCHED and schedule() gets ++ * called on the nearest possible occasion: ++ * ++ * - If the kernel is preemptible (CONFIG_PREEMPT=y): ++ * ++ * - in syscall or exception context, at the next outmost ++ * preempt_enable(). (this might be as soon as the wake_up()'s ++ * spin_unlock()!) ++ * ++ * - in IRQ context, return from interrupt-handler to ++ * preemptible context ++ * ++ * - If the kernel is not preemptible (CONFIG_PREEMPT is not set) ++ * then at the next: ++ * ++ * - cond_resched() call ++ * - explicit schedule() call ++ * - return from syscall or exception to user-space ++ * - return from interrupt-handler to user-space ++ * ++ * WARNING: must be called with preemption disabled! ++ */ ++static void __sched notrace __schedule(bool preempt) ++{ ++ struct task_struct *prev, *next, *idle; ++ unsigned long *switch_count; ++ bool deactivate = false; ++ struct rq *rq; ++ u64 niffies; ++ int cpu; ++ ++ cpu = smp_processor_id(); ++ rq = cpu_rq(cpu); ++ prev = rq->curr; ++ idle = rq->idle; ++ ++ schedule_debug(prev); ++ ++ local_irq_disable(); ++ rcu_note_context_switch(preempt); ++ ++ /* ++ * Make sure that signal_pending_state()->signal_pending() below ++ * can't be reordered with __set_current_state(TASK_INTERRUPTIBLE) ++ * done by the caller to avoid the race with signal_wake_up(). ++ * ++ * The membarrier system call requires a full memory barrier ++ * after coming from user-space, before storing to rq->curr. ++ */ ++ rq_lock(rq); ++ smp_mb__after_spinlock(); ++#ifdef CONFIG_SMP ++ if (rq->preempt) { ++ /* ++ * Make sure resched_curr hasn't triggered a preemption ++ * locklessly on a task that has since scheduled away. Spurious ++ * wakeup of idle is okay though. ++ */ ++ if (unlikely(preempt && prev != idle && !test_tsk_need_resched(prev))) { ++ rq->preempt = NULL; ++ clear_preempt_need_resched(); ++ rq_unlock_irq(rq, NULL); ++ return; ++ } ++ rq->preempt = NULL; ++ } ++#endif ++ ++ switch_count = &prev->nivcsw; ++ if (!preempt && prev->state) { ++ if (signal_pending_state(prev->state, prev)) { ++ prev->state = TASK_RUNNING; ++ } else { ++ deactivate = true; ++ ++ if (prev->in_iowait) { ++ atomic_inc(&rq->nr_iowait); ++ delayacct_blkio_start(); ++ } ++ } ++ switch_count = &prev->nvcsw; ++ } ++ ++ /* ++ * Store the niffy value here for use by the next task's last_ran ++ * below to avoid losing niffies due to update_clocks being called ++ * again after this point. ++ */ ++ update_clocks(rq); ++ niffies = rq->niffies; ++ update_cpu_clock_switch(rq, prev); ++ ++ clear_tsk_need_resched(prev); ++ clear_preempt_need_resched(); ++ ++ if (idle != prev) { ++ check_deadline(prev, rq); ++ return_task(prev, rq, cpu, deactivate); ++ } ++ ++ next = earliest_deadline_task(rq, cpu, idle); ++ if (likely(next->prio != PRIO_LIMIT)) ++ clear_cpuidle_map(cpu); ++ else { ++ set_cpuidle_map(cpu); ++ update_load_avg(rq, 0); ++ } ++ ++ set_rq_task(rq, next); ++ next->last_ran = niffies; ++ ++ if (likely(prev != next)) { ++ /* ++ * Don't reschedule an idle task or deactivated tasks ++ */ ++ if (prev == idle) { ++ rq->nr_running++; ++ if (rt_task(next)) ++ rq->rt_nr_running++; ++ } else if (!deactivate) ++ resched_suitable_idle(prev); ++ if (unlikely(next == idle)) { ++ rq->nr_running--; ++ if (rt_task(prev)) ++ rq->rt_nr_running--; ++ wake_siblings(rq); ++ } else ++ check_siblings(rq); ++ rq->nr_switches++; ++ rq->curr = next; ++ /* ++ * The membarrier system call requires each architecture ++ * to have a full memory barrier after updating ++ * rq->curr, before returning to user-space. ++ * ++ * Here are the schemes providing that barrier on the ++ * various architectures: ++ * - mm ? switch_mm() : mmdrop() for x86, s390, sparc, PowerPC. ++ * switch_mm() rely on membarrier_arch_switch_mm() on PowerPC. ++ * - finish_lock_switch() for weakly-ordered ++ * architectures where spin_unlock is a full barrier, ++ * - switch_to() for arm64 (weakly-ordered, spin_unlock ++ * is a RELEASE barrier), ++ */ ++ ++*switch_count; ++ ++ trace_sched_switch(preempt, prev, next); ++ context_switch(rq, prev, next); /* unlocks the rq */ ++ } else { ++ check_siblings(rq); ++ rq_unlock(rq); ++ do_pending_softirq(rq, next); ++ local_irq_enable(); ++ } ++} ++ ++void __noreturn do_task_dead(void) ++{ ++ /* Causes final put_task_struct in finish_task_switch(). */ ++ set_special_state(TASK_DEAD); ++ ++ /* Tell freezer to ignore us: */ ++ current->flags |= PF_NOFREEZE; ++ __schedule(false); ++ BUG(); ++ ++ /* Avoid "noreturn function does return" - but don't continue if BUG() is a NOP: */ ++ for (;;) ++ cpu_relax(); ++} ++ ++static inline void sched_submit_work(struct task_struct *tsk) ++{ ++ if (!tsk->state || tsk_is_pi_blocked(tsk)) ++ return; ++ ++ /* ++ * If a worker went to sleep, notify and ask workqueue whether ++ * it wants to wake up a task to maintain concurrency. ++ * As this function is called inside the schedule() context, ++ * we disable preemption to avoid it calling schedule() again ++ * in the possible wakeup of a kworker. ++ */ ++ if (tsk->flags & PF_WQ_WORKER) { ++ preempt_disable(); ++ wq_worker_sleeping(tsk); ++ preempt_enable_no_resched(); ++ } ++ ++ /* ++ * If we are going to sleep and we have plugged IO queued, ++ * make sure to submit it to avoid deadlocks. ++ */ ++ if (blk_needs_flush_plug(tsk)) ++ blk_schedule_flush_plug(tsk); ++} ++ ++static inline void sched_update_worker(struct task_struct *tsk) ++{ ++ if (tsk->flags & PF_WQ_WORKER) ++ wq_worker_running(tsk); ++} ++ ++asmlinkage __visible void __sched schedule(void) ++{ ++ struct task_struct *tsk = current; ++ ++ sched_submit_work(tsk); ++ do { ++ preempt_disable(); ++ __schedule(false); ++ sched_preempt_enable_no_resched(); ++ } while (need_resched()); ++ sched_update_worker(tsk); ++} ++ ++EXPORT_SYMBOL(schedule); ++ ++/* ++ * synchronize_rcu_tasks() makes sure that no task is stuck in preempted ++ * state (have scheduled out non-voluntarily) by making sure that all ++ * tasks have either left the run queue or have gone into user space. ++ * As idle tasks do not do either, they must not ever be preempted ++ * (schedule out non-voluntarily). ++ * ++ * schedule_idle() is similar to schedule_preempt_disable() except that it ++ * never enables preemption because it does not call sched_submit_work(). ++ */ ++void __sched schedule_idle(void) ++{ ++ /* ++ * As this skips calling sched_submit_work(), which the idle task does ++ * regardless because that function is a nop when the task is in a ++ * TASK_RUNNING state, make sure this isn't used someplace that the ++ * current task can be in any other state. Note, idle is always in the ++ * TASK_RUNNING state. ++ */ ++ WARN_ON_ONCE(current->state); ++ do { ++ __schedule(false); ++ } while (need_resched()); ++} ++ ++#ifdef CONFIG_CONTEXT_TRACKING ++asmlinkage __visible void __sched schedule_user(void) ++{ ++ /* ++ * If we come here after a random call to set_need_resched(), ++ * or we have been woken up remotely but the IPI has not yet arrived, ++ * we haven't yet exited the RCU idle mode. Do it here manually until ++ * we find a better solution. ++ * ++ * NB: There are buggy callers of this function. Ideally we ++ * should warn if prev_state != IN_USER, but that will trigger ++ * too frequently to make sense yet. ++ */ ++ enum ctx_state prev_state = exception_enter(); ++ schedule(); ++ exception_exit(prev_state); ++} ++#endif ++ ++/** ++ * schedule_preempt_disabled - called with preemption disabled ++ * ++ * Returns with preemption disabled. Note: preempt_count must be 1 ++ */ ++void __sched schedule_preempt_disabled(void) ++{ ++ sched_preempt_enable_no_resched(); ++ schedule(); ++ preempt_disable(); ++} ++ ++static void __sched notrace preempt_schedule_common(void) ++{ ++ do { ++ /* ++ * Because the function tracer can trace preempt_count_sub() ++ * and it also uses preempt_enable/disable_notrace(), if ++ * NEED_RESCHED is set, the preempt_enable_notrace() called ++ * by the function tracer will call this function again and ++ * cause infinite recursion. ++ * ++ * Preemption must be disabled here before the function ++ * tracer can trace. Break up preempt_disable() into two ++ * calls. One to disable preemption without fear of being ++ * traced. The other to still record the preemption latency, ++ * which can also be traced by the function tracer. ++ */ ++ preempt_disable_notrace(); ++ preempt_latency_start(1); ++ __schedule(true); ++ preempt_latency_stop(1); ++ preempt_enable_no_resched_notrace(); ++ ++ /* ++ * Check again in case we missed a preemption opportunity ++ * between schedule and now. ++ */ ++ } while (need_resched()); ++} ++ ++#ifdef CONFIG_PREEMPT ++/* ++ * this is the entry point to schedule() from in-kernel preemption ++ * off of preempt_enable. Kernel preemptions off return from interrupt ++ * occur there and call schedule directly. ++ */ ++asmlinkage __visible void __sched notrace preempt_schedule(void) ++{ ++ /* ++ * If there is a non-zero preempt_count or interrupts are disabled, ++ * we do not want to preempt the current task. Just return.. ++ */ ++ if (likely(!preemptible())) ++ return; ++ ++ preempt_schedule_common(); ++} ++NOKPROBE_SYMBOL(preempt_schedule); ++EXPORT_SYMBOL(preempt_schedule); ++ ++/** ++ * preempt_schedule_notrace - preempt_schedule called by tracing ++ * ++ * The tracing infrastructure uses preempt_enable_notrace to prevent ++ * recursion and tracing preempt enabling caused by the tracing ++ * infrastructure itself. But as tracing can happen in areas coming ++ * from userspace or just about to enter userspace, a preempt enable ++ * can occur before user_exit() is called. This will cause the scheduler ++ * to be called when the system is still in usermode. ++ * ++ * To prevent this, the preempt_enable_notrace will use this function ++ * instead of preempt_schedule() to exit user context if needed before ++ * calling the scheduler. ++ */ ++asmlinkage __visible void __sched notrace preempt_schedule_notrace(void) ++{ ++ enum ctx_state prev_ctx; ++ ++ if (likely(!preemptible())) ++ return; ++ ++ do { ++ /* ++ * Because the function tracer can trace preempt_count_sub() ++ * and it also uses preempt_enable/disable_notrace(), if ++ * NEED_RESCHED is set, the preempt_enable_notrace() called ++ * by the function tracer will call this function again and ++ * cause infinite recursion. ++ * ++ * Preemption must be disabled here before the function ++ * tracer can trace. Break up preempt_disable() into two ++ * calls. One to disable preemption without fear of being ++ * traced. The other to still record the preemption latency, ++ * which can also be traced by the function tracer. ++ */ ++ preempt_disable_notrace(); ++ preempt_latency_start(1); ++ /* ++ * Needs preempt disabled in case user_exit() is traced ++ * and the tracer calls preempt_enable_notrace() causing ++ * an infinite recursion. ++ */ ++ prev_ctx = exception_enter(); ++ __schedule(true); ++ exception_exit(prev_ctx); ++ ++ preempt_latency_stop(1); ++ preempt_enable_no_resched_notrace(); ++ } while (need_resched()); ++} ++EXPORT_SYMBOL_GPL(preempt_schedule_notrace); ++ ++#endif /* CONFIG_PREEMPT */ ++ ++/* ++ * this is the entry point to schedule() from kernel preemption ++ * off of irq context. ++ * Note, that this is called and return with irqs disabled. This will ++ * protect us against recursive calling from irq. ++ */ ++asmlinkage __visible void __sched preempt_schedule_irq(void) ++{ ++ enum ctx_state prev_state; ++ ++ /* Catch callers which need to be fixed */ ++ BUG_ON(preempt_count() || !irqs_disabled()); ++ ++ prev_state = exception_enter(); ++ ++ do { ++ preempt_disable(); ++ local_irq_enable(); ++ __schedule(true); ++ local_irq_disable(); ++ sched_preempt_enable_no_resched(); ++ } while (need_resched()); ++ ++ exception_exit(prev_state); ++} ++ ++int default_wake_function(wait_queue_entry_t *curr, unsigned mode, int wake_flags, ++ void *key) ++{ ++ return try_to_wake_up(curr->private, mode, wake_flags); ++} ++EXPORT_SYMBOL(default_wake_function); ++ ++#ifdef CONFIG_RT_MUTEXES ++ ++static inline int __rt_effective_prio(struct task_struct *pi_task, int prio) ++{ ++ if (pi_task) ++ prio = min(prio, pi_task->prio); ++ ++ return prio; ++} ++ ++static inline int rt_effective_prio(struct task_struct *p, int prio) ++{ ++ struct task_struct *pi_task = rt_mutex_get_top_task(p); ++ ++ return __rt_effective_prio(pi_task, prio); ++} ++ ++/* ++ * rt_mutex_setprio - set the current priority of a task ++ * @p: task to boost ++ * @pi_task: donor task ++ * ++ * This function changes the 'effective' priority of a task. It does ++ * not touch ->normal_prio like __setscheduler(). ++ * ++ * Used by the rt_mutex code to implement priority inheritance ++ * logic. Call site only calls if the priority of the task changed. ++ */ ++void rt_mutex_setprio(struct task_struct *p, struct task_struct *pi_task) ++{ ++ int prio, oldprio; ++ struct rq *rq; ++ ++ /* XXX used to be waiter->prio, not waiter->task->prio */ ++ prio = __rt_effective_prio(pi_task, p->normal_prio); ++ ++ /* ++ * If nothing changed; bail early. ++ */ ++ if (p->pi_top_task == pi_task && prio == p->prio) ++ return; ++ ++ rq = __task_rq_lock(p, NULL); ++ update_rq_clock(rq); ++ /* ++ * Set under pi_lock && rq->lock, such that the value can be used under ++ * either lock. ++ * ++ * Note that there is loads of tricky to make this pointer cache work ++ * right. rt_mutex_slowunlock()+rt_mutex_postunlock() work together to ++ * ensure a task is de-boosted (pi_task is set to NULL) before the ++ * task is allowed to run again (and can exit). This ensures the pointer ++ * points to a blocked task -- which guaratees the task is present. ++ */ ++ p->pi_top_task = pi_task; ++ ++ /* ++ * For FIFO/RR we only need to set prio, if that matches we're done. ++ */ ++ if (prio == p->prio) ++ goto out_unlock; ++ ++ /* ++ * Idle task boosting is a nono in general. There is one ++ * exception, when PREEMPT_RT and NOHZ is active: ++ * ++ * The idle task calls get_next_timer_interrupt() and holds ++ * the timer wheel base->lock on the CPU and another CPU wants ++ * to access the timer (probably to cancel it). We can safely ++ * ignore the boosting request, as the idle CPU runs this code ++ * with interrupts disabled and will complete the lock ++ * protected section without being interrupted. So there is no ++ * real need to boost. ++ */ ++ if (unlikely(p == rq->idle)) { ++ WARN_ON(p != rq->curr); ++ WARN_ON(p->pi_blocked_on); ++ goto out_unlock; ++ } ++ ++ trace_sched_pi_setprio(p, pi_task); ++ oldprio = p->prio; ++ p->prio = prio; ++ if (task_running(rq, p)){ ++ if (prio > oldprio) ++ resched_task(p); ++ } else if (task_queued(p)) { ++ dequeue_task(rq, p, DEQUEUE_SAVE); ++ enqueue_task(rq, p, ENQUEUE_RESTORE); ++ if (prio < oldprio) ++ try_preempt(p, rq); ++ } ++out_unlock: ++ __task_rq_unlock(rq, NULL); ++} ++#else ++static inline int rt_effective_prio(struct task_struct *p, int prio) ++{ ++ return prio; ++} ++#endif ++ ++/* ++ * Adjust the deadline for when the priority is to change, before it's ++ * changed. ++ */ ++static inline void adjust_deadline(struct task_struct *p, int new_prio) ++{ ++ p->deadline += static_deadline_diff(new_prio) - task_deadline_diff(p); ++} ++ ++void set_user_nice(struct task_struct *p, long nice) ++{ ++ int new_static, old_static; ++ struct rq_flags rf; ++ struct rq *rq; ++ ++ if (task_nice(p) == nice || nice < MIN_NICE || nice > MAX_NICE) ++ return; ++ new_static = NICE_TO_PRIO(nice); ++ /* ++ * We have to be careful, if called from sys_setpriority(), ++ * the task might be in the middle of scheduling on another CPU. ++ */ ++ rq = task_rq_lock(p, &rf); ++ update_rq_clock(rq); ++ ++ /* ++ * The RT priorities are set via sched_setscheduler(), but we still ++ * allow the 'normal' nice value to be set - but as expected ++ * it wont have any effect on scheduling until the task is ++ * not SCHED_NORMAL/SCHED_BATCH: ++ */ ++ if (has_rt_policy(p)) { ++ p->static_prio = new_static; ++ goto out_unlock; ++ } ++ ++ adjust_deadline(p, new_static); ++ old_static = p->static_prio; ++ p->static_prio = new_static; ++ p->prio = effective_prio(p); ++ ++ if (task_queued(p)) { ++ dequeue_task(rq, p, DEQUEUE_SAVE); ++ enqueue_task(rq, p, ENQUEUE_RESTORE); ++ if (new_static < old_static) ++ try_preempt(p, rq); ++ } else if (task_running(rq, p)) { ++ set_rq_task(rq, p); ++ if (old_static < new_static) ++ resched_task(p); ++ } ++out_unlock: ++ task_rq_unlock(rq, p, &rf); ++} ++EXPORT_SYMBOL(set_user_nice); ++ ++/* ++ * can_nice - check if a task can reduce its nice value ++ * @p: task ++ * @nice: nice value ++ */ ++int can_nice(const struct task_struct *p, const int nice) ++{ ++ /* Convert nice value [19,-20] to rlimit style value [1,40] */ ++ int nice_rlim = nice_to_rlimit(nice); ++ ++ return (nice_rlim <= task_rlimit(p, RLIMIT_NICE) || ++ capable(CAP_SYS_NICE)); ++} ++ ++#ifdef __ARCH_WANT_SYS_NICE ++ ++/* ++ * sys_nice - change the priority of the current process. ++ * @increment: priority increment ++ * ++ * sys_setpriority is a more generic, but much slower function that ++ * does similar things. ++ */ ++SYSCALL_DEFINE1(nice, int, increment) ++{ ++ long nice, retval; ++ ++ /* ++ * Setpriority might change our priority at the same moment. ++ * We don't have to worry. Conceptually one call occurs first ++ * and we have a single winner. ++ */ ++ ++ increment = clamp(increment, -NICE_WIDTH, NICE_WIDTH); ++ nice = task_nice(current) + increment; ++ ++ nice = clamp_val(nice, MIN_NICE, MAX_NICE); ++ if (increment < 0 && !can_nice(current, nice)) ++ return -EPERM; ++ ++ retval = security_task_setnice(current, nice); ++ if (retval) ++ return retval; ++ ++ set_user_nice(current, nice); ++ return 0; ++} ++ ++#endif ++ ++/** ++ * task_prio - return the priority value of a given task. ++ * @p: the task in question. ++ * ++ * Return: The priority value as seen by users in /proc. ++ * RT tasks are offset by -100. Normal tasks are centered around 1, value goes ++ * from 0 (SCHED_ISO) up to 82 (nice +19 SCHED_IDLEPRIO). ++ */ ++int task_prio(const struct task_struct *p) ++{ ++ int delta, prio = p->prio - MAX_RT_PRIO; ++ ++ /* rt tasks and iso tasks */ ++ if (prio <= 0) ++ goto out; ++ ++ /* Convert to ms to avoid overflows */ ++ delta = NS_TO_MS(p->deadline - task_rq(p)->niffies); ++ if (unlikely(delta < 0)) ++ delta = 0; ++ delta = delta * 40 / ms_longest_deadline_diff(); ++ if (delta <= 80) ++ prio += delta; ++ if (idleprio_task(p)) ++ prio += 40; ++out: ++ return prio; ++} ++ ++/** ++ * idle_cpu - is a given CPU idle currently? ++ * @cpu: the processor in question. ++ * ++ * Return: 1 if the CPU is currently idle. 0 otherwise. ++ */ ++int idle_cpu(int cpu) ++{ ++ return cpu_curr(cpu) == cpu_rq(cpu)->idle; ++} ++ ++/** ++ * available_idle_cpu - is a given CPU idle for enqueuing work. ++ * @cpu: the CPU in question. ++ * ++ * Return: 1 if the CPU is currently idle. 0 otherwise. ++ */ ++int available_idle_cpu(int cpu) ++{ ++ if (!idle_cpu(cpu)) ++ return 0; ++ ++ if (vcpu_is_preempted(cpu)) ++ return 0; ++ ++ return 1; ++} ++ ++/** ++ * idle_task - return the idle task for a given CPU. ++ * @cpu: the processor in question. ++ * ++ * Return: The idle task for the CPU @cpu. ++ */ ++struct task_struct *idle_task(int cpu) ++{ ++ return cpu_rq(cpu)->idle; ++} ++ ++/** ++ * find_process_by_pid - find a process with a matching PID value. ++ * @pid: the pid in question. ++ * ++ * The task of @pid, if found. %NULL otherwise. ++ */ ++static inline struct task_struct *find_process_by_pid(pid_t pid) ++{ ++ return pid ? find_task_by_vpid(pid) : current; ++} ++ ++/* Actually do priority change: must hold rq lock. */ ++static void __setscheduler(struct task_struct *p, struct rq *rq, int policy, ++ int prio, bool keep_boost) ++{ ++ int oldrtprio, oldprio; ++ ++ p->policy = policy; ++ oldrtprio = p->rt_priority; ++ p->rt_priority = prio; ++ p->normal_prio = normal_prio(p); ++ oldprio = p->prio; ++ /* ++ * Keep a potential priority boosting if called from ++ * sched_setscheduler(). ++ */ ++ p->prio = normal_prio(p); ++ if (keep_boost) ++ p->prio = rt_effective_prio(p, p->prio); ++ ++ if (task_running(rq, p)) { ++ set_rq_task(rq, p); ++ resched_task(p); ++ } else if (task_queued(p)) { ++ dequeue_task(rq, p, DEQUEUE_SAVE); ++ enqueue_task(rq, p, ENQUEUE_RESTORE); ++ if (p->prio < oldprio || p->rt_priority > oldrtprio) ++ try_preempt(p, rq); ++ } ++} ++ ++/* ++ * Check the target process has a UID that matches the current process's ++ */ ++static bool check_same_owner(struct task_struct *p) ++{ ++ const struct cred *cred = current_cred(), *pcred; ++ bool match; ++ ++ rcu_read_lock(); ++ pcred = __task_cred(p); ++ match = (uid_eq(cred->euid, pcred->euid) || ++ uid_eq(cred->euid, pcred->uid)); ++ rcu_read_unlock(); ++ return match; ++} ++ ++static int __sched_setscheduler(struct task_struct *p, ++ const struct sched_attr *attr, ++ bool user, bool pi) ++{ ++ int retval, policy = attr->sched_policy, oldpolicy = -1, priority = attr->sched_priority; ++ unsigned long rlim_rtprio = 0; ++ struct rq_flags rf; ++ int reset_on_fork; ++ struct rq *rq; ++ ++ /* The pi code expects interrupts enabled */ ++ BUG_ON(pi && in_interrupt()); ++ ++ if (is_rt_policy(policy) && !capable(CAP_SYS_NICE)) { ++ unsigned long lflags; ++ ++ if (!lock_task_sighand(p, &lflags)) ++ return -ESRCH; ++ rlim_rtprio = task_rlimit(p, RLIMIT_RTPRIO); ++ unlock_task_sighand(p, &lflags); ++ if (rlim_rtprio) ++ goto recheck; ++ /* ++ * If the caller requested an RT policy without having the ++ * necessary rights, we downgrade the policy to SCHED_ISO. ++ * We also set the parameter to zero to pass the checks. ++ */ ++ policy = SCHED_ISO; ++ priority = 0; ++ } ++recheck: ++ /* Double check policy once rq lock held */ ++ if (policy < 0) { ++ reset_on_fork = p->sched_reset_on_fork; ++ policy = oldpolicy = p->policy; ++ } else { ++ reset_on_fork = !!(policy & SCHED_RESET_ON_FORK); ++ policy &= ~SCHED_RESET_ON_FORK; ++ ++ if (!SCHED_RANGE(policy)) ++ return -EINVAL; ++ } ++ ++ if (attr->sched_flags & ~(SCHED_FLAG_ALL | SCHED_FLAG_SUGOV)) ++ return -EINVAL; ++ ++ /* ++ * Valid priorities for SCHED_FIFO and SCHED_RR are ++ * 1..MAX_USER_RT_PRIO-1, valid priority for SCHED_NORMAL and ++ * SCHED_BATCH is 0. ++ */ ++ if (priority < 0 || ++ (p->mm && priority > MAX_USER_RT_PRIO - 1) || ++ (!p->mm && priority > MAX_RT_PRIO - 1)) ++ return -EINVAL; ++ if (is_rt_policy(policy) != (priority != 0)) ++ return -EINVAL; ++ ++ /* ++ * Allow unprivileged RT tasks to decrease priority: ++ */ ++ if (user && !capable(CAP_SYS_NICE)) { ++ if (is_rt_policy(policy)) { ++ unsigned long rlim_rtprio = ++ task_rlimit(p, RLIMIT_RTPRIO); ++ ++ /* Can't set/change the rt policy */ ++ if (policy != p->policy && !rlim_rtprio) ++ return -EPERM; ++ ++ /* Can't increase priority */ ++ if (priority > p->rt_priority && ++ priority > rlim_rtprio) ++ return -EPERM; ++ } else { ++ switch (p->policy) { ++ /* ++ * Can only downgrade policies but not back to ++ * SCHED_NORMAL ++ */ ++ case SCHED_ISO: ++ if (policy == SCHED_ISO) ++ goto out; ++ if (policy != SCHED_NORMAL) ++ return -EPERM; ++ break; ++ case SCHED_BATCH: ++ if (policy == SCHED_BATCH) ++ goto out; ++ if (policy != SCHED_IDLEPRIO) ++ return -EPERM; ++ break; ++ case SCHED_IDLEPRIO: ++ if (policy == SCHED_IDLEPRIO) ++ goto out; ++ return -EPERM; ++ default: ++ break; ++ } ++ } ++ ++ /* Can't change other user's priorities */ ++ if (!check_same_owner(p)) ++ return -EPERM; ++ ++ /* Normal users shall not reset the sched_reset_on_fork flag: */ ++ if (p->sched_reset_on_fork && !reset_on_fork) ++ return -EPERM; ++ } ++ ++ if (user) { ++ retval = security_task_setscheduler(p); ++ if (retval) ++ return retval; ++ } ++ ++ /* ++ * Make sure no PI-waiters arrive (or leave) while we are ++ * changing the priority of the task: ++ * ++ * To be able to change p->policy safely, the runqueue lock must be ++ * held. ++ */ ++ rq = task_rq_lock(p, &rf); ++ update_rq_clock(rq); ++ ++ /* ++ * Changing the policy of the stop threads its a very bad idea: ++ */ ++ if (p == rq->stop) { ++ task_rq_unlock(rq, p, &rf); ++ return -EINVAL; ++ } ++ ++ /* ++ * If not changing anything there's no need to proceed further: ++ */ ++ if (unlikely(policy == p->policy && (!is_rt_policy(policy) || ++ priority == p->rt_priority))) { ++ task_rq_unlock(rq, p, &rf); ++ return 0; ++ } ++ ++ /* Re-check policy now with rq lock held */ ++ if (unlikely(oldpolicy != -1 && oldpolicy != p->policy)) { ++ policy = oldpolicy = -1; ++ task_rq_unlock(rq, p, &rf); ++ goto recheck; ++ } ++ p->sched_reset_on_fork = reset_on_fork; ++ ++ __setscheduler(p, rq, policy, priority, pi); ++ task_rq_unlock(rq, p, &rf); ++ ++ if (pi) ++ rt_mutex_adjust_pi(p); ++out: ++ return 0; ++} ++ ++static int _sched_setscheduler(struct task_struct *p, int policy, ++ const struct sched_param *param, bool check) ++{ ++ struct sched_attr attr = { ++ .sched_policy = policy, ++ .sched_priority = param->sched_priority, ++ .sched_nice = PRIO_TO_NICE(p->static_prio), ++ }; ++ ++ return __sched_setscheduler(p, &attr, check, true); ++} ++/** ++ * sched_setscheduler - change the scheduling policy and/or RT priority of a thread. ++ * @p: the task in question. ++ * @policy: new policy. ++ * @param: structure containing the new RT priority. ++ * ++ * Return: 0 on success. An error code otherwise. ++ * ++ * NOTE that the task may be already dead. ++ */ ++int sched_setscheduler(struct task_struct *p, int policy, ++ const struct sched_param *param) ++{ ++ return _sched_setscheduler(p, policy, param, true); ++} ++ ++EXPORT_SYMBOL_GPL(sched_setscheduler); ++ ++int sched_setattr(struct task_struct *p, const struct sched_attr *attr) ++{ ++ return __sched_setscheduler(p, attr, true, true); ++} ++EXPORT_SYMBOL_GPL(sched_setattr); ++ ++int sched_setattr_nocheck(struct task_struct *p, const struct sched_attr *attr) ++{ ++ return __sched_setscheduler(p, attr, false, true); ++} ++ ++/** ++ * sched_setscheduler_nocheck - change the scheduling policy and/or RT priority of a thread from kernelspace. ++ * @p: the task in question. ++ * @policy: new policy. ++ * @param: structure containing the new RT priority. ++ * ++ * Just like sched_setscheduler, only don't bother checking if the ++ * current context has permission. For example, this is needed in ++ * stop_machine(): we create temporary high priority worker threads, ++ * but our caller might not have that capability. ++ * ++ * Return: 0 on success. An error code otherwise. ++ */ ++int sched_setscheduler_nocheck(struct task_struct *p, int policy, ++ const struct sched_param *param) ++{ ++ return _sched_setscheduler(p, policy, param, false); ++} ++EXPORT_SYMBOL_GPL(sched_setscheduler_nocheck); ++ ++static int ++do_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param) ++{ ++ struct sched_param lparam; ++ struct task_struct *p; ++ int retval; ++ ++ if (!param || pid < 0) ++ return -EINVAL; ++ if (copy_from_user(&lparam, param, sizeof(struct sched_param))) ++ return -EFAULT; ++ ++ rcu_read_lock(); ++ retval = -ESRCH; ++ p = find_process_by_pid(pid); ++ if (p != NULL) ++ retval = sched_setscheduler(p, policy, &lparam); ++ rcu_read_unlock(); ++ ++ return retval; ++} ++ ++/* ++ * Mimics kernel/events/core.c perf_copy_attr(). ++ */ ++static int sched_copy_attr(struct sched_attr __user *uattr, ++ struct sched_attr *attr) ++{ ++ u32 size; ++ int ret; ++ ++ if (!access_ok(uattr, SCHED_ATTR_SIZE_VER0)) ++ return -EFAULT; ++ ++ /* Zero the full structure, so that a short copy will be nice: */ ++ memset(attr, 0, sizeof(*attr)); ++ ++ ret = get_user(size, &uattr->size); ++ if (ret) ++ return ret; ++ ++ /* Bail out on silly large: */ ++ if (size > PAGE_SIZE) ++ goto err_size; ++ ++ /* ABI compatibility quirk: */ ++ if (!size) ++ size = SCHED_ATTR_SIZE_VER0; ++ ++ if (size < SCHED_ATTR_SIZE_VER0) ++ goto err_size; ++ ++ /* ++ * If we're handed a bigger struct than we know of, ++ * ensure all the unknown bits are 0 - i.e. new ++ * user-space does not rely on any kernel feature ++ * extensions we dont know about yet. ++ */ ++ if (size > sizeof(*attr)) { ++ unsigned char __user *addr; ++ unsigned char __user *end; ++ unsigned char val; ++ ++ addr = (void __user *)uattr + sizeof(*attr); ++ end = (void __user *)uattr + size; ++ ++ for (; addr < end; addr++) { ++ ret = get_user(val, addr); ++ if (ret) ++ return ret; ++ if (val) ++ goto err_size; ++ } ++ size = sizeof(*attr); ++ } ++ ++ ret = copy_from_user(attr, uattr, size); ++ if (ret) ++ return -EFAULT; ++ ++ /* ++ * XXX: Do we want to be lenient like existing syscalls; or do we want ++ * to be strict and return an error on out-of-bounds values? ++ */ ++ attr->sched_nice = clamp(attr->sched_nice, -20, 19); ++ ++ /* sched/core.c uses zero here but we already know ret is zero */ ++ return 0; ++ ++err_size: ++ put_user(sizeof(*attr), &uattr->size); ++ return -E2BIG; ++} ++ ++/* ++ * sched_setparam() passes in -1 for its policy, to let the functions ++ * it calls know not to change it. ++ */ ++#define SETPARAM_POLICY -1 ++ ++/** ++ * sys_sched_setscheduler - set/change the scheduler policy and RT priority ++ * @pid: the pid in question. ++ * @policy: new policy. ++ * @param: structure containing the new RT priority. ++ * ++ * Return: 0 on success. An error code otherwise. ++ */ ++SYSCALL_DEFINE3(sched_setscheduler, pid_t, pid, int, policy, struct sched_param __user *, param) ++{ ++ if (policy < 0) ++ return -EINVAL; ++ ++ return do_sched_setscheduler(pid, policy, param); ++} ++ ++/** ++ * sys_sched_setparam - set/change the RT priority of a thread ++ * @pid: the pid in question. ++ * @param: structure containing the new RT priority. ++ * ++ * Return: 0 on success. An error code otherwise. ++ */ ++SYSCALL_DEFINE2(sched_setparam, pid_t, pid, struct sched_param __user *, param) ++{ ++ return do_sched_setscheduler(pid, SETPARAM_POLICY, param); ++} ++ ++/** ++ * sys_sched_setattr - same as above, but with extended sched_attr ++ * @pid: the pid in question. ++ * @uattr: structure containing the extended parameters. ++ */ ++SYSCALL_DEFINE3(sched_setattr, pid_t, pid, struct sched_attr __user *, uattr, ++ unsigned int, flags) ++{ ++ struct sched_attr attr; ++ struct task_struct *p; ++ int retval; ++ ++ if (!uattr || pid < 0 || flags) ++ return -EINVAL; ++ ++ retval = sched_copy_attr(uattr, &attr); ++ if (retval) ++ return retval; ++ ++ if ((int)attr.sched_policy < 0) ++ return -EINVAL; ++ ++ rcu_read_lock(); ++ retval = -ESRCH; ++ p = find_process_by_pid(pid); ++ if (p != NULL) ++ retval = sched_setattr(p, &attr); ++ rcu_read_unlock(); ++ ++ return retval; ++} ++ ++/** ++ * sys_sched_getscheduler - get the policy (scheduling class) of a thread ++ * @pid: the pid in question. ++ * ++ * Return: On success, the policy of the thread. Otherwise, a negative error ++ * code. ++ */ ++SYSCALL_DEFINE1(sched_getscheduler, pid_t, pid) ++{ ++ struct task_struct *p; ++ int retval = -EINVAL; ++ ++ if (pid < 0) ++ goto out_nounlock; ++ ++ retval = -ESRCH; ++ rcu_read_lock(); ++ p = find_process_by_pid(pid); ++ if (p) { ++ retval = security_task_getscheduler(p); ++ if (!retval) ++ retval = p->policy; ++ } ++ rcu_read_unlock(); ++ ++out_nounlock: ++ return retval; ++} ++ ++/** ++ * sys_sched_getscheduler - get the RT priority of a thread ++ * @pid: the pid in question. ++ * @param: structure containing the RT priority. ++ * ++ * Return: On success, 0 and the RT priority is in @param. Otherwise, an error ++ * code. ++ */ ++SYSCALL_DEFINE2(sched_getparam, pid_t, pid, struct sched_param __user *, param) ++{ ++ struct sched_param lp = { .sched_priority = 0 }; ++ struct task_struct *p; ++ int retval = -EINVAL; ++ ++ if (!param || pid < 0) ++ goto out_nounlock; ++ ++ rcu_read_lock(); ++ p = find_process_by_pid(pid); ++ retval = -ESRCH; ++ if (!p) ++ goto out_unlock; ++ ++ retval = security_task_getscheduler(p); ++ if (retval) ++ goto out_unlock; ++ ++ if (has_rt_policy(p)) ++ lp.sched_priority = p->rt_priority; ++ rcu_read_unlock(); ++ ++ /* ++ * This one might sleep, we cannot do it with a spinlock held ... ++ */ ++ retval = copy_to_user(param, &lp, sizeof(*param)) ? -EFAULT : 0; ++ ++out_nounlock: ++ return retval; ++ ++out_unlock: ++ rcu_read_unlock(); ++ return retval; ++} ++ ++static int sched_read_attr(struct sched_attr __user *uattr, ++ struct sched_attr *attr, ++ unsigned int usize) ++{ ++ int ret; ++ ++ if (!access_ok(uattr, usize)) ++ return -EFAULT; ++ ++ /* ++ * If we're handed a smaller struct than we know of, ++ * ensure all the unknown bits are 0 - i.e. old ++ * user-space does not get uncomplete information. ++ */ ++ if (usize < sizeof(*attr)) { ++ unsigned char *addr; ++ unsigned char *end; ++ ++ addr = (void *)attr + usize; ++ end = (void *)attr + sizeof(*attr); ++ ++ for (; addr < end; addr++) { ++ if (*addr) ++ return -EFBIG; ++ } ++ ++ attr->size = usize; ++ } ++ ++ ret = copy_to_user(uattr, attr, attr->size); ++ if (ret) ++ return -EFAULT; ++ ++ /* sched/core.c uses zero here but we already know ret is zero */ ++ return ret; ++} ++ ++/** ++ * sys_sched_getattr - similar to sched_getparam, but with sched_attr ++ * @pid: the pid in question. ++ * @uattr: structure containing the extended parameters. ++ * @size: sizeof(attr) for fwd/bwd comp. ++ * @flags: for future extension. ++ */ ++SYSCALL_DEFINE4(sched_getattr, pid_t, pid, struct sched_attr __user *, uattr, ++ unsigned int, size, unsigned int, flags) ++{ ++ struct sched_attr attr = { ++ .size = sizeof(struct sched_attr), ++ }; ++ struct task_struct *p; ++ int retval; ++ ++ if (!uattr || pid < 0 || size > PAGE_SIZE || ++ size < SCHED_ATTR_SIZE_VER0 || flags) ++ return -EINVAL; ++ ++ rcu_read_lock(); ++ p = find_process_by_pid(pid); ++ retval = -ESRCH; ++ if (!p) ++ goto out_unlock; ++ ++ retval = security_task_getscheduler(p); ++ if (retval) ++ goto out_unlock; ++ ++ attr.sched_policy = p->policy; ++ if (rt_task(p)) ++ attr.sched_priority = p->rt_priority; ++ else ++ attr.sched_nice = task_nice(p); ++ ++ rcu_read_unlock(); ++ ++ retval = sched_read_attr(uattr, &attr, size); ++ return retval; ++ ++out_unlock: ++ rcu_read_unlock(); ++ return retval; ++} ++ ++long sched_setaffinity(pid_t pid, const struct cpumask *in_mask) ++{ ++ cpumask_var_t cpus_allowed, new_mask; ++ struct task_struct *p; ++ int retval; ++ ++ rcu_read_lock(); ++ ++ p = find_process_by_pid(pid); ++ if (!p) { ++ rcu_read_unlock(); ++ return -ESRCH; ++ } ++ ++ /* Prevent p going away */ ++ get_task_struct(p); ++ rcu_read_unlock(); ++ ++ if (p->flags & PF_NO_SETAFFINITY) { ++ retval = -EINVAL; ++ goto out_put_task; ++ } ++ if (!alloc_cpumask_var(&cpus_allowed, GFP_KERNEL)) { ++ retval = -ENOMEM; ++ goto out_put_task; ++ } ++ if (!alloc_cpumask_var(&new_mask, GFP_KERNEL)) { ++ retval = -ENOMEM; ++ goto out_free_cpus_allowed; ++ } ++ retval = -EPERM; ++ if (!check_same_owner(p)) { ++ rcu_read_lock(); ++ if (!ns_capable(__task_cred(p)->user_ns, CAP_SYS_NICE)) { ++ rcu_read_unlock(); ++ goto out_unlock; ++ } ++ rcu_read_unlock(); ++ } ++ ++ retval = security_task_setscheduler(p); ++ if (retval) ++ goto out_unlock; ++ ++ cpuset_cpus_allowed(p, cpus_allowed); ++ cpumask_and(new_mask, in_mask, cpus_allowed); ++again: ++ retval = __set_cpus_allowed_ptr(p, new_mask, true); ++ ++ if (!retval) { ++ cpuset_cpus_allowed(p, cpus_allowed); ++ if (!cpumask_subset(new_mask, cpus_allowed)) { ++ /* ++ * We must have raced with a concurrent cpuset ++ * update. Just reset the cpus_allowed to the ++ * cpuset's cpus_allowed ++ */ ++ cpumask_copy(new_mask, cpus_allowed); ++ goto again; ++ } ++ } ++out_unlock: ++ free_cpumask_var(new_mask); ++out_free_cpus_allowed: ++ free_cpumask_var(cpus_allowed); ++out_put_task: ++ put_task_struct(p); ++ return retval; ++} ++ ++static int get_user_cpu_mask(unsigned long __user *user_mask_ptr, unsigned len, ++ cpumask_t *new_mask) ++{ ++ if (len < cpumask_size()) ++ cpumask_clear(new_mask); ++ else if (len > cpumask_size()) ++ len = cpumask_size(); ++ ++ return copy_from_user(new_mask, user_mask_ptr, len) ? -EFAULT : 0; ++} ++ ++ ++/** ++ * sys_sched_setaffinity - set the CPU affinity of a process ++ * @pid: pid of the process ++ * @len: length in bytes of the bitmask pointed to by user_mask_ptr ++ * @user_mask_ptr: user-space pointer to the new CPU mask ++ * ++ * Return: 0 on success. An error code otherwise. ++ */ ++SYSCALL_DEFINE3(sched_setaffinity, pid_t, pid, unsigned int, len, ++ unsigned long __user *, user_mask_ptr) ++{ ++ cpumask_var_t new_mask; ++ int retval; ++ ++ if (!alloc_cpumask_var(&new_mask, GFP_KERNEL)) ++ return -ENOMEM; ++ ++ retval = get_user_cpu_mask(user_mask_ptr, len, new_mask); ++ if (retval == 0) ++ retval = sched_setaffinity(pid, new_mask); ++ free_cpumask_var(new_mask); ++ return retval; ++} ++ ++long sched_getaffinity(pid_t pid, cpumask_t *mask) ++{ ++ struct task_struct *p; ++ unsigned long flags; ++ int retval; ++ ++ get_online_cpus(); ++ rcu_read_lock(); ++ ++ retval = -ESRCH; ++ p = find_process_by_pid(pid); ++ if (!p) ++ goto out_unlock; ++ ++ retval = security_task_getscheduler(p); ++ if (retval) ++ goto out_unlock; ++ ++ raw_spin_lock_irqsave(&p->pi_lock, flags); ++ cpumask_and(mask, &p->cpus_allowed, cpu_active_mask); ++ raw_spin_unlock_irqrestore(&p->pi_lock, flags); ++ ++out_unlock: ++ rcu_read_unlock(); ++ put_online_cpus(); ++ ++ return retval; ++} ++ ++/** ++ * sys_sched_getaffinity - get the CPU affinity of a process ++ * @pid: pid of the process ++ * @len: length in bytes of the bitmask pointed to by user_mask_ptr ++ * @user_mask_ptr: user-space pointer to hold the current CPU mask ++ * ++ * Return: 0 on success. An error code otherwise. ++ */ ++SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len, ++ unsigned long __user *, user_mask_ptr) ++{ ++ int ret; ++ cpumask_var_t mask; ++ ++ if ((len * BITS_PER_BYTE) < nr_cpu_ids) ++ return -EINVAL; ++ if (len & (sizeof(unsigned long)-1)) ++ return -EINVAL; ++ ++ if (!alloc_cpumask_var(&mask, GFP_KERNEL)) ++ return -ENOMEM; ++ ++ ret = sched_getaffinity(pid, mask); ++ if (ret == 0) { ++ unsigned int retlen = min(len, cpumask_size()); ++ ++ if (copy_to_user(user_mask_ptr, mask, retlen)) ++ ret = -EFAULT; ++ else ++ ret = retlen; ++ } ++ free_cpumask_var(mask); ++ ++ return ret; ++} ++ ++/** ++ * sys_sched_yield - yield the current processor to other threads. ++ * ++ * This function yields the current CPU to other tasks. It does this by ++ * scheduling away the current task. If it still has the earliest deadline ++ * it will be scheduled again as the next task. ++ * ++ * Return: 0. ++ */ ++static void do_sched_yield(void) ++{ ++ struct rq *rq; ++ ++ if (!sched_yield_type) ++ return; ++ ++ local_irq_disable(); ++ rq = this_rq(); ++ rq_lock(rq); ++ ++ if (sched_yield_type > 1) ++ time_slice_expired(current, rq); ++ schedstat_inc(rq->yld_count); ++ ++ /* ++ * Since we are going to call schedule() anyway, there's ++ * no need to preempt or enable interrupts: ++ */ ++ preempt_disable(); ++ rq_unlock(rq); ++ sched_preempt_enable_no_resched(); ++ ++ schedule(); ++} ++ ++SYSCALL_DEFINE0(sched_yield) ++{ ++ do_sched_yield(); ++ return 0; ++} ++ ++#ifndef CONFIG_PREEMPT ++int __sched _cond_resched(void) ++{ ++ if (should_resched(0)) { ++ preempt_schedule_common(); ++ return 1; ++ } ++ rcu_all_qs(); ++ return 0; ++} ++EXPORT_SYMBOL(_cond_resched); ++#endif ++ ++/* ++ * __cond_resched_lock() - if a reschedule is pending, drop the given lock, ++ * call schedule, and on return reacquire the lock. ++ * ++ * This works OK both with and without CONFIG_PREEMPT. We do strange low-level ++ * operations here to prevent schedule() from being called twice (once via ++ * spin_unlock(), once by hand). ++ */ ++int __cond_resched_lock(spinlock_t *lock) ++{ ++ int resched = should_resched(PREEMPT_LOCK_OFFSET); ++ int ret = 0; ++ ++ lockdep_assert_held(lock); ++ ++ if (spin_needbreak(lock) || resched) { ++ spin_unlock(lock); ++ if (resched) ++ preempt_schedule_common(); ++ else ++ cpu_relax(); ++ ret = 1; ++ spin_lock(lock); ++ } ++ return ret; ++} ++EXPORT_SYMBOL(__cond_resched_lock); ++ ++/** ++ * yield - yield the current processor to other threads. ++ * ++ * Do not ever use this function, there's a 99% chance you're doing it wrong. ++ * ++ * The scheduler is at all times free to pick the calling task as the most ++ * eligible task to run, if removing the yield() call from your code breaks ++ * it, its already broken. ++ * ++ * Typical broken usage is: ++ * ++ * while (!event) ++ * yield(); ++ * ++ * where one assumes that yield() will let 'the other' process run that will ++ * make event true. If the current task is a SCHED_FIFO task that will never ++ * happen. Never use yield() as a progress guarantee!! ++ * ++ * If you want to use yield() to wait for something, use wait_event(). ++ * If you want to use yield() to be 'nice' for others, use cond_resched(). ++ * If you still want to use yield(), do not! ++ */ ++void __sched yield(void) ++{ ++ set_current_state(TASK_RUNNING); ++ do_sched_yield(); ++} ++EXPORT_SYMBOL(yield); ++ ++/** ++ * yield_to - yield the current processor to another thread in ++ * your thread group, or accelerate that thread toward the ++ * processor it's on. ++ * @p: target task ++ * @preempt: whether task preemption is allowed or not ++ * ++ * It's the caller's job to ensure that the target task struct ++ * can't go away on us before we can do any checks. ++ * ++ * Return: ++ * true (>0) if we indeed boosted the target task. ++ * false (0) if we failed to boost the target. ++ * -ESRCH if there's no task to yield to. ++ */ ++int __sched yield_to(struct task_struct *p, bool preempt) ++{ ++ struct task_struct *rq_p; ++ struct rq *rq, *p_rq; ++ unsigned long flags; ++ int yielded = 0; ++ ++ local_irq_save(flags); ++ rq = this_rq(); ++ ++again: ++ p_rq = task_rq(p); ++ /* ++ * If we're the only runnable task on the rq and target rq also ++ * has only one task, there's absolutely no point in yielding. ++ */ ++ if (task_running(p_rq, p) || p->state) { ++ yielded = -ESRCH; ++ goto out_irq; ++ } ++ ++ double_rq_lock(rq, p_rq); ++ if (unlikely(task_rq(p) != p_rq)) { ++ double_rq_unlock(rq, p_rq); ++ goto again; ++ } ++ ++ yielded = 1; ++ schedstat_inc(rq->yld_count); ++ rq_p = rq->curr; ++ if (p->deadline > rq_p->deadline) ++ p->deadline = rq_p->deadline; ++ p->time_slice += rq_p->time_slice; ++ if (p->time_slice > timeslice()) ++ p->time_slice = timeslice(); ++ time_slice_expired(rq_p, rq); ++ if (preempt && rq != p_rq) ++ resched_task(p_rq->curr); ++ double_rq_unlock(rq, p_rq); ++out_irq: ++ local_irq_restore(flags); ++ ++ if (yielded > 0) ++ schedule(); ++ return yielded; ++} ++EXPORT_SYMBOL_GPL(yield_to); ++ ++int io_schedule_prepare(void) ++{ ++ int old_iowait = current->in_iowait; ++ ++ current->in_iowait = 1; ++ blk_schedule_flush_plug(current); ++ ++ return old_iowait; ++} ++ ++void io_schedule_finish(int token) ++{ ++ current->in_iowait = token; ++} ++ ++/* ++ * This task is about to go to sleep on IO. Increment rq->nr_iowait so ++ * that process accounting knows that this is a task in IO wait state. ++ * ++ * But don't do that if it is a deliberate, throttling IO wait (this task ++ * has set its backing_dev_info: the queue against which it should throttle) ++ */ ++ ++long __sched io_schedule_timeout(long timeout) ++{ ++ int token; ++ long ret; ++ ++ token = io_schedule_prepare(); ++ ret = schedule_timeout(timeout); ++ io_schedule_finish(token); ++ ++ return ret; ++} ++EXPORT_SYMBOL(io_schedule_timeout); ++ ++void io_schedule(void) ++{ ++ int token; ++ ++ token = io_schedule_prepare(); ++ schedule(); ++ io_schedule_finish(token); ++} ++EXPORT_SYMBOL(io_schedule); ++ ++/** ++ * sys_sched_get_priority_max - return maximum RT priority. ++ * @policy: scheduling class. ++ * ++ * Return: On success, this syscall returns the maximum ++ * rt_priority that can be used by a given scheduling class. ++ * On failure, a negative error code is returned. ++ */ ++SYSCALL_DEFINE1(sched_get_priority_max, int, policy) ++{ ++ int ret = -EINVAL; ++ ++ switch (policy) { ++ case SCHED_FIFO: ++ case SCHED_RR: ++ ret = MAX_USER_RT_PRIO-1; ++ break; ++ case SCHED_NORMAL: ++ case SCHED_BATCH: ++ case SCHED_ISO: ++ case SCHED_IDLEPRIO: ++ ret = 0; ++ break; ++ } ++ return ret; ++} ++ ++/** ++ * sys_sched_get_priority_min - return minimum RT priority. ++ * @policy: scheduling class. ++ * ++ * Return: On success, this syscall returns the minimum ++ * rt_priority that can be used by a given scheduling class. ++ * On failure, a negative error code is returned. ++ */ ++SYSCALL_DEFINE1(sched_get_priority_min, int, policy) ++{ ++ int ret = -EINVAL; ++ ++ switch (policy) { ++ case SCHED_FIFO: ++ case SCHED_RR: ++ ret = 1; ++ break; ++ case SCHED_NORMAL: ++ case SCHED_BATCH: ++ case SCHED_ISO: ++ case SCHED_IDLEPRIO: ++ ret = 0; ++ break; ++ } ++ return ret; ++} ++ ++static int sched_rr_get_interval(pid_t pid, struct timespec64 *t) ++{ ++ struct task_struct *p; ++ unsigned int time_slice; ++ struct rq_flags rf; ++ struct rq *rq; ++ int retval; ++ ++ if (pid < 0) ++ return -EINVAL; ++ ++ retval = -ESRCH; ++ rcu_read_lock(); ++ p = find_process_by_pid(pid); ++ if (!p) ++ goto out_unlock; ++ ++ retval = security_task_getscheduler(p); ++ if (retval) ++ goto out_unlock; ++ ++ rq = task_rq_lock(p, &rf); ++ time_slice = p->policy == SCHED_FIFO ? 0 : MS_TO_NS(task_timeslice(p)); ++ task_rq_unlock(rq, p, &rf); ++ ++ rcu_read_unlock(); ++ *t = ns_to_timespec64(time_slice); ++ return 0; ++ ++out_unlock: ++ rcu_read_unlock(); ++ return retval; ++} ++ ++/** ++ * sys_sched_rr_get_interval - return the default timeslice of a process. ++ * @pid: pid of the process. ++ * @interval: userspace pointer to the timeslice value. ++ * ++ * this syscall writes the default timeslice value of a given process ++ * into the user-space timespec buffer. A value of '0' means infinity. ++ * ++ * Return: On success, 0 and the timeslice is in @interval. Otherwise, ++ * an error code. ++ */ ++SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid, ++ struct __kernel_timespec __user *, interval) ++{ ++ struct timespec64 t; ++ int retval = sched_rr_get_interval(pid, &t); ++ ++ if (retval == 0) ++ retval = put_timespec64(&t, interval); ++ ++ return retval; ++} ++ ++#ifdef CONFIG_COMPAT_32BIT_TIME ++SYSCALL_DEFINE2(sched_rr_get_interval_time32, pid_t, pid, ++ struct old_timespec32 __user *, interval) ++{ ++ struct timespec64 t; ++ int retval = sched_rr_get_interval(pid, &t); ++ ++ if (retval == 0) ++ retval = put_old_timespec32(&t, interval); ++ return retval; ++} ++#endif ++ ++void sched_show_task(struct task_struct *p) ++{ ++ unsigned long free = 0; ++ int ppid; ++ ++ if (!try_get_task_stack(p)) ++ return; ++ ++ printk(KERN_INFO "%-15.15s %c", p->comm, task_state_to_char(p)); ++ ++ if (p->state == TASK_RUNNING) ++ printk(KERN_CONT " running task "); ++#ifdef CONFIG_DEBUG_STACK_USAGE ++ free = stack_not_used(p); ++#endif ++ ppid = 0; ++ rcu_read_lock(); ++ if (pid_alive(p)) ++ ppid = task_pid_nr(rcu_dereference(p->real_parent)); ++ rcu_read_unlock(); ++ printk(KERN_CONT "%5lu %5d %6d 0x%08lx\n", free, ++ task_pid_nr(p), ppid, ++ (unsigned long)task_thread_info(p)->flags); ++ ++ print_worker_info(KERN_INFO, p); ++ show_stack(p, NULL); ++ put_task_stack(p); ++} ++EXPORT_SYMBOL_GPL(sched_show_task); ++ ++static inline bool ++state_filter_match(unsigned long state_filter, struct task_struct *p) ++{ ++ /* no filter, everything matches */ ++ if (!state_filter) ++ return true; ++ ++ /* filter, but doesn't match */ ++ if (!(p->state & state_filter)) ++ return false; ++ ++ /* ++ * When looking for TASK_UNINTERRUPTIBLE skip TASK_IDLE (allows ++ * TASK_KILLABLE). ++ */ ++ if (state_filter == TASK_UNINTERRUPTIBLE && p->state == TASK_IDLE) ++ return false; ++ ++ return true; ++} ++ ++void show_state_filter(unsigned long state_filter) ++{ ++ struct task_struct *g, *p; ++ ++#if BITS_PER_LONG == 32 ++ printk(KERN_INFO ++ " task PC stack pid father\n"); ++#else ++ printk(KERN_INFO ++ " task PC stack pid father\n"); ++#endif ++ rcu_read_lock(); ++ for_each_process_thread(g, p) { ++ /* ++ * reset the NMI-timeout, listing all files on a slow ++ * console might take a lot of time: ++ * Also, reset softlockup watchdogs on all CPUs, because ++ * another CPU might be blocked waiting for us to process ++ * an IPI. ++ */ ++ touch_nmi_watchdog(); ++ touch_all_softlockup_watchdogs(); ++ if (state_filter_match(state_filter, p)) ++ sched_show_task(p); ++ } ++ ++ rcu_read_unlock(); ++ /* ++ * Only show locks if all tasks are dumped: ++ */ ++ if (!state_filter) ++ debug_show_all_locks(); ++} ++ ++void dump_cpu_task(int cpu) ++{ ++ pr_info("Task dump for CPU %d:\n", cpu); ++ sched_show_task(cpu_curr(cpu)); ++} ++ ++#ifdef CONFIG_SMP ++void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask) ++{ ++ cpumask_copy(&p->cpus_allowed, new_mask); ++ p->nr_cpus_allowed = cpumask_weight(new_mask); ++} ++ ++void __do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) ++{ ++ struct rq *rq = task_rq(p); ++ ++ lockdep_assert_held(&p->pi_lock); ++ ++ cpumask_copy(&p->cpus_allowed, new_mask); ++ ++ if (task_queued(p)) { ++ /* ++ * Because __kthread_bind() calls this on blocked tasks without ++ * holding rq->lock. ++ */ ++ lockdep_assert_held(rq->lock); ++ } ++} ++ ++/* ++ * Calling do_set_cpus_allowed from outside the scheduler code should not be ++ * called on a running or queued task. We should be holding pi_lock. ++ */ ++void do_set_cpus_allowed(struct task_struct *p, const struct cpumask *new_mask) ++{ ++ __do_set_cpus_allowed(p, new_mask); ++ if (needs_other_cpu(p, task_cpu(p))) { ++ struct rq *rq; ++ ++ rq = __task_rq_lock(p, NULL); ++ set_task_cpu(p, valid_task_cpu(p)); ++ resched_task(p); ++ __task_rq_unlock(rq, NULL); ++ } ++} ++#endif ++ ++/** ++ * init_idle - set up an idle thread for a given CPU ++ * @idle: task in question ++ * @cpu: cpu the idle task belongs to ++ * ++ * NOTE: this function does not set the idle thread's NEED_RESCHED ++ * flag, to make booting more robust. ++ */ ++void init_idle(struct task_struct *idle, int cpu) ++{ ++ struct rq *rq = cpu_rq(cpu); ++ unsigned long flags; ++ ++ raw_spin_lock_irqsave(&idle->pi_lock, flags); ++ raw_spin_lock(rq->lock); ++ idle->last_ran = rq->niffies; ++ time_slice_expired(idle, rq); ++ idle->state = TASK_RUNNING; ++ /* Setting prio to illegal value shouldn't matter when never queued */ ++ idle->prio = PRIO_LIMIT; ++ ++ kasan_unpoison_task_stack(idle); ++ ++#ifdef CONFIG_SMP ++ /* ++ * It's possible that init_idle() gets called multiple times on a task, ++ * in that case do_set_cpus_allowed() will not do the right thing. ++ * ++ * And since this is boot we can forgo the serialisation. ++ */ ++ set_cpus_allowed_common(idle, cpumask_of(cpu)); ++#ifdef CONFIG_SMT_NICE ++ idle->smt_bias = 0; ++#endif ++#endif ++ set_rq_task(rq, idle); ++ ++ /* Silence PROVE_RCU */ ++ rcu_read_lock(); ++ set_task_cpu(idle, cpu); ++ rcu_read_unlock(); ++ ++ rq->curr = rq->idle = idle; ++ idle->on_rq = TASK_ON_RQ_QUEUED; ++ raw_spin_unlock(rq->lock); ++ raw_spin_unlock_irqrestore(&idle->pi_lock, flags); ++ ++ /* Set the preempt count _outside_ the spinlocks! */ ++ init_idle_preempt_count(idle, cpu); ++ ++ ftrace_graph_init_idle_task(idle, cpu); ++ vtime_init_idle(idle, cpu); ++#ifdef CONFIG_SMP ++ sprintf(idle->comm, "%s/%d", INIT_TASK_COMM, cpu); ++#endif ++} ++ ++int cpuset_cpumask_can_shrink(const struct cpumask __maybe_unused *cur, ++ const struct cpumask __maybe_unused *trial) ++{ ++ return 1; ++} ++ ++int task_can_attach(struct task_struct *p, ++ const struct cpumask *cs_cpus_allowed) ++{ ++ int ret = 0; ++ ++ /* ++ * Kthreads which disallow setaffinity shouldn't be moved ++ * to a new cpuset; we don't want to change their CPU ++ * affinity and isolating such threads by their set of ++ * allowed nodes is unnecessary. Thus, cpusets are not ++ * applicable for such threads. This prevents checking for ++ * success of set_cpus_allowed_ptr() on all attached tasks ++ * before cpus_allowed may be changed. ++ */ ++ if (p->flags & PF_NO_SETAFFINITY) ++ ret = -EINVAL; ++ ++ return ret; ++} ++ ++void resched_cpu(int cpu) ++{ ++ struct rq *rq = cpu_rq(cpu); ++ struct rq_flags rf; ++ ++ rq_lock_irqsave(rq, &rf); ++ if (cpu_online(cpu) || cpu == smp_processor_id()) ++ resched_curr(rq); ++ rq_unlock_irqrestore(rq, &rf); ++} ++ ++#ifdef CONFIG_SMP ++#ifdef CONFIG_NO_HZ_COMMON ++void nohz_balance_enter_idle(int cpu) ++{ ++} ++ ++void select_nohz_load_balancer(int stop_tick) ++{ ++} ++ ++void set_cpu_sd_state_idle(void) {} ++ ++/* ++ * In the semi idle case, use the nearest busy CPU for migrating timers ++ * from an idle CPU. This is good for power-savings. ++ * ++ * We don't do similar optimization for completely idle system, as ++ * selecting an idle CPU will add more delays to the timers than intended ++ * (as that CPU's timer base may not be uptodate wrt jiffies etc). ++ */ ++int get_nohz_timer_target(void) ++{ ++ int i, cpu = smp_processor_id(); ++ struct sched_domain *sd; ++ ++ if (!idle_cpu(cpu) && housekeeping_cpu(cpu, HK_FLAG_TIMER)) ++ return cpu; ++ ++ rcu_read_lock(); ++ for_each_domain(cpu, sd) { ++ for_each_cpu(i, sched_domain_span(sd)) { ++ if (cpu == i) ++ continue; ++ ++ if (!idle_cpu(i) && housekeeping_cpu(i, HK_FLAG_TIMER)) { ++ cpu = i; ++ cpu = i; ++ goto unlock; ++ } ++ } ++ } ++ ++ if (!housekeeping_cpu(cpu, HK_FLAG_TIMER)) ++ cpu = housekeeping_any_cpu(HK_FLAG_TIMER); ++unlock: ++ rcu_read_unlock(); ++ return cpu; ++} ++ ++/* ++ * When add_timer_on() enqueues a timer into the timer wheel of an ++ * idle CPU then this timer might expire before the next timer event ++ * which is scheduled to wake up that CPU. In case of a completely ++ * idle system the next event might even be infinite time into the ++ * future. wake_up_idle_cpu() ensures that the CPU is woken up and ++ * leaves the inner idle loop so the newly added timer is taken into ++ * account when the CPU goes back to idle and evaluates the timer ++ * wheel for the next timer event. ++ */ ++void wake_up_idle_cpu(int cpu) ++{ ++ if (cpu == smp_processor_id()) ++ return; ++ ++ if (set_nr_and_not_polling(cpu_rq(cpu)->idle)) ++ smp_sched_reschedule(cpu); ++ else ++ trace_sched_wake_idle_without_ipi(cpu); ++} ++ ++static bool wake_up_full_nohz_cpu(int cpu) ++{ ++ /* ++ * We just need the target to call irq_exit() and re-evaluate ++ * the next tick. The nohz full kick at least implies that. ++ * If needed we can still optimize that later with an ++ * empty IRQ. ++ */ ++ if (cpu_is_offline(cpu)) ++ return true; /* Don't try to wake offline CPUs. */ ++ if (tick_nohz_full_cpu(cpu)) { ++ if (cpu != smp_processor_id() || ++ tick_nohz_tick_stopped()) ++ tick_nohz_full_kick_cpu(cpu); ++ return true; ++ } ++ ++ return false; ++} ++ ++/* ++ * Wake up the specified CPU. If the CPU is going offline, it is the ++ * caller's responsibility to deal with the lost wakeup, for example, ++ * by hooking into the CPU_DEAD notifier like timers and hrtimers do. ++ */ ++void wake_up_nohz_cpu(int cpu) ++{ ++ if (!wake_up_full_nohz_cpu(cpu)) ++ wake_up_idle_cpu(cpu); ++} ++#endif /* CONFIG_NO_HZ_COMMON */ ++ ++/* ++ * Change a given task's CPU affinity. Migrate the thread to a ++ * proper CPU and schedule it away if the CPU it's executing on ++ * is removed from the allowed bitmask. ++ * ++ * NOTE: the caller must have a valid reference to the task, the ++ * task must not exit() & deallocate itself prematurely. The ++ * call is not atomic; no spinlocks may be held. ++ */ ++static int __set_cpus_allowed_ptr(struct task_struct *p, ++ const struct cpumask *new_mask, bool check) ++{ ++ const struct cpumask *cpu_valid_mask = cpu_active_mask; ++ bool queued = false, running_wrong = false, kthread; ++ struct cpumask old_mask; ++ struct rq_flags rf; ++ int cpu, ret = 0; ++ struct rq *rq; ++ ++ rq = task_rq_lock(p, &rf); ++ update_rq_clock(rq); ++ ++ kthread = !!(p->flags & PF_KTHREAD); ++ if (kthread) { ++ /* ++ * Kernel threads are allowed on online && !active CPUs ++ */ ++ cpu_valid_mask = cpu_online_mask; ++ } ++ ++ /* ++ * Must re-check here, to close a race against __kthread_bind(), ++ * sched_setaffinity() is not guaranteed to observe the flag. ++ */ ++ if (check && (p->flags & PF_NO_SETAFFINITY)) { ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ cpumask_copy(&old_mask, &p->cpus_allowed); ++ if (cpumask_equal(&old_mask, new_mask)) ++ goto out; ++ ++ if (!cpumask_intersects(new_mask, cpu_valid_mask)) { ++ ret = -EINVAL; ++ goto out; ++ } ++ ++ queued = task_queued(p); ++ __do_set_cpus_allowed(p, new_mask); ++ ++ if (kthread) { ++ /* ++ * For kernel threads that do indeed end up on online && ++ * !active we want to ensure they are strict per-CPU threads. ++ */ ++ WARN_ON(cpumask_intersects(new_mask, cpu_online_mask) && ++ !cpumask_intersects(new_mask, cpu_active_mask) && ++ p->nr_cpus_allowed != 1); ++ } ++ ++ /* Can the task run on the task's current CPU? If so, we're done */ ++ if (cpumask_test_cpu(task_cpu(p), new_mask)) ++ goto out; ++ ++ if (task_running(rq, p)) { ++ /* Task is running on the wrong cpu now, reschedule it. */ ++ if (rq == this_rq()) { ++ cpu = cpumask_any_and(cpu_valid_mask, new_mask); ++ set_task_cpu(p, cpu); ++ set_tsk_need_resched(p); ++ running_wrong = true; ++ } else ++ resched_task(p); ++ } else { ++ cpu = cpumask_any_and(cpu_valid_mask, new_mask); ++ if (queued) { ++ /* ++ * Switch runqueue locks after dequeueing the task ++ * here while still holding the pi_lock to be holding ++ * the correct lock for enqueueing. ++ */ ++ dequeue_task(rq, p, 0); ++ rq_unlock(rq); ++ ++ rq = cpu_rq(cpu); ++ rq_lock(rq); ++ } ++ set_task_cpu(p, cpu); ++ if (queued) ++ enqueue_task(rq, p, 0); ++ } ++ if (queued) ++ try_preempt(p, rq); ++ if (running_wrong) ++ preempt_disable(); ++out: ++ task_rq_unlock(rq, p, &rf); ++ ++ if (running_wrong) { ++ __schedule(true); ++ preempt_enable(); ++ } ++ ++ return ret; ++} ++ ++int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask) ++{ ++ return __set_cpus_allowed_ptr(p, new_mask, false); ++} ++EXPORT_SYMBOL_GPL(set_cpus_allowed_ptr); ++ ++#ifdef CONFIG_HOTPLUG_CPU ++/* ++ * Run through task list and find tasks affined to the dead cpu, then remove ++ * that cpu from the list, enable cpu0 and set the zerobound flag. Must hold ++ * cpu 0 and src_cpu's runqueue locks. ++ */ ++static void bind_zero(int src_cpu) ++{ ++ struct task_struct *p, *t; ++ struct rq *rq0; ++ int bound = 0; ++ ++ if (src_cpu == 0) ++ return; ++ ++ rq0 = cpu_rq(0); ++ ++ do_each_thread(t, p) { ++ if (cpumask_test_cpu(src_cpu, &p->cpus_allowed)) { ++ bool local = (task_cpu(p) == src_cpu); ++ struct rq *rq = task_rq(p); ++ ++ /* task_running is the cpu stopper thread */ ++ if (local && task_running(rq, p)) ++ continue; ++ atomic_clear_cpu(src_cpu, &p->cpus_allowed); ++ atomic_set_cpu(0, &p->cpus_allowed); ++ p->zerobound = true; ++ bound++; ++ if (local) { ++ bool queued = task_queued(p); ++ ++ if (queued) ++ dequeue_task(rq, p, 0); ++ set_task_cpu(p, 0); ++ if (queued) ++ enqueue_task(rq0, p, 0); ++ } ++ } ++ } while_each_thread(t, p); ++ ++ if (bound) { ++ printk(KERN_INFO "Removed affinity for %d processes to cpu %d\n", ++ bound, src_cpu); ++ } ++} ++ ++/* Find processes with the zerobound flag and reenable their affinity for the ++ * CPU coming alive. */ ++static void unbind_zero(int src_cpu) ++{ ++ int unbound = 0, zerobound = 0; ++ struct task_struct *p, *t; ++ ++ if (src_cpu == 0) ++ return; ++ ++ do_each_thread(t, p) { ++ if (!p->mm) ++ p->zerobound = false; ++ if (p->zerobound) { ++ unbound++; ++ cpumask_set_cpu(src_cpu, &p->cpus_allowed); ++ /* Once every CPU affinity has been re-enabled, remove ++ * the zerobound flag */ ++ if (cpumask_subset(cpu_possible_mask, &p->cpus_allowed)) { ++ p->zerobound = false; ++ zerobound++; ++ } ++ } ++ } while_each_thread(t, p); ++ ++ if (unbound) { ++ printk(KERN_INFO "Added affinity for %d processes to cpu %d\n", ++ unbound, src_cpu); ++ } ++ if (zerobound) { ++ printk(KERN_INFO "Released forced binding to cpu0 for %d processes\n", ++ zerobound); ++ } ++} ++ ++/* ++ * Ensure that the idle task is using init_mm right before its cpu goes ++ * offline. ++ */ ++void idle_task_exit(void) ++{ ++ struct mm_struct *mm = current->active_mm; ++ ++ BUG_ON(cpu_online(smp_processor_id())); ++ ++ if (mm != &init_mm) { ++ switch_mm(mm, &init_mm, current); ++ current->active_mm = &init_mm; ++ finish_arch_post_lock_switch(); ++ } ++ mmdrop(mm); ++} ++#else /* CONFIG_HOTPLUG_CPU */ ++static void unbind_zero(int src_cpu) {} ++#endif /* CONFIG_HOTPLUG_CPU */ ++ ++void sched_set_stop_task(int cpu, struct task_struct *stop) ++{ ++ struct sched_param stop_param = { .sched_priority = STOP_PRIO }; ++ struct sched_param start_param = { .sched_priority = 0 }; ++ struct task_struct *old_stop = cpu_rq(cpu)->stop; ++ ++ if (stop) { ++ /* ++ * Make it appear like a SCHED_FIFO task, its something ++ * userspace knows about and won't get confused about. ++ * ++ * Also, it will make PI more or less work without too ++ * much confusion -- but then, stop work should not ++ * rely on PI working anyway. ++ */ ++ sched_setscheduler_nocheck(stop, SCHED_FIFO, &stop_param); ++ } ++ ++ cpu_rq(cpu)->stop = stop; ++ ++ if (old_stop) { ++ /* ++ * Reset it back to a normal scheduling policy so that ++ * it can die in pieces. ++ */ ++ sched_setscheduler_nocheck(old_stop, SCHED_NORMAL, &start_param); ++ } ++} ++ ++#if defined(CONFIG_SCHED_DEBUG) && defined(CONFIG_SYSCTL) ++ ++static struct ctl_table sd_ctl_dir[] = { ++ { ++ .procname = "sched_domain", ++ .mode = 0555, ++ }, ++ {} ++}; ++ ++static struct ctl_table sd_ctl_root[] = { ++ { ++ .procname = "kernel", ++ .mode = 0555, ++ .child = sd_ctl_dir, ++ }, ++ {} ++}; ++ ++static struct ctl_table *sd_alloc_ctl_entry(int n) ++{ ++ struct ctl_table *entry = ++ kcalloc(n, sizeof(struct ctl_table), GFP_KERNEL); ++ ++ return entry; ++} ++ ++static void sd_free_ctl_entry(struct ctl_table **tablep) ++{ ++ struct ctl_table *entry; ++ ++ /* ++ * In the intermediate directories, both the child directory and ++ * procname are dynamically allocated and could fail but the mode ++ * will always be set. In the lowest directory the names are ++ * static strings and all have proc handlers. ++ */ ++ for (entry = *tablep; entry->mode; entry++) { ++ if (entry->child) ++ sd_free_ctl_entry(&entry->child); ++ if (entry->proc_handler == NULL) ++ kfree(entry->procname); ++ } ++ ++ kfree(*tablep); ++ *tablep = NULL; ++} ++ ++#define CPU_LOAD_IDX_MAX 5 ++static int min_load_idx = 0; ++static int max_load_idx = CPU_LOAD_IDX_MAX-1; ++ ++static void ++set_table_entry(struct ctl_table *entry, ++ const char *procname, void *data, int maxlen, ++ umode_t mode, proc_handler *proc_handler, ++ bool load_idx) ++{ ++ entry->procname = procname; ++ entry->data = data; ++ entry->maxlen = maxlen; ++ entry->mode = mode; ++ entry->proc_handler = proc_handler; ++ ++ if (load_idx) { ++ entry->extra1 = &min_load_idx; ++ entry->extra2 = &max_load_idx; ++ } ++} ++ ++static struct ctl_table * ++sd_alloc_ctl_domain_table(struct sched_domain *sd) ++{ ++ struct ctl_table *table = sd_alloc_ctl_entry(14); ++ ++ if (table == NULL) ++ return NULL; ++ ++ set_table_entry(&table[0], "min_interval", &sd->min_interval, ++ sizeof(long), 0644, proc_doulongvec_minmax, false); ++ set_table_entry(&table[1], "max_interval", &sd->max_interval, ++ sizeof(long), 0644, proc_doulongvec_minmax, false); ++ set_table_entry(&table[2], "busy_idx", &sd->busy_idx, ++ sizeof(int), 0644, proc_dointvec_minmax, true); ++ set_table_entry(&table[3], "idle_idx", &sd->idle_idx, ++ sizeof(int), 0644, proc_dointvec_minmax, true); ++ set_table_entry(&table[4], "newidle_idx", &sd->newidle_idx, ++ sizeof(int), 0644, proc_dointvec_minmax, true); ++ set_table_entry(&table[5], "wake_idx", &sd->wake_idx, ++ sizeof(int), 0644, proc_dointvec_minmax, true); ++ set_table_entry(&table[6], "forkexec_idx", &sd->forkexec_idx, ++ sizeof(int), 0644, proc_dointvec_minmax, true); ++ set_table_entry(&table[7], "busy_factor", &sd->busy_factor, ++ sizeof(int), 0644, proc_dointvec_minmax, false); ++ set_table_entry(&table[8], "imbalance_pct", &sd->imbalance_pct, ++ sizeof(int), 0644, proc_dointvec_minmax, false); ++ set_table_entry(&table[9], "cache_nice_tries", ++ &sd->cache_nice_tries, ++ sizeof(int), 0644, proc_dointvec_minmax, false); ++ set_table_entry(&table[10], "flags", &sd->flags, ++ sizeof(int), 0644, proc_dointvec_minmax, false); ++ set_table_entry(&table[11], "max_newidle_lb_cost", ++ &sd->max_newidle_lb_cost, ++ sizeof(long), 0644, proc_doulongvec_minmax, false); ++ set_table_entry(&table[12], "name", sd->name, ++ CORENAME_MAX_SIZE, 0444, proc_dostring, false); ++ /* &table[13] is terminator */ ++ ++ return table; ++} ++ ++static struct ctl_table *sd_alloc_ctl_cpu_table(int cpu) ++{ ++ struct ctl_table *entry, *table; ++ struct sched_domain *sd; ++ int domain_num = 0, i; ++ char buf[32]; ++ ++ for_each_domain(cpu, sd) ++ domain_num++; ++ entry = table = sd_alloc_ctl_entry(domain_num + 1); ++ if (table == NULL) ++ return NULL; ++ ++ i = 0; ++ for_each_domain(cpu, sd) { ++ snprintf(buf, 32, "domain%d", i); ++ entry->procname = kstrdup(buf, GFP_KERNEL); ++ entry->mode = 0555; ++ entry->child = sd_alloc_ctl_domain_table(sd); ++ entry++; ++ i++; ++ } ++ return table; ++} ++ ++static cpumask_var_t sd_sysctl_cpus; ++static struct ctl_table_header *sd_sysctl_header; ++ ++void register_sched_domain_sysctl(void) ++{ ++ static struct ctl_table *cpu_entries; ++ static struct ctl_table **cpu_idx; ++ char buf[32]; ++ int i; ++ ++ if (!cpu_entries) { ++ cpu_entries = sd_alloc_ctl_entry(num_possible_cpus() + 1); ++ if (!cpu_entries) ++ return; ++ ++ WARN_ON(sd_ctl_dir[0].child); ++ sd_ctl_dir[0].child = cpu_entries; ++ } ++ ++ if (!cpu_idx) { ++ struct ctl_table *e = cpu_entries; ++ ++ cpu_idx = kcalloc(nr_cpu_ids, sizeof(struct ctl_table*), GFP_KERNEL); ++ if (!cpu_idx) ++ return; ++ ++ /* deal with sparse possible map */ ++ for_each_possible_cpu(i) { ++ cpu_idx[i] = e; ++ e++; ++ } ++ } ++ ++ if (!cpumask_available(sd_sysctl_cpus)) { ++ if (!alloc_cpumask_var(&sd_sysctl_cpus, GFP_KERNEL)) ++ return; ++ ++ /* init to possible to not have holes in @cpu_entries */ ++ cpumask_copy(sd_sysctl_cpus, cpu_possible_mask); ++ } ++ ++ for_each_cpu(i, sd_sysctl_cpus) { ++ struct ctl_table *e = cpu_idx[i]; ++ ++ if (e->child) ++ sd_free_ctl_entry(&e->child); ++ ++ if (!e->procname) { ++ snprintf(buf, 32, "cpu%d", i); ++ e->procname = kstrdup(buf, GFP_KERNEL); ++ } ++ e->mode = 0555; ++ e->child = sd_alloc_ctl_cpu_table(i); ++ ++ __cpumask_clear_cpu(i, sd_sysctl_cpus); ++ } ++ ++ WARN_ON(sd_sysctl_header); ++ sd_sysctl_header = register_sysctl_table(sd_ctl_root); ++} ++ ++void dirty_sched_domain_sysctl(int cpu) ++{ ++ if (cpumask_available(sd_sysctl_cpus)) ++ __cpumask_set_cpu(cpu, sd_sysctl_cpus); ++} ++ ++/* may be called multiple times per register */ ++void unregister_sched_domain_sysctl(void) ++{ ++ unregister_sysctl_table(sd_sysctl_header); ++ sd_sysctl_header = NULL; ++} ++#endif /* CONFIG_SYSCTL */ ++ ++void set_rq_online(struct rq *rq) ++{ ++ if (!rq->online) { ++ cpumask_set_cpu(cpu_of(rq), rq->rd->online); ++ rq->online = true; ++ } ++} ++ ++void set_rq_offline(struct rq *rq) ++{ ++ if (rq->online) { ++ int cpu = cpu_of(rq); ++ ++ cpumask_clear_cpu(cpu, rq->rd->online); ++ rq->online = false; ++ clear_cpuidle_map(cpu); ++ } ++} ++ ++/* ++ * used to mark begin/end of suspend/resume: ++ */ ++static int num_cpus_frozen; ++ ++/* ++ * Update cpusets according to cpu_active mask. If cpusets are ++ * disabled, cpuset_update_active_cpus() becomes a simple wrapper ++ * around partition_sched_domains(). ++ * ++ * If we come here as part of a suspend/resume, don't touch cpusets because we ++ * want to restore it back to its original state upon resume anyway. ++ */ ++static void cpuset_cpu_active(void) ++{ ++ if (cpuhp_tasks_frozen) { ++ /* ++ * num_cpus_frozen tracks how many CPUs are involved in suspend ++ * resume sequence. As long as this is not the last online ++ * operation in the resume sequence, just build a single sched ++ * domain, ignoring cpusets. ++ */ ++ partition_sched_domains(1, NULL, NULL); ++ if (--num_cpus_frozen) ++ return; ++ /* ++ * This is the last CPU online operation. So fall through and ++ * restore the original sched domains by considering the ++ * cpuset configurations. ++ */ ++ cpuset_force_rebuild(); ++ } ++ ++ cpuset_update_active_cpus(); ++} ++ ++static int cpuset_cpu_inactive(unsigned int cpu) ++{ ++ if (!cpuhp_tasks_frozen) { ++ cpuset_update_active_cpus(); ++ } else { ++ num_cpus_frozen++; ++ partition_sched_domains(1, NULL, NULL); ++ } ++ return 0; ++} ++ ++int sched_cpu_activate(unsigned int cpu) ++{ ++ struct rq *rq = cpu_rq(cpu); ++ struct rq_flags rf; ++ ++ set_cpu_active(cpu, true); ++ ++ if (sched_smp_initialized) { ++ sched_domains_numa_masks_set(cpu); ++ cpuset_cpu_active(); ++ } ++ ++ /* ++ * Put the rq online, if not already. This happens: ++ * ++ * 1) In the early boot process, because we build the real domains ++ * after all CPUs have been brought up. ++ * ++ * 2) At runtime, if cpuset_cpu_active() fails to rebuild the ++ * domains. ++ */ ++ rq_lock_irqsave(rq, &rf); ++ if (rq->rd) { ++ BUG_ON(!cpumask_test_cpu(cpu, rq->rd->span)); ++ set_rq_online(rq); ++ } ++ unbind_zero(cpu); ++ rq_unlock_irqrestore(rq, &rf); ++ ++ return 0; ++} ++ ++int sched_cpu_deactivate(unsigned int cpu) ++{ ++ int ret; ++ ++ set_cpu_active(cpu, false); ++ /* ++ * We've cleared cpu_active_mask, wait for all preempt-disabled and RCU ++ * users of this state to go away such that all new such users will ++ * observe it. ++ * ++ * Do sync before park smpboot threads to take care the rcu boost case. ++ */ ++ synchronize_rcu(); ++ ++ if (!sched_smp_initialized) ++ return 0; ++ ++ ret = cpuset_cpu_inactive(cpu); ++ if (ret) { ++ set_cpu_active(cpu, true); ++ return ret; ++ } ++ sched_domains_numa_masks_clear(cpu); ++ return 0; ++} ++ ++int sched_cpu_starting(unsigned int cpu) ++{ ++ sched_tick_start(cpu); ++ return 0; ++} ++ ++#ifdef CONFIG_HOTPLUG_CPU ++int sched_cpu_dying(unsigned int cpu) ++{ ++ struct rq *rq = cpu_rq(cpu); ++ unsigned long flags; ++ ++ /* Handle pending wakeups and then migrate everything off */ ++ sched_ttwu_pending(); ++ sched_tick_stop(cpu); ++ ++ local_irq_save(flags); ++ double_rq_lock(rq, cpu_rq(0)); ++ if (rq->rd) { ++ BUG_ON(!cpumask_test_cpu(cpu, rq->rd->span)); ++ set_rq_offline(rq); ++ } ++ bind_zero(cpu); ++ double_rq_unlock(rq, cpu_rq(0)); ++ sched_start_tick(rq, cpu); ++ hrexpiry_clear(rq); ++ local_irq_restore(flags); ++ ++ return 0; ++} ++#endif ++ ++#if defined(CONFIG_SCHED_SMT) || defined(CONFIG_SCHED_MC) ++/* ++ * Cheaper version of the below functions in case support for SMT and MC is ++ * compiled in but CPUs have no siblings. ++ */ ++static bool sole_cpu_idle(struct rq *rq) ++{ ++ return rq_idle(rq); ++} ++#endif ++#ifdef CONFIG_SCHED_SMT ++static const cpumask_t *thread_cpumask(int cpu) ++{ ++ return topology_sibling_cpumask(cpu); ++} ++/* All this CPU's SMT siblings are idle */ ++static bool siblings_cpu_idle(struct rq *rq) ++{ ++ return cpumask_subset(&rq->thread_mask, &cpu_idle_map); ++} ++#endif ++#ifdef CONFIG_SCHED_MC ++static const cpumask_t *core_cpumask(int cpu) ++{ ++ return topology_core_cpumask(cpu); ++} ++/* All this CPU's shared cache siblings are idle */ ++static bool cache_cpu_idle(struct rq *rq) ++{ ++ return cpumask_subset(&rq->core_mask, &cpu_idle_map); ++} ++#endif ++ ++enum sched_domain_level { ++ SD_LV_NONE = 0, ++ SD_LV_SIBLING, ++ SD_LV_MC, ++ SD_LV_BOOK, ++ SD_LV_CPU, ++ SD_LV_NODE, ++ SD_LV_ALLNODES, ++ SD_LV_MAX ++}; ++ ++void __init sched_init_smp(void) ++{ ++ struct rq *rq, *other_rq, *leader = cpu_rq(0); ++ struct sched_domain *sd; ++ int cpu, other_cpu, i; ++#ifdef CONFIG_SCHED_SMT ++ bool smt_threads = false; ++#endif ++ sched_init_numa(); ++ ++ /* ++ * There's no userspace yet to cause hotplug operations; hence all the ++ * cpu masks are stable and all blatant races in the below code cannot ++ * happen. ++ */ ++ mutex_lock(&sched_domains_mutex); ++ sched_init_domains(cpu_active_mask); ++ mutex_unlock(&sched_domains_mutex); ++ ++ /* Move init over to a non-isolated CPU */ ++ if (set_cpus_allowed_ptr(current, housekeeping_cpumask(HK_FLAG_DOMAIN)) < 0) ++ BUG(); ++ ++ local_irq_disable(); ++ mutex_lock(&sched_domains_mutex); ++ lock_all_rqs(); ++ /* ++ * Set up the relative cache distance of each online cpu from each ++ * other in a simple array for quick lookup. Locality is determined ++ * by the closest sched_domain that CPUs are separated by. CPUs with ++ * shared cache in SMT and MC are treated as local. Separate CPUs ++ * (within the same package or physically) within the same node are ++ * treated as not local. CPUs not even in the same domain (different ++ * nodes) are treated as very distant. ++ */ ++ for_each_online_cpu(cpu) { ++ rq = cpu_rq(cpu); ++ ++ /* First check if this cpu is in the same node */ ++ for_each_domain(cpu, sd) { ++ if (sd->level > SD_LV_MC) ++ continue; ++ if (rqshare != RQSHARE_ALL) ++ leader = NULL; ++ /* Set locality to local node if not already found lower */ ++ for_each_cpu(other_cpu, sched_domain_span(sd)) { ++ if (rqshare >= RQSHARE_SMP) { ++ other_rq = cpu_rq(other_cpu); ++ ++ /* Set the smp_leader to the first CPU */ ++ if (!leader) ++ leader = rq; ++ other_rq->smp_leader = leader; ++ } ++ ++ if (rq->cpu_locality[other_cpu] > 3) ++ rq->cpu_locality[other_cpu] = 3; ++ } ++ } ++ ++ /* ++ * Each runqueue has its own function in case it doesn't have ++ * siblings of its own allowing mixed topologies. ++ */ ++#ifdef CONFIG_SCHED_MC ++ leader = NULL; ++ if (cpumask_weight(core_cpumask(cpu)) > 1) { ++ cpumask_copy(&rq->core_mask, core_cpumask(cpu)); ++ cpumask_clear_cpu(cpu, &rq->core_mask); ++ for_each_cpu(other_cpu, core_cpumask(cpu)) { ++ if (rqshare == RQSHARE_MC) { ++ other_rq = cpu_rq(other_cpu); ++ ++ /* Set the mc_leader to the first CPU */ ++ if (!leader) ++ leader = rq; ++ other_rq->mc_leader = leader; ++ } ++ if (rq->cpu_locality[other_cpu] > 2) ++ rq->cpu_locality[other_cpu] = 2; ++ } ++ rq->cache_idle = cache_cpu_idle; ++ } ++#endif ++#ifdef CONFIG_SCHED_SMT ++ leader = NULL; ++ if (cpumask_weight(thread_cpumask(cpu)) > 1) { ++ cpumask_copy(&rq->thread_mask, thread_cpumask(cpu)); ++ cpumask_clear_cpu(cpu, &rq->thread_mask); ++ for_each_cpu(other_cpu, thread_cpumask(cpu)) { ++ if (rqshare == RQSHARE_SMT) { ++ other_rq = cpu_rq(other_cpu); ++ ++ /* Set the smt_leader to the first CPU */ ++ if (!leader) ++ leader = rq; ++ other_rq->smt_leader = leader; ++ } ++ if (rq->cpu_locality[other_cpu] > 1) ++ rq->cpu_locality[other_cpu] = 1; ++ } ++ rq->siblings_idle = siblings_cpu_idle; ++ smt_threads = true; ++ } ++#endif ++ } ++ ++#ifdef CONFIG_SMT_NICE ++ if (smt_threads) { ++ check_siblings = &check_smt_siblings; ++ wake_siblings = &wake_smt_siblings; ++ smt_schedule = &smt_should_schedule; ++ } ++#endif ++ unlock_all_rqs(); ++ mutex_unlock(&sched_domains_mutex); ++ ++ for_each_online_cpu(cpu) { ++ rq = cpu_rq(cpu); ++ ++ for_each_online_cpu(other_cpu) { ++ if (other_cpu <= cpu) ++ continue; ++ printk(KERN_DEBUG "MuQSS locality CPU %d to %d: %d\n", cpu, other_cpu, rq->cpu_locality[other_cpu]); ++ } ++ } ++ ++ for_each_online_cpu(cpu) { ++ rq = cpu_rq(cpu); ++ leader = rq->smp_leader; ++ ++ rq_lock(rq); ++ if (leader && rq != leader) { ++ printk(KERN_INFO "Sharing SMP runqueue from CPU %d to CPU %d\n", ++ leader->cpu, rq->cpu); ++ kfree(rq->node); ++ kfree(rq->sl); ++ kfree(rq->lock); ++ rq->node = leader->node; ++ rq->sl = leader->sl; ++ rq->lock = leader->lock; ++ barrier(); ++ /* To make up for not unlocking the freed runlock */ ++ preempt_enable(); ++ } else ++ rq_unlock(rq); ++ } ++ ++#ifdef CONFIG_SCHED_MC ++ for_each_online_cpu(cpu) { ++ rq = cpu_rq(cpu); ++ leader = rq->mc_leader; ++ ++ rq_lock(rq); ++ if (leader && rq != leader) { ++ printk(KERN_INFO "Sharing MC runqueue from CPU %d to CPU %d\n", ++ leader->cpu, rq->cpu); ++ kfree(rq->node); ++ kfree(rq->sl); ++ kfree(rq->lock); ++ rq->node = leader->node; ++ rq->sl = leader->sl; ++ rq->lock = leader->lock; ++ barrier(); ++ /* To make up for not unlocking the freed runlock */ ++ preempt_enable(); ++ } else ++ rq_unlock(rq); ++ } ++#endif /* CONFIG_SCHED_MC */ ++ ++#ifdef CONFIG_SCHED_SMT ++ for_each_online_cpu(cpu) { ++ rq = cpu_rq(cpu); ++ ++ leader = rq->smt_leader; ++ ++ rq_lock(rq); ++ if (leader && rq != leader) { ++ printk(KERN_INFO "Sharing SMT runqueue from CPU %d to CPU %d\n", ++ leader->cpu, rq->cpu); ++ kfree(rq->node); ++ kfree(rq->sl); ++ kfree(rq->lock); ++ rq->node = leader->node; ++ rq->sl = leader->sl; ++ rq->lock = leader->lock; ++ barrier(); ++ /* To make up for not unlocking the freed runlock */ ++ preempt_enable(); ++ } else ++ rq_unlock(rq); ++ } ++#endif /* CONFIG_SCHED_SMT */ ++ ++ local_irq_enable(); ++ ++ total_runqueues = 0; ++ for_each_possible_cpu(cpu) { ++ int locality, total_rqs = 0, total_cpus = 0; ++ ++ rq = cpu_rq(cpu); ++ if ( ++#ifdef CONFIG_SCHED_MC ++ (rq->mc_leader == rq) && ++#endif ++#ifdef CONFIG_SCHED_SMT ++ (rq->smt_leader == rq) && ++#endif ++ (rq->smp_leader == rq)) ++ total_runqueues++; ++ ++ for (locality = 0; locality <= 4; locality++) { ++ int test_cpu; ++ ++ for_each_possible_cpu(test_cpu) { ++ /* Work from each CPU up instead of every rq ++ * starting at CPU 0. Orders are better matched ++ * if the top half CPUs count down instead. */ ++ if (cpu < num_possible_cpus() / 2) ++ other_cpu = cpu + test_cpu; ++ else ++ other_cpu = cpu - test_cpu; ++ if (other_cpu < 0) ++ other_cpu += num_possible_cpus(); ++ else ++ other_cpu %= num_possible_cpus(); ++ other_rq = cpu_rq(other_cpu); ++ ++ if (rq->cpu_locality[other_cpu] == locality) { ++ rq->cpu_order[total_cpus++] = other_rq; ++ if ( ++ ++#ifdef CONFIG_SCHED_MC ++ (other_rq->mc_leader == other_rq) && ++#endif ++#ifdef CONFIG_SCHED_SMT ++ (other_rq->smt_leader == other_rq) && ++#endif ++ (other_rq->smp_leader == other_rq)) ++ rq->rq_order[total_rqs++] = other_rq; ++ } ++ } ++ } ++ } ++ ++ for_each_possible_cpu(cpu) { ++ rq = cpu_rq(cpu); ++ for (i = 0; i < total_runqueues; i++) { ++ printk(KERN_DEBUG "CPU %d RQ order %d RQ %d\n", cpu, i, ++ rq->rq_order[i]->cpu); ++ } ++ } ++ for_each_possible_cpu(cpu) { ++ rq = cpu_rq(cpu); ++ for (i = 0; i < num_possible_cpus(); i++) { ++ printk(KERN_DEBUG "CPU %d CPU order %d RQ %d\n", cpu, i, ++ rq->cpu_order[i]->cpu); ++ } ++ } ++ switch (rqshare) { ++ case RQSHARE_ALL: ++ /* This should only ever read 1 */ ++ printk(KERN_INFO "MuQSS runqueue share type ALL total runqueues: %d\n", ++ total_runqueues); ++ break; ++ case RQSHARE_SMP: ++ printk(KERN_INFO "MuQSS runqueue share type SMP total runqueues: %d\n", ++ total_runqueues); ++ break; ++ case RQSHARE_MC: ++ printk(KERN_INFO "MuQSS runqueue share type MC total runqueues: %d\n", ++ total_runqueues); ++ break; ++ case RQSHARE_SMT: ++ printk(KERN_INFO "MuQSS runqueue share type SMT total runqueues: %d\n", ++ total_runqueues); ++ break; ++ case RQSHARE_NONE: ++ printk(KERN_INFO "MuQSS runqueue share type NONE total runqueues: %d\n", ++ total_runqueues); ++ break; ++ } ++ ++ sched_smp_initialized = true; ++} ++#else ++void __init sched_init_smp(void) ++{ ++ sched_smp_initialized = true; ++} ++#endif /* CONFIG_SMP */ ++ ++int in_sched_functions(unsigned long addr) ++{ ++ return in_lock_functions(addr) || ++ (addr >= (unsigned long)__sched_text_start ++ && addr < (unsigned long)__sched_text_end); ++} ++ ++#ifdef CONFIG_CGROUP_SCHED ++/* task group related information */ ++struct task_group { ++ struct cgroup_subsys_state css; ++ ++ struct rcu_head rcu; ++ struct list_head list; ++ ++ struct task_group *parent; ++ struct list_head siblings; ++ struct list_head children; ++}; ++ ++/* ++ * Default task group. ++ * Every task in system belongs to this group at bootup. ++ */ ++struct task_group root_task_group; ++LIST_HEAD(task_groups); ++ ++/* Cacheline aligned slab cache for task_group */ ++static struct kmem_cache *task_group_cache __read_mostly; ++#endif /* CONFIG_CGROUP_SCHED */ ++ ++void __init sched_init(void) ++{ ++#ifdef CONFIG_SMP ++ int cpu_ids; ++#endif ++ int i; ++ struct rq *rq; ++ ++ wait_bit_init(); ++ ++ prio_ratios[0] = 128; ++ for (i = 1 ; i < NICE_WIDTH ; i++) ++ prio_ratios[i] = prio_ratios[i - 1] * 11 / 10; ++ ++ skiplist_node_init(&init_task.node); ++ ++#ifdef CONFIG_SMP ++ init_defrootdomain(); ++ cpumask_clear(&cpu_idle_map); ++#else ++ uprq = &per_cpu(runqueues, 0); ++#endif ++ ++#ifdef CONFIG_CGROUP_SCHED ++ task_group_cache = KMEM_CACHE(task_group, 0); ++ ++ list_add(&root_task_group.list, &task_groups); ++ INIT_LIST_HEAD(&root_task_group.children); ++ INIT_LIST_HEAD(&root_task_group.siblings); ++#endif /* CONFIG_CGROUP_SCHED */ ++ for_each_possible_cpu(i) { ++ rq = cpu_rq(i); ++ rq->node = kmalloc(sizeof(skiplist_node), GFP_ATOMIC); ++ skiplist_init(rq->node); ++ rq->sl = new_skiplist(rq->node); ++ rq->lock = kmalloc(sizeof(raw_spinlock_t), GFP_ATOMIC); ++ raw_spin_lock_init(rq->lock); ++ rq->nr_running = 0; ++ rq->nr_uninterruptible = 0; ++ rq->nr_switches = 0; ++ rq->clock = rq->old_clock = rq->last_niffy = rq->niffies = 0; ++ rq->last_jiffy = jiffies; ++ rq->user_ns = rq->nice_ns = rq->softirq_ns = rq->system_ns = ++ rq->iowait_ns = rq->idle_ns = 0; ++ rq->dither = 0; ++ set_rq_task(rq, &init_task); ++ rq->iso_ticks = 0; ++ rq->iso_refractory = false; ++#ifdef CONFIG_SMP ++ rq->smp_leader = rq; ++#ifdef CONFIG_SCHED_MC ++ rq->mc_leader = rq; ++#endif ++#ifdef CONFIG_SCHED_SMT ++ rq->smt_leader = rq; ++#endif ++ rq->sd = NULL; ++ rq->rd = NULL; ++ rq->online = false; ++ rq->cpu = i; ++ rq_attach_root(rq, &def_root_domain); ++#endif ++ init_rq_hrexpiry(rq); ++ atomic_set(&rq->nr_iowait, 0); ++ } ++ ++#ifdef CONFIG_SMP ++ cpu_ids = i; ++ /* ++ * Set the base locality for cpu cache distance calculation to ++ * "distant" (3). Make sure the distance from a CPU to itself is 0. ++ */ ++ for_each_possible_cpu(i) { ++ int j; ++ ++ rq = cpu_rq(i); ++#ifdef CONFIG_SCHED_SMT ++ rq->siblings_idle = sole_cpu_idle; ++#endif ++#ifdef CONFIG_SCHED_MC ++ rq->cache_idle = sole_cpu_idle; ++#endif ++ rq->cpu_locality = kmalloc(cpu_ids * sizeof(int *), GFP_ATOMIC); ++ for_each_possible_cpu(j) { ++ if (i == j) ++ rq->cpu_locality[j] = 0; ++ else ++ rq->cpu_locality[j] = 4; ++ } ++ rq->rq_order = kmalloc(cpu_ids * sizeof(struct rq *), GFP_ATOMIC); ++ rq->cpu_order = kmalloc(cpu_ids * sizeof(struct rq *), GFP_ATOMIC); ++ rq->rq_order[0] = rq->cpu_order[0] = rq; ++ for (j = 1; j < cpu_ids; j++) ++ rq->rq_order[j] = rq->cpu_order[j] = cpu_rq(j); ++ } ++#endif ++ ++ /* ++ * The boot idle thread does lazy MMU switching as well: ++ */ ++ mmgrab(&init_mm); ++ enter_lazy_tlb(&init_mm, current); ++ ++ /* ++ * Make us the idle thread. Technically, schedule() should not be ++ * called from this thread, however somewhere below it might be, ++ * but because we are the idle thread, we just pick up running again ++ * when this runqueue becomes "idle". ++ */ ++ init_idle(current, smp_processor_id()); ++ ++#ifdef CONFIG_SMP ++ idle_thread_set_boot_cpu(); ++#endif /* SMP */ ++ ++ init_schedstats(); ++ ++ psi_init(); ++} ++ ++#ifdef CONFIG_DEBUG_ATOMIC_SLEEP ++static inline int preempt_count_equals(int preempt_offset) ++{ ++ int nested = preempt_count() + rcu_preempt_depth(); ++ ++ return (nested == preempt_offset); ++} ++ ++void __might_sleep(const char *file, int line, int preempt_offset) ++{ ++ /* ++ * Blocking primitives will set (and therefore destroy) current->state, ++ * since we will exit with TASK_RUNNING make sure we enter with it, ++ * otherwise we will destroy state. ++ */ ++ WARN_ONCE(current->state != TASK_RUNNING && current->task_state_change, ++ "do not call blocking ops when !TASK_RUNNING; " ++ "state=%lx set at [<%p>] %pS\n", ++ current->state, ++ (void *)current->task_state_change, ++ (void *)current->task_state_change); ++ ++ ___might_sleep(file, line, preempt_offset); ++} ++EXPORT_SYMBOL(__might_sleep); ++ ++void __cant_sleep(const char *file, int line, int preempt_offset) ++{ ++ static unsigned long prev_jiffy; ++ ++ if (irqs_disabled()) ++ return; ++ ++ if (!IS_ENABLED(CONFIG_PREEMPT_COUNT)) ++ return; ++ ++ if (preempt_count() > preempt_offset) ++ return; ++ ++ if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy) ++ return; ++ prev_jiffy = jiffies; ++ ++ printk(KERN_ERR "BUG: assuming atomic context at %s:%d\n", file, line); ++ printk(KERN_ERR "in_atomic(): %d, irqs_disabled(): %d, pid: %d, name: %s\n", ++ in_atomic(), irqs_disabled(), ++ current->pid, current->comm); ++ ++ debug_show_held_locks(current); ++ dump_stack(); ++ add_taint(TAINT_WARN, LOCKDEP_STILL_OK); ++} ++EXPORT_SYMBOL_GPL(__cant_sleep); ++ ++void ___might_sleep(const char *file, int line, int preempt_offset) ++{ ++ /* Ratelimiting timestamp: */ ++ static unsigned long prev_jiffy; ++ ++ unsigned long preempt_disable_ip; ++ ++ /* WARN_ON_ONCE() by default, no rate limit required: */ ++ rcu_sleep_check(); ++ ++ if ((preempt_count_equals(preempt_offset) && !irqs_disabled() && ++ !is_idle_task(current)) || ++ system_state == SYSTEM_BOOTING || system_state > SYSTEM_RUNNING || ++ oops_in_progress) ++ return; ++ ++ if (time_before(jiffies, prev_jiffy + HZ) && prev_jiffy) ++ return; ++ prev_jiffy = jiffies; ++ ++ /* Save this before calling printk(), since that will clobber it: */ ++ preempt_disable_ip = get_preempt_disable_ip(current); ++ ++ printk(KERN_ERR ++ "BUG: sleeping function called from invalid context at %s:%d\n", ++ file, line); ++ printk(KERN_ERR ++ "in_atomic(): %d, irqs_disabled(): %d, pid: %d, name: %s\n", ++ in_atomic(), irqs_disabled(), ++ current->pid, current->comm); ++ ++ if (task_stack_end_corrupted(current)) ++ printk(KERN_EMERG "Thread overran stack, or stack corrupted\n"); ++ ++ debug_show_held_locks(current); ++ if (irqs_disabled()) ++ print_irqtrace_events(current); ++ if (IS_ENABLED(CONFIG_DEBUG_PREEMPT) ++ && !preempt_count_equals(preempt_offset)) { ++ pr_err("Preemption disabled at:"); ++ print_ip_sym(preempt_disable_ip); ++ pr_cont("\n"); ++ } ++ dump_stack(); ++ add_taint(TAINT_WARN, LOCKDEP_STILL_OK); ++} ++EXPORT_SYMBOL(___might_sleep); ++#endif ++ ++#ifdef CONFIG_MAGIC_SYSRQ ++static inline void normalise_rt_tasks(void) ++{ ++ struct task_struct *g, *p; ++ struct rq_flags rf; ++ struct rq *rq; ++ ++ read_lock(&tasklist_lock); ++ for_each_process_thread(g, p) { ++ /* ++ * Only normalize user tasks: ++ */ ++ if (p->flags & PF_KTHREAD) ++ continue; ++ ++ if (!rt_task(p) && !iso_task(p)) ++ continue; ++ ++ rq = task_rq_lock(p, &rf); ++ __setscheduler(p, rq, SCHED_NORMAL, 0, false); ++ task_rq_unlock(rq, p, &rf); ++ } ++ read_unlock(&tasklist_lock); ++} ++ ++void normalize_rt_tasks(void) ++{ ++ normalise_rt_tasks(); ++} ++#endif /* CONFIG_MAGIC_SYSRQ */ ++ ++#if defined(CONFIG_IA64) || defined(CONFIG_KGDB_KDB) ++/* ++ * These functions are only useful for the IA64 MCA handling, or kdb. ++ * ++ * They can only be called when the whole system has been ++ * stopped - every CPU needs to be quiescent, and no scheduling ++ * activity can take place. Using them for anything else would ++ * be a serious bug, and as a result, they aren't even visible ++ * under any other configuration. ++ */ ++ ++/** ++ * curr_task - return the current task for a given CPU. ++ * @cpu: the processor in question. ++ * ++ * ONLY VALID WHEN THE WHOLE SYSTEM IS STOPPED! ++ * ++ * Return: The current task for @cpu. ++ */ ++struct task_struct *curr_task(int cpu) ++{ ++ return cpu_curr(cpu); ++} ++ ++#endif /* defined(CONFIG_IA64) || defined(CONFIG_KGDB_KDB) */ ++ ++#ifdef CONFIG_IA64 ++/** ++ * set_curr_task - set the current task for a given CPU. ++ * @cpu: the processor in question. ++ * @p: the task pointer to set. ++ * ++ * Description: This function must only be used when non-maskable interrupts ++ * are serviced on a separate stack. It allows the architecture to switch the ++ * notion of the current task on a CPU in a non-blocking manner. This function ++ * must be called with all CPU's synchronised, and interrupts disabled, the ++ * and caller must save the original value of the current task (see ++ * curr_task() above) and restore that value before reenabling interrupts and ++ * re-starting the system. ++ * ++ * ONLY VALID WHEN THE WHOLE SYSTEM IS STOPPED! ++ */ ++void ia64_set_curr_task(int cpu, struct task_struct *p) ++{ ++ cpu_curr(cpu) = p; ++} ++ ++#endif ++ ++void init_idle_bootup_task(struct task_struct *idle) ++{} ++ ++#ifdef CONFIG_SCHED_DEBUG ++__read_mostly bool sched_debug_enabled; ++ ++void proc_sched_show_task(struct task_struct *p, struct pid_namespace *ns, ++ struct seq_file *m) ++{} ++ ++void proc_sched_set_task(struct task_struct *p) ++{} ++#endif ++ ++#ifdef CONFIG_CGROUP_SCHED ++static void sched_free_group(struct task_group *tg) ++{ ++ kmem_cache_free(task_group_cache, tg); ++} ++ ++/* allocate runqueue etc for a new task group */ ++struct task_group *sched_create_group(struct task_group *parent) ++{ ++ struct task_group *tg; ++ ++ tg = kmem_cache_alloc(task_group_cache, GFP_KERNEL | __GFP_ZERO); ++ if (!tg) ++ return ERR_PTR(-ENOMEM); ++ ++ return tg; ++} ++ ++void sched_online_group(struct task_group *tg, struct task_group *parent) ++{ ++} ++ ++/* rcu callback to free various structures associated with a task group */ ++static void sched_free_group_rcu(struct rcu_head *rhp) ++{ ++ /* Now it should be safe to free those cfs_rqs */ ++ sched_free_group(container_of(rhp, struct task_group, rcu)); ++} ++ ++void sched_destroy_group(struct task_group *tg) ++{ ++ /* Wait for possible concurrent references to cfs_rqs complete */ ++ call_rcu(&tg->rcu, sched_free_group_rcu); ++} ++ ++void sched_offline_group(struct task_group *tg) ++{ ++} ++ ++static inline struct task_group *css_tg(struct cgroup_subsys_state *css) ++{ ++ return css ? container_of(css, struct task_group, css) : NULL; ++} ++ ++static struct cgroup_subsys_state * ++cpu_cgroup_css_alloc(struct cgroup_subsys_state *parent_css) ++{ ++ struct task_group *parent = css_tg(parent_css); ++ struct task_group *tg; ++ ++ if (!parent) { ++ /* This is early initialization for the top cgroup */ ++ return &root_task_group.css; ++ } ++ ++ tg = sched_create_group(parent); ++ if (IS_ERR(tg)) ++ return ERR_PTR(-ENOMEM); ++ return &tg->css; ++} ++ ++/* Expose task group only after completing cgroup initialization */ ++static int cpu_cgroup_css_online(struct cgroup_subsys_state *css) ++{ ++ struct task_group *tg = css_tg(css); ++ struct task_group *parent = css_tg(css->parent); ++ ++ if (parent) ++ sched_online_group(tg, parent); ++ return 0; ++} ++ ++static void cpu_cgroup_css_released(struct cgroup_subsys_state *css) ++{ ++ struct task_group *tg = css_tg(css); ++ ++ sched_offline_group(tg); ++} ++ ++static void cpu_cgroup_css_free(struct cgroup_subsys_state *css) ++{ ++ struct task_group *tg = css_tg(css); ++ ++ /* ++ * Relies on the RCU grace period between css_released() and this. ++ */ ++ sched_free_group(tg); ++} ++ ++static void cpu_cgroup_fork(struct task_struct *task) ++{ ++} ++ ++static int cpu_cgroup_can_attach(struct cgroup_taskset *tset) ++{ ++ return 0; ++} ++ ++static void cpu_cgroup_attach(struct cgroup_taskset *tset) ++{ ++} ++ ++static struct cftype cpu_legacy_files[] = { ++ { } /* Terminate */ ++}; ++ ++static struct cftype cpu_files[] = { ++ { } /* terminate */ ++}; ++ ++static int cpu_extra_stat_show(struct seq_file *sf, ++ struct cgroup_subsys_state *css) ++{ ++ return 0; ++} ++ ++struct cgroup_subsys cpu_cgrp_subsys = { ++ .css_alloc = cpu_cgroup_css_alloc, ++ .css_online = cpu_cgroup_css_online, ++ .css_released = cpu_cgroup_css_released, ++ .css_free = cpu_cgroup_css_free, ++ .css_extra_stat_show = cpu_extra_stat_show, ++ .fork = cpu_cgroup_fork, ++ .can_attach = cpu_cgroup_can_attach, ++ .attach = cpu_cgroup_attach, ++ .legacy_cftypes = cpu_files, ++ .legacy_cftypes = cpu_legacy_files, ++ .dfl_cftypes = cpu_files, ++ .early_init = true, ++ .threaded = true, ++}; ++#endif /* CONFIG_CGROUP_SCHED */ ++ ++#undef CREATE_TRACE_POINTS +diff --git a/kernel/sched/MuQSS.h b/kernel/sched/MuQSS.h +new file mode 100644 +index 000000000000..0237ac382643 +--- /dev/null ++++ b/kernel/sched/MuQSS.h +@@ -0,0 +1,957 @@ ++/* SPDX-License-Identifier: GPL-2.0 */ ++#ifndef MUQSS_SCHED_H ++#define MUQSS_SCHED_H ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#ifdef CONFIG_PARAVIRT ++#include ++#endif ++ ++#include "cpupri.h" ++ ++#ifdef CONFIG_SCHED_DEBUG ++# define SCHED_WARN_ON(x) WARN_ONCE(x, #x) ++#else ++# define SCHED_WARN_ON(x) ((void)(x)) ++#endif ++ ++/* task_struct::on_rq states: */ ++#define TASK_ON_RQ_QUEUED 1 ++#define TASK_ON_RQ_MIGRATING 2 ++ ++struct rq; ++ ++#ifdef CONFIG_SMP ++ ++static inline bool sched_asym_prefer(int a, int b) ++{ ++ return arch_asym_cpu_priority(a) > arch_asym_cpu_priority(b); ++} ++ ++struct perf_domain { ++ struct em_perf_domain *em_pd; ++ struct perf_domain *next; ++ struct rcu_head rcu; ++}; ++ ++/* Scheduling group status flags */ ++#define SG_OVERLOAD 0x1 /* More than one runnable task on a CPU. */ ++#define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */ ++ ++/* ++ * We add the notion of a root-domain which will be used to define per-domain ++ * variables. Each exclusive cpuset essentially defines an island domain by ++ * fully partitioning the member cpus from any other cpuset. Whenever a new ++ * exclusive cpuset is created, we also create and attach a new root-domain ++ * object. ++ * ++ */ ++struct root_domain { ++ atomic_t refcount; ++ atomic_t rto_count; ++ struct rcu_head rcu; ++ cpumask_var_t span; ++ cpumask_var_t online; ++ ++ /* ++ * Indicate pullable load on at least one CPU, e.g: ++ * - More than one runnable task ++ * - Running task is misfit ++ */ ++ int overload; ++ ++ /* Indicate one or more cpus over-utilized (tipping point) */ ++ int overutilized; ++ ++ /* ++ * The bit corresponding to a CPU gets set here if such CPU has more ++ * than one runnable -deadline task (as it is below for RT tasks). ++ */ ++ cpumask_var_t dlo_mask; ++ atomic_t dlo_count; ++ /* Replace unused CFS structures with void */ ++ //struct dl_bw dl_bw; ++ //struct cpudl cpudl; ++ void *dl_bw; ++ void *cpudl; ++ ++ /* ++ * The "RT overload" flag: it gets set if a CPU has more than ++ * one runnable RT task. ++ */ ++ cpumask_var_t rto_mask; ++ //struct cpupri cpupri; ++ void *cpupri; ++ ++ unsigned long max_cpu_capacity; ++ ++ /* ++ * NULL-terminated list of performance domains intersecting with the ++ * CPUs of the rd. Protected by RCU. ++ */ ++ struct perf_domain *pd; ++}; ++ ++extern struct root_domain def_root_domain; ++extern struct mutex sched_domains_mutex; ++ ++extern void init_defrootdomain(void); ++extern int sched_init_domains(const struct cpumask *cpu_map); ++extern void rq_attach_root(struct rq *rq, struct root_domain *rd); ++ ++static inline void cpupri_cleanup(void __maybe_unused *cpupri) ++{ ++} ++ ++static inline void cpudl_cleanup(void __maybe_unused *cpudl) ++{ ++} ++ ++static inline void init_dl_bw(void __maybe_unused *dl_bw) ++{ ++} ++ ++static inline int cpudl_init(void __maybe_unused *dl_bw) ++{ ++ return 0; ++} ++ ++static inline int cpupri_init(void __maybe_unused *cpupri) ++{ ++ return 0; ++} ++#endif /* CONFIG_SMP */ ++ ++/* ++ * This is the main, per-CPU runqueue data structure. ++ * This data should only be modified by the local cpu. ++ */ ++struct rq { ++ raw_spinlock_t *lock; ++ raw_spinlock_t *orig_lock; ++ ++ struct task_struct *curr, *idle, *stop; ++ struct mm_struct *prev_mm; ++ ++ unsigned int nr_running; ++ /* ++ * This is part of a global counter where only the total sum ++ * over all CPUs matters. A task can increase this counter on ++ * one CPU and if it got migrated afterwards it may decrease ++ * it on another CPU. Always updated under the runqueue lock: ++ */ ++ unsigned long nr_uninterruptible; ++ u64 nr_switches; ++ ++ /* Stored data about rq->curr to work outside rq lock */ ++ u64 rq_deadline; ++ int rq_prio; ++ ++ /* Best queued id for use outside lock */ ++ u64 best_key; ++ ++ unsigned long last_scheduler_tick; /* Last jiffy this RQ ticked */ ++ unsigned long last_jiffy; /* Last jiffy this RQ updated rq clock */ ++ u64 niffies; /* Last time this RQ updated rq clock */ ++ u64 last_niffy; /* Last niffies as updated by local clock */ ++ u64 last_jiffy_niffies; /* Niffies @ last_jiffy */ ++ ++ u64 load_update; /* When we last updated load */ ++ unsigned long load_avg; /* Rolling load average */ ++#ifdef CONFIG_HAVE_SCHED_AVG_IRQ ++ u64 irq_load_update; /* When we last updated IRQ load */ ++ unsigned long irq_load_avg; /* Rolling IRQ load average */ ++#endif ++#ifdef CONFIG_SMT_NICE ++ struct mm_struct *rq_mm; ++ int rq_smt_bias; /* Policy/nice level bias across smt siblings */ ++#endif ++ /* Accurate timekeeping data */ ++ unsigned long user_ns, nice_ns, irq_ns, softirq_ns, system_ns, ++ iowait_ns, idle_ns; ++ atomic_t nr_iowait; ++ ++ skiplist_node *node; ++ skiplist *sl; ++#ifdef CONFIG_SMP ++ struct task_struct *preempt; /* Preempt triggered on this task */ ++ struct task_struct *preempting; /* Hint only, what task is preempting */ ++ ++ int cpu; /* cpu of this runqueue */ ++ bool online; ++ ++ struct root_domain *rd; ++ struct sched_domain *sd; ++ ++ unsigned long cpu_capacity_orig; ++ ++ int *cpu_locality; /* CPU relative cache distance */ ++ struct rq **rq_order; /* Shared RQs ordered by relative cache distance */ ++ struct rq **cpu_order; /* RQs of discrete CPUs ordered by distance */ ++ ++ struct rq *smp_leader; /* First physical CPU per node */ ++#ifdef CONFIG_SCHED_SMT ++ struct rq *smt_leader; /* First logical CPU in SMT siblings */ ++ cpumask_t thread_mask; ++ bool (*siblings_idle)(struct rq *rq); ++ /* See if all smt siblings are idle */ ++#endif /* CONFIG_SCHED_SMT */ ++#ifdef CONFIG_SCHED_MC ++ struct rq *mc_leader; /* First logical CPU in MC siblings */ ++ cpumask_t core_mask; ++ bool (*cache_idle)(struct rq *rq); ++ /* See if all cache siblings are idle */ ++#endif /* CONFIG_SCHED_MC */ ++#endif /* CONFIG_SMP */ ++#ifdef CONFIG_IRQ_TIME_ACCOUNTING ++ u64 prev_irq_time; ++#endif /* CONFIG_IRQ_TIME_ACCOUNTING */ ++#ifdef CONFIG_PARAVIRT ++ u64 prev_steal_time; ++#endif /* CONFIG_PARAVIRT */ ++#ifdef CONFIG_PARAVIRT_TIME_ACCOUNTING ++ u64 prev_steal_time_rq; ++#endif /* CONFIG_PARAVIRT_TIME_ACCOUNTING */ ++ ++ u64 clock, old_clock, last_tick; ++ /* Ensure that all clocks are in the same cache line */ ++ u64 clock_task ____cacheline_aligned; ++ int dither; ++ ++ int iso_ticks; ++ bool iso_refractory; ++ ++#ifdef CONFIG_HIGH_RES_TIMERS ++ struct hrtimer hrexpiry_timer; ++#endif ++ ++ int rt_nr_running; /* Number real time tasks running */ ++#ifdef CONFIG_SCHEDSTATS ++ ++ /* latency stats */ ++ struct sched_info rq_sched_info; ++ unsigned long long rq_cpu_time; ++ /* could above be rq->cfs_rq.exec_clock + rq->rt_rq.rt_runtime ? */ ++ ++ /* sys_sched_yield() stats */ ++ unsigned int yld_count; ++ ++ /* schedule() stats */ ++ unsigned int sched_switch; ++ unsigned int sched_count; ++ unsigned int sched_goidle; ++ ++ /* try_to_wake_up() stats */ ++ unsigned int ttwu_count; ++ unsigned int ttwu_local; ++#endif /* CONFIG_SCHEDSTATS */ ++ ++#ifdef CONFIG_SMP ++ struct llist_head wake_list; ++#endif ++ ++#ifdef CONFIG_CPU_IDLE ++ /* Must be inspected within a rcu lock section */ ++ struct cpuidle_state *idle_state; ++#endif ++}; ++ ++struct rq_flags { ++ unsigned long flags; ++}; ++ ++#ifdef CONFIG_SMP ++struct rq *cpu_rq(int cpu); ++#endif ++ ++#ifndef CONFIG_SMP ++extern struct rq *uprq; ++#define cpu_rq(cpu) (uprq) ++#define this_rq() (uprq) ++#define raw_rq() (uprq) ++#define task_rq(p) (uprq) ++#define cpu_curr(cpu) ((uprq)->curr) ++#else /* CONFIG_SMP */ ++DECLARE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); ++#define this_rq() this_cpu_ptr(&runqueues) ++#define raw_rq() raw_cpu_ptr(&runqueues) ++#define task_rq(p) cpu_rq(task_cpu(p)) ++#endif /* CONFIG_SMP */ ++ ++static inline int task_current(struct rq *rq, struct task_struct *p) ++{ ++ return rq->curr == p; ++} ++ ++static inline int task_running(struct rq *rq, struct task_struct *p) ++{ ++#ifdef CONFIG_SMP ++ return p->on_cpu; ++#else ++ return task_current(rq, p); ++#endif ++} ++ ++static inline int task_on_rq_queued(struct task_struct *p) ++{ ++ return p->on_rq == TASK_ON_RQ_QUEUED; ++} ++ ++static inline int task_on_rq_migrating(struct task_struct *p) ++{ ++ return READ_ONCE(p->on_rq) == TASK_ON_RQ_MIGRATING; ++} ++ ++static inline void rq_lock(struct rq *rq) ++ __acquires(rq->lock) ++{ ++ raw_spin_lock(rq->lock); ++} ++ ++static inline void rq_unlock(struct rq *rq) ++ __releases(rq->lock) ++{ ++ raw_spin_unlock(rq->lock); ++} ++ ++static inline void rq_lock_irq(struct rq *rq) ++ __acquires(rq->lock) ++{ ++ raw_spin_lock_irq(rq->lock); ++} ++ ++static inline void rq_unlock_irq(struct rq *rq, struct rq_flags __always_unused *rf) ++ __releases(rq->lock) ++{ ++ raw_spin_unlock_irq(rq->lock); ++} ++ ++static inline void rq_lock_irqsave(struct rq *rq, struct rq_flags *rf) ++ __acquires(rq->lock) ++{ ++ raw_spin_lock_irqsave(rq->lock, rf->flags); ++} ++ ++static inline void rq_unlock_irqrestore(struct rq *rq, struct rq_flags *rf) ++ __releases(rq->lock) ++{ ++ raw_spin_unlock_irqrestore(rq->lock, rf->flags); ++} ++ ++static inline struct rq *task_rq_lock(struct task_struct *p, struct rq_flags *rf) ++ __acquires(p->pi_lock) ++ __acquires(rq->lock) ++{ ++ struct rq *rq; ++ ++ while (42) { ++ raw_spin_lock_irqsave(&p->pi_lock, rf->flags); ++ rq = task_rq(p); ++ raw_spin_lock(rq->lock); ++ if (likely(rq == task_rq(p))) ++ break; ++ raw_spin_unlock(rq->lock); ++ raw_spin_unlock_irqrestore(&p->pi_lock, rf->flags); ++ } ++ return rq; ++} ++ ++static inline void task_rq_unlock(struct rq *rq, struct task_struct *p, struct rq_flags *rf) ++ __releases(rq->lock) ++ __releases(p->pi_lock) ++{ ++ rq_unlock(rq); ++ raw_spin_unlock_irqrestore(&p->pi_lock, rf->flags); ++} ++ ++static inline struct rq *__task_rq_lock(struct task_struct *p, struct rq_flags __always_unused *rf) ++ __acquires(rq->lock) ++{ ++ struct rq *rq; ++ ++ lockdep_assert_held(&p->pi_lock); ++ ++ while (42) { ++ rq = task_rq(p); ++ raw_spin_lock(rq->lock); ++ if (likely(rq == task_rq(p))) ++ break; ++ raw_spin_unlock(rq->lock); ++ } ++ return rq; ++} ++ ++static inline void __task_rq_unlock(struct rq *rq, struct rq_flags __always_unused *rf) ++{ ++ rq_unlock(rq); ++} ++ ++static inline struct rq * ++this_rq_lock_irq(struct rq_flags *rf) ++ __acquires(rq->lock) ++{ ++ struct rq *rq; ++ ++ local_irq_disable(); ++ rq = this_rq(); ++ rq_lock(rq); ++ return rq; ++} ++ ++/* ++ * {de,en}queue flags: Most not used on MuQSS. ++ * ++ * DEQUEUE_SLEEP - task is no longer runnable ++ * ENQUEUE_WAKEUP - task just became runnable ++ * ++ * SAVE/RESTORE - an otherwise spurious dequeue/enqueue, done to ensure tasks ++ * are in a known state which allows modification. Such pairs ++ * should preserve as much state as possible. ++ * ++ * MOVE - paired with SAVE/RESTORE, explicitly does not preserve the location ++ * in the runqueue. ++ * ++ * ENQUEUE_HEAD - place at front of runqueue (tail if not specified) ++ * ENQUEUE_REPLENISH - CBS (replenish runtime and postpone deadline) ++ * ENQUEUE_MIGRATED - the task was migrated during wakeup ++ * ++ */ ++ ++#define DEQUEUE_SLEEP 0x01 ++#define DEQUEUE_SAVE 0x02 /* matches ENQUEUE_RESTORE */ ++ ++#define ENQUEUE_WAKEUP 0x01 ++#define ENQUEUE_RESTORE 0x02 ++ ++#ifdef CONFIG_SMP ++#define ENQUEUE_MIGRATED 0x40 ++#else ++#define ENQUEUE_MIGRATED 0x00 ++#endif ++ ++static inline u64 __rq_clock_broken(struct rq *rq) ++{ ++ return READ_ONCE(rq->clock); ++} ++ ++static inline u64 rq_clock(struct rq *rq) ++{ ++ lockdep_assert_held(rq->lock); ++ ++ return rq->clock; ++} ++ ++static inline u64 rq_clock_task(struct rq *rq) ++{ ++ lockdep_assert_held(rq->lock); ++ ++ return rq->clock_task; ++} ++ ++#ifdef CONFIG_NUMA ++enum numa_topology_type { ++ NUMA_DIRECT, ++ NUMA_GLUELESS_MESH, ++ NUMA_BACKPLANE, ++}; ++extern enum numa_topology_type sched_numa_topology_type; ++extern int sched_max_numa_distance; ++extern bool find_numa_distance(int distance); ++ ++extern void sched_init_numa(void); ++extern void sched_domains_numa_masks_set(unsigned int cpu); ++extern void sched_domains_numa_masks_clear(unsigned int cpu); ++#else ++static inline void sched_init_numa(void) { } ++static inline void sched_domains_numa_masks_set(unsigned int cpu) { } ++static inline void sched_domains_numa_masks_clear(unsigned int cpu) { } ++#endif ++ ++extern struct mutex sched_domains_mutex; ++extern struct static_key_false sched_schedstats; ++ ++#define rcu_dereference_check_sched_domain(p) \ ++ rcu_dereference_check((p), \ ++ lockdep_is_held(&sched_domains_mutex)) ++ ++#ifdef CONFIG_SMP ++ ++/* ++ * The domain tree (rq->sd) is protected by RCU's quiescent state transition. ++ * See destroy_sched_domains: call_rcu for details. ++ * ++ * The domain tree of any CPU may only be accessed from within ++ * preempt-disabled sections. ++ */ ++#define for_each_domain(cpu, __sd) \ ++ for (__sd = rcu_dereference_check_sched_domain(cpu_rq(cpu)->sd); \ ++ __sd; __sd = __sd->parent) ++ ++#define for_each_lower_domain(sd) for (; sd; sd = sd->child) ++ ++/** ++ * highest_flag_domain - Return highest sched_domain containing flag. ++ * @cpu: The cpu whose highest level of sched domain is to ++ * be returned. ++ * @flag: The flag to check for the highest sched_domain ++ * for the given cpu. ++ * ++ * Returns the highest sched_domain of a cpu which contains the given flag. ++ */ ++static inline struct sched_domain *highest_flag_domain(int cpu, int flag) ++{ ++ struct sched_domain *sd, *hsd = NULL; ++ ++ for_each_domain(cpu, sd) { ++ if (!(sd->flags & flag)) ++ break; ++ hsd = sd; ++ } ++ ++ return hsd; ++} ++ ++static inline struct sched_domain *lowest_flag_domain(int cpu, int flag) ++{ ++ struct sched_domain *sd; ++ ++ for_each_domain(cpu, sd) { ++ if (sd->flags & flag) ++ break; ++ } ++ ++ return sd; ++} ++ ++DECLARE_PER_CPU(struct sched_domain *, sd_llc); ++DECLARE_PER_CPU(int, sd_llc_size); ++DECLARE_PER_CPU(int, sd_llc_id); ++DECLARE_PER_CPU(struct sched_domain_shared *, sd_llc_shared); ++DECLARE_PER_CPU(struct sched_domain *, sd_numa); ++DECLARE_PER_CPU(struct sched_domain *, sd_asym_packing); ++DECLARE_PER_CPU(struct sched_domain *, sd_asym_cpucapacity); ++ ++struct sched_group_capacity { ++ atomic_t ref; ++ /* ++ * CPU capacity of this group, SCHED_CAPACITY_SCALE being max capacity ++ * for a single CPU. ++ */ ++ unsigned long capacity; ++ unsigned long min_capacity; /* Min per-CPU capacity in group */ ++ unsigned long max_capacity; /* Max per-CPU capacity in group */ ++ unsigned long next_update; ++ int imbalance; /* XXX unrelated to capacity but shared group state */ ++ ++#ifdef CONFIG_SCHED_DEBUG ++ int id; ++#endif ++ ++ unsigned long cpumask[0]; /* balance mask */ ++}; ++ ++struct sched_group { ++ struct sched_group *next; /* Must be a circular list */ ++ atomic_t ref; ++ ++ unsigned int group_weight; ++ struct sched_group_capacity *sgc; ++ int asym_prefer_cpu; /* cpu of highest priority in group */ ++ ++ /* ++ * The CPUs this group covers. ++ * ++ * NOTE: this field is variable length. (Allocated dynamically ++ * by attaching extra space to the end of the structure, ++ * depending on how many CPUs the kernel has booted up with) ++ */ ++ unsigned long cpumask[0]; ++}; ++ ++static inline struct cpumask *sched_group_span(struct sched_group *sg) ++{ ++ return to_cpumask(sg->cpumask); ++} ++ ++/* ++ * See build_balance_mask(). ++ */ ++static inline struct cpumask *group_balance_mask(struct sched_group *sg) ++{ ++ return to_cpumask(sg->sgc->cpumask); ++} ++ ++/** ++ * group_first_cpu - Returns the first cpu in the cpumask of a sched_group. ++ * @group: The group whose first cpu is to be returned. ++ */ ++static inline unsigned int group_first_cpu(struct sched_group *group) ++{ ++ return cpumask_first(sched_group_span(group)); ++} ++ ++ ++#if defined(CONFIG_SCHED_DEBUG) && defined(CONFIG_SYSCTL) ++void register_sched_domain_sysctl(void); ++void dirty_sched_domain_sysctl(int cpu); ++void unregister_sched_domain_sysctl(void); ++#else ++static inline void register_sched_domain_sysctl(void) ++{ ++} ++static inline void dirty_sched_domain_sysctl(int cpu) ++{ ++} ++static inline void unregister_sched_domain_sysctl(void) ++{ ++} ++#endif ++ ++extern void sched_ttwu_pending(void); ++extern void set_cpus_allowed_common(struct task_struct *p, const struct cpumask *new_mask); ++extern void set_rq_online (struct rq *rq); ++extern void set_rq_offline(struct rq *rq); ++extern bool sched_smp_initialized; ++ ++static inline void update_group_capacity(struct sched_domain *sd, int cpu) ++{ ++} ++ ++static inline void trigger_load_balance(struct rq *rq) ++{ ++} ++ ++#define sched_feat(x) 0 ++ ++#else /* CONFIG_SMP */ ++ ++static inline void sched_ttwu_pending(void) { } ++ ++#endif /* CONFIG_SMP */ ++ ++#ifdef CONFIG_CPU_IDLE ++static inline void idle_set_state(struct rq *rq, ++ struct cpuidle_state *idle_state) ++{ ++ rq->idle_state = idle_state; ++} ++ ++static inline struct cpuidle_state *idle_get_state(struct rq *rq) ++{ ++ SCHED_WARN_ON(!rcu_read_lock_held()); ++ return rq->idle_state; ++} ++#else ++static inline void idle_set_state(struct rq *rq, ++ struct cpuidle_state *idle_state) ++{ ++} ++ ++static inline struct cpuidle_state *idle_get_state(struct rq *rq) ++{ ++ return NULL; ++} ++#endif ++ ++#ifdef CONFIG_SCHED_DEBUG ++extern bool sched_debug_enabled; ++#endif ++ ++extern void schedule_idle(void); ++ ++#ifdef CONFIG_IRQ_TIME_ACCOUNTING ++struct irqtime { ++ u64 total; ++ u64 tick_delta; ++ u64 irq_start_time; ++ struct u64_stats_sync sync; ++}; ++ ++DECLARE_PER_CPU(struct irqtime, cpu_irqtime); ++ ++/* ++ * Returns the irqtime minus the softirq time computed by ksoftirqd. ++ * Otherwise ksoftirqd's sum_exec_runtime is substracted its own runtime ++ * and never move forward. ++ */ ++static inline u64 irq_time_read(int cpu) ++{ ++ struct irqtime *irqtime = &per_cpu(cpu_irqtime, cpu); ++ unsigned int seq; ++ u64 total; ++ ++ do { ++ seq = __u64_stats_fetch_begin(&irqtime->sync); ++ total = irqtime->total; ++ } while (__u64_stats_fetch_retry(&irqtime->sync, seq)); ++ ++ return total; ++} ++#endif /* CONFIG_IRQ_TIME_ACCOUNTING */ ++ ++#ifdef CONFIG_SMP ++static inline int cpu_of(struct rq *rq) ++{ ++ return rq->cpu; ++} ++#else /* CONFIG_SMP */ ++static inline int cpu_of(struct rq *rq) ++{ ++ return 0; ++} ++#endif ++ ++#ifdef CONFIG_CPU_FREQ ++DECLARE_PER_CPU(struct update_util_data *, cpufreq_update_util_data); ++ ++static inline void cpufreq_trigger(struct rq *rq, unsigned int flags) ++{ ++ struct update_util_data *data; ++ ++ data = rcu_dereference_sched(*per_cpu_ptr(&cpufreq_update_util_data, ++ cpu_of(rq))); ++ ++ if (data) ++ data->func(data, rq->niffies, flags); ++} ++#else ++static inline void cpufreq_trigger(struct rq *rq, unsigned int flag) ++{ ++} ++#endif /* CONFIG_CPU_FREQ */ ++ ++#ifdef arch_scale_freq_capacity ++#ifndef arch_scale_freq_invariant ++#define arch_scale_freq_invariant() (true) ++#endif ++#else /* arch_scale_freq_capacity */ ++#define arch_scale_freq_invariant() (false) ++#endif ++ ++/* ++ * This should only be called when current == rq->idle. Dodgy workaround for ++ * when softirqs are pending and we are in the idle loop. Setting current to ++ * resched will kick us out of the idle loop and the softirqs will be serviced ++ * on our next pass through schedule(). ++ */ ++static inline bool softirq_pending(int cpu) ++{ ++ if (likely(!local_softirq_pending())) ++ return false; ++ set_tsk_need_resched(current); ++ return true; ++} ++ ++#ifdef CONFIG_64BIT ++static inline u64 read_sum_exec_runtime(struct task_struct *t) ++{ ++ return tsk_seruntime(t); ++} ++#else ++static inline u64 read_sum_exec_runtime(struct task_struct *t) ++{ ++ struct rq_flags rf; ++ u64 ns; ++ struct rq *rq; ++ ++ rq = task_rq_lock(t, &rf); ++ ns = tsk_seruntime(t); ++ task_rq_unlock(rq, t, &rf); ++ ++ return ns; ++} ++#endif ++ ++#ifndef arch_scale_freq_capacity ++static __always_inline ++unsigned long arch_scale_freq_capacity(int cpu) ++{ ++ return SCHED_CAPACITY_SCALE; ++} ++#endif ++ ++#ifdef CONFIG_NO_HZ_FULL ++extern bool sched_can_stop_tick(struct rq *rq); ++extern int __init sched_tick_offload_init(void); ++ ++/* ++ * Tick may be needed by tasks in the runqueue depending on their policy and ++ * requirements. If tick is needed, lets send the target an IPI to kick it out of ++ * nohz mode if necessary. ++ */ ++static inline void sched_update_tick_dependency(struct rq *rq) ++{ ++ int cpu; ++ ++ if (!tick_nohz_full_enabled()) ++ return; ++ ++ cpu = cpu_of(rq); ++ ++ if (!tick_nohz_full_cpu(cpu)) ++ return; ++ ++ if (sched_can_stop_tick(rq)) ++ tick_nohz_dep_clear_cpu(cpu, TICK_DEP_BIT_SCHED); ++ else ++ tick_nohz_dep_set_cpu(cpu, TICK_DEP_BIT_SCHED); ++} ++#else ++static inline int sched_tick_offload_init(void) { return 0; } ++static inline void sched_update_tick_dependency(struct rq *rq) { } ++#endif ++ ++#define SCHED_FLAG_SUGOV 0x10000000 ++ ++static inline bool rt_rq_is_runnable(struct rq *rt_rq) ++{ ++ return rt_rq->rt_nr_running; ++} ++ ++#ifdef CONFIG_CPU_FREQ_GOV_SCHEDUTIL ++/** ++ * enum schedutil_type - CPU utilization type ++ * @FREQUENCY_UTIL: Utilization used to select frequency ++ * @ENERGY_UTIL: Utilization used during energy calculation ++ * ++ * The utilization signals of all scheduling classes (CFS/RT/DL) and IRQ time ++ * need to be aggregated differently depending on the usage made of them. This ++ * enum is used within schedutil_freq_util() to differentiate the types of ++ * utilization expected by the callers, and adjust the aggregation accordingly. ++ */ ++enum schedutil_type { ++ FREQUENCY_UTIL, ++ ENERGY_UTIL, ++}; ++ ++unsigned long schedutil_freq_util(int cpu, unsigned long util_cfs, ++ unsigned long max, enum schedutil_type type); ++ ++static inline unsigned long schedutil_energy_util(int cpu, unsigned long cfs) ++{ ++ unsigned long max = arch_scale_cpu_capacity(NULL, cpu); ++ ++ return schedutil_freq_util(cpu, cfs, max, ENERGY_UTIL); ++} ++ ++static inline unsigned long cpu_bw_dl(struct rq *rq) ++{ ++ return 0; ++} ++ ++static inline unsigned long cpu_util_dl(struct rq *rq) ++{ ++ return 0; ++} ++ ++static inline unsigned long cpu_util_cfs(struct rq *rq) ++{ ++ unsigned long ret = READ_ONCE(rq->load_avg); ++ ++ if (ret > SCHED_CAPACITY_SCALE) ++ ret = SCHED_CAPACITY_SCALE; ++ return ret; ++} ++ ++static inline unsigned long cpu_util_rt(struct rq *rq) ++{ ++ unsigned long ret = READ_ONCE(rq->rt_nr_running); ++ ++ if (ret > SCHED_CAPACITY_SCALE) ++ ret = SCHED_CAPACITY_SCALE; ++ return ret; ++} ++ ++#ifdef CONFIG_HAVE_SCHED_AVG_IRQ ++static inline unsigned long cpu_util_irq(struct rq *rq) ++{ ++ unsigned long ret = READ_ONCE(rq->irq_load_avg); ++ ++ if (ret > SCHED_CAPACITY_SCALE) ++ ret = SCHED_CAPACITY_SCALE; ++ return ret; ++} ++ ++static inline ++unsigned long scale_irq_capacity(unsigned long util, unsigned long irq, unsigned long max) ++{ ++ util *= (max - irq); ++ util /= max; ++ ++ return util; ++ ++} ++#else ++static inline unsigned long cpu_util_irq(struct rq *rq) ++{ ++ return 0; ++} ++ ++static inline ++unsigned long scale_irq_capacity(unsigned long util, unsigned long irq, unsigned long max) ++{ ++ return util; ++} ++#endif ++#endif ++ ++#if defined(CONFIG_ENERGY_MODEL) && defined(CONFIG_CPU_FREQ_GOV_SCHEDUTIL) ++#define perf_domain_span(pd) (to_cpumask(((pd)->em_pd->cpus))) ++ ++DECLARE_STATIC_KEY_FALSE(sched_energy_present); ++ ++static inline bool sched_energy_enabled(void) ++{ ++ return static_branch_unlikely(&sched_energy_present); ++} ++ ++#else /* ! (CONFIG_ENERGY_MODEL && CONFIG_CPU_FREQ_GOV_SCHEDUTIL) */ ++ ++#define perf_domain_span(pd) NULL ++static inline bool sched_energy_enabled(void) { return false; } ++ ++#endif /* CONFIG_ENERGY_MODEL && CONFIG_CPU_FREQ_GOV_SCHEDUTIL */ ++#endif /* MUQSS_SCHED_H */ +diff --git a/kernel/sched/core.c b/kernel/sched/core.c +index 874c427742a9..4d5962232a55 100644 +--- a/kernel/sched/core.c ++++ b/kernel/sched/core.c +@@ -5123,7 +5123,7 @@ long __sched io_schedule_timeout(long timeout) + } + EXPORT_SYMBOL(io_schedule_timeout); + +-void io_schedule(void) ++void __sched io_schedule(void) + { + int token; + +diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c +index 962cf343f798..e17624efd86c 100644 +--- a/kernel/sched/cpufreq_schedutil.c ++++ b/kernel/sched/cpufreq_schedutil.c +@@ -176,6 +176,12 @@ static unsigned int get_next_freq(struct sugov_policy *sg_policy, + return cpufreq_driver_resolve_freq(policy, freq); + } + ++#ifdef CONFIG_SCHED_MUQSS ++#define rt_rq_runnable(rq_rt) rt_rq_is_runnable(rq) ++#else ++#define rt_rq_runnable(rq_rt) rt_rq_is_runnable(&rq->rt) ++#endif ++ + /* + * This function computes an effective utilization for the given CPU, to be + * used for frequency selection given the linear relation: f = u * f_max. +@@ -202,7 +208,7 @@ unsigned long schedutil_freq_util(int cpu, unsigned long util_cfs, + unsigned long dl_util, util, irq; + struct rq *rq = cpu_rq(cpu); + +- if (type == FREQUENCY_UTIL && rt_rq_is_runnable(&rq->rt)) ++ if (type == FREQUENCY_UTIL && rt_rq_runnable(rq)) + return max; + + /* +@@ -638,7 +644,11 @@ static int sugov_kthread_create(struct sugov_policy *sg_policy) + struct task_struct *thread; + struct sched_attr attr = { + .size = sizeof(struct sched_attr), ++#ifdef CONFIG_SCHED_MUQSS ++ .sched_policy = SCHED_RR, ++#else + .sched_policy = SCHED_DEADLINE, ++#endif + .sched_flags = SCHED_FLAG_SUGOV, + .sched_nice = 0, + .sched_priority = 0, +diff --git a/kernel/sched/cpupri.h b/kernel/sched/cpupri.h +index 7dc20a3232e7..e733a0a53b0a 100644 +--- a/kernel/sched/cpupri.h ++++ b/kernel/sched/cpupri.h +@@ -17,9 +17,11 @@ struct cpupri { + int *cpu_to_pri; + }; + ++#ifndef CONFIG_SCHED_MUQSS + #ifdef CONFIG_SMP + int cpupri_find(struct cpupri *cp, struct task_struct *p, struct cpumask *lowest_mask); + void cpupri_set(struct cpupri *cp, int cpu, int pri); + int cpupri_init(struct cpupri *cp); + void cpupri_cleanup(struct cpupri *cp); + #endif ++#endif +diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c +index 2305ce89a26c..7a4be7d3ce41 100644 +--- a/kernel/sched/cputime.c ++++ b/kernel/sched/cputime.c +@@ -266,26 +266,6 @@ static inline u64 account_other_time(u64 max) + return accounted; + } + +-#ifdef CONFIG_64BIT +-static inline u64 read_sum_exec_runtime(struct task_struct *t) +-{ +- return t->se.sum_exec_runtime; +-} +-#else +-static u64 read_sum_exec_runtime(struct task_struct *t) +-{ +- u64 ns; +- struct rq_flags rf; +- struct rq *rq; +- +- rq = task_rq_lock(t, &rf); +- ns = t->se.sum_exec_runtime; +- task_rq_unlock(rq, t, &rf); +- +- return ns; +-} +-#endif +- + /* + * Accumulate raw cputime values of dead tasks (sig->[us]time) and live + * tasks (sum on group iteration) belonging to @tsk's group. +@@ -663,7 +643,7 @@ void cputime_adjust(struct task_cputime *curr, struct prev_cputime *prev, + void task_cputime_adjusted(struct task_struct *p, u64 *ut, u64 *st) + { + struct task_cputime cputime = { +- .sum_exec_runtime = p->se.sum_exec_runtime, ++ .sum_exec_runtime = tsk_seruntime(p), + }; + + task_cputime(p, &cputime.utime, &cputime.stime); +diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c +index f35930f5e528..dc5ad9a14c37 100644 +--- a/kernel/sched/fair.c ++++ b/kernel/sched/fair.c +@@ -37,8 +37,13 @@ + * + * (default: 6ms * (1 + ilog(ncpus)), units: nanoseconds) + */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++unsigned int sysctl_sched_latency = 4000000ULL; ++static unsigned int normalized_sysctl_sched_latency = 4000000ULL; ++#else + unsigned int sysctl_sched_latency = 6000000ULL; + static unsigned int normalized_sysctl_sched_latency = 6000000ULL; ++#endif + + /* + * The initial- and re-scaling of tunables is configurable +@@ -58,13 +63,22 @@ enum sched_tunable_scaling sysctl_sched_tunable_scaling = SCHED_TUNABLESCALING_L + * + * (default: 0.75 msec * (1 + ilog(ncpus)), units: nanoseconds) + */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++unsigned int sysctl_sched_min_granularity = 400000ULL; ++static unsigned int normalized_sysctl_sched_min_granularity = 400000ULL; ++#else + unsigned int sysctl_sched_min_granularity = 750000ULL; + static unsigned int normalized_sysctl_sched_min_granularity = 750000ULL; ++#endif + + /* + * This value is kept at sysctl_sched_latency/sysctl_sched_min_granularity + */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++static unsigned int sched_nr_latency = 10; ++#else + static unsigned int sched_nr_latency = 8; ++#endif + + /* + * After fork, child runs first. If set to 0 (default) then +@@ -81,10 +95,17 @@ unsigned int sysctl_sched_child_runs_first __read_mostly; + * + * (default: 1 msec * (1 + ilog(ncpus)), units: nanoseconds) + */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++unsigned int sysctl_sched_wakeup_granularity = 500000UL; ++static unsigned int normalized_sysctl_sched_wakeup_granularity = 500000UL; ++ ++const_debug unsigned int sysctl_sched_migration_cost = 250000UL; ++#else + unsigned int sysctl_sched_wakeup_granularity = 1000000UL; + static unsigned int normalized_sysctl_sched_wakeup_granularity = 1000000UL; + + const_debug unsigned int sysctl_sched_migration_cost = 500000UL; ++#endif + + #ifdef CONFIG_SMP + /* +@@ -115,8 +136,12 @@ static unsigned int capacity_margin = 1280; + * + * (default: 5 msec, units: microseconds) + */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++unsigned int sysctl_sched_cfs_bandwidth_slice = 3000UL; ++#else + unsigned int sysctl_sched_cfs_bandwidth_slice = 5000UL; + #endif ++#endif + + static inline void update_load_add(struct load_weight *lw, unsigned long inc) + { +@@ -1067,6 +1092,21 @@ struct numa_group { + unsigned long faults[0]; + }; + ++/* ++ * For functions that can be called in multiple contexts that permit reading ++ * ->numa_group (see struct task_struct for locking rules). ++ */ ++static struct numa_group *deref_task_numa_group(struct task_struct *p) ++{ ++ return rcu_dereference_check(p->numa_group, p == current || ++ (lockdep_is_held(&task_rq(p)->lock) && !READ_ONCE(p->on_cpu))); ++} ++ ++static struct numa_group *deref_curr_numa_group(struct task_struct *p) ++{ ++ return rcu_dereference_protected(p->numa_group, p == current); ++} ++ + static inline unsigned long group_faults_priv(struct numa_group *ng); + static inline unsigned long group_faults_shared(struct numa_group *ng); + +@@ -1110,10 +1150,12 @@ static unsigned int task_scan_start(struct task_struct *p) + { + unsigned long smin = task_scan_min(p); + unsigned long period = smin; ++ struct numa_group *ng; + + /* Scale the maximum scan period with the amount of shared memory. */ +- if (p->numa_group) { +- struct numa_group *ng = p->numa_group; ++ rcu_read_lock(); ++ ng = rcu_dereference(p->numa_group); ++ if (ng) { + unsigned long shared = group_faults_shared(ng); + unsigned long private = group_faults_priv(ng); + +@@ -1121,6 +1163,7 @@ static unsigned int task_scan_start(struct task_struct *p) + period *= shared + 1; + period /= private + shared + 1; + } ++ rcu_read_unlock(); + + return max(smin, period); + } +@@ -1129,13 +1172,14 @@ static unsigned int task_scan_max(struct task_struct *p) + { + unsigned long smin = task_scan_min(p); + unsigned long smax; ++ struct numa_group *ng; + + /* Watch for min being lower than max due to floor calculations */ + smax = sysctl_numa_balancing_scan_period_max / task_nr_scan_windows(p); + + /* Scale the maximum scan period with the amount of shared memory. */ +- if (p->numa_group) { +- struct numa_group *ng = p->numa_group; ++ ng = deref_curr_numa_group(p); ++ if (ng) { + unsigned long shared = group_faults_shared(ng); + unsigned long private = group_faults_priv(ng); + unsigned long period = smax; +@@ -1167,7 +1211,7 @@ void init_numa_balancing(unsigned long clone_flags, struct task_struct *p) + p->numa_scan_period = sysctl_numa_balancing_scan_delay; + p->numa_work.next = &p->numa_work; + p->numa_faults = NULL; +- p->numa_group = NULL; ++ RCU_INIT_POINTER(p->numa_group, NULL); + p->last_task_numa_placement = 0; + p->last_sum_exec_runtime = 0; + +@@ -1214,7 +1258,16 @@ static void account_numa_dequeue(struct rq *rq, struct task_struct *p) + + pid_t task_numa_group_id(struct task_struct *p) + { +- return p->numa_group ? p->numa_group->gid : 0; ++ struct numa_group *ng; ++ pid_t gid = 0; ++ ++ rcu_read_lock(); ++ ng = rcu_dereference(p->numa_group); ++ if (ng) ++ gid = ng->gid; ++ rcu_read_unlock(); ++ ++ return gid; + } + + /* +@@ -1239,11 +1292,13 @@ static inline unsigned long task_faults(struct task_struct *p, int nid) + + static inline unsigned long group_faults(struct task_struct *p, int nid) + { +- if (!p->numa_group) ++ struct numa_group *ng = deref_task_numa_group(p); ++ ++ if (!ng) + return 0; + +- return p->numa_group->faults[task_faults_idx(NUMA_MEM, nid, 0)] + +- p->numa_group->faults[task_faults_idx(NUMA_MEM, nid, 1)]; ++ return ng->faults[task_faults_idx(NUMA_MEM, nid, 0)] + ++ ng->faults[task_faults_idx(NUMA_MEM, nid, 1)]; + } + + static inline unsigned long group_faults_cpu(struct numa_group *group, int nid) +@@ -1381,12 +1436,13 @@ static inline unsigned long task_weight(struct task_struct *p, int nid, + static inline unsigned long group_weight(struct task_struct *p, int nid, + int dist) + { ++ struct numa_group *ng = deref_task_numa_group(p); + unsigned long faults, total_faults; + +- if (!p->numa_group) ++ if (!ng) + return 0; + +- total_faults = p->numa_group->total_faults; ++ total_faults = ng->total_faults; + + if (!total_faults) + return 0; +@@ -1400,7 +1456,7 @@ static inline unsigned long group_weight(struct task_struct *p, int nid, + bool should_numa_migrate_memory(struct task_struct *p, struct page * page, + int src_nid, int dst_cpu) + { +- struct numa_group *ng = p->numa_group; ++ struct numa_group *ng = deref_curr_numa_group(p); + int dst_nid = cpu_to_node(dst_cpu); + int last_cpupid, this_cpupid; + +@@ -1583,13 +1639,14 @@ static bool load_too_imbalanced(long src_load, long dst_load, + static void task_numa_compare(struct task_numa_env *env, + long taskimp, long groupimp, bool maymove) + { ++ struct numa_group *cur_ng, *p_ng = deref_curr_numa_group(env->p); + struct rq *dst_rq = cpu_rq(env->dst_cpu); ++ long imp = p_ng ? groupimp : taskimp; + struct task_struct *cur; + long src_load, dst_load; +- long load; +- long imp = env->p->numa_group ? groupimp : taskimp; +- long moveimp = imp; + int dist = env->dist; ++ long moveimp = imp; ++ long load; + + if (READ_ONCE(dst_rq->numa_migrate_on)) + return; +@@ -1628,21 +1685,22 @@ static void task_numa_compare(struct task_numa_env *env, + * If dst and source tasks are in the same NUMA group, or not + * in any group then look only at task weights. + */ +- if (cur->numa_group == env->p->numa_group) { ++ cur_ng = rcu_dereference(cur->numa_group); ++ if (cur_ng == p_ng) { + imp = taskimp + task_weight(cur, env->src_nid, dist) - + task_weight(cur, env->dst_nid, dist); + /* + * Add some hysteresis to prevent swapping the + * tasks within a group over tiny differences. + */ +- if (cur->numa_group) ++ if (cur_ng) + imp -= imp / 16; + } else { + /* + * Compare the group weights. If a task is all by itself + * (not part of a group), use the task weight instead. + */ +- if (cur->numa_group && env->p->numa_group) ++ if (cur_ng && p_ng) + imp += group_weight(cur, env->src_nid, dist) - + group_weight(cur, env->dst_nid, dist); + else +@@ -1740,11 +1798,12 @@ static int task_numa_migrate(struct task_struct *p) + .best_imp = 0, + .best_cpu = -1, + }; ++ unsigned long taskweight, groupweight; + struct sched_domain *sd; ++ long taskimp, groupimp; ++ struct numa_group *ng; + struct rq *best_rq; +- unsigned long taskweight, groupweight; + int nid, ret, dist; +- long taskimp, groupimp; + + /* + * Pick the lowest SD_NUMA domain, as that would have the smallest +@@ -1790,7 +1849,8 @@ static int task_numa_migrate(struct task_struct *p) + * multiple NUMA nodes; in order to better consolidate the group, + * we need to check other locations. + */ +- if (env.best_cpu == -1 || (p->numa_group && p->numa_group->active_nodes > 1)) { ++ ng = deref_curr_numa_group(p); ++ if (env.best_cpu == -1 || (ng && ng->active_nodes > 1)) { + for_each_online_node(nid) { + if (nid == env.src_nid || nid == p->numa_preferred_nid) + continue; +@@ -1823,7 +1883,7 @@ static int task_numa_migrate(struct task_struct *p) + * A task that migrated to a second choice node will be better off + * trying for a better one later. Do not set the preferred node here. + */ +- if (p->numa_group) { ++ if (ng) { + if (env.best_cpu == -1) + nid = env.src_nid; + else +@@ -2118,6 +2178,7 @@ static void task_numa_placement(struct task_struct *p) + unsigned long total_faults; + u64 runtime, period; + spinlock_t *group_lock = NULL; ++ struct numa_group *ng; + + /* + * The p->mm->numa_scan_seq field gets updated without +@@ -2135,8 +2196,9 @@ static void task_numa_placement(struct task_struct *p) + runtime = numa_get_avg_runtime(p, &period); + + /* If the task is part of a group prevent parallel updates to group stats */ +- if (p->numa_group) { +- group_lock = &p->numa_group->lock; ++ ng = deref_curr_numa_group(p); ++ if (ng) { ++ group_lock = &ng->lock; + spin_lock_irq(group_lock); + } + +@@ -2177,7 +2239,7 @@ static void task_numa_placement(struct task_struct *p) + p->numa_faults[cpu_idx] += f_diff; + faults += p->numa_faults[mem_idx]; + p->total_numa_faults += diff; +- if (p->numa_group) { ++ if (ng) { + /* + * safe because we can only change our own group + * +@@ -2185,14 +2247,14 @@ static void task_numa_placement(struct task_struct *p) + * nid and priv in a specific region because it + * is at the beginning of the numa_faults array. + */ +- p->numa_group->faults[mem_idx] += diff; +- p->numa_group->faults_cpu[mem_idx] += f_diff; +- p->numa_group->total_faults += diff; +- group_faults += p->numa_group->faults[mem_idx]; ++ ng->faults[mem_idx] += diff; ++ ng->faults_cpu[mem_idx] += f_diff; ++ ng->total_faults += diff; ++ group_faults += ng->faults[mem_idx]; + } + } + +- if (!p->numa_group) { ++ if (!ng) { + if (faults > max_faults) { + max_faults = faults; + max_nid = nid; +@@ -2203,8 +2265,8 @@ static void task_numa_placement(struct task_struct *p) + } + } + +- if (p->numa_group) { +- numa_group_count_active_nodes(p->numa_group); ++ if (ng) { ++ numa_group_count_active_nodes(ng); + spin_unlock_irq(group_lock); + max_nid = preferred_group_nid(p, max_nid); + } +@@ -2238,7 +2300,7 @@ static void task_numa_group(struct task_struct *p, int cpupid, int flags, + int cpu = cpupid_to_cpu(cpupid); + int i; + +- if (unlikely(!p->numa_group)) { ++ if (unlikely(!deref_curr_numa_group(p))) { + unsigned int size = sizeof(struct numa_group) + + 4*nr_node_ids*sizeof(unsigned long); + +@@ -2274,7 +2336,7 @@ static void task_numa_group(struct task_struct *p, int cpupid, int flags, + if (!grp) + goto no_join; + +- my_grp = p->numa_group; ++ my_grp = deref_curr_numa_group(p); + if (grp == my_grp) + goto no_join; + +@@ -2336,13 +2398,24 @@ static void task_numa_group(struct task_struct *p, int cpupid, int flags, + return; + } + +-void task_numa_free(struct task_struct *p) ++/* ++ * Get rid of NUMA staticstics associated with a task (either current or dead). ++ * If @final is set, the task is dead and has reached refcount zero, so we can ++ * safely free all relevant data structures. Otherwise, there might be ++ * concurrent reads from places like load balancing and procfs, and we should ++ * reset the data back to default state without freeing ->numa_faults. ++ */ ++void task_numa_free(struct task_struct *p, bool final) + { +- struct numa_group *grp = p->numa_group; +- void *numa_faults = p->numa_faults; ++ /* safe: p either is current or is being freed by current */ ++ struct numa_group *grp = rcu_dereference_raw(p->numa_group); ++ unsigned long *numa_faults = p->numa_faults; + unsigned long flags; + int i; + ++ if (!numa_faults) ++ return; ++ + if (grp) { + spin_lock_irqsave(&grp->lock, flags); + for (i = 0; i < NR_NUMA_HINT_FAULT_STATS * nr_node_ids; i++) +@@ -2355,8 +2428,14 @@ void task_numa_free(struct task_struct *p) + put_numa_group(grp); + } + +- p->numa_faults = NULL; +- kfree(numa_faults); ++ if (final) { ++ p->numa_faults = NULL; ++ kfree(numa_faults); ++ } else { ++ p->total_numa_faults = 0; ++ for (i = 0; i < NR_NUMA_HINT_FAULT_STATS * nr_node_ids; i++) ++ numa_faults[i] = 0; ++ } + } + + /* +@@ -2409,7 +2488,7 @@ void task_numa_fault(int last_cpupid, int mem_node, int pages, int flags) + * actively using should be counted as local. This allows the + * scan rate to slow down when a workload has settled down. + */ +- ng = p->numa_group; ++ ng = deref_curr_numa_group(p); + if (!priv && !local && ng && ng->active_nodes > 1 && + numa_is_active_node(cpu_node, ng) && + numa_is_active_node(mem_node, ng)) +@@ -10708,18 +10787,22 @@ void show_numa_stats(struct task_struct *p, struct seq_file *m) + { + int node; + unsigned long tsf = 0, tpf = 0, gsf = 0, gpf = 0; ++ struct numa_group *ng; + ++ rcu_read_lock(); ++ ng = rcu_dereference(p->numa_group); + for_each_online_node(node) { + if (p->numa_faults) { + tsf = p->numa_faults[task_faults_idx(NUMA_MEM, node, 0)]; + tpf = p->numa_faults[task_faults_idx(NUMA_MEM, node, 1)]; + } +- if (p->numa_group) { +- gsf = p->numa_group->faults[task_faults_idx(NUMA_MEM, node, 0)], +- gpf = p->numa_group->faults[task_faults_idx(NUMA_MEM, node, 1)]; ++ if (ng) { ++ gsf = ng->faults[task_faults_idx(NUMA_MEM, node, 0)], ++ gpf = ng->faults[task_faults_idx(NUMA_MEM, node, 1)]; + } + print_numa_stats(m, node, tsf, tpf, gsf, gpf); + } ++ rcu_read_unlock(); + } + #endif /* CONFIG_NUMA_BALANCING */ + #endif /* CONFIG_SCHED_DEBUG */ +diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c +index 80940939b733..de58611b232f 100644 +--- a/kernel/sched/idle.c ++++ b/kernel/sched/idle.c +@@ -225,6 +225,8 @@ static void cpuidle_idle_call(void) + static void do_idle(void) + { + int cpu = smp_processor_id(); ++ bool pending = false; ++ + /* + * If the arch has a polling bit, we maintain an invariant: + * +@@ -235,7 +237,10 @@ static void do_idle(void) + */ + + __current_set_polling(); +- tick_nohz_idle_enter(); ++ if (unlikely(softirq_pending(cpu))) ++ pending = true; ++ else ++ tick_nohz_idle_enter(); + + while (!need_resched()) { + check_pgt_cache(); +@@ -273,7 +278,8 @@ static void do_idle(void) + * an IPI to fold the state for us. + */ + preempt_set_need_resched(); +- tick_nohz_idle_exit(); ++ if (!pending) ++ tick_nohz_idle_exit(); + __current_clr_polling(); + + /* +@@ -354,6 +360,7 @@ void cpu_startup_entry(enum cpuhp_state state) + do_idle(); + } + ++#ifndef CONFIG_SCHED_MUQSS + /* + * idle-task scheduling class. + */ +@@ -466,3 +473,4 @@ const struct sched_class idle_sched_class = { + .switched_to = switched_to_idle, + .update_curr = update_curr_idle, + }; ++#endif /* CONFIG_SCHED_MUQSS */ +diff --git a/kernel/sched/sched-pelt.h b/kernel/sched/sched-pelt.h +index a26473674fb7..c529706bed11 100644 +--- a/kernel/sched/sched-pelt.h ++++ b/kernel/sched/sched-pelt.h +@@ -1,7 +1,7 @@ + /* SPDX-License-Identifier: GPL-2.0 */ + /* Generated by Documentation/scheduler/sched-pelt; do not modify. */ + +-static const u32 runnable_avg_yN_inv[] = { ++static const u32 runnable_avg_yN_inv[] __maybe_unused = { + 0xffffffff, 0xfa83b2da, 0xf5257d14, 0xefe4b99a, 0xeac0c6e6, 0xe5b906e6, + 0xe0ccdeeb, 0xdbfbb796, 0xd744fcc9, 0xd2a81d91, 0xce248c14, 0xc9b9bd85, + 0xc5672a10, 0xc12c4cc9, 0xbd08a39e, 0xb8fbaf46, 0xb504f333, 0xb123f581, +diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h +index b52ed1ada0be..d0dbd27db435 100644 +--- a/kernel/sched/sched.h ++++ b/kernel/sched/sched.h +@@ -2,6 +2,19 @@ + /* + * Scheduler internal types and methods: + */ ++#ifdef CONFIG_SCHED_MUQSS ++#include "MuQSS.h" ++ ++/* Begin compatibility wrappers for MuQSS/CFS differences */ ++#define rq_rt_nr_running(rq) ((rq)->rt_nr_running) ++#define rq_h_nr_running(rq) ((rq)->nr_running) ++ ++#else /* CONFIG_SCHED_MUQSS */ ++ ++#define rq_rt_nr_running(rq) ((rq)->rt.rt_nr_running) ++#define rq_h_nr_running(rq) ((rq)->cfs.h_nr_running) ++ ++ + #include + + #include +@@ -2341,3 +2354,30 @@ static inline bool sched_energy_enabled(void) + static inline bool sched_energy_enabled(void) { return false; } + + #endif /* CONFIG_ENERGY_MODEL && CONFIG_CPU_FREQ_GOV_SCHEDUTIL */ ++ ++/* MuQSS compatibility functions */ ++static inline bool softirq_pending(int cpu) ++{ ++ return false; ++} ++ ++#ifdef CONFIG_64BIT ++static inline u64 read_sum_exec_runtime(struct task_struct *t) ++{ ++ return t->se.sum_exec_runtime; ++} ++#else ++static inline u64 read_sum_exec_runtime(struct task_struct *t) ++{ ++ u64 ns; ++ struct rq_flags rf; ++ struct rq *rq; ++ ++ rq = task_rq_lock(t, &rf); ++ ns = t->se.sum_exec_runtime; ++ task_rq_unlock(rq, t, &rf); ++ ++ return ns; ++} ++#endif ++#endif /* CONFIG_SCHED_MUQSS */ +diff --git a/kernel/sched/topology.c b/kernel/sched/topology.c +index f53f89df837d..76dfb1c936ec 100644 +--- a/kernel/sched/topology.c ++++ b/kernel/sched/topology.c +@@ -442,7 +442,11 @@ void rq_attach_root(struct rq *rq, struct root_domain *rd) + struct root_domain *old_rd = NULL; + unsigned long flags; + ++#ifdef CONFIG_SCHED_MUQSS ++ raw_spin_lock_irqsave(rq->lock, flags); ++#else + raw_spin_lock_irqsave(&rq->lock, flags); ++#endif + + if (rq->rd) { + old_rd = rq->rd; +@@ -468,7 +472,11 @@ void rq_attach_root(struct rq *rq, struct root_domain *rd) + if (cpumask_test_cpu(rq->cpu, cpu_active_mask)) + set_rq_online(rq); + ++#ifdef CONFIG_SCHED_MUQSS ++ raw_spin_unlock_irqrestore(rq->lock, flags); ++#else + raw_spin_unlock_irqrestore(&rq->lock, flags); ++#endif + + if (old_rd) + call_rcu(&old_rd->rcu, free_rootdomain); +diff --git a/kernel/signal.c b/kernel/signal.c +index edf8915ddd54..8aad311cbd59 100644 +--- a/kernel/signal.c ++++ b/kernel/signal.c +@@ -1057,27 +1057,6 @@ static inline bool legacy_queue(struct sigpending *signals, int sig) + return (sig < SIGRTMIN) && sigismember(&signals->signal, sig); + } + +-#ifdef CONFIG_USER_NS +-static inline void userns_fixup_signal_uid(struct kernel_siginfo *info, struct task_struct *t) +-{ +- if (current_user_ns() == task_cred_xxx(t, user_ns)) +- return; +- +- if (SI_FROMKERNEL(info)) +- return; +- +- rcu_read_lock(); +- info->si_uid = from_kuid_munged(task_cred_xxx(t, user_ns), +- make_kuid(current_user_ns(), info->si_uid)); +- rcu_read_unlock(); +-} +-#else +-static inline void userns_fixup_signal_uid(struct kernel_siginfo *info, struct task_struct *t) +-{ +- return; +-} +-#endif +- + static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struct *t, + enum pid_type type, int from_ancestor_ns) + { +@@ -1135,7 +1114,11 @@ static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struc + q->info.si_code = SI_USER; + q->info.si_pid = task_tgid_nr_ns(current, + task_active_pid_ns(t)); +- q->info.si_uid = from_kuid_munged(current_user_ns(), current_uid()); ++ rcu_read_lock(); ++ q->info.si_uid = ++ from_kuid_munged(task_cred_xxx(t, user_ns), ++ current_uid()); ++ rcu_read_unlock(); + break; + case (unsigned long) SEND_SIG_PRIV: + clear_siginfo(&q->info); +@@ -1147,13 +1130,8 @@ static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struc + break; + default: + copy_siginfo(&q->info, info); +- if (from_ancestor_ns) +- q->info.si_pid = 0; + break; + } +- +- userns_fixup_signal_uid(&q->info, t); +- + } else if (!is_si_special(info)) { + if (sig >= SIGRTMIN && info->si_code != SI_USER) { + /* +@@ -1197,6 +1175,28 @@ static int __send_signal(int sig, struct kernel_siginfo *info, struct task_struc + return ret; + } + ++static inline bool has_si_pid_and_uid(struct kernel_siginfo *info) ++{ ++ bool ret = false; ++ switch (siginfo_layout(info->si_signo, info->si_code)) { ++ case SIL_KILL: ++ case SIL_CHLD: ++ case SIL_RT: ++ ret = true; ++ break; ++ case SIL_TIMER: ++ case SIL_POLL: ++ case SIL_FAULT: ++ case SIL_FAULT_MCEERR: ++ case SIL_FAULT_BNDERR: ++ case SIL_FAULT_PKUERR: ++ case SIL_SYS: ++ ret = false; ++ break; ++ } ++ return ret; ++} ++ + static int send_signal(int sig, struct kernel_siginfo *info, struct task_struct *t, + enum pid_type type) + { +@@ -1206,7 +1206,20 @@ static int send_signal(int sig, struct kernel_siginfo *info, struct task_struct + from_ancestor_ns = si_fromuser(info) && + !task_pid_nr_ns(current, task_active_pid_ns(t)); + #endif ++ if (!is_si_special(info) && has_si_pid_and_uid(info)) { ++ struct user_namespace *t_user_ns; ++ ++ rcu_read_lock(); ++ t_user_ns = task_cred_xxx(t, user_ns); ++ if (current_user_ns() != t_user_ns) { ++ kuid_t uid = make_kuid(current_user_ns(), info->si_uid); ++ info->si_uid = from_kuid_munged(t_user_ns, uid); ++ } ++ rcu_read_unlock(); + ++ if (!task_pid_nr_ns(current, task_active_pid_ns(t))) ++ info->si_pid = 0; ++ } + return __send_signal(sig, info, t, type, from_ancestor_ns); + } + +@@ -1440,13 +1453,44 @@ static inline bool kill_as_cred_perm(const struct cred *cred, + uid_eq(cred->uid, pcred->uid); + } + +-/* like kill_pid_info(), but doesn't use uid/euid of "current" */ +-int kill_pid_info_as_cred(int sig, struct kernel_siginfo *info, struct pid *pid, +- const struct cred *cred) ++/* ++ * The usb asyncio usage of siginfo is wrong. The glibc support ++ * for asyncio which uses SI_ASYNCIO assumes the layout is SIL_RT. ++ * AKA after the generic fields: ++ * kernel_pid_t si_pid; ++ * kernel_uid32_t si_uid; ++ * sigval_t si_value; ++ * ++ * Unfortunately when usb generates SI_ASYNCIO it assumes the layout ++ * after the generic fields is: ++ * void __user *si_addr; ++ * ++ * This is a practical problem when there is a 64bit big endian kernel ++ * and a 32bit userspace. As the 32bit address will encoded in the low ++ * 32bits of the pointer. Those low 32bits will be stored at higher ++ * address than appear in a 32 bit pointer. So userspace will not ++ * see the address it was expecting for it's completions. ++ * ++ * There is nothing in the encoding that can allow ++ * copy_siginfo_to_user32 to detect this confusion of formats, so ++ * handle this by requiring the caller of kill_pid_usb_asyncio to ++ * notice when this situration takes place and to store the 32bit ++ * pointer in sival_int, instead of sival_addr of the sigval_t addr ++ * parameter. ++ */ ++int kill_pid_usb_asyncio(int sig, int errno, sigval_t addr, ++ struct pid *pid, const struct cred *cred) + { +- int ret = -EINVAL; ++ struct kernel_siginfo info; + struct task_struct *p; + unsigned long flags; ++ int ret = -EINVAL; ++ ++ clear_siginfo(&info); ++ info.si_signo = sig; ++ info.si_errno = errno; ++ info.si_code = SI_ASYNCIO; ++ *((sigval_t *)&info.si_pid) = addr; + + if (!valid_signal(sig)) + return ret; +@@ -1457,17 +1501,17 @@ int kill_pid_info_as_cred(int sig, struct kernel_siginfo *info, struct pid *pid, + ret = -ESRCH; + goto out_unlock; + } +- if (si_fromuser(info) && !kill_as_cred_perm(cred, p)) { ++ if (!kill_as_cred_perm(cred, p)) { + ret = -EPERM; + goto out_unlock; + } +- ret = security_task_kill(p, info, sig, cred); ++ ret = security_task_kill(p, &info, sig, cred); + if (ret) + goto out_unlock; + + if (sig) { + if (lock_task_sighand(p, &flags)) { +- ret = __send_signal(sig, info, p, PIDTYPE_TGID, 0); ++ ret = __send_signal(sig, &info, p, PIDTYPE_TGID, 0); + unlock_task_sighand(p, &flags); + } else + ret = -ESRCH; +@@ -1476,7 +1520,7 @@ int kill_pid_info_as_cred(int sig, struct kernel_siginfo *info, struct pid *pid, + rcu_read_unlock(); + return ret; + } +-EXPORT_SYMBOL_GPL(kill_pid_info_as_cred); ++EXPORT_SYMBOL_GPL(kill_pid_usb_asyncio); + + /* + * kill_something_info() interprets pid in interesting ways just like kill(2). +@@ -4477,6 +4521,28 @@ static inline void siginfo_buildtime_checks(void) + CHECK_OFFSET(si_syscall); + CHECK_OFFSET(si_arch); + #undef CHECK_OFFSET ++ ++ /* usb asyncio */ ++ BUILD_BUG_ON(offsetof(struct siginfo, si_pid) != ++ offsetof(struct siginfo, si_addr)); ++ if (sizeof(int) == sizeof(void __user *)) { ++ BUILD_BUG_ON(sizeof_field(struct siginfo, si_pid) != ++ sizeof(void __user *)); ++ } else { ++ BUILD_BUG_ON((sizeof_field(struct siginfo, si_pid) + ++ sizeof_field(struct siginfo, si_uid)) != ++ sizeof(void __user *)); ++ BUILD_BUG_ON(offsetofend(struct siginfo, si_pid) != ++ offsetof(struct siginfo, si_uid)); ++ } ++#ifdef CONFIG_COMPAT ++ BUILD_BUG_ON(offsetof(struct compat_siginfo, si_pid) != ++ offsetof(struct compat_siginfo, si_addr)); ++ BUILD_BUG_ON(sizeof_field(struct compat_siginfo, si_pid) != ++ sizeof(compat_uptr_t)); ++ BUILD_BUG_ON(sizeof_field(struct compat_siginfo, si_pid) != ++ sizeof_field(struct siginfo, si_pid)); ++#endif + } + + void __init signals_init(void) +diff --git a/kernel/skip_list.c b/kernel/skip_list.c +new file mode 100644 +index 000000000000..bf5c6e97e139 +--- /dev/null ++++ b/kernel/skip_list.c +@@ -0,0 +1,148 @@ ++/* ++ Copyright (C) 2011,2016 Con Kolivas. ++ ++ Code based on example originally by William Pugh. ++ ++Skip Lists are a probabilistic alternative to balanced trees, as ++described in the June 1990 issue of CACM and were invented by ++William Pugh in 1987. ++ ++A couple of comments about this implementation: ++The routine randomLevel has been hard-coded to generate random ++levels using p=0.25. It can be easily changed. ++ ++The insertion routine has been implemented so as to use the ++dirty hack described in the CACM paper: if a random level is ++generated that is more than the current maximum level, the ++current maximum level plus one is used instead. ++ ++Levels start at zero and go up to MaxLevel (which is equal to ++MaxNumberOfLevels-1). ++ ++The routines defined in this file are: ++ ++init: defines slnode ++ ++new_skiplist: returns a new, empty list ++ ++randomLevel: Returns a random level based on a u64 random seed passed to it. ++In MuQSS, the "niffy" time is used for this purpose. ++ ++insert(l,key, value): inserts the binding (key, value) into l. This operation ++occurs in O(log n) time. ++ ++delnode(slnode, l, node): deletes any binding of key from the l based on the ++actual node value. This operation occurs in O(k) time where k is the ++number of levels of the node in question (max 8). The original delete ++function occurred in O(log n) time and involved a search. ++ ++MuQSS Notes: In this implementation of skiplists, there are bidirectional ++next/prev pointers and the insert function returns a pointer to the actual ++node the value is stored. The key here is chosen by the scheduler so as to ++sort tasks according to the priority list requirements and is no longer used ++by the scheduler after insertion. The scheduler lookup, however, occurs in ++O(1) time because it is always the first item in the level 0 linked list. ++Since the task struct stores a copy of the node pointer upon skiplist_insert, ++it can also remove it much faster than the original implementation with the ++aid of prev<->next pointer manipulation and no searching. ++ ++*/ ++ ++#include ++#include ++ ++#define MaxNumberOfLevels 8 ++#define MaxLevel (MaxNumberOfLevels - 1) ++ ++void skiplist_init(skiplist_node *slnode) ++{ ++ int i; ++ ++ slnode->key = 0xFFFFFFFFFFFFFFFF; ++ slnode->level = 0; ++ slnode->value = NULL; ++ for (i = 0; i < MaxNumberOfLevels; i++) ++ slnode->next[i] = slnode->prev[i] = slnode; ++} ++ ++skiplist *new_skiplist(skiplist_node *slnode) ++{ ++ skiplist *l = kzalloc(sizeof(skiplist), GFP_ATOMIC); ++ ++ BUG_ON(!l); ++ l->header = slnode; ++ return l; ++} ++ ++void free_skiplist(skiplist *l) ++{ ++ skiplist_node *p, *q; ++ ++ p = l->header; ++ do { ++ q = p->next[0]; ++ p->next[0]->prev[0] = q->prev[0]; ++ skiplist_node_init(p); ++ p = q; ++ } while (p != l->header); ++ kfree(l); ++} ++ ++void skiplist_node_init(skiplist_node *node) ++{ ++ memset(node, 0, sizeof(skiplist_node)); ++} ++ ++static inline unsigned int randomLevel(const long unsigned int randseed) ++{ ++ return find_first_bit(&randseed, MaxLevel) / 2; ++} ++ ++void skiplist_insert(skiplist *l, skiplist_node *node, keyType key, valueType value, unsigned int randseed) ++{ ++ skiplist_node *update[MaxNumberOfLevels]; ++ skiplist_node *p, *q; ++ int k = l->level; ++ ++ p = l->header; ++ do { ++ while (q = p->next[k], q->key <= key) ++ p = q; ++ update[k] = p; ++ } while (--k >= 0); ++ ++ ++l->entries; ++ k = randomLevel(randseed); ++ if (k > l->level) { ++ k = ++l->level; ++ update[k] = l->header; ++ } ++ ++ node->level = k; ++ node->key = key; ++ node->value = value; ++ do { ++ p = update[k]; ++ node->next[k] = p->next[k]; ++ p->next[k] = node; ++ node->prev[k] = p; ++ node->next[k]->prev[k] = node; ++ } while (--k >= 0); ++} ++ ++void skiplist_delete(skiplist *l, skiplist_node *node) ++{ ++ int k, m = node->level; ++ ++ for (k = 0; k <= m; k++) { ++ node->prev[k]->next[k] = node->next[k]; ++ node->next[k]->prev[k] = node->prev[k]; ++ } ++ skiplist_node_init(node); ++ if (m == l->level) { ++ while (l->header->next[m] == l->header && l->header->prev[m] == l->header && m > 0) ++ m--; ++ l->level = m; ++ } ++ l->entries--; ++} +diff --git a/kernel/stacktrace.c b/kernel/stacktrace.c +index 36139de0a3c4..899b726c9e98 100644 +--- a/kernel/stacktrace.c ++++ b/kernel/stacktrace.c +@@ -226,12 +226,17 @@ unsigned int stack_trace_save_user(unsigned long *store, unsigned int size) + .store = store, + .size = size, + }; ++ mm_segment_t fs; + + /* Trace user stack if not a kernel thread */ + if (!current->mm) + return 0; + ++ fs = get_fs(); ++ set_fs(USER_DS); + arch_stack_walk_user(consume_entry, &c, task_pt_regs(current)); ++ set_fs(fs); ++ + return c.len; + } + #endif +diff --git a/kernel/sysctl.c b/kernel/sysctl.c +index 1beca96fb625..460f9b1d44d7 100644 +--- a/kernel/sysctl.c ++++ b/kernel/sysctl.c +@@ -110,6 +110,9 @@ extern int core_uses_pid; + extern char core_pattern[]; + extern unsigned int core_pipe_limit; + #endif ++#ifdef CONFIG_USER_NS ++extern int unprivileged_userns_clone; ++#endif + extern int pid_max; + extern int pid_max_min, pid_max_max; + extern int percpu_pagelist_fraction; +@@ -135,7 +138,15 @@ static unsigned long one_ul = 1; + static unsigned long long_max = LONG_MAX; + static int one_hundred = 100; + static int one_thousand = 1000; +-#ifdef CONFIG_PRINTK ++#ifdef CONFIG_SCHED_MUQSS ++extern int rr_interval; ++extern int sched_interactive; ++extern int sched_iso_cpu; ++extern int sched_yield_type; ++extern int hrtimer_granularity_us; ++extern int hrtimeout_min_us; ++#endif ++#if defined(CONFIG_PRINTK) || defined(CONFIG_SCHED_MUQSS) + static int ten_thousand = 10000; + #endif + #ifdef CONFIG_PERF_EVENTS +@@ -302,7 +313,7 @@ static struct ctl_table sysctl_base_table[] = { + { } + }; + +-#ifdef CONFIG_SCHED_DEBUG ++#if defined(CONFIG_SCHED_DEBUG) && !defined(CONFIG_SCHED_MUQSS) + static int min_sched_granularity_ns = 100000; /* 100 usecs */ + static int max_sched_granularity_ns = NSEC_PER_SEC; /* 1 second */ + static int min_wakeup_granularity_ns; /* 0 usecs */ +@@ -319,6 +330,7 @@ static int max_extfrag_threshold = 1000; + #endif + + static struct ctl_table kern_table[] = { ++#ifndef CONFIG_SCHED_MUQSS + { + .procname = "sched_child_runs_first", + .data = &sysctl_sched_child_runs_first, +@@ -484,6 +496,7 @@ static struct ctl_table kern_table[] = { + .extra2 = &one, + }, + #endif ++#endif /* !CONFIG_SCHED_MUQSS */ + #ifdef CONFIG_PROVE_LOCKING + { + .procname = "prove_locking", +@@ -532,6 +545,15 @@ static struct ctl_table kern_table[] = { + .proc_handler = proc_dointvec, + }, + #endif ++#ifdef CONFIG_USER_NS ++ { ++ .procname = "unprivileged_userns_clone", ++ .data = &unprivileged_userns_clone, ++ .maxlen = sizeof(int), ++ .mode = 0644, ++ .proc_handler = proc_dointvec, ++ }, ++#endif + #ifdef CONFIG_PROC_SYSCTL + { + .procname = "tainted", +@@ -1056,6 +1078,62 @@ static struct ctl_table kern_table[] = { + .proc_handler = proc_dointvec, + }, + #endif ++#ifdef CONFIG_SCHED_MUQSS ++ { ++ .procname = "rr_interval", ++ .data = &rr_interval, ++ .maxlen = sizeof (int), ++ .mode = 0644, ++ .proc_handler = &proc_dointvec_minmax, ++ .extra1 = &one, ++ .extra2 = &one_thousand, ++ }, ++ { ++ .procname = "interactive", ++ .data = &sched_interactive, ++ .maxlen = sizeof(int), ++ .mode = 0644, ++ .proc_handler = &proc_dointvec_minmax, ++ .extra1 = &zero, ++ .extra2 = &one, ++ }, ++ { ++ .procname = "iso_cpu", ++ .data = &sched_iso_cpu, ++ .maxlen = sizeof (int), ++ .mode = 0644, ++ .proc_handler = &proc_dointvec_minmax, ++ .extra1 = &zero, ++ .extra2 = &one_hundred, ++ }, ++ { ++ .procname = "yield_type", ++ .data = &sched_yield_type, ++ .maxlen = sizeof (int), ++ .mode = 0644, ++ .proc_handler = &proc_dointvec_minmax, ++ .extra1 = &zero, ++ .extra2 = &two, ++ }, ++ { ++ .procname = "hrtimer_granularity_us", ++ .data = &hrtimer_granularity_us, ++ .maxlen = sizeof(int), ++ .mode = 0644, ++ .proc_handler = &proc_dointvec_minmax, ++ .extra1 = &one, ++ .extra2 = &ten_thousand, ++ }, ++ { ++ .procname = "hrtimeout_min_us", ++ .data = &hrtimeout_min_us, ++ .maxlen = sizeof(int), ++ .mode = 0644, ++ .proc_handler = &proc_dointvec_minmax, ++ .extra1 = &one, ++ .extra2 = &ten_thousand, ++ }, ++#endif + #if defined(CONFIG_S390) && defined(CONFIG_SMP) + { + .procname = "spin_retry", +diff --git a/kernel/time/clockevents.c b/kernel/time/clockevents.c +index f5490222e134..3b3bf431f14e 100644 +--- a/kernel/time/clockevents.c ++++ b/kernel/time/clockevents.c +@@ -190,8 +190,14 @@ int clockevents_tick_resume(struct clock_event_device *dev) + + #ifdef CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST + ++#ifdef CONFIG_SCHED_MUQSS ++int __read_mostly hrtimer_granularity_us = 100; ++/* Limit min_delta to 100us */ ++#define MIN_DELTA_LIMIT (hrtimer_granularity_us * NSEC_PER_USEC) ++#else + /* Limit min_delta to a jiffie */ + #define MIN_DELTA_LIMIT (NSEC_PER_SEC / HZ) ++#endif + + /** + * clockevents_increase_min_delta - raise minimum delta of a clock event device +diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c +index 41dfff23c1f9..6cffbb50aaf5 100644 +--- a/kernel/time/hrtimer.c ++++ b/kernel/time/hrtimer.c +@@ -2017,3 +2017,119 @@ int __sched schedule_hrtimeout(ktime_t *expires, + return schedule_hrtimeout_range(expires, 0, mode); + } + EXPORT_SYMBOL_GPL(schedule_hrtimeout); ++ ++#ifdef CONFIG_SCHED_MUQSS ++/* ++ * As per schedule_hrtimeout but taskes a millisecond value and returns how ++ * many milliseconds are left. ++ */ ++long __sched schedule_msec_hrtimeout(long timeout) ++{ ++ struct hrtimer_sleeper t; ++ int delta, jiffs; ++ ktime_t expires; ++ ++ if (!timeout) { ++ __set_current_state(TASK_RUNNING); ++ return 0; ++ } ++ ++ jiffs = msecs_to_jiffies(timeout); ++ /* ++ * If regular timer resolution is adequate or hrtimer resolution is not ++ * (yet) better than Hz, as would occur during startup, use regular ++ * timers. ++ */ ++ if (jiffs > 4 || hrtimer_resolution >= NSEC_PER_SEC / HZ || pm_freezing) ++ return schedule_timeout(jiffs); ++ ++ delta = (timeout % 1000) * NSEC_PER_MSEC; ++ expires = ktime_set(0, delta); ++ ++ hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ hrtimer_set_expires_range_ns(&t.timer, expires, delta); ++ ++ hrtimer_init_sleeper(&t, current); ++ ++ hrtimer_start_expires(&t.timer, HRTIMER_MODE_REL); ++ ++ if (likely(t.task)) ++ schedule(); ++ ++ hrtimer_cancel(&t.timer); ++ destroy_hrtimer_on_stack(&t.timer); ++ ++ __set_current_state(TASK_RUNNING); ++ ++ expires = hrtimer_expires_remaining(&t.timer); ++ timeout = ktime_to_ms(expires); ++ return timeout < 0 ? 0 : timeout; ++} ++ ++EXPORT_SYMBOL(schedule_msec_hrtimeout); ++ ++#define USECS_PER_SEC 1000000 ++extern int hrtimer_granularity_us; ++ ++static inline long schedule_usec_hrtimeout(long timeout) ++{ ++ struct hrtimer_sleeper t; ++ ktime_t expires; ++ int delta; ++ ++ if (!timeout) { ++ __set_current_state(TASK_RUNNING); ++ return 0; ++ } ++ ++ if (hrtimer_resolution >= NSEC_PER_SEC / HZ) ++ return schedule_timeout(usecs_to_jiffies(timeout)); ++ ++ if (timeout < hrtimer_granularity_us) ++ timeout = hrtimer_granularity_us; ++ delta = (timeout % USECS_PER_SEC) * NSEC_PER_USEC; ++ expires = ktime_set(0, delta); ++ ++ hrtimer_init_on_stack(&t.timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); ++ hrtimer_set_expires_range_ns(&t.timer, expires, delta); ++ ++ hrtimer_init_sleeper(&t, current); ++ ++ hrtimer_start_expires(&t.timer, HRTIMER_MODE_REL); ++ ++ if (likely(t.task)) ++ schedule(); ++ ++ hrtimer_cancel(&t.timer); ++ destroy_hrtimer_on_stack(&t.timer); ++ ++ __set_current_state(TASK_RUNNING); ++ ++ expires = hrtimer_expires_remaining(&t.timer); ++ timeout = ktime_to_us(expires); ++ return timeout < 0 ? 0 : timeout; ++} ++ ++int __read_mostly hrtimeout_min_us = 500; ++ ++long __sched schedule_min_hrtimeout(void) ++{ ++ return usecs_to_jiffies(schedule_usec_hrtimeout(hrtimeout_min_us)); ++} ++ ++EXPORT_SYMBOL(schedule_min_hrtimeout); ++ ++long __sched schedule_msec_hrtimeout_interruptible(long timeout) ++{ ++ __set_current_state(TASK_INTERRUPTIBLE); ++ return schedule_msec_hrtimeout(timeout); ++} ++EXPORT_SYMBOL(schedule_msec_hrtimeout_interruptible); ++ ++long __sched schedule_msec_hrtimeout_uninterruptible(long timeout) ++{ ++ __set_current_state(TASK_UNINTERRUPTIBLE); ++ return schedule_msec_hrtimeout(timeout); ++} ++EXPORT_SYMBOL(schedule_msec_hrtimeout_uninterruptible); ++#endif /* CONFIG_SCHED_MUQSS */ +diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c +index 8de4f789dc1b..65eb796610dc 100644 +--- a/kernel/time/ntp.c ++++ b/kernel/time/ntp.c +@@ -43,6 +43,7 @@ static u64 tick_length_base; + #define MAX_TICKADJ 500LL /* usecs */ + #define MAX_TICKADJ_SCALED \ + (((MAX_TICKADJ * NSEC_PER_USEC) << NTP_SCALE_SHIFT) / NTP_INTERVAL_FREQ) ++#define MAX_TAI_OFFSET 100000 + + /* + * phase-lock loop variables +@@ -691,7 +692,8 @@ static inline void process_adjtimex_modes(const struct __kernel_timex *txc, + time_constant = max(time_constant, 0l); + } + +- if (txc->modes & ADJ_TAI && txc->constant >= 0) ++ if (txc->modes & ADJ_TAI && ++ txc->constant >= 0 && txc->constant <= MAX_TAI_OFFSET) + *time_tai = txc->constant; + + if (txc->modes & ADJ_OFFSET) +diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c +index 0a426f4e3125..bdd0a5c1811e 100644 +--- a/kernel/time/posix-cpu-timers.c ++++ b/kernel/time/posix-cpu-timers.c +@@ -829,7 +829,7 @@ static void check_thread_timers(struct task_struct *tsk, + tsk_expires->virt_exp = expires; + + tsk_expires->sched_exp = check_timers_list(++timers, firing, +- tsk->se.sum_exec_runtime); ++ tsk_seruntime(tsk)); + + /* + * Check for the special case thread timers. +@@ -839,7 +839,7 @@ static void check_thread_timers(struct task_struct *tsk, + unsigned long hard = task_rlimit_max(tsk, RLIMIT_RTTIME); + + if (hard != RLIM_INFINITY && +- tsk->rt.timeout > DIV_ROUND_UP(hard, USEC_PER_SEC/HZ)) { ++ tsk_rttimeout(tsk) > DIV_ROUND_UP(hard, USEC_PER_SEC/HZ)) { + /* + * At the hard limit, we just die. + * No need to calculate anything else now. +@@ -851,7 +851,7 @@ static void check_thread_timers(struct task_struct *tsk, + __group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk); + return; + } +- if (tsk->rt.timeout > DIV_ROUND_UP(soft, USEC_PER_SEC/HZ)) { ++ if (tsk_rttimeout(tsk) > DIV_ROUND_UP(soft, USEC_PER_SEC/HZ)) { + /* + * At the soft limit, send a SIGXCPU every second. + */ +@@ -1091,7 +1091,7 @@ static inline int fastpath_timer_check(struct task_struct *tsk) + struct task_cputime task_sample; + + task_cputime(tsk, &task_sample.utime, &task_sample.stime); +- task_sample.sum_exec_runtime = tsk->se.sum_exec_runtime; ++ task_sample.sum_exec_runtime = tsk_seruntime(tsk); + if (task_cputime_expired(&task_sample, &tsk->cputime_expires)) + return 1; + } +diff --git a/kernel/time/timer.c b/kernel/time/timer.c +index 343c7ba33b1c..1f5009f69da1 100644 +--- a/kernel/time/timer.c ++++ b/kernel/time/timer.c +@@ -43,6 +43,7 @@ + #include + #include + #include ++#include + + #include + #include +@@ -1482,7 +1483,7 @@ static unsigned long __next_timer_interrupt(struct timer_base *base) + * Check, if the next hrtimer event is before the next timer wheel + * event: + */ +-static u64 cmp_next_hrtimer_event(u64 basem, u64 expires) ++static u64 cmp_next_hrtimer_event(struct timer_base *base, u64 basem, u64 expires) + { + u64 nextevt = hrtimer_get_next_event(); + +@@ -1500,6 +1501,11 @@ static u64 cmp_next_hrtimer_event(u64 basem, u64 expires) + if (nextevt <= basem) + return basem; + ++#ifdef CONFIG_SCHED_MUQSS ++ if (nextevt < expires && nextevt - basem <= TICK_NSEC) ++ base->is_idle = false; ++#endif ++ + /* + * Round up to the next jiffie. High resolution timers are + * off, so the hrtimers are expired in the tick and we need to +@@ -1569,7 +1575,7 @@ u64 get_next_timer_interrupt(unsigned long basej, u64 basem) + } + raw_spin_unlock(&base->lock); + +- return cmp_next_hrtimer_event(basem, expires); ++ return cmp_next_hrtimer_event(base, basem, expires); + } + + /** +@@ -1801,6 +1807,18 @@ signed long __sched schedule_timeout(signed long timeout) + + expire = timeout + jiffies; + ++#if defined(CONFIG_HIGH_RES_TIMERS) && defined(CONFIG_SCHED_MUQSS) ++ if (timeout == 1 && hrtimer_resolution < NSEC_PER_SEC / HZ) { ++ /* ++ * Special case 1 as being a request for the minimum timeout ++ * and use highres timers to timeout after 1ms to workaround ++ * the granularity of low Hz tick timers. ++ */ ++ if (!schedule_min_hrtimeout()) ++ return 0; ++ goto out_timeout; ++ } ++#endif + timer.task = current; + timer_setup_on_stack(&timer.timer, process_timeout, 0); + __mod_timer(&timer.timer, expire, 0); +@@ -1810,6 +1828,7 @@ signed long __sched schedule_timeout(signed long timeout) + /* Remove the timer from the object tracker */ + destroy_timer_on_stack(&timer.timer); + ++out_timeout: + timeout = expire - jiffies; + + out: +@@ -1955,6 +1974,18 @@ void msleep(unsigned int msecs) + { + unsigned long timeout = msecs_to_jiffies(msecs) + 1; + ++#ifdef CONFIG_SCHED_MUQSS ++ /* ++ * Use high resolution timers where the resolution of tick based ++ * timers is inadequate. ++ */ ++ if (timeout < 6 && hrtimer_resolution < NSEC_PER_SEC / HZ && !pm_freezing) { ++ while (msecs) ++ msecs = schedule_msec_hrtimeout_uninterruptible(msecs); ++ return; ++ } ++#endif ++ + while (timeout) + timeout = schedule_timeout_uninterruptible(timeout); + } +@@ -1969,6 +2000,14 @@ unsigned long msleep_interruptible(unsigned int msecs) + { + unsigned long timeout = msecs_to_jiffies(msecs) + 1; + ++#ifdef CONFIG_SCHED_MUQSS ++ if (timeout < 6 && hrtimer_resolution < NSEC_PER_SEC / HZ && !pm_freezing) { ++ while (msecs && !signal_pending(current)) ++ msecs = schedule_msec_hrtimeout_interruptible(msecs); ++ return msecs; ++ } ++#endif ++ + while (timeout && !signal_pending(current)) + timeout = schedule_timeout_interruptible(timeout); + return jiffies_to_msecs(timeout); +diff --git a/kernel/time/timer_list.c b/kernel/time/timer_list.c +index 98ba50dcb1b2..acb326f5f50a 100644 +--- a/kernel/time/timer_list.c ++++ b/kernel/time/timer_list.c +@@ -282,23 +282,6 @@ static inline void timer_list_header(struct seq_file *m, u64 now) + SEQ_printf(m, "\n"); + } + +-static int timer_list_show(struct seq_file *m, void *v) +-{ +- struct timer_list_iter *iter = v; +- +- if (iter->cpu == -1 && !iter->second_pass) +- timer_list_header(m, iter->now); +- else if (!iter->second_pass) +- print_cpu(m, iter->cpu, iter->now); +-#ifdef CONFIG_GENERIC_CLOCKEVENTS +- else if (iter->cpu == -1 && iter->second_pass) +- timer_list_show_tickdevices_header(m); +- else +- print_tickdevice(m, tick_get_device(iter->cpu), iter->cpu); +-#endif +- return 0; +-} +- + void sysrq_timer_list_show(void) + { + u64 now = ktime_to_ns(ktime_get()); +@@ -317,6 +300,24 @@ void sysrq_timer_list_show(void) + return; + } + ++#ifdef CONFIG_PROC_FS ++static int timer_list_show(struct seq_file *m, void *v) ++{ ++ struct timer_list_iter *iter = v; ++ ++ if (iter->cpu == -1 && !iter->second_pass) ++ timer_list_header(m, iter->now); ++ else if (!iter->second_pass) ++ print_cpu(m, iter->cpu, iter->now); ++#ifdef CONFIG_GENERIC_CLOCKEVENTS ++ else if (iter->cpu == -1 && iter->second_pass) ++ timer_list_show_tickdevices_header(m); ++ else ++ print_tickdevice(m, tick_get_device(iter->cpu), iter->cpu); ++#endif ++ return 0; ++} ++ + static void *move_iter(struct timer_list_iter *iter, loff_t offset) + { + for (; offset; offset--) { +@@ -376,3 +377,4 @@ static int __init init_timer_list_procfs(void) + return 0; + } + __initcall(init_timer_list_procfs); ++#endif +diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c +index 576c41644e77..208220d526e8 100644 +--- a/kernel/trace/ftrace.c ++++ b/kernel/trace/ftrace.c +@@ -1622,6 +1622,11 @@ static bool test_rec_ops_needs_regs(struct dyn_ftrace *rec) + return keep_regs; + } + ++static struct ftrace_ops * ++ftrace_find_tramp_ops_any(struct dyn_ftrace *rec); ++static struct ftrace_ops * ++ftrace_find_tramp_ops_next(struct dyn_ftrace *rec, struct ftrace_ops *ops); ++ + static bool __ftrace_hash_rec_update(struct ftrace_ops *ops, + int filter_hash, + bool inc) +@@ -1750,15 +1755,17 @@ static bool __ftrace_hash_rec_update(struct ftrace_ops *ops, + } + + /* +- * If the rec had TRAMP enabled, then it needs to +- * be cleared. As TRAMP can only be enabled iff +- * there is only a single ops attached to it. +- * In otherwords, always disable it on decrementing. +- * In the future, we may set it if rec count is +- * decremented to one, and the ops that is left +- * has a trampoline. ++ * The TRAMP needs to be set only if rec count ++ * is decremented to one, and the ops that is ++ * left has a trampoline. As TRAMP can only be ++ * enabled if there is only a single ops attached ++ * to it. + */ +- rec->flags &= ~FTRACE_FL_TRAMP; ++ if (ftrace_rec_count(rec) == 1 && ++ ftrace_find_tramp_ops_any(rec)) ++ rec->flags |= FTRACE_FL_TRAMP; ++ else ++ rec->flags &= ~FTRACE_FL_TRAMP; + + /* + * flags will be cleared in ftrace_check_record() +@@ -1951,11 +1958,6 @@ static void print_ip_ins(const char *fmt, const unsigned char *p) + printk(KERN_CONT "%s%02x", i ? ":" : "", p[i]); + } + +-static struct ftrace_ops * +-ftrace_find_tramp_ops_any(struct dyn_ftrace *rec); +-static struct ftrace_ops * +-ftrace_find_tramp_ops_next(struct dyn_ftrace *rec, struct ftrace_ops *ops); +- + enum ftrace_bug_type ftrace_bug_type; + const void *ftrace_expected; + +diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c +index 69ebf3c2f1b5..78af97163147 100644 +--- a/kernel/trace/trace_functions_graph.c ++++ b/kernel/trace/trace_functions_graph.c +@@ -137,6 +137,13 @@ int trace_graph_entry(struct ftrace_graph_ent *trace) + if (trace_recursion_test(TRACE_GRAPH_NOTRACE_BIT)) + return 0; + ++ /* ++ * Do not trace a function if it's filtered by set_graph_notrace. ++ * Make the index of ret stack negative to indicate that it should ++ * ignore further functions. But it needs its own ret stack entry ++ * to recover the original index in order to continue tracing after ++ * returning from the function. ++ */ + if (ftrace_graph_notrace_addr(trace->func)) { + trace_recursion_set(TRACE_GRAPH_NOTRACE_BIT); + /* +@@ -155,16 +162,6 @@ int trace_graph_entry(struct ftrace_graph_ent *trace) + if (ftrace_graph_ignore_irqs()) + return 0; + +- /* +- * Do not trace a function if it's filtered by set_graph_notrace. +- * Make the index of ret stack negative to indicate that it should +- * ignore further functions. But it needs its own ret stack entry +- * to recover the original index in order to continue tracing after +- * returning from the function. +- */ +- if (ftrace_graph_notrace_addr(trace->func)) +- return 1; +- + /* + * Stop here if tracing_threshold is set. We only write function return + * events to the ring buffer. +diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c +index ba751f993c3b..cab4a5398f1d 100644 +--- a/kernel/trace/trace_output.c ++++ b/kernel/trace/trace_output.c +@@ -1109,17 +1109,10 @@ static enum print_line_t trace_user_stack_print(struct trace_iterator *iter, + for (i = 0; i < FTRACE_STACK_ENTRIES; i++) { + unsigned long ip = field->caller[i]; + +- if (ip == ULONG_MAX || trace_seq_has_overflowed(s)) ++ if (!ip || trace_seq_has_overflowed(s)) + break; + + trace_seq_puts(s, " => "); +- +- if (!ip) { +- trace_seq_puts(s, "??"); +- trace_seq_putc(s, '\n'); +- continue; +- } +- + seq_print_user_ip(s, mm, ip, flags); + trace_seq_putc(s, '\n'); + } +diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c +index 69ee8ef12cee..6edb01f2fd81 100644 +--- a/kernel/trace/trace_selftest.c ++++ b/kernel/trace/trace_selftest.c +@@ -1048,10 +1048,15 @@ static int trace_wakeup_test_thread(void *data) + { + /* Make this a -deadline thread */ + static const struct sched_attr attr = { ++#ifdef CONFIG_SCHED_MUQSS ++ /* No deadline on MuQSS, use RR */ ++ .sched_policy = SCHED_RR, ++#else + .sched_policy = SCHED_DEADLINE, + .sched_runtime = 100000ULL, + .sched_deadline = 10000000ULL, + .sched_period = 10000000ULL ++#endif + }; + struct wakeup_test_data *x = data; + +diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c +index 0eff45ce7703..aa27ecacfb1e 100644 +--- a/kernel/user_namespace.c ++++ b/kernel/user_namespace.c +@@ -21,6 +21,13 @@ + #include + #include + ++/* sysctl */ ++#ifdef CONFIG_USER_NS_UNPRIVILEGED ++int unprivileged_userns_clone = 1; ++#else ++int unprivileged_userns_clone; ++#endif ++ + static struct kmem_cache *user_ns_cachep __read_mostly; + static DEFINE_MUTEX(userns_state_mutex); + +diff --git a/lib/Makefile b/lib/Makefile +index fb7697031a79..7c3c1ad21afc 100644 +--- a/lib/Makefile ++++ b/lib/Makefile +@@ -278,7 +278,8 @@ obj-$(CONFIG_UCS2_STRING) += ucs2_string.o + obj-$(CONFIG_UBSAN) += ubsan.o + + UBSAN_SANITIZE_ubsan.o := n +-CFLAGS_ubsan.o := $(call cc-option, -fno-conserve-stack -fno-stack-protector) ++KASAN_SANITIZE_ubsan.o := n ++CFLAGS_ubsan.o := $(call cc-option, -fno-stack-protector) $(DISABLE_STACKLEAK_PLUGIN) + + obj-$(CONFIG_SBITMAP) += sbitmap.o + +diff --git a/lib/ioremap.c b/lib/ioremap.c +index 063213685563..a95161d9c883 100644 +--- a/lib/ioremap.c ++++ b/lib/ioremap.c +@@ -86,6 +86,9 @@ static int ioremap_try_huge_pmd(pmd_t *pmd, unsigned long addr, + if ((end - addr) != PMD_SIZE) + return 0; + ++ if (!IS_ALIGNED(addr, PMD_SIZE)) ++ return 0; ++ + if (!IS_ALIGNED(phys_addr, PMD_SIZE)) + return 0; + +@@ -126,6 +129,9 @@ static int ioremap_try_huge_pud(pud_t *pud, unsigned long addr, + if ((end - addr) != PUD_SIZE) + return 0; + ++ if (!IS_ALIGNED(addr, PUD_SIZE)) ++ return 0; ++ + if (!IS_ALIGNED(phys_addr, PUD_SIZE)) + return 0; + +@@ -166,6 +172,9 @@ static int ioremap_try_huge_p4d(p4d_t *p4d, unsigned long addr, + if ((end - addr) != P4D_SIZE) + return 0; + ++ if (!IS_ALIGNED(addr, P4D_SIZE)) ++ return 0; ++ + if (!IS_ALIGNED(phys_addr, P4D_SIZE)) + return 0; + +diff --git a/lib/reed_solomon/decode_rs.c b/lib/reed_solomon/decode_rs.c +index 1db74eb098d0..121beb2f0930 100644 +--- a/lib/reed_solomon/decode_rs.c ++++ b/lib/reed_solomon/decode_rs.c +@@ -42,8 +42,18 @@ + BUG_ON(pad < 0 || pad >= nn); + + /* Does the caller provide the syndrome ? */ +- if (s != NULL) +- goto decode; ++ if (s != NULL) { ++ for (i = 0; i < nroots; i++) { ++ /* The syndrome is in index form, ++ * so nn represents zero ++ */ ++ if (s[i] != nn) ++ goto decode; ++ } ++ ++ /* syndrome is zero, no errors to correct */ ++ return 0; ++ } + + /* form the syndromes; i.e., evaluate data(x) at roots of + * g(x) */ +@@ -99,9 +109,9 @@ + if (no_eras > 0) { + /* Init lambda to be the erasure locator polynomial */ + lambda[1] = alpha_to[rs_modnn(rs, +- prim * (nn - 1 - eras_pos[0]))]; ++ prim * (nn - 1 - (eras_pos[0] + pad)))]; + for (i = 1; i < no_eras; i++) { +- u = rs_modnn(rs, prim * (nn - 1 - eras_pos[i])); ++ u = rs_modnn(rs, prim * (nn - 1 - (eras_pos[i] + pad))); + for (j = i + 1; j > 0; j--) { + tmp = index_of[lambda[j - 1]]; + if (tmp != nn) { +diff --git a/lib/scatterlist.c b/lib/scatterlist.c +index 2882d9ba6607..eacb82468437 100644 +--- a/lib/scatterlist.c ++++ b/lib/scatterlist.c +@@ -676,17 +676,18 @@ static bool sg_miter_get_next_page(struct sg_mapping_iter *miter) + { + if (!miter->__remaining) { + struct scatterlist *sg; +- unsigned long pgoffset; + + if (!__sg_page_iter_next(&miter->piter)) + return false; + + sg = miter->piter.sg; +- pgoffset = miter->piter.sg_pgoffset; + +- miter->__offset = pgoffset ? 0 : sg->offset; ++ miter->__offset = miter->piter.sg_pgoffset ? 0 : sg->offset; ++ miter->piter.sg_pgoffset += miter->__offset >> PAGE_SHIFT; ++ miter->__offset &= PAGE_SIZE - 1; + miter->__remaining = sg->offset + sg->length - +- (pgoffset << PAGE_SHIFT) - miter->__offset; ++ (miter->piter.sg_pgoffset << PAGE_SHIFT) - ++ miter->__offset; + miter->__remaining = min_t(unsigned long, miter->__remaining, + PAGE_SIZE - miter->__offset); + } +diff --git a/lib/test_firmware.c b/lib/test_firmware.c +index 83ea6c4e623c..6ca97a63b3d6 100644 +--- a/lib/test_firmware.c ++++ b/lib/test_firmware.c +@@ -886,8 +886,11 @@ static int __init test_firmware_init(void) + return -ENOMEM; + + rc = __test_firmware_config_init(); +- if (rc) ++ if (rc) { ++ kfree(test_fw_config); ++ pr_err("could not init firmware test config: %d\n", rc); + return rc; ++ } + + rc = misc_register(&test_fw_misc_device); + if (rc) { +diff --git a/lib/test_overflow.c b/lib/test_overflow.c +index fc680562d8b6..7a4b6f6c5473 100644 +--- a/lib/test_overflow.c ++++ b/lib/test_overflow.c +@@ -486,16 +486,17 @@ static int __init test_overflow_shift(void) + * Deal with the various forms of allocator arguments. See comments above + * the DEFINE_TEST_ALLOC() instances for mapping of the "bits". + */ +-#define alloc010(alloc, arg, sz) alloc(sz, GFP_KERNEL) +-#define alloc011(alloc, arg, sz) alloc(sz, GFP_KERNEL, NUMA_NO_NODE) ++#define alloc_GFP (GFP_KERNEL | __GFP_NOWARN) ++#define alloc010(alloc, arg, sz) alloc(sz, alloc_GFP) ++#define alloc011(alloc, arg, sz) alloc(sz, alloc_GFP, NUMA_NO_NODE) + #define alloc000(alloc, arg, sz) alloc(sz) + #define alloc001(alloc, arg, sz) alloc(sz, NUMA_NO_NODE) +-#define alloc110(alloc, arg, sz) alloc(arg, sz, GFP_KERNEL) ++#define alloc110(alloc, arg, sz) alloc(arg, sz, alloc_GFP) + #define free0(free, arg, ptr) free(ptr) + #define free1(free, arg, ptr) free(arg, ptr) + +-/* Wrap around to 8K */ +-#define TEST_SIZE (9 << PAGE_SHIFT) ++/* Wrap around to 16K */ ++#define TEST_SIZE (5 * 4096) + + #define DEFINE_TEST_ALLOC(func, free_func, want_arg, want_gfp, want_node)\ + static int __init test_ ## func (void *arg) \ +diff --git a/lib/test_string.c b/lib/test_string.c +index bf8def01ed20..b5117ae59693 100644 +--- a/lib/test_string.c ++++ b/lib/test_string.c +@@ -36,7 +36,7 @@ static __init int memset16_selftest(void) + fail: + kfree(p); + if (i < 256) +- return (i << 24) | (j << 16) | k; ++ return (i << 24) | (j << 16) | k | 0x8000; + return 0; + } + +@@ -72,7 +72,7 @@ static __init int memset32_selftest(void) + fail: + kfree(p); + if (i < 256) +- return (i << 24) | (j << 16) | k; ++ return (i << 24) | (j << 16) | k | 0x8000; + return 0; + } + +@@ -108,7 +108,7 @@ static __init int memset64_selftest(void) + fail: + kfree(p); + if (i < 256) +- return (i << 24) | (j << 16) | k; ++ return (i << 24) | (j << 16) | k | 0x8000; + return 0; + } + +diff --git a/mm/Kconfig b/mm/Kconfig +index f0c76ba47695..e028ed47861e 100644 +--- a/mm/Kconfig ++++ b/mm/Kconfig +@@ -529,8 +529,10 @@ config MEM_SOFT_DIRTY + config ZSWAP + bool "Compressed cache for swap pages (EXPERIMENTAL)" + depends on FRONTSWAP && CRYPTO=y +- select CRYPTO_LZO ++ select CRYPTO_LZO if !ZEN_INTERACTIVE + select ZPOOL ++ select CRYPTO_LZ4 if ZEN_INTERACTIVE ++ select Z3FOLD if ZEN_INTERACTIVE + help + A lightweight compressed cache for swap pages. It takes + pages that are in the process of being swapped out and attempts to +diff --git a/mm/cma.c b/mm/cma.c +index 3340ef34c154..4973d253dc83 100644 +--- a/mm/cma.c ++++ b/mm/cma.c +@@ -278,6 +278,12 @@ int __init cma_declare_contiguous(phys_addr_t base, + */ + alignment = max(alignment, (phys_addr_t)PAGE_SIZE << + max_t(unsigned long, MAX_ORDER - 1, pageblock_order)); ++ if (fixed && base & (alignment - 1)) { ++ ret = -EINVAL; ++ pr_err("Region at %pa must be aligned to %pa bytes\n", ++ &base, &alignment); ++ goto err; ++ } + base = ALIGN(base, alignment); + size = ALIGN(size, alignment); + limit &= ~(alignment - 1); +@@ -308,6 +314,13 @@ int __init cma_declare_contiguous(phys_addr_t base, + if (limit == 0 || limit > memblock_end) + limit = memblock_end; + ++ if (base + size > limit) { ++ ret = -EINVAL; ++ pr_err("Size (%pa) of region at %pa exceeds limit (%pa)\n", ++ &size, &base, &limit); ++ goto err; ++ } ++ + /* Reserve memory */ + if (fixed) { + if (memblock_is_region_reserved(base, size) || +diff --git a/mm/compaction.c b/mm/compaction.c +index 9e1b9acb116b..952dc2fb24e5 100644 +--- a/mm/compaction.c ++++ b/mm/compaction.c +@@ -842,13 +842,15 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, + + /* + * Periodically drop the lock (if held) regardless of its +- * contention, to give chance to IRQs. Abort async compaction +- * if contended. ++ * contention, to give chance to IRQs. Abort completely if ++ * a fatal signal is pending. + */ + if (!(low_pfn % SWAP_CLUSTER_MAX) + && compact_unlock_should_abort(&pgdat->lru_lock, +- flags, &locked, cc)) +- break; ++ flags, &locked, cc)) { ++ low_pfn = 0; ++ goto fatal_pending; ++ } + + if (!pfn_valid_within(low_pfn)) + goto isolate_fail; +@@ -1060,6 +1062,7 @@ isolate_migratepages_block(struct compact_control *cc, unsigned long low_pfn, + trace_mm_compaction_isolate_migratepages(start_pfn, low_pfn, + nr_scanned, nr_isolated); + ++fatal_pending: + cc->total_migrate_scanned += nr_scanned; + if (nr_isolated) + count_compact_events(COMPACTISOLATED, nr_isolated); +diff --git a/mm/filemap.c b/mm/filemap.c +index 6dd9a2274c80..861e26ee4c72 100644 +--- a/mm/filemap.c ++++ b/mm/filemap.c +@@ -549,6 +549,28 @@ int filemap_fdatawait_range(struct address_space *mapping, loff_t start_byte, + } + EXPORT_SYMBOL(filemap_fdatawait_range); + ++/** ++ * filemap_fdatawait_range_keep_errors - wait for writeback to complete ++ * @mapping: address space structure to wait for ++ * @start_byte: offset in bytes where the range starts ++ * @end_byte: offset in bytes where the range ends (inclusive) ++ * ++ * Walk the list of under-writeback pages of the given address space in the ++ * given range and wait for all of them. Unlike filemap_fdatawait_range(), ++ * this function does not clear error status of the address space. ++ * ++ * Use this function if callers don't handle errors themselves. Expected ++ * call sites are system-wide / filesystem-wide data flushers: e.g. sync(2), ++ * fsfreeze(8) ++ */ ++int filemap_fdatawait_range_keep_errors(struct address_space *mapping, ++ loff_t start_byte, loff_t end_byte) ++{ ++ __filemap_fdatawait_range(mapping, start_byte, end_byte); ++ return filemap_check_and_keep_errors(mapping); ++} ++EXPORT_SYMBOL(filemap_fdatawait_range_keep_errors); ++ + /** + * file_fdatawait_range - wait for writeback to complete + * @file: file pointing to address space structure to wait for +diff --git a/mm/gup.c b/mm/gup.c +index ddde097cf9e4..d2c14fc4b5d4 100644 +--- a/mm/gup.c ++++ b/mm/gup.c +@@ -585,11 +585,14 @@ static int get_gate_page(struct mm_struct *mm, unsigned long address, + pgd = pgd_offset_k(address); + else + pgd = pgd_offset_gate(mm, address); +- BUG_ON(pgd_none(*pgd)); ++ if (pgd_none(*pgd)) ++ return -EFAULT; + p4d = p4d_offset(pgd, address); +- BUG_ON(p4d_none(*p4d)); ++ if (p4d_none(*p4d)) ++ return -EFAULT; + pud = pud_offset(p4d, address); +- BUG_ON(pud_none(*pud)); ++ if (pud_none(*pud)) ++ return -EFAULT; + pmd = pmd_offset(pud, address); + if (!pmd_present(*pmd)) + return -EFAULT; +@@ -1696,7 +1699,8 @@ static inline pte_t gup_get_pte(pte_t *ptep) + } + #endif + +-static void undo_dev_pagemap(int *nr, int nr_start, struct page **pages) ++static void __maybe_unused undo_dev_pagemap(int *nr, int nr_start, ++ struct page **pages) + { + while ((*nr) - nr_start) { + struct page *page = pages[--(*nr)]; +diff --git a/mm/hmm.c b/mm/hmm.c +index f702a3895d05..4c405dfbd2b3 100644 +--- a/mm/hmm.c ++++ b/mm/hmm.c +@@ -104,6 +104,11 @@ static struct hmm *hmm_get_or_create(struct mm_struct *mm) + return NULL; + } + ++static void hmm_free_rcu(struct rcu_head *rcu) ++{ ++ kfree(container_of(rcu, struct hmm, rcu)); ++} ++ + static void hmm_free(struct kref *kref) + { + struct hmm *hmm = container_of(kref, struct hmm, kref); +@@ -116,7 +121,7 @@ static void hmm_free(struct kref *kref) + mm->hmm = NULL; + spin_unlock(&mm->page_table_lock); + +- kfree(hmm); ++ mmu_notifier_call_srcu(&hmm->rcu, hmm_free_rcu); + } + + static inline void hmm_put(struct hmm *hmm) +@@ -144,10 +149,14 @@ void hmm_mm_destroy(struct mm_struct *mm) + + static void hmm_release(struct mmu_notifier *mn, struct mm_struct *mm) + { +- struct hmm *hmm = mm_get_hmm(mm); ++ struct hmm *hmm = container_of(mn, struct hmm, mmu_notifier); + struct hmm_mirror *mirror; + struct hmm_range *range; + ++ /* Bail out if hmm is in the process of being freed */ ++ if (!kref_get_unless_zero(&hmm->kref)) ++ return; ++ + /* Report this HMM as dying. */ + hmm->dead = true; + +@@ -185,13 +194,14 @@ static void hmm_release(struct mmu_notifier *mn, struct mm_struct *mm) + static int hmm_invalidate_range_start(struct mmu_notifier *mn, + const struct mmu_notifier_range *nrange) + { +- struct hmm *hmm = mm_get_hmm(nrange->mm); ++ struct hmm *hmm = container_of(mn, struct hmm, mmu_notifier); + struct hmm_mirror *mirror; + struct hmm_update update; + struct hmm_range *range; + int ret = 0; + +- VM_BUG_ON(!hmm); ++ if (!kref_get_unless_zero(&hmm->kref)) ++ return 0; + + update.start = nrange->start; + update.end = nrange->end; +@@ -239,9 +249,10 @@ static int hmm_invalidate_range_start(struct mmu_notifier *mn, + static void hmm_invalidate_range_end(struct mmu_notifier *mn, + const struct mmu_notifier_range *nrange) + { +- struct hmm *hmm = mm_get_hmm(nrange->mm); ++ struct hmm *hmm = container_of(mn, struct hmm, mmu_notifier); + +- VM_BUG_ON(!hmm); ++ if (!kref_get_unless_zero(&hmm->kref)) ++ return; + + mutex_lock(&hmm->lock); + hmm->notifiers--; +diff --git a/mm/huge_memory.c b/mm/huge_memory.c +index 885642c82aaa..e93fbb66b4d5 100644 +--- a/mm/huge_memory.c ++++ b/mm/huge_memory.c +@@ -52,7 +52,11 @@ unsigned long transparent_hugepage_flags __read_mostly = + #ifdef CONFIG_TRANSPARENT_HUGEPAGE_MADVISE + (1<pid = 0; + strncpy(object->comm, "hardirq", sizeof(object->comm)); +- } else if (in_softirq()) { ++ } else if (in_serving_softirq()) { + object->pid = 0; + strncpy(object->comm, "softirq", sizeof(object->comm)); + } else { +diff --git a/mm/memcontrol.c b/mm/memcontrol.c +index ba9138a4a1de..8f5dabfaf94d 100644 +--- a/mm/memcontrol.c ++++ b/mm/memcontrol.c +@@ -691,12 +691,15 @@ void __mod_memcg_state(struct mem_cgroup *memcg, int idx, int val) + if (mem_cgroup_disabled()) + return; + +- __this_cpu_add(memcg->vmstats_local->stat[idx], val); +- + x = val + __this_cpu_read(memcg->vmstats_percpu->stat[idx]); + if (unlikely(abs(x) > MEMCG_CHARGE_BATCH)) { + struct mem_cgroup *mi; + ++ /* ++ * Batch local counters to keep them in sync with ++ * the hierarchical ones. ++ */ ++ __this_cpu_add(memcg->vmstats_local->stat[idx], x); + for (mi = memcg; mi; mi = parent_mem_cgroup(mi)) + atomic_long_add(x, &mi->vmstats[idx]); + x = 0; +@@ -745,13 +748,15 @@ void __mod_lruvec_state(struct lruvec *lruvec, enum node_stat_item idx, + /* Update memcg */ + __mod_memcg_state(memcg, idx, val); + +- /* Update lruvec */ +- __this_cpu_add(pn->lruvec_stat_local->count[idx], val); +- + x = val + __this_cpu_read(pn->lruvec_stat_cpu->count[idx]); + if (unlikely(abs(x) > MEMCG_CHARGE_BATCH)) { + struct mem_cgroup_per_node *pi; + ++ /* ++ * Batch local counters to keep them in sync with ++ * the hierarchical ones. ++ */ ++ __this_cpu_add(pn->lruvec_stat_local->count[idx], x); + for (pi = pn; pi; pi = parent_nodeinfo(pi, pgdat->node_id)) + atomic_long_add(x, &pi->lruvec_stat[idx]); + x = 0; +@@ -773,12 +778,15 @@ void __count_memcg_events(struct mem_cgroup *memcg, enum vm_event_item idx, + if (mem_cgroup_disabled()) + return; + +- __this_cpu_add(memcg->vmstats_local->events[idx], count); +- + x = count + __this_cpu_read(memcg->vmstats_percpu->events[idx]); + if (unlikely(x > MEMCG_CHARGE_BATCH)) { + struct mem_cgroup *mi; + ++ /* ++ * Batch local counters to keep them in sync with ++ * the hierarchical ones. ++ */ ++ __this_cpu_add(memcg->vmstats_local->events[idx], x); + for (mi = memcg; mi; mi = parent_mem_cgroup(mi)) + atomic_long_add(x, &mi->vmevents[idx]); + x = 0; +@@ -1118,26 +1126,45 @@ void mem_cgroup_iter_break(struct mem_cgroup *root, + css_put(&prev->css); + } + +-static void invalidate_reclaim_iterators(struct mem_cgroup *dead_memcg) ++static void __invalidate_reclaim_iterators(struct mem_cgroup *from, ++ struct mem_cgroup *dead_memcg) + { +- struct mem_cgroup *memcg = dead_memcg; + struct mem_cgroup_reclaim_iter *iter; + struct mem_cgroup_per_node *mz; + int nid; + int i; + +- for (; memcg; memcg = parent_mem_cgroup(memcg)) { +- for_each_node(nid) { +- mz = mem_cgroup_nodeinfo(memcg, nid); +- for (i = 0; i <= DEF_PRIORITY; i++) { +- iter = &mz->iter[i]; +- cmpxchg(&iter->position, +- dead_memcg, NULL); +- } ++ for_each_node(nid) { ++ mz = mem_cgroup_nodeinfo(from, nid); ++ for (i = 0; i <= DEF_PRIORITY; i++) { ++ iter = &mz->iter[i]; ++ cmpxchg(&iter->position, ++ dead_memcg, NULL); + } + } + } + ++static void invalidate_reclaim_iterators(struct mem_cgroup *dead_memcg) ++{ ++ struct mem_cgroup *memcg = dead_memcg; ++ struct mem_cgroup *last; ++ ++ do { ++ __invalidate_reclaim_iterators(memcg, dead_memcg); ++ last = memcg; ++ } while ((memcg = parent_mem_cgroup(memcg))); ++ ++ /* ++ * When cgruop1 non-hierarchy mode is used, ++ * parent_mem_cgroup() does not walk all the way up to the ++ * cgroup root (root_mem_cgroup). So we have to handle ++ * dead_memcg from cgroup root separately. ++ */ ++ if (last != root_mem_cgroup) ++ __invalidate_reclaim_iterators(root_mem_cgroup, ++ dead_memcg); ++} ++ + /** + * mem_cgroup_scan_tasks - iterate over tasks of a memory cgroup hierarchy + * @memcg: hierarchy root +@@ -3530,12 +3557,13 @@ static int memcg_stat_show(struct seq_file *m, void *v) + if (memcg1_stats[i] == MEMCG_SWAP && !do_memsw_account()) + continue; + seq_printf(m, "total_%s %llu\n", memcg1_stat_names[i], +- (u64)memcg_page_state(memcg, i) * PAGE_SIZE); ++ (u64)memcg_page_state(memcg, memcg1_stats[i]) * ++ PAGE_SIZE); + } + + for (i = 0; i < ARRAY_SIZE(memcg1_events); i++) + seq_printf(m, "total_%s %llu\n", memcg1_event_names[i], +- (u64)memcg_events(memcg, i)); ++ (u64)memcg_events(memcg, memcg1_events[i])); + + for (i = 0; i < NR_LRU_LISTS; i++) + seq_printf(m, "total_%s %llu\n", mem_cgroup_lru_names[i], +diff --git a/mm/memory.c b/mm/memory.c +index ddf20bd0c317..b0efc69b2634 100644 +--- a/mm/memory.c ++++ b/mm/memory.c +@@ -2807,7 +2807,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) + struct swap_info_struct *si = swp_swap_info(entry); + + if (si->flags & SWP_SYNCHRONOUS_IO && +- __swap_count(si, entry) == 1) { ++ __swap_count(entry) == 1) { + /* skip swapcache */ + page = alloc_page_vma(GFP_HIGHUSER_MOVABLE, vma, + vmf->address); +@@ -4349,7 +4349,9 @@ int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, + void *old_buf = buf; + int write = gup_flags & FOLL_WRITE; + +- down_read(&mm->mmap_sem); ++ if (down_read_killable(&mm->mmap_sem)) ++ return 0; ++ + /* ignore errors, just check how much was successfully transferred */ + while (len) { + int bytes, ret, offset; +diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c +index e096c987d261..77d1f69cdead 100644 +--- a/mm/memory_hotplug.c ++++ b/mm/memory_hotplug.c +@@ -1736,9 +1736,10 @@ static int check_memblock_offlined_cb(struct memory_block *mem, void *arg) + endpa = PFN_PHYS(section_nr_to_pfn(mem->end_section_nr + 1))-1; + pr_warn("removing memory fails, because memory [%pa-%pa] is onlined\n", + &beginpa, &endpa); +- } + +- return ret; ++ return -EBUSY; ++ } ++ return 0; + } + + static int check_cpu_on_node(pg_data_t *pgdat) +@@ -1821,19 +1822,9 @@ static void __release_memory_resource(resource_size_t start, + } + } + +-/** +- * remove_memory +- * @nid: the node ID +- * @start: physical address of the region to remove +- * @size: size of the region to remove +- * +- * NOTE: The caller must call lock_device_hotplug() to serialize hotplug +- * and online/offline operations before this call, as required by +- * try_offline_node(). +- */ +-void __ref __remove_memory(int nid, u64 start, u64 size) ++static int __ref try_remove_memory(int nid, u64 start, u64 size) + { +- int ret; ++ int rc = 0; + + BUG_ON(check_hotplug_memory_range(start, size)); + +@@ -1841,13 +1832,13 @@ void __ref __remove_memory(int nid, u64 start, u64 size) + + /* + * All memory blocks must be offlined before removing memory. Check +- * whether all memory blocks in question are offline and trigger a BUG() ++ * whether all memory blocks in question are offline and return error + * if this is not the case. + */ +- ret = walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), NULL, +- check_memblock_offlined_cb); +- if (ret) +- BUG(); ++ rc = walk_memory_range(PFN_DOWN(start), PFN_UP(start + size - 1), NULL, ++ check_memblock_offlined_cb); ++ if (rc) ++ goto done; + + /* remove memmap entry */ + firmware_map_remove(start, start + size, "System RAM"); +@@ -1859,14 +1850,45 @@ void __ref __remove_memory(int nid, u64 start, u64 size) + + try_offline_node(nid); + ++done: + mem_hotplug_done(); ++ return rc; + } + +-void remove_memory(int nid, u64 start, u64 size) ++/** ++ * remove_memory ++ * @nid: the node ID ++ * @start: physical address of the region to remove ++ * @size: size of the region to remove ++ * ++ * NOTE: The caller must call lock_device_hotplug() to serialize hotplug ++ * and online/offline operations before this call, as required by ++ * try_offline_node(). ++ */ ++void __remove_memory(int nid, u64 start, u64 size) ++{ ++ ++ /* ++ * trigger BUG() is some memory is not offlined prior to calling this ++ * function ++ */ ++ if (try_remove_memory(nid, start, size)) ++ BUG(); ++} ++ ++/* ++ * Remove memory if every memory block is offline, otherwise return -EBUSY is ++ * some memory is not offline ++ */ ++int remove_memory(int nid, u64 start, u64 size) + { ++ int rc; ++ + lock_device_hotplug(); +- __remove_memory(nid, start, size); ++ rc = try_remove_memory(nid, start, size); + unlock_device_hotplug(); ++ ++ return rc; + } + EXPORT_SYMBOL_GPL(remove_memory); + #endif /* CONFIG_MEMORY_HOTREMOVE */ +diff --git a/mm/mempolicy.c b/mm/mempolicy.c +index fdcb73536319..ca3f443c8fc1 100644 +--- a/mm/mempolicy.c ++++ b/mm/mempolicy.c +@@ -403,7 +403,7 @@ static const struct mempolicy_operations mpol_ops[MPOL_MAX] = { + }, + }; + +-static void migrate_page_add(struct page *page, struct list_head *pagelist, ++static int migrate_page_add(struct page *page, struct list_head *pagelist, + unsigned long flags); + + struct queue_pages { +@@ -429,11 +429,14 @@ static inline bool queue_pages_required(struct page *page, + } + + /* +- * queue_pages_pmd() has three possible return values: +- * 1 - pages are placed on the right node or queued successfully. +- * 0 - THP was split. +- * -EIO - is migration entry or MPOL_MF_STRICT was specified and an existing +- * page was already on a node that does not follow the policy. ++ * queue_pages_pmd() has four possible return values: ++ * 0 - pages are placed on the right node or queued successfully. ++ * 1 - there is unmovable page, and MPOL_MF_MOVE* & MPOL_MF_STRICT were ++ * specified. ++ * 2 - THP was split. ++ * -EIO - is migration entry or only MPOL_MF_STRICT was specified and an ++ * existing page was already on a node that does not follow the ++ * policy. + */ + static int queue_pages_pmd(pmd_t *pmd, spinlock_t *ptl, unsigned long addr, + unsigned long end, struct mm_walk *walk) +@@ -451,23 +454,20 @@ static int queue_pages_pmd(pmd_t *pmd, spinlock_t *ptl, unsigned long addr, + if (is_huge_zero_page(page)) { + spin_unlock(ptl); + __split_huge_pmd(walk->vma, pmd, addr, false, NULL); ++ ret = 2; + goto out; + } +- if (!queue_pages_required(page, qp)) { +- ret = 1; ++ if (!queue_pages_required(page, qp)) + goto unlock; +- } + +- ret = 1; + flags = qp->flags; + /* go to thp migration */ + if (flags & (MPOL_MF_MOVE | MPOL_MF_MOVE_ALL)) { +- if (!vma_migratable(walk->vma)) { +- ret = -EIO; ++ if (!vma_migratable(walk->vma) || ++ migrate_page_add(page, qp->pagelist, flags)) { ++ ret = 1; + goto unlock; + } +- +- migrate_page_add(page, qp->pagelist, flags); + } else + ret = -EIO; + unlock: +@@ -479,6 +479,13 @@ static int queue_pages_pmd(pmd_t *pmd, spinlock_t *ptl, unsigned long addr, + /* + * Scan through pages checking if pages follow certain conditions, + * and move them to the pagelist if they do. ++ * ++ * queue_pages_pte_range() has three possible return values: ++ * 0 - pages are placed on the right node or queued successfully. ++ * 1 - there is unmovable page, and MPOL_MF_MOVE* & MPOL_MF_STRICT were ++ * specified. ++ * -EIO - only MPOL_MF_STRICT was specified and an existing page was already ++ * on a node that does not follow the policy. + */ + static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr, + unsigned long end, struct mm_walk *walk) +@@ -488,17 +495,17 @@ static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr, + struct queue_pages *qp = walk->private; + unsigned long flags = qp->flags; + int ret; ++ bool has_unmovable = false; + pte_t *pte; + spinlock_t *ptl; + + ptl = pmd_trans_huge_lock(pmd, vma); + if (ptl) { + ret = queue_pages_pmd(pmd, ptl, addr, end, walk); +- if (ret > 0) +- return 0; +- else if (ret < 0) ++ if (ret != 2) + return ret; + } ++ /* THP was split, fall through to pte walk */ + + if (pmd_trans_unstable(pmd)) + return 0; +@@ -519,14 +526,28 @@ static int queue_pages_pte_range(pmd_t *pmd, unsigned long addr, + if (!queue_pages_required(page, qp)) + continue; + if (flags & (MPOL_MF_MOVE | MPOL_MF_MOVE_ALL)) { +- if (!vma_migratable(vma)) ++ /* MPOL_MF_STRICT must be specified if we get here */ ++ if (!vma_migratable(vma)) { ++ has_unmovable = true; + break; +- migrate_page_add(page, qp->pagelist, flags); ++ } ++ ++ /* ++ * Do not abort immediately since there may be ++ * temporary off LRU pages in the range. Still ++ * need migrate other LRU pages. ++ */ ++ if (migrate_page_add(page, qp->pagelist, flags)) ++ has_unmovable = true; + } else + break; + } + pte_unmap_unlock(pte - 1, ptl); + cond_resched(); ++ ++ if (has_unmovable) ++ return 1; ++ + return addr != end ? -EIO : 0; + } + +@@ -639,7 +660,13 @@ static int queue_pages_test_walk(unsigned long start, unsigned long end, + * + * If pages found in a given range are on a set of nodes (determined by + * @nodes and @flags,) it's isolated and queued to the pagelist which is +- * passed via @private.) ++ * passed via @private. ++ * ++ * queue_pages_range() has three possible return values: ++ * 1 - there is unmovable page, but MPOL_MF_MOVE* & MPOL_MF_STRICT were ++ * specified. ++ * 0 - queue pages successfully or no misplaced page. ++ * -EIO - there is misplaced page and only MPOL_MF_STRICT was specified. + */ + static int + queue_pages_range(struct mm_struct *mm, unsigned long start, unsigned long end, +@@ -940,7 +967,7 @@ static long do_get_mempolicy(int *policy, nodemask_t *nmask, + /* + * page migration, thp tail pages can be passed. + */ +-static void migrate_page_add(struct page *page, struct list_head *pagelist, ++static int migrate_page_add(struct page *page, struct list_head *pagelist, + unsigned long flags) + { + struct page *head = compound_head(page); +@@ -953,8 +980,19 @@ static void migrate_page_add(struct page *page, struct list_head *pagelist, + mod_node_page_state(page_pgdat(head), + NR_ISOLATED_ANON + page_is_file_cache(head), + hpage_nr_pages(head)); ++ } else if (flags & MPOL_MF_STRICT) { ++ /* ++ * Non-movable page may reach here. And, there may be ++ * temporary off LRU pages or non-LRU movable pages. ++ * Treat them as unmovable pages since they can't be ++ * isolated, so they can't be moved at the moment. It ++ * should return -EIO for this case too. ++ */ ++ return -EIO; + } + } ++ ++ return 0; + } + + /* page allocation callback for NUMA node migration */ +@@ -1157,9 +1195,10 @@ static struct page *new_page(struct page *page, unsigned long start) + } + #else + +-static void migrate_page_add(struct page *page, struct list_head *pagelist, ++static int migrate_page_add(struct page *page, struct list_head *pagelist, + unsigned long flags) + { ++ return -EIO; + } + + int do_migrate_pages(struct mm_struct *mm, const nodemask_t *from, +@@ -1182,6 +1221,7 @@ static long do_mbind(unsigned long start, unsigned long len, + struct mempolicy *new; + unsigned long end; + int err; ++ int ret; + LIST_HEAD(pagelist); + + if (flags & ~(unsigned long)MPOL_MF_VALID) +@@ -1243,10 +1283,15 @@ static long do_mbind(unsigned long start, unsigned long len, + if (err) + goto mpol_out; + +- err = queue_pages_range(mm, start, end, nmask, ++ ret = queue_pages_range(mm, start, end, nmask, + flags | MPOL_MF_INVERT, &pagelist); +- if (!err) +- err = mbind_range(mm, start, end, new); ++ ++ if (ret < 0) { ++ err = -EIO; ++ goto up_out; ++ } ++ ++ err = mbind_range(mm, start, end, new); + + if (!err) { + int nr_failed = 0; +@@ -1259,13 +1304,14 @@ static long do_mbind(unsigned long start, unsigned long len, + putback_movable_pages(&pagelist); + } + +- if (nr_failed && (flags & MPOL_MF_STRICT)) ++ if ((ret > 0) || (nr_failed && (flags & MPOL_MF_STRICT))) + err = -EIO; + } else + putback_movable_pages(&pagelist); + ++up_out: + up_write(&mm->mmap_sem); +- mpol_out: ++mpol_out: + mpol_put(new); + return err; + } +diff --git a/mm/migrate.c b/mm/migrate.c +index e9594bc0d406..dbb3b5bee4ee 100644 +--- a/mm/migrate.c ++++ b/mm/migrate.c +@@ -771,12 +771,12 @@ static int __buffer_migrate_page(struct address_space *mapping, + } + bh = bh->b_this_page; + } while (bh != head); +- spin_unlock(&mapping->private_lock); + if (busy) { + if (invalidated) { + rc = -EAGAIN; + goto unlock_buffers; + } ++ spin_unlock(&mapping->private_lock); + invalidate_bh_lrus(); + invalidated = true; + goto recheck_buffers; +@@ -809,6 +809,8 @@ static int __buffer_migrate_page(struct address_space *mapping, + + rc = MIGRATEPAGE_SUCCESS; + unlock_buffers: ++ if (check_refs) ++ spin_unlock(&mapping->private_lock); + bh = head; + do { + unlock_buffer(bh); +@@ -2345,16 +2347,13 @@ static int migrate_vma_collect_pmd(pmd_t *pmdp, + static void migrate_vma_collect(struct migrate_vma *migrate) + { + struct mmu_notifier_range range; +- struct mm_walk mm_walk; +- +- mm_walk.pmd_entry = migrate_vma_collect_pmd; +- mm_walk.pte_entry = NULL; +- mm_walk.pte_hole = migrate_vma_collect_hole; +- mm_walk.hugetlb_entry = NULL; +- mm_walk.test_walk = NULL; +- mm_walk.vma = migrate->vma; +- mm_walk.mm = migrate->vma->vm_mm; +- mm_walk.private = migrate; ++ struct mm_walk mm_walk = { ++ .pmd_entry = migrate_vma_collect_pmd, ++ .pte_hole = migrate_vma_collect_hole, ++ .vma = migrate->vma, ++ .mm = migrate->vma->vm_mm, ++ .private = migrate, ++ }; + + mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, NULL, mm_walk.mm, + migrate->start, +diff --git a/mm/mincore.c b/mm/mincore.c +index c3f058bd0faf..4fe91d497436 100644 +--- a/mm/mincore.c ++++ b/mm/mincore.c +@@ -68,8 +68,16 @@ static unsigned char mincore_page(struct address_space *mapping, pgoff_t pgoff) + */ + if (xa_is_value(page)) { + swp_entry_t swp = radix_to_swp_entry(page); +- page = find_get_page(swap_address_space(swp), +- swp_offset(swp)); ++ struct swap_info_struct *si; ++ ++ /* Prevent swap device to being swapoff under us */ ++ si = get_swap_device(swp); ++ if (si) { ++ page = find_get_page(swap_address_space(swp), ++ swp_offset(swp)); ++ put_swap_device(si); ++ } else ++ page = NULL; + } + } else + page = find_get_page(mapping, pgoff); +diff --git a/mm/mmu_notifier.c b/mm/mmu_notifier.c +index 513b9607409d..b5670620aea0 100644 +--- a/mm/mmu_notifier.c ++++ b/mm/mmu_notifier.c +@@ -274,7 +274,7 @@ static int do_mmu_notifier_register(struct mmu_notifier *mn, + * thanks to mm_take_all_locks(). + */ + spin_lock(&mm->mmu_notifier_mm->lock); +- hlist_add_head(&mn->hlist, &mm->mmu_notifier_mm->list); ++ hlist_add_head_rcu(&mn->hlist, &mm->mmu_notifier_mm->list); + spin_unlock(&mm->mmu_notifier_mm->lock); + + mm_drop_all_locks(mm); +diff --git a/mm/nommu.c b/mm/nommu.c +index d8c02fbe03b5..b2823519f8cd 100644 +--- a/mm/nommu.c ++++ b/mm/nommu.c +@@ -1792,7 +1792,8 @@ int __access_remote_vm(struct task_struct *tsk, struct mm_struct *mm, + struct vm_area_struct *vma; + int write = gup_flags & FOLL_WRITE; + +- down_read(&mm->mmap_sem); ++ if (down_read_killable(&mm->mmap_sem)) ++ return 0; + + /* the access must start within one of the target process's mappings */ + vma = find_vma(mm, addr); +diff --git a/mm/page-writeback.c b/mm/page-writeback.c +index bdbe8b6b1225..a64eb88c0b83 100644 +--- a/mm/page-writeback.c ++++ b/mm/page-writeback.c +@@ -71,7 +71,11 @@ static long ratelimit_pages = 32; + /* + * Start background writeback (via writeback threads) at this percentage + */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++int dirty_background_ratio = 20; ++#else + int dirty_background_ratio = 10; ++#endif + + /* + * dirty_background_bytes starts at 0 (disabled) so that it is a function of +@@ -88,7 +92,11 @@ int vm_highmem_is_dirtyable; + /* + * The generator of dirty data starts writeback at this percentage + */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++int vm_dirty_ratio = 50; ++#else + int vm_dirty_ratio = 20; ++#endif + + /* + * vm_dirty_bytes starts at 0 (disabled) so that it is a function of +diff --git a/mm/rmap.c b/mm/rmap.c +index e5dfe2ae6b0d..003377e24232 100644 +--- a/mm/rmap.c ++++ b/mm/rmap.c +@@ -1475,7 +1475,15 @@ static bool try_to_unmap_one(struct page *page, struct vm_area_struct *vma, + /* + * No need to invalidate here it will synchronize on + * against the special swap migration pte. ++ * ++ * The assignment to subpage above was computed from a ++ * swap PTE which results in an invalid pointer. ++ * Since only PAGE_SIZE pages can currently be ++ * migrated, just set it to page. This will need to be ++ * changed when hugepage migrations to device private ++ * memory are supported. + */ ++ subpage = page; + goto discard; + } + +diff --git a/mm/slab_common.c b/mm/slab_common.c +index 58251ba63e4a..cbd3411f644e 100644 +--- a/mm/slab_common.c ++++ b/mm/slab_common.c +@@ -1003,7 +1003,8 @@ struct kmem_cache *__init create_kmalloc_cache(const char *name, + } + + struct kmem_cache * +-kmalloc_caches[NR_KMALLOC_TYPES][KMALLOC_SHIFT_HIGH + 1] __ro_after_init; ++kmalloc_caches[NR_KMALLOC_TYPES][KMALLOC_SHIFT_HIGH + 1] __ro_after_init = ++{ /* initialization for https://bugs.llvm.org/show_bug.cgi?id=42570 */ }; + EXPORT_SYMBOL(kmalloc_caches); + + /* +diff --git a/mm/swap.c b/mm/swap.c +index 7ede3eddc12a..607c48229a1d 100644 +--- a/mm/swap.c ++++ b/mm/swap.c +@@ -740,15 +740,20 @@ void release_pages(struct page **pages, int nr) + if (is_huge_zero_page(page)) + continue; + +- /* Device public page can not be huge page */ +- if (is_device_public_page(page)) { ++ if (is_zone_device_page(page)) { + if (locked_pgdat) { + spin_unlock_irqrestore(&locked_pgdat->lru_lock, + flags); + locked_pgdat = NULL; + } +- put_devmap_managed_page(page); +- continue; ++ /* ++ * ZONE_DEVICE pages that return 'false' from ++ * put_devmap_managed_page() do not require special ++ * processing, and instead, expect a call to ++ * put_page_testzero(). ++ */ ++ if (put_devmap_managed_page(page)) ++ continue; + } + + page = compound_head(page); +diff --git a/mm/swap_state.c b/mm/swap_state.c +index 85245fdec8d9..61453f1faf72 100644 +--- a/mm/swap_state.c ++++ b/mm/swap_state.c +@@ -310,8 +310,13 @@ struct page *lookup_swap_cache(swp_entry_t entry, struct vm_area_struct *vma, + unsigned long addr) + { + struct page *page; ++ struct swap_info_struct *si; + ++ si = get_swap_device(entry); ++ if (!si) ++ return NULL; + page = find_get_page(swap_address_space(entry), swp_offset(entry)); ++ put_swap_device(si); + + INC_CACHE_INFO(find_total); + if (page) { +@@ -354,8 +359,8 @@ struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, + struct vm_area_struct *vma, unsigned long addr, + bool *new_page_allocated) + { +- struct page *found_page, *new_page = NULL; +- struct address_space *swapper_space = swap_address_space(entry); ++ struct page *found_page = NULL, *new_page = NULL; ++ struct swap_info_struct *si; + int err; + *new_page_allocated = false; + +@@ -365,7 +370,12 @@ struct page *__read_swap_cache_async(swp_entry_t entry, gfp_t gfp_mask, + * called after lookup_swap_cache() failed, re-calling + * that would confuse statistics. + */ +- found_page = find_get_page(swapper_space, swp_offset(entry)); ++ si = get_swap_device(entry); ++ if (!si) ++ break; ++ found_page = find_get_page(swap_address_space(entry), ++ swp_offset(entry)); ++ put_swap_device(si); + if (found_page) + break; + +diff --git a/mm/swapfile.c b/mm/swapfile.c +index 596ac98051c5..dbab16ddefa6 100644 +--- a/mm/swapfile.c ++++ b/mm/swapfile.c +@@ -1079,12 +1079,11 @@ swp_entry_t get_swap_page_of_type(int type) + static struct swap_info_struct *__swap_info_get(swp_entry_t entry) + { + struct swap_info_struct *p; +- unsigned long offset, type; ++ unsigned long offset; + + if (!entry.val) + goto out; +- type = swp_type(entry); +- p = swap_type_to_swap_info(type); ++ p = swp_swap_info(entry); + if (!p) + goto bad_nofile; + if (!(p->flags & SWP_USED)) +@@ -1187,6 +1186,69 @@ static unsigned char __swap_entry_free_locked(struct swap_info_struct *p, + return usage; + } + ++/* ++ * Check whether swap entry is valid in the swap device. If so, ++ * return pointer to swap_info_struct, and keep the swap entry valid ++ * via preventing the swap device from being swapoff, until ++ * put_swap_device() is called. Otherwise return NULL. ++ * ++ * The entirety of the RCU read critical section must come before the ++ * return from or after the call to synchronize_rcu() in ++ * enable_swap_info() or swapoff(). So if "si->flags & SWP_VALID" is ++ * true, the si->map, si->cluster_info, etc. must be valid in the ++ * critical section. ++ * ++ * Notice that swapoff or swapoff+swapon can still happen before the ++ * rcu_read_lock() in get_swap_device() or after the rcu_read_unlock() ++ * in put_swap_device() if there isn't any other way to prevent ++ * swapoff, such as page lock, page table lock, etc. The caller must ++ * be prepared for that. For example, the following situation is ++ * possible. ++ * ++ * CPU1 CPU2 ++ * do_swap_page() ++ * ... swapoff+swapon ++ * __read_swap_cache_async() ++ * swapcache_prepare() ++ * __swap_duplicate() ++ * // check swap_map ++ * // verify PTE not changed ++ * ++ * In __swap_duplicate(), the swap_map need to be checked before ++ * changing partly because the specified swap entry may be for another ++ * swap device which has been swapoff. And in do_swap_page(), after ++ * the page is read from the swap device, the PTE is verified not ++ * changed with the page table locked to check whether the swap device ++ * has been swapoff or swapoff+swapon. ++ */ ++struct swap_info_struct *get_swap_device(swp_entry_t entry) ++{ ++ struct swap_info_struct *si; ++ unsigned long offset; ++ ++ if (!entry.val) ++ goto out; ++ si = swp_swap_info(entry); ++ if (!si) ++ goto bad_nofile; ++ ++ rcu_read_lock(); ++ if (!(si->flags & SWP_VALID)) ++ goto unlock_out; ++ offset = swp_offset(entry); ++ if (offset >= si->max) ++ goto unlock_out; ++ ++ return si; ++bad_nofile: ++ pr_err("%s: %s%08lx\n", __func__, Bad_file, entry.val); ++out: ++ return NULL; ++unlock_out: ++ rcu_read_unlock(); ++ return NULL; ++} ++ + static unsigned char __swap_entry_free(struct swap_info_struct *p, + swp_entry_t entry, unsigned char usage) + { +@@ -1358,11 +1420,18 @@ int page_swapcount(struct page *page) + return count; + } + +-int __swap_count(struct swap_info_struct *si, swp_entry_t entry) ++int __swap_count(swp_entry_t entry) + { ++ struct swap_info_struct *si; + pgoff_t offset = swp_offset(entry); ++ int count = 0; + +- return swap_count(si->swap_map[offset]); ++ si = get_swap_device(entry); ++ if (si) { ++ count = swap_count(si->swap_map[offset]); ++ put_swap_device(si); ++ } ++ return count; + } + + static int swap_swapcount(struct swap_info_struct *si, swp_entry_t entry) +@@ -1387,9 +1456,11 @@ int __swp_swapcount(swp_entry_t entry) + int count = 0; + struct swap_info_struct *si; + +- si = __swap_info_get(entry); +- if (si) ++ si = get_swap_device(entry); ++ if (si) { + count = swap_swapcount(si, entry); ++ put_swap_device(si); ++ } + return count; + } + +@@ -2335,9 +2406,9 @@ static int swap_node(struct swap_info_struct *p) + return bdev ? bdev->bd_disk->node_id : NUMA_NO_NODE; + } + +-static void _enable_swap_info(struct swap_info_struct *p, int prio, +- unsigned char *swap_map, +- struct swap_cluster_info *cluster_info) ++static void setup_swap_info(struct swap_info_struct *p, int prio, ++ unsigned char *swap_map, ++ struct swap_cluster_info *cluster_info) + { + int i; + +@@ -2362,7 +2433,11 @@ static void _enable_swap_info(struct swap_info_struct *p, int prio, + } + p->swap_map = swap_map; + p->cluster_info = cluster_info; +- p->flags |= SWP_WRITEOK; ++} ++ ++static void _enable_swap_info(struct swap_info_struct *p) ++{ ++ p->flags |= SWP_WRITEOK | SWP_VALID; + atomic_long_add(p->pages, &nr_swap_pages); + total_swap_pages += p->pages; + +@@ -2389,7 +2464,17 @@ static void enable_swap_info(struct swap_info_struct *p, int prio, + frontswap_init(p->type, frontswap_map); + spin_lock(&swap_lock); + spin_lock(&p->lock); +- _enable_swap_info(p, prio, swap_map, cluster_info); ++ setup_swap_info(p, prio, swap_map, cluster_info); ++ spin_unlock(&p->lock); ++ spin_unlock(&swap_lock); ++ /* ++ * Guarantee swap_map, cluster_info, etc. fields are valid ++ * between get/put_swap_device() if SWP_VALID bit is set ++ */ ++ synchronize_rcu(); ++ spin_lock(&swap_lock); ++ spin_lock(&p->lock); ++ _enable_swap_info(p); + spin_unlock(&p->lock); + spin_unlock(&swap_lock); + } +@@ -2398,7 +2483,8 @@ static void reinsert_swap_info(struct swap_info_struct *p) + { + spin_lock(&swap_lock); + spin_lock(&p->lock); +- _enable_swap_info(p, p->prio, p->swap_map, p->cluster_info); ++ setup_swap_info(p, p->prio, p->swap_map, p->cluster_info); ++ _enable_swap_info(p); + spin_unlock(&p->lock); + spin_unlock(&swap_lock); + } +@@ -2501,6 +2587,17 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile) + + reenable_swap_slots_cache_unlock(); + ++ spin_lock(&swap_lock); ++ spin_lock(&p->lock); ++ p->flags &= ~SWP_VALID; /* mark swap device as invalid */ ++ spin_unlock(&p->lock); ++ spin_unlock(&swap_lock); ++ /* ++ * wait for swap operations protected by get/put_swap_device() ++ * to complete ++ */ ++ synchronize_rcu(); ++ + flush_work(&p->discard_work); + + destroy_swap_extents(p); +@@ -3265,17 +3362,11 @@ static int __swap_duplicate(swp_entry_t entry, unsigned char usage) + unsigned char has_cache; + int err = -EINVAL; + +- if (non_swap_entry(entry)) +- goto out; +- +- p = swp_swap_info(entry); ++ p = get_swap_device(entry); + if (!p) +- goto bad_file; +- +- offset = swp_offset(entry); +- if (unlikely(offset >= p->max)) + goto out; + ++ offset = swp_offset(entry); + ci = lock_cluster_or_swap_info(p, offset); + + count = p->swap_map[offset]; +@@ -3321,11 +3412,9 @@ static int __swap_duplicate(swp_entry_t entry, unsigned char usage) + unlock_out: + unlock_cluster_or_swap_info(p, ci); + out: ++ if (p) ++ put_swap_device(p); + return err; +- +-bad_file: +- pr_err("swap_dup: %s%08lx\n", Bad_file, entry.val); +- goto out; + } + + /* +@@ -3417,6 +3506,7 @@ int add_swap_count_continuation(swp_entry_t entry, gfp_t gfp_mask) + struct page *list_page; + pgoff_t offset; + unsigned char count; ++ int ret = 0; + + /* + * When debugging, it's easier to use __GFP_ZERO here; but it's better +@@ -3424,15 +3514,15 @@ int add_swap_count_continuation(swp_entry_t entry, gfp_t gfp_mask) + */ + page = alloc_page(gfp_mask | __GFP_HIGHMEM); + +- si = swap_info_get(entry); ++ si = get_swap_device(entry); + if (!si) { + /* + * An acceptable race has occurred since the failing +- * __swap_duplicate(): the swap entry has been freed, +- * perhaps even the whole swap_map cleared for swapoff. ++ * __swap_duplicate(): the swap device may be swapoff + */ + goto outer; + } ++ spin_lock(&si->lock); + + offset = swp_offset(entry); + +@@ -3450,9 +3540,8 @@ int add_swap_count_continuation(swp_entry_t entry, gfp_t gfp_mask) + } + + if (!page) { +- unlock_cluster(ci); +- spin_unlock(&si->lock); +- return -ENOMEM; ++ ret = -ENOMEM; ++ goto out; + } + + /* +@@ -3504,10 +3593,11 @@ int add_swap_count_continuation(swp_entry_t entry, gfp_t gfp_mask) + out: + unlock_cluster(ci); + spin_unlock(&si->lock); ++ put_swap_device(si); + outer: + if (page) + __free_page(page); +- return 0; ++ return ret; + } + + /* +diff --git a/mm/usercopy.c b/mm/usercopy.c +index 2a09796edef8..98e924864554 100644 +--- a/mm/usercopy.c ++++ b/mm/usercopy.c +@@ -147,7 +147,7 @@ static inline void check_bogus_address(const unsigned long ptr, unsigned long n, + bool to_user) + { + /* Reject if object wraps past end of memory. */ +- if (ptr + n < ptr) ++ if (ptr + (n - 1) < ptr) + usercopy_abort("wrapped address", NULL, to_user, 0, ptr + n); + + /* Reject if NULL or ZERO-allocation. */ +diff --git a/mm/vmalloc.c b/mm/vmalloc.c +index 0f76cca32a1c..080d30408ce3 100644 +--- a/mm/vmalloc.c ++++ b/mm/vmalloc.c +@@ -1213,6 +1213,12 @@ static bool __purge_vmap_area_lazy(unsigned long start, unsigned long end) + if (unlikely(valist == NULL)) + return false; + ++ /* ++ * First make sure the mappings are removed from all page-tables ++ * before they are freed. ++ */ ++ vmalloc_sync_all(); ++ + /* + * TODO: to calculate a flush range without looping. + * The list can be up to lazy_max_pages() elements. +@@ -3001,6 +3007,9 @@ EXPORT_SYMBOL(remap_vmalloc_range); + /* + * Implement a stub for vmalloc_sync_all() if the architecture chose not to + * have one. ++ * ++ * The purpose of this function is to make sure the vmalloc area ++ * mappings are identical in all page-tables in the system. + */ + void __weak vmalloc_sync_all(void) + { +diff --git a/mm/vmscan.c b/mm/vmscan.c +index 910e02c793ff..c8f58f5695a9 100644 +--- a/mm/vmscan.c ++++ b/mm/vmscan.c +@@ -88,9 +88,6 @@ struct scan_control { + /* Can pages be swapped as part of reclaim? */ + unsigned int may_swap:1; + +- /* e.g. boosted watermark reclaim leaves slabs alone */ +- unsigned int may_shrinkslab:1; +- + /* + * Cgroups are not reclaimed below their configured memory.low, + * unless we threaten to OOM. If any cgroups are skipped due to +@@ -684,7 +681,14 @@ static unsigned long shrink_slab(gfp_t gfp_mask, int nid, + unsigned long ret, freed = 0; + struct shrinker *shrinker; + +- if (!mem_cgroup_is_root(memcg)) ++ /* ++ * The root memcg might be allocated even though memcg is disabled ++ * via "cgroup_disable=memory" boot parameter. This could make ++ * mem_cgroup_is_root() return false, then just run memcg slab ++ * shrink, but skip global shrink. This may result in premature ++ * oom. ++ */ ++ if (!mem_cgroup_disabled() && !mem_cgroup_is_root(memcg)) + return shrink_slab_memcg(gfp_mask, nid, memcg, priority); + + if (!down_read_trylock(&shrinker_rwsem)) +@@ -2125,7 +2129,7 @@ static void shrink_active_list(unsigned long nr_to_scan, + * 10TB 320 32GB + */ + static bool inactive_list_is_low(struct lruvec *lruvec, bool file, +- struct scan_control *sc, bool actual_reclaim) ++ struct scan_control *sc, bool trace) + { + enum lru_list active_lru = file * LRU_FILE + LRU_ACTIVE; + struct pglist_data *pgdat = lruvec_pgdat(lruvec); +@@ -2151,7 +2155,7 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file, + * rid of the stale workingset quickly. + */ + refaults = lruvec_page_state_local(lruvec, WORKINGSET_ACTIVATE); +- if (file && actual_reclaim && lruvec->refaults != refaults) { ++ if (file && lruvec->refaults != refaults) { + inactive_ratio = 0; + } else { + gb = (inactive + active) >> (30 - PAGE_SHIFT); +@@ -2161,7 +2165,7 @@ static bool inactive_list_is_low(struct lruvec *lruvec, bool file, + inactive_ratio = 1; + } + +- if (actual_reclaim) ++ if (trace) + trace_mm_vmscan_inactive_list_is_low(pgdat->node_id, sc->reclaim_idx, + lruvec_lru_size(lruvec, inactive_lru, MAX_NR_ZONES), inactive, + lruvec_lru_size(lruvec, active_lru, MAX_NR_ZONES), active, +@@ -2662,10 +2666,8 @@ static bool shrink_node(pg_data_t *pgdat, struct scan_control *sc) + shrink_node_memcg(pgdat, memcg, sc, &lru_pages); + node_lru_pages += lru_pages; + +- if (sc->may_shrinkslab) { +- shrink_slab(sc->gfp_mask, pgdat->node_id, +- memcg, sc->priority); +- } ++ shrink_slab(sc->gfp_mask, pgdat->node_id, memcg, ++ sc->priority); + + /* Record the group's reclaim efficiency */ + vmpressure(sc->gfp_mask, memcg, false, +@@ -3142,7 +3144,6 @@ unsigned long try_to_free_pages(struct zonelist *zonelist, int order, + .may_writepage = !laptop_mode, + .may_unmap = 1, + .may_swap = 1, +- .may_shrinkslab = 1, + }; + + /* +@@ -3184,7 +3185,6 @@ unsigned long mem_cgroup_shrink_node(struct mem_cgroup *memcg, + .may_unmap = 1, + .reclaim_idx = MAX_NR_ZONES - 1, + .may_swap = !noswap, +- .may_shrinkslab = 1, + }; + unsigned long lru_pages; + +@@ -3229,7 +3229,6 @@ unsigned long try_to_free_mem_cgroup_pages(struct mem_cgroup *memcg, + .may_writepage = !laptop_mode, + .may_unmap = 1, + .may_swap = may_swap, +- .may_shrinkslab = 1, + }; + + /* +@@ -3538,7 +3537,6 @@ static int balance_pgdat(pg_data_t *pgdat, int order, int classzone_idx) + */ + sc.may_writepage = !laptop_mode && !nr_boost_reclaim; + sc.may_swap = !nr_boost_reclaim; +- sc.may_shrinkslab = !nr_boost_reclaim; + + /* + * Do some background aging of the anon list, to give +diff --git a/mm/z3fold.c b/mm/z3fold.c +index 985732c8b025..c4debbe683eb 100644 +--- a/mm/z3fold.c ++++ b/mm/z3fold.c +@@ -101,6 +101,7 @@ struct z3fold_buddy_slots { + * @refcount: reference count for the z3fold page + * @work: work_struct for page layout optimization + * @slots: pointer to the structure holding buddy slots ++ * @pool: pointer to the containing pool + * @cpu: CPU which this page "belongs" to + * @first_chunks: the size of the first buddy in chunks, 0 if free + * @middle_chunks: the size of the middle buddy in chunks, 0 if free +@@ -114,6 +115,7 @@ struct z3fold_header { + struct kref refcount; + struct work_struct work; + struct z3fold_buddy_slots *slots; ++ struct z3fold_pool *pool; + short cpu; + unsigned short first_chunks; + unsigned short middle_chunks; +@@ -320,6 +322,7 @@ static struct z3fold_header *init_z3fold_page(struct page *page, + zhdr->start_middle = 0; + zhdr->cpu = -1; + zhdr->slots = slots; ++ zhdr->pool = pool; + INIT_LIST_HEAD(&zhdr->buddy); + INIT_WORK(&zhdr->work, compact_page_work); + return zhdr; +@@ -426,7 +429,7 @@ static enum buddy handle_to_buddy(unsigned long handle) + + static inline struct z3fold_pool *zhdr_to_pool(struct z3fold_header *zhdr) + { +- return slots_to_pool(zhdr->slots); ++ return zhdr->pool; + } + + static void __release_z3fold_page(struct z3fold_header *zhdr, bool locked) +@@ -816,9 +819,19 @@ static struct z3fold_pool *z3fold_create_pool(const char *name, gfp_t gfp, + static void z3fold_destroy_pool(struct z3fold_pool *pool) + { + kmem_cache_destroy(pool->c_handle); +- z3fold_unregister_migration(pool); +- destroy_workqueue(pool->release_wq); ++ ++ /* ++ * We need to destroy pool->compact_wq before pool->release_wq, ++ * as any pending work on pool->compact_wq will call ++ * queue_work(pool->release_wq, &pool->work). ++ * ++ * There are still outstanding pages until both workqueues are drained, ++ * so we cannot unregister migration until then. ++ */ ++ + destroy_workqueue(pool->compact_wq); ++ destroy_workqueue(pool->release_wq); ++ z3fold_unregister_migration(pool); + kfree(pool); + } + +@@ -924,7 +937,16 @@ static int z3fold_alloc(struct z3fold_pool *pool, size_t size, gfp_t gfp, + set_bit(PAGE_HEADLESS, &page->private); + goto headless; + } +- __SetPageMovable(page, pool->inode->i_mapping); ++ if (can_sleep) { ++ lock_page(page); ++ __SetPageMovable(page, pool->inode->i_mapping); ++ unlock_page(page); ++ } else { ++ if (trylock_page(page)) { ++ __SetPageMovable(page, pool->inode->i_mapping); ++ unlock_page(page); ++ } ++ } + z3fold_page_lock(zhdr); + + found: +@@ -1331,6 +1353,7 @@ static int z3fold_page_migrate(struct address_space *mapping, struct page *newpa + + VM_BUG_ON_PAGE(!PageMovable(page), page); + VM_BUG_ON_PAGE(!PageIsolated(page), page); ++ VM_BUG_ON_PAGE(!PageLocked(newpage), newpage); + + zhdr = page_address(page); + pool = zhdr_to_pool(zhdr); +@@ -1347,12 +1370,22 @@ static int z3fold_page_migrate(struct address_space *mapping, struct page *newpa + unlock_page(page); + return -EBUSY; + } ++ if (work_pending(&zhdr->work)) { ++ z3fold_page_unlock(zhdr); ++ return -EAGAIN; ++ } + new_zhdr = page_address(newpage); + memcpy(new_zhdr, zhdr, PAGE_SIZE); + newpage->private = page->private; + page->private = 0; + z3fold_page_unlock(zhdr); + spin_lock_init(&new_zhdr->page_lock); ++ INIT_WORK(&new_zhdr->work, compact_page_work); ++ /* ++ * z3fold_page_isolate() ensures that new_zhdr->buddy is empty, ++ * so we only have to reinitialize it. ++ */ ++ INIT_LIST_HEAD(&new_zhdr->buddy); + new_mapping = page_mapping(page); + __ClearPageMovable(page); + ClearPagePrivate(page); +diff --git a/mm/zswap.c b/mm/zswap.c +index 2412042f5550..ca9682f1a66a 100644 +--- a/mm/zswap.c ++++ b/mm/zswap.c +@@ -72,7 +72,11 @@ static u64 zswap_duplicate_entry; + #define ZSWAP_PARAM_UNSET "" + + /* Enable/disable zswap (disabled by default) */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++static bool zswap_enabled = true; ++#else + static bool zswap_enabled; ++#endif + static int zswap_enabled_param_set(const char *, + const struct kernel_param *); + static struct kernel_param_ops zswap_enabled_param_ops = { +@@ -82,7 +86,11 @@ static struct kernel_param_ops zswap_enabled_param_ops = { + module_param_cb(enabled, &zswap_enabled_param_ops, &zswap_enabled, 0644); + + /* Crypto compressor to use */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++#define ZSWAP_COMPRESSOR_DEFAULT "lz4" ++#else + #define ZSWAP_COMPRESSOR_DEFAULT "lzo" ++#endif + static char *zswap_compressor = ZSWAP_COMPRESSOR_DEFAULT; + static int zswap_compressor_param_set(const char *, + const struct kernel_param *); +@@ -95,7 +103,11 @@ module_param_cb(compressor, &zswap_compressor_param_ops, + &zswap_compressor, 0644); + + /* Compressed storage zpool to use */ ++#ifdef CONFIG_ZEN_INTERACTIVE ++#define ZSWAP_ZPOOL_DEFAULT "z3fold" ++#else + #define ZSWAP_ZPOOL_DEFAULT "zbud" ++#endif + static char *zswap_zpool_type = ZSWAP_ZPOOL_DEFAULT; + static int zswap_zpool_param_set(const char *, const struct kernel_param *); + static struct kernel_param_ops zswap_zpool_param_ops = { +diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c +index 549938af02e7..a3cd90a74012 100644 +--- a/net/9p/trans_virtio.c ++++ b/net/9p/trans_virtio.c +@@ -767,10 +767,16 @@ static struct p9_trans_module p9_virtio_trans = { + /* The standard init function */ + static int __init p9_virtio_init(void) + { ++ int rc; ++ + INIT_LIST_HEAD(&virtio_chan_list); + + v9fs_register_trans(&p9_virtio_trans); +- return register_virtio_driver(&p9_virtio_drv); ++ rc = register_virtio_driver(&p9_virtio_drv); ++ if (rc) ++ v9fs_unregister_trans(&p9_virtio_trans); ++ ++ return rc; + } + + static void __exit p9_virtio_cleanup(void) +diff --git a/net/9p/trans_xen.c b/net/9p/trans_xen.c +index 29420ebb8f07..3963eb11c3fb 100644 +--- a/net/9p/trans_xen.c ++++ b/net/9p/trans_xen.c +@@ -530,13 +530,19 @@ static struct xenbus_driver xen_9pfs_front_driver = { + + static int p9_trans_xen_init(void) + { ++ int rc; ++ + if (!xen_domain()) + return -ENODEV; + + pr_info("Initialising Xen transport for 9pfs\n"); + + v9fs_register_trans(&p9_xen_trans); +- return xenbus_register_frontend(&xen_9pfs_front_driver); ++ rc = xenbus_register_frontend(&xen_9pfs_front_driver); ++ if (rc) ++ v9fs_unregister_trans(&p9_xen_trans); ++ ++ return rc; + } + module_init(p9_trans_xen_init); + +diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c +index bd4138ddf7e0..240ed70912d6 100644 +--- a/net/batman-adv/bat_iv_ogm.c ++++ b/net/batman-adv/bat_iv_ogm.c +@@ -2337,7 +2337,7 @@ batadv_iv_ogm_neigh_is_sob(struct batadv_neigh_node *neigh1, + return ret; + } + +-static void batadv_iv_iface_activate(struct batadv_hard_iface *hard_iface) ++static void batadv_iv_iface_enabled(struct batadv_hard_iface *hard_iface) + { + /* begin scheduling originator messages on that interface */ + batadv_iv_ogm_schedule(hard_iface); +@@ -2683,8 +2683,8 @@ static void batadv_iv_gw_dump(struct sk_buff *msg, struct netlink_callback *cb, + static struct batadv_algo_ops batadv_batman_iv __read_mostly = { + .name = "BATMAN_IV", + .iface = { +- .activate = batadv_iv_iface_activate, + .enable = batadv_iv_ogm_iface_enable, ++ .enabled = batadv_iv_iface_enabled, + .disable = batadv_iv_ogm_iface_disable, + .update_mac = batadv_iv_ogm_iface_update_mac, + .primary_set = batadv_iv_ogm_primary_iface_set, +diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c +index 79d1731b8306..3719cfd026f0 100644 +--- a/net/batman-adv/hard-interface.c ++++ b/net/batman-adv/hard-interface.c +@@ -795,6 +795,9 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface, + + batadv_hardif_recalc_extra_skbroom(soft_iface); + ++ if (bat_priv->algo_ops->iface.enabled) ++ bat_priv->algo_ops->iface.enabled(hard_iface); ++ + out: + return 0; + +diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c +index 1ddfd5e011ee..8a482c5ec67b 100644 +--- a/net/batman-adv/translation-table.c ++++ b/net/batman-adv/translation-table.c +@@ -3813,6 +3813,8 @@ static void batadv_tt_purge(struct work_struct *work) + */ + void batadv_tt_free(struct batadv_priv *bat_priv) + { ++ batadv_tvlv_handler_unregister(bat_priv, BATADV_TVLV_ROAM, 1); ++ + batadv_tvlv_container_unregister(bat_priv, BATADV_TVLV_TT, 1); + batadv_tvlv_handler_unregister(bat_priv, BATADV_TVLV_TT, 1); + +diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h +index 74b644738a36..e0b25104cbfa 100644 +--- a/net/batman-adv/types.h ++++ b/net/batman-adv/types.h +@@ -2129,6 +2129,9 @@ struct batadv_algo_iface_ops { + /** @enable: init routing info when hard-interface is enabled */ + int (*enable)(struct batadv_hard_iface *hard_iface); + ++ /** @enabled: notification when hard-interface was enabled (optional) */ ++ void (*enabled)(struct batadv_hard_iface *hard_iface); ++ + /** @disable: de-init routing info when hard-interface is disabled */ + void (*disable)(struct batadv_hard_iface *hard_iface); + +diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c +index 1555b0c6f7ec..9001bf331d56 100644 +--- a/net/bluetooth/6lowpan.c ++++ b/net/bluetooth/6lowpan.c +@@ -180,10 +180,16 @@ static inline struct lowpan_peer *peer_lookup_dst(struct lowpan_btle_dev *dev, + } + + if (!rt) { +- nexthop = &lowpan_cb(skb)->gw; +- +- if (ipv6_addr_any(nexthop)) +- return NULL; ++ if (ipv6_addr_any(&lowpan_cb(skb)->gw)) { ++ /* There is neither route nor gateway, ++ * probably the destination is a direct peer. ++ */ ++ nexthop = daddr; ++ } else { ++ /* There is a known gateway ++ */ ++ nexthop = &lowpan_cb(skb)->gw; ++ } + } else { + nexthop = rt6_nexthop(rt, daddr); + +diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c +index 9e4fcf406d9c..17c50a98e7f7 100644 +--- a/net/bluetooth/hci_event.c ++++ b/net/bluetooth/hci_event.c +@@ -5588,6 +5588,11 @@ static void hci_le_remote_conn_param_req_evt(struct hci_dev *hdev, + return send_conn_param_neg_reply(hdev, handle, + HCI_ERROR_UNKNOWN_CONN_ID); + ++ if (min < hcon->le_conn_min_interval || ++ max > hcon->le_conn_max_interval) ++ return send_conn_param_neg_reply(hdev, handle, ++ HCI_ERROR_INVALID_LL_PARAMS); ++ + if (hci_check_conn_params(min, max, latency, timeout)) + return send_conn_param_neg_reply(hdev, handle, + HCI_ERROR_INVALID_LL_PARAMS); +diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c +index a442e21f3894..5abd423b55fa 100644 +--- a/net/bluetooth/hidp/core.c ++++ b/net/bluetooth/hidp/core.c +@@ -775,7 +775,7 @@ static int hidp_setup_hid(struct hidp_session *session, + hid->version = req->version; + hid->country = req->country; + +- strncpy(hid->name, req->name, sizeof(hid->name)); ++ strscpy(hid->name, req->name, sizeof(hid->name)); + + snprintf(hid->phys, sizeof(hid->phys), "%pMR", + &l2cap_pi(session->ctrl_sock->sk)->chan->src); +diff --git a/net/bluetooth/hidp/sock.c b/net/bluetooth/hidp/sock.c +index 2151913892ce..03be6a4baef3 100644 +--- a/net/bluetooth/hidp/sock.c ++++ b/net/bluetooth/hidp/sock.c +@@ -192,6 +192,7 @@ static int hidp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne + ca.version = ca32.version; + ca.flags = ca32.flags; + ca.idle_to = ca32.idle_to; ++ ca32.name[sizeof(ca32.name) - 1] = '\0'; + memcpy(ca.name, ca32.name, 128); + + csock = sockfd_lookup(ca.ctrl_sock, &err); +diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c +index 5406d7cd46ad..32d2be9d6858 100644 +--- a/net/bluetooth/l2cap_core.c ++++ b/net/bluetooth/l2cap_core.c +@@ -4394,6 +4394,12 @@ static inline int l2cap_disconnect_rsp(struct l2cap_conn *conn, + + l2cap_chan_lock(chan); + ++ if (chan->state != BT_DISCONN) { ++ l2cap_chan_unlock(chan); ++ mutex_unlock(&conn->chan_lock); ++ return 0; ++ } ++ + l2cap_chan_hold(chan); + l2cap_chan_del(chan, 0); + +@@ -5291,7 +5297,14 @@ static inline int l2cap_conn_param_update_req(struct l2cap_conn *conn, + + memset(&rsp, 0, sizeof(rsp)); + +- err = hci_check_conn_params(min, max, latency, to_multiplier); ++ if (min < hcon->le_conn_min_interval || ++ max > hcon->le_conn_max_interval) { ++ BT_DBG("requested connection interval exceeds current bounds."); ++ err = -EINVAL; ++ } else { ++ err = hci_check_conn_params(min, max, latency, to_multiplier); ++ } ++ + if (err) + rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED); + else +diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c +index e68c715f8d37..6c2b4e6e87ba 100644 +--- a/net/bluetooth/smp.c ++++ b/net/bluetooth/smp.c +@@ -2579,6 +2579,19 @@ static int smp_cmd_ident_addr_info(struct l2cap_conn *conn, + goto distribute; + } + ++ /* Drop IRK if peer is using identity address during pairing but is ++ * providing different address as identity information. ++ * ++ * Microsoft Surface Precision Mouse is known to have this bug. ++ */ ++ if (hci_is_identity_address(&hcon->dst, hcon->dst_type) && ++ (bacmp(&info->bdaddr, &hcon->dst) || ++ info->addr_type != hcon->dst_type)) { ++ bt_dev_err(hcon->hdev, ++ "ignoring IRK with invalid identity address"); ++ goto distribute; ++ } ++ + bacpy(&smp->id_addr, &info->bdaddr); + smp->id_addr_type = info->addr_type; + +diff --git a/net/bridge/br.c b/net/bridge/br.c +index d164f63a4345..8a8f9e5f264f 100644 +--- a/net/bridge/br.c ++++ b/net/bridge/br.c +@@ -37,12 +37,15 @@ static int br_device_event(struct notifier_block *unused, unsigned long event, v + int err; + + if (dev->priv_flags & IFF_EBRIDGE) { ++ err = br_vlan_bridge_event(dev, event, ptr); ++ if (err) ++ return notifier_from_errno(err); ++ + if (event == NETDEV_REGISTER) { + /* register of bridge completed, add sysfs entries */ + br_sysfs_addbr(dev); + return NOTIFY_DONE; + } +- br_vlan_bridge_event(dev, event, ptr); + } + + /* not a port of a bridge */ +diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c +index 21b74e7a7b2f..52c712984cc7 100644 +--- a/net/bridge/br_input.c ++++ b/net/bridge/br_input.c +@@ -74,7 +74,6 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb + struct net_bridge_fdb_entry *dst = NULL; + struct net_bridge_mdb_entry *mdst; + bool local_rcv, mcast_hit = false; +- const unsigned char *dest; + struct net_bridge *br; + u16 vid = 0; + +@@ -92,10 +91,9 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb + br_fdb_update(br, p, eth_hdr(skb)->h_source, vid, false); + + local_rcv = !!(br->dev->flags & IFF_PROMISC); +- dest = eth_hdr(skb)->h_dest; +- if (is_multicast_ether_addr(dest)) { ++ if (is_multicast_ether_addr(eth_hdr(skb)->h_dest)) { + /* by definition the broadcast is also a multicast address */ +- if (is_broadcast_ether_addr(dest)) { ++ if (is_broadcast_ether_addr(eth_hdr(skb)->h_dest)) { + pkt_type = BR_PKT_BROADCAST; + local_rcv = true; + } else { +@@ -145,7 +143,7 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb + } + break; + case BR_PKT_UNICAST: +- dst = br_fdb_find_rcu(br, dest, vid); ++ dst = br_fdb_find_rcu(br, eth_hdr(skb)->h_dest, vid); + default: + break; + } +diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c +index de22c8fbbb15..f8cac3702712 100644 +--- a/net/bridge/br_multicast.c ++++ b/net/bridge/br_multicast.c +@@ -911,6 +911,7 @@ static int br_ip4_multicast_igmp3_report(struct net_bridge *br, + int type; + int err = 0; + __be32 group; ++ u16 nsrcs; + + ih = igmpv3_report_hdr(skb); + num = ntohs(ih->ngrec); +@@ -924,8 +925,9 @@ static int br_ip4_multicast_igmp3_report(struct net_bridge *br, + grec = (void *)(skb->data + len - sizeof(*grec)); + group = grec->grec_mca; + type = grec->grec_type; ++ nsrcs = ntohs(grec->grec_nsrcs); + +- len += ntohs(grec->grec_nsrcs) * 4; ++ len += nsrcs * 4; + if (!ip_mc_may_pull(skb, len)) + return -EINVAL; + +@@ -946,7 +948,7 @@ static int br_ip4_multicast_igmp3_report(struct net_bridge *br, + src = eth_hdr(skb)->h_source; + if ((type == IGMPV3_CHANGE_TO_INCLUDE || + type == IGMPV3_MODE_IS_INCLUDE) && +- ntohs(grec->grec_nsrcs) == 0) { ++ nsrcs == 0) { + br_ip4_multicast_leave_group(br, port, group, vid, src); + } else { + err = br_ip4_multicast_add_group(br, port, group, vid, +@@ -983,7 +985,8 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, + len = skb_transport_offset(skb) + sizeof(*icmp6h); + + for (i = 0; i < num; i++) { +- __be16 *nsrcs, _nsrcs; ++ __be16 *_nsrcs, __nsrcs; ++ u16 nsrcs; + + nsrcs_offset = len + offsetof(struct mld2_grec, grec_nsrcs); + +@@ -991,12 +994,13 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, + nsrcs_offset + sizeof(_nsrcs)) + return -EINVAL; + +- nsrcs = skb_header_pointer(skb, nsrcs_offset, +- sizeof(_nsrcs), &_nsrcs); +- if (!nsrcs) ++ _nsrcs = skb_header_pointer(skb, nsrcs_offset, ++ sizeof(__nsrcs), &__nsrcs); ++ if (!_nsrcs) + return -EINVAL; + +- grec_len = struct_size(grec, grec_src, ntohs(*nsrcs)); ++ nsrcs = ntohs(*_nsrcs); ++ grec_len = struct_size(grec, grec_src, nsrcs); + + if (!ipv6_mc_may_pull(skb, len + grec_len)) + return -EINVAL; +@@ -1021,7 +1025,7 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br, + src = eth_hdr(skb)->h_source; + if ((grec->grec_type == MLD2_CHANGE_TO_INCLUDE || + grec->grec_type == MLD2_MODE_IS_INCLUDE) && +- ntohs(*nsrcs) == 0) { ++ nsrcs == 0) { + br_ip6_multicast_leave_group(br, port, &grec->grec_mca, + vid, src); + } else { +@@ -1275,7 +1279,6 @@ static int br_ip6_multicast_query(struct net_bridge *br, + u16 vid) + { + unsigned int transport_len = ipv6_transport_len(skb); +- const struct ipv6hdr *ip6h = ipv6_hdr(skb); + struct mld_msg *mld; + struct net_bridge_mdb_entry *mp; + struct mld2_query *mld2q; +@@ -1319,7 +1322,7 @@ static int br_ip6_multicast_query(struct net_bridge *br, + + if (is_general_query) { + saddr.proto = htons(ETH_P_IPV6); +- saddr.u.ip6 = ip6h->saddr; ++ saddr.u.ip6 = ipv6_hdr(skb)->saddr; + + br_multicast_query_received(br, port, &br->ip6_other_query, + &saddr, max_delay); +@@ -1385,6 +1388,9 @@ br_multicast_leave_group(struct net_bridge *br, + if (!br_port_group_equal(p, port, src)) + continue; + ++ if (p->flags & MDB_PG_FLAGS_PERMANENT) ++ break; ++ + rcu_assign_pointer(*pp, p->next); + hlist_del_init(&p->mglist); + del_timer(&p->timer); +diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h +index 159a0e2cb0f6..9564a953bdf9 100644 +--- a/net/bridge/br_private.h ++++ b/net/bridge/br_private.h +@@ -893,8 +893,8 @@ int nbp_get_num_vlan_infos(struct net_bridge_port *p, u32 filter_mask); + void br_vlan_get_stats(const struct net_bridge_vlan *v, + struct br_vlan_stats *stats); + void br_vlan_port_event(struct net_bridge_port *p, unsigned long event); +-void br_vlan_bridge_event(struct net_device *dev, unsigned long event, +- void *ptr); ++int br_vlan_bridge_event(struct net_device *dev, unsigned long event, ++ void *ptr); + + static inline struct net_bridge_vlan_group *br_vlan_group( + const struct net_bridge *br) +@@ -1084,9 +1084,10 @@ static inline void br_vlan_port_event(struct net_bridge_port *p, + { + } + +-static inline void br_vlan_bridge_event(struct net_device *dev, +- unsigned long event, void *ptr) ++static inline int br_vlan_bridge_event(struct net_device *dev, ++ unsigned long event, void *ptr) + { ++ return 0; + } + #endif + +diff --git a/net/bridge/br_stp_bpdu.c b/net/bridge/br_stp_bpdu.c +index 68a6922b4141..7796dd9d42d7 100644 +--- a/net/bridge/br_stp_bpdu.c ++++ b/net/bridge/br_stp_bpdu.c +@@ -143,7 +143,6 @@ void br_send_tcn_bpdu(struct net_bridge_port *p) + void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb, + struct net_device *dev) + { +- const unsigned char *dest = eth_hdr(skb)->h_dest; + struct net_bridge_port *p; + struct net_bridge *br; + const unsigned char *buf; +@@ -172,7 +171,7 @@ void br_stp_rcv(const struct stp_proto *proto, struct sk_buff *skb, + if (p->state == BR_STATE_DISABLED) + goto out; + +- if (!ether_addr_equal(dest, br->group_addr)) ++ if (!ether_addr_equal(eth_hdr(skb)->h_dest, br->group_addr)) + goto out; + + if (p->flags & BR_BPDU_GUARD) { +diff --git a/net/bridge/br_vlan.c b/net/bridge/br_vlan.c +index f47f526b4f19..6b2c48b07e04 100644 +--- a/net/bridge/br_vlan.c ++++ b/net/bridge/br_vlan.c +@@ -1043,7 +1043,6 @@ int br_vlan_init(struct net_bridge *br) + { + struct net_bridge_vlan_group *vg; + int ret = -ENOMEM; +- bool changed; + + vg = kzalloc(sizeof(*vg), GFP_KERNEL); + if (!vg) +@@ -1058,17 +1057,10 @@ int br_vlan_init(struct net_bridge *br) + br->vlan_proto = htons(ETH_P_8021Q); + br->default_pvid = 1; + rcu_assign_pointer(br->vlgrp, vg); +- ret = br_vlan_add(br, 1, +- BRIDGE_VLAN_INFO_PVID | BRIDGE_VLAN_INFO_UNTAGGED | +- BRIDGE_VLAN_INFO_BRENTRY, &changed, NULL); +- if (ret) +- goto err_vlan_add; + + out: + return ret; + +-err_vlan_add: +- vlan_tunnel_deinit(vg); + err_tunnel_init: + rhashtable_destroy(&vg->vlan_hash); + err_rhtbl: +@@ -1443,13 +1435,23 @@ static void nbp_vlan_set_vlan_dev_state(struct net_bridge_port *p, u16 vid) + } + + /* Must be protected by RTNL. */ +-void br_vlan_bridge_event(struct net_device *dev, unsigned long event, +- void *ptr) ++int br_vlan_bridge_event(struct net_device *dev, unsigned long event, void *ptr) + { + struct netdev_notifier_changeupper_info *info; +- struct net_bridge *br; ++ struct net_bridge *br = netdev_priv(dev); ++ bool changed; ++ int ret = 0; + + switch (event) { ++ case NETDEV_REGISTER: ++ ret = br_vlan_add(br, br->default_pvid, ++ BRIDGE_VLAN_INFO_PVID | ++ BRIDGE_VLAN_INFO_UNTAGGED | ++ BRIDGE_VLAN_INFO_BRENTRY, &changed, NULL); ++ break; ++ case NETDEV_UNREGISTER: ++ br_vlan_delete(br, br->default_pvid); ++ break; + case NETDEV_CHANGEUPPER: + info = ptr; + br_vlan_upper_change(dev, info->upper_dev, info->linking); +@@ -1457,12 +1459,13 @@ void br_vlan_bridge_event(struct net_device *dev, unsigned long event, + + case NETDEV_CHANGE: + case NETDEV_UP: +- br = netdev_priv(dev); + if (!br_opt_get(br, BROPT_VLAN_BRIDGE_BINDING)) +- return; ++ break; + br_vlan_link_state_change(dev, br); + break; + } ++ ++ return ret; + } + + /* Must be protected by RTNL. */ +diff --git a/net/core/dev.c b/net/core/dev.c +index d6edd218babd..29fcff2c3d51 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -4382,12 +4382,17 @@ static u32 netif_receive_generic_xdp(struct sk_buff *skb, + + act = bpf_prog_run_xdp(xdp_prog, xdp); + ++ /* check if bpf_xdp_adjust_head was used */ + off = xdp->data - orig_data; +- if (off > 0) +- __skb_pull(skb, off); +- else if (off < 0) +- __skb_push(skb, -off); +- skb->mac_header += off; ++ if (off) { ++ if (off > 0) ++ __skb_pull(skb, off); ++ else if (off < 0) ++ __skb_push(skb, -off); ++ ++ skb->mac_header += off; ++ skb_reset_network_header(skb); ++ } + + /* check if bpf_xdp_adjust_tail was used. it can only "shrink" + * pckt. +@@ -9711,6 +9716,8 @@ static void __net_exit default_device_exit(struct net *net) + + /* Push remaining network devices to init_net */ + snprintf(fb_name, IFNAMSIZ, "dev%d", dev->ifindex); ++ if (__dev_get_by_name(&init_net, fb_name)) ++ snprintf(fb_name, IFNAMSIZ, "dev%%d"); + err = dev_change_net_namespace(dev, &init_net, fb_name); + if (err) { + pr_emerg("%s: failed to move %s to init_net: %d\n", +diff --git a/net/core/filter.c b/net/core/filter.c +index f615e42cf4ef..f681fb772940 100644 +--- a/net/core/filter.c ++++ b/net/core/filter.c +@@ -4332,7 +4332,7 @@ BPF_CALL_5(bpf_setsockopt, struct bpf_sock_ops_kern *, bpf_sock, + TCP_CA_NAME_MAX-1)); + name[TCP_CA_NAME_MAX-1] = 0; + ret = tcp_set_congestion_control(sk, name, false, +- reinit); ++ reinit, true); + } else { + struct tcp_sock *tp = tcp_sk(sk); + +diff --git a/net/core/neighbour.c b/net/core/neighbour.c +index 9e7fc929bc50..5bb0a1aee50e 100644 +--- a/net/core/neighbour.c ++++ b/net/core/neighbour.c +@@ -1122,6 +1122,7 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) + + atomic_set(&neigh->probes, + NEIGH_VAR(neigh->parms, UCAST_PROBES)); ++ neigh_del_timer(neigh); + neigh->nud_state = NUD_INCOMPLETE; + neigh->updated = now; + next = now + max(NEIGH_VAR(neigh->parms, RETRANS_TIME), +@@ -1138,6 +1139,7 @@ int __neigh_event_send(struct neighbour *neigh, struct sk_buff *skb) + } + } else if (neigh->nud_state & NUD_STALE) { + neigh_dbg(2, "neigh %p is delayed\n", neigh); ++ neigh_del_timer(neigh); + neigh->nud_state = NUD_DELAY; + neigh->updated = jiffies; + neigh_add_timer(neigh, jiffies + +diff --git a/net/core/pktgen.c b/net/core/pktgen.c +index f975c5e2a369..2a1705d2b31a 100644 +--- a/net/core/pktgen.c ++++ b/net/core/pktgen.c +@@ -1894,7 +1894,7 @@ static void pktgen_mark_device(const struct pktgen_net *pn, const char *ifname) + mutex_unlock(&pktgen_thread_lock); + pr_debug("%s: waiting for %s to disappear....\n", + __func__, ifname); +- schedule_timeout_interruptible(msecs_to_jiffies(msec_per_try)); ++ schedule_msec_hrtimeout_interruptible((msec_per_try)); + mutex_lock(&pktgen_thread_lock); + + if (++i >= max_tries) { +diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig +index 974de4d20f25..c893bf91e7cb 100644 +--- a/net/ipv4/Kconfig ++++ b/net/ipv4/Kconfig +@@ -676,6 +676,9 @@ choice + config DEFAULT_VEGAS + bool "Vegas" if TCP_CONG_VEGAS=y + ++ config DEFAULT_YEAH ++ bool "YeAH" if TCP_CONG_YEAH=y ++ + config DEFAULT_VENO + bool "Veno" if TCP_CONG_VENO=y + +@@ -709,6 +712,7 @@ config DEFAULT_TCP_CONG + default "htcp" if DEFAULT_HTCP + default "hybla" if DEFAULT_HYBLA + default "vegas" if DEFAULT_VEGAS ++ default "yeah" if DEFAULT_YEAH + default "westwood" if DEFAULT_WESTWOOD + default "veno" if DEFAULT_VENO + default "reno" if DEFAULT_RENO +diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c +index c6bd0f7a020a..c5ebfa199794 100644 +--- a/net/ipv4/devinet.c ++++ b/net/ipv4/devinet.c +@@ -62,6 +62,11 @@ + #include + #include + ++#define IPV6ONLY_FLAGS \ ++ (IFA_F_NODAD | IFA_F_OPTIMISTIC | IFA_F_DADFAILED | \ ++ IFA_F_HOMEADDRESS | IFA_F_TENTATIVE | \ ++ IFA_F_MANAGETEMPADDR | IFA_F_STABLE_PRIVACY) ++ + static struct ipv4_devconf ipv4_devconf = { + .data = { + [IPV4_DEVCONF_ACCEPT_REDIRECTS - 1] = 1, +@@ -468,6 +473,9 @@ static int __inet_insert_ifa(struct in_ifaddr *ifa, struct nlmsghdr *nlh, + ifa->ifa_flags &= ~IFA_F_SECONDARY; + last_primary = &in_dev->ifa_list; + ++ /* Don't set IPv6 only flags to IPv4 addresses */ ++ ifa->ifa_flags &= ~IPV6ONLY_FLAGS; ++ + for (ifap = &in_dev->ifa_list; (ifa1 = *ifap) != NULL; + ifap = &ifa1->ifa_next) { + if (!(ifa1->ifa_flags & IFA_F_SECONDARY) && +diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c +index a57f0d69eadb..85107bf812f2 100644 +--- a/net/ipv4/igmp.c ++++ b/net/ipv4/igmp.c +@@ -1228,12 +1228,8 @@ static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im) + if (pmc) { + im->interface = pmc->interface; + if (im->sfmode == MCAST_INCLUDE) { +- im->tomb = pmc->tomb; +- pmc->tomb = NULL; +- +- im->sources = pmc->sources; +- pmc->sources = NULL; +- ++ swap(im->tomb, pmc->tomb); ++ swap(im->sources, pmc->sources); + for (psf = im->sources; psf; psf = psf->sf_next) + psf->sf_crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv; + } else { +diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c +index 43adfc1641ba..2f01cf6fa0de 100644 +--- a/net/ipv4/ipip.c ++++ b/net/ipv4/ipip.c +@@ -275,6 +275,9 @@ static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, + const struct iphdr *tiph = &tunnel->parms.iph; + u8 ipproto; + ++ if (!pskb_inet_may_pull(skb)) ++ goto tx_error; ++ + switch (skb->protocol) { + case htons(ETH_P_IP): + ipproto = IPPROTO_IPIP; +diff --git a/net/ipv4/netfilter/ipt_rpfilter.c b/net/ipv4/netfilter/ipt_rpfilter.c +index 59031670b16a..cc23f1ce239c 100644 +--- a/net/ipv4/netfilter/ipt_rpfilter.c ++++ b/net/ipv4/netfilter/ipt_rpfilter.c +@@ -78,6 +78,7 @@ static bool rpfilter_mt(const struct sk_buff *skb, struct xt_action_param *par) + flow.flowi4_mark = info->flags & XT_RPFILTER_VALID_MARK ? skb->mark : 0; + flow.flowi4_tos = RT_TOS(iph->tos); + flow.flowi4_scope = RT_SCOPE_UNIVERSE; ++ flow.flowi4_oif = l3mdev_master_ifindex_rcu(xt_in(par)); + + return rpfilter_lookup_reverse(xt_net(par), &flow, xt_in(par), info->flags) ^ invert; + } +diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c +index 7dc9ab84bb69..5264f064a87e 100644 +--- a/net/ipv4/tcp.c ++++ b/net/ipv4/tcp.c +@@ -2614,6 +2614,8 @@ int tcp_disconnect(struct sock *sk, int flags) + tcp_saved_syn_free(tp); + tp->compressed_ack = 0; + tp->bytes_sent = 0; ++ tp->bytes_acked = 0; ++ tp->bytes_received = 0; + tp->bytes_retrans = 0; + tp->duplicate_sack[0].start_seq = 0; + tp->duplicate_sack[0].end_seq = 0; +@@ -2768,7 +2770,9 @@ static int do_tcp_setsockopt(struct sock *sk, int level, + name[val] = 0; + + lock_sock(sk); +- err = tcp_set_congestion_control(sk, name, true, true); ++ err = tcp_set_congestion_control(sk, name, true, true, ++ ns_capable(sock_net(sk)->user_ns, ++ CAP_NET_ADMIN)); + release_sock(sk); + return err; + } +diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c +index e1862b64a90f..c445a81d144e 100644 +--- a/net/ipv4/tcp_cong.c ++++ b/net/ipv4/tcp_cong.c +@@ -333,7 +333,8 @@ int tcp_set_allowed_congestion_control(char *val) + * tcp_reinit_congestion_control (if the current congestion control was + * already initialized. + */ +-int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, bool reinit) ++int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, ++ bool reinit, bool cap_net_admin) + { + struct inet_connection_sock *icsk = inet_csk(sk); + const struct tcp_congestion_ops *ca; +@@ -369,8 +370,7 @@ int tcp_set_congestion_control(struct sock *sk, const char *name, bool load, boo + } else { + err = -EBUSY; + } +- } else if (!((ca->flags & TCP_CONG_NON_RESTRICTED) || +- ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN))) { ++ } else if (!((ca->flags & TCP_CONG_NON_RESTRICTED) || cap_net_admin)) { + err = -EPERM; + } else if (!try_module_get(ca->owner)) { + err = -EBUSY; +diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c +index 0ebc33d1c9e5..7d0be046cbc1 100644 +--- a/net/ipv4/tcp_output.c ++++ b/net/ipv4/tcp_output.c +@@ -1286,6 +1286,7 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue, + struct tcp_sock *tp = tcp_sk(sk); + struct sk_buff *buff; + int nsize, old_factor; ++ long limit; + int nlen; + u8 flags; + +@@ -1296,8 +1297,16 @@ int tcp_fragment(struct sock *sk, enum tcp_queue tcp_queue, + if (nsize < 0) + nsize = 0; + +- if (unlikely((sk->sk_wmem_queued >> 1) > sk->sk_sndbuf && +- tcp_queue != TCP_FRAG_IN_WRITE_QUEUE)) { ++ /* tcp_sendmsg() can overshoot sk_wmem_queued by one full size skb. ++ * We need some allowance to not penalize applications setting small ++ * SO_SNDBUF values. ++ * Also allow first and last skb in retransmit queue to be split. ++ */ ++ limit = sk->sk_sndbuf + 2 * SKB_TRUESIZE(GSO_MAX_SIZE); ++ if (unlikely((sk->sk_wmem_queued >> 1) > limit && ++ tcp_queue != TCP_FRAG_IN_WRITE_QUEUE && ++ skb != tcp_rtx_queue_head(sk) && ++ skb != tcp_rtx_queue_tail(sk))) { + NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPWQUEUETOOBIG); + return -ENOMEM; + } +diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c +index 9180c8b6f764..455f1292e479 100644 +--- a/net/ipv6/ip6_fib.c ++++ b/net/ipv6/ip6_fib.c +@@ -1104,8 +1104,24 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct fib6_info *rt, + err = call_fib6_entry_notifiers(info->nl_net, + FIB_EVENT_ENTRY_ADD, + rt, extack); +- if (err) ++ if (err) { ++ struct fib6_info *sibling, *next_sibling; ++ ++ /* If the route has siblings, then it first ++ * needs to be unlinked from them. ++ */ ++ if (!rt->fib6_nsiblings) ++ return err; ++ ++ list_for_each_entry_safe(sibling, next_sibling, ++ &rt->fib6_siblings, ++ fib6_siblings) ++ sibling->fib6_nsiblings--; ++ rt->fib6_nsiblings = 0; ++ list_del_init(&rt->fib6_siblings); ++ rt6_multipath_rebalance(next_sibling); + return err; ++ } + + rcu_assign_pointer(rt->fib6_next, iter); + fib6_info_hold(rt); +diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c +index c2049c72f3e5..dd2d0b963260 100644 +--- a/net/ipv6/ip6_gre.c ++++ b/net/ipv6/ip6_gre.c +@@ -660,12 +660,13 @@ static int prepare_ip6gre_xmit_ipv6(struct sk_buff *skb, + struct flowi6 *fl6, __u8 *dsfield, + int *encap_limit) + { +- struct ipv6hdr *ipv6h = ipv6_hdr(skb); ++ struct ipv6hdr *ipv6h; + struct ip6_tnl *t = netdev_priv(dev); + __u16 offset; + + offset = ip6_tnl_parse_tlv_enc_lim(skb, skb_network_header(skb)); + /* ip6_tnl_parse_tlv_enc_lim() might have reallocated skb->head */ ++ ipv6h = ipv6_hdr(skb); + + if (offset > 0) { + struct ipv6_tlv_tnl_enc_lim *tel; +diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c +index b80fde1bc005..d10a9e40729f 100644 +--- a/net/ipv6/ip6_tunnel.c ++++ b/net/ipv6/ip6_tunnel.c +@@ -1278,12 +1278,11 @@ ip4ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) + } + + fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL); ++ dsfield = INET_ECN_encapsulate(dsfield, ipv4_get_dsfield(iph)); + + if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) + return -1; + +- dsfield = INET_ECN_encapsulate(dsfield, ipv4_get_dsfield(iph)); +- + skb_set_inner_ipproto(skb, IPPROTO_IPIP); + + err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu, +@@ -1367,12 +1366,11 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev) + } + + fl6.flowi6_uid = sock_net_uid(dev_net(dev), NULL); ++ dsfield = INET_ECN_encapsulate(dsfield, ipv6_get_dsfield(ipv6h)); + + if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6)) + return -1; + +- dsfield = INET_ECN_encapsulate(dsfield, ipv6_get_dsfield(ipv6h)); +- + skb_set_inner_ipproto(skb, IPPROTO_IPV6); + + err = ip6_tnl_xmit(skb, dev, dsfield, &fl6, encap_limit, &mtu, +diff --git a/net/ipv6/netfilter/ip6t_rpfilter.c b/net/ipv6/netfilter/ip6t_rpfilter.c +index 6bcaf7357183..d800801a5dd2 100644 +--- a/net/ipv6/netfilter/ip6t_rpfilter.c ++++ b/net/ipv6/netfilter/ip6t_rpfilter.c +@@ -55,7 +55,9 @@ static bool rpfilter_lookup_reverse6(struct net *net, const struct sk_buff *skb, + if (rpfilter_addr_linklocal(&iph->saddr)) { + lookup_flags |= RT6_LOOKUP_F_IFACE; + fl6.flowi6_oif = dev->ifindex; +- } else if ((flags & XT_RPFILTER_LOOSE) == 0) ++ /* Set flowi6_oif for vrf devices to lookup route in l3mdev domain. */ ++ } else if (netif_is_l3_master(dev) || netif_is_l3_slave(dev) || ++ (flags & XT_RPFILTER_LOOSE) == 0) + fl6.flowi6_oif = dev->ifindex; + + rt = (void *)ip6_route_lookup(net, &fl6, skb, lookup_flags); +@@ -70,7 +72,9 @@ static bool rpfilter_lookup_reverse6(struct net *net, const struct sk_buff *skb, + goto out; + } + +- if (rt->rt6i_idev->dev == dev || (flags & XT_RPFILTER_LOOSE)) ++ if (rt->rt6i_idev->dev == dev || ++ l3mdev_master_ifindex_rcu(rt->rt6i_idev->dev) == dev->ifindex || ++ (flags & XT_RPFILTER_LOOSE)) + ret = true; + out: + ip6_rt_put(rt); +diff --git a/net/ipv6/route.c b/net/ipv6/route.c +index 97a843cf164c..5f5a0a42ce60 100644 +--- a/net/ipv6/route.c ++++ b/net/ipv6/route.c +@@ -2215,7 +2215,7 @@ static struct dst_entry *rt6_check(struct rt6_info *rt, + { + u32 rt_cookie = 0; + +- if ((from && !fib6_get_cookie_safe(from, &rt_cookie)) || ++ if (!from || !fib6_get_cookie_safe(from, &rt_cookie) || + rt_cookie != cookie) + return NULL; + +diff --git a/net/key/af_key.c b/net/key/af_key.c +index a50dd6f34b91..fe5fc4bab7ee 100644 +--- a/net/key/af_key.c ++++ b/net/key/af_key.c +@@ -2438,8 +2438,10 @@ static int key_pol_get_resp(struct sock *sk, struct xfrm_policy *xp, const struc + goto out; + } + err = pfkey_xfrm_policy2msg(out_skb, xp, dir); +- if (err < 0) ++ if (err < 0) { ++ kfree_skb(out_skb); + goto out; ++ } + + out_hdr = (struct sadb_msg *) out_skb->data; + out_hdr->sadb_msg_version = hdr->sadb_msg_version; +@@ -2690,8 +2692,10 @@ static int dump_sp(struct xfrm_policy *xp, int dir, int count, void *ptr) + return PTR_ERR(out_skb); + + err = pfkey_xfrm_policy2msg(out_skb, xp, dir); +- if (err < 0) ++ if (err < 0) { ++ kfree_skb(out_skb); + return err; ++ } + + out_hdr = (struct sadb_msg *) out_skb->data; + out_hdr->sadb_msg_version = pfk->dump.msg_version; +diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c +index 1d0e5904dedf..c54cb59593ef 100644 +--- a/net/l2tp/l2tp_ppp.c ++++ b/net/l2tp/l2tp_ppp.c +@@ -1681,6 +1681,9 @@ static const struct proto_ops pppol2tp_ops = { + .recvmsg = pppol2tp_recvmsg, + .mmap = sock_no_mmap, + .ioctl = pppox_ioctl, ++#ifdef CONFIG_COMPAT ++ .compat_ioctl = pppox_compat_ioctl, ++#endif + }; + + static const struct pppox_proto pppol2tp_proto = { +diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c +index a1973a26c7fc..b8288125e05d 100644 +--- a/net/mac80211/cfg.c ++++ b/net/mac80211/cfg.c +@@ -935,8 +935,10 @@ static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata, + + err = ieee80211_set_probe_resp(sdata, params->probe_resp, + params->probe_resp_len, csa); +- if (err < 0) ++ if (err < 0) { ++ kfree(new); + return err; ++ } + if (err == 0) + changed |= BSS_CHANGED_AP_PROBE_RESP; + +@@ -948,8 +950,10 @@ static int ieee80211_assign_beacon(struct ieee80211_sub_if_data *sdata, + params->civicloc, + params->civicloc_len); + +- if (err < 0) ++ if (err < 0) { ++ kfree(new); + return err; ++ } + + changed |= BSS_CHANGED_FTM_RESPONDER; + } +diff --git a/net/mac80211/driver-ops.c b/net/mac80211/driver-ops.c +index acd4afb4944b..c9a8a2433e8a 100644 +--- a/net/mac80211/driver-ops.c ++++ b/net/mac80211/driver-ops.c +@@ -187,11 +187,16 @@ int drv_conf_tx(struct ieee80211_local *local, + if (!check_sdata_in_driver(sdata)) + return -EIO; + +- if (WARN_ONCE(params->cw_min == 0 || +- params->cw_min > params->cw_max, +- "%s: invalid CW_min/CW_max: %d/%d\n", +- sdata->name, params->cw_min, params->cw_max)) ++ if (params->cw_min == 0 || params->cw_min > params->cw_max) { ++ /* ++ * If we can't configure hardware anyway, don't warn. We may ++ * never have initialized the CW parameters. ++ */ ++ WARN_ONCE(local->ops->conf_tx, ++ "%s: invalid CW_min/CW_max: %d/%d\n", ++ sdata->name, params->cw_min, params->cw_max); + return -EINVAL; ++ } + + trace_drv_conf_tx(local, sdata, ac, params); + if (local->ops->conf_tx) +diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c +index 06aac0aaae64..8dc6580e1787 100644 +--- a/net/mac80211/iface.c ++++ b/net/mac80211/iface.c +@@ -1222,7 +1222,6 @@ static void ieee80211_if_setup(struct net_device *dev) + static void ieee80211_if_setup_no_queue(struct net_device *dev) + { + ieee80211_if_setup(dev); +- dev->features |= NETIF_F_LLTX; + dev->priv_flags |= IFF_NO_QUEUE; + } + +diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c +index 379d2ab6d327..36b60f39930b 100644 +--- a/net/mac80211/mlme.c ++++ b/net/mac80211/mlme.c +@@ -2041,6 +2041,16 @@ ieee80211_sta_wmm_params(struct ieee80211_local *local, + ieee80211_regulatory_limit_wmm_params(sdata, ¶ms[ac], ac); + } + ++ /* WMM specification requires all 4 ACIs. */ ++ for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { ++ if (params[ac].cw_min == 0) { ++ sdata_info(sdata, ++ "AP has invalid WMM params (missing AC %d), using defaults\n", ++ ac); ++ return false; ++ } ++ } ++ + for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { + mlme_dbg(sdata, + "WMM AC=%d acm=%d aifs=%d cWmin=%d cWmax=%d txop=%d uapsd=%d, downgraded=%d\n", +diff --git a/net/netfilter/ipset/ip_set_core.c b/net/netfilter/ipset/ip_set_core.c +index 3cdf171cd468..16afa0df4004 100644 +--- a/net/netfilter/ipset/ip_set_core.c ++++ b/net/netfilter/ipset/ip_set_core.c +@@ -1541,10 +1541,14 @@ call_ad(struct sock *ctnl, struct sk_buff *skb, struct ip_set *set, + memcpy(&errmsg->msg, nlh, nlh->nlmsg_len); + cmdattr = (void *)&errmsg->msg + min_len; + +- nla_parse_deprecated(cda, IPSET_ATTR_CMD_MAX, cmdattr, +- nlh->nlmsg_len - min_len, +- ip_set_adt_policy, NULL); ++ ret = nla_parse_deprecated(cda, IPSET_ATTR_CMD_MAX, cmdattr, ++ nlh->nlmsg_len - min_len, ++ ip_set_adt_policy, NULL); + ++ if (ret) { ++ nlmsg_free(skb2); ++ return ret; ++ } + errline = nla_data(cda[IPSET_ATTR_LINENO]); + + *errline = lineno; +diff --git a/net/netfilter/ipset/ip_set_hash_gen.h b/net/netfilter/ipset/ip_set_hash_gen.h +index 10f619625abd..175f8fedcfaf 100644 +--- a/net/netfilter/ipset/ip_set_hash_gen.h ++++ b/net/netfilter/ipset/ip_set_hash_gen.h +@@ -622,7 +622,7 @@ mtype_resize(struct ip_set *set, bool retried) + goto cleanup; + } + m->size = AHASH_INIT_SIZE; +- extsize = ext_size(AHASH_INIT_SIZE, dsize); ++ extsize += ext_size(AHASH_INIT_SIZE, dsize); + RCU_INIT_POINTER(hbucket(t, key), m); + } else if (m->pos >= m->size) { + struct hbucket *ht; +diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c +index 7138556b206b..d5103a9eb302 100644 +--- a/net/netfilter/ipvs/ip_vs_core.c ++++ b/net/netfilter/ipvs/ip_vs_core.c +@@ -2245,7 +2245,6 @@ static const struct nf_hook_ops ip_vs_ops[] = { + static int __net_init __ip_vs_init(struct net *net) + { + struct netns_ipvs *ipvs; +- int ret; + + ipvs = net_generic(net, ip_vs_net_id); + if (ipvs == NULL) +@@ -2277,17 +2276,11 @@ static int __net_init __ip_vs_init(struct net *net) + if (ip_vs_sync_net_init(ipvs) < 0) + goto sync_fail; + +- ret = nf_register_net_hooks(net, ip_vs_ops, ARRAY_SIZE(ip_vs_ops)); +- if (ret < 0) +- goto hook_fail; +- + return 0; + /* + * Error handling + */ + +-hook_fail: +- ip_vs_sync_net_cleanup(ipvs); + sync_fail: + ip_vs_conn_net_cleanup(ipvs); + conn_fail: +@@ -2317,6 +2310,19 @@ static void __net_exit __ip_vs_cleanup(struct net *net) + net->ipvs = NULL; + } + ++static int __net_init __ip_vs_dev_init(struct net *net) ++{ ++ int ret; ++ ++ ret = nf_register_net_hooks(net, ip_vs_ops, ARRAY_SIZE(ip_vs_ops)); ++ if (ret < 0) ++ goto hook_fail; ++ return 0; ++ ++hook_fail: ++ return ret; ++} ++ + static void __net_exit __ip_vs_dev_cleanup(struct net *net) + { + struct netns_ipvs *ipvs = net_ipvs(net); +@@ -2336,6 +2342,7 @@ static struct pernet_operations ipvs_core_ops = { + }; + + static struct pernet_operations ipvs_core_dev_ops = { ++ .init = __ip_vs_dev_init, + .exit = __ip_vs_dev_cleanup, + }; + +diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c +index 776c87ed4813..741d91aa4a8d 100644 +--- a/net/netfilter/ipvs/ip_vs_ctl.c ++++ b/net/netfilter/ipvs/ip_vs_ctl.c +@@ -2396,9 +2396,7 @@ do_ip_vs_set_ctl(struct sock *sk, int cmd, void __user *user, unsigned int len) + cfg.syncid = dm->syncid; + ret = start_sync_thread(ipvs, &cfg, dm->state); + } else { +- mutex_lock(&ipvs->sync_mutex); + ret = stop_sync_thread(ipvs, dm->state); +- mutex_unlock(&ipvs->sync_mutex); + } + goto out_dec; + } +@@ -3515,10 +3513,8 @@ static int ip_vs_genl_del_daemon(struct netns_ipvs *ipvs, struct nlattr **attrs) + if (!attrs[IPVS_DAEMON_ATTR_STATE]) + return -EINVAL; + +- mutex_lock(&ipvs->sync_mutex); + ret = stop_sync_thread(ipvs, + nla_get_u32(attrs[IPVS_DAEMON_ATTR_STATE])); +- mutex_unlock(&ipvs->sync_mutex); + return ret; + } + +diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c +index 2526be6b3d90..a4a78c4b06de 100644 +--- a/net/netfilter/ipvs/ip_vs_sync.c ++++ b/net/netfilter/ipvs/ip_vs_sync.c +@@ -195,6 +195,7 @@ union ip_vs_sync_conn { + #define IPVS_OPT_F_PARAM (1 << (IPVS_OPT_PARAM-1)) + + struct ip_vs_sync_thread_data { ++ struct task_struct *task; + struct netns_ipvs *ipvs; + struct socket *sock; + char *buf; +@@ -374,8 +375,11 @@ static inline void sb_queue_tail(struct netns_ipvs *ipvs, + max(IPVS_SYNC_SEND_DELAY, 1)); + ms->sync_queue_len++; + list_add_tail(&sb->list, &ms->sync_queue); +- if ((++ms->sync_queue_delay) == IPVS_SYNC_WAKEUP_RATE) +- wake_up_process(ms->master_thread); ++ if ((++ms->sync_queue_delay) == IPVS_SYNC_WAKEUP_RATE) { ++ int id = (int)(ms - ipvs->ms); ++ ++ wake_up_process(ipvs->master_tinfo[id].task); ++ } + } else + ip_vs_sync_buff_release(sb); + spin_unlock(&ipvs->sync_lock); +@@ -1636,8 +1640,10 @@ static void master_wakeup_work_handler(struct work_struct *work) + spin_lock_bh(&ipvs->sync_lock); + if (ms->sync_queue_len && + ms->sync_queue_delay < IPVS_SYNC_WAKEUP_RATE) { ++ int id = (int)(ms - ipvs->ms); ++ + ms->sync_queue_delay = IPVS_SYNC_WAKEUP_RATE; +- wake_up_process(ms->master_thread); ++ wake_up_process(ipvs->master_tinfo[id].task); + } + spin_unlock_bh(&ipvs->sync_lock); + } +@@ -1703,10 +1709,6 @@ static int sync_thread_master(void *data) + if (sb) + ip_vs_sync_buff_release(sb); + +- /* release the sending multicast socket */ +- sock_release(tinfo->sock); +- kfree(tinfo); +- + return 0; + } + +@@ -1740,11 +1742,6 @@ static int sync_thread_backup(void *data) + } + } + +- /* release the sending multicast socket */ +- sock_release(tinfo->sock); +- kfree(tinfo->buf); +- kfree(tinfo); +- + return 0; + } + +@@ -1752,8 +1749,8 @@ static int sync_thread_backup(void *data) + int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, + int state) + { +- struct ip_vs_sync_thread_data *tinfo = NULL; +- struct task_struct **array = NULL, *task; ++ struct ip_vs_sync_thread_data *ti = NULL, *tinfo; ++ struct task_struct *task; + struct net_device *dev; + char *name; + int (*threadfn)(void *data); +@@ -1822,7 +1819,7 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, + threadfn = sync_thread_master; + } else if (state == IP_VS_STATE_BACKUP) { + result = -EEXIST; +- if (ipvs->backup_threads) ++ if (ipvs->backup_tinfo) + goto out_early; + + ipvs->bcfg = *c; +@@ -1849,28 +1846,22 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, + master_wakeup_work_handler); + ms->ipvs = ipvs; + } +- } else { +- array = kcalloc(count, sizeof(struct task_struct *), +- GFP_KERNEL); +- result = -ENOMEM; +- if (!array) +- goto out; + } ++ result = -ENOMEM; ++ ti = kcalloc(count, sizeof(struct ip_vs_sync_thread_data), ++ GFP_KERNEL); ++ if (!ti) ++ goto out; + + for (id = 0; id < count; id++) { +- result = -ENOMEM; +- tinfo = kmalloc(sizeof(*tinfo), GFP_KERNEL); +- if (!tinfo) +- goto out; ++ tinfo = &ti[id]; + tinfo->ipvs = ipvs; +- tinfo->sock = NULL; + if (state == IP_VS_STATE_BACKUP) { ++ result = -ENOMEM; + tinfo->buf = kmalloc(ipvs->bcfg.sync_maxlen, + GFP_KERNEL); + if (!tinfo->buf) + goto out; +- } else { +- tinfo->buf = NULL; + } + tinfo->id = id; + if (state == IP_VS_STATE_MASTER) +@@ -1885,17 +1876,15 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, + result = PTR_ERR(task); + goto out; + } +- tinfo = NULL; +- if (state == IP_VS_STATE_MASTER) +- ipvs->ms[id].master_thread = task; +- else +- array[id] = task; ++ tinfo->task = task; + } + + /* mark as active */ + +- if (state == IP_VS_STATE_BACKUP) +- ipvs->backup_threads = array; ++ if (state == IP_VS_STATE_MASTER) ++ ipvs->master_tinfo = ti; ++ else ++ ipvs->backup_tinfo = ti; + spin_lock_bh(&ipvs->sync_buff_lock); + ipvs->sync_state |= state; + spin_unlock_bh(&ipvs->sync_buff_lock); +@@ -1910,29 +1899,31 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, + + out: + /* We do not need RTNL lock anymore, release it here so that +- * sock_release below and in the kthreads can use rtnl_lock +- * to leave the mcast group. ++ * sock_release below can use rtnl_lock to leave the mcast group. + */ + rtnl_unlock(); +- count = id; +- while (count-- > 0) { +- if (state == IP_VS_STATE_MASTER) +- kthread_stop(ipvs->ms[count].master_thread); +- else +- kthread_stop(array[count]); ++ id = min(id, count - 1); ++ if (ti) { ++ for (tinfo = ti + id; tinfo >= ti; tinfo--) { ++ if (tinfo->task) ++ kthread_stop(tinfo->task); ++ } + } + if (!(ipvs->sync_state & IP_VS_STATE_MASTER)) { + kfree(ipvs->ms); + ipvs->ms = NULL; + } + mutex_unlock(&ipvs->sync_mutex); +- if (tinfo) { +- if (tinfo->sock) +- sock_release(tinfo->sock); +- kfree(tinfo->buf); +- kfree(tinfo); ++ ++ /* No more mutexes, release socks */ ++ if (ti) { ++ for (tinfo = ti + id; tinfo >= ti; tinfo--) { ++ if (tinfo->sock) ++ sock_release(tinfo->sock); ++ kfree(tinfo->buf); ++ } ++ kfree(ti); + } +- kfree(array); + return result; + + out_early: +@@ -1944,15 +1935,18 @@ int start_sync_thread(struct netns_ipvs *ipvs, struct ipvs_sync_daemon_cfg *c, + + int stop_sync_thread(struct netns_ipvs *ipvs, int state) + { +- struct task_struct **array; ++ struct ip_vs_sync_thread_data *ti, *tinfo; + int id; + int retc = -EINVAL; + + IP_VS_DBG(7, "%s(): pid %d\n", __func__, task_pid_nr(current)); + ++ mutex_lock(&ipvs->sync_mutex); + if (state == IP_VS_STATE_MASTER) { ++ retc = -ESRCH; + if (!ipvs->ms) +- return -ESRCH; ++ goto err; ++ ti = ipvs->master_tinfo; + + /* + * The lock synchronizes with sb_queue_tail(), so that we don't +@@ -1971,38 +1965,56 @@ int stop_sync_thread(struct netns_ipvs *ipvs, int state) + struct ipvs_master_sync_state *ms = &ipvs->ms[id]; + int ret; + ++ tinfo = &ti[id]; + pr_info("stopping master sync thread %d ...\n", +- task_pid_nr(ms->master_thread)); ++ task_pid_nr(tinfo->task)); + cancel_delayed_work_sync(&ms->master_wakeup_work); +- ret = kthread_stop(ms->master_thread); ++ ret = kthread_stop(tinfo->task); + if (retc >= 0) + retc = ret; + } + kfree(ipvs->ms); + ipvs->ms = NULL; ++ ipvs->master_tinfo = NULL; + } else if (state == IP_VS_STATE_BACKUP) { +- if (!ipvs->backup_threads) +- return -ESRCH; ++ retc = -ESRCH; ++ if (!ipvs->backup_tinfo) ++ goto err; ++ ti = ipvs->backup_tinfo; + + ipvs->sync_state &= ~IP_VS_STATE_BACKUP; +- array = ipvs->backup_threads; + retc = 0; + for (id = ipvs->threads_mask; id >= 0; id--) { + int ret; + ++ tinfo = &ti[id]; + pr_info("stopping backup sync thread %d ...\n", +- task_pid_nr(array[id])); +- ret = kthread_stop(array[id]); ++ task_pid_nr(tinfo->task)); ++ ret = kthread_stop(tinfo->task); + if (retc >= 0) + retc = ret; + } +- kfree(array); +- ipvs->backup_threads = NULL; ++ ipvs->backup_tinfo = NULL; ++ } else { ++ goto err; + } ++ id = ipvs->threads_mask; ++ mutex_unlock(&ipvs->sync_mutex); ++ ++ /* No more mutexes, release socks */ ++ for (tinfo = ti + id; tinfo >= ti; tinfo--) { ++ if (tinfo->sock) ++ sock_release(tinfo->sock); ++ kfree(tinfo->buf); ++ } ++ kfree(ti); + + /* decrease the module use count */ + ip_vs_use_count_dec(); ++ return retc; + ++err: ++ mutex_unlock(&ipvs->sync_mutex); + return retc; + } + +@@ -2021,7 +2033,6 @@ void ip_vs_sync_net_cleanup(struct netns_ipvs *ipvs) + { + int retc; + +- mutex_lock(&ipvs->sync_mutex); + retc = stop_sync_thread(ipvs, IP_VS_STATE_MASTER); + if (retc && retc != -ESRCH) + pr_err("Failed to stop Master Daemon\n"); +@@ -2029,5 +2040,4 @@ void ip_vs_sync_net_cleanup(struct netns_ipvs *ipvs) + retc = stop_sync_thread(ipvs, IP_VS_STATE_BACKUP); + if (retc && retc != -ESRCH) + pr_err("Failed to stop Backup Daemon\n"); +- mutex_unlock(&ipvs->sync_mutex); + } +diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c +index 7db79c1b8084..1b77444d5b52 100644 +--- a/net/netfilter/nf_conntrack_netlink.c ++++ b/net/netfilter/nf_conntrack_netlink.c +@@ -1256,7 +1256,6 @@ static int ctnetlink_del_conntrack(struct net *net, struct sock *ctnl, + struct nf_conntrack_tuple tuple; + struct nf_conn *ct; + struct nfgenmsg *nfmsg = nlmsg_data(nlh); +- u_int8_t u3 = nfmsg->version ? nfmsg->nfgen_family : AF_UNSPEC; + struct nf_conntrack_zone zone; + int err; + +@@ -1266,11 +1265,13 @@ static int ctnetlink_del_conntrack(struct net *net, struct sock *ctnl, + + if (cda[CTA_TUPLE_ORIG]) + err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_ORIG, +- u3, &zone); ++ nfmsg->nfgen_family, &zone); + else if (cda[CTA_TUPLE_REPLY]) + err = ctnetlink_parse_tuple(cda, &tuple, CTA_TUPLE_REPLY, +- u3, &zone); ++ nfmsg->nfgen_family, &zone); + else { ++ u_int8_t u3 = nfmsg->version ? nfmsg->nfgen_family : AF_UNSPEC; ++ + return ctnetlink_flush_conntrack(net, cda, + NETLINK_CB(skb).portid, + nlmsg_report(nlh), u3); +diff --git a/net/netfilter/nf_conntrack_proto_icmp.c b/net/netfilter/nf_conntrack_proto_icmp.c +index a824367ed518..dd53e2b20f6b 100644 +--- a/net/netfilter/nf_conntrack_proto_icmp.c ++++ b/net/netfilter/nf_conntrack_proto_icmp.c +@@ -218,7 +218,7 @@ int nf_conntrack_icmpv4_error(struct nf_conn *tmpl, + /* See ip_conntrack_proto_tcp.c */ + if (state->net->ct.sysctl_checksum && + state->hook == NF_INET_PRE_ROUTING && +- nf_ip_checksum(skb, state->hook, dataoff, 0)) { ++ nf_ip_checksum(skb, state->hook, dataoff, IPPROTO_ICMP)) { + icmp_error_log(skb, state, "bad hw icmp checksum"); + return -NF_ACCEPT; + } +diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c +index 1e2cc83ff5da..ae1f8c6b3a97 100644 +--- a/net/netfilter/nf_conntrack_proto_tcp.c ++++ b/net/netfilter/nf_conntrack_proto_tcp.c +@@ -472,6 +472,7 @@ static bool tcp_in_window(const struct nf_conn *ct, + struct ip_ct_tcp_state *receiver = &state->seen[!dir]; + const struct nf_conntrack_tuple *tuple = &ct->tuplehash[dir].tuple; + __u32 seq, ack, sack, end, win, swin; ++ u16 win_raw; + s32 receiver_offset; + bool res, in_recv_win; + +@@ -480,7 +481,8 @@ static bool tcp_in_window(const struct nf_conn *ct, + */ + seq = ntohl(tcph->seq); + ack = sack = ntohl(tcph->ack_seq); +- win = ntohs(tcph->window); ++ win_raw = ntohs(tcph->window); ++ win = win_raw; + end = segment_seq_plus_len(seq, skb->len, dataoff, tcph); + + if (receiver->flags & IP_CT_TCP_FLAG_SACK_PERM) +@@ -655,14 +657,14 @@ static bool tcp_in_window(const struct nf_conn *ct, + && state->last_seq == seq + && state->last_ack == ack + && state->last_end == end +- && state->last_win == win) ++ && state->last_win == win_raw) + state->retrans++; + else { + state->last_dir = dir; + state->last_seq = seq; + state->last_ack = ack; + state->last_end = end; +- state->last_win = win; ++ state->last_win = win_raw; + state->retrans = 0; + } + } +diff --git a/net/netfilter/nf_nat_proto.c b/net/netfilter/nf_nat_proto.c +index 07da07788f6b..83a24cc5753b 100644 +--- a/net/netfilter/nf_nat_proto.c ++++ b/net/netfilter/nf_nat_proto.c +@@ -564,7 +564,7 @@ int nf_nat_icmp_reply_translation(struct sk_buff *skb, + + if (!skb_make_writable(skb, hdrlen + sizeof(*inside))) + return 0; +- if (nf_ip_checksum(skb, hooknum, hdrlen, 0)) ++ if (nf_ip_checksum(skb, hooknum, hdrlen, IPPROTO_ICMP)) + return 0; + + inside = (void *)skb->data + hdrlen; +diff --git a/net/netfilter/nf_queue.c b/net/netfilter/nf_queue.c +index b5b2be55ca82..2c440015ff0c 100644 +--- a/net/netfilter/nf_queue.c ++++ b/net/netfilter/nf_queue.c +@@ -190,6 +190,11 @@ static int __nf_queue(struct sk_buff *skb, const struct nf_hook_state *state, + goto err; + } + ++ if (!skb_dst_force(skb) && state->hook != NF_INET_PRE_ROUTING) { ++ status = -ENETDOWN; ++ goto err; ++ } ++ + *entry = (struct nf_queue_entry) { + .skb = skb, + .state = *state, +@@ -198,7 +203,6 @@ static int __nf_queue(struct sk_buff *skb, const struct nf_hook_state *state, + }; + + nf_queue_entry_get_refs(entry); +- skb_dst_force(skb); + + switch (entry->state.pf) { + case AF_INET: +diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c +index 92077d459109..4abbb452cf6c 100644 +--- a/net/netfilter/nfnetlink.c ++++ b/net/netfilter/nfnetlink.c +@@ -578,7 +578,7 @@ static int nfnetlink_bind(struct net *net, int group) + ss = nfnetlink_get_subsys(type << 8); + rcu_read_unlock(); + if (!ss) +- request_module("nfnetlink-subsys-%d", type); ++ request_module_nowait("nfnetlink-subsys-%d", type); + return 0; + } + #endif +diff --git a/net/netfilter/nft_chain_nat.c b/net/netfilter/nft_chain_nat.c +index 2f89bde3c61c..ff9ac8ae0031 100644 +--- a/net/netfilter/nft_chain_nat.c ++++ b/net/netfilter/nft_chain_nat.c +@@ -142,3 +142,6 @@ MODULE_ALIAS_NFT_CHAIN(AF_INET, "nat"); + #ifdef CONFIG_NF_TABLES_IPV6 + MODULE_ALIAS_NFT_CHAIN(AF_INET6, "nat"); + #endif ++#ifdef CONFIG_NF_TABLES_INET ++MODULE_ALIAS_NFT_CHAIN(1, "nat"); /* NFPROTO_INET */ ++#endif +diff --git a/net/netfilter/nft_hash.c b/net/netfilter/nft_hash.c +index fe93e731dc7f..b836d550b919 100644 +--- a/net/netfilter/nft_hash.c ++++ b/net/netfilter/nft_hash.c +@@ -129,7 +129,7 @@ static int nft_symhash_init(const struct nft_ctx *ctx, + priv->dreg = nft_parse_register(tb[NFTA_HASH_DREG]); + + priv->modulus = ntohl(nla_get_be32(tb[NFTA_HASH_MODULUS])); +- if (priv->modulus <= 1) ++ if (priv->modulus < 1) + return -ERANGE; + + if (priv->offset + priv->modulus - 1 < priv->offset) +diff --git a/net/netfilter/nft_redir.c b/net/netfilter/nft_redir.c +index 8487eeff5c0e..43eeb1f609f1 100644 +--- a/net/netfilter/nft_redir.c ++++ b/net/netfilter/nft_redir.c +@@ -291,4 +291,4 @@ module_exit(nft_redir_module_exit); + + MODULE_LICENSE("GPL"); + MODULE_AUTHOR("Arturo Borrero Gonzalez "); +-MODULE_ALIAS_NFT_EXPR("nat"); ++MODULE_ALIAS_NFT_EXPR("redir"); +diff --git a/net/netfilter/utils.c b/net/netfilter/utils.c +index 06dc55590441..51b454d8fa9c 100644 +--- a/net/netfilter/utils.c ++++ b/net/netfilter/utils.c +@@ -17,7 +17,8 @@ __sum16 nf_ip_checksum(struct sk_buff *skb, unsigned int hook, + case CHECKSUM_COMPLETE: + if (hook != NF_INET_PRE_ROUTING && hook != NF_INET_LOCAL_IN) + break; +- if ((protocol == 0 && !csum_fold(skb->csum)) || ++ if ((protocol != IPPROTO_TCP && protocol != IPPROTO_UDP && ++ !csum_fold(skb->csum)) || + !csum_tcpudp_magic(iph->saddr, iph->daddr, + skb->len - dataoff, protocol, + skb->csum)) { +@@ -26,7 +27,7 @@ __sum16 nf_ip_checksum(struct sk_buff *skb, unsigned int hook, + } + /* fall through */ + case CHECKSUM_NONE: +- if (protocol == 0) ++ if (protocol != IPPROTO_TCP && protocol != IPPROTO_UDP) + skb->csum = 0; + else + skb->csum = csum_tcpudp_nofold(iph->saddr, iph->daddr, +diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c +index 86b87925ef34..c4f54ad2b98a 100644 +--- a/net/netrom/af_netrom.c ++++ b/net/netrom/af_netrom.c +@@ -869,7 +869,7 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev) + unsigned short frametype, flags, window, timeout; + int ret; + +- skb->sk = NULL; /* Initially we don't know who it's for */ ++ skb_orphan(skb); + + /* + * skb->data points to the netrom frame start +@@ -967,7 +967,9 @@ int nr_rx_frame(struct sk_buff *skb, struct net_device *dev) + + window = skb->data[20]; + ++ sock_hold(make); + skb->sk = make; ++ skb->destructor = sock_efree; + make->sk_state = TCP_ESTABLISHED; + + /* Fill in his circuit details */ +diff --git a/net/nfc/nci/data.c b/net/nfc/nci/data.c +index 0a0c265baaa4..ce3382be937f 100644 +--- a/net/nfc/nci/data.c ++++ b/net/nfc/nci/data.c +@@ -107,7 +107,7 @@ static int nci_queue_tx_data_frags(struct nci_dev *ndev, + conn_info = nci_get_conn_info_by_conn_id(ndev, conn_id); + if (!conn_info) { + rc = -EPROTO; +- goto free_exit; ++ goto exit; + } + + __skb_queue_head_init(&frags_q); +diff --git a/net/openvswitch/actions.c b/net/openvswitch/actions.c +index 151518dbabad..bd131469e4ca 100644 +--- a/net/openvswitch/actions.c ++++ b/net/openvswitch/actions.c +@@ -166,8 +166,7 @@ static void update_ethertype(struct sk_buff *skb, struct ethhdr *hdr, + if (skb->ip_summed == CHECKSUM_COMPLETE) { + __be16 diff[] = { ~(hdr->h_proto), ethertype }; + +- skb->csum = ~csum_partial((char *)diff, sizeof(diff), +- ~skb->csum); ++ skb->csum = csum_partial((char *)diff, sizeof(diff), skb->csum); + } + + hdr->h_proto = ethertype; +@@ -259,8 +258,7 @@ static int set_mpls(struct sk_buff *skb, struct sw_flow_key *flow_key, + if (skb->ip_summed == CHECKSUM_COMPLETE) { + __be32 diff[] = { ~(stack->label_stack_entry), lse }; + +- skb->csum = ~csum_partial((char *)diff, sizeof(diff), +- ~skb->csum); ++ skb->csum = csum_partial((char *)diff, sizeof(diff), skb->csum); + } + + stack->label_stack_entry = lse; +diff --git a/net/rds/rdma_transport.c b/net/rds/rdma_transport.c +index 46bce8389066..9db455d02255 100644 +--- a/net/rds/rdma_transport.c ++++ b/net/rds/rdma_transport.c +@@ -112,7 +112,9 @@ static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id, + if (!conn) + break; + err = (int *)rdma_consumer_reject_data(cm_id, event, &len); +- if (!err || (err && ((*err) == RDS_RDMA_REJ_INCOMPAT))) { ++ if (!err || ++ (err && len >= sizeof(*err) && ++ ((*err) <= RDS_RDMA_REJ_INCOMPAT))) { + pr_warn("RDS/RDMA: conn <%pI6c, %pI6c> rejected, dropping connection\n", + &conn->c_laddr, &conn->c_faddr); + conn->c_proposed_version = RDS_PROTOCOL_COMPAT_VERSION; +@@ -122,7 +124,6 @@ static int rds_rdma_cm_event_handler_cmn(struct rdma_cm_id *cm_id, + rdsdebug("Connection rejected: %s\n", + rdma_reject_msg(cm_id, event->status)); + break; +- /* FALLTHROUGH */ + case RDMA_CM_EVENT_ADDR_ERROR: + case RDMA_CM_EVENT_ROUTE_ERROR: + case RDMA_CM_EVENT_CONNECT_ERROR: +diff --git a/net/rxrpc/af_rxrpc.c b/net/rxrpc/af_rxrpc.c +index f9f4721cdfa7..d09eaf153544 100644 +--- a/net/rxrpc/af_rxrpc.c ++++ b/net/rxrpc/af_rxrpc.c +@@ -545,6 +545,7 @@ static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len) + + switch (rx->sk.sk_state) { + case RXRPC_UNBOUND: ++ case RXRPC_CLIENT_UNBOUND: + rx->srx.srx_family = AF_RXRPC; + rx->srx.srx_service = 0; + rx->srx.transport_type = SOCK_DGRAM; +@@ -569,10 +570,9 @@ static int rxrpc_sendmsg(struct socket *sock, struct msghdr *m, size_t len) + } + + rx->local = local; +- rx->sk.sk_state = RXRPC_CLIENT_UNBOUND; ++ rx->sk.sk_state = RXRPC_CLIENT_BOUND; + /* Fall through */ + +- case RXRPC_CLIENT_UNBOUND: + case RXRPC_CLIENT_BOUND: + if (!m->msg_name && + test_bit(RXRPC_SOCK_CONNECTED, &rx->flags)) { +diff --git a/net/sched/act_bpf.c b/net/sched/act_bpf.c +index 8126b26f125e..fd1f7e799e23 100644 +--- a/net/sched/act_bpf.c ++++ b/net/sched/act_bpf.c +@@ -285,6 +285,7 @@ static int tcf_bpf_init(struct net *net, struct nlattr *nla, + struct tcf_bpf *prog; + bool is_bpf, is_ebpf; + int ret, res = 0; ++ u32 index; + + if (!nla) + return -EINVAL; +@@ -298,13 +299,13 @@ static int tcf_bpf_init(struct net *net, struct nlattr *nla, + return -EINVAL; + + parm = nla_data(tb[TCA_ACT_BPF_PARMS]); +- +- ret = tcf_idr_check_alloc(tn, &parm->index, act, bind); ++ index = parm->index; ++ ret = tcf_idr_check_alloc(tn, &index, act, bind); + if (!ret) { +- ret = tcf_idr_create(tn, parm->index, est, act, ++ ret = tcf_idr_create(tn, index, est, act, + &act_bpf_ops, bind, true); + if (ret < 0) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + +diff --git a/net/sched/act_connmark.c b/net/sched/act_connmark.c +index ce36b0f7e1dc..32ac04d77a45 100644 +--- a/net/sched/act_connmark.c ++++ b/net/sched/act_connmark.c +@@ -103,6 +103,7 @@ static int tcf_connmark_init(struct net *net, struct nlattr *nla, + struct tcf_connmark_info *ci; + struct tc_connmark *parm; + int ret = 0, err; ++ u32 index; + + if (!nla) + return -EINVAL; +@@ -116,13 +117,13 @@ static int tcf_connmark_init(struct net *net, struct nlattr *nla, + return -EINVAL; + + parm = nla_data(tb[TCA_CONNMARK_PARMS]); +- +- ret = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ ret = tcf_idr_check_alloc(tn, &index, a, bind); + if (!ret) { +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_connmark_ops, bind, false); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + +diff --git a/net/sched/act_csum.c b/net/sched/act_csum.c +index 621fb22ce2a9..9b9288267a54 100644 +--- a/net/sched/act_csum.c ++++ b/net/sched/act_csum.c +@@ -52,6 +52,7 @@ static int tcf_csum_init(struct net *net, struct nlattr *nla, + struct tc_csum *parm; + struct tcf_csum *p; + int ret = 0, err; ++ u32 index; + + if (nla == NULL) + return -EINVAL; +@@ -64,13 +65,13 @@ static int tcf_csum_init(struct net *net, struct nlattr *nla, + if (tb[TCA_CSUM_PARMS] == NULL) + return -EINVAL; + parm = nla_data(tb[TCA_CSUM_PARMS]); +- +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (!err) { +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_csum_ops, bind, true); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + ret = ACT_P_CREATED; +diff --git a/net/sched/act_gact.c b/net/sched/act_gact.c +index b2380c5284e6..8f0140c6ca58 100644 +--- a/net/sched/act_gact.c ++++ b/net/sched/act_gact.c +@@ -61,6 +61,7 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla, + struct tc_gact *parm; + struct tcf_gact *gact; + int ret = 0; ++ u32 index; + int err; + #ifdef CONFIG_GACT_PROB + struct tc_gact_p *p_parm = NULL; +@@ -77,6 +78,7 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla, + if (tb[TCA_GACT_PARMS] == NULL) + return -EINVAL; + parm = nla_data(tb[TCA_GACT_PARMS]); ++ index = parm->index; + + #ifndef CONFIG_GACT_PROB + if (tb[TCA_GACT_PROB] != NULL) +@@ -94,12 +96,12 @@ static int tcf_gact_init(struct net *net, struct nlattr *nla, + } + #endif + +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (!err) { +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_gact_ops, bind, true); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + ret = ACT_P_CREATED; +diff --git a/net/sched/act_ife.c b/net/sched/act_ife.c +index 41d5398dd2f2..92ee853d43e6 100644 +--- a/net/sched/act_ife.c ++++ b/net/sched/act_ife.c +@@ -479,8 +479,14 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla, + u8 *saddr = NULL; + bool exists = false; + int ret = 0; ++ u32 index; + int err; + ++ if (!nla) { ++ NL_SET_ERR_MSG_MOD(extack, "IFE requires attributes to be passed"); ++ return -EINVAL; ++ } ++ + err = nla_parse_nested_deprecated(tb, TCA_IFE_MAX, nla, ife_policy, + NULL); + if (err < 0) +@@ -502,7 +508,8 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla, + if (!p) + return -ENOMEM; + +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (err < 0) { + kfree(p); + return err; +@@ -514,10 +521,10 @@ static int tcf_ife_init(struct net *net, struct nlattr *nla, + } + + if (!exists) { +- ret = tcf_idr_create(tn, parm->index, est, a, &act_ife_ops, ++ ret = tcf_idr_create(tn, index, est, a, &act_ife_ops, + bind, true); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + kfree(p); + return ret; + } +diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c +index 58e7573dded4..d10dca7a13e1 100644 +--- a/net/sched/act_mirred.c ++++ b/net/sched/act_mirred.c +@@ -101,6 +101,7 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla, + struct net_device *dev; + bool exists = false; + int ret, err; ++ u32 index; + + if (!nla) { + NL_SET_ERR_MSG_MOD(extack, "Mirred requires attributes to be passed"); +@@ -115,8 +116,8 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla, + return -EINVAL; + } + parm = nla_data(tb[TCA_MIRRED_PARMS]); +- +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (err < 0) + return err; + exists = err; +@@ -133,21 +134,21 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla, + if (exists) + tcf_idr_release(*a, bind); + else +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + NL_SET_ERR_MSG_MOD(extack, "Unknown mirred option"); + return -EINVAL; + } + + if (!exists) { + if (!parm->ifindex) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + NL_SET_ERR_MSG_MOD(extack, "Specified device does not exist"); + return -EINVAL; + } +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_mirred_ops, bind, true); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + ret = ACT_P_CREATED; +diff --git a/net/sched/act_nat.c b/net/sched/act_nat.c +index 45923ebb7a4f..7b858c11b1b5 100644 +--- a/net/sched/act_nat.c ++++ b/net/sched/act_nat.c +@@ -44,6 +44,7 @@ static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est, + struct tc_nat *parm; + int ret = 0, err; + struct tcf_nat *p; ++ u32 index; + + if (nla == NULL) + return -EINVAL; +@@ -56,13 +57,13 @@ static int tcf_nat_init(struct net *net, struct nlattr *nla, struct nlattr *est, + if (tb[TCA_NAT_PARMS] == NULL) + return -EINVAL; + parm = nla_data(tb[TCA_NAT_PARMS]); +- +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (!err) { +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_nat_ops, bind, false); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + ret = ACT_P_CREATED; +diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c +index 45e9d6bfddb3..17360c6faeaa 100644 +--- a/net/sched/act_pedit.c ++++ b/net/sched/act_pedit.c +@@ -149,6 +149,7 @@ static int tcf_pedit_init(struct net *net, struct nlattr *nla, + struct tcf_pedit *p; + int ret = 0, err; + int ksize; ++ u32 index; + + if (!nla) { + NL_SET_ERR_MSG_MOD(extack, "Pedit requires attributes to be passed"); +@@ -179,18 +180,19 @@ static int tcf_pedit_init(struct net *net, struct nlattr *nla, + if (IS_ERR(keys_ex)) + return PTR_ERR(keys_ex); + +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (!err) { + if (!parm->nkeys) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + NL_SET_ERR_MSG_MOD(extack, "Pedit requires keys to be passed"); + ret = -EINVAL; + goto out_free; + } +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_pedit_ops, bind, false); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + goto out_free; + } + ret = ACT_P_CREATED; +diff --git a/net/sched/act_police.c b/net/sched/act_police.c +index a065f62fa79c..49cec3e64a4d 100644 +--- a/net/sched/act_police.c ++++ b/net/sched/act_police.c +@@ -57,6 +57,7 @@ static int tcf_police_init(struct net *net, struct nlattr *nla, + struct tc_action_net *tn = net_generic(net, police_net_id); + struct tcf_police_params *new; + bool exists = false; ++ u32 index; + + if (nla == NULL) + return -EINVAL; +@@ -73,7 +74,8 @@ static int tcf_police_init(struct net *net, struct nlattr *nla, + return -EINVAL; + + parm = nla_data(tb[TCA_POLICE_TBF]); +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (err < 0) + return err; + exists = err; +@@ -81,10 +83,10 @@ static int tcf_police_init(struct net *net, struct nlattr *nla, + return 0; + + if (!exists) { +- ret = tcf_idr_create(tn, parm->index, NULL, a, ++ ret = tcf_idr_create(tn, index, NULL, a, + &act_police_ops, bind, true); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + ret = ACT_P_CREATED; +diff --git a/net/sched/act_sample.c b/net/sched/act_sample.c +index 274d7a0c0e25..595308d60133 100644 +--- a/net/sched/act_sample.c ++++ b/net/sched/act_sample.c +@@ -41,8 +41,8 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, + struct tc_action_net *tn = net_generic(net, sample_net_id); + struct nlattr *tb[TCA_SAMPLE_MAX + 1]; + struct psample_group *psample_group; ++ u32 psample_group_num, rate, index; + struct tcf_chain *goto_ch = NULL; +- u32 psample_group_num, rate; + struct tc_sample *parm; + struct tcf_sample *s; + bool exists = false; +@@ -59,8 +59,8 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, + return -EINVAL; + + parm = nla_data(tb[TCA_SAMPLE_PARMS]); +- +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (err < 0) + return err; + exists = err; +@@ -68,10 +68,10 @@ static int tcf_sample_init(struct net *net, struct nlattr *nla, + return 0; + + if (!exists) { +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_sample_ops, bind, true); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + ret = ACT_P_CREATED; +diff --git a/net/sched/act_simple.c b/net/sched/act_simple.c +index f28ddbabff76..33aefa25b545 100644 +--- a/net/sched/act_simple.c ++++ b/net/sched/act_simple.c +@@ -95,6 +95,7 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla, + struct tcf_defact *d; + bool exists = false; + int ret = 0, err; ++ u32 index; + + if (nla == NULL) + return -EINVAL; +@@ -108,7 +109,8 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla, + return -EINVAL; + + parm = nla_data(tb[TCA_DEF_PARMS]); +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (err < 0) + return err; + exists = err; +@@ -119,15 +121,15 @@ static int tcf_simp_init(struct net *net, struct nlattr *nla, + if (exists) + tcf_idr_release(*a, bind); + else +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return -EINVAL; + } + + if (!exists) { +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_simp_ops, bind, false); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + +diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c +index 215a06705cef..b100870f02a6 100644 +--- a/net/sched/act_skbedit.c ++++ b/net/sched/act_skbedit.c +@@ -99,6 +99,7 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla, + u16 *queue_mapping = NULL, *ptype = NULL; + bool exists = false; + int ret = 0, err; ++ u32 index; + + if (nla == NULL) + return -EINVAL; +@@ -146,8 +147,8 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla, + } + + parm = nla_data(tb[TCA_SKBEDIT_PARMS]); +- +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (err < 0) + return err; + exists = err; +@@ -158,15 +159,15 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla, + if (exists) + tcf_idr_release(*a, bind); + else +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return -EINVAL; + } + + if (!exists) { +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_skbedit_ops, bind, true); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + +diff --git a/net/sched/act_skbmod.c b/net/sched/act_skbmod.c +index 4f07706eff07..7da3518e18ef 100644 +--- a/net/sched/act_skbmod.c ++++ b/net/sched/act_skbmod.c +@@ -87,12 +87,12 @@ static int tcf_skbmod_init(struct net *net, struct nlattr *nla, + struct tcf_skbmod_params *p, *p_old; + struct tcf_chain *goto_ch = NULL; + struct tc_skbmod *parm; ++ u32 lflags = 0, index; + struct tcf_skbmod *d; + bool exists = false; + u8 *daddr = NULL; + u8 *saddr = NULL; + u16 eth_type = 0; +- u32 lflags = 0; + int ret = 0, err; + + if (!nla) +@@ -122,10 +122,11 @@ static int tcf_skbmod_init(struct net *net, struct nlattr *nla, + } + + parm = nla_data(tb[TCA_SKBMOD_PARMS]); ++ index = parm->index; + if (parm->flags & SKBMOD_F_SWAPMAC) + lflags = SKBMOD_F_SWAPMAC; + +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (err < 0) + return err; + exists = err; +@@ -136,15 +137,15 @@ static int tcf_skbmod_init(struct net *net, struct nlattr *nla, + if (exists) + tcf_idr_release(*a, bind); + else +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return -EINVAL; + } + + if (!exists) { +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_skbmod_ops, bind, true); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + +diff --git a/net/sched/act_tunnel_key.c b/net/sched/act_tunnel_key.c +index 10dffda1d5cc..6d0debdc9b97 100644 +--- a/net/sched/act_tunnel_key.c ++++ b/net/sched/act_tunnel_key.c +@@ -225,6 +225,7 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, + __be16 flags = 0; + u8 tos, ttl; + int ret = 0; ++ u32 index; + int err; + + if (!nla) { +@@ -245,7 +246,8 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, + } + + parm = nla_data(tb[TCA_TUNNEL_KEY_PARMS]); +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (err < 0) + return err; + exists = err; +@@ -345,7 +347,7 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, + } + + if (!exists) { +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_tunnel_key_ops, bind, true); + if (ret) { + NL_SET_ERR_MSG(extack, "Cannot create TC IDR"); +@@ -403,7 +405,7 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla, + if (exists) + tcf_idr_release(*a, bind); + else +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + +diff --git a/net/sched/act_vlan.c b/net/sched/act_vlan.c +index 9269d350fb8a..a3c9eea1ee8a 100644 +--- a/net/sched/act_vlan.c ++++ b/net/sched/act_vlan.c +@@ -116,6 +116,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, + u8 push_prio = 0; + bool exists = false; + int ret = 0, err; ++ u32 index; + + if (!nla) + return -EINVAL; +@@ -128,7 +129,8 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, + if (!tb[TCA_VLAN_PARMS]) + return -EINVAL; + parm = nla_data(tb[TCA_VLAN_PARMS]); +- err = tcf_idr_check_alloc(tn, &parm->index, a, bind); ++ index = parm->index; ++ err = tcf_idr_check_alloc(tn, &index, a, bind); + if (err < 0) + return err; + exists = err; +@@ -144,7 +146,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, + if (exists) + tcf_idr_release(*a, bind); + else +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return -EINVAL; + } + push_vid = nla_get_u16(tb[TCA_VLAN_PUSH_VLAN_ID]); +@@ -152,7 +154,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, + if (exists) + tcf_idr_release(*a, bind); + else +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return -ERANGE; + } + +@@ -166,7 +168,7 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, + if (exists) + tcf_idr_release(*a, bind); + else +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return -EPROTONOSUPPORT; + } + } else { +@@ -180,16 +182,16 @@ static int tcf_vlan_init(struct net *net, struct nlattr *nla, + if (exists) + tcf_idr_release(*a, bind); + else +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return -EINVAL; + } + action = parm->v_action; + + if (!exists) { +- ret = tcf_idr_create(tn, parm->index, est, a, ++ ret = tcf_idr_create(tn, index, est, a, + &act_vlan_ops, bind, true); + if (ret) { +- tcf_idr_cleanup(tn, parm->index); ++ tcf_idr_cleanup(tn, index); + return ret; + } + +@@ -306,6 +308,14 @@ static int tcf_vlan_search(struct net *net, struct tc_action **a, u32 index) + return tcf_idr_search(tn, a, index); + } + ++static size_t tcf_vlan_get_fill_size(const struct tc_action *act) ++{ ++ return nla_total_size(sizeof(struct tc_vlan)) ++ + nla_total_size(sizeof(u16)) /* TCA_VLAN_PUSH_VLAN_ID */ ++ + nla_total_size(sizeof(u16)) /* TCA_VLAN_PUSH_VLAN_PROTOCOL */ ++ + nla_total_size(sizeof(u8)); /* TCA_VLAN_PUSH_VLAN_PRIORITY */ ++} ++ + static struct tc_action_ops act_vlan_ops = { + .kind = "vlan", + .id = TCA_ID_VLAN, +@@ -315,6 +325,7 @@ static struct tc_action_ops act_vlan_ops = { + .init = tcf_vlan_init, + .cleanup = tcf_vlan_cleanup, + .walk = tcf_vlan_walker, ++ .get_fill_size = tcf_vlan_get_fill_size, + .lookup = tcf_vlan_search, + .size = sizeof(struct tcf_vlan), + }; +diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c +index ad36bbcc583e..b67c456f26aa 100644 +--- a/net/sched/cls_api.c ++++ b/net/sched/cls_api.c +@@ -2160,6 +2160,9 @@ static int tc_new_tfilter(struct sk_buff *skb, struct nlmsghdr *n, + tfilter_notify(net, skb, n, tp, block, q, parent, fh, + RTM_NEWTFILTER, false, rtnl_held); + tfilter_put(tp, fh); ++ /* q pointer is NULL for shared blocks */ ++ if (q) ++ q->flags &= ~TCQ_F_CAN_BYPASS; + } + + errout: +diff --git a/net/sched/sch_codel.c b/net/sched/sch_codel.c +index 25ef172c23df..30169b3adbbb 100644 +--- a/net/sched/sch_codel.c ++++ b/net/sched/sch_codel.c +@@ -71,10 +71,10 @@ static struct sk_buff *dequeue_func(struct codel_vars *vars, void *ctx) + struct Qdisc *sch = ctx; + struct sk_buff *skb = __qdisc_dequeue_head(&sch->q); + +- if (skb) ++ if (skb) { + sch->qstats.backlog -= qdisc_pkt_len(skb); +- +- prefetch(&skb->end); /* we'll need skb_shinfo() */ ++ prefetch(&skb->end); /* we'll need skb_shinfo() */ ++ } + return skb; + } + +diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c +index e2faf33d282b..d59fbcc745d1 100644 +--- a/net/sched/sch_fq_codel.c ++++ b/net/sched/sch_fq_codel.c +@@ -596,8 +596,6 @@ static unsigned long fq_codel_find(struct Qdisc *sch, u32 classid) + static unsigned long fq_codel_bind(struct Qdisc *sch, unsigned long parent, + u32 classid) + { +- /* we cannot bypass queue discipline anymore */ +- sch->flags &= ~TCQ_F_CAN_BYPASS; + return 0; + } + +diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c +index 420bd8411677..68404a9d2ce4 100644 +--- a/net/sched/sch_sfq.c ++++ b/net/sched/sch_sfq.c +@@ -824,8 +824,6 @@ static unsigned long sfq_find(struct Qdisc *sch, u32 classid) + static unsigned long sfq_bind(struct Qdisc *sch, unsigned long parent, + u32 classid) + { +- /* we cannot bypass queue discipline anymore */ +- sch->flags &= ~TCQ_F_CAN_BYPASS; + return 0; + } + +diff --git a/net/sctp/socket.c b/net/sctp/socket.c +index 39ea0a37af09..f33aa9ee9e27 100644 +--- a/net/sctp/socket.c ++++ b/net/sctp/socket.c +@@ -4816,35 +4816,17 @@ static int sctp_setsockopt(struct sock *sk, int level, int optname, + static int sctp_connect(struct sock *sk, struct sockaddr *addr, + int addr_len, int flags) + { +- struct inet_sock *inet = inet_sk(sk); + struct sctp_af *af; +- int err = 0; ++ int err = -EINVAL; + + lock_sock(sk); +- + pr_debug("%s: sk:%p, sockaddr:%p, addr_len:%d\n", __func__, sk, + addr, addr_len); + +- /* We may need to bind the socket. */ +- if (!inet->inet_num) { +- if (sk->sk_prot->get_port(sk, 0)) { +- release_sock(sk); +- return -EAGAIN; +- } +- inet->inet_sport = htons(inet->inet_num); +- } +- + /* Validate addr_len before calling common connect/connectx routine. */ +- af = addr_len < offsetofend(struct sockaddr, sa_family) ? NULL : +- sctp_get_af_specific(addr->sa_family); +- if (!af || addr_len < af->sockaddr_len) { +- err = -EINVAL; +- } else { +- /* Pass correct addr len to common routine (so it knows there +- * is only one address being passed. +- */ ++ af = sctp_get_af_specific(addr->sa_family); ++ if (af && addr_len >= af->sockaddr_len) + err = __sctp_connect(sk, addr, af->sockaddr_len, flags, NULL); +- } + + release_sock(sk); + return err; +diff --git a/net/sctp/stream.c b/net/sctp/stream.c +index 93ed07877337..25946604af85 100644 +--- a/net/sctp/stream.c ++++ b/net/sctp/stream.c +@@ -153,13 +153,20 @@ int sctp_stream_init(struct sctp_stream *stream, __u16 outcnt, __u16 incnt, + int sctp_stream_init_ext(struct sctp_stream *stream, __u16 sid) + { + struct sctp_stream_out_ext *soute; ++ int ret; + + soute = kzalloc(sizeof(*soute), GFP_KERNEL); + if (!soute) + return -ENOMEM; + SCTP_SO(stream, sid)->ext = soute; + +- return sctp_sched_init_sid(stream, sid, GFP_KERNEL); ++ ret = sctp_sched_init_sid(stream, sid, GFP_KERNEL); ++ if (ret) { ++ kfree(SCTP_SO(stream, sid)->ext); ++ SCTP_SO(stream, sid)->ext = NULL; ++ } ++ ++ return ret; + } + + void sctp_stream_free(struct sctp_stream *stream) +diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c +index 7621ec2f539c..a3cc879d2589 100644 +--- a/net/smc/af_smc.c ++++ b/net/smc/af_smc.c +@@ -253,7 +253,7 @@ static int smc_bind(struct socket *sock, struct sockaddr *uaddr, + + /* Check if socket is already active */ + rc = -EINVAL; +- if (sk->sk_state != SMC_INIT) ++ if (sk->sk_state != SMC_INIT || smc->connect_nonblock) + goto out_rel; + + smc->clcsock->sk->sk_reuse = sk->sk_reuse; +@@ -1399,7 +1399,8 @@ static int smc_listen(struct socket *sock, int backlog) + lock_sock(sk); + + rc = -EINVAL; +- if ((sk->sk_state != SMC_INIT) && (sk->sk_state != SMC_LISTEN)) ++ if ((sk->sk_state != SMC_INIT && sk->sk_state != SMC_LISTEN) || ++ smc->connect_nonblock) + goto out; + + rc = 0; +@@ -1527,7 +1528,7 @@ static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) + goto out; + + if (msg->msg_flags & MSG_FASTOPEN) { +- if (sk->sk_state == SMC_INIT) { ++ if (sk->sk_state == SMC_INIT && !smc->connect_nonblock) { + smc_switch_to_fallback(smc); + smc->fallback_rsn = SMC_CLC_DECL_OPTUNSUPP; + } else { +@@ -1741,14 +1742,18 @@ static int smc_setsockopt(struct socket *sock, int level, int optname, + } + break; + case TCP_NODELAY: +- if (sk->sk_state != SMC_INIT && sk->sk_state != SMC_LISTEN) { ++ if (sk->sk_state != SMC_INIT && ++ sk->sk_state != SMC_LISTEN && ++ sk->sk_state != SMC_CLOSED) { + if (val && !smc->use_fallback) + mod_delayed_work(system_wq, &smc->conn.tx_work, + 0); + } + break; + case TCP_CORK: +- if (sk->sk_state != SMC_INIT && sk->sk_state != SMC_LISTEN) { ++ if (sk->sk_state != SMC_INIT && ++ sk->sk_state != SMC_LISTEN && ++ sk->sk_state != SMC_CLOSED) { + if (!val && !smc->use_fallback) + mod_delayed_work(system_wq, &smc->conn.tx_work, + 0); +diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c +index b03bfa055c08..9e1743b364ec 100644 +--- a/net/sunrpc/clnt.c ++++ b/net/sunrpc/clnt.c +@@ -1788,6 +1788,7 @@ rpc_xdr_encode(struct rpc_task *task) + req->rq_snd_buf.head[0].iov_len = 0; + xdr_init_encode(&xdr, &req->rq_snd_buf, + req->rq_snd_buf.head[0].iov_base, req); ++ xdr_free_bvec(&req->rq_snd_buf); + if (rpc_encode_header(task, &xdr)) + return; + +@@ -1827,8 +1828,6 @@ call_encode(struct rpc_task *task) + rpc_call_rpcerror(task, task->tk_status); + } + return; +- } else { +- xprt_request_prepare(task->tk_rqstp); + } + + /* Add task to reply queue before transmission to avoid races */ +diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c +index f6c82b1651e7..5ddd34ad64b9 100644 +--- a/net/sunrpc/xprt.c ++++ b/net/sunrpc/xprt.c +@@ -1013,6 +1013,8 @@ xprt_request_enqueue_receive(struct rpc_task *task) + + if (!xprt_request_need_enqueue_receive(task, req)) + return; ++ ++ xprt_request_prepare(task->tk_rqstp); + spin_lock(&xprt->queue_lock); + + /* Update the softirq receive buffer */ +diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c +index 36652352a38c..85166c552542 100644 +--- a/net/sunrpc/xprtsock.c ++++ b/net/sunrpc/xprtsock.c +@@ -909,6 +909,7 @@ static int xs_nospace(struct rpc_rqst *req) + static void + xs_stream_prepare_request(struct rpc_rqst *req) + { ++ xdr_free_bvec(&req->rq_rcv_buf); + req->rq_task->tk_status = xdr_alloc_bvec(&req->rq_rcv_buf, GFP_KERNEL); + } + +diff --git a/net/tipc/netlink_compat.c b/net/tipc/netlink_compat.c +index cf155061c472..acd8a72169c1 100644 +--- a/net/tipc/netlink_compat.c ++++ b/net/tipc/netlink_compat.c +@@ -55,6 +55,7 @@ struct tipc_nl_compat_msg { + int rep_type; + int rep_size; + int req_type; ++ int req_size; + struct net *net; + struct sk_buff *rep; + struct tlv_desc *req; +@@ -257,7 +258,8 @@ static int tipc_nl_compat_dumpit(struct tipc_nl_compat_cmd_dump *cmd, + int err; + struct sk_buff *arg; + +- if (msg->req_type && !TLV_CHECK_TYPE(msg->req, msg->req_type)) ++ if (msg->req_type && (!msg->req_size || ++ !TLV_CHECK_TYPE(msg->req, msg->req_type))) + return -EINVAL; + + msg->rep = tipc_tlv_alloc(msg->rep_size); +@@ -354,7 +356,8 @@ static int tipc_nl_compat_doit(struct tipc_nl_compat_cmd_doit *cmd, + { + int err; + +- if (msg->req_type && !TLV_CHECK_TYPE(msg->req, msg->req_type)) ++ if (msg->req_type && (!msg->req_size || ++ !TLV_CHECK_TYPE(msg->req, msg->req_type))) + return -EINVAL; + + err = __tipc_nl_compat_doit(cmd, msg); +@@ -1288,8 +1291,8 @@ static int tipc_nl_compat_recv(struct sk_buff *skb, struct genl_info *info) + goto send; + } + +- len = nlmsg_attrlen(req_nlh, GENL_HDRLEN + TIPC_GENL_HDRLEN); +- if (!len || !TLV_OK(msg.req, len)) { ++ msg.req_size = nlmsg_attrlen(req_nlh, GENL_HDRLEN + TIPC_GENL_HDRLEN); ++ if (msg.req_size && !TLV_OK(msg.req, msg.req_size)) { + msg.rep = tipc_get_err_tlv(TIPC_CFG_NOT_SUPPORTED); + err = -EOPNOTSUPP; + goto send; +diff --git a/net/tipc/socket.c b/net/tipc/socket.c +index dd8537f988c4..83ae41d7e554 100644 +--- a/net/tipc/socket.c ++++ b/net/tipc/socket.c +@@ -485,9 +485,8 @@ static int tipc_sk_create(struct net *net, struct socket *sock, + tsk_set_unreturnable(tsk, true); + if (sock->type == SOCK_DGRAM) + tsk_set_unreliable(tsk, true); +- __skb_queue_head_init(&tsk->mc_method.deferredq); + } +- ++ __skb_queue_head_init(&tsk->mc_method.deferredq); + trace_tipc_sk_create(sk, NULL, TIPC_DUMP_NONE, " "); + return 0; + } +diff --git a/net/tls/tls_device.c b/net/tls/tls_device.c +index 1f9cf57d9754..eb8f24f420f0 100644 +--- a/net/tls/tls_device.c ++++ b/net/tls/tls_device.c +@@ -61,7 +61,7 @@ static void tls_device_free_ctx(struct tls_context *ctx) + if (ctx->rx_conf == TLS_HW) + kfree(tls_offload_ctx_rx(ctx)); + +- kfree(ctx); ++ tls_ctx_free(ctx); + } + + static void tls_device_gc_task(struct work_struct *work) +@@ -742,6 +742,11 @@ int tls_set_device_offload(struct sock *sk, struct tls_context *ctx) + } + + crypto_info = &ctx->crypto_send.info; ++ if (crypto_info->version != TLS_1_2_VERSION) { ++ rc = -EOPNOTSUPP; ++ goto free_offload_ctx; ++ } ++ + switch (crypto_info->cipher_type) { + case TLS_CIPHER_AES_GCM_128: + nonce_size = TLS_CIPHER_AES_GCM_128_IV_SIZE; +@@ -876,6 +881,9 @@ int tls_set_device_offload_rx(struct sock *sk, struct tls_context *ctx) + struct net_device *netdev; + int rc = 0; + ++ if (ctx->crypto_recv.info.version != TLS_1_2_VERSION) ++ return -EOPNOTSUPP; ++ + /* We support starting offload on multiple sockets + * concurrently, so we only need a read lock here. + * This lock must precede get_netdev_for_sock to prevent races between +diff --git a/net/tls/tls_main.c b/net/tls/tls_main.c +index e2b69e805d46..4674e57e66b0 100644 +--- a/net/tls/tls_main.c ++++ b/net/tls/tls_main.c +@@ -251,7 +251,7 @@ static void tls_write_space(struct sock *sk) + ctx->sk_write_space(sk); + } + +-static void tls_ctx_free(struct tls_context *ctx) ++void tls_ctx_free(struct tls_context *ctx) + { + if (!ctx) + return; +@@ -643,7 +643,7 @@ static void tls_hw_sk_destruct(struct sock *sk) + + ctx->sk_destruct(sk); + /* Free ctx */ +- kfree(ctx); ++ tls_ctx_free(ctx); + icsk->icsk_ulp_data = NULL; + } + +diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c +index 455a782c7658..e2385183526e 100644 +--- a/net/tls/tls_sw.c ++++ b/net/tls/tls_sw.c +@@ -1958,7 +1958,8 @@ bool tls_sw_stream_read(const struct sock *sk) + ingress_empty = list_empty(&psock->ingress_msg); + rcu_read_unlock(); + +- return !ingress_empty || ctx->recv_pkt; ++ return !ingress_empty || ctx->recv_pkt || ++ !skb_queue_empty(&ctx->rx_list); + } + + static int tls_read_size(struct strparser *strp, struct sk_buff *skb) +diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c +index 169112f8aa1e..ab47bf3ab66e 100644 +--- a/net/vmw_vsock/af_vsock.c ++++ b/net/vmw_vsock/af_vsock.c +@@ -274,7 +274,8 @@ EXPORT_SYMBOL_GPL(vsock_insert_connected); + void vsock_remove_bound(struct vsock_sock *vsk) + { + spin_lock_bh(&vsock_table_lock); +- __vsock_remove_bound(vsk); ++ if (__vsock_in_bound_table(vsk)) ++ __vsock_remove_bound(vsk); + spin_unlock_bh(&vsock_table_lock); + } + EXPORT_SYMBOL_GPL(vsock_remove_bound); +@@ -282,7 +283,8 @@ EXPORT_SYMBOL_GPL(vsock_remove_bound); + void vsock_remove_connected(struct vsock_sock *vsk) + { + spin_lock_bh(&vsock_table_lock); +- __vsock_remove_connected(vsk); ++ if (__vsock_in_connected_table(vsk)) ++ __vsock_remove_connected(vsk); + spin_unlock_bh(&vsock_table_lock); + } + EXPORT_SYMBOL_GPL(vsock_remove_connected); +@@ -318,35 +320,10 @@ struct sock *vsock_find_connected_socket(struct sockaddr_vm *src, + } + EXPORT_SYMBOL_GPL(vsock_find_connected_socket); + +-static bool vsock_in_bound_table(struct vsock_sock *vsk) +-{ +- bool ret; +- +- spin_lock_bh(&vsock_table_lock); +- ret = __vsock_in_bound_table(vsk); +- spin_unlock_bh(&vsock_table_lock); +- +- return ret; +-} +- +-static bool vsock_in_connected_table(struct vsock_sock *vsk) +-{ +- bool ret; +- +- spin_lock_bh(&vsock_table_lock); +- ret = __vsock_in_connected_table(vsk); +- spin_unlock_bh(&vsock_table_lock); +- +- return ret; +-} +- + void vsock_remove_sock(struct vsock_sock *vsk) + { +- if (vsock_in_bound_table(vsk)) +- vsock_remove_bound(vsk); +- +- if (vsock_in_connected_table(vsk)) +- vsock_remove_connected(vsk); ++ vsock_remove_bound(vsk); ++ vsock_remove_connected(vsk); + } + EXPORT_SYMBOL_GPL(vsock_remove_sock); + +@@ -477,8 +454,7 @@ static void vsock_pending_work(struct work_struct *work) + * incoming packets can't find this socket, and to reduce the reference + * count. + */ +- if (vsock_in_connected_table(vsk)) +- vsock_remove_connected(vsk); ++ vsock_remove_connected(vsk); + + sk->sk_state = TCP_CLOSE; + +diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c +index 62dcdf082349..6c81a911fc02 100644 +--- a/net/vmw_vsock/hyperv_transport.c ++++ b/net/vmw_vsock/hyperv_transport.c +@@ -311,6 +311,11 @@ static void hvs_close_connection(struct vmbus_channel *chan) + lock_sock(sk); + hvs_do_close_lock_held(vsock_sk(sk), true); + release_sock(sk); ++ ++ /* Release the refcnt for the channel that's opened in ++ * hvs_open_connection(). ++ */ ++ sock_put(sk); + } + + static void hvs_open_connection(struct vmbus_channel *chan) +@@ -378,6 +383,9 @@ static void hvs_open_connection(struct vmbus_channel *chan) + } + + set_per_channel_state(chan, conn_from_host ? new : sk); ++ ++ /* This reference will be dropped by hvs_close_connection(). */ ++ sock_hold(conn_from_host ? new : sk); + vmbus_set_chn_rescind_callback(chan, hvs_close_connection); + + /* Set the pending send size to max packet size to always get +diff --git a/net/xdp/xsk.c b/net/xdp/xsk.c +index a14e8864e4fa..5e0637db92ea 100644 +--- a/net/xdp/xsk.c ++++ b/net/xdp/xsk.c +@@ -123,13 +123,17 @@ int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) + u64 addr; + int err; + +- if (xs->dev != xdp->rxq->dev || xs->queue_id != xdp->rxq->queue_index) +- return -EINVAL; ++ spin_lock_bh(&xs->rx_lock); ++ ++ if (xs->dev != xdp->rxq->dev || xs->queue_id != xdp->rxq->queue_index) { ++ err = -EINVAL; ++ goto out_unlock; ++ } + + if (!xskq_peek_addr(xs->umem->fq, &addr) || + len > xs->umem->chunk_size_nohr - XDP_PACKET_HEADROOM) { +- xs->rx_dropped++; +- return -ENOSPC; ++ err = -ENOSPC; ++ goto out_drop; + } + + addr += xs->umem->headroom; +@@ -138,13 +142,21 @@ int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp) + memcpy(buffer, xdp->data_meta, len + metalen); + addr += metalen; + err = xskq_produce_batch_desc(xs->rx, addr, len); +- if (!err) { +- xskq_discard_addr(xs->umem->fq); +- xsk_flush(xs); +- return 0; +- } ++ if (err) ++ goto out_drop; ++ ++ xskq_discard_addr(xs->umem->fq); ++ xskq_produce_flush_desc(xs->rx); + ++ spin_unlock_bh(&xs->rx_lock); ++ ++ xs->sk.sk_data_ready(&xs->sk); ++ return 0; ++ ++out_drop: + xs->rx_dropped++; ++out_unlock: ++ spin_unlock_bh(&xs->rx_lock); + return err; + } + +@@ -765,6 +777,7 @@ static int xsk_create(struct net *net, struct socket *sock, int protocol, + + xs = xdp_sk(sk); + mutex_init(&xs->mutex); ++ spin_lock_init(&xs->rx_lock); + spin_lock_init(&xs->tx_completion_lock); + + mutex_lock(&net->xdp.lock); +diff --git a/net/xdp/xsk_queue.h b/net/xdp/xsk_queue.h +index 88b9ae24658d..cba4a640d5e8 100644 +--- a/net/xdp/xsk_queue.h ++++ b/net/xdp/xsk_queue.h +@@ -288,7 +288,7 @@ static inline void xskq_produce_flush_desc(struct xsk_queue *q) + /* Order producer and data */ + smp_wmb(); /* B, matches C */ + +- q->prod_tail = q->prod_head, ++ q->prod_tail = q->prod_head; + WRITE_ONCE(q->ring->producer, q->prod_tail); + } + +diff --git a/net/xfrm/Kconfig b/net/xfrm/Kconfig +index c967fc3c38c8..51bb6018f3bf 100644 +--- a/net/xfrm/Kconfig ++++ b/net/xfrm/Kconfig +@@ -15,6 +15,8 @@ config XFRM_ALGO + tristate + select XFRM + select CRYPTO ++ select CRYPTO_HASH ++ select CRYPTO_BLKCIPHER + + if INET + config XFRM_USER +diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c +index b1694d5d15d3..82be7780bbe8 100644 +--- a/net/xfrm/xfrm_policy.c ++++ b/net/xfrm/xfrm_policy.c +@@ -1280,13 +1280,17 @@ static void xfrm_hash_rebuild(struct work_struct *work) + + hlist_for_each_entry_safe(policy, n, + &net->xfrm.policy_inexact[dir], +- bydst_inexact_list) ++ bydst_inexact_list) { ++ hlist_del_rcu(&policy->bydst); + hlist_del_init(&policy->bydst_inexact_list); ++ } + + hmask = net->xfrm.policy_bydst[dir].hmask; + odst = net->xfrm.policy_bydst[dir].table; +- for (i = hmask; i >= 0; i--) +- INIT_HLIST_HEAD(odst + i); ++ for (i = hmask; i >= 0; i--) { ++ hlist_for_each_entry_safe(policy, n, odst + i, bydst) ++ hlist_del_rcu(&policy->bydst); ++ } + if ((dir & XFRM_POLICY_MASK) == XFRM_POLICY_OUT) { + /* dir out => dst = remote, src = local */ + net->xfrm.policy_bydst[dir].dbits4 = rbits4; +@@ -1315,8 +1319,6 @@ static void xfrm_hash_rebuild(struct work_struct *work) + chain = policy_hash_bysel(net, &policy->selector, + policy->family, dir); + +- hlist_del_rcu(&policy->bydst); +- + if (!chain) { + void *p = xfrm_policy_inexact_insert(policy, dir, 0); + +diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c +index 173477211e40..b88ba45ff1ac 100644 +--- a/net/xfrm/xfrm_user.c ++++ b/net/xfrm/xfrm_user.c +@@ -151,6 +151,25 @@ static int verify_newsa_info(struct xfrm_usersa_info *p, + + err = -EINVAL; + switch (p->family) { ++ case AF_INET: ++ break; ++ ++ case AF_INET6: ++#if IS_ENABLED(CONFIG_IPV6) ++ break; ++#else ++ err = -EAFNOSUPPORT; ++ goto out; ++#endif ++ ++ default: ++ goto out; ++ } ++ ++ switch (p->sel.family) { ++ case AF_UNSPEC: ++ break; ++ + case AF_INET: + if (p->sel.prefixlen_d > 32 || p->sel.prefixlen_s > 32) + goto out; +diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost +index fec6ec2ffa47..38d77353c66a 100644 +--- a/scripts/Makefile.modpost ++++ b/scripts/Makefile.modpost +@@ -142,10 +142,8 @@ FORCE: + # optimization, we don't need to read them if the target does not + # exist, we will rebuild anyway in that case. + +-cmd_files := $(wildcard $(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd)) ++existing-targets := $(wildcard $(sort $(targets))) + +-ifneq ($(cmd_files),) +- include $(cmd_files) +-endif ++-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) + + .PHONY: $(PHONY) +diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c +index facbd603adf6..9ba47b0a47b9 100644 +--- a/scripts/basic/fixdep.c ++++ b/scripts/basic/fixdep.c +@@ -99,6 +99,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -109,6 +110,36 @@ static void usage(void) + exit(1); + } + ++/* ++ * In the intended usage of this program, the stdout is redirected to .*.cmd ++ * files. The return value of printf() and putchar() must be checked to catch ++ * any error, e.g. "No space left on device". ++ */ ++static void xprintf(const char *format, ...) ++{ ++ va_list ap; ++ int ret; ++ ++ va_start(ap, format); ++ ret = vprintf(format, ap); ++ if (ret < 0) { ++ perror("fixdep"); ++ exit(1); ++ } ++ va_end(ap); ++} ++ ++static void xputchar(int c) ++{ ++ int ret; ++ ++ ret = putchar(c); ++ if (ret == EOF) { ++ perror("fixdep"); ++ exit(1); ++ } ++} ++ + /* + * Print out a dependency path from a symbol name + */ +@@ -116,7 +147,7 @@ static void print_dep(const char *m, int slen, const char *dir) + { + int c, prev_c = '/', i; + +- printf(" $(wildcard %s/", dir); ++ xprintf(" $(wildcard %s/", dir); + for (i = 0; i < slen; i++) { + c = m[i]; + if (c == '_') +@@ -124,10 +155,10 @@ static void print_dep(const char *m, int slen, const char *dir) + else + c = tolower(c); + if (c != '/' || prev_c != '/') +- putchar(c); ++ xputchar(c); + prev_c = c; + } +- printf(".h) \\\n"); ++ xprintf(".h) \\\n"); + } + + struct item { +@@ -324,13 +355,13 @@ static void parse_dep_file(char *m, const char *target) + */ + if (!saw_any_target) { + saw_any_target = 1; +- printf("source_%s := %s\n\n", +- target, m); +- printf("deps_%s := \\\n", target); ++ xprintf("source_%s := %s\n\n", ++ target, m); ++ xprintf("deps_%s := \\\n", target); + } + is_first_dep = 0; + } else { +- printf(" %s \\\n", m); ++ xprintf(" %s \\\n", m); + } + + buf = read_file(m); +@@ -353,8 +384,8 @@ static void parse_dep_file(char *m, const char *target) + exit(1); + } + +- printf("\n%s: $(deps_%s)\n\n", target, target); +- printf("$(deps_%s):\n", target); ++ xprintf("\n%s: $(deps_%s)\n\n", target, target); ++ xprintf("$(deps_%s):\n", target); + } + + int main(int argc, char *argv[]) +@@ -369,7 +400,7 @@ int main(int argc, char *argv[]) + target = argv[2]; + cmdline = argv[3]; + +- printf("cmd_%s := %s\n\n", target, cmdline); ++ xprintf("cmd_%s := %s\n\n", target, cmdline); + + buf = read_file(depfile); + parse_dep_file(buf, target); +diff --git a/scripts/gen_compile_commands.py b/scripts/gen_compile_commands.py +index 7915823b92a5..c458696ef3a7 100755 +--- a/scripts/gen_compile_commands.py ++++ b/scripts/gen_compile_commands.py +@@ -21,9 +21,9 @@ _LINE_PATTERN = r'^cmd_[^ ]*\.o := (.* )([^ ]*\.c)$' + _VALID_LOG_LEVELS = ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'] + + # A kernel build generally has over 2000 entries in its compile_commands.json +-# database. If this code finds 500 or fewer, then warn the user that they might ++# database. If this code finds 300 or fewer, then warn the user that they might + # not have all the .cmd files, and they might need to compile the kernel. +-_LOW_COUNT_THRESHOLD = 500 ++_LOW_COUNT_THRESHOLD = 300 + + + def parse_arguments(): +diff --git a/scripts/genksyms/keywords.c b/scripts/genksyms/keywords.c +index e93336baaaed..c586d32dd2c3 100644 +--- a/scripts/genksyms/keywords.c ++++ b/scripts/genksyms/keywords.c +@@ -25,6 +25,10 @@ static struct resword { + { "__volatile__", VOLATILE_KEYW }, + { "__builtin_va_list", VA_LIST_KEYW }, + ++ { "__int128", BUILTIN_INT_KEYW }, ++ { "__int128_t", BUILTIN_INT_KEYW }, ++ { "__uint128_t", BUILTIN_INT_KEYW }, ++ + // According to rth, c99 defines "_Bool", __restrict", __restrict__", "restrict". KAO + { "_Bool", BOOL_KEYW }, + { "_restrict", RESTRICT_KEYW }, +diff --git a/scripts/genksyms/parse.y b/scripts/genksyms/parse.y +index 00a6d7e54971..1ebcf52cd0f9 100644 +--- a/scripts/genksyms/parse.y ++++ b/scripts/genksyms/parse.y +@@ -76,6 +76,7 @@ static void record_compound(struct string_list **keyw, + %token ATTRIBUTE_KEYW + %token AUTO_KEYW + %token BOOL_KEYW ++%token BUILTIN_INT_KEYW + %token CHAR_KEYW + %token CONST_KEYW + %token DOUBLE_KEYW +@@ -263,6 +264,7 @@ simple_type_specifier: + | VOID_KEYW + | BOOL_KEYW + | VA_LIST_KEYW ++ | BUILTIN_INT_KEYW + | TYPE { (*$1)->tag = SYM_TYPEDEF; $$ = $1; } + ; + +diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c +index e17837f1d3f2..ae6504d07fd6 100644 +--- a/scripts/kallsyms.c ++++ b/scripts/kallsyms.c +@@ -150,6 +150,9 @@ static int read_symbol(FILE *in, struct sym_entry *s) + /* exclude debugging symbols */ + else if (stype == 'N' || stype == 'n') + return -1; ++ /* exclude s390 kasan local symbols */ ++ else if (!strncmp(sym, ".LASANPC", 8)) ++ return -1; + + /* include the type field in the symbol name, so that it gets + * compressed together */ +diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c +index 6006154d36bd..27964917cbfd 100644 +--- a/scripts/kconfig/confdata.c ++++ b/scripts/kconfig/confdata.c +@@ -867,6 +867,7 @@ int conf_write(const char *name) + const char *str; + char tmpname[PATH_MAX + 1], oldname[PATH_MAX + 1]; + char *env; ++ int i; + bool need_newline = false; + + if (!name) +@@ -914,7 +915,8 @@ int conf_write(const char *name) + "# %s\n" + "#\n", str); + need_newline = false; +- } else if (!(sym->flags & SYMBOL_CHOICE)) { ++ } else if (!(sym->flags & SYMBOL_CHOICE) && ++ !(sym->flags & SYMBOL_WRITTEN)) { + sym_calc_value(sym); + if (!(sym->flags & SYMBOL_WRITE)) + goto next; +@@ -922,7 +924,7 @@ int conf_write(const char *name) + fprintf(out, "\n"); + need_newline = false; + } +- sym->flags &= ~SYMBOL_WRITE; ++ sym->flags |= SYMBOL_WRITTEN; + conf_write_symbol(out, sym, &kconfig_printer_cb, NULL); + } + +@@ -948,6 +950,9 @@ int conf_write(const char *name) + } + fclose(out); + ++ for_all_symbols(i, sym) ++ sym->flags &= ~SYMBOL_WRITTEN; ++ + if (*tmpname) { + if (is_same(name, tmpname)) { + conf_message("No change to %s", name); +@@ -1082,8 +1087,6 @@ int conf_write_autoconf(int overwrite) + if (!overwrite && is_present(autoconf_name)) + return 0; + +- sym_clear_all_valid(); +- + conf_write_dep("include/config/auto.conf.cmd"); + + if (conf_touch_deps()) +diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h +index 8dde65bc3165..017843c9a4f4 100644 +--- a/scripts/kconfig/expr.h ++++ b/scripts/kconfig/expr.h +@@ -141,6 +141,7 @@ struct symbol { + #define SYMBOL_OPTIONAL 0x0100 /* choice is optional - values can be 'n' */ + #define SYMBOL_WRITE 0x0200 /* write symbol to file (KCONFIG_CONFIG) */ + #define SYMBOL_CHANGED 0x0400 /* ? */ ++#define SYMBOL_WRITTEN 0x0800 /* track info to avoid double-write to .config */ + #define SYMBOL_NO_WRITE 0x1000 /* Symbol for internal use only; it will not be written */ + #define SYMBOL_CHECKED 0x2000 /* used during dependency checking */ + #define SYMBOL_WARNED 0x8000 /* warning has been issued */ +diff --git a/scripts/mkcompile_h b/scripts/mkcompile_h +index 2339f86126cb..0c0179cce09c 100755 +--- a/scripts/mkcompile_h ++++ b/scripts/mkcompile_h +@@ -50,8 +50,8 @@ else + fi + + UTS_VERSION="#$VERSION" +-CONFIG_FLAGS="" +-if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi ++CONFIG_FLAGS="ZEN" ++if [ -n "$SMP" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS SMP"; fi + if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi + UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP" + +diff --git a/scripts/recordmcount.h b/scripts/recordmcount.h +index 13c5e6c8829c..47fca2c69a73 100644 +--- a/scripts/recordmcount.h ++++ b/scripts/recordmcount.h +@@ -325,7 +325,8 @@ static uint_t *sift_rel_mcount(uint_t *mlocp, + if (!mcountsym) + mcountsym = get_mcountsym(sym0, relp, str0); + +- if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp)) { ++ if (mcountsym && mcountsym == Elf_r_sym(relp) && ++ !is_fake_mcount(relp)) { + uint_t const addend = + _w(_w(relp->r_offset) - recval + mcount_adjust); + mrelp->r_offset = _w(offbase +diff --git a/scripts/sphinx-pre-install b/scripts/sphinx-pre-install +index 9be208db88d3..1f9f0a334c24 100755 +--- a/scripts/sphinx-pre-install ++++ b/scripts/sphinx-pre-install +@@ -77,6 +77,17 @@ sub check_missing(%) + foreach my $prog (sort keys %missing) { + my $is_optional = $missing{$prog}; + ++ # At least on some LTS distros like CentOS 7, texlive doesn't ++ # provide all packages we need. When such distros are ++ # detected, we have to disable PDF output. ++ # ++ # So, we need to ignore the packages that distros would ++ # need for LaTeX to work ++ if ($is_optional == 2 && !$pdf) { ++ $optional--; ++ next; ++ } ++ + if ($is_optional) { + print "Warning: better to also install \"$prog\".\n"; + } else { +@@ -326,10 +337,10 @@ sub give_debian_hints() + + if ($pdf) { + check_missing_file("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", +- "fonts-dejavu", 1); ++ "fonts-dejavu", 2); + } + +- check_program("dvipng", 1) if ($pdf); ++ check_program("dvipng", 2) if ($pdf); + check_missing(\%map); + + return if (!$need && !$optional); +@@ -364,22 +375,40 @@ sub give_redhat_hints() + # + # Checks valid for RHEL/CentOS version 7.x. + # +- if (! $system_release =~ /Fedora/) { ++ my $old = 0; ++ my $rel; ++ $rel = $1 if ($system_release =~ /release\s+(\d+)/); ++ ++ if (!($system_release =~ /Fedora/)) { + $map{"virtualenv"} = "python-virtualenv"; +- } + +- my $release; ++ if ($rel && $rel < 8) { ++ $old = 1; ++ $pdf = 0; + +- $release = $1 if ($system_release =~ /Fedora\s+release\s+(\d+)/); ++ printf("Note: texlive packages on RHEL/CENTOS <= 7 are incomplete. Can't support PDF output\n"); ++ printf("If you want to build PDF, please read:\n"); ++ printf("\thttps://www.systutorials.com/241660/how-to-install-tex-live-on-centos-7-linux/\n"); ++ } ++ } else { ++ if ($rel && $rel < 26) { ++ $old = 1; ++ } ++ } ++ if (!$rel) { ++ printf("Couldn't identify release number\n"); ++ $old = 1; ++ $pdf = 0; ++ } + +- check_rpm_missing(\@fedora26_opt_pkgs, 1) if ($pdf && $release >= 26); +- check_rpm_missing(\@fedora_tex_pkgs, 1) if ($pdf); +- check_missing_tex(1) if ($pdf); ++ check_rpm_missing(\@fedora26_opt_pkgs, 2) if ($pdf && !$old); ++ check_rpm_missing(\@fedora_tex_pkgs, 2) if ($pdf); ++ check_missing_tex(2) if ($pdf); + check_missing(\%map); + + return if (!$need && !$optional); + +- if ($release >= 18) { ++ if (!$old) { + # dnf, for Fedora 18+ + printf("You should run:\n\n\tsudo dnf install -y $install\n"); + } else { +@@ -418,8 +447,10 @@ sub give_opensuse_hints() + "texlive-zapfding", + ); + +- check_rpm_missing(\@suse_tex_pkgs, 1) if ($pdf); +- check_missing_tex(1) if ($pdf); ++ $map{"latexmk"} = "texlive-latexmk-bin"; ++ ++ check_rpm_missing(\@suse_tex_pkgs, 2) if ($pdf); ++ check_missing_tex(2) if ($pdf); + check_missing(\%map); + + return if (!$need && !$optional); +@@ -443,7 +474,9 @@ sub give_mageia_hints() + "texlive-fontsextra", + ); + +- check_rpm_missing(\@tex_pkgs, 1) if ($pdf); ++ $map{"latexmk"} = "texlive-collection-basic"; ++ ++ check_rpm_missing(\@tex_pkgs, 2) if ($pdf); + check_missing(\%map); + + return if (!$need && !$optional); +@@ -466,7 +499,8 @@ sub give_arch_linux_hints() + "texlive-latexextra", + "ttf-dejavu", + ); +- check_pacman_missing(\@archlinux_tex_pkgs, 1) if ($pdf); ++ check_pacman_missing(\@archlinux_tex_pkgs, 2) if ($pdf); ++ + check_missing(\%map); + + return if (!$need && !$optional); +@@ -485,7 +519,7 @@ sub give_gentoo_hints() + ); + + check_missing_file("/usr/share/fonts/dejavu/DejaVuSans.ttf", +- "media-fonts/dejavu", 1) if ($pdf); ++ "media-fonts/dejavu", 2) if ($pdf); + + check_missing(\%map); + +@@ -553,7 +587,7 @@ sub check_distros() + my %map = ( + "sphinx-build" => "sphinx" + ); +- check_missing_tex(1) if ($pdf); ++ check_missing_tex(2) if ($pdf); + check_missing(\%map); + print "I don't know distro $system_release.\n"; + print "So, I can't provide you a hint with the install procedure.\n"; +@@ -591,11 +625,13 @@ sub check_needs() + check_program("make", 0); + check_program("gcc", 0); + check_python_module("sphinx_rtd_theme", 1) if (!$virtualenv); +- check_program("xelatex", 1) if ($pdf); + check_program("dot", 1); + check_program("convert", 1); +- check_program("rsvg-convert", 1) if ($pdf); +- check_program("latexmk", 1) if ($pdf); ++ ++ # Extra PDF files - should use 2 for is_optional ++ check_program("xelatex", 2) if ($pdf); ++ check_program("rsvg-convert", 2) if ($pdf); ++ check_program("latexmk", 2) if ($pdf); + + check_distros(); + +diff --git a/security/Kconfig.hardening b/security/Kconfig.hardening +index c6cb2d9b2905..107176069af3 100644 +--- a/security/Kconfig.hardening ++++ b/security/Kconfig.hardening +@@ -61,6 +61,7 @@ choice + config GCC_PLUGIN_STRUCTLEAK_BYREF + bool "zero-init structs passed by reference (strong)" + depends on GCC_PLUGINS ++ depends on !(KASAN && KASAN_STACK=1) + select GCC_PLUGIN_STRUCTLEAK + help + Zero-initialize any structures on the stack that may +@@ -70,9 +71,15 @@ choice + exposures, like CVE-2017-1000410: + https://git.kernel.org/linus/06e7e776ca4d3654 + ++ As a side-effect, this keeps a lot of variables on the ++ stack that can otherwise be optimized out, so combining ++ this with CONFIG_KASAN_STACK can lead to a stack overflow ++ and is disallowed. ++ + config GCC_PLUGIN_STRUCTLEAK_BYREF_ALL + bool "zero-init anything passed by reference (very strong)" + depends on GCC_PLUGINS ++ depends on !(KASAN && KASAN_STACK=1) + select GCC_PLUGIN_STRUCTLEAK + help + Zero-initialize any stack variables that may be passed +diff --git a/security/integrity/digsig.c b/security/integrity/digsig.c +index 4582bc26770a..868ade3e8970 100644 +--- a/security/integrity/digsig.c ++++ b/security/integrity/digsig.c +@@ -69,8 +69,9 @@ int integrity_digsig_verify(const unsigned int id, const char *sig, int siglen, + return -EOPNOTSUPP; + } + +-static int __integrity_init_keyring(const unsigned int id, key_perm_t perm, +- struct key_restriction *restriction) ++static int __init __integrity_init_keyring(const unsigned int id, ++ key_perm_t perm, ++ struct key_restriction *restriction) + { + const struct cred *cred = current_cred(); + int err = 0; +diff --git a/security/keys/trusted.c b/security/keys/trusted.c +index 9a94672e7adc..ade699131065 100644 +--- a/security/keys/trusted.c ++++ b/security/keys/trusted.c +@@ -1228,24 +1228,11 @@ static int __init trusted_shash_alloc(void) + + static int __init init_digests(void) + { +- u8 digest[TPM_MAX_DIGEST_SIZE]; +- int ret; +- int i; +- +- ret = tpm_get_random(chip, digest, TPM_MAX_DIGEST_SIZE); +- if (ret < 0) +- return ret; +- if (ret < TPM_MAX_DIGEST_SIZE) +- return -EFAULT; +- + digests = kcalloc(chip->nr_allocated_banks, sizeof(*digests), + GFP_KERNEL); + if (!digests) + return -ENOMEM; + +- for (i = 0; i < chip->nr_allocated_banks; i++) +- memcpy(digests[i].digest, digest, TPM_MAX_DIGEST_SIZE); +- + return 0; + } + +diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c +index 94de51628fdc..3ec7ac70c313 100644 +--- a/security/selinux/hooks.c ++++ b/security/selinux/hooks.c +@@ -6351,11 +6351,12 @@ static int selinux_setprocattr(const char *name, void *value, size_t size) + } else if (!strcmp(name, "fscreate")) { + tsec->create_sid = sid; + } else if (!strcmp(name, "keycreate")) { +- error = avc_has_perm(&selinux_state, +- mysid, sid, SECCLASS_KEY, KEY__CREATE, +- NULL); +- if (error) +- goto abort_change; ++ if (sid) { ++ error = avc_has_perm(&selinux_state, mysid, sid, ++ SECCLASS_KEY, KEY__CREATE, NULL); ++ if (error) ++ goto abort_change; ++ } + tsec->keycreate_sid = sid; + } else if (!strcmp(name, "sockcreate")) { + tsec->sockcreate_sid = sid; +diff --git a/security/selinux/ss/policydb.c b/security/selinux/ss/policydb.c +index 624ccc6ac744..f8efaa9f647c 100644 +--- a/security/selinux/ss/policydb.c ++++ b/security/selinux/ss/policydb.c +@@ -272,6 +272,8 @@ static int rangetr_cmp(struct hashtab *h, const void *k1, const void *k2) + return v; + } + ++static int (*destroy_f[SYM_NUM]) (void *key, void *datum, void *datap); ++ + /* + * Initialize a policy database structure. + */ +@@ -319,8 +321,10 @@ static int policydb_init(struct policydb *p) + out: + hashtab_destroy(p->filename_trans); + hashtab_destroy(p->range_tr); +- for (i = 0; i < SYM_NUM; i++) ++ for (i = 0; i < SYM_NUM; i++) { ++ hashtab_map(p->symtab[i].table, destroy_f[i], NULL); + hashtab_destroy(p->symtab[i].table); ++ } + return rc; + } + +diff --git a/security/selinux/ss/sidtab.c b/security/selinux/ss/sidtab.c +index e63a90ff2728..1f0a6eaa2d6a 100644 +--- a/security/selinux/ss/sidtab.c ++++ b/security/selinux/ss/sidtab.c +@@ -286,6 +286,11 @@ static int sidtab_reverse_lookup(struct sidtab *s, struct context *context, + ++count; + } + ++ /* bail out if we already reached max entries */ ++ rc = -EOVERFLOW; ++ if (count >= SIDTAB_MAX) ++ goto out_unlock; ++ + /* insert context into new entry */ + rc = -ENOMEM; + dst = sidtab_do_lookup(s, count, 1); +diff --git a/sound/ac97/bus.c b/sound/ac97/bus.c +index 7b977b753a03..7985dd8198b6 100644 +--- a/sound/ac97/bus.c ++++ b/sound/ac97/bus.c +@@ -122,17 +122,12 @@ static int ac97_codec_add(struct ac97_controller *ac97_ctrl, int idx, + vendor_id); + + ret = device_add(&codec->dev); +- if (ret) +- goto err_free_codec; ++ if (ret) { ++ put_device(&codec->dev); ++ return ret; ++ } + + return 0; +-err_free_codec: +- of_node_put(codec->dev.of_node); +- put_device(&codec->dev); +- kfree(codec); +- ac97_ctrl->codecs[idx] = NULL; +- +- return ret; + } + + unsigned int snd_ac97_bus_scan_one(struct ac97_controller *adrv, +diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c +index 99b882158705..41905afada63 100644 +--- a/sound/core/compress_offload.c ++++ b/sound/core/compress_offload.c +@@ -574,10 +574,7 @@ snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg) + stream->metadata_set = false; + stream->next_track = false; + +- if (stream->direction == SND_COMPRESS_PLAYBACK) +- stream->runtime->state = SNDRV_PCM_STATE_SETUP; +- else +- stream->runtime->state = SNDRV_PCM_STATE_PREPARED; ++ stream->runtime->state = SNDRV_PCM_STATE_SETUP; + } else { + return -EPERM; + } +@@ -693,8 +690,17 @@ static int snd_compr_start(struct snd_compr_stream *stream) + { + int retval; + +- if (stream->runtime->state != SNDRV_PCM_STATE_PREPARED) ++ switch (stream->runtime->state) { ++ case SNDRV_PCM_STATE_SETUP: ++ if (stream->direction != SND_COMPRESS_CAPTURE) ++ return -EPERM; ++ break; ++ case SNDRV_PCM_STATE_PREPARED: ++ break; ++ default: + return -EPERM; ++ } ++ + retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_START); + if (!retval) + stream->runtime->state = SNDRV_PCM_STATE_RUNNING; +@@ -705,9 +711,15 @@ static int snd_compr_stop(struct snd_compr_stream *stream) + { + int retval; + +- if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || +- stream->runtime->state == SNDRV_PCM_STATE_SETUP) ++ switch (stream->runtime->state) { ++ case SNDRV_PCM_STATE_OPEN: ++ case SNDRV_PCM_STATE_SETUP: ++ case SNDRV_PCM_STATE_PREPARED: + return -EPERM; ++ default: ++ break; ++ } ++ + retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_STOP); + if (!retval) { + snd_compr_drain_notify(stream); +@@ -795,9 +807,17 @@ static int snd_compr_drain(struct snd_compr_stream *stream) + { + int retval; + +- if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || +- stream->runtime->state == SNDRV_PCM_STATE_SETUP) ++ switch (stream->runtime->state) { ++ case SNDRV_PCM_STATE_OPEN: ++ case SNDRV_PCM_STATE_SETUP: ++ case SNDRV_PCM_STATE_PREPARED: ++ case SNDRV_PCM_STATE_PAUSED: + return -EPERM; ++ case SNDRV_PCM_STATE_XRUN: ++ return -EPIPE; ++ default: ++ break; ++ } + + retval = stream->ops->trigger(stream, SND_COMPR_TRIGGER_DRAIN); + if (retval) { +@@ -817,6 +837,10 @@ static int snd_compr_next_track(struct snd_compr_stream *stream) + if (stream->runtime->state != SNDRV_PCM_STATE_RUNNING) + return -EPERM; + ++ /* next track doesn't have any meaning for capture streams */ ++ if (stream->direction == SND_COMPRESS_CAPTURE) ++ return -EPERM; ++ + /* you can signal next track if this is intended to be a gapless stream + * and current track metadata is set + */ +@@ -834,9 +858,23 @@ static int snd_compr_next_track(struct snd_compr_stream *stream) + static int snd_compr_partial_drain(struct snd_compr_stream *stream) + { + int retval; +- if (stream->runtime->state == SNDRV_PCM_STATE_PREPARED || +- stream->runtime->state == SNDRV_PCM_STATE_SETUP) ++ ++ switch (stream->runtime->state) { ++ case SNDRV_PCM_STATE_OPEN: ++ case SNDRV_PCM_STATE_SETUP: ++ case SNDRV_PCM_STATE_PREPARED: ++ case SNDRV_PCM_STATE_PAUSED: ++ return -EPERM; ++ case SNDRV_PCM_STATE_XRUN: ++ return -EPIPE; ++ default: ++ break; ++ } ++ ++ /* partial drain doesn't have any meaning for capture streams */ ++ if (stream->direction == SND_COMPRESS_CAPTURE) + return -EPERM; ++ + /* stream can be drained only when next track has been signalled */ + if (stream->next_track == false) + return -EPERM; +diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c +index 860543a4c840..12dd9b318db1 100644 +--- a/sound/core/pcm_native.c ++++ b/sound/core/pcm_native.c +@@ -77,7 +77,7 @@ void snd_pcm_group_init(struct snd_pcm_group *group) + spin_lock_init(&group->lock); + mutex_init(&group->mutex); + INIT_LIST_HEAD(&group->substreams); +- refcount_set(&group->refs, 0); ++ refcount_set(&group->refs, 1); + } + + /* define group lock helpers */ +@@ -1096,8 +1096,7 @@ static void snd_pcm_group_unref(struct snd_pcm_group *group, + + if (!group) + return; +- do_free = refcount_dec_and_test(&group->refs) && +- list_empty(&group->substreams); ++ do_free = refcount_dec_and_test(&group->refs); + snd_pcm_group_unlock(group, substream->pcm->nonatomic); + if (do_free) + kfree(group); +@@ -2020,6 +2019,7 @@ static int snd_pcm_link(struct snd_pcm_substream *substream, int fd) + snd_pcm_group_lock_irq(target_group, nonatomic); + snd_pcm_stream_lock(substream1); + snd_pcm_group_assign(substream1, target_group); ++ refcount_inc(&target_group->refs); + snd_pcm_stream_unlock(substream1); + snd_pcm_group_unlock_irq(target_group, nonatomic); + _end: +@@ -2056,13 +2056,14 @@ static int snd_pcm_unlink(struct snd_pcm_substream *substream) + snd_pcm_group_lock_irq(group, nonatomic); + + relink_to_local(substream); ++ refcount_dec(&group->refs); + + /* detach the last stream, too */ + if (list_is_singular(&group->substreams)) { + relink_to_local(list_first_entry(&group->substreams, + struct snd_pcm_substream, + link_list)); +- do_free = !refcount_read(&group->refs); ++ do_free = refcount_dec_and_test(&group->refs); + } + + snd_pcm_group_unlock_irq(group, nonatomic); +diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c +index a60e7a17f0b8..7737b2670064 100644 +--- a/sound/core/seq/seq_clientmgr.c ++++ b/sound/core/seq/seq_clientmgr.c +@@ -1021,7 +1021,7 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, + { + struct snd_seq_client *client = file->private_data; + int written = 0, len; +- int err; ++ int err, handled; + struct snd_seq_event event; + + if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT)) +@@ -1034,6 +1034,8 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, + if (!client->accept_output || client->pool == NULL) + return -ENXIO; + ++ repeat: ++ handled = 0; + /* allocate the pool now if the pool is not allocated yet */ + mutex_lock(&client->ioctl_mutex); + if (client->pool->size > 0 && !snd_seq_write_pool_allocated(client)) { +@@ -1093,12 +1095,19 @@ static ssize_t snd_seq_write(struct file *file, const char __user *buf, + 0, 0, &client->ioctl_mutex); + if (err < 0) + break; ++ handled++; + + __skip_event: + /* Update pointers and counts */ + count -= len; + buf += len; + written += len; ++ ++ /* let's have a coffee break if too many events are queued */ ++ if (++handled >= 200) { ++ mutex_unlock(&client->ioctl_mutex); ++ goto repeat; ++ } + } + + out: +diff --git a/sound/firewire/packets-buffer.c b/sound/firewire/packets-buffer.c +index 0d35359d25cd..0ecafd0c6722 100644 +--- a/sound/firewire/packets-buffer.c ++++ b/sound/firewire/packets-buffer.c +@@ -37,7 +37,7 @@ int iso_packets_buffer_init(struct iso_packets_buffer *b, struct fw_unit *unit, + packets_per_page = PAGE_SIZE / packet_size; + if (WARN_ON(!packets_per_page)) { + err = -EINVAL; +- goto error; ++ goto err_packets; + } + pages = DIV_ROUND_UP(count, packets_per_page); + +diff --git a/sound/hda/ext/hdac_ext_bus.c b/sound/hda/ext/hdac_ext_bus.c +index a3a113ef5d56..4f9f1d2a2ec5 100644 +--- a/sound/hda/ext/hdac_ext_bus.c ++++ b/sound/hda/ext/hdac_ext_bus.c +@@ -85,7 +85,6 @@ int snd_hdac_ext_bus_init(struct hdac_bus *bus, struct device *dev, + const struct hdac_ext_bus_ops *ext_ops) + { + int ret; +- static int idx; + + /* check if io ops are provided, if not load the defaults */ + if (io_ops == NULL) +@@ -96,7 +95,12 @@ int snd_hdac_ext_bus_init(struct hdac_bus *bus, struct device *dev, + return ret; + + bus->ext_ops = ext_ops; +- bus->idx = idx++; ++ /* FIXME: ++ * Currently only one bus is supported, if there is device with more ++ * buses, bus->idx should be greater than 0, but there needs to be a ++ * reliable way to always assign same number. ++ */ ++ bus->idx = 0; + bus->cmd_dma_state = true; + + return 0; +diff --git a/sound/hda/hdac_controller.c b/sound/hda/hdac_controller.c +index b02f74528b66..812dc144fb5b 100644 +--- a/sound/hda/hdac_controller.c ++++ b/sound/hda/hdac_controller.c +@@ -79,6 +79,8 @@ void snd_hdac_bus_init_cmd_io(struct hdac_bus *bus) + snd_hdac_chip_writew(bus, RINTCNT, 1); + /* enable rirb dma and response irq */ + snd_hdac_chip_writeb(bus, RIRBCTL, AZX_RBCTL_DMA_EN | AZX_RBCTL_IRQ_EN); ++ /* Accept unsolicited responses */ ++ snd_hdac_chip_updatel(bus, GCTL, AZX_GCTL_UNSOL, AZX_GCTL_UNSOL); + spin_unlock_irq(&bus->reg_lock); + } + EXPORT_SYMBOL_GPL(snd_hdac_bus_init_cmd_io); +@@ -415,9 +417,6 @@ int snd_hdac_bus_reset_link(struct hdac_bus *bus, bool full_reset) + return -EBUSY; + } + +- /* Accept unsolicited responses */ +- snd_hdac_chip_updatel(bus, GCTL, AZX_GCTL_UNSOL, AZX_GCTL_UNSOL); +- + /* detect codecs */ + if (!bus->codec_mask) { + bus->codec_mask = snd_hdac_chip_readw(bus, STATESTS); +diff --git a/sound/hda/hdac_i915.c b/sound/hda/hdac_i915.c +index 1192c7561d62..3c2db3816029 100644 +--- a/sound/hda/hdac_i915.c ++++ b/sound/hda/hdac_i915.c +@@ -136,10 +136,12 @@ int snd_hdac_i915_init(struct hdac_bus *bus) + if (!acomp) + return -ENODEV; + if (!acomp->ops) { +- request_module("i915"); +- /* 60s timeout */ +- wait_for_completion_timeout(&bind_complete, +- msecs_to_jiffies(60 * 1000)); ++ if (!IS_ENABLED(CONFIG_MODULES) || ++ !request_module("i915")) { ++ /* 60s timeout */ ++ wait_for_completion_timeout(&bind_complete, ++ msecs_to_jiffies(60 * 1000)); ++ } + } + if (!acomp->ops) { + dev_info(bus->dev, "couldn't bind with audio component\n"); +diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c +index 6c51b8363f8b..106328584998 100644 +--- a/sound/pci/hda/hda_codec.c ++++ b/sound/pci/hda/hda_codec.c +@@ -2941,15 +2941,19 @@ static int hda_codec_runtime_resume(struct device *dev) + #ifdef CONFIG_PM_SLEEP + static int hda_codec_force_resume(struct device *dev) + { ++ struct hda_codec *codec = dev_to_hda_codec(dev); ++ bool forced_resume = !codec->relaxed_resume; + int ret; + + /* The get/put pair below enforces the runtime resume even if the + * device hasn't been used at suspend time. This trick is needed to + * update the jack state change during the sleep. + */ +- pm_runtime_get_noresume(dev); ++ if (forced_resume) ++ pm_runtime_get_noresume(dev); + ret = pm_runtime_force_resume(dev); +- pm_runtime_put(dev); ++ if (forced_resume) ++ pm_runtime_put(dev); + return ret; + } + +diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c +index 232a1926758a..dd96def48a3a 100644 +--- a/sound/pci/hda/hda_controller.c ++++ b/sound/pci/hda/hda_controller.c +@@ -598,11 +598,9 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) + } + runtime->private_data = azx_dev; + +- if (chip->gts_present) +- azx_pcm_hw.info = azx_pcm_hw.info | +- SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME; +- + runtime->hw = azx_pcm_hw; ++ if (chip->gts_present) ++ runtime->hw.info |= SNDRV_PCM_INFO_HAS_LINK_SYNCHRONIZED_ATIME; + runtime->hw.channels_min = hinfo->channels_min; + runtime->hw.channels_max = hinfo->channels_max; + runtime->hw.formats = hinfo->formats; +@@ -615,6 +613,13 @@ static int azx_pcm_open(struct snd_pcm_substream *substream) + 20, + 178000000); + ++ /* by some reason, the playback stream stalls on PulseAudio with ++ * tsched=1 when a capture stream triggers. Until we figure out the ++ * real cause, disable tsched mode by telling the PCM info flag. ++ */ ++ if (chip->driver_caps & AZX_DCAPS_AMD_WORKAROUND) ++ runtime->hw.info |= SNDRV_PCM_INFO_BATCH; ++ + if (chip->align_buffer_size) + /* constrain buffer sizes to be multiple of 128 + bytes. This is more efficient in terms of memory +diff --git a/sound/pci/hda/hda_controller.h b/sound/pci/hda/hda_controller.h +index 3aa5c957ffbf..863695d025af 100644 +--- a/sound/pci/hda/hda_controller.h ++++ b/sound/pci/hda/hda_controller.h +@@ -31,7 +31,7 @@ + /* 14 unused */ + #define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */ + #define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */ +-/* 17 unused */ ++#define AZX_DCAPS_AMD_WORKAROUND (1 << 17) /* AMD-specific workaround */ + #define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */ + #define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */ + #define AZX_DCAPS_OLD_SSYNC (1 << 20) /* Old SSYNC reg for ICH */ +diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c +index 50f86f458918..fb8f452a1c78 100644 +--- a/sound/pci/hda/hda_intel.c ++++ b/sound/pci/hda/hda_intel.c +@@ -64,6 +64,7 @@ enum { + POS_FIX_VIACOMBO, + POS_FIX_COMBO, + POS_FIX_SKL, ++ POS_FIX_FIFO, + }; + + /* Defines for ATI HD Audio support in SB450 south bridge */ +@@ -135,7 +136,7 @@ module_param_array(model, charp, NULL, 0444); + MODULE_PARM_DESC(model, "Use the given board model."); + module_param_array(position_fix, int, NULL, 0444); + MODULE_PARM_DESC(position_fix, "DMA pointer read method." +- "(-1 = system default, 0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO, 4 = COMBO, 5 = SKL+)."); ++ "(-1 = system default, 0 = auto, 1 = LPIB, 2 = POSBUF, 3 = VIACOMBO, 4 = COMBO, 5 = SKL+, 6 = FIFO)."); + module_param_array(bdl_pos_adj, int, NULL, 0644); + MODULE_PARM_DESC(bdl_pos_adj, "BDL position adjustment offset."); + module_param_array(probe_mask, int, NULL, 0444); +@@ -313,11 +314,10 @@ enum { + + #define AZX_DCAPS_INTEL_SKYLAKE \ + (AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME |\ ++ AZX_DCAPS_SYNC_WRITE |\ + AZX_DCAPS_SEPARATE_STREAM_TAG | AZX_DCAPS_I915_COMPONENT) + +-#define AZX_DCAPS_INTEL_BROXTON \ +- (AZX_DCAPS_INTEL_PCH_BASE | AZX_DCAPS_PM_RUNTIME |\ +- AZX_DCAPS_SEPARATE_STREAM_TAG | AZX_DCAPS_I915_COMPONENT) ++#define AZX_DCAPS_INTEL_BROXTON AZX_DCAPS_INTEL_SKYLAKE + + /* quirks for ATI SB / AMD Hudson */ + #define AZX_DCAPS_PRESET_ATI_SB \ +@@ -333,6 +333,11 @@ enum { + #define AZX_DCAPS_PRESET_ATI_HDMI_NS \ + (AZX_DCAPS_PRESET_ATI_HDMI | AZX_DCAPS_SNOOP_OFF) + ++/* quirks for AMD SB */ ++#define AZX_DCAPS_PRESET_AMD_SB \ ++ (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_AMD_WORKAROUND |\ ++ AZX_DCAPS_SNOOP_TYPE(ATI) | AZX_DCAPS_PM_RUNTIME) ++ + /* quirks for Nvidia */ + #define AZX_DCAPS_PRESET_NVIDIA \ + (AZX_DCAPS_NO_MSI | AZX_DCAPS_CORBRP_SELF_CLEAR |\ +@@ -842,6 +847,49 @@ static unsigned int azx_via_get_position(struct azx *chip, + return bound_pos + mod_dma_pos; + } + ++#define AMD_FIFO_SIZE 32 ++ ++/* get the current DMA position with FIFO size correction */ ++static unsigned int azx_get_pos_fifo(struct azx *chip, struct azx_dev *azx_dev) ++{ ++ struct snd_pcm_substream *substream = azx_dev->core.substream; ++ struct snd_pcm_runtime *runtime = substream->runtime; ++ unsigned int pos, delay; ++ ++ pos = snd_hdac_stream_get_pos_lpib(azx_stream(azx_dev)); ++ if (!runtime) ++ return pos; ++ ++ runtime->delay = AMD_FIFO_SIZE; ++ delay = frames_to_bytes(runtime, AMD_FIFO_SIZE); ++ if (azx_dev->insufficient) { ++ if (pos < delay) { ++ delay = pos; ++ runtime->delay = bytes_to_frames(runtime, pos); ++ } else { ++ azx_dev->insufficient = 0; ++ } ++ } ++ ++ /* correct the DMA position for capture stream */ ++ if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { ++ if (pos < delay) ++ pos += azx_dev->core.bufsize; ++ pos -= delay; ++ } ++ ++ return pos; ++} ++ ++static int azx_get_delay_from_fifo(struct azx *chip, struct azx_dev *azx_dev, ++ unsigned int pos) ++{ ++ struct snd_pcm_substream *substream = azx_dev->core.substream; ++ ++ /* just read back the calculated value in the above */ ++ return substream->runtime->delay; ++} ++ + static unsigned int azx_skl_get_dpib_pos(struct azx *chip, + struct azx_dev *azx_dev) + { +@@ -1418,6 +1466,7 @@ static int check_position_fix(struct azx *chip, int fix) + case POS_FIX_VIACOMBO: + case POS_FIX_COMBO: + case POS_FIX_SKL: ++ case POS_FIX_FIFO: + return fix; + } + +@@ -1434,6 +1483,10 @@ static int check_position_fix(struct azx *chip, int fix) + dev_dbg(chip->card->dev, "Using VIACOMBO position fix\n"); + return POS_FIX_VIACOMBO; + } ++ if (chip->driver_caps & AZX_DCAPS_AMD_WORKAROUND) { ++ dev_dbg(chip->card->dev, "Using FIFO position fix\n"); ++ return POS_FIX_FIFO; ++ } + if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) { + dev_dbg(chip->card->dev, "Using LPIB position fix\n"); + return POS_FIX_LPIB; +@@ -1454,6 +1507,7 @@ static void assign_position_fix(struct azx *chip, int fix) + [POS_FIX_VIACOMBO] = azx_via_get_position, + [POS_FIX_COMBO] = azx_get_pos_lpib, + [POS_FIX_SKL] = azx_get_pos_skl, ++ [POS_FIX_FIFO] = azx_get_pos_fifo, + }; + + chip->get_position[0] = chip->get_position[1] = callbacks[fix]; +@@ -1468,6 +1522,9 @@ static void assign_position_fix(struct azx *chip, int fix) + azx_get_delay_from_lpib; + } + ++ if (fix == POS_FIX_FIFO) ++ chip->get_delay[0] = chip->get_delay[1] = ++ azx_get_delay_from_fifo; + } + + /* +@@ -2445,6 +2502,9 @@ static const struct pci_device_id azx_ids[] = { + /* AMD Hudson */ + { PCI_DEVICE(0x1022, 0x780d), + .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB }, ++ /* AMD, X370 & co */ ++ { PCI_DEVICE(0x1022, 0x1457), ++ .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_AMD_SB }, + /* AMD Stoney */ + { PCI_DEVICE(0x1022, 0x157a), + .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB | +diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c +index 4f8d0845ee1e..f299f137eaea 100644 +--- a/sound/pci/hda/patch_conexant.c ++++ b/sound/pci/hda/patch_conexant.c +@@ -1083,6 +1083,7 @@ static int patch_conexant_auto(struct hda_codec *codec) + */ + + static const struct hda_device_id snd_hda_id_conexant[] = { ++ HDA_CODEC_ENTRY(0x14f11f86, "CX8070", patch_conexant_auto), + HDA_CODEC_ENTRY(0x14f12008, "CX8200", patch_conexant_auto), + HDA_CODEC_ENTRY(0x14f15045, "CX20549 (Venice)", patch_conexant_auto), + HDA_CODEC_ENTRY(0x14f15047, "CX20551 (Waikiki)", patch_conexant_auto), +diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c +index b7bde55b6adf..e49c1c00f5ce 100644 +--- a/sound/pci/hda/patch_hdmi.c ++++ b/sound/pci/hda/patch_hdmi.c +@@ -2291,8 +2291,10 @@ static void generic_hdmi_free(struct hda_codec *codec) + struct hdmi_spec *spec = codec->spec; + int pin_idx, pcm_idx; + +- if (codec_has_acomp(codec)) ++ if (codec_has_acomp(codec)) { + snd_hdac_acomp_register_notifier(&codec->bus->core, NULL); ++ codec->relaxed_resume = 0; ++ } + + for (pin_idx = 0; pin_idx < spec->num_pins; pin_idx++) { + struct hdmi_spec_per_pin *per_pin = get_pin(spec, pin_idx); +@@ -2415,7 +2417,6 @@ static void intel_haswell_fixup_connect_list(struct hda_codec *codec, + snd_hda_override_conn_list(codec, nid, spec->num_cvts, spec->cvt_nids); + } + +-#define INTEL_GET_VENDOR_VERB 0xf81 + #define INTEL_GET_VENDOR_VERB 0xf81 + #define INTEL_SET_VENDOR_VERB 0x781 + #define INTEL_EN_DP12 0x02 /* enable DP 1.2 features */ +@@ -2524,18 +2525,32 @@ static int intel_pin2port(void *audio_ptr, int pin_nid) + return -1; + } + ++static int intel_port2pin(struct hda_codec *codec, int port) ++{ ++ struct hdmi_spec *spec = codec->spec; ++ ++ if (!spec->port_num) { ++ /* we assume only from port-B to port-D */ ++ if (port < 1 || port > 3) ++ return 0; ++ /* intel port is 1-based */ ++ return port + intel_base_nid(codec) - 1; ++ } ++ ++ if (port < 1 || port > spec->port_num) ++ return 0; ++ return spec->port_map[port - 1]; ++} ++ + static void intel_pin_eld_notify(void *audio_ptr, int port, int pipe) + { + struct hda_codec *codec = audio_ptr; + int pin_nid; + int dev_id = pipe; + +- /* we assume only from port-B to port-D */ +- if (port < 1 || port > 3) ++ pin_nid = intel_port2pin(codec, port); ++ if (!pin_nid) + return; +- +- pin_nid = port + intel_base_nid(codec) - 1; /* intel port is 1-based */ +- + /* skip notification during system suspend (but not in runtime PM); + * the state will be updated at resume + */ +@@ -2565,6 +2580,8 @@ static void register_i915_notifier(struct hda_codec *codec) + spec->drm_audio_ops.pin_eld_notify = intel_pin_eld_notify; + snd_hdac_acomp_register_notifier(&codec->bus->core, + &spec->drm_audio_ops); ++ /* no need for forcible resume for jack check thanks to notifier */ ++ codec->relaxed_resume = 1; + } + + /* setup_stream ops override for HSW+ */ +diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c +index 6f3a35949cdd..de224cbea7a0 100644 +--- a/sound/pci/hda/patch_realtek.c ++++ b/sound/pci/hda/patch_realtek.c +@@ -3255,6 +3255,7 @@ static void alc256_init(struct hda_codec *codec) + alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ + alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */ + alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15); ++ alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ + } + + static void alc256_shutup(struct hda_codec *codec) +@@ -7656,9 +7657,12 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { + {0x12, 0x90a60130}, + {0x17, 0x90170110}, + {0x21, 0x03211020}), +- SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, ++ SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, + {0x14, 0x90170110}, + {0x21, 0x04211020}), ++ SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, ++ {0x14, 0x90170110}, ++ {0x21, 0x04211030}), + SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, + ALC295_STANDARD_PINS, + {0x17, 0x21014020}, +@@ -7825,7 +7829,6 @@ static int patch_alc269(struct hda_codec *codec) + spec->shutup = alc256_shutup; + spec->init_hook = alc256_init; + spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */ +- alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ + break; + case 0x10ec0257: + spec->codec_variant = ALC269_TYPE_ALC257; +@@ -8800,6 +8803,11 @@ static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = { + {0x18, 0x01a19030}, + {0x1a, 0x01813040}, + {0x21, 0x01014020}), ++ SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE, ++ {0x16, 0x01813030}, ++ {0x17, 0x02211010}, ++ {0x18, 0x01a19040}, ++ {0x21, 0x01014020}), + SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE, + {0x14, 0x01014010}, + {0x18, 0x01a19020}, +diff --git a/sound/pci/maestro3.c b/sound/pci/maestro3.c +index 19fa73df0846..46caed9b924d 100644 +--- a/sound/pci/maestro3.c ++++ b/sound/pci/maestro3.c +@@ -2001,7 +2001,7 @@ static void snd_m3_ac97_reset(struct snd_m3 *chip) + outw(0, io + GPIO_DATA); + outw(dir | GPO_PRIMARY_AC97, io + GPIO_DIRECTION); + +- schedule_timeout_uninterruptible(msecs_to_jiffies(delay1)); ++ schedule_msec_hrtimeout_uninterruptible((delay1)); + + outw(GPO_PRIMARY_AC97, io + GPIO_DATA); + udelay(5); +@@ -2009,7 +2009,7 @@ static void snd_m3_ac97_reset(struct snd_m3 *chip) + outw(IO_SRAM_ENABLE | SERIAL_AC_LINK_ENABLE, io + RING_BUS_CTRL_A); + outw(~0, io + GPIO_MASK); + +- schedule_timeout_uninterruptible(msecs_to_jiffies(delay2)); ++ schedule_msec_hrtimeout_uninterruptible((delay2)); + + if (! snd_m3_try_read_vendor(chip)) + break; +diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c +index 1f57126708e7..c9f9820968bb 100644 +--- a/sound/soc/codecs/hdac_hdmi.c ++++ b/sound/soc/codecs/hdac_hdmi.c +@@ -1859,6 +1859,12 @@ static void hdmi_codec_remove(struct snd_soc_component *component) + { + struct hdac_hdmi_priv *hdmi = snd_soc_component_get_drvdata(component); + struct hdac_device *hdev = hdmi->hdev; ++ int ret; ++ ++ ret = snd_hdac_acomp_register_notifier(hdev->bus, NULL); ++ if (ret < 0) ++ dev_err(&hdev->dev, "notifier unregister failed: err: %d\n", ++ ret); + + pm_runtime_disable(&hdev->dev); + } +diff --git a/sound/soc/codecs/rt5631.c b/sound/soc/codecs/rt5631.c +index f70b9f7e68bb..77b65398ca07 100644 +--- a/sound/soc/codecs/rt5631.c ++++ b/sound/soc/codecs/rt5631.c +@@ -415,7 +415,7 @@ static void onebit_depop_mute_stage(struct snd_soc_component *component, int ena + hp_zc = snd_soc_component_read32(component, RT5631_INT_ST_IRQ_CTRL_2); + snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); + if (enable) { +- schedule_timeout_uninterruptible(msecs_to_jiffies(10)); ++ schedule_msec_hrtimeout_uninterruptible((10)); + /* config one-bit depop parameter */ + rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x307f); + snd_soc_component_update_bits(component, RT5631_HP_OUT_VOL, +@@ -525,7 +525,7 @@ static void depop_seq_mute_stage(struct snd_soc_component *component, int enable + hp_zc = snd_soc_component_read32(component, RT5631_INT_ST_IRQ_CTRL_2); + snd_soc_component_write(component, RT5631_INT_ST_IRQ_CTRL_2, hp_zc & 0xf7ff); + if (enable) { +- schedule_timeout_uninterruptible(msecs_to_jiffies(10)); ++ schedule_msec_hrtimeout_uninterruptible((10)); + + /* config depop sequence parameter */ + rt5631_write_index(component, RT5631_SPK_INTL_CTRL, 0x302f); +diff --git a/sound/soc/codecs/wm8350.c b/sound/soc/codecs/wm8350.c +index fe99584c917f..f1344d532a13 100644 +--- a/sound/soc/codecs/wm8350.c ++++ b/sound/soc/codecs/wm8350.c +@@ -233,10 +233,10 @@ static void wm8350_pga_work(struct work_struct *work) + out2->ramp == WM8350_RAMP_UP) { + /* delay is longer over 0dB as increases are larger */ + if (i >= WM8350_OUTn_0dB) +- schedule_timeout_interruptible(msecs_to_jiffies ++ schedule_msec_hrtimeout_interruptible( + (2)); + else +- schedule_timeout_interruptible(msecs_to_jiffies ++ schedule_msec_hrtimeout_interruptible( + (1)); + } else + udelay(50); /* doesn't matter if we delay longer */ +@@ -1120,7 +1120,7 @@ static int wm8350_set_bias_level(struct snd_soc_component *component, + (platform->dis_out4 << 6)); + + /* wait for discharge */ +- schedule_timeout_interruptible(msecs_to_jiffies ++ schedule_msec_hrtimeout_interruptible( + (platform-> + cap_discharge_msecs)); + +@@ -1136,7 +1136,7 @@ static int wm8350_set_bias_level(struct snd_soc_component *component, + WM8350_VBUFEN); + + /* wait for vmid */ +- schedule_timeout_interruptible(msecs_to_jiffies ++ schedule_msec_hrtimeout_interruptible( + (platform-> + vmid_charge_msecs)); + +@@ -1187,7 +1187,7 @@ static int wm8350_set_bias_level(struct snd_soc_component *component, + wm8350_reg_write(wm8350, WM8350_POWER_MGMT_1, pm1); + + /* wait */ +- schedule_timeout_interruptible(msecs_to_jiffies ++ schedule_msec_hrtimeout_interruptible( + (platform-> + vmid_discharge_msecs)); + +@@ -1205,7 +1205,7 @@ static int wm8350_set_bias_level(struct snd_soc_component *component, + pm1 | WM8350_OUTPUT_DRAIN_EN); + + /* wait */ +- schedule_timeout_interruptible(msecs_to_jiffies ++ schedule_msec_hrtimeout_interruptible( + (platform->drain_msecs)); + + pm1 &= ~WM8350_BIASEN; +diff --git a/sound/soc/codecs/wm8900.c b/sound/soc/codecs/wm8900.c +index 271235a69c01..3ec90e1b1eb4 100644 +--- a/sound/soc/codecs/wm8900.c ++++ b/sound/soc/codecs/wm8900.c +@@ -1109,7 +1109,7 @@ static int wm8900_set_bias_level(struct snd_soc_component *component, + /* Need to let things settle before stopping the clock + * to ensure that restart works, see "Stopping the + * master clock" in the datasheet. */ +- schedule_timeout_interruptible(msecs_to_jiffies(1)); ++ schedule_msec_hrtimeout_interruptible(1); + snd_soc_component_write(component, WM8900_REG_POWER2, + WM8900_REG_POWER2_SYSCLK_ENA); + break; +diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c +index 6497c1ea6228..08fefeca9d82 100644 +--- a/sound/soc/codecs/wm9713.c ++++ b/sound/soc/codecs/wm9713.c +@@ -199,7 +199,7 @@ static int wm9713_voice_shutdown(struct snd_soc_dapm_widget *w, + + /* Gracefully shut down the voice interface. */ + snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x0f00, 0x0200); +- schedule_timeout_interruptible(msecs_to_jiffies(1)); ++ schedule_msec_hrtimeout_interruptible(1); + snd_soc_component_update_bits(component, AC97_HANDSET_RATE, 0x0f00, 0x0f00); + snd_soc_component_update_bits(component, AC97_EXTENDED_MID, 0x1000, 0x1000); + +@@ -868,7 +868,7 @@ static int wm9713_set_pll(struct snd_soc_component *component, + wm9713->pll_in = freq_in; + + /* wait 10ms AC97 link frames for the link to stabilise */ +- schedule_timeout_interruptible(msecs_to_jiffies(10)); ++ schedule_msec_hrtimeout_interruptible((10)); + return 0; + } + +diff --git a/sound/soc/generic/audio-graph-card.c b/sound/soc/generic/audio-graph-card.c +index ec7e673ba475..70ed28d97d49 100644 +--- a/sound/soc/generic/audio-graph-card.c ++++ b/sound/soc/generic/audio-graph-card.c +@@ -435,9 +435,6 @@ static int graph_for_each_link(struct asoc_simple_priv *priv, + codec_ep = of_graph_get_remote_endpoint(cpu_ep); + codec_port = of_get_parent(codec_ep); + +- of_node_put(codec_ep); +- of_node_put(codec_port); +- + /* get convert-xxx property */ + memset(&adata, 0, sizeof(adata)); + graph_parse_convert(dev, codec_ep, &adata); +@@ -457,6 +454,9 @@ static int graph_for_each_link(struct asoc_simple_priv *priv, + else + ret = func_noml(priv, cpu_ep, codec_ep, li); + ++ of_node_put(codec_ep); ++ of_node_put(codec_port); ++ + if (ret < 0) + return ret; + +diff --git a/sound/soc/intel/boards/Kconfig b/sound/soc/intel/boards/Kconfig +index 5407d217228e..c0aef45d335a 100644 +--- a/sound/soc/intel/boards/Kconfig ++++ b/sound/soc/intel/boards/Kconfig +@@ -392,7 +392,7 @@ config SND_SOC_INTEL_SOF_RT5682_MACH + (SND_SOC_SOF_BAYTRAIL && X86_INTEL_LPSS) + select SND_SOC_RT5682 + select SND_SOC_DMIC +- select SND_SOC_HDAC_HDMI if SND_SOC_SOF_HDA_COMMON ++ select SND_SOC_HDAC_HDMI + help + This adds support for ASoC machine driver for SOF platforms + with rt5682 codec. +diff --git a/sound/soc/meson/axg-tdm.h b/sound/soc/meson/axg-tdm.h +index e578b6f40a07..5774ce0916d4 100644 +--- a/sound/soc/meson/axg-tdm.h ++++ b/sound/soc/meson/axg-tdm.h +@@ -40,7 +40,7 @@ struct axg_tdm_iface { + + static inline bool axg_tdm_lrclk_invert(unsigned int fmt) + { +- return (fmt & SND_SOC_DAIFMT_I2S) ^ ++ return ((fmt & SND_SOC_DAIFMT_FORMAT_MASK) == SND_SOC_DAIFMT_I2S) ^ + !!(fmt & (SND_SOC_DAIFMT_IB_IF | SND_SOC_DAIFMT_NB_IF)); + } + +diff --git a/sound/soc/sh/rcar/ctu.c b/sound/soc/sh/rcar/ctu.c +index 8cb06dab234e..7647b3d4c0ba 100644 +--- a/sound/soc/sh/rcar/ctu.c ++++ b/sound/soc/sh/rcar/ctu.c +@@ -108,7 +108,7 @@ static int rsnd_ctu_probe_(struct rsnd_mod *mod, + struct rsnd_dai_stream *io, + struct rsnd_priv *priv) + { +- return rsnd_cmd_attach(io, rsnd_mod_id(mod) / 4); ++ return rsnd_cmd_attach(io, rsnd_mod_id(mod)); + } + + static void rsnd_ctu_value_init(struct rsnd_dai_stream *io, +diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c +index 41c0cfaf2db5..6aeba0d66ec5 100644 +--- a/sound/soc/soc-core.c ++++ b/sound/soc/soc-core.c +@@ -158,9 +158,10 @@ static void soc_init_component_debugfs(struct snd_soc_component *component) + component->card->debugfs_card_root); + } + +- if (!component->debugfs_root) { ++ if (IS_ERR(component->debugfs_root)) { + dev_warn(component->dev, +- "ASoC: Failed to create component debugfs directory\n"); ++ "ASoC: Failed to create component debugfs directory: %ld\n", ++ PTR_ERR(component->debugfs_root)); + return; + } + +@@ -212,18 +213,21 @@ static void soc_init_card_debugfs(struct snd_soc_card *card) + + card->debugfs_card_root = debugfs_create_dir(card->name, + snd_soc_debugfs_root); +- if (!card->debugfs_card_root) { ++ if (IS_ERR(card->debugfs_card_root)) { + dev_warn(card->dev, +- "ASoC: Failed to create card debugfs directory\n"); ++ "ASoC: Failed to create card debugfs directory: %ld\n", ++ PTR_ERR(card->debugfs_card_root)); ++ card->debugfs_card_root = NULL; + return; + } + + card->debugfs_pop_time = debugfs_create_u32("dapm_pop_time", 0644, + card->debugfs_card_root, + &card->pop_time); +- if (!card->debugfs_pop_time) ++ if (IS_ERR(card->debugfs_pop_time)) + dev_warn(card->dev, +- "ASoC: Failed to create pop time debugfs file\n"); ++ "ASoC: Failed to create pop time debugfs file: %ld\n", ++ PTR_ERR(card->debugfs_pop_time)); + } + + static void soc_cleanup_card_debugfs(struct snd_soc_card *card) +@@ -2837,14 +2841,12 @@ static void snd_soc_unbind_card(struct snd_soc_card *card, bool unregister) + snd_soc_dapm_shutdown(card); + snd_soc_flush_all_delayed_work(card); + +- mutex_lock(&client_mutex); + /* remove all components used by DAI links on this card */ + for_each_comp_order(order) { + for_each_card_rtds(card, rtd) { + soc_remove_link_components(card, rtd, order); + } + } +- mutex_unlock(&client_mutex); + + soc_cleanup_card_resources(card); + if (!unregister) +@@ -2863,7 +2865,9 @@ static void snd_soc_unbind_card(struct snd_soc_card *card, bool unregister) + */ + int snd_soc_unregister_card(struct snd_soc_card *card) + { ++ mutex_lock(&client_mutex); + snd_soc_unbind_card(card, true); ++ mutex_unlock(&client_mutex); + dev_dbg(card->dev, "ASoC: Unregistered card '%s'\n", card->name); + + return 0; +diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c +index 55f8278077f4..d28f220b2836 100644 +--- a/sound/soc/soc-dapm.c ++++ b/sound/soc/soc-dapm.c +@@ -154,7 +154,7 @@ static void dapm_assert_locked(struct snd_soc_dapm_context *dapm) + static void pop_wait(u32 pop_time) + { + if (pop_time) +- schedule_timeout_uninterruptible(msecs_to_jiffies(pop_time)); ++ schedule_msec_hrtimeout_uninterruptible((pop_time)); + } + + __printf(3, 4) +@@ -2155,23 +2155,25 @@ void snd_soc_dapm_debugfs_init(struct snd_soc_dapm_context *dapm, + { + struct dentry *d; + +- if (!parent) ++ if (!parent || IS_ERR(parent)) + return; + + dapm->debugfs_dapm = debugfs_create_dir("dapm", parent); + +- if (!dapm->debugfs_dapm) { ++ if (IS_ERR(dapm->debugfs_dapm)) { + dev_warn(dapm->dev, +- "ASoC: Failed to create DAPM debugfs directory\n"); ++ "ASoC: Failed to create DAPM debugfs directory %ld\n", ++ PTR_ERR(dapm->debugfs_dapm)); + return; + } + + d = debugfs_create_file("bias_level", 0444, + dapm->debugfs_dapm, dapm, + &dapm_bias_fops); +- if (!d) ++ if (IS_ERR(d)) + dev_warn(dapm->dev, +- "ASoC: Failed to create bias level debugfs file\n"); ++ "ASoC: Failed to create bias level debugfs file: %ld\n", ++ PTR_ERR(d)); + } + + static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w) +@@ -2185,10 +2187,10 @@ static void dapm_debugfs_add_widget(struct snd_soc_dapm_widget *w) + d = debugfs_create_file(w->name, 0444, + dapm->debugfs_dapm, w, + &dapm_widget_power_fops); +- if (!d) ++ if (IS_ERR(d)) + dev_warn(w->dapm->dev, +- "ASoC: Failed to create %s debugfs file\n", +- w->name); ++ "ASoC: Failed to create %s debugfs file: %ld\n", ++ w->name, PTR_ERR(d)); + } + + static void dapm_debugfs_cleanup(struct snd_soc_dapm_context *dapm) +diff --git a/sound/sound_core.c b/sound/sound_core.c +index b730d97c4de6..90d118cd9164 100644 +--- a/sound/sound_core.c ++++ b/sound/sound_core.c +@@ -275,7 +275,8 @@ static int sound_insert_unit(struct sound_unit **list, const struct file_operati + goto retry; + } + spin_unlock(&sound_loader_lock); +- return -EBUSY; ++ r = -EBUSY; ++ goto fail; + } + } + +diff --git a/sound/usb/helper.c b/sound/usb/helper.c +index 84aa265dd802..4c12cc5b53fd 100644 +--- a/sound/usb/helper.c ++++ b/sound/usb/helper.c +@@ -63,6 +63,20 @@ void *snd_usb_find_csint_desc(void *buffer, int buflen, void *after, u8 dsubtype + return NULL; + } + ++/* check the validity of pipe and EP types */ ++int snd_usb_pipe_sanity_check(struct usb_device *dev, unsigned int pipe) ++{ ++ static const int pipetypes[4] = { ++ PIPE_CONTROL, PIPE_ISOCHRONOUS, PIPE_BULK, PIPE_INTERRUPT ++ }; ++ struct usb_host_endpoint *ep; ++ ++ ep = usb_pipe_endpoint(dev, pipe); ++ if (!ep || usb_pipetype(pipe) != pipetypes[usb_endpoint_type(&ep->desc)]) ++ return -EINVAL; ++ return 0; ++} ++ + /* + * Wrapper for usb_control_msg(). + * Allocates a temp buffer to prevent dmaing from/to the stack. +@@ -75,6 +89,9 @@ int snd_usb_ctl_msg(struct usb_device *dev, unsigned int pipe, __u8 request, + void *buf = NULL; + int timeout; + ++ if (snd_usb_pipe_sanity_check(dev, pipe)) ++ return -EINVAL; ++ + if (size > 0) { + buf = kmemdup(data, size, GFP_KERNEL); + if (!buf) +diff --git a/sound/usb/helper.h b/sound/usb/helper.h +index d338bd0e0ca6..6afb70156ec4 100644 +--- a/sound/usb/helper.h ++++ b/sound/usb/helper.h +@@ -7,6 +7,7 @@ unsigned int snd_usb_combine_bytes(unsigned char *bytes, int size); + void *snd_usb_find_desc(void *descstart, int desclen, void *after, u8 dtype); + void *snd_usb_find_csint_desc(void *descstart, int desclen, void *after, u8 dsubtype); + ++int snd_usb_pipe_sanity_check(struct usb_device *dev, unsigned int pipe); + int snd_usb_ctl_msg(struct usb_device *dev, unsigned int pipe, + __u8 request, __u8 requesttype, __u16 value, __u16 index, + void *data, __u16 size); +diff --git a/sound/usb/hiface/pcm.c b/sound/usb/hiface/pcm.c +index 14fc1e1d5d13..c406497c5919 100644 +--- a/sound/usb/hiface/pcm.c ++++ b/sound/usb/hiface/pcm.c +@@ -600,14 +600,13 @@ int hiface_pcm_init(struct hiface_chip *chip, u8 extra_freq) + ret = hiface_pcm_init_urb(&rt->out_urbs[i], chip, OUT_EP, + hiface_pcm_out_urb_handler); + if (ret < 0) +- return ret; ++ goto error; + } + + ret = snd_pcm_new(chip->card, "USB-SPDIF Audio", 0, 1, 0, &pcm); + if (ret < 0) { +- kfree(rt); + dev_err(&chip->dev->dev, "Cannot create pcm instance\n"); +- return ret; ++ goto error; + } + + pcm->private_data = rt; +@@ -620,4 +619,10 @@ int hiface_pcm_init(struct hiface_chip *chip, u8 extra_freq) + + chip->pcm = rt; + return 0; ++ ++error: ++ for (i = 0; i < PCM_N_URBS; i++) ++ kfree(rt->out_urbs[i].buffer); ++ kfree(rt); ++ return ret; + } +diff --git a/sound/usb/line6/pcm.c b/sound/usb/line6/pcm.c +index 2c03e0f6bf72..fde9ee3db78e 100644 +--- a/sound/usb/line6/pcm.c ++++ b/sound/usb/line6/pcm.c +@@ -127,7 +127,7 @@ static void line6_wait_clear_audio_urbs(struct snd_line6_pcm *line6pcm, + if (!alive) + break; + set_current_state(TASK_UNINTERRUPTIBLE); +- schedule_timeout(1); ++ schedule_min_hrtimeout(); + } while (--timeout > 0); + if (alive) + dev_err(line6pcm->line6->ifcdev, +diff --git a/sound/usb/line6/podhd.c b/sound/usb/line6/podhd.c +index 77a1d55334bb..53b53a9a4c6f 100644 +--- a/sound/usb/line6/podhd.c ++++ b/sound/usb/line6/podhd.c +@@ -413,7 +413,7 @@ static const struct line6_properties podhd_properties_table[] = { + .name = "POD HD500", + .capabilities = LINE6_CAP_PCM + | LINE6_CAP_HWMON, +- .altsetting = 1, ++ .altsetting = 0, + .ep_ctrl_r = 0x81, + .ep_ctrl_w = 0x01, + .ep_audio_r = 0x86, +diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c +index c703f8534b07..7498b5191b68 100644 +--- a/sound/usb/mixer.c ++++ b/sound/usb/mixer.c +@@ -2303,7 +2303,7 @@ static struct procunit_info extunits[] = { + */ + static int build_audio_procunit(struct mixer_build *state, int unitid, + void *raw_desc, struct procunit_info *list, +- char *name) ++ bool extension_unit) + { + struct uac_processing_unit_descriptor *desc = raw_desc; + int num_ins; +@@ -2320,6 +2320,8 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, + static struct procunit_info default_info = { + 0, NULL, default_value_info + }; ++ const char *name = extension_unit ? ++ "Extension Unit" : "Processing Unit"; + + if (desc->bLength < 13) { + usb_audio_err(state->chip, "invalid %s descriptor (id %d)\n", name, unitid); +@@ -2433,7 +2435,10 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, + } else if (info->name) { + strlcpy(kctl->id.name, info->name, sizeof(kctl->id.name)); + } else { +- nameid = uac_processing_unit_iProcessing(desc, state->mixer->protocol); ++ if (extension_unit) ++ nameid = uac_extension_unit_iExtension(desc, state->mixer->protocol); ++ else ++ nameid = uac_processing_unit_iProcessing(desc, state->mixer->protocol); + len = 0; + if (nameid) + len = snd_usb_copy_string_desc(state->chip, +@@ -2466,10 +2471,10 @@ static int parse_audio_processing_unit(struct mixer_build *state, int unitid, + case UAC_VERSION_2: + default: + return build_audio_procunit(state, unitid, raw_desc, +- procunits, "Processing Unit"); ++ procunits, false); + case UAC_VERSION_3: + return build_audio_procunit(state, unitid, raw_desc, +- uac3_procunits, "Processing Unit"); ++ uac3_procunits, false); + } + } + +@@ -2480,8 +2485,7 @@ static int parse_audio_extension_unit(struct mixer_build *state, int unitid, + * Note that we parse extension units with processing unit descriptors. + * That's ok as the layout is the same. + */ +- return build_audio_procunit(state, unitid, raw_desc, +- extunits, "Extension Unit"); ++ return build_audio_procunit(state, unitid, raw_desc, extunits, true); + } + + /* +diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c +index cf5cff10c08e..78858918cbc1 100644 +--- a/sound/usb/quirks.c ++++ b/sound/usb/quirks.c +@@ -828,11 +828,13 @@ static int snd_usb_novation_boot_quirk(struct usb_device *dev) + static int snd_usb_accessmusic_boot_quirk(struct usb_device *dev) + { + int err, actual_length; +- + /* "midi send" enable */ + static const u8 seq[] = { 0x4e, 0x73, 0x52, 0x01 }; ++ void *buf; + +- void *buf = kmemdup(seq, ARRAY_SIZE(seq), GFP_KERNEL); ++ if (snd_usb_pipe_sanity_check(dev, usb_sndintpipe(dev, 0x05))) ++ return -EINVAL; ++ buf = kmemdup(seq, ARRAY_SIZE(seq), GFP_KERNEL); + if (!buf) + return -ENOMEM; + err = usb_interrupt_msg(dev, usb_sndintpipe(dev, 0x05), buf, +@@ -857,7 +859,11 @@ static int snd_usb_accessmusic_boot_quirk(struct usb_device *dev) + + static int snd_usb_nativeinstruments_boot_quirk(struct usb_device *dev) + { +- int ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), ++ int ret; ++ ++ if (snd_usb_pipe_sanity_check(dev, usb_sndctrlpipe(dev, 0))) ++ return -EINVAL; ++ ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0), + 0xaf, USB_TYPE_VENDOR | USB_RECIP_DEVICE, + 1, 0, NULL, 0, 1000); + +@@ -964,6 +970,8 @@ static int snd_usb_axefx3_boot_quirk(struct usb_device *dev) + + dev_dbg(&dev->dev, "Waiting for Axe-Fx III to boot up...\n"); + ++ if (snd_usb_pipe_sanity_check(dev, usb_sndctrlpipe(dev, 0))) ++ return -EINVAL; + /* If the Axe-Fx III has not fully booted, it will timeout when trying + * to enable the audio streaming interface. A more generous timeout is + * used here to detect when the Axe-Fx III has finished booting as the +@@ -996,6 +1004,8 @@ static int snd_usb_motu_microbookii_communicate(struct usb_device *dev, u8 *buf, + { + int err, actual_length; + ++ if (snd_usb_pipe_sanity_check(dev, usb_sndintpipe(dev, 0x01))) ++ return -EINVAL; + err = usb_interrupt_msg(dev, usb_sndintpipe(dev, 0x01), buf, *length, + &actual_length, 1000); + if (err < 0) +@@ -1006,6 +1016,8 @@ static int snd_usb_motu_microbookii_communicate(struct usb_device *dev, u8 *buf, + + memset(buf, 0, buf_size); + ++ if (snd_usb_pipe_sanity_check(dev, usb_rcvintpipe(dev, 0x82))) ++ return -EINVAL; + err = usb_interrupt_msg(dev, usb_rcvintpipe(dev, 0x82), buf, buf_size, + &actual_length, 1000); + if (err < 0) +diff --git a/sound/usb/stream.c b/sound/usb/stream.c +index 7ee9d17d0143..e852c7fd6109 100644 +--- a/sound/usb/stream.c ++++ b/sound/usb/stream.c +@@ -1043,6 +1043,7 @@ snd_usb_get_audioformat_uac3(struct snd_usb_audio *chip, + + pd = kzalloc(sizeof(*pd), GFP_KERNEL); + if (!pd) { ++ kfree(fp->chmap); + kfree(fp->rate_table); + kfree(fp); + return NULL; +diff --git a/tools/bpf/bpftool/jit_disasm.c b/tools/bpf/bpftool/jit_disasm.c +index 3ef3093560ba..bfed711258ce 100644 +--- a/tools/bpf/bpftool/jit_disasm.c ++++ b/tools/bpf/bpftool/jit_disasm.c +@@ -11,6 +11,8 @@ + * Licensed under the GNU General Public License, version 2.0 (GPLv2) + */ + ++#define _GNU_SOURCE ++#include + #include + #include + #include +@@ -44,11 +46,13 @@ static int fprintf_json(void *out, const char *fmt, ...) + char *s; + + va_start(ap, fmt); ++ if (vasprintf(&s, fmt, ap) < 0) ++ return -1; ++ va_end(ap); ++ + if (!oper_count) { + int i; + +- s = va_arg(ap, char *); +- + /* Strip trailing spaces */ + i = strlen(s) - 1; + while (s[i] == ' ') +@@ -61,11 +65,10 @@ static int fprintf_json(void *out, const char *fmt, ...) + } else if (!strcmp(fmt, ",")) { + /* Skip */ + } else { +- s = va_arg(ap, char *); + jsonw_string(json_wtr, s); + oper_count++; + } +- va_end(ap); ++ free(s); + return 0; + } + +diff --git a/tools/build/feature/test-all.c b/tools/build/feature/test-all.c +index a59c53705093..939ac2fcc783 100644 +--- a/tools/build/feature/test-all.c ++++ b/tools/build/feature/test-all.c +@@ -182,7 +182,7 @@ + # include "test-disassembler-four-args.c" + #undef main + +-#define main main_test_zstd ++#define main main_test_libzstd + # include "test-libzstd.c" + #undef main + +diff --git a/tools/iio/iio_utils.c b/tools/iio/iio_utils.c +index a22b6e8fad46..7399eb7f1378 100644 +--- a/tools/iio/iio_utils.c ++++ b/tools/iio/iio_utils.c +@@ -156,9 +156,9 @@ int iioutils_get_type(unsigned *is_signed, unsigned *bytes, unsigned *bits_used, + *be = (endianchar == 'b'); + *bytes = padint / 8; + if (*bits_used == 64) +- *mask = ~0; ++ *mask = ~(0ULL); + else +- *mask = (1ULL << *bits_used) - 1; ++ *mask = (1ULL << *bits_used) - 1ULL; + + *is_signed = (signchar == 's'); + if (fclose(sysfsfp)) { +diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h +index a8b823c30b43..29a5bc3d5c66 100644 +--- a/tools/include/uapi/linux/bpf.h ++++ b/tools/include/uapi/linux/bpf.h +@@ -3143,6 +3143,7 @@ struct bpf_prog_info { + char name[BPF_OBJ_NAME_LEN]; + __u32 ifindex; + __u32 gpl_compatible:1; ++ __u32 :31; /* alignment pad */ + __u64 netns_dev; + __u64 netns_ino; + __u32 nr_jited_ksyms; +diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c +index 151f7ac1882e..3865a5d27251 100644 +--- a/tools/lib/bpf/libbpf.c ++++ b/tools/lib/bpf/libbpf.c +@@ -3487,10 +3487,7 @@ int bpf_prog_load(const char *file, enum bpf_prog_type type, + int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr, + struct bpf_object **pobj, int *prog_fd) + { +- struct bpf_object_open_attr open_attr = { +- .file = attr->file, +- .prog_type = attr->prog_type, +- }; ++ struct bpf_object_open_attr open_attr = {}; + struct bpf_program *prog, *first_prog = NULL; + enum bpf_attach_type expected_attach_type; + enum bpf_prog_type prog_type; +@@ -3503,6 +3500,9 @@ int bpf_prog_load_xattr(const struct bpf_prog_load_attr *attr, + if (!attr->file) + return -EINVAL; + ++ open_attr.file = attr->file; ++ open_attr.prog_type = attr->prog_type; ++ + obj = bpf_object__open_xattr(&open_attr); + if (IS_ERR_OR_NULL(obj)) + return -ENOENT; +diff --git a/tools/lib/bpf/xsk.c b/tools/lib/bpf/xsk.c +index 38667b62f1fe..ca272c5b67f4 100644 +--- a/tools/lib/bpf/xsk.c ++++ b/tools/lib/bpf/xsk.c +@@ -337,7 +337,8 @@ static int xsk_get_max_queues(struct xsk_socket *xsk) + + channels.cmd = ETHTOOL_GCHANNELS; + ifr.ifr_data = (void *)&channels; +- strncpy(ifr.ifr_name, xsk->ifname, IFNAMSIZ); ++ strncpy(ifr.ifr_name, xsk->ifname, IFNAMSIZ - 1); ++ ifr.ifr_name[IFNAMSIZ - 1] = '\0'; + err = ioctl(fd, SIOCETHTOOL, &ifr); + if (err && errno != EOPNOTSUPP) { + ret = -errno; +@@ -561,7 +562,8 @@ int xsk_socket__create(struct xsk_socket **xsk_ptr, const char *ifname, + err = -errno; + goto out_socket; + } +- strncpy(xsk->ifname, ifname, IFNAMSIZ); ++ strncpy(xsk->ifname, ifname, IFNAMSIZ - 1); ++ xsk->ifname[IFNAMSIZ - 1] = '\0'; + + err = xsk_set_xdp_socket_config(&xsk->config, usr_config); + if (err) +diff --git a/tools/pci/pcitest.c b/tools/pci/pcitest.c +index cb7a47dfd8b6..49ddfa6f5a8c 100644 +--- a/tools/pci/pcitest.c ++++ b/tools/pci/pcitest.c +@@ -36,15 +36,15 @@ struct pci_test { + unsigned long size; + }; + +-static void run_test(struct pci_test *test) ++static int run_test(struct pci_test *test) + { +- long ret; ++ int ret = -EINVAL; + int fd; + + fd = open(test->device, O_RDWR); + if (fd < 0) { + perror("can't open PCI Endpoint Test device"); +- return; ++ return -ENODEV; + } + + if (test->barnum >= 0 && test->barnum <= 5) { +diff --git a/tools/perf/Documentation/intel-pt.txt b/tools/perf/Documentation/intel-pt.txt +index 115eaacc455f..60d99e5e7921 100644 +--- a/tools/perf/Documentation/intel-pt.txt ++++ b/tools/perf/Documentation/intel-pt.txt +@@ -88,16 +88,16 @@ smaller. + + To represent software control flow, "branches" samples are produced. By default + a branch sample is synthesized for every single branch. To get an idea what +-data is available you can use the 'perf script' tool with no parameters, which +-will list all the samples. ++data is available you can use the 'perf script' tool with all itrace sampling ++options, which will list all the samples. + + perf record -e intel_pt//u ls +- perf script ++ perf script --itrace=ibxwpe + + An interesting field that is not printed by default is 'flags' which can be + displayed as follows: + +- perf script -Fcomm,tid,pid,time,cpu,event,trace,ip,sym,dso,addr,symoff,flags ++ perf script --itrace=ibxwpe -F+flags + + The flags are "bcrosyiABEx" which stand for branch, call, return, conditional, + system, asynchronous, interrupt, transaction abort, trace begin, trace end, and +@@ -713,7 +713,7 @@ Having no option is the same as + + which, in turn, is the same as + +- --itrace=ibxwpe ++ --itrace=cepwx + + The letters are: + +diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config +index 85fbcd265351..17b81bc403e4 100644 +--- a/tools/perf/Makefile.config ++++ b/tools/perf/Makefile.config +@@ -637,9 +637,14 @@ endif + + ifndef NO_SLANG + ifneq ($(feature-libslang), 1) +- msg := $(warning slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev); +- NO_SLANG := 1 +- else ++ ifneq ($(feature-libslang-include-subdir), 1) ++ msg := $(warning slang not found, disables TUI support. Please install slang-devel, libslang-dev or libslang2-dev); ++ NO_SLANG := 1 ++ else ++ CFLAGS += -DHAVE_SLANG_INCLUDE_SUBDIR ++ endif ++ endif ++ ifndef NO_SLANG + # Fedora has /usr/include/slang/slang.h, but ubuntu /usr/include/slang.h + CFLAGS += -I/usr/include/slang + CFLAGS += -DHAVE_SLANG_SUPPORT +diff --git a/tools/perf/arch/arm/util/cs-etm.c b/tools/perf/arch/arm/util/cs-etm.c +index 911426721170..0a278bbcaba6 100644 +--- a/tools/perf/arch/arm/util/cs-etm.c ++++ b/tools/perf/arch/arm/util/cs-etm.c +@@ -31,6 +31,8 @@ struct cs_etm_recording { + struct auxtrace_record itr; + struct perf_pmu *cs_etm_pmu; + struct perf_evlist *evlist; ++ int wrapped_cnt; ++ bool *wrapped; + bool snapshot_mode; + size_t snapshot_size; + }; +@@ -536,16 +538,131 @@ static int cs_etm_info_fill(struct auxtrace_record *itr, + return 0; + } + +-static int cs_etm_find_snapshot(struct auxtrace_record *itr __maybe_unused, ++static int cs_etm_alloc_wrapped_array(struct cs_etm_recording *ptr, int idx) ++{ ++ bool *wrapped; ++ int cnt = ptr->wrapped_cnt; ++ ++ /* Make @ptr->wrapped as big as @idx */ ++ while (cnt <= idx) ++ cnt++; ++ ++ /* ++ * Free'ed in cs_etm_recording_free(). Using realloc() to avoid ++ * cross compilation problems where the host's system supports ++ * reallocarray() but not the target. ++ */ ++ wrapped = realloc(ptr->wrapped, cnt * sizeof(bool)); ++ if (!wrapped) ++ return -ENOMEM; ++ ++ wrapped[cnt - 1] = false; ++ ptr->wrapped_cnt = cnt; ++ ptr->wrapped = wrapped; ++ ++ return 0; ++} ++ ++static bool cs_etm_buffer_has_wrapped(unsigned char *buffer, ++ size_t buffer_size, u64 head) ++{ ++ u64 i, watermark; ++ u64 *buf = (u64 *)buffer; ++ size_t buf_size = buffer_size; ++ ++ /* ++ * We want to look the very last 512 byte (chosen arbitrarily) in ++ * the ring buffer. ++ */ ++ watermark = buf_size - 512; ++ ++ /* ++ * @head is continuously increasing - if its value is equal or greater ++ * than the size of the ring buffer, it has wrapped around. ++ */ ++ if (head >= buffer_size) ++ return true; ++ ++ /* ++ * The value of @head is somewhere within the size of the ring buffer. ++ * This can be that there hasn't been enough data to fill the ring ++ * buffer yet or the trace time was so long that @head has numerically ++ * wrapped around. To find we need to check if we have data at the very ++ * end of the ring buffer. We can reliably do this because mmap'ed ++ * pages are zeroed out and there is a fresh mapping with every new ++ * session. ++ */ ++ ++ /* @head is less than 512 byte from the end of the ring buffer */ ++ if (head > watermark) ++ watermark = head; ++ ++ /* ++ * Speed things up by using 64 bit transactions (see "u64 *buf" above) ++ */ ++ watermark >>= 3; ++ buf_size >>= 3; ++ ++ /* ++ * If we find trace data at the end of the ring buffer, @head has ++ * been there and has numerically wrapped around at least once. ++ */ ++ for (i = watermark; i < buf_size; i++) ++ if (buf[i]) ++ return true; ++ ++ return false; ++} ++ ++static int cs_etm_find_snapshot(struct auxtrace_record *itr, + int idx, struct auxtrace_mmap *mm, +- unsigned char *data __maybe_unused, ++ unsigned char *data, + u64 *head, u64 *old) + { ++ int err; ++ bool wrapped; ++ struct cs_etm_recording *ptr = ++ container_of(itr, struct cs_etm_recording, itr); ++ ++ /* ++ * Allocate memory to keep track of wrapping if this is the first ++ * time we deal with this *mm. ++ */ ++ if (idx >= ptr->wrapped_cnt) { ++ err = cs_etm_alloc_wrapped_array(ptr, idx); ++ if (err) ++ return err; ++ } ++ ++ /* ++ * Check to see if *head has wrapped around. If it hasn't only the ++ * amount of data between *head and *old is snapshot'ed to avoid ++ * bloating the perf.data file with zeros. But as soon as *head has ++ * wrapped around the entire size of the AUX ring buffer it taken. ++ */ ++ wrapped = ptr->wrapped[idx]; ++ if (!wrapped && cs_etm_buffer_has_wrapped(data, mm->len, *head)) { ++ wrapped = true; ++ ptr->wrapped[idx] = true; ++ } ++ + pr_debug3("%s: mmap index %d old head %zu new head %zu size %zu\n", + __func__, idx, (size_t)*old, (size_t)*head, mm->len); + +- *old = *head; +- *head += mm->len; ++ /* No wrap has occurred, we can just use *head and *old. */ ++ if (!wrapped) ++ return 0; ++ ++ /* ++ * *head has wrapped around - adjust *head and *old to pickup the ++ * entire content of the AUX buffer. ++ */ ++ if (*head >= mm->len) { ++ *old = *head - mm->len; ++ } else { ++ *head += mm->len; ++ *old = *head - mm->len; ++ } + + return 0; + } +@@ -586,6 +703,8 @@ static void cs_etm_recording_free(struct auxtrace_record *itr) + { + struct cs_etm_recording *ptr = + container_of(itr, struct cs_etm_recording, itr); ++ ++ zfree(&ptr->wrapped); + free(ptr); + } + +diff --git a/tools/perf/arch/s390/util/machine.c b/tools/perf/arch/s390/util/machine.c +index a19690a17291..c8c86a0c9b79 100644 +--- a/tools/perf/arch/s390/util/machine.c ++++ b/tools/perf/arch/s390/util/machine.c +@@ -6,8 +6,9 @@ + #include "machine.h" + #include "api/fs/fs.h" + #include "debug.h" ++#include "symbol.h" + +-int arch__fix_module_text_start(u64 *start, const char *name) ++int arch__fix_module_text_start(u64 *start, u64 *size, const char *name) + { + u64 m_start = *start; + char path[PATH_MAX]; +@@ -17,7 +18,35 @@ int arch__fix_module_text_start(u64 *start, const char *name) + if (sysfs__read_ull(path, (unsigned long long *)start) < 0) { + pr_debug2("Using module %s start:%#lx\n", path, m_start); + *start = m_start; ++ } else { ++ /* Successful read of the modules segment text start address. ++ * Calculate difference between module start address ++ * in memory and module text segment start address. ++ * For example module load address is 0x3ff8011b000 ++ * (from /proc/modules) and module text segment start ++ * address is 0x3ff8011b870 (from file above). ++ * ++ * Adjust the module size and subtract the GOT table ++ * size located at the beginning of the module. ++ */ ++ *size -= (*start - m_start); + } + + return 0; + } ++ ++/* On s390 kernel text segment start is located at very low memory addresses, ++ * for example 0x10000. Modules are located at very high memory addresses, ++ * for example 0x3ff xxxx xxxx. The gap between end of kernel text segment ++ * and beginning of first module's text segment is very big. ++ * Therefore do not fill this gap and do not assign it to the kernel dso map. ++ */ ++void arch__symbols__fixup_end(struct symbol *p, struct symbol *c) ++{ ++ if (strchr(p->name, '[') == NULL && strchr(c->name, '[')) ++ /* Last kernel symbol mapped to end of page */ ++ p->end = roundup(p->end, page_size); ++ else ++ p->end = c->start; ++ pr_debug4("%s sym:%s end:%#lx\n", __func__, p->name, p->end); ++} +diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c +index 8bb124e55c6d..2c376f5b2120 100644 +--- a/tools/perf/builtin-probe.c ++++ b/tools/perf/builtin-probe.c +@@ -698,6 +698,16 @@ __cmd_probe(int argc, const char **argv) + + ret = perf_add_probe_events(params.events, params.nevents); + if (ret < 0) { ++ ++ /* ++ * When perf_add_probe_events() fails it calls ++ * cleanup_perf_probe_events(pevs, npevs), i.e. ++ * cleanup_perf_probe_events(params.events, params.nevents), which ++ * will call clear_perf_probe_event(), so set nevents to zero ++ * to avoid cleanup_params() to call clear_perf_probe_event() again ++ * on the same pevs. ++ */ ++ params.nevents = 0; + pr_err_with_code(" Error: Failed to add events.", ret); + return ret; + } +diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c +index 61cfd8f70989..4380474c8c35 100644 +--- a/tools/perf/builtin-script.c ++++ b/tools/perf/builtin-script.c +@@ -1057,7 +1057,7 @@ static int perf_sample__fprintf_brstackinsn(struct perf_sample *sample, + + printed += ip__fprintf_sym(ip, thread, x.cpumode, x.cpu, &lastsym, attr, fp); + if (ip == end) { +- printed += ip__fprintf_jump(ip, &br->entries[i], &x, buffer + off, len - off, insn, fp, ++ printed += ip__fprintf_jump(ip, &br->entries[i], &x, buffer + off, len - off, ++insn, fp, + &total_cycles); + if (PRINT_FIELD(SRCCODE)) + printed += print_srccode(thread, x.cpumode, ip); +@@ -3669,7 +3669,8 @@ int cmd_script(int argc, const char **argv) + goto out_delete; + + uname(&uts); +- if (!strcmp(uts.machine, session->header.env.arch) || ++ if (data.is_pipe || /* assume pipe_mode indicates native_arch */ ++ !strcmp(uts.machine, session->header.env.arch) || + (!strcmp(uts.machine, "x86_64") && + !strcmp(session->header.env.arch, "i386"))) + native_arch = true; +diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c +index 1ae66f09dc7d..c6c550dbb947 100644 +--- a/tools/perf/builtin-stat.c ++++ b/tools/perf/builtin-stat.c +@@ -607,7 +607,13 @@ static int __run_perf_stat(int argc, const char **argv, int run_idx) + * group leaders. + */ + read_counters(&(struct timespec) { .tv_nsec = t1-t0 }); +- perf_evlist__close(evsel_list); ++ ++ /* ++ * We need to keep evsel_list alive, because it's processed ++ * later the evsel_list will be closed after. ++ */ ++ if (!STAT_RECORD) ++ perf_evlist__close(evsel_list); + + return WEXITSTATUS(status); + } +@@ -1276,8 +1282,8 @@ static int add_default_attributes(void) + fprintf(stderr, + "Cannot set up top down events %s: %d\n", + str, err); +- free(str); + parse_events_print_error(&errinfo, str); ++ free(str); + return -1; + } + } else { +@@ -1922,6 +1928,7 @@ int cmd_stat(int argc, const char **argv) + perf_session__write_header(perf_stat.session, evsel_list, fd, true); + } + ++ perf_evlist__close(evsel_list); + perf_session__delete(perf_stat.session); + } + +diff --git a/tools/perf/builtin-top.c b/tools/perf/builtin-top.c +index 466621cd1017..8a9ff4b11df0 100644 +--- a/tools/perf/builtin-top.c ++++ b/tools/perf/builtin-top.c +@@ -100,7 +100,7 @@ static void perf_top__resize(struct perf_top *top) + + static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he) + { +- struct perf_evsel *evsel = hists_to_evsel(he->hists); ++ struct perf_evsel *evsel; + struct symbol *sym; + struct annotation *notes; + struct map *map; +@@ -109,6 +109,8 @@ static int perf_top__parse_source(struct perf_top *top, struct hist_entry *he) + if (!he || !he->ms.sym) + return -1; + ++ evsel = hists_to_evsel(he->hists); ++ + sym = he->ms.sym; + map = he->ms.map; + +@@ -225,7 +227,7 @@ static void perf_top__record_precise_ip(struct perf_top *top, + static void perf_top__show_details(struct perf_top *top) + { + struct hist_entry *he = top->sym_filter_entry; +- struct perf_evsel *evsel = hists_to_evsel(he->hists); ++ struct perf_evsel *evsel; + struct annotation *notes; + struct symbol *symbol; + int more; +@@ -233,6 +235,8 @@ static void perf_top__show_details(struct perf_top *top) + if (!he) + return; + ++ evsel = hists_to_evsel(he->hists); ++ + symbol = he->ms.sym; + notes = symbol__annotation(symbol); + +diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c +index 52fadc858ef0..909e68545bb8 100644 +--- a/tools/perf/builtin-trace.c ++++ b/tools/perf/builtin-trace.c +@@ -997,10 +997,10 @@ static struct thread_trace *thread_trace__new(void) + { + struct thread_trace *ttrace = zalloc(sizeof(struct thread_trace)); + +- if (ttrace) ++ if (ttrace) { + ttrace->files.max = -1; +- +- ttrace->syscall_stats = intlist__new(NULL); ++ ttrace->syscall_stats = intlist__new(NULL); ++ } + + return ttrace; + } +diff --git a/tools/perf/builtin-version.c b/tools/perf/builtin-version.c +index f470144d1a70..bf114ca9ca87 100644 +--- a/tools/perf/builtin-version.c ++++ b/tools/perf/builtin-version.c +@@ -19,6 +19,7 @@ static struct version version; + static struct option version_options[] = { + OPT_BOOLEAN(0, "build-options", &version.build_options, + "display the build options"), ++ OPT_END(), + }; + + static const char * const version_usage[] = { +diff --git a/tools/perf/jvmti/libjvmti.c b/tools/perf/jvmti/libjvmti.c +index aea7b1fe85aa..c441a34cb1c0 100644 +--- a/tools/perf/jvmti/libjvmti.c ++++ b/tools/perf/jvmti/libjvmti.c +@@ -1,5 +1,6 @@ + // SPDX-License-Identifier: GPL-2.0 + #include ++#include + #include + #include + #include +@@ -162,8 +163,7 @@ copy_class_filename(const char * class_sign, const char * file_name, char * resu + result[i] = '\0'; + } else { + /* fallback case */ +- size_t file_name_len = strlen(file_name); +- strncpy(result, file_name, file_name_len < max_length ? file_name_len : max_length); ++ strlcpy(result, file_name, max_length); + } + } + +diff --git a/tools/perf/perf.h b/tools/perf/perf.h +index d59dee61b64d..a26555baf692 100644 +--- a/tools/perf/perf.h ++++ b/tools/perf/perf.h +@@ -26,7 +26,7 @@ static inline unsigned long long rdclock(void) + } + + #ifndef MAX_NR_CPUS +-#define MAX_NR_CPUS 1024 ++#define MAX_NR_CPUS 2048 + #endif + + extern const char *input_name; +diff --git a/tools/perf/tests/mmap-thread-lookup.c b/tools/perf/tests/mmap-thread-lookup.c +index ba87e6e8d18c..0a4301a5155c 100644 +--- a/tools/perf/tests/mmap-thread-lookup.c ++++ b/tools/perf/tests/mmap-thread-lookup.c +@@ -53,7 +53,7 @@ static void *thread_fn(void *arg) + { + struct thread_data *td = arg; + ssize_t ret; +- int go; ++ int go = 0; + + if (thread_init(td)) + return NULL; +diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c +index 4a69c07f4101..8f3c80e13584 100644 +--- a/tools/perf/tests/parse-events.c ++++ b/tools/perf/tests/parse-events.c +@@ -18,6 +18,32 @@ + #define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \ + PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD) + ++#if defined(__s390x__) ++/* Return true if kvm module is available and loaded. Test this ++ * and retun success when trace point kvm_s390_create_vm ++ * exists. Otherwise this test always fails. ++ */ ++static bool kvm_s390_create_vm_valid(void) ++{ ++ char *eventfile; ++ bool rc = false; ++ ++ eventfile = get_events_file("kvm-s390"); ++ ++ if (eventfile) { ++ DIR *mydir = opendir(eventfile); ++ ++ if (mydir) { ++ rc = true; ++ closedir(mydir); ++ } ++ put_events_file(eventfile); ++ } ++ ++ return rc; ++} ++#endif ++ + static int test__checkevent_tracepoint(struct perf_evlist *evlist) + { + struct perf_evsel *evsel = perf_evlist__first(evlist); +@@ -1642,6 +1668,7 @@ static struct evlist_test test__events[] = { + { + .name = "kvm-s390:kvm_s390_create_vm", + .check = test__checkevent_tracepoint, ++ .valid = kvm_s390_create_vm_valid, + .id = 100, + }, + #endif +diff --git a/tools/perf/tests/shell/record+probe_libc_inet_pton.sh b/tools/perf/tests/shell/record+probe_libc_inet_pton.sh +index 61c9f8fc6fa1..58a99a292930 100755 +--- a/tools/perf/tests/shell/record+probe_libc_inet_pton.sh ++++ b/tools/perf/tests/shell/record+probe_libc_inet_pton.sh +@@ -44,7 +44,7 @@ trace_libc_inet_pton_backtrace() { + eventattr='max-stack=4' + echo "gaih_inet.*\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected + echo "getaddrinfo\+0x[[:xdigit:]]+[[:space:]]\($libc\)$" >> $expected +- echo ".*\+0x[[:xdigit:]]+[[:space:]]\(.*/bin/ping.*\)$" >> $expected ++ echo ".*(\+0x[[:xdigit:]]+|\[unknown\])[[:space:]]\(.*/bin/ping.*\)$" >> $expected + ;; + *) + eventattr='max-stack=3' +diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c +index 98d934a36d86..b0d089a95dac 100644 +--- a/tools/perf/ui/browsers/annotate.c ++++ b/tools/perf/ui/browsers/annotate.c +@@ -97,11 +97,12 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int + struct annotate_browser *ab = container_of(browser, struct annotate_browser, b); + struct annotation *notes = browser__annotation(browser); + struct annotation_line *al = list_entry(entry, struct annotation_line, node); ++ const bool is_current_entry = ui_browser__is_current_entry(browser, row); + struct annotation_write_ops ops = { + .first_line = row == 0, +- .current_entry = ui_browser__is_current_entry(browser, row), ++ .current_entry = is_current_entry, + .change_color = (!notes->options->hide_src_code && +- (!ops.current_entry || ++ (!is_current_entry || + (browser->use_navkeypressed && + !browser->navkeypressed))), + .width = browser->width, +diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c +index 3421ecbdd3f0..c1dd9b54dc6e 100644 +--- a/tools/perf/ui/browsers/hists.c ++++ b/tools/perf/ui/browsers/hists.c +@@ -638,7 +638,11 @@ int hist_browser__run(struct hist_browser *browser, const char *help, + switch (key) { + case K_TIMER: { + u64 nr_entries; +- hbt->timer(hbt->arg); ++ ++ WARN_ON_ONCE(!hbt); ++ ++ if (hbt) ++ hbt->timer(hbt->arg); + + if (hist_browser__has_filter(browser) || + symbol_conf.report_hierarchy) +@@ -2819,7 +2823,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, + { + struct hists *hists = evsel__hists(evsel); + struct hist_browser *browser = perf_evsel_browser__new(evsel, hbt, env, annotation_opts); +- struct branch_info *bi; ++ struct branch_info *bi = NULL; + #define MAX_OPTIONS 16 + char *options[MAX_OPTIONS]; + struct popup_action actions[MAX_OPTIONS]; +@@ -3085,7 +3089,9 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events, + goto skip_annotation; + + if (sort__mode == SORT_MODE__BRANCH) { +- bi = browser->he_selection->branch_info; ++ ++ if (browser->he_selection) ++ bi = browser->he_selection->branch_info; + + if (bi == NULL) + goto skip_annotation; +@@ -3269,7 +3275,8 @@ static int perf_evsel_menu__run(struct perf_evsel_menu *menu, + + switch (key) { + case K_TIMER: +- hbt->timer(hbt->arg); ++ if (hbt) ++ hbt->timer(hbt->arg); + + if (!menu->lost_events_warned && + menu->lost_events && +diff --git a/tools/perf/ui/libslang.h b/tools/perf/ui/libslang.h +index c0686cda39a5..991e692b9b46 100644 +--- a/tools/perf/ui/libslang.h ++++ b/tools/perf/ui/libslang.h +@@ -10,7 +10,12 @@ + #ifndef HAVE_LONG_LONG + #define HAVE_LONG_LONG __GLIBC_HAVE_LONG_LONG + #endif ++ ++#ifdef HAVE_SLANG_INCLUDE_SUBDIR ++#include ++#else + #include ++#endif + + #if SLANG_VERSION < 20104 + #define slsmg_printf(msg, args...) \ +diff --git a/tools/perf/util/annotate.c b/tools/perf/util/annotate.c +index 79db038b56f2..b8dfcfe08bb1 100644 +--- a/tools/perf/util/annotate.c ++++ b/tools/perf/util/annotate.c +@@ -931,9 +931,8 @@ static int symbol__inc_addr_samples(struct symbol *sym, struct map *map, + if (sym == NULL) + return 0; + src = symbol__hists(sym, evsel->evlist->nr_entries); +- if (src == NULL) +- return -ENOMEM; +- return __symbol__inc_addr_samples(sym, map, src, evsel->idx, addr, sample); ++ return (src) ? __symbol__inc_addr_samples(sym, map, src, evsel->idx, ++ addr, sample) : 0; + } + + static int symbol__account_cycles(u64 addr, u64 start, +@@ -1114,16 +1113,14 @@ static int disasm_line__parse(char *line, const char **namep, char **rawp) + *namep = strdup(name); + + if (*namep == NULL) +- goto out_free_name; ++ goto out; + + (*rawp)[0] = tmp; + *rawp = ltrim(*rawp); + + return 0; + +-out_free_name: +- free((void *)namep); +- *namep = NULL; ++out: + return -1; + } + +diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c +index 66e82bd0683e..cfdbf65f1e02 100644 +--- a/tools/perf/util/auxtrace.c ++++ b/tools/perf/util/auxtrace.c +@@ -1001,7 +1001,8 @@ int itrace_parse_synth_opts(const struct option *opt, const char *str, + } + + if (!str) { +- itrace_synth_opts__set_default(synth_opts, false); ++ itrace_synth_opts__set_default(synth_opts, ++ synth_opts->default_no_sample); + return 0; + } + +diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c +index 4a5947625c5c..b854541604df 100644 +--- a/tools/perf/util/evsel.c ++++ b/tools/perf/util/evsel.c +@@ -589,6 +589,9 @@ const char *perf_evsel__name(struct perf_evsel *evsel) + { + char bf[128]; + ++ if (!evsel) ++ goto out_unknown; ++ + if (evsel->name) + return evsel->name; + +@@ -628,7 +631,10 @@ const char *perf_evsel__name(struct perf_evsel *evsel) + + evsel->name = strdup(bf); + +- return evsel->name ?: "unknown"; ++ if (evsel->name) ++ return evsel->name; ++out_unknown: ++ return "unknown"; + } + + const char *perf_evsel__group_name(struct perf_evsel *evsel) +@@ -1276,6 +1282,7 @@ static void perf_evsel__free_id(struct perf_evsel *evsel) + xyarray__delete(evsel->sample_id); + evsel->sample_id = NULL; + zfree(&evsel->id); ++ evsel->ids = 0; + } + + static void perf_evsel__free_config_terms(struct perf_evsel *evsel) +@@ -2068,6 +2075,7 @@ void perf_evsel__close(struct perf_evsel *evsel) + + perf_evsel__close_fd(evsel); + perf_evsel__free_fd(evsel); ++ perf_evsel__free_id(evsel); + } + + int perf_evsel__open_per_cpu(struct perf_evsel *evsel, +diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c +index 847ae51a524b..e84b70be3fc1 100644 +--- a/tools/perf/util/header.c ++++ b/tools/perf/util/header.c +@@ -1100,7 +1100,7 @@ static int build_caches(struct cpu_cache_level caches[], u32 size, u32 *cntp) + return 0; + } + +-#define MAX_CACHES 2000 ++#define MAX_CACHES (MAX_NR_CPUS * 4) + + static int write_cache(struct feat_fd *ff, + struct perf_evlist *evlist __maybe_unused) +@@ -3602,6 +3602,7 @@ int perf_event__synthesize_features(struct perf_tool *tool, + return -ENOMEM; + + ff.size = sz - sz_hdr; ++ ff.ph = &session->header; + + for_each_set_bit(feat, header->adds_features, HEADER_FEAT_BITS) { + if (!feat_ops[feat].synthesize) { +@@ -3665,7 +3666,7 @@ int perf_event__process_feature(struct perf_session *session, + return 0; + + ff.buf = (void *)fe->data; +- ff.size = event->header.size - sizeof(event->header); ++ ff.size = event->header.size - sizeof(*fe); + ff.ph = &session->header; + + if (feat_ops[feat].process(&ff, NULL)) +diff --git a/tools/perf/util/intel-bts.c b/tools/perf/util/intel-bts.c +index e32dbffebb2f..625ad3639a7e 100644 +--- a/tools/perf/util/intel-bts.c ++++ b/tools/perf/util/intel-bts.c +@@ -891,13 +891,12 @@ int intel_bts_process_auxtrace_info(union perf_event *event, + if (dump_trace) + return 0; + +- if (session->itrace_synth_opts && session->itrace_synth_opts->set) { ++ if (session->itrace_synth_opts->set) { + bts->synth_opts = *session->itrace_synth_opts; + } else { + itrace_synth_opts__set_default(&bts->synth_opts, + session->itrace_synth_opts->default_no_sample); +- if (session->itrace_synth_opts) +- bts->synth_opts.thread_stack = ++ bts->synth_opts.thread_stack = + session->itrace_synth_opts->thread_stack; + } + +diff --git a/tools/perf/util/intel-pt.c b/tools/perf/util/intel-pt.c +index d6f1b2a03f9b..f7dd4657535d 100644 +--- a/tools/perf/util/intel-pt.c ++++ b/tools/perf/util/intel-pt.c +@@ -2579,7 +2579,8 @@ int intel_pt_process_auxtrace_info(union perf_event *event, + } else { + itrace_synth_opts__set_default(&pt->synth_opts, + session->itrace_synth_opts->default_no_sample); +- if (use_browser != -1) { ++ if (!session->itrace_synth_opts->default_no_sample && ++ !session->itrace_synth_opts->inject) { + pt->synth_opts.branches = false; + pt->synth_opts.callchain = true; + } +diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c +index dc7aafe45a2b..081fe4bdebaa 100644 +--- a/tools/perf/util/machine.c ++++ b/tools/perf/util/machine.c +@@ -1365,6 +1365,7 @@ static int machine__set_modules_path(struct machine *machine) + return map_groups__set_modules_path_dir(&machine->kmaps, modules_path, 0); + } + int __weak arch__fix_module_text_start(u64 *start __maybe_unused, ++ u64 *size __maybe_unused, + const char *name __maybe_unused) + { + return 0; +@@ -1376,7 +1377,7 @@ static int machine__create_module(void *arg, const char *name, u64 start, + struct machine *machine = arg; + struct map *map; + +- if (arch__fix_module_text_start(&start, name) < 0) ++ if (arch__fix_module_text_start(&start, &size, name) < 0) + return -1; + + map = machine__findnew_module_map(machine, start, name); +diff --git a/tools/perf/util/machine.h b/tools/perf/util/machine.h +index f70ab98a7bde..7aa38da26427 100644 +--- a/tools/perf/util/machine.h ++++ b/tools/perf/util/machine.h +@@ -222,7 +222,7 @@ struct symbol *machine__find_kernel_symbol_by_name(struct machine *machine, + + struct map *machine__findnew_module_map(struct machine *machine, u64 start, + const char *filename); +-int arch__fix_module_text_start(u64 *start, const char *name); ++int arch__fix_module_text_start(u64 *start, u64 *size, const char *name); + + int machine__load_kallsyms(struct machine *machine, const char *filename); + +diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c +index ee71efb9db62..9c81ee092784 100644 +--- a/tools/perf/util/map.c ++++ b/tools/perf/util/map.c +@@ -470,8 +470,11 @@ int map__fprintf_srccode(struct map *map, u64 addr, + goto out_free_line; + + ret = fprintf(fp, "|%-8d %.*s", line, len, srccode); +- state->srcfile = srcfile; +- state->line = line; ++ ++ if (state) { ++ state->srcfile = srcfile; ++ state->line = line; ++ } + return ret; + + out_free_line: +diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c +index 699e020737d9..fabdb6dde88e 100644 +--- a/tools/perf/util/metricgroup.c ++++ b/tools/perf/util/metricgroup.c +@@ -85,26 +85,49 @@ struct egroup { + const char *metric_expr; + }; + +-static struct perf_evsel *find_evsel(struct perf_evlist *perf_evlist, +- const char **ids, +- int idnum, +- struct perf_evsel **metric_events) ++static bool record_evsel(int *ind, struct perf_evsel **start, ++ int idnum, ++ struct perf_evsel **metric_events, ++ struct perf_evsel *ev) ++{ ++ metric_events[*ind] = ev; ++ if (*ind == 0) ++ *start = ev; ++ if (++*ind == idnum) { ++ metric_events[*ind] = NULL; ++ return true; ++ } ++ return false; ++} ++ ++static struct perf_evsel *find_evsel_group(struct perf_evlist *perf_evlist, ++ const char **ids, ++ int idnum, ++ struct perf_evsel **metric_events) + { + struct perf_evsel *ev, *start = NULL; + int ind = 0; + + evlist__for_each_entry (perf_evlist, ev) { ++ if (ev->collect_stat) ++ continue; + if (!strcmp(ev->name, ids[ind])) { +- metric_events[ind] = ev; +- if (ind == 0) +- start = ev; +- if (++ind == idnum) { +- metric_events[ind] = NULL; ++ if (record_evsel(&ind, &start, idnum, ++ metric_events, ev)) + return start; +- } + } else { ++ /* ++ * We saw some other event that is not ++ * in our list of events. Discard ++ * the whole match and start again. ++ */ + ind = 0; + start = NULL; ++ if (!strcmp(ev->name, ids[ind])) { ++ if (record_evsel(&ind, &start, idnum, ++ metric_events, ev)) ++ return start; ++ } + } + } + /* +@@ -134,8 +157,8 @@ static int metricgroup__setup_events(struct list_head *groups, + ret = -ENOMEM; + break; + } +- evsel = find_evsel(perf_evlist, eg->ids, eg->idnum, +- metric_events); ++ evsel = find_evsel_group(perf_evlist, eg->ids, eg->idnum, ++ metric_events); + if (!evsel) { + pr_debug("Cannot resolve %s: %s\n", + eg->metric_name, eg->metric_expr); +diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c +index e0429f4ef335..faa8eb231e1b 100644 +--- a/tools/perf/util/pmu.c ++++ b/tools/perf/util/pmu.c +@@ -709,9 +709,7 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu) + { + int i; + struct pmu_events_map *map; +- struct pmu_event *pe; + const char *name = pmu->name; +- const char *pname; + + map = perf_pmu__find_map(pmu); + if (!map) +@@ -722,28 +720,26 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu) + */ + i = 0; + while (1) { ++ const char *cpu_name = is_arm_pmu_core(name) ? name : "cpu"; ++ struct pmu_event *pe = &map->table[i++]; ++ const char *pname = pe->pmu ? pe->pmu : cpu_name; + +- pe = &map->table[i++]; + if (!pe->name) { + if (pe->metric_group || pe->metric_name) + continue; + break; + } + +- if (!is_arm_pmu_core(name)) { +- pname = pe->pmu ? pe->pmu : "cpu"; +- +- /* +- * uncore alias may be from different PMU +- * with common prefix +- */ +- if (pmu_is_uncore(name) && +- !strncmp(pname, name, strlen(pname))) +- goto new_alias; ++ /* ++ * uncore alias may be from different PMU ++ * with common prefix ++ */ ++ if (pmu_is_uncore(name) && ++ !strncmp(pname, name, strlen(pname))) ++ goto new_alias; + +- if (strcmp(pname, name)) +- continue; +- } ++ if (strcmp(pname, name)) ++ continue; + + new_alias: + /* need type casts to override 'const' */ +diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c +index 54cf163347f7..d78984096044 100644 +--- a/tools/perf/util/session.c ++++ b/tools/perf/util/session.c +@@ -36,10 +36,16 @@ static int perf_session__process_compressed_event(struct perf_session *session, + void *src; + size_t decomp_size, src_size; + u64 decomp_last_rem = 0; +- size_t decomp_len = session->header.env.comp_mmap_len; ++ size_t mmap_len, decomp_len = session->header.env.comp_mmap_len; + struct decomp *decomp, *decomp_last = session->decomp_last; + +- decomp = mmap(NULL, sizeof(struct decomp) + decomp_len, PROT_READ|PROT_WRITE, ++ if (decomp_last) { ++ decomp_last_rem = decomp_last->size - decomp_last->head; ++ decomp_len += decomp_last_rem; ++ } ++ ++ mmap_len = sizeof(struct decomp) + decomp_len; ++ decomp = mmap(NULL, mmap_len, PROT_READ|PROT_WRITE, + MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + if (decomp == MAP_FAILED) { + pr_err("Couldn't allocate memory for decompression\n"); +@@ -47,10 +53,10 @@ static int perf_session__process_compressed_event(struct perf_session *session, + } + + decomp->file_pos = file_offset; ++ decomp->mmap_len = mmap_len; + decomp->head = 0; + +- if (decomp_last) { +- decomp_last_rem = decomp_last->size - decomp_last->head; ++ if (decomp_last_rem) { + memcpy(decomp->data, &(decomp_last->data[decomp_last->head]), decomp_last_rem); + decomp->size = decomp_last_rem; + } +@@ -61,7 +67,7 @@ static int perf_session__process_compressed_event(struct perf_session *session, + decomp_size = zstd_decompress_stream(&(session->zstd_data), src, src_size, + &(decomp->data[decomp_last_rem]), decomp_len - decomp_last_rem); + if (!decomp_size) { +- munmap(decomp, sizeof(struct decomp) + decomp_len); ++ munmap(decomp, mmap_len); + pr_err("Couldn't decompress data\n"); + return -1; + } +@@ -255,15 +261,15 @@ static void perf_session__delete_threads(struct perf_session *session) + static void perf_session__release_decomp_events(struct perf_session *session) + { + struct decomp *next, *decomp; +- size_t decomp_len; ++ size_t mmap_len; + next = session->decomp; +- decomp_len = session->header.env.comp_mmap_len; + do { + decomp = next; + if (decomp == NULL) + break; + next = decomp->next; +- munmap(decomp, decomp_len + sizeof(struct decomp)); ++ mmap_len = decomp->mmap_len; ++ munmap(decomp, mmap_len); + } while (1); + } + +@@ -1249,6 +1255,9 @@ static void dump_read(struct perf_evsel *evsel, union perf_event *event) + evsel ? perf_evsel__name(evsel) : "FAIL", + event->read.value); + ++ if (!evsel) ++ return; ++ + read_format = evsel->attr.read_format; + + if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED) +diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h +index dd8920b745bc..863dbad87849 100644 +--- a/tools/perf/util/session.h ++++ b/tools/perf/util/session.h +@@ -46,6 +46,7 @@ struct perf_session { + struct decomp { + struct decomp *next; + u64 file_pos; ++ size_t mmap_len; + u64 head; + size_t size; + char data[]; +diff --git a/tools/perf/util/stat-display.c b/tools/perf/util/stat-display.c +index 4c53bae5644b..94bed4031def 100644 +--- a/tools/perf/util/stat-display.c ++++ b/tools/perf/util/stat-display.c +@@ -542,7 +542,8 @@ static void collect_all_aliases(struct perf_stat_config *config, struct perf_evs + alias->scale != counter->scale || + alias->cgrp != counter->cgrp || + strcmp(alias->unit, counter->unit) || +- perf_evsel__is_clock(alias) != perf_evsel__is_clock(counter)) ++ perf_evsel__is_clock(alias) != perf_evsel__is_clock(counter) || ++ !strcmp(alias->pmu_name, counter->pmu_name)) + break; + alias->merged_stat = true; + cb(config, alias, data, false); +diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c +index 83d8094be4fe..0ef98e991ade 100644 +--- a/tools/perf/util/stat-shadow.c ++++ b/tools/perf/util/stat-shadow.c +@@ -303,7 +303,7 @@ static struct perf_evsel *perf_stat__find_event(struct perf_evlist *evsel_list, + struct perf_evsel *c2; + + evlist__for_each_entry (evsel_list, c2) { +- if (!strcasecmp(c2->name, name)) ++ if (!strcasecmp(c2->name, name) && !c2->collect_stat) + return c2; + } + return NULL; +@@ -342,7 +342,8 @@ void perf_stat__collect_metric_expr(struct perf_evlist *evsel_list) + if (leader) { + /* Search in group */ + for_each_group_member (oc, leader) { +- if (!strcasecmp(oc->name, metric_names[i])) { ++ if (!strcasecmp(oc->name, metric_names[i]) && ++ !oc->collect_stat) { + found = true; + break; + } +@@ -722,6 +723,7 @@ static void generic_metric(struct perf_stat_config *config, + double ratio; + int i; + void *ctxp = out->ctx; ++ char *n, *pn; + + expr__ctx_init(&pctx); + expr__add_id(&pctx, name, avg); +@@ -741,7 +743,19 @@ static void generic_metric(struct perf_stat_config *config, + stats = &v->stats; + scale = 1.0; + } +- expr__add_id(&pctx, metric_events[i]->name, avg_stats(stats)*scale); ++ ++ n = strdup(metric_events[i]->name); ++ if (!n) ++ return; ++ /* ++ * This display code with --no-merge adds [cpu] postfixes. ++ * These are not supported by the parser. Remove everything ++ * after the space. ++ */ ++ pn = strchr(n, ' '); ++ if (pn) ++ *pn = 0; ++ expr__add_id(&pctx, n, avg_stats(stats)*scale); + } + if (!metric_events[i]) { + const char *p = metric_expr; +@@ -758,6 +772,9 @@ static void generic_metric(struct perf_stat_config *config, + (metric_name ? metric_name : name) : "", 0); + } else + print_metric(config, ctxp, NULL, NULL, "", 0); ++ ++ for (i = 1; i < pctx.num_ids; i++) ++ free((void *)pctx.ids[i].name); + } + + void perf_stat__print_shadow_stats(struct perf_stat_config *config, +diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c +index 5cbad55cd99d..3b49eb4e3ed9 100644 +--- a/tools/perf/util/symbol.c ++++ b/tools/perf/util/symbol.c +@@ -91,6 +91,11 @@ static int prefix_underscores_count(const char *str) + return tail - str; + } + ++void __weak arch__symbols__fixup_end(struct symbol *p, struct symbol *c) ++{ ++ p->end = c->start; ++} ++ + const char * __weak arch__normalize_symbol_name(const char *name) + { + return name; +@@ -217,7 +222,7 @@ void symbols__fixup_end(struct rb_root_cached *symbols) + curr = rb_entry(nd, struct symbol, rb_node); + + if (prev->end == prev->start && prev->end != curr->start) +- prev->end = curr->start; ++ arch__symbols__fixup_end(prev, curr); + } + + /* Last entry */ +diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h +index 9a8fe012910a..f30ab608ea54 100644 +--- a/tools/perf/util/symbol.h ++++ b/tools/perf/util/symbol.h +@@ -277,6 +277,7 @@ const char *arch__normalize_symbol_name(const char *name); + #define SYMBOL_A 0 + #define SYMBOL_B 1 + ++void arch__symbols__fixup_end(struct symbol *p, struct symbol *c); + int arch__compare_symbol_names(const char *namea, const char *nameb); + int arch__compare_symbol_names_n(const char *namea, const char *nameb, + unsigned int n); +diff --git a/tools/perf/util/thread-stack.c b/tools/perf/util/thread-stack.c +index 4ba9e866b076..60c9d955c4d7 100644 +--- a/tools/perf/util/thread-stack.c ++++ b/tools/perf/util/thread-stack.c +@@ -616,6 +616,23 @@ static int thread_stack__bottom(struct thread_stack *ts, + true, false); + } + ++static int thread_stack__pop_ks(struct thread *thread, struct thread_stack *ts, ++ struct perf_sample *sample, u64 ref) ++{ ++ u64 tm = sample->time; ++ int err; ++ ++ /* Return to userspace, so pop all kernel addresses */ ++ while (thread_stack__in_kernel(ts)) { ++ err = thread_stack__call_return(thread, ts, --ts->cnt, ++ tm, ref, true); ++ if (err) ++ return err; ++ } ++ ++ return 0; ++} ++ + static int thread_stack__no_call_return(struct thread *thread, + struct thread_stack *ts, + struct perf_sample *sample, +@@ -896,7 +913,18 @@ int thread_stack__process(struct thread *thread, struct comm *comm, + ts->rstate = X86_RETPOLINE_DETECTED; + + } else if (sample->flags & PERF_IP_FLAG_RETURN) { +- if (!sample->ip || !sample->addr) ++ if (!sample->addr) { ++ u32 return_from_kernel = PERF_IP_FLAG_SYSCALLRET | ++ PERF_IP_FLAG_INTERRUPT; ++ ++ if (!(sample->flags & return_from_kernel)) ++ return 0; ++ ++ /* Pop kernel stack */ ++ return thread_stack__pop_ks(thread, ts, sample, ref); ++ } ++ ++ if (!sample->ip) + return 0; + + /* x86 retpoline 'return' doesn't match the stack */ +diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c +index b413ba5b9835..4a9f88d9b7ab 100644 +--- a/tools/perf/util/thread.c ++++ b/tools/perf/util/thread.c +@@ -197,14 +197,24 @@ struct comm *thread__comm(const struct thread *thread) + + struct comm *thread__exec_comm(const struct thread *thread) + { +- struct comm *comm, *last = NULL; ++ struct comm *comm, *last = NULL, *second_last = NULL; + + list_for_each_entry(comm, &thread->comm_list, list) { + if (comm->exec) + return comm; ++ second_last = last; + last = comm; + } + ++ /* ++ * 'last' with no start time might be the parent's comm of a synthesized ++ * thread (created by processing a synthesized fork event). For a main ++ * thread, that is very probably wrong. Prefer a later comm to avoid ++ * that case. ++ */ ++ if (second_last && !last->start && thread->pid_ == thread->tid) ++ return second_last; ++ + return last; + } + +diff --git a/tools/perf/util/zstd.c b/tools/perf/util/zstd.c +index 23bdb9884576..d2202392ffdb 100644 +--- a/tools/perf/util/zstd.c ++++ b/tools/perf/util/zstd.c +@@ -99,8 +99,8 @@ size_t zstd_decompress_stream(struct zstd_data *data, void *src, size_t src_size + while (input.pos < input.size) { + ret = ZSTD_decompressStream(data->dstream, &output, &input); + if (ZSTD_isError(ret)) { +- pr_err("failed to decompress (B): %ld -> %ld : %s\n", +- src_size, output.size, ZSTD_getErrorName(ret)); ++ pr_err("failed to decompress (B): %ld -> %ld, dst_size %ld : %s\n", ++ src_size, output.size, dst_size, ZSTD_getErrorName(ret)); + break; + } + output.dst = dst + output.pos; +diff --git a/tools/power/cpupower/utils/cpufreq-set.c b/tools/power/cpupower/utils/cpufreq-set.c +index f49bc4aa2a08..6ed82fba5aaa 100644 +--- a/tools/power/cpupower/utils/cpufreq-set.c ++++ b/tools/power/cpupower/utils/cpufreq-set.c +@@ -305,6 +305,8 @@ int cmd_freq_set(int argc, char **argv) + bitmask_setbit(cpus_chosen, cpus->cpu); + cpus = cpus->next; + } ++ /* Set the last cpu in related cpus list */ ++ bitmask_setbit(cpus_chosen, cpus->cpu); + cpufreq_put_related_cpus(cpus); + } + } +diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile +index e36356e2377e..b9e88ccc289b 100644 +--- a/tools/testing/selftests/bpf/Makefile ++++ b/tools/testing/selftests/bpf/Makefile +@@ -1,4 +1,5 @@ + # SPDX-License-Identifier: GPL-2.0 ++include ../../../../scripts/Kbuild.include + + LIBDIR := ../../../lib + BPFDIR := $(LIBDIR)/bpf +@@ -50,7 +51,8 @@ TEST_PROGS := test_kmod.sh \ + test_lirc_mode2.sh \ + test_skb_cgroup_id.sh \ + test_flow_dissector.sh \ +- test_xdp_vlan.sh \ ++ test_xdp_vlan_mode_generic.sh \ ++ test_xdp_vlan_mode_native.sh \ + test_lwt_ip_encap.sh \ + test_tcp_check_syncookie.sh \ + test_tc_tunnel.sh \ +@@ -185,8 +187,8 @@ $(ALU32_BUILD_DIR)/test_progs_32: prog_tests/*.c + + $(ALU32_BUILD_DIR)/%.o: progs/%.c $(ALU32_BUILD_DIR) \ + $(ALU32_BUILD_DIR)/test_progs_32 +- $(CLANG) $(CLANG_FLAGS) \ +- -O2 -target bpf -emit-llvm -c $< -o - | \ ++ ($(CLANG) $(CLANG_FLAGS) -O2 -target bpf -emit-llvm -c $< -o - || \ ++ echo "clang failed") | \ + $(LLC) -march=bpf -mattr=+alu32 -mcpu=$(CPU) $(LLC_FLAGS) \ + -filetype=obj -o $@ + ifeq ($(DWARF2BTF),y) +@@ -197,16 +199,16 @@ endif + # Have one program compiled without "-target bpf" to test whether libbpf loads + # it successfully + $(OUTPUT)/test_xdp.o: progs/test_xdp.c +- $(CLANG) $(CLANG_FLAGS) \ +- -O2 -emit-llvm -c $< -o - | \ ++ ($(CLANG) $(CLANG_FLAGS) -O2 -emit-llvm -c $< -o - || \ ++ echo "clang failed") | \ + $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ + ifeq ($(DWARF2BTF),y) + $(BTF_PAHOLE) -J $@ + endif + + $(OUTPUT)/%.o: progs/%.c +- $(CLANG) $(CLANG_FLAGS) \ +- -O2 -target bpf -emit-llvm -c $< -o - | \ ++ ($(CLANG) $(CLANG_FLAGS) -O2 -target bpf -emit-llvm -c $< -o - || \ ++ echo "clang failed") | \ + $(LLC) -march=bpf -mcpu=$(CPU) $(LLC_FLAGS) -filetype=obj -o $@ + ifeq ($(DWARF2BTF),y) + $(BTF_PAHOLE) -J $@ +@@ -275,4 +277,5 @@ $(OUTPUT)/verifier/tests.h: $(VERIFIER_TESTS_DIR) $(VERIFIER_TEST_FILES) + ) > $(VERIFIER_TESTS_H)) + + EXTRA_CLEAN := $(TEST_CUSTOM_PROGS) $(ALU32_BUILD_DIR) \ +- $(VERIFIER_TESTS_H) $(PROG_TESTS_H) $(MAP_TESTS_H) ++ $(VERIFIER_TESTS_H) $(PROG_TESTS_H) $(MAP_TESTS_H) \ ++ feature +diff --git a/tools/testing/selftests/bpf/progs/test_lwt_seg6local.c b/tools/testing/selftests/bpf/progs/test_lwt_seg6local.c +index 0575751bc1bc..e2f6ed0a583d 100644 +--- a/tools/testing/selftests/bpf/progs/test_lwt_seg6local.c ++++ b/tools/testing/selftests/bpf/progs/test_lwt_seg6local.c +@@ -61,7 +61,7 @@ struct sr6_tlv_t { + unsigned char value[0]; + } BPF_PACKET_HEADER; + +-__attribute__((always_inline)) struct ip6_srh_t *get_srh(struct __sk_buff *skb) ++static __always_inline struct ip6_srh_t *get_srh(struct __sk_buff *skb) + { + void *cursor, *data_end; + struct ip6_srh_t *srh; +@@ -95,7 +95,7 @@ __attribute__((always_inline)) struct ip6_srh_t *get_srh(struct __sk_buff *skb) + return srh; + } + +-__attribute__((always_inline)) ++static __always_inline + int update_tlv_pad(struct __sk_buff *skb, uint32_t new_pad, + uint32_t old_pad, uint32_t pad_off) + { +@@ -125,7 +125,7 @@ int update_tlv_pad(struct __sk_buff *skb, uint32_t new_pad, + return 0; + } + +-__attribute__((always_inline)) ++static __always_inline + int is_valid_tlv_boundary(struct __sk_buff *skb, struct ip6_srh_t *srh, + uint32_t *tlv_off, uint32_t *pad_size, + uint32_t *pad_off) +@@ -184,7 +184,7 @@ int is_valid_tlv_boundary(struct __sk_buff *skb, struct ip6_srh_t *srh, + return 0; + } + +-__attribute__((always_inline)) ++static __always_inline + int add_tlv(struct __sk_buff *skb, struct ip6_srh_t *srh, uint32_t tlv_off, + struct sr6_tlv_t *itlv, uint8_t tlv_size) + { +@@ -228,7 +228,7 @@ int add_tlv(struct __sk_buff *skb, struct ip6_srh_t *srh, uint32_t tlv_off, + return update_tlv_pad(skb, new_pad, pad_size, pad_off); + } + +-__attribute__((always_inline)) ++static __always_inline + int delete_tlv(struct __sk_buff *skb, struct ip6_srh_t *srh, + uint32_t tlv_off) + { +@@ -266,7 +266,7 @@ int delete_tlv(struct __sk_buff *skb, struct ip6_srh_t *srh, + return update_tlv_pad(skb, new_pad, pad_size, pad_off); + } + +-__attribute__((always_inline)) ++static __always_inline + int has_egr_tlv(struct __sk_buff *skb, struct ip6_srh_t *srh) + { + int tlv_offset = sizeof(struct ip6_t) + sizeof(struct ip6_srh_t) + +diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c +index 288cb740e005..6438d4dc8ae1 100644 +--- a/tools/testing/selftests/bpf/test_verifier.c ++++ b/tools/testing/selftests/bpf/test_verifier.c +@@ -207,33 +207,35 @@ static void bpf_fill_rand_ld_dw(struct bpf_test *self) + self->retval = (uint32_t)res; + } + +-/* test the sequence of 1k jumps */ ++#define MAX_JMP_SEQ 8192 ++ ++/* test the sequence of 8k jumps */ + static void bpf_fill_scale1(struct bpf_test *self) + { + struct bpf_insn *insn = self->fill_insns; + int i = 0, k = 0; + + insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); +- /* test to check that the sequence of 1024 jumps is acceptable */ +- while (k++ < 1024) { ++ /* test to check that the long sequence of jumps is acceptable */ ++ while (k++ < MAX_JMP_SEQ) { + insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, + BPF_FUNC_get_prandom_u32); +- insn[i++] = BPF_JMP_IMM(BPF_JGT, BPF_REG_0, bpf_semi_rand_get(), 2); ++ insn[i++] = BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, bpf_semi_rand_get(), 2); + insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_10); + insn[i++] = BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, + -8 * (k % 64 + 1)); + } +- /* every jump adds 1024 steps to insn_processed, so to stay exactly +- * within 1m limit add MAX_TEST_INSNS - 1025 MOVs and 1 EXIT ++ /* every jump adds 1 step to insn_processed, so to stay exactly ++ * within 1m limit add MAX_TEST_INSNS - MAX_JMP_SEQ - 1 MOVs and 1 EXIT + */ +- while (i < MAX_TEST_INSNS - 1025) ++ while (i < MAX_TEST_INSNS - MAX_JMP_SEQ - 1) + insn[i++] = BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 42); + insn[i] = BPF_EXIT_INSN(); + self->prog_len = i + 1; + self->retval = 42; + } + +-/* test the sequence of 1k jumps in inner most function (function depth 8)*/ ++/* test the sequence of 8k jumps in inner most function (function depth 8)*/ + static void bpf_fill_scale2(struct bpf_test *self) + { + struct bpf_insn *insn = self->fill_insns; +@@ -245,19 +247,20 @@ static void bpf_fill_scale2(struct bpf_test *self) + insn[i++] = BPF_EXIT_INSN(); + } + insn[i++] = BPF_MOV64_REG(BPF_REG_6, BPF_REG_1); +- /* test to check that the sequence of 1024 jumps is acceptable */ +- while (k++ < 1024) { ++ /* test to check that the long sequence of jumps is acceptable */ ++ k = 0; ++ while (k++ < MAX_JMP_SEQ) { + insn[i++] = BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, + BPF_FUNC_get_prandom_u32); +- insn[i++] = BPF_JMP_IMM(BPF_JGT, BPF_REG_0, bpf_semi_rand_get(), 2); ++ insn[i++] = BPF_JMP_IMM(BPF_JEQ, BPF_REG_0, bpf_semi_rand_get(), 2); + insn[i++] = BPF_MOV64_REG(BPF_REG_1, BPF_REG_10); + insn[i++] = BPF_STX_MEM(BPF_DW, BPF_REG_1, BPF_REG_6, + -8 * (k % (64 - 4 * FUNC_NEST) + 1)); + } +- /* every jump adds 1024 steps to insn_processed, so to stay exactly +- * within 1m limit add MAX_TEST_INSNS - 1025 MOVs and 1 EXIT ++ /* every jump adds 1 step to insn_processed, so to stay exactly ++ * within 1m limit add MAX_TEST_INSNS - MAX_JMP_SEQ - 1 MOVs and 1 EXIT + */ +- while (i < MAX_TEST_INSNS - 1025) ++ while (i < MAX_TEST_INSNS - MAX_JMP_SEQ - 1) + insn[i++] = BPF_ALU32_IMM(BPF_MOV, BPF_REG_0, 42); + insn[i] = BPF_EXIT_INSN(); + self->prog_len = i + 1; +diff --git a/tools/testing/selftests/bpf/test_xdp_vlan.sh b/tools/testing/selftests/bpf/test_xdp_vlan.sh +index 51a3a31d1aac..bb8b0da91686 100755 +--- a/tools/testing/selftests/bpf/test_xdp_vlan.sh ++++ b/tools/testing/selftests/bpf/test_xdp_vlan.sh +@@ -1,6 +1,14 @@ + #!/bin/bash ++# SPDX-License-Identifier: GPL-2.0 ++# Author: Jesper Dangaard Brouer + +-TESTNAME=xdp_vlan ++# Allow wrapper scripts to name test ++if [ -z "$TESTNAME" ]; then ++ TESTNAME=xdp_vlan ++fi ++ ++# Default XDP mode ++XDP_MODE=xdpgeneric + + usage() { + echo "Testing XDP + TC eBPF VLAN manipulations: $TESTNAME" +@@ -9,9 +17,23 @@ usage() { + echo " -v | --verbose : Verbose" + echo " --flush : Flush before starting (e.g. after --interactive)" + echo " --interactive : Keep netns setup running after test-run" ++ echo " --mode=XXX : Choose XDP mode (xdp | xdpgeneric | xdpdrv)" + echo "" + } + ++valid_xdp_mode() ++{ ++ local mode=$1 ++ ++ case "$mode" in ++ xdpgeneric | xdpdrv | xdp) ++ return 0 ++ ;; ++ *) ++ return 1 ++ esac ++} ++ + cleanup() + { + local status=$? +@@ -37,7 +59,7 @@ cleanup() + + # Using external program "getopt" to get --long-options + OPTIONS=$(getopt -o hvfi: \ +- --long verbose,flush,help,interactive,debug -- "$@") ++ --long verbose,flush,help,interactive,debug,mode: -- "$@") + if (( $? != 0 )); then + usage + echo "selftests: $TESTNAME [FAILED] Error calling getopt, unknown option?" +@@ -60,6 +82,11 @@ while true; do + cleanup + shift + ;; ++ --mode ) ++ shift ++ XDP_MODE=$1 ++ shift ++ ;; + -- ) + shift + break +@@ -81,8 +108,14 @@ if [ "$EUID" -ne 0 ]; then + exit 1 + fi + +-ip link set dev lo xdp off 2>/dev/null > /dev/null +-if [ $? -ne 0 ];then ++valid_xdp_mode $XDP_MODE ++if [ $? -ne 0 ]; then ++ echo "selftests: $TESTNAME [FAILED] unknown XDP mode ($XDP_MODE)" ++ exit 1 ++fi ++ ++ip link set dev lo xdpgeneric off 2>/dev/null > /dev/null ++if [ $? -ne 0 ]; then + echo "selftests: $TESTNAME [SKIP] need ip xdp support" + exit 0 + fi +@@ -155,7 +188,7 @@ ip netns exec ns2 ip link set lo up + # At this point, the hosts cannot reach each-other, + # because ns2 are using VLAN tags on the packets. + +-ip netns exec ns2 sh -c 'ping -W 1 -c 1 100.64.41.1 || echo "Okay ping fails"' ++ip netns exec ns2 sh -c 'ping -W 1 -c 1 100.64.41.1 || echo "Success: First ping must fail"' + + + # Now we can use the test_xdp_vlan.c program to pop/push these VLAN tags +@@ -166,7 +199,7 @@ export FILE=test_xdp_vlan.o + + # First test: Remove VLAN by setting VLAN ID 0, using "xdp_vlan_change" + export XDP_PROG=xdp_vlan_change +-ip netns exec ns1 ip link set $DEVNS1 xdp object $FILE section $XDP_PROG ++ip netns exec ns1 ip link set $DEVNS1 $XDP_MODE object $FILE section $XDP_PROG + + # In ns1: egress use TC to add back VLAN tag 4011 + # (del cmd) +@@ -177,8 +210,8 @@ ip netns exec ns1 tc filter add dev $DEVNS1 egress \ + prio 1 handle 1 bpf da obj $FILE sec tc_vlan_push + + # Now the namespaces can reach each-other, test with ping: +-ip netns exec ns2 ping -W 2 -c 3 $IPADDR1 +-ip netns exec ns1 ping -W 2 -c 3 $IPADDR2 ++ip netns exec ns2 ping -i 0.2 -W 2 -c 2 $IPADDR1 ++ip netns exec ns1 ping -i 0.2 -W 2 -c 2 $IPADDR2 + + # Second test: Replace xdp prog, that fully remove vlan header + # +@@ -187,9 +220,9 @@ ip netns exec ns1 ping -W 2 -c 3 $IPADDR2 + # ETH_P_8021Q indication, and this cause overwriting of our changes. + # + export XDP_PROG=xdp_vlan_remove_outer2 +-ip netns exec ns1 ip link set $DEVNS1 xdp off +-ip netns exec ns1 ip link set $DEVNS1 xdp object $FILE section $XDP_PROG ++ip netns exec ns1 ip link set $DEVNS1 $XDP_MODE off ++ip netns exec ns1 ip link set $DEVNS1 $XDP_MODE object $FILE section $XDP_PROG + + # Now the namespaces should still be able reach each-other, test with ping: +-ip netns exec ns2 ping -W 2 -c 3 $IPADDR1 +-ip netns exec ns1 ping -W 2 -c 3 $IPADDR2 ++ip netns exec ns2 ping -i 0.2 -W 2 -c 2 $IPADDR1 ++ip netns exec ns1 ping -i 0.2 -W 2 -c 2 $IPADDR2 +diff --git a/tools/testing/selftests/bpf/test_xdp_vlan_mode_generic.sh b/tools/testing/selftests/bpf/test_xdp_vlan_mode_generic.sh +new file mode 100644 +index 000000000000..c515326d6d59 +--- /dev/null ++++ b/tools/testing/selftests/bpf/test_xdp_vlan_mode_generic.sh +@@ -0,0 +1,9 @@ ++#!/bin/bash ++# SPDX-License-Identifier: GPL-2.0 ++ ++# Exit on failure ++set -e ++ ++# Wrapper script to test generic-XDP ++export TESTNAME=xdp_vlan_mode_generic ++./test_xdp_vlan.sh --mode=xdpgeneric +diff --git a/tools/testing/selftests/bpf/test_xdp_vlan_mode_native.sh b/tools/testing/selftests/bpf/test_xdp_vlan_mode_native.sh +new file mode 100644 +index 000000000000..5cf7ce1f16c1 +--- /dev/null ++++ b/tools/testing/selftests/bpf/test_xdp_vlan_mode_native.sh +@@ -0,0 +1,9 @@ ++#!/bin/bash ++# SPDX-License-Identifier: GPL-2.0 ++ ++# Exit on failure ++set -e ++ ++# Wrapper script to test native-XDP ++export TESTNAME=xdp_vlan_mode_native ++./test_xdp_vlan.sh --mode=xdpdrv +diff --git a/tools/testing/selftests/cgroup/cgroup_util.c b/tools/testing/selftests/cgroup/cgroup_util.c +index 4c223266299a..bdb69599c4bd 100644 +--- a/tools/testing/selftests/cgroup/cgroup_util.c ++++ b/tools/testing/selftests/cgroup/cgroup_util.c +@@ -191,8 +191,7 @@ int cg_find_unified_root(char *root, size_t len) + strtok(NULL, delim); + strtok(NULL, delim); + +- if (strcmp(fs, "cgroup") == 0 && +- strcmp(type, "cgroup2") == 0) { ++ if (strcmp(type, "cgroup2") == 0) { + strncpy(root, mount, len); + return 0; + } +diff --git a/tools/testing/selftests/net/txring_overwrite.c b/tools/testing/selftests/net/txring_overwrite.c +index fd8b1c663c39..7d9ea039450a 100644 +--- a/tools/testing/selftests/net/txring_overwrite.c ++++ b/tools/testing/selftests/net/txring_overwrite.c +@@ -113,7 +113,7 @@ static int setup_tx(char **ring) + + *ring = mmap(0, req.tp_block_size * req.tp_block_nr, + PROT_READ | PROT_WRITE, MAP_SHARED, fdt, 0); +- if (!*ring) ++ if (*ring == MAP_FAILED) + error(1, errno, "mmap"); + + return fdt; +diff --git a/tools/testing/selftests/net/xfrm_policy.sh b/tools/testing/selftests/net/xfrm_policy.sh +index 71d7fdc513c1..5445943bf07f 100755 +--- a/tools/testing/selftests/net/xfrm_policy.sh ++++ b/tools/testing/selftests/net/xfrm_policy.sh +@@ -257,6 +257,29 @@ check_exceptions() + return $lret + } + ++check_hthresh_repeat() ++{ ++ local log=$1 ++ i=0 ++ ++ for i in $(seq 1 10);do ++ ip -net ns1 xfrm policy update src e000:0001::0000 dst ff01::0014:0000:0001 dir in tmpl src :: dst :: proto esp mode tunnel priority 100 action allow || break ++ ip -net ns1 xfrm policy set hthresh6 0 28 || break ++ ++ ip -net ns1 xfrm policy update src e000:0001::0000 dst ff01::01 dir in tmpl src :: dst :: proto esp mode tunnel priority 100 action allow || break ++ ip -net ns1 xfrm policy set hthresh6 0 28 || break ++ done ++ ++ if [ $i -ne 10 ] ;then ++ echo "FAIL: $log" 1>&2 ++ ret=1 ++ return 1 ++ fi ++ ++ echo "PASS: $log" ++ return 0 ++} ++ + #check for needed privileges + if [ "$(id -u)" -ne 0 ];then + echo "SKIP: Need root privileges" +@@ -404,7 +427,9 @@ for n in ns3 ns4;do + ip -net $n xfrm policy set hthresh4 32 32 hthresh6 128 128 + sleep $((RANDOM%5)) + done +-check_exceptions "exceptions and block policies after hresh change to normal" ++check_exceptions "exceptions and block policies after htresh change to normal" ++ ++check_hthresh_repeat "policies with repeated htresh change" + + for i in 1 2 3 4;do ip netns del ns$i;done + +diff --git a/tools/testing/selftests/rseq/rseq-arm.h b/tools/testing/selftests/rseq/rseq-arm.h +index 84f28f147fb6..5943c816c07c 100644 +--- a/tools/testing/selftests/rseq/rseq-arm.h ++++ b/tools/testing/selftests/rseq/rseq-arm.h +@@ -6,6 +6,8 @@ + */ + + /* ++ * - ARM little endian ++ * + * RSEQ_SIG uses the udf A32 instruction with an uncommon immediate operand + * value 0x5de3. This traps if user-space reaches this instruction by mistake, + * and the uncommon operand ensures the kernel does not move the instruction +@@ -22,36 +24,40 @@ + * def3 udf #243 ; 0xf3 + * e7f5 b.n <7f5> + * +- * pre-ARMv6 big endian code: +- * e7f5 b.n <7f5> +- * def3 udf #243 ; 0xf3 ++ * - ARMv6+ big endian (BE8): + * + * ARMv6+ -mbig-endian generates mixed endianness code vs data: little-endian +- * code and big-endian data. Ensure the RSEQ_SIG data signature matches code +- * endianness. Prior to ARMv6, -mbig-endian generates big-endian code and data +- * (which match), so there is no need to reverse the endianness of the data +- * representation of the signature. However, the choice between BE32 and BE8 +- * is done by the linker, so we cannot know whether code and data endianness +- * will be mixed before the linker is invoked. ++ * code and big-endian data. The data value of the signature needs to have its ++ * byte order reversed to generate the trap instruction: ++ * ++ * Data: 0xf3def5e7 ++ * ++ * Translates to this A32 instruction pattern: ++ * ++ * e7f5def3 udf #24035 ; 0x5de3 ++ * ++ * Translates to this T16 instruction pattern: ++ * ++ * def3 udf #243 ; 0xf3 ++ * e7f5 b.n <7f5> ++ * ++ * - Prior to ARMv6 big endian (BE32): ++ * ++ * Prior to ARMv6, -mbig-endian generates big-endian code and data ++ * (which match), so the endianness of the data representation of the ++ * signature should not be reversed. However, the choice between BE32 ++ * and BE8 is done by the linker, so we cannot know whether code and ++ * data endianness will be mixed before the linker is invoked. So rather ++ * than try to play tricks with the linker, the rseq signature is simply ++ * data (not a trap instruction) prior to ARMv6 on big endian. This is ++ * why the signature is expressed as data (.word) rather than as ++ * instruction (.inst) in assembler. + */ + +-#define RSEQ_SIG_CODE 0xe7f5def3 +- +-#ifndef __ASSEMBLER__ +- +-#define RSEQ_SIG_DATA \ +- ({ \ +- int sig; \ +- asm volatile ("b 2f\n\t" \ +- "1: .inst " __rseq_str(RSEQ_SIG_CODE) "\n\t" \ +- "2:\n\t" \ +- "ldr %[sig], 1b\n\t" \ +- : [sig] "=r" (sig)); \ +- sig; \ +- }) +- +-#define RSEQ_SIG RSEQ_SIG_DATA +- ++#ifdef __ARMEB__ ++#define RSEQ_SIG 0xf3def5e7 /* udf #24035 ; 0x5de3 (ARMv6+) */ ++#else ++#define RSEQ_SIG 0xe7f5def3 /* udf #24035 ; 0x5de3 */ + #endif + + #define rseq_smp_mb() __asm__ __volatile__ ("dmb" ::: "memory", "cc") +@@ -125,8 +131,7 @@ do { \ + __rseq_str(table_label) ":\n\t" \ + ".word " __rseq_str(version) ", " __rseq_str(flags) "\n\t" \ + ".word " __rseq_str(start_ip) ", 0x0, " __rseq_str(post_commit_offset) ", 0x0, " __rseq_str(abort_ip) ", 0x0\n\t" \ +- ".arm\n\t" \ +- ".inst " __rseq_str(RSEQ_SIG_CODE) "\n\t" \ ++ ".word " __rseq_str(RSEQ_SIG) "\n\t" \ + __rseq_str(label) ":\n\t" \ + teardown \ + "b %l[" __rseq_str(abort_label) "]\n\t" +diff --git a/virt/kvm/arm/arm.c b/virt/kvm/arm/arm.c +index bd5c55916d0d..9b778c51af1b 100644 +--- a/virt/kvm/arm/arm.c ++++ b/virt/kvm/arm/arm.c +@@ -323,6 +323,17 @@ int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu) + + void kvm_arch_vcpu_blocking(struct kvm_vcpu *vcpu) + { ++ /* ++ * If we're about to block (most likely because we've just hit a ++ * WFI), we need to sync back the state of the GIC CPU interface ++ * so that we have the lastest PMR and group enables. This ensures ++ * that kvm_arch_vcpu_runnable has up-to-date data to decide ++ * whether we have pending interrupts. ++ */ ++ preempt_disable(); ++ kvm_vgic_vmcr_sync(vcpu); ++ preempt_enable(); ++ + kvm_vgic_v4_enable_doorbell(vcpu); + } + +diff --git a/virt/kvm/arm/vgic/vgic-v2.c b/virt/kvm/arm/vgic/vgic-v2.c +index 6dd5ad706c92..96aab77d0471 100644 +--- a/virt/kvm/arm/vgic/vgic-v2.c ++++ b/virt/kvm/arm/vgic/vgic-v2.c +@@ -484,10 +484,17 @@ void vgic_v2_load(struct kvm_vcpu *vcpu) + kvm_vgic_global_state.vctrl_base + GICH_APR); + } + +-void vgic_v2_put(struct kvm_vcpu *vcpu) ++void vgic_v2_vmcr_sync(struct kvm_vcpu *vcpu) + { + struct vgic_v2_cpu_if *cpu_if = &vcpu->arch.vgic_cpu.vgic_v2; + + cpu_if->vgic_vmcr = readl_relaxed(kvm_vgic_global_state.vctrl_base + GICH_VMCR); ++} ++ ++void vgic_v2_put(struct kvm_vcpu *vcpu) ++{ ++ struct vgic_v2_cpu_if *cpu_if = &vcpu->arch.vgic_cpu.vgic_v2; ++ ++ vgic_v2_vmcr_sync(vcpu); + cpu_if->vgic_apr = readl_relaxed(kvm_vgic_global_state.vctrl_base + GICH_APR); + } +diff --git a/virt/kvm/arm/vgic/vgic-v3.c b/virt/kvm/arm/vgic/vgic-v3.c +index c2c9ce009f63..0c653a1e5215 100644 +--- a/virt/kvm/arm/vgic/vgic-v3.c ++++ b/virt/kvm/arm/vgic/vgic-v3.c +@@ -662,12 +662,17 @@ void vgic_v3_load(struct kvm_vcpu *vcpu) + __vgic_v3_activate_traps(vcpu); + } + +-void vgic_v3_put(struct kvm_vcpu *vcpu) ++void vgic_v3_vmcr_sync(struct kvm_vcpu *vcpu) + { + struct vgic_v3_cpu_if *cpu_if = &vcpu->arch.vgic_cpu.vgic_v3; + + if (likely(cpu_if->vgic_sre)) + cpu_if->vgic_vmcr = kvm_call_hyp_ret(__vgic_v3_read_vmcr); ++} ++ ++void vgic_v3_put(struct kvm_vcpu *vcpu) ++{ ++ vgic_v3_vmcr_sync(vcpu); + + kvm_call_hyp(__vgic_v3_save_aprs, vcpu); + +diff --git a/virt/kvm/arm/vgic/vgic.c b/virt/kvm/arm/vgic/vgic.c +index 04786c8ec77e..13d4b38a94ec 100644 +--- a/virt/kvm/arm/vgic/vgic.c ++++ b/virt/kvm/arm/vgic/vgic.c +@@ -919,6 +919,17 @@ void kvm_vgic_put(struct kvm_vcpu *vcpu) + vgic_v3_put(vcpu); + } + ++void kvm_vgic_vmcr_sync(struct kvm_vcpu *vcpu) ++{ ++ if (unlikely(!irqchip_in_kernel(vcpu->kvm))) ++ return; ++ ++ if (kvm_vgic_global_state.type == VGIC_V2) ++ vgic_v2_vmcr_sync(vcpu); ++ else ++ vgic_v3_vmcr_sync(vcpu); ++} ++ + int kvm_vgic_vcpu_pending_irq(struct kvm_vcpu *vcpu) + { + struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu; +diff --git a/virt/kvm/arm/vgic/vgic.h b/virt/kvm/arm/vgic/vgic.h +index 57205beaa981..11adbdac1d56 100644 +--- a/virt/kvm/arm/vgic/vgic.h ++++ b/virt/kvm/arm/vgic/vgic.h +@@ -193,6 +193,7 @@ int vgic_register_dist_iodev(struct kvm *kvm, gpa_t dist_base_address, + void vgic_v2_init_lrs(void); + void vgic_v2_load(struct kvm_vcpu *vcpu); + void vgic_v2_put(struct kvm_vcpu *vcpu); ++void vgic_v2_vmcr_sync(struct kvm_vcpu *vcpu); + + void vgic_v2_save_state(struct kvm_vcpu *vcpu); + void vgic_v2_restore_state(struct kvm_vcpu *vcpu); +@@ -223,6 +224,7 @@ bool vgic_v3_check_base(struct kvm *kvm); + + void vgic_v3_load(struct kvm_vcpu *vcpu); + void vgic_v3_put(struct kvm_vcpu *vcpu); ++void vgic_v3_vmcr_sync(struct kvm_vcpu *vcpu); + + bool vgic_has_its(struct kvm *kvm); + int kvm_vgic_register_its_device(void); +diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c +index 2f2d24a4dd5c..7e0d18ac62bf 100644 +--- a/virt/kvm/kvm_main.c ++++ b/virt/kvm/kvm_main.c +@@ -1790,7 +1790,7 @@ void kvm_vcpu_unmap(struct kvm_vcpu *vcpu, struct kvm_host_map *map, + if (!map->hva) + return; + +- if (map->page) ++ if (map->page != KVM_UNMAPPED_PAGE) + kunmap(map->page); + #ifdef CONFIG_HAS_IOMEM + else +@@ -2475,6 +2475,29 @@ static bool kvm_vcpu_eligible_for_directed_yield(struct kvm_vcpu *vcpu) + #endif + } + ++/* ++ * Unlike kvm_arch_vcpu_runnable, this function is called outside ++ * a vcpu_load/vcpu_put pair. However, for most architectures ++ * kvm_arch_vcpu_runnable does not require vcpu_load. ++ */ ++bool __weak kvm_arch_dy_runnable(struct kvm_vcpu *vcpu) ++{ ++ return kvm_arch_vcpu_runnable(vcpu); ++} ++ ++static bool vcpu_dy_runnable(struct kvm_vcpu *vcpu) ++{ ++ if (kvm_arch_dy_runnable(vcpu)) ++ return true; ++ ++#ifdef CONFIG_KVM_ASYNC_PF ++ if (!list_empty_careful(&vcpu->async_pf.done)) ++ return true; ++#endif ++ ++ return false; ++} ++ + void kvm_vcpu_on_spin(struct kvm_vcpu *me, bool yield_to_kernel_mode) + { + struct kvm *kvm = me->kvm; +@@ -2504,7 +2527,7 @@ void kvm_vcpu_on_spin(struct kvm_vcpu *me, bool yield_to_kernel_mode) + continue; + if (vcpu == me) + continue; +- if (swait_active(&vcpu->wq) && !kvm_arch_vcpu_runnable(vcpu)) ++ if (swait_active(&vcpu->wq) && !vcpu_dy_runnable(vcpu)) + continue; + if (yield_to_kernel_mode && !kvm_arch_vcpu_in_kernel(vcpu)) + continue; diff -Nru linux-liquorix-5.2/debian/po/ca.po linux-liquorix-5.2/debian/po/ca.po --- linux-liquorix-5.2/debian/po/ca.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/ca.po 2019-08-16 22:19:02.000000000 +0000 @@ -39,11 +39,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Com aquesta imatge empra un initrd, no es suprimirà el fitxer " -"${modules_base}/5.2.0-8.2-liquorix-amd64/modules.dep, tot i que potser és " +"${modules_base}/5.2.0-9.1-liquorix-amd64/modules.dep, tot i que potser és " "invàlid." #. Type: boolean @@ -110,7 +110,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -122,7 +122,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" @@ -164,11 +164,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Com aquesta imatge empra un initrd, no es suprimirà el fitxer " -"${modules_base}/5.2.0-8.2-liquorix-amd64/modules.dep, tot i que potser és " +"${modules_base}/5.2.0-9.1-liquorix-amd64/modules.dep, tot i que potser és " "invàlid." #. Type: boolean @@ -235,7 +235,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -247,7 +247,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" diff -Nru linux-liquorix-5.2/debian/po/cs.po linux-liquorix-5.2/debian/po/cs.po --- linux-liquorix-5.2/debian/po/cs.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/cs.po 2019-08-16 22:19:02.000000000 +0000 @@ -37,11 +37,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Vzhledem k tomu, že tento obraz používá initrd, nebude soubor " -"${modules_base}/5.2.0-8.2-liquorix-amd64/modules.dep smazán, přesto že může " +"${modules_base}/5.2.0-9.1-liquorix-amd64/modules.dep smazán, přesto že může " "být neplatný." #. Type: boolean @@ -105,13 +105,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Jaderný balíček vytvoří pro zavaděč systému soubor \"initramfs\" (/boot/" -"initrd.img-5.2.0-8.2-liquorix-amd64), aby jej používal vedle samotného jádra. " +"initrd.img-5.2.0-9.1-liquorix-amd64), aby jej používal vedle samotného jádra. " "Tento způsob, dříve nepodporovaný na architektuře MIPS, umožňuje pružnější " "proces zavádění, budoucí verze jádra mohou k zavedení potřebovat " "odpovídající obraz initrd.img." @@ -122,11 +122,11 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" -"Aktuálně běžící jádro bylo zavedeno bez initramfs. U verze Linuxu 5.2.0-8.2, " +"Aktuálně běžící jádro bylo zavedeno bez initramfs. U verze Linuxu 5.2.0-9.1, " "a u každé pozdější verze, byste měli přenastavit zavaděč, aby nahrával " "initramfs. Pravděpodobně nejsnáze toho dosáhnete používáním symbolického " "odkazu na initrd.img spravovaného balíčkem kernel." @@ -166,11 +166,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Vzhledem k tomu, že tento obraz používá initrd, nebude soubor " -"${modules_base}/5.2.0-8.2-liquorix-amd64/modules.dep smazán, přesto že může " +"${modules_base}/5.2.0-9.1-liquorix-amd64/modules.dep smazán, přesto že může " "být neplatný." #. Type: boolean @@ -234,13 +234,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Jaderný balíček vytvoří pro zavaděč systému soubor \"initramfs\" (/boot/" -"initrd.img-5.2.0-8.2-liquorix-amd64), aby jej používal vedle samotného jádra. " +"initrd.img-5.2.0-9.1-liquorix-amd64), aby jej používal vedle samotného jádra. " "Tento způsob, dříve nepodporovaný na architektuře MIPS, umožňuje pružnější " "proces zavádění, budoucí verze jádra mohou k zavedení potřebovat " "odpovídající obraz initrd.img." @@ -251,11 +251,11 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" -"Aktuálně běžící jádro bylo zavedeno bez initramfs. U verze Linuxu 5.2.0-8.2, " +"Aktuálně běžící jádro bylo zavedeno bez initramfs. U verze Linuxu 5.2.0-9.1, " "a u každé pozdější verze, byste měli přenastavit zavaděč, aby nahrával " "initramfs. Pravděpodobně nejsnáze toho dosáhnete používáním symbolického " "odkazu na initrd.img spravovaného balíčkem kernel." diff -Nru linux-liquorix-5.2/debian/po/da.po linux-liquorix-5.2/debian/po/da.po --- linux-liquorix-5.2/debian/po/da.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/da.po 2019-08-16 22:19:02.000000000 +0000 @@ -39,11 +39,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Da dette aftryk bruger initrd, vil filen ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep ikke blive slettet, selvom den måske er " +"5.2.0-9.1-liquorix-amd64/modules.dep ikke blive slettet, selvom den måske er " "ugyldig." #. Type: boolean @@ -110,13 +110,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Denne kernepakke vil bygge en »initramfs«-fil (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for systemets opstartsindlæser til brug udover " +"5.2.0-9.1-liquorix-amd64) for systemets opstartsindlæser til brug udover " "selve kernen. Denne metode, tidligere ikke understøttet på MIPS, aktiverer " "en mere fleksibel opstartsmetode, og fremtidige kerneversioner kan kræve en " "tilsvarende initrd.img for at starte op." @@ -127,13 +127,13 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Den nuværende kørende kerne blev opstartet uden en initramfs. Du skal " "konfigurere opstartsindlæseren om til at indlæse initramfs'en for Linux " -"version 5.2.0-8.2, og for hver senere version. Dette opnås sandsynligvis " +"version 5.2.0-9.1, og for hver senere version. Dette opnås sandsynligvis " "bedst ved at bruge initrd-img's symbolske henvisning vedligeholdt af " "kernepakken." # Danish translation linux. @@ -174,11 +174,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Da dette aftryk bruger initrd, vil filen ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep ikke blive slettet, selvom den måske er " +"5.2.0-9.1-liquorix-amd64/modules.dep ikke blive slettet, selvom den måske er " "ugyldig." #. Type: boolean @@ -245,13 +245,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Denne kernepakke vil bygge en »initramfs«-fil (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for systemets opstartsindlæser til brug udover " +"5.2.0-9.1-liquorix-amd64) for systemets opstartsindlæser til brug udover " "selve kernen. Denne metode, tidligere ikke understøttet på MIPS, aktiverer " "en mere fleksibel opstartsmetode, og fremtidige kerneversioner kan kræve en " "tilsvarende initrd.img for at starte op." @@ -262,12 +262,12 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Den nuværende kørende kerne blev opstartet uden en initramfs. Du skal " "konfigurere opstartsindlæseren om til at indlæse initramfs'en for Linux " -"version 5.2.0-8.2, og for hver senere version. Dette opnås sandsynligvis " +"version 5.2.0-9.1, og for hver senere version. Dette opnås sandsynligvis " "bedst ved at bruge initrd-img's symbolske henvisning vedligeholdt af " "kernepakken." diff -Nru linux-liquorix-5.2/debian/po/de.po linux-liquorix-5.2/debian/po/de.po --- linux-liquorix-5.2/debian/po/de.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/de.po 2019-08-16 22:19:02.000000000 +0000 @@ -39,11 +39,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Da dieses Image eine initrd verwendet, wird die Datei ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep nicht gelöscht, obwohl sie ungültig sein " +"5.2.0-9.1-liquorix-amd64/modules.dep nicht gelöscht, obwohl sie ungültig sein " "könnte." #. Type: boolean @@ -111,7 +111,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -123,7 +123,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" @@ -165,11 +165,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Da dieses Image eine initrd verwendet, wird die Datei ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep nicht gelöscht, obwohl sie ungültig sein " +"5.2.0-9.1-liquorix-amd64/modules.dep nicht gelöscht, obwohl sie ungültig sein " "könnte." #. Type: boolean @@ -237,7 +237,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -249,7 +249,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" diff -Nru linux-liquorix-5.2/debian/po/es.po linux-liquorix-5.2/debian/po/es.po --- linux-liquorix-5.2/debian/po/es.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/es.po 2019-08-16 22:19:02.000000000 +0000 @@ -69,11 +69,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Debido a que esta imagen usa una imagen de arranque «initrd», no se " -"eliminará el fichero «${modules_base}/5.2.0-8.2-liquorix-amd64/modules.dep», " +"eliminará el fichero «${modules_base}/5.2.0-9.1-liquorix-amd64/modules.dep», " "aún cuando no sea válido." #. Type: boolean @@ -140,7 +140,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -152,7 +152,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" @@ -224,11 +224,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Debido a que esta imagen usa una imagen de arranque «initrd», no se " -"eliminará el fichero «${modules_base}/5.2.0-8.2-liquorix-amd64/modules.dep», " +"eliminará el fichero «${modules_base}/5.2.0-9.1-liquorix-amd64/modules.dep», " "aún cuando no sea válido." #. Type: boolean @@ -295,7 +295,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -307,7 +307,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" diff -Nru linux-liquorix-5.2/debian/po/et.po linux-liquorix-5.2/debian/po/et.po --- linux-liquorix-5.2/debian/po/et.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/et.po 2019-08-16 22:19:02.000000000 +0000 @@ -42,10 +42,10 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" -"Kuna tõmmis kasutab initrd-d, siis ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Kuna tõmmis kasutab initrd-d, siis ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep faili ei kustutata, kuigi ta võib olla vigane." #. Type: boolean @@ -111,7 +111,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -123,7 +123,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" @@ -168,10 +168,10 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" -"Kuna tõmmis kasutab initrd-d, siis ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Kuna tõmmis kasutab initrd-d, siis ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep faili ei kustutata, kuigi ta võib olla vigane." #. Type: boolean @@ -237,7 +237,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -249,7 +249,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" diff -Nru linux-liquorix-5.2/debian/po/fr.po linux-liquorix-5.2/debian/po/fr.po --- linux-liquorix-5.2/debian/po/fr.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/fr.po 2019-08-16 22:19:02.000000000 +0000 @@ -41,11 +41,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Puisque cette image du noyau utilise initrd, le fichier ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep ne sera pas effacé, mais il peut ne pas " +"5.2.0-9.1-liquorix-amd64/modules.dep ne sera pas effacé, mais il peut ne pas " "être valable." #. Type: boolean @@ -112,7 +112,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -124,7 +124,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" @@ -168,11 +168,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Puisque cette image du noyau utilise initrd, le fichier ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep ne sera pas effacé, mais il peut ne pas " +"5.2.0-9.1-liquorix-amd64/modules.dep ne sera pas effacé, mais il peut ne pas " "être valable." #. Type: boolean @@ -239,7 +239,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -251,7 +251,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" diff -Nru linux-liquorix-5.2/debian/po/it.po linux-liquorix-5.2/debian/po/it.po --- linux-liquorix-5.2/debian/po/it.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/it.po 2019-08-16 22:19:02.000000000 +0000 @@ -39,11 +39,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Poiché questa immagine usa un initrd, il file ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep non viene eliminato, anche se potrebbe " +"5.2.0-9.1-liquorix-amd64/modules.dep non viene eliminato, anche se potrebbe " "risultare non più valido." #. Type: boolean @@ -110,7 +110,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -122,7 +122,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" @@ -164,11 +164,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Poiché questa immagine usa un initrd, il file ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep non viene eliminato, anche se potrebbe " +"5.2.0-9.1-liquorix-amd64/modules.dep non viene eliminato, anche se potrebbe " "risultare non più valido." #. Type: boolean @@ -235,7 +235,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -247,7 +247,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" diff -Nru linux-liquorix-5.2/debian/po/ja.po linux-liquorix-5.2/debian/po/ja.po --- linux-liquorix-5.2/debian/po/ja.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/ja.po 2019-08-16 22:19:02.000000000 +0000 @@ -41,11 +41,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "このイメージは initrd を使っているので、${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep ファイルは (たとえ無効なものであったとし" +"5.2.0-9.1-liquorix-amd64/modules.dep ファイルは (たとえ無効なものであったとし" "ても) 削除されません。" #. Type: boolean @@ -111,7 +111,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -123,7 +123,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" @@ -167,11 +167,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "このイメージは initrd を使っているので、${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep ファイルは (たとえ無効なものであったとし" +"5.2.0-9.1-liquorix-amd64/modules.dep ファイルは (たとえ無効なものであったとし" "ても) 削除されません。" #. Type: boolean @@ -237,7 +237,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -249,7 +249,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" diff -Nru linux-liquorix-5.2/debian/po/nl.po linux-liquorix-5.2/debian/po/nl.po --- linux-liquorix-5.2/debian/po/nl.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/nl.po 2019-08-16 22:19:02.000000000 +0000 @@ -38,11 +38,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Omdat deze afbeelding initrd gebruikt, zal het ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep bestand niet verwijderd worden, ook al " +"5.2.0-9.1-liquorix-amd64/modules.dep bestand niet verwijderd worden, ook al " "is het niet correct." #. Type: boolean @@ -110,7 +110,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -122,7 +122,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" @@ -163,11 +163,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Omdat deze afbeelding initrd gebruikt, zal het ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep bestand niet verwijderd worden, ook al " +"5.2.0-9.1-liquorix-amd64/modules.dep bestand niet verwijderd worden, ook al " "is het niet correct." #. Type: boolean @@ -235,7 +235,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -247,7 +247,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" diff -Nru linux-liquorix-5.2/debian/po/pl.po linux-liquorix-5.2/debian/po/pl.po --- linux-liquorix-5.2/debian/po/pl.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/pl.po 2019-08-16 22:19:02.000000000 +0000 @@ -43,11 +43,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Ponieważ ten obraz używa initrd, plik ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep nie zostanie usunięty, nawet jeśli może " +"5.2.0-9.1-liquorix-amd64/modules.dep nie zostanie usunięty, nawet jeśli może " "być nieprawidłowy." #. Type: boolean @@ -116,13 +116,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Ten pakiet jądra zbuduje plik \"initramfs\" (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) dla programu rozruchowego systemu poza samym " +"5.2.0-9.1-liquorix-amd64) dla programu rozruchowego systemu poza samym " "jądrem. Ta metoda, wcześniej niewspierana na architekturze MIPS, pozwala na " "bardziej elastyczny proces uruchamiania i przyszłe wersje jądra mogą wymagać " "odpowiedniego pliku initrd.img do uruchomienia." @@ -133,13 +133,13 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Obecnie działające jądro zostało uruchomione bez initramfs. Należy ponownie " "skonfigurować program rozruchowy, aby wczytać initramfs dla wersji Linuksa " -"5.2.0-8.2 i dla każdej późniejszej wersji. Prawdopodobnie najłatwiej " +"5.2.0-9.1 i dla każdej późniejszej wersji. Prawdopodobnie najłatwiej " "osiągnąć to przy użyciu dowiązania symbolicznego initrd.img utrzymywanego " "przez pakiet jądra." # Translation of linux debconf templates to Polish. @@ -184,11 +184,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Ponieważ ten obraz używa initrd, plik ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep nie zostanie usunięty, nawet jeśli może " +"5.2.0-9.1-liquorix-amd64/modules.dep nie zostanie usunięty, nawet jeśli może " "być nieprawidłowy." #. Type: boolean @@ -257,13 +257,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Ten pakiet jądra zbuduje plik \"initramfs\" (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) dla programu rozruchowego systemu poza samym " +"5.2.0-9.1-liquorix-amd64) dla programu rozruchowego systemu poza samym " "jądrem. Ta metoda, wcześniej niewspierana na architekturze MIPS, pozwala na " "bardziej elastyczny proces uruchamiania i przyszłe wersje jądra mogą wymagać " "odpowiedniego pliku initrd.img do uruchomienia." @@ -274,12 +274,12 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Obecnie działające jądro zostało uruchomione bez initramfs. Należy ponownie " "skonfigurować program rozruchowy, aby wczytać initramfs dla wersji Linuksa " -"5.2.0-8.2 i dla każdej późniejszej wersji. Prawdopodobnie najłatwiej " +"5.2.0-9.1 i dla każdej późniejszej wersji. Prawdopodobnie najłatwiej " "osiągnąć to przy użyciu dowiązania symbolicznego initrd.img utrzymywanego " "przez pakiet jądra." diff -Nru linux-liquorix-5.2/debian/po/pt_BR.po linux-liquorix-5.2/debian/po/pt_BR.po --- linux-liquorix-5.2/debian/po/pt_BR.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/pt_BR.po 2019-08-16 22:19:02.000000000 +0000 @@ -43,11 +43,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Uma vez que esta imagem usa o initrd, o arquivo ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep não será removido, embora possa ser " +"5.2.0-9.1-liquorix-amd64/modules.dep não será removido, embora possa ser " "considerado inválido." #. Type: boolean @@ -114,7 +114,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -126,7 +126,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" @@ -172,11 +172,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Uma vez que esta imagem usa o initrd, o arquivo ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep não será removido, embora possa ser " +"5.2.0-9.1-liquorix-amd64/modules.dep não será removido, embora possa ser " "considerado inválido." #. Type: boolean @@ -243,7 +243,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -255,7 +255,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" diff -Nru linux-liquorix-5.2/debian/po/pt.po linux-liquorix-5.2/debian/po/pt.po --- linux-liquorix-5.2/debian/po/pt.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/pt.po 2019-08-16 22:19:02.000000000 +0000 @@ -41,11 +41,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Como esta imagem usa initrd, o ficheiro ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep não será apagado, apesar de poder ser " +"5.2.0-9.1-liquorix-amd64/modules.dep não será apagado, apesar de poder ser " "inválido." #. Type: boolean @@ -113,13 +113,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Este pacote de kernel irá compilar um ficheiro \"initramfs\" (/boot/initrd." -"img-5.2.0-8.2-liquorix-amd64) para o gestor de arranque do sistema usar " +"img-5.2.0-9.1-liquorix-amd64) para o gestor de arranque do sistema usar " "adicionalmente ao próprio kernel. Este método, antes não suportado no MIPS, " "activa um processo de arranque mais flexível, e as versões futuras de kernel " "podem requerer uma nitrd.img correspondente para arrancar." @@ -130,13 +130,13 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "O kernel presentemente em funcionamento foi arrancado sem um nitramfs. Você " "deve reconfigurar o gestor de arranque para carregar a initramfs para a " -"versão Linux 5.2.0-8.2, e para cada versão posterior. Provavelmente a " +"versão Linux 5.2.0-9.1, e para cada versão posterior. Provavelmente a " "maneira mais fácil de conseguir isto é usar o link simbólico initrd.img " "mantido pelo pacote do kernel." # Translation of linux debconf messages to Portuguese @@ -179,11 +179,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Como esta imagem usa initrd, o ficheiro ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep não será apagado, apesar de poder ser " +"5.2.0-9.1-liquorix-amd64/modules.dep não será apagado, apesar de poder ser " "inválido." #. Type: boolean @@ -251,13 +251,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Este pacote de kernel irá compilar um ficheiro \"initramfs\" (/boot/initrd." -"img-5.2.0-8.2-liquorix-amd64) para o gestor de arranque do sistema usar " +"img-5.2.0-9.1-liquorix-amd64) para o gestor de arranque do sistema usar " "adicionalmente ao próprio kernel. Este método, antes não suportado no MIPS, " "activa um processo de arranque mais flexível, e as versões futuras de kernel " "podem requerer uma nitrd.img correspondente para arrancar." @@ -268,12 +268,12 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "O kernel presentemente em funcionamento foi arrancado sem um nitramfs. Você " "deve reconfigurar o gestor de arranque para carregar a initramfs para a " -"versão Linux 5.2.0-8.2, e para cada versão posterior. Provavelmente a " +"versão Linux 5.2.0-9.1, e para cada versão posterior. Provavelmente a " "maneira mais fácil de conseguir isto é usar o link simbólico initrd.img " "mantido pelo pacote do kernel." diff -Nru linux-liquorix-5.2/debian/po/ru.po linux-liquorix-5.2/debian/po/ru.po --- linux-liquorix-5.2/debian/po/ru.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/ru.po 2019-08-16 22:19:02.000000000 +0000 @@ -41,11 +41,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Так как этот образ использует initrd, файл ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep не будет удалён, даже если он может быть " +"5.2.0-9.1-liquorix-amd64/modules.dep не будет удалён, даже если он может быть " "неправильным." #. Type: boolean @@ -110,13 +110,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Данный пакет с ядром будет собирать файл «initramfs» (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) для системного загрузчика, чтобы использовать его " +"5.2.0-9.1-liquorix-amd64) для системного загрузчика, чтобы использовать его " "вместе с ядром. Данный метод, прежде не поддерживаемый на MIPS, обеспечивает " "более гибкий процесс загрузки, и будущие версии ядер могу требовать " "соответствующего initrd.img для запуска." @@ -127,13 +127,13 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Работающая в данный момент версия ядра была загружена без initramfs. Вы " "должен перенастроить системный загрузчик, чтобы он загружал initramfs для " -"Linux версии 5.2.0-8.2 и для каждой будущей версии. Это, вероятно, проще " +"Linux версии 5.2.0-9.1 и для каждой будущей версии. Это, вероятно, проще " "всего сделать с помощью символической ссылки initrd.img, настраиваемой из " "пакета ядра." # translation of linux debconf templates to Russian @@ -176,11 +176,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Так как этот образ использует initrd, файл ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep не будет удалён, даже если он может быть " +"5.2.0-9.1-liquorix-amd64/modules.dep не будет удалён, даже если он может быть " "неправильным." #. Type: boolean @@ -245,13 +245,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Данный пакет с ядром будет собирать файл «initramfs» (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) для системного загрузчика, чтобы использовать его " +"5.2.0-9.1-liquorix-amd64) для системного загрузчика, чтобы использовать его " "вместе с ядром. Данный метод, прежде не поддерживаемый на MIPS, обеспечивает " "более гибкий процесс загрузки, и будущие версии ядер могу требовать " "соответствующего initrd.img для запуска." @@ -262,12 +262,12 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Работающая в данный момент версия ядра была загружена без initramfs. Вы " "должен перенастроить системный загрузчик, чтобы он загружал initramfs для " -"Linux версии 5.2.0-8.2 и для каждой будущей версии. Это, вероятно, проще " +"Linux версии 5.2.0-9.1 и для каждой будущей версии. Это, вероятно, проще " "всего сделать с помощью символической ссылки initrd.img, настраиваемой из " "пакета ядра." diff -Nru linux-liquorix-5.2/debian/po/sk.po linux-liquorix-5.2/debian/po/sk.po --- linux-liquorix-5.2/debian/po/sk.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/sk.po 2019-08-16 22:19:02.000000000 +0000 @@ -45,11 +45,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Keďže tento obraz používa initrd, nebude súbor ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep zmazaný, hoci môže byť neplatný." +"5.2.0-9.1-liquorix-amd64/modules.dep zmazaný, hoci môže byť neplatný." #. Type: boolean #. Description @@ -114,13 +114,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Tento balík jadra zostaví súbor „initramfs” (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) pre zavádzač systému, na použitie ako doplnok k " +"5.2.0-9.1-liquorix-amd64) pre zavádzač systému, na použitie ako doplnok k " "samotnému jadru. Táto metóda, predtým nepodporovaná na MIPS, poskytuje oveľa " "flexibilnejší proces zavádzania a budúce verzie jadra môžu na zavedenie " "vyžadovať príslušný initrd.img." @@ -131,12 +131,12 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Aktuálne bežiace jadro bolo zavedené bez initramfs. Mali by ste nastaviť " -"zavádzač tak, aby načítal initramfs pre Linux verzie 5.2.0-8.2 a pre každú " +"zavádzač tak, aby načítal initramfs pre Linux verzie 5.2.0-9.1 a pre každú " "novšiu verziu. Asi najjednoduchšie to môžete docieliť pomocou symbolického " "odkazu initrd.img, ktorý je spravovaný balíkom jadra." # Slovak translations for linux package @@ -183,11 +183,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Keďže tento obraz používa initrd, nebude súbor ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep zmazaný, hoci môže byť neplatný." +"5.2.0-9.1-liquorix-amd64/modules.dep zmazaný, hoci môže byť neplatný." #. Type: boolean #. Description @@ -252,13 +252,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Tento balík jadra zostaví súbor „initramfs” (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) pre zavádzač systému, na použitie ako doplnok k " +"5.2.0-9.1-liquorix-amd64) pre zavádzač systému, na použitie ako doplnok k " "samotnému jadru. Táto metóda, predtým nepodporovaná na MIPS, poskytuje oveľa " "flexibilnejší proces zavádzania a budúce verzie jadra môžu na zavedenie " "vyžadovať príslušný initrd.img." @@ -269,11 +269,11 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Aktuálne bežiace jadro bolo zavedené bez initramfs. Mali by ste nastaviť " -"zavádzač tak, aby načítal initramfs pre Linux verzie 5.2.0-8.2 a pre každú " +"zavádzač tak, aby načítal initramfs pre Linux verzie 5.2.0-9.1 a pre každú " "novšiu verziu. Asi najjednoduchšie to môžete docieliť pomocou symbolického " "odkazu initrd.img, ktorý je spravovaný balíkom jadra." diff -Nru linux-liquorix-5.2/debian/po/sv.po linux-liquorix-5.2/debian/po/sv.po --- linux-liquorix-5.2/debian/po/sv.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/sv.po 2019-08-16 22:19:02.000000000 +0000 @@ -39,11 +39,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Eftersom denna avbildning använder initrd kommer inte filen ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep att raderas, trots att den kan vara " +"5.2.0-9.1-liquorix-amd64/modules.dep att raderas, trots att den kan vara " "felaktig." #. Type: boolean @@ -109,13 +109,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Kärnans paket kommer att bygga en initramfs-fil (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) för systemets uppstartshanterare för att användas " +"5.2.0-9.1-liquorix-amd64) för systemets uppstartshanterare för att användas " "upptill kärnan själv. Denna metod, tidigare utan stöd på MIPS, aktiverar en " "mer flexibel uppstartsprocess och framtida kärnversioner kan komma att kräva " "en motsvarande initrd.img för att starta." @@ -126,12 +126,12 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Kärnan som används startades utan initramfs. Du bör ställa in " -"uppstartshanteraren att läsa in initramfs för Linux version 5.2.0-8.2 och " +"uppstartshanteraren att läsa in initramfs för Linux version 5.2.0-9.1 och " "senare. Detta är troligen enklast att åstadkomma genom att använda den " "symboliska länken som hanteras av kärnans paket." # Translation of linux debconf template to Swedish @@ -172,11 +172,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Eftersom denna avbildning använder initrd kommer inte filen ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep att raderas, trots att den kan vara " +"5.2.0-9.1-liquorix-amd64/modules.dep att raderas, trots att den kan vara " "felaktig." #. Type: boolean @@ -242,13 +242,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Kärnans paket kommer att bygga en initramfs-fil (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) för systemets uppstartshanterare för att användas " +"5.2.0-9.1-liquorix-amd64) för systemets uppstartshanterare för att användas " "upptill kärnan själv. Denna metod, tidigare utan stöd på MIPS, aktiverar en " "mer flexibel uppstartsprocess och framtida kärnversioner kan komma att kräva " "en motsvarande initrd.img för att starta." @@ -259,11 +259,11 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Kärnan som används startades utan initramfs. Du bör ställa in " -"uppstartshanteraren att läsa in initramfs för Linux version 5.2.0-8.2 och " +"uppstartshanteraren att läsa in initramfs för Linux version 5.2.0-9.1 och " "senare. Detta är troligen enklast att åstadkomma genom att använda den " "symboliska länken som hanteras av kärnans paket." diff -Nru linux-liquorix-5.2/debian/po/tr.po linux-liquorix-5.2/debian/po/tr.po --- linux-liquorix-5.2/debian/po/tr.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/tr.po 2019-08-16 22:19:02.000000000 +0000 @@ -39,11 +39,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Bu görüntü initrd kullandığından ötürü ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep dosyası, dosya geçersiz olsa da " +"5.2.0-9.1-liquorix-amd64/modules.dep dosyası, dosya geçersiz olsa da " "silinmeyecektir." #. Type: boolean @@ -110,13 +110,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Çekirdek paketi, sistem ön yükleyicinin kullanması için çekirdeğe ek olarak " -"bir de \"initramfs\" dosyası (/boot/initrd.img-5.2.0-8.2-liquorix-amd64) " +"bir de \"initramfs\" dosyası (/boot/initrd.img-5.2.0-9.1-liquorix-amd64) " "oluşturacak. MIPS mimarisinde eskiden desteklenmeyen bu yöntem, daha esnek " "bir ön yükleme sürecine imkan tanır. Gelecekte yayımlanacak olan yeni " "çekirdek sürümleri kendilerine uyumlu olan yeni initrd.img dosyaları " @@ -128,12 +128,12 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Şu an kullanımda olan çekirdek initramfs olmadan başlatıldı. Açılış " -"önyükleyicisini Linux 5.2.0-8.2 ve daha sonraki her sürümün initramfs'lerini " +"önyükleyicisini Linux 5.2.0-9.1 ve daha sonraki her sürümün initramfs'lerini " "yükleyecek şekilde yeniden yapılandırmanız gerekmektedir. Bunu yapmanın en " "kolay yolu genelde çekirdek paketi tarafından idare edilen initrd.img " "sembolik bağlantısını kullanmaktır." @@ -175,11 +175,11 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" "Bu görüntü initrd kullandığından ötürü ${modules_base}/" -"5.2.0-8.2-liquorix-amd64/modules.dep dosyası, dosya geçersiz olsa da " +"5.2.0-9.1-liquorix-amd64/modules.dep dosyası, dosya geçersiz olsa da " "silinmeyecektir." #. Type: boolean @@ -246,13 +246,13 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." msgstr "" "Çekirdek paketi, sistem ön yükleyicinin kullanması için çekirdeğe ek olarak " -"bir de \"initramfs\" dosyası (/boot/initrd.img-5.2.0-8.2-liquorix-amd64) " +"bir de \"initramfs\" dosyası (/boot/initrd.img-5.2.0-9.1-liquorix-amd64) " "oluşturacak. MIPS mimarisinde eskiden desteklenmeyen bu yöntem, daha esnek " "bir ön yükleme sürecine imkan tanır. Gelecekte yayımlanacak olan yeni " "çekirdek sürümleri kendilerine uyumlu olan yeni initrd.img dosyaları " @@ -264,12 +264,12 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" "Şu an kullanımda olan çekirdek initramfs olmadan başlatıldı. Açılış " -"önyükleyicisini Linux 5.2.0-8.2 ve daha sonraki her sürümün initramfs'lerini " +"önyükleyicisini Linux 5.2.0-9.1 ve daha sonraki her sürümün initramfs'lerini " "yükleyecek şekilde yeniden yapılandırmanız gerekmektedir. Bunu yapmanın en " "kolay yolu genelde çekirdek paketi tarafından idare edilen initrd.img " "sembolik bağlantısını kullanmaktır." diff -Nru linux-liquorix-5.2/debian/po/vi.po linux-liquorix-5.2/debian/po/vi.po --- linux-liquorix-5.2/debian/po/vi.po 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/po/vi.po 2019-08-16 22:19:02.000000000 +0000 @@ -39,10 +39,10 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" -"Vì ảnh này sử dụng initrd, tập tin ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Vì ảnh này sử dụng initrd, tập tin ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep sẽ không bị xoá, dù là nó có thể không thích hợp." #. Type: boolean @@ -107,7 +107,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -119,7 +119,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" @@ -161,10 +161,10 @@ #. Description #: ../image.plain.templates.in:2001 msgid "" -"Since this image uses initrd, the ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Since this image uses initrd, the ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep file will not be deleted, even though it may be invalid." msgstr "" -"Vì ảnh này sử dụng initrd, tập tin ${modules_base}/5.2.0-8.2-liquorix-amd64/" +"Vì ảnh này sử dụng initrd, tập tin ${modules_base}/5.2.0-9.1-liquorix-amd64/" "modules.dep sẽ không bị xoá, dù là nó có thể không thích hợp." #. Type: boolean @@ -229,7 +229,7 @@ #: ../image.plain.templates.in:4001 msgid "" "This kernel package will build an \"initramfs\" file (/boot/initrd.img-" -"5.2.0-8.2-liquorix-amd64) for the system's boot loader to use in addition to " +"5.2.0-9.1-liquorix-amd64) for the system's boot loader to use in addition to " "the kernel itself. This method, formerly unsupported on MIPS, enables a more " "flexible boot process, and future kernel versions may require a " "corresponding initrd.img to boot." @@ -241,7 +241,7 @@ msgid "" "The currently running kernel was booted without an initramfs. You should " "reconfigure the boot loader to load the initramfs for Linux version " -"5.2.0-8.2, and for each later version. This is probably most easily " +"5.2.0-9.1, and for each later version. This is probably most easily " "accomplished by using the initrd.img symbolic link maintained by the kernel " "package." msgstr "" diff -Nru linux-liquorix-5.2/debian/rules.gen linux-liquorix-5.2/debian/rules.gen --- linux-liquorix-5.2/debian/rules.gen 2019-08-14 01:22:52.000000000 +0000 +++ linux-liquorix-5.2/debian/rules.gen 2019-08-16 22:19:02.000000000 +0000 @@ -4,37 +4,37 @@ binary-arch_amd64_none: binary-arch_amd64_none_liquorix-amd64 binary-arch_amd64_none_real binary-arch_amd64_none_liquorix-amd64: binary-arch_amd64_none_liquorix-amd64_real binary-arch_amd64_none_liquorix-amd64_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='5.2.0-8.2' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-11ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='5.2.0-9.1' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-12ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' binary-arch_amd64_none_liquorix-amd64_real:: - $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='5.2.0-8.2' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-11ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' + $(MAKE) -f debian/rules.real binary-arch-flavour ABINAME='5.2.0-9.1' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-12ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' binary-arch_amd64_none_real: binary-arch_amd64_real: binary-indep:: setup binary-indep:: - $(MAKE) -f debian/rules.real binary-indep ABINAME='5.2.0-8.2' ALL_FEATURESETS='none' ALL_TRIPLETS='amd64_none_liquorix-amd64 amd64_none_liquorix-amd64' SOURCEVERSION='5.2-11ubuntu1~bionic' UPSTREAMVERSION='5.2' VERSION='5.2' + $(MAKE) -f debian/rules.real binary-indep ABINAME='5.2.0-9.1' ALL_FEATURESETS='none' ALL_TRIPLETS='amd64_none_liquorix-amd64 amd64_none_liquorix-amd64' SOURCEVERSION='5.2-12ubuntu1~bionic' UPSTREAMVERSION='5.2' VERSION='5.2' build-arch: build-arch_amd64 build-arch_amd64: build-arch_amd64_none build-arch_amd64_real build-arch_amd64_none: build-arch_amd64_none_liquorix-amd64 build-arch_amd64_none_real build-arch_amd64_none_liquorix-amd64: build-arch_amd64_none_liquorix-amd64_real build-arch_amd64_none_liquorix-amd64_real:: - $(MAKE) -f debian/rules.real build-arch ABINAME='5.2.0-8.2' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-11ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' + $(MAKE) -f debian/rules.real build-arch ABINAME='5.2.0-9.1' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-12ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' build-arch_amd64_none_liquorix-amd64_real:: - $(MAKE) -f debian/rules.real build-arch ABINAME='5.2.0-8.2' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-11ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' + $(MAKE) -f debian/rules.real build-arch ABINAME='5.2.0-9.1' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-12ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' build-arch_amd64_none_real: build-arch_amd64_real: build-indep:: - $(MAKE) -f debian/rules.real build-indep ABINAME='5.2.0-8.2' ALL_FEATURESETS='none' ALL_TRIPLETS='amd64_none_liquorix-amd64 amd64_none_liquorix-amd64' SOURCEVERSION='5.2-11ubuntu1~bionic' UPSTREAMVERSION='5.2' VERSION='5.2' + $(MAKE) -f debian/rules.real build-indep ABINAME='5.2.0-9.1' ALL_FEATURESETS='none' ALL_TRIPLETS='amd64_none_liquorix-amd64 amd64_none_liquorix-amd64' SOURCEVERSION='5.2-12ubuntu1~bionic' UPSTREAMVERSION='5.2' VERSION='5.2' setup: setup_amd64 setup_amd64: setup_amd64_none setup_amd64_real setup_amd64_none: setup_amd64_none_liquorix-amd64 setup_amd64_none_real setup_amd64_none_liquorix-amd64: setup_amd64_none_liquorix-amd64_real setup_amd64_none_liquorix-amd64_real:: - $(MAKE) -f debian/rules.real setup-flavour ABINAME='5.2.0-8.2' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-11ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' + $(MAKE) -f debian/rules.real setup-flavour ABINAME='5.2.0-9.1' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-12ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' setup_amd64_none_liquorix-amd64_real:: - $(MAKE) -f debian/rules.real setup-flavour ABINAME='5.2.0-8.2' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-11ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' + $(MAKE) -f debian/rules.real setup-flavour ABINAME='5.2.0-9.1' ARCH='amd64' COMPILER='gcc' FEATURESET='none' FLAVOUR='liquorix-amd64' IMAGE_FILE='arch/x86/boot/bzImage' IMAGE_INSTALL_STEM='vmlinuz' KCONFIG='debian/config/config debian/config/kernelarch-x86/config debian/config/kernelarch-x86/config-arch-64' KERNEL_ARCH='x86' LOCALVERSION='-liquorix-amd64' LOCALVERSION_HEADERS='' LOCALVERSION_IMAGE='-liquorix-amd64' MODULES='True' SOURCEVERSION='5.2-12ubuntu1~bionic' TYPE='plain' UPSTREAMVERSION='5.2' VERSION='5.2' setup_amd64_none_real: setup_amd64_real: source: source_none source_none: source_none_real source_none_real:: - $(MAKE) -f debian/rules.real source-featureset ABINAME='5.2.0-8.2' FEATURESET='none' SOURCEVERSION='5.2-11ubuntu1~bionic' UPSTREAMVERSION='5.2' VERSION='5.2' + $(MAKE) -f debian/rules.real source-featureset ABINAME='5.2.0-9.1' FEATURESET='none' SOURCEVERSION='5.2-12ubuntu1~bionic' UPSTREAMVERSION='5.2' VERSION='5.2'